From: Daniel Ramoeller Date: Sat, 27 Feb 2021 06:05:54 +0000 (+0100) Subject: Extend tab context menu features X-Git-Tag: 2.4.1~47 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=259c89f45edd4a13fe63fa759fa80b06b2ee4e9a;p=lyx.git Extend tab context menu features Add - Close Other Tabs - Close Tabs to Left/Right - Move Tab to Start/End - Show Enclosing Folder to the tabs context menus. Fix for bug #11963 (cherry picked from commit a114f12868f8b48b9507aa22bf4156af0062ac97) --- diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp index 1864039e4f..dffcdbd284 100644 --- a/src/frontends/qt/GuiWorkArea.cpp +++ b/src/frontends/qt/GuiWorkArea.cpp @@ -1959,6 +1959,75 @@ void TabWorkArea::closeCurrentBuffer() } +bool TabWorkArea::closeTabsToRight() +{ + if (clicked_tab_ == -1) + return false; + + int const initialCurrentIndex = currentIndex(); + + while (count() - 1 > clicked_tab_) { + GuiWorkArea * wa = workArea(count() - 1); + LASSERT(wa, return false); + if (!wa->view().closeWorkArea(wa)) { + // closing cancelled, if possible, reset initial current tab index + if (initialCurrentIndex < count()) + setCurrentIndex(initialCurrentIndex); + else + setCurrentIndex(clicked_tab_); + return false; + } + } + return true; +} + + +bool TabWorkArea::openEnclosingFolder() +{ + + if (clicked_tab_ == -1) + return false; + + Buffer const & buf = workArea(clicked_tab_)->bufferView().buffer(); + showDirectory(buf.fileName().onlyPath()); + return true; +} + + +bool TabWorkArea::closeTabsToLeft() +{ + if (clicked_tab_ == -1) + return false; + + int const initialCurrentIndex = currentIndex(); + + int n = clicked_tab_; + + for (int i = 0; i < n; ++i) { + GuiWorkArea * wa = workArea(0); + LASSERT(wa, return false); + if (!wa->view().closeWorkArea(wa)) { + // closing cancelled, if possible, reset initial current tab index + if (initialCurrentIndex - i >= 0) + setCurrentIndex(initialCurrentIndex - i); + else + setCurrentIndex(clicked_tab_ - i); + return false; + } + } + return true; +} + + +void TabWorkArea::closeOtherTabs() +{ + if (clicked_tab_ == -1) + return; + + closeTabsToRight() && closeTabsToLeft(); +} + + void TabWorkArea::hideCurrentTab() { GuiWorkArea * wa; @@ -1986,6 +2055,22 @@ void TabWorkArea::closeTab(int index) } +void TabWorkArea::moveToStartCurrentTab() +{ + if (clicked_tab_ == -1) + return; + tabBar()->moveTab(clicked_tab_, 0); +} + + +void TabWorkArea::moveToEndCurrentTab() +{ + if (clicked_tab_ == -1) + return; + tabBar()->moveTab(clicked_tab_, count() - 1); +} + + /// class DisplayPath { public: @@ -2233,19 +2318,42 @@ void TabWorkArea::showContextMenu(const QPoint & pos) // show tab popup QMenu popup; - popup.addAction(QIcon(getPixmap("images/", "hidetab", "svgz,png")), - qt_("&Hide Tab"), this, SLOT(hideCurrentTab())); + popup.addAction(qt_("&Hide Tab"), this, SLOT(hideCurrentTab())); // we want to show the 'close' option only if this is not a child buffer. Buffer const & buf = wa->bufferView().buffer(); if (!buf.parent()) - popup.addAction(QIcon(getPixmap("images/", "closetab", "svgz,png")), - qt_("&Close Tab"), this, SLOT(closeCurrentBuffer())); + popup.addAction(qt_("&Close Tab"), this, SLOT(closeCurrentBuffer())); + + popup.addSeparator(); + + QAction * closeOther = popup.addAction(qt_("Close &Other Tabs"), this, SLOT(closeOtherTabs())); + closeOther->setEnabled(clicked_tab_ != 0 || hasTabsToRight(clicked_tab_)); + QAction * closeRight = popup.addAction(qt_("Close Tabs to the &Right"), this, SLOT(closeTabsToRight())); + closeRight->setEnabled(hasTabsToRight(clicked_tab_)); + QAction * closeLeft = popup.addAction(qt_("Close Tabs to the &Left"), this, SLOT(closeTabsToLeft())); + closeLeft->setEnabled(clicked_tab_ != 0); + + popup.addSeparator(); + + QAction * moveStart = popup.addAction(qt_("Move Tab to &Start"), this, SLOT(moveToStartCurrentTab())); + moveStart->setEnabled(closeLeft->isEnabled()); + QAction * moveEnd = popup.addAction(qt_("Move Tab to &End"), this, SLOT(moveToEndCurrentTab())); + moveEnd->setEnabled(closeRight->isEnabled()); + + popup.addSeparator(); + + popup.addAction(qt_("Open Enclosing &Folder"), this, SLOT(openEnclosingFolder())); + popup.exec(tabBar()->mapToGlobal(pos)); clicked_tab_ = -1; } +bool TabWorkArea::hasTabsToRight(int index) { + return count() - 1 > index; +} + void TabWorkArea::moveTab(int fromIndex, int toIndex) { diff --git a/src/frontends/qt/GuiWorkArea.h b/src/frontends/qt/GuiWorkArea.h index 86bbfda939..b37faf0046 100644 --- a/src/frontends/qt/GuiWorkArea.h +++ b/src/frontends/qt/GuiWorkArea.h @@ -242,6 +242,18 @@ public Q_SLOTS: void closeCurrentBuffer(); /// hide current tab, or the one given by \c clicked_tab_ void hideCurrentTab(); + /// + bool closeTabsToRight(); + /// + bool closeTabsToLeft(); + /// + void closeOtherTabs(); + /// + void moveToStartCurrentTab(); + /// + void moveToEndCurrentTab(); + /// + bool openEnclosingFolder(); /// close the tab given by \c index void closeTab(int index); /// @@ -269,6 +281,9 @@ private: /// true if position is a tab (rather than the blank space in tab bar) bool posIsTab(QPoint position); + // true if there are tabs to the right of the tab at index + bool hasTabsToRight(int index); + int clicked_tab_; /// int midpressed_tab_;