diff --git a/src/icons/icons.qrc b/src/icons/icons.qrc
index 1ff153d1a..e082993eb 100644
--- a/src/icons/icons.qrc
+++ b/src/icons/icons.qrc
@@ -125,6 +125,10 @@
images/m45_24px@2x.png
images/m90_24px.png
images/m90_24px@2x.png
+ images/menu_16px.png
+ images/menu_16px@2x.png
+ images/menu_24px.png
+ images/menu_24px@2x.png
images/move_24px.png
images/move_24px@2x.png
images/move_simple_16px.png
diff --git a/src/icons/images/menu_16px.png b/src/icons/images/menu_16px.png
new file mode 100644
index 000000000..303068693
Binary files /dev/null and b/src/icons/images/menu_16px.png differ
diff --git a/src/icons/images/menu_16px@2x.png b/src/icons/images/menu_16px@2x.png
new file mode 100644
index 000000000..d8aee7d85
Binary files /dev/null and b/src/icons/images/menu_16px@2x.png differ
diff --git a/src/icons/images/menu_24px.png b/src/icons/images/menu_24px.png
new file mode 100644
index 000000000..f6657dce0
Binary files /dev/null and b/src/icons/images/menu_24px.png differ
diff --git a/src/icons/images/menu_24px@2x.png b/src/icons/images/menu_24px@2x.png
new file mode 100644
index 000000000..6c1b124f6
Binary files /dev/null and b/src/icons/images/menu_24px@2x.png differ
diff --git a/src/icons/svg/menu_16px.svg b/src/icons/svg/menu_16px.svg
new file mode 100644
index 000000000..30ec850ea
--- /dev/null
+++ b/src/icons/svg/menu_16px.svg
@@ -0,0 +1,166 @@
+
+
+
+
diff --git a/src/icons/svg/menu_24px.svg b/src/icons/svg/menu_24px.svg
new file mode 100644
index 000000000..46224677c
--- /dev/null
+++ b/src/icons/svg/menu_24px.svg
@@ -0,0 +1,187 @@
+
+
+
+
diff --git a/src/lay/lay/lay.pro b/src/lay/lay/lay.pro
index f9065ad92..3500502b8 100644
--- a/src/lay/lay/lay.pro
+++ b/src/lay/lay/lay.pro
@@ -11,7 +11,7 @@ HEADERS = \
layClipDialog.h \
layControlWidgetStack.h \
layCrashMessage.h \
- layEnhancedTabWidget.h \
+ layEnhancedTabBar.h \
layFillDialog.h \
layGSIHelpProvider.h \
layHelpAboutDialog.h \
@@ -122,7 +122,7 @@ SOURCES = \
layClipDialog.cc \
layControlWidgetStack.cc \
layCrashMessage.cc \
- layEnhancedTabWidget.cc \
+ layEnhancedTabBar.cc \
layFillDialog.cc \
layGSIHelpProvider.cc \
layHelpAboutDialog.cc \
diff --git a/src/lay/lay/layEnhancedTabWidget.cc b/src/lay/lay/layEnhancedTabBar.cc
similarity index 70%
rename from src/lay/lay/layEnhancedTabWidget.cc
rename to src/lay/lay/layEnhancedTabBar.cc
index bc95715d5..5831eb69c 100644
--- a/src/lay/lay/layEnhancedTabWidget.cc
+++ b/src/lay/lay/layEnhancedTabBar.cc
@@ -21,7 +21,7 @@
*/
-#include "layEnhancedTabWidget.h"
+#include "layEnhancedTabBar.h"
#include
#include
@@ -35,18 +35,18 @@ namespace lay
// ---------------------------------------------------------------------------------------------
// EnhancedTabWidget implementation
-EnhancedTabWidget::EnhancedTabWidget (QWidget *parent)
- : QTabWidget (parent)
+EnhancedTabBar::EnhancedTabBar (QWidget *parent)
+ : QTabBar (parent)
{
mp_list_tool_button = new QToolButton (this);
mp_list_tool_button->setAutoRaise (true);
- mp_list_tool_button->setIcon (QIcon (QString::fromUtf8 (":/find_16px.png")));
- mp_list_tool_button->setIconSize (QSize (20, 20));
+ mp_list_tool_button->hide ();
+ mp_list_tool_button->setIcon (QIcon (QString::fromUtf8 (":/menu_24px.png")));
+ mp_list_tool_button->setIconSize (QSize (24, 24));
mp_list_tool_button->setMenu (new QMenu (this));
mp_list_tool_button->setPopupMode (QToolButton::InstantPopup);
mp_list_tool_button->setToolButtonStyle (Qt::ToolButtonIconOnly);
- mp_list_tool_button->setToolTip ( tr ("List of all opened views"));
- setCornerWidget (mp_list_tool_button, Qt::TopRightCorner);
+ mp_list_tool_button->setToolTip (tr ("List of all opened views"));
connect (mp_list_tool_button->menu (), SIGNAL (aboutToShow()),
this, SLOT (list_tool_button_menu_about_to_show()));
@@ -58,26 +58,29 @@ EnhancedTabWidget::EnhancedTabWidget (QWidget *parent)
this, SLOT (list_action_group_triggered(QAction *)));
}
-EnhancedTabWidget::~EnhancedTabWidget () = default;
-
-void EnhancedTabWidget::tabInserted (int index)
+EnhancedTabBar::~EnhancedTabBar ()
{
- QTabWidget::tabInserted (index);
+ // .. nothing yet ..
+}
+
+void EnhancedTabBar::tabInserted (int index)
+{
+ QTabBar::tabInserted (index);
update_list_button_visibility ();
}
-void EnhancedTabWidget::tabRemoved (int index)
+void EnhancedTabBar::tabRemoved (int index)
{
- QTabWidget::tabRemoved (index);
+ QTabBar::tabRemoved (index);
update_list_button_visibility ();
}
-void EnhancedTabWidget::list_action_group_triggered (QAction *action)
+void EnhancedTabBar::list_action_group_triggered (QAction *action)
{
setCurrentIndex (action->data ().toInt ());
}
-void EnhancedTabWidget::list_tool_button_menu_about_to_show ()
+void EnhancedTabBar::list_tool_button_menu_about_to_show ()
{
mp_list_tool_button->menu ()->clear ();
if (count () > 1) {
@@ -91,11 +94,9 @@ void EnhancedTabWidget::list_tool_button_menu_about_to_show ()
}
}
-void EnhancedTabWidget::update_list_button_visibility()
+void EnhancedTabBar::update_list_button_visibility()
{
- if (cornerWidget (Qt::TopRightCorner) != nullptr) {
- cornerWidget (Qt::TopRightCorner)->setVisible (count () > 1);
- }
+ mp_list_tool_button->setVisible (count () > 1);
}
}
diff --git a/src/lay/lay/layEnhancedTabWidget.h b/src/lay/lay/layEnhancedTabBar.h
similarity index 87%
rename from src/lay/lay/layEnhancedTabWidget.h
rename to src/lay/lay/layEnhancedTabBar.h
index a88c34b85..3adcb2248 100644
--- a/src/lay/lay/layEnhancedTabWidget.h
+++ b/src/lay/lay/layEnhancedTabBar.h
@@ -24,7 +24,7 @@
#ifndef HDR_layEnhancedTabWidget
#define HDR_layEnhancedTabWidget
-#include
+#include
class QActionGroup;
class QToolButton;
@@ -32,14 +32,16 @@ class QToolButton;
namespace lay
{
-class EnhancedTabWidget
- : public QTabWidget
+class EnhancedTabBar
+ : public QTabBar
{
Q_OBJECT
public:
- EnhancedTabWidget (QWidget *parent);
- ~EnhancedTabWidget () override;
+ EnhancedTabBar (QWidget *parent);
+ ~EnhancedTabBar () override;
+
+ QToolButton *menu_button () { return mp_list_tool_button; }
protected:
void tabInserted (int index) override;
diff --git a/src/lay/lay/layMacroEditorDialog.cc b/src/lay/lay/layMacroEditorDialog.cc
index a09fef3d6..8b50c5cd9 100644
--- a/src/lay/lay/layMacroEditorDialog.cc
+++ b/src/lay/lay/layMacroEditorDialog.cc
@@ -397,8 +397,14 @@ MacroEditorDialog::MacroEditorDialog (lay::Dispatcher *pr, lym::MacroCollection
QAction *action = new QAction (tr ("Close All"), this);
connect (action, SIGNAL (triggered ()), this, SLOT (close_all ()));
tabWidget->addAction (action);
- action = new QAction (tr ("Close All Except Current"), this);
- connect (action, SIGNAL (triggered ()), this, SLOT (close_all_but_current ()));
+ action = new QAction (tr ("Close All Except This"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_but_this ()));
+ tabWidget->addAction (action);
+ action = new QAction (tr ("Close All Left"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_left ()));
+ tabWidget->addAction (action);
+ action = new QAction (tr ("Close All Right"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_right ()));
tabWidget->addAction (action);
dbgOn->setEnabled (true);
@@ -468,6 +474,8 @@ MacroEditorDialog::MacroEditorDialog (lay::Dispatcher *pr, lym::MacroCollection
connect (replaceAllButton, SIGNAL (clicked ()), this, SLOT (replace_all_button_clicked ()));
connect (allVariables, SIGNAL (clicked (bool)), variableList, SLOT (set_show_all (bool)));
+ tabWidget->installEventFilter (this);
+
splitter->setCollapsible (1, false);
replaceFrame->hide ();
@@ -1535,7 +1543,13 @@ MacroEditorDialog::eventFilter (QObject *obj, QEvent *event)
}
- }
+ } else if (obj == tabWidget->tabBar () && dynamic_cast (event) != 0) {
+
+ // just spy on the events, don't eat them
+ QMouseEvent *mouse_event = dynamic_cast (event);
+ m_mouse_pos = mouse_event->pos ();
+
+ }
return false;
}
@@ -2263,7 +2277,25 @@ END_PROTECTED
}
void
-MacroEditorDialog::close_all_but_current ()
+MacroEditorDialog::close_all_but_this ()
+{
+ close_many (0);
+}
+
+void
+MacroEditorDialog::close_all_left ()
+{
+ close_many (-1);
+}
+
+void
+MacroEditorDialog::close_all_right ()
+{
+ close_many (1);
+}
+
+void
+MacroEditorDialog::close_many (int r2c)
{
if (m_in_exec) {
return;
@@ -2271,17 +2303,19 @@ MacroEditorDialog::close_all_but_current ()
BEGIN_PROTECTED
- QWidget *cw = tabWidget->currentWidget ();
- int ci = tabWidget->currentIndex ();
-
+ int ci = tabWidget->tabBar ()->tabAt (m_mouse_pos);
if (ci < 0) {
- close_all ();
return;
}
+ std::set removed;
+
for (int i = tabWidget->count (); i > 0; ) {
--i;
- if (i != ci) {
+ if ((r2c == 0 && i != ci) ||
+ (r2c < 0 && i < ci) ||
+ (r2c > 0 && i > ci)) {
+ removed.insert (tabWidget->widget (i));
tabWidget->removeTab (i);
}
}
@@ -2289,7 +2323,7 @@ BEGIN_PROTECTED
std::map new_widgets;
for (std::map ::iterator p = m_tab_widgets.begin (); p != m_tab_widgets.end (); ++p) {
- if (cw && p->second == cw) {
+ if (removed.find (p->second) == removed.end ()) {
new_widgets.insert (*p);
} else {
if (p->second) {
diff --git a/src/lay/lay/layMacroEditorDialog.h b/src/lay/lay/layMacroEditorDialog.h
index e3c14c68d..bfb45f24d 100644
--- a/src/lay/lay/layMacroEditorDialog.h
+++ b/src/lay/lay/layMacroEditorDialog.h
@@ -213,7 +213,9 @@ private slots:
void search_finished ();
void tab_close_requested (int);
void close_all ();
- void close_all_but_current ();
+ void close_all_but_this ();
+ void close_all_left ();
+ void close_all_right ();
void replace_mode_button_clicked ();
void replace_next_button_clicked ();
void replace_all_button_clicked ();
@@ -264,6 +266,7 @@ private:
void move_subfolder (lym::MacroCollection *source, lym::MacroCollection *target);
lay::MacroEditorPage *create_page (lym::Macro *macro);
void open_macro (lym::Macro *macro);
+ void close_many (int which_relative_to_current);
void ensure_writeable_collection_selected ();
void update_console_text ();
void start_exec (gsi::Interpreter *interpreter);
@@ -303,6 +306,7 @@ private:
lay::Dispatcher *mp_plugin_root;
lym::MacroCollection *mp_root;
bool m_first_show;
+ QPoint m_mouse_pos;
bool m_debugging_on;
lym::Macro *mp_run_macro;
std::vector m_macro_templates;
diff --git a/src/lay/lay/layMainWindow.cc b/src/lay/lay/layMainWindow.cc
index be44fecd3..470809b20 100644
--- a/src/lay/lay/layMainWindow.cc
+++ b/src/lay/lay/layMainWindow.cc
@@ -70,7 +70,7 @@
#include "layDialogs.h"
#include "laybasicConfig.h"
#include "layConfig.h"
-#include "layEnhancedTabWidget.h"
+#include "layEnhancedTabBar.h"
#include "layMainWindow.h"
#include "layHelpDialog.h"
#include "layNavigator.h"
@@ -228,14 +228,43 @@ MainWindow::MainWindow (QApplication *app, const char *name, bool undo_enabled)
vbl->setContentsMargins (0, 0, 0, 0);
vbl->setSpacing (0);
- mp_tab_widget = new EnhancedTabWidget (mp_main_frame);
- vbl->addWidget (mp_tab_widget);
- connect (mp_tab_widget, SIGNAL (currentChanged (int)), this, SLOT (view_selected (int)));
+ QHBoxLayout *vbh_tab = new QHBoxLayout (mp_main_frame);
+ vbh_tab->setSpacing (6);
+ vbl->addLayout (vbh_tab);
+
+ EnhancedTabBar *enh_tab_widget = new EnhancedTabBar (mp_main_frame);
+ mp_tab_bar = enh_tab_widget;
+ mp_tab_bar->installEventFilter (this);
+ vbh_tab->addWidget (enh_tab_widget);
+ vbh_tab->addWidget (enh_tab_widget->menu_button ());
+
+ connect (mp_tab_bar, SIGNAL (currentChanged (int)), this, SLOT (view_selected (int)));
#if QT_VERSION >= 0x040500
- mp_tab_widget->setTabsClosable(true);
- connect (mp_tab_widget, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
+ mp_tab_bar->setTabsClosable (true);
+ connect (mp_tab_bar, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
#endif
+ mp_tab_bar->setContextMenuPolicy (Qt::ActionsContextMenu);
+
+ QAction *action = new QAction (tr ("Close All"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_views ()));
+ mp_tab_bar->addAction (action);
+ action = new QAction (tr ("Close All Except This"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_except_this ()));
+ mp_tab_bar->addAction (action);
+ action = new QAction (tr ("Close All Left"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_views_left ()));
+ mp_tab_bar->addAction (action);
+ action = new QAction (tr ("Close All Right"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (close_all_views_right ()));
+ mp_tab_bar->addAction (action);
+ action = new QAction (this);
+ action->setSeparator (true);
+ mp_tab_bar->addAction (action);
+ action = new QAction (tr ("Clone Panel"), this);
+ connect (action, SIGNAL (triggered ()), this, SLOT (clone ()));
+ mp_tab_bar->addAction (action);
+
mp_hp_dock_widget = new QDockWidget (QObject::tr ("Cells"), this);
mp_hp_dock_widget->setObjectName (QString::fromUtf8 ("hp_dock_widget"));
mp_hp_stack = new ControlWidgetStack (mp_hp_dock_widget, "hp_stack");
@@ -683,8 +712,8 @@ MainWindow::close_all ()
// Clear the tab bar
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
- while (mp_tab_widget->count () > 0) {
- mp_tab_widget->removeTab (mp_tab_widget->count () - 1);
+ while (mp_tab_bar->count () > 0) {
+ mp_tab_bar->removeTab (mp_tab_bar->count () - 1);
}
m_disable_tab_selected = f;
@@ -2315,7 +2344,7 @@ MainWindow::view_selected (int index)
// Hint: setting the focus to the tab bar avoids problem with dangling keyboard focus.
// Sometimes, the focus was set to the hierarchy level spin buttons which caught Copy&Paste
// events in effect.
- mp_tab_widget->setFocus ();
+ mp_tab_bar->setFocus ();
if (! m_disable_tab_selected) {
select_view (index);
@@ -2336,7 +2365,7 @@ MainWindow::select_view (int index)
tl_assert (index >= 0 && index < int (views ()));
- mp_tab_widget->setCurrentIndex (index);
+ mp_tab_bar->setCurrentIndex (index);
bool box_set = (m_synchronized_views && current_view () != 0);
db::DBox box;
@@ -2565,7 +2594,7 @@ MainWindow::clone_current_view ()
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
- int index = mp_tab_widget->insertTab (-1, mp_views.back (), tl::to_qstring (view->title ()));
+ int index = mp_tab_bar->insertTab (-1, tl::to_qstring (view->title ()));
m_disable_tab_selected = f;
view_created_event (index);
@@ -2577,27 +2606,29 @@ MainWindow::clone_current_view ()
void
MainWindow::cm_close_all ()
{
- interactive_close_view (-1, false);
+ interactive_close_view (0, views (), false, false);
}
void
MainWindow::cm_close ()
{
- interactive_close_view (index_of (lay::LayoutView::current ()), false);
+ int current_index = index_of (lay::LayoutView::current ());
+ if (current_index >= 0) {
+ interactive_close_view (current_index, current_index + 1, false, false);
+ }
}
void
MainWindow::tab_close_requested (int index)
{
- interactive_close_view (index, true);
+ interactive_close_view (index, index + 1, false, true);
}
void
-MainWindow::interactive_close_view (int index, bool all_cellviews)
+MainWindow::interactive_close_view (int from, int to, bool invert_range, bool all_cellviews)
{
- if (index < 0) {
-
- // close all views
+ // closes views in range [from, to[ (invert_range=false) or outside this range (invert_range=true)
+ if (invert_range || from + 1 != to) {
bool can_close = true;
@@ -2605,7 +2636,11 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
std::string dirty_files;
std::set seen_names;
- for (index = 0; index < int (views ()); ++index) {
+ for (int index = 0; index < int (views ()); ++index) {
+
+ if ((index >= from && index < to) == invert_range) {
+ continue;
+ }
for (unsigned int i = 0; i < view (index)->cellviews (); ++i) {
@@ -2653,28 +2688,31 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
if (can_close) {
BEGIN_PROTECTED
- while (views () > 0) {
- close_view (0);
+ for (int index = int (views ()); index > 0; ) {
+ --index;
+ if ((index >= from && index < to) != invert_range) {
+ close_view (index);
+ }
}
END_PROTECTED
}
- } else if (view (index)) {
+ } else if (view (from)) {
std::vector selected;
- if (view (index)->cellviews () > 1) {
+ if (view (from)->cellviews () > 1) {
if (all_cellviews) {
- for (int i = 0; i < int (view (index)->cellviews ()); ++i) {
+ for (int i = 0; i < int (view (from)->cellviews ()); ++i) {
selected.push_back (i);
}
} else {
- SelectCellViewForm form (0, view (index), tl::to_string (QObject::tr ("Select Layouts To Close")));
- form.set_selection (view (index)->active_cellview_index ());
+ SelectCellViewForm form (0, view (from), tl::to_string (QObject::tr ("Select Layouts To Close")));
+ form.set_selection (view (from)->active_cellview_index ());
if (form.exec () != QDialog::Accepted) {
return;
@@ -2687,7 +2725,7 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
}
- } else if (view (index)->cellviews () > 0) {
+ } else if (view (from)->cellviews () > 0) {
selected.push_back (0);
}
@@ -2698,7 +2736,7 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
for (std::vector ::const_iterator i = selected.begin (); i != selected.end (); ++i) {
- const lay::CellView &cv = view (index)->cellview (*i);
+ const lay::CellView &cv = view (from)->cellview (*i);
if (cv->layout ().is_editable () && cv->is_dirty ()) {
@@ -2715,7 +2753,7 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
}
for (std::vector ::const_iterator ii = selected.begin (); ii != selected.end (); ++ii) {
- if (view (index)->cellview (*ii)->name () == name) {
+ if (view (from)->cellview (*ii)->name () == name) {
--count;
}
}
@@ -2758,14 +2796,14 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
BEGIN_PROTECTED
// Actually erase the selected cellviews
- if (view (index)->cellviews () == selected.size ()) {
+ if (view (from)->cellviews () == selected.size ()) {
// all cellviews selected - simply close
- close_view (index);
+ close_view (from);
} else {
std::sort (selected.begin (), selected.end ());
int offset = 0;
for (std::vector ::const_iterator i = selected.begin (); i != selected.end (); ++i) {
- view (index)->erase_cellview ((unsigned int)(*i - offset));
+ view (from)->erase_cellview ((unsigned int)(*i - offset));
++offset;
}
}
@@ -2775,19 +2813,58 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
}
} else {
- close_view (index);
+ close_view (from);
}
}
}
+void
+MainWindow::clone ()
+{
+ clone_current_view ();
+}
+
void
MainWindow::close_current_view ()
{
close_view (index_of (lay::LayoutView::current ()));
}
+void
+MainWindow::close_all_views ()
+{
+ cm_close_all ();
+}
+
+void
+MainWindow::close_all_except_this ()
+{
+ int index = mp_tab_bar->tabAt (m_mouse_pos);
+ if (index >= 0) {
+ interactive_close_view (index, index + 1, true, false);
+ }
+}
+
+void
+MainWindow::close_all_views_left ()
+{
+ int index = mp_tab_bar->tabAt (m_mouse_pos);
+ if (index >= 0) {
+ interactive_close_view (0, index, false, false);
+ }
+}
+
+void
+MainWindow::close_all_views_right ()
+{
+ int index = mp_tab_bar->tabAt (m_mouse_pos);
+ if (index >= 0) {
+ interactive_close_view (index + 1, views (), false, false);
+ }
+}
+
void
MainWindow::close_view (int index)
{
@@ -2806,7 +2883,7 @@ MainWindow::close_view (int index)
box = view (index)->viewport ().box ();
}
- mp_tab_widget->removeTab (index);
+ mp_tab_bar->removeTab (index);
mp_view_stack->remove_widget (index);
mp_lp_stack->remove_widget (index);
mp_layer_toolbox_stack->remove_widget (index);
@@ -3382,7 +3459,7 @@ MainWindow::create_view ()
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
- int index = mp_tab_widget->insertTab (-1, mp_views.back (), tl::to_qstring (current_view ()->title ()));
+ int index = mp_tab_bar->insertTab (-1, tl::to_qstring (current_view ()->title ()));
m_disable_tab_selected = f;
view_created_event (index);
@@ -3445,7 +3522,7 @@ MainWindow::create_or_load_layout (const std::string *filename, const db::LoadLa
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
- int index = mp_tab_widget->insertTab (-1, mp_views.back (), QString ());
+ int index = mp_tab_bar->insertTab (-1, QString ());
update_tab_title (index);
m_disable_tab_selected = f;
view_created_event (index);
@@ -3485,8 +3562,8 @@ MainWindow::update_tab_title (int i)
title += v->title ();
}
- if (tl::to_string (mp_tab_widget->tabText (i)) != title) {
- mp_tab_widget->setTabText (i, tl::to_qstring (title));
+ if (tl::to_string (mp_tab_bar->tabText (i)) != title) {
+ mp_tab_bar->setTabText (i, tl::to_qstring (title));
}
if (v) {
@@ -3501,8 +3578,8 @@ MainWindow::update_tab_title (int i)
files += tl::to_string (tr ("(not saved)"));
}
}
- if (tl::to_string (mp_tab_widget->tabToolTip (i)) != files) {
- mp_tab_widget->setTabToolTip (i, tl::to_qstring (files));
+ if (tl::to_string (mp_tab_bar->tabToolTip (i)) != files) {
+ mp_tab_bar->setTabToolTip (i, tl::to_qstring (files));
}
}
}
@@ -3958,6 +4035,17 @@ MainWindow::dragEnterEvent(QDragEnterEvent *event)
}
}
+bool
+MainWindow::eventFilter (QObject *watched, QEvent *event)
+{
+ // spy on the mouse events of the tab bar so we can tell which tab the menu was issued on
+ if (watched == mp_tab_bar && dynamic_cast (event) != 0) {
+ m_mouse_pos = dynamic_cast (event)->pos ();
+ }
+
+ return QMainWindow::eventFilter (watched, event);
+}
+
void
MainWindow::dropEvent(QDropEvent *event)
{
diff --git a/src/lay/lay/layMainWindow.h b/src/lay/lay/layMainWindow.h
index 086ced6fb..48c787f24 100644
--- a/src/lay/lay/layMainWindow.h
+++ b/src/lay/lay/layMainWindow.h
@@ -51,7 +51,7 @@
#include "tlDeferredExecution.h"
#include "gsi.h"
-class QTabWidget;
+class QTabBar;
class QToolBar;
class QLabel;
class QAction;
@@ -632,6 +632,11 @@ public slots:
void exit ();
void close_current_view ();
void close_view (int index);
+ void close_all_views ();
+ void close_all_except_this ();
+ void close_all_views_left ();
+ void close_all_views_right ();
+ void clone ();
void tab_close_requested (int);
void open_recent (size_t n);
void open_recent_session (size_t n);
@@ -675,6 +680,7 @@ protected:
void update_content ();
void do_update_menu ();
void do_update_mru_menus ();
+ bool eventFilter (QObject *watched, QEvent *event);
private:
lay::Dispatcher m_dispatcher;
@@ -682,7 +688,8 @@ private:
TextProgressDelegate m_text_progress;
// Main menu
- QTabWidget *mp_tab_widget;
+ QTabBar *mp_tab_bar;
+ QPoint m_mouse_pos;
QToolBar *mp_tool_bar;
QDockWidget *mp_navigator_dock_widget;
lay::Navigator *mp_navigator;
@@ -802,7 +809,7 @@ private:
int dirty_files (std::string &dirty_files);
void load_layer_props_from_file (const std::string &fn);
- void interactive_close_view (int index, bool all_cellviews);
+ void interactive_close_view (int from, int to, bool invert_range, bool all_cellviews);
void call_on_current_view (void (lay::LayoutView::*func) (), const std::string &op_desc);
void current_view_changed ();
void update_window_title ();