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 ();