Merge pull request #1160 from EugeneZelenko/enhanced-tab-widget

Use enhanced tab widget for file tabs to easily navigate through larg…
This commit is contained in:
Matthias Köfferlein 2022-10-09 21:26:04 +02:00 committed by GitHub
commit c9cef44108
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 218 additions and 50 deletions

View File

@ -11,6 +11,7 @@ HEADERS = \
layClipDialog.h \
layControlWidgetStack.h \
layCrashMessage.h \
layEnhancedTabWidget.h \
layFillDialog.h \
layGSIHelpProvider.h \
layHelpAboutDialog.h \
@ -121,6 +122,7 @@ SOURCES = \
layClipDialog.cc \
layControlWidgetStack.cc \
layCrashMessage.cc \
layEnhancedTabWidget.cc \
layFillDialog.cc \
layGSIHelpProvider.cc \
layHelpAboutDialog.cc \

View File

@ -0,0 +1,103 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2022 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "layEnhancedTabWidget.h"
#include <QAction>
#include <QActionGroup>
#include <QMenu>
#include <QString>
#include <QToolButton>
namespace lay
{
// ---------------------------------------------------------------------------------------------
// EnhancedTabWidget implementation
EnhancedTabWidget::EnhancedTabWidget (QWidget *parent)
: QTabWidget (parent)
{
mp_list_tool_button = new QToolButton (this);
mp_list_tool_button->setAutoRaise (true);
///\TODO: Replace placeholder with real icon.
mp_list_tool_button->setIcon (QIcon (QString::fromUtf8 (":/find_16px.png")));
mp_list_tool_button->setIconSize (QSize (20, 20));
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);
connect (mp_list_tool_button->menu (), &QMenu::aboutToShow,
this, &EnhancedTabWidget::list_tool_button_menu_about_to_show);
mp_list_action_group = new QActionGroup (this);
mp_list_action_group->setExclusive (true);
connect (mp_list_action_group, &QActionGroup::triggered,
this, &EnhancedTabWidget::list_action_group_triggered);
}
EnhancedTabWidget::~EnhancedTabWidget () = default;
void EnhancedTabWidget::tabInserted (int index)
{
QTabWidget::tabInserted (index);
update_list_button_visibility ();
}
void EnhancedTabWidget::tabRemoved (int index)
{
QTabWidget::tabRemoved (index);
update_list_button_visibility ();
}
void EnhancedTabWidget::list_action_group_triggered (QAction *action)
{
setCurrentIndex (action->data ().toInt ());
}
void EnhancedTabWidget::list_tool_button_menu_about_to_show ()
{
mp_list_tool_button->menu ()->clear ();
if (count () > 1) {
for (int i = 0; i < count (); ++i) {
QAction *action = mp_list_tool_button->menu ()->addAction (tabText (i));
action->setCheckable (true);
action->setData (QVariant (i));
mp_list_action_group->addAction (action);
}
mp_list_action_group->actions ().at (currentIndex ())->setChecked (true);
}
}
void EnhancedTabWidget::update_list_button_visibility()
{
if (cornerWidget (Qt::TopRightCorner) != nullptr) {
cornerWidget (Qt::TopRightCorner)->setVisible (count () > 1);
}
}
}

View File

@ -0,0 +1,62 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2022 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef HDR_layEnhancedTabWidget
#define HDR_layEnhancedTabWidget
#include <QTabWidget>
class QActionGroup;
class QToolButton;
namespace lay
{
class EnhancedTabWidget
: public QTabWidget
{
Q_OBJECT
public:
EnhancedTabWidget (QWidget *parent);
~EnhancedTabWidget () override;
protected:
void tabInserted (int index) override;
void tabRemoved (int index) override;
private slots:
void list_action_group_triggered (QAction* action);
void list_tool_button_menu_about_to_show ();
private:
QActionGroup *mp_list_action_group;
QToolButton *mp_list_tool_button;
void update_list_button_visibility ();
};
}
#endif

View File

