]> git.lyx.org Git - lyx.git/commitdiff
Extend tab context menu features
authorDaniel Ramoeller <d.lyx@web.de>
Sat, 27 Feb 2021 06:05:54 +0000 (07:05 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 1 Jun 2024 17:25:14 +0000 (19:25 +0200)
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

src/frontends/qt/GuiWorkArea.cpp
src/frontends/qt/GuiWorkArea.h

index ec9bedee5ff8976f56cc66fd6505d1242580154b..8b86615b4e6949cdd79576717cdc987776f54742 100644 (file)
@@ -1958,6 +1958,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;
@@ -1985,6 +2054,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:
@@ -2232,19 +2317,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)
 {
index 8cb0771c0f2372953436cd21cb4b842679d6f57d..12f642c54fa31cf2499bade61394bd3724c11d29 100644 (file)
@@ -244,6 +244,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);
        ///
@@ -271,6 +283,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_;