[LyX/master] Extend tab context menu features

Jean-Marc Lasgouttes lasgouttes at lyx.org
Sat Jun 1 17:25:19 UTC 2024


commit a114f12868f8b48b9507aa22bf4156af0062ac97
Author: Daniel Ramoeller <d.lyx at web.de>
Date:   Sat Feb 27 07:05:54 2021 +0100

    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
---
 src/frontends/qt/GuiWorkArea.cpp | 116 +++++++++++++++++++++++++++++++++++++--
 src/frontends/qt/GuiWorkArea.h   |  15 +++++
 2 files changed, 127 insertions(+), 4 deletions(-)

diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index ec9bedee5f..8b86615b4e 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -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)
 {
diff --git a/src/frontends/qt/GuiWorkArea.h b/src/frontends/qt/GuiWorkArea.h
index 8cb0771c0f..12f642c54f 100644
--- a/src/frontends/qt/GuiWorkArea.h
+++ b/src/frontends/qt/GuiWorkArea.h
@@ -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_;


More information about the lyx-cvs mailing list