@ -70,6 +70,7 @@
#include "layDialogs.h"
#include "laybasicConfig.h"
#include "layConfig.h"
#include "layEnhancedTabWidget.h"
#include "layMainWindow.h"
#include "layHelpDialog.h"
#include "layNavigator.h"
@ -227,12 +228,12 @@ MainWindow::MainWindow (QApplication *app, const char *name, bool undo_enabled)
vbl->setContentsMargins (0, 0, 0, 0);
vbl->setSpacing (0);
mp_tab_bar = new QTabBar (mp_main_frame);
vbl->addWidget (mp_tab_bar);
connect (mp_tab_bar, SIGNAL (currentChanged (int)), this, SLOT (view_selected (int)));
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)));
#if QT_VERSION >= 0x040500
mp_tab_bar->setTabsClosable(true);
connect (mp_tab_bar, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
mp_tab_widget->setTabsClosable(true);
connect (mp_tab_widget, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
#endif
mp_hp_dock_widget = new QDockWidget (QObject::tr ("Cells"), this);
@ -682,8 +683,8 @@ MainWindow::close_all ()
// Clear the tab bar
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
while (mp_tab_bar->count () > 0) {
mp_tab_bar->removeTab (mp_tab_bar->count () - 1);
while (mp_tab_widget->count () > 0) {
mp_tab_widget->removeTab (mp_tab_widget->count () - 1);
}
m_disable_tab_selected = f;
@ -2314,7 +2315,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_bar->setFocus ();
mp_tab_widget->setFocus ();
if (! m_disable_tab_selected) {
select_view (index);
@ -2335,7 +2336,7 @@ MainWindow::select_view (int index)
tl_assert (index >= 0 && index < int (views ()));
mp_tab_bar->setCurrentIndex (index);
mp_tab_widget->setCurrentIndex (index);
bool box_set = (m_synchronized_views && current_view () != 0);
db::DBox box;
@ -2564,7 +2565,7 @@ MainWindow::clone_current_view ()
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
int index = mp_tab_bar->insertTab (-1, tl::to_qstring (view->title ()));
int index = mp_tab_widget->insertTab (-1, mp_views.back (), tl::to_qstring (view->title ()));
m_disable_tab_selected = f;
view_created_event (index);
@ -2805,7 +2806,7 @@ MainWindow::close_view (int index)
box = view (index)->viewport ().box ();
}
mp_tab_bar->removeTab (index);
mp_tab_widget->removeTab (index);
mp_view_stack->remove_widget (index);
mp_lp_stack->remove_widget (index);
mp_layer_toolbox_stack->remove_widget (index);
@ -3381,7 +3382,7 @@ MainWindow::create_view ()
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
int index = mp_tab_bar->insertTab (-1, tl::to_qstring (current_view ()->title ()));
int index = mp_tab_widget->insertTab (-1, mp_views.back (), tl::to_qstring (current_view ()->title ()));
m_disable_tab_selected = f;
view_created_event (index);
@ -3444,7 +3445,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_bar->insertTab (-1, QString ());
int index = mp_tab_widget->insertTab (-1, mp_views.back (), QString ());
update_tab_title (index);
m_disable_tab_selected = f;
view_created_event (index);
@ -3484,8 +3485,8 @@ MainWindow::update_tab_title (int i)
title += v->title ();
}
if (tl::to_string (mp_tab_bar->tabText (i)) != title) {
mp_tab_bar->setTabText (i, tl::to_qstring (title));
if (tl::to_string (mp_tab_widget->tabText (i)) != title) {
mp_tab_widget->setTabText (i, tl::to_qstring (title));
}
if (v) {
@ -3500,8 +3501,8 @@ MainWindow::update_tab_title (int i)
files += tl::to_string (tr ("(not saved)"));
}
}
if (tl::to_string (mp_tab_bar->tabToolTip (i)) != files) {
mp_tab_bar->setTabToolTip (i, tl::to_qstring (files));
if (tl::to_string (mp_tab_widget->tabToolTip (i)) != files) {
mp_tab_widget->setTabToolTip (i, tl::to_qstring (files));
}
}
}

View File

@ -51,7 +51,7 @@
#include "tlDeferredExecution.h"
#include "gsi.h"
class QTabBar;
class QTabWidget;
class QToolBar;
class QLabel;
class QAction;
@ -682,7 +682,7 @@ private:
TextProgressDelegate m_text_progress;
// Main menu
QTabBar *mp_tab_bar;
QTabWidget *mp_tab_widget;
QToolBar *mp_tool_bar;
QDockWidget *mp_navigator_dock_widget;
lay::Navigator *mp_navigator;