]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
LFUN_CLOSE_TAB_GROUP: bug fixes.
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 7e7439573ea63f72b2e977a9217af02a24ce4f79..42b96807048a8fc66e7641e82e788306be053ae0 100644 (file)
@@ -100,9 +100,6 @@ using namespace std;
 using namespace lyx::support;
 
 namespace lyx {
-
-extern bool quitting;
-
 namespace frontend {
 
 namespace {
@@ -227,17 +224,14 @@ struct GuiView::GuiViewPrivate
                        // The first TabWorkArea is always the first one, if any.
                        return tabWorkArea(0);
 
-               TabWorkArea * tab_widget = 0;
                for (int i = 0; i != splitter_->count(); ++i) {
-                       QWidget * w = splitter_->widget(i);
-                       if (!w->hasFocus())
-                               continue;
-                       tab_widget = dynamic_cast<TabWorkArea *>(w);
-                       if (tab_widget)
-                               break;
+                       TabWorkArea * twa = tabWorkArea(i);
+                       if (current_work_area_ == twa->currentWorkArea())
+                               return twa;
                }
 
-               return tab_widget;
+               // None has the focus so we just take the first one.
+               return tabWorkArea(0);
        }
 
 public:
@@ -398,10 +392,19 @@ void GuiView::closeEvent(QCloseEvent * close_event)
 
        // Make sure that no LFUN use this close to be closed View.
        theLyXFunc().setLyXView(0);
+
+       // Save toolbars configuration
+       if (isFullScreen()) {
+        d.toolbars_->toggleFullScreen(!isFullScreen());
+        updateToolbars();
+       }
+
        // Make sure the timer time out will not trigger a statusbar update.
        d.statusbar_timer_.stop();
 
-       if (lyxrc.allow_geometry_session) {
+       // Saving fullscreen requires additional tweaks in the toolbar code.
+       // It wouldn't also work under linux natively.
+       if (lyxrc.allow_geometry_session && !isFullScreen()) {
                QSettings settings;
                QString const key = "view-" + QString::number(id_);
 #ifdef Q_WS_X11
@@ -690,34 +693,29 @@ GuiToolbar * GuiView::makeToolbar(ToolbarInfo const & tbinfo, bool newline)
 
 GuiWorkArea * GuiView::workArea(Buffer & buffer)
 {
-       for (int i = 0; i != d.splitter_->count(); ++i) {
-               GuiWorkArea * wa = d.tabWorkArea(i)->workArea(buffer);
-               if (wa)
-                       return wa;
-       }
+       if (TabWorkArea * twa = d.currentTabWorkArea())
+               return twa->workArea(buffer);
        return 0;
 }
 
 
 GuiWorkArea * GuiView::addWorkArea(Buffer & buffer)
 {
-
        // Automatically create a TabWorkArea if there are none yet.
-       if (!d.splitter_->count())
-               addTabWorkArea();
-
-       TabWorkArea * tab_widget = d.currentTabWorkArea();
+       TabWorkArea * tab_widget = d.splitter_->count() 
+               ? d.currentTabWorkArea() : addTabWorkArea();
        return tab_widget->addWorkArea(buffer, *this);
 }
 
 
-void GuiView::addTabWorkArea()
+TabWorkArea * GuiView::addTabWorkArea()
 {
        TabWorkArea * twa = new TabWorkArea;
        QObject::connect(twa, SIGNAL(currentWorkAreaChanged(GuiWorkArea *)),
                this, SLOT(on_currentWorkAreaChanged(GuiWorkArea *)));
        d.splitter_->addWidget(twa);
        d.stack_widget_->setCurrentWidget(d.splitter_);
+       return twa;
 }
 
 
@@ -962,6 +960,14 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                enable = buf;
                break;
 
+       case LFUN_SPLIT_VIEW:
+               enable = buf;
+               break;
+
+       case LFUN_CLOSE_TAB_GROUP:
+               enable = d.currentTabWorkArea();
+               break;
+
        case LFUN_TOOLBAR_TOGGLE:
                flag.setOnOff(d.toolbars_->visible(cmd.getArg(0)));
                break;
@@ -1805,6 +1811,31 @@ bool GuiView::dispatch(FuncRequest const & cmd)
 
                case LFUN_UI_TOGGLE:
                        lfunUiToggle(cmd);
+                       // Make sure the keyboard focus stays in the work area.
+                       setFocus();
+                       break;
+
+               case LFUN_SPLIT_VIEW:
+                       if (Buffer * buf = buffer()) {
+                               string const orientation = cmd.getArg(0);
+                               d.splitter_->setOrientation(orientation == "vertical"
+                                       ? Qt::Vertical : Qt::Horizontal);
+                               TabWorkArea * twa = addTabWorkArea();
+                               GuiWorkArea * wa = twa->addWorkArea(*buf, *this);
+                               setCurrentWorkArea(wa);
+                       }
+                       break;
+
+               case LFUN_CLOSE_TAB_GROUP:
+                       if (TabWorkArea * twa = d.currentTabWorkArea()) {
+                               delete twa;
+                               twa = d.currentTabWorkArea();
+                               // Switch to the next GuiWorkArea in the found TabWorkArea.
+                               d.current_work_area_ = twa? twa->currentWorkArea() : 0;
+                               if (d.splitter_->count() == 0)
+                                       // No more work area, switch to the background widget.
+                                       d.setBackground();
+                       }
                        break;
 
                default:
@@ -1858,24 +1889,27 @@ void GuiView::lfunUiToggle(FuncRequest const & cmd)
                return;
        }
 
+       if (lyxrc.full_screen_toolbars)
+               d.toolbars_->toggleFullScreen(!isFullScreen());
+
        if (isFullScreen()) {
-               showNormal();
+               for (int i = 0; i != d.splitter_->count(); ++i)
+                       d.tabWorkArea(i)->setFullScreen(false);
 #if QT_VERSION >= 0x040300
                setContentsMargins(0, 0, 0, 0);
 #endif
-               for (int i = 0; i != d.splitter_->count(); ++i)
-                       d.tabWorkArea(i)->setFullScreen(false);
+               showNormal();
                menuBar()->show();
                statusBar()->show();
        } else {
-               statusBar()->hide();
-               menuBar()->hide();
                for (int i = 0; i != d.splitter_->count(); ++i)
                        d.tabWorkArea(i)->setFullScreen(true);
 #if QT_VERSION >= 0x040300
                setContentsMargins(-2, -2, -2, -2);
 #endif
                showFullScreen();
+               statusBar()->hide();
+               menuBar()->hide();
        }
 }
 
@@ -2128,7 +2162,6 @@ Dialog * createGuiExternal(GuiView & lv);
 Dialog * createGuiFloat(GuiView & lv);
 Dialog * createGuiGraphics(GuiView & lv);
 Dialog * createGuiInclude(GuiView & lv);
-Dialog * createGuiIndex(GuiView & lv);
 Dialog * createGuiLabel(GuiView & lv);
 Dialog * createGuiListings(GuiView & lv);
 Dialog * createGuiLog(GuiView & lv);
@@ -2193,8 +2226,6 @@ Dialog * GuiView::build(string const & name)
                return createGuiGraphics(*this);
        if (name == "include")
                return createGuiInclude(*this);
-       if (name == "index")
-               return createGuiIndex(*this);
        if (name == "nomenclature")
                return createGuiNomenclature(*this);
        if (name == "label")