mirror of https://github.com/KLayout/klayout.git
Merge branch 'master' into selection-list
This commit is contained in:
commit
bc06b688ca
|
|
@ -845,7 +845,8 @@ Layout::delete_cells (const std::set<cell_index_type> &cells_to_delete)
|
||||||
if (manager () && manager ()->transacting ()) {
|
if (manager () && manager ()->transacting ()) {
|
||||||
|
|
||||||
// note the "take" method - this takes out the cell
|
// note the "take" method - this takes out the cell
|
||||||
manager ()->queue (this, new NewRemoveCellOp (*c, cell_name (*c), true /*remove*/, take_cell (*c)));
|
std::string cn (cell_name (*c));
|
||||||
|
manager ()->queue (this, new NewRemoveCellOp (*c, cn, true /*remove*/, take_cell (*c)));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
@ -913,7 +914,8 @@ Layout::delete_cell (cell_index_type id)
|
||||||
if (manager () && manager ()->transacting ()) {
|
if (manager () && manager ()->transacting ()) {
|
||||||
|
|
||||||
// not the "take" method - this takes out the cell
|
// not the "take" method - this takes out the cell
|
||||||
manager ()->queue (this, new NewRemoveCellOp (id, cell_name (id), true /*remove*/, take_cell (id)));
|
std::string cn (cell_name (id));
|
||||||
|
manager ()->queue (this, new NewRemoveCellOp (id, cn, true /*remove*/, take_cell (id)));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ HEADERS = \
|
||||||
layClipDialog.h \
|
layClipDialog.h \
|
||||||
layControlWidgetStack.h \
|
layControlWidgetStack.h \
|
||||||
layCrashMessage.h \
|
layCrashMessage.h \
|
||||||
|
layEnhancedTabWidget.h \
|
||||||
layFillDialog.h \
|
layFillDialog.h \
|
||||||
layGSIHelpProvider.h \
|
layGSIHelpProvider.h \
|
||||||
layHelpAboutDialog.h \
|
layHelpAboutDialog.h \
|
||||||
|
|
@ -121,6 +122,7 @@ SOURCES = \
|
||||||
layClipDialog.cc \
|
layClipDialog.cc \
|
||||||
layControlWidgetStack.cc \
|
layControlWidgetStack.cc \
|
||||||
layCrashMessage.cc \
|
layCrashMessage.cc \
|
||||||
|
layEnhancedTabWidget.cc \
|
||||||
layFillDialog.cc \
|
layFillDialog.cc \
|
||||||
layGSIHelpProvider.cc \
|
layGSIHelpProvider.cc \
|
||||||
layHelpAboutDialog.cc \
|
layHelpAboutDialog.cc \
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
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);
|
||||||
|
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 (), SIGNAL (aboutToShow()),
|
||||||
|
this, SLOT (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, SIGNAL (triggered(QAction *)),
|
||||||
|
this, SLOT (list_action_group_triggered(QAction *)));
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -70,6 +70,7 @@
|
||||||
#include "layDialogs.h"
|
#include "layDialogs.h"
|
||||||
#include "laybasicConfig.h"
|
#include "laybasicConfig.h"
|
||||||
#include "layConfig.h"
|
#include "layConfig.h"
|
||||||
|
#include "layEnhancedTabWidget.h"
|
||||||
#include "layMainWindow.h"
|
#include "layMainWindow.h"
|
||||||
#include "layHelpDialog.h"
|
#include "layHelpDialog.h"
|
||||||
#include "layNavigator.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->setContentsMargins (0, 0, 0, 0);
|
||||||
vbl->setSpacing (0);
|
vbl->setSpacing (0);
|
||||||
|
|
||||||
mp_tab_bar = new QTabBar (mp_main_frame);
|
mp_tab_widget = new EnhancedTabWidget (mp_main_frame);
|
||||||
vbl->addWidget (mp_tab_bar);
|
vbl->addWidget (mp_tab_widget);
|
||||||
connect (mp_tab_bar, SIGNAL (currentChanged (int)), this, SLOT (view_selected (int)));
|
connect (mp_tab_widget, SIGNAL (currentChanged (int)), this, SLOT (view_selected (int)));
|
||||||
#if QT_VERSION >= 0x040500
|
#if QT_VERSION >= 0x040500
|
||||||
mp_tab_bar->setTabsClosable(true);
|
mp_tab_widget->setTabsClosable(true);
|
||||||
connect (mp_tab_bar, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
|
connect (mp_tab_widget, SIGNAL (tabCloseRequested (int)), this, SLOT (tab_close_requested (int)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mp_hp_dock_widget = new QDockWidget (QObject::tr ("Cells"), this);
|
mp_hp_dock_widget = new QDockWidget (QObject::tr ("Cells"), this);
|
||||||
|
|
@ -682,8 +683,8 @@ MainWindow::close_all ()
|
||||||
// Clear the tab bar
|
// Clear the tab bar
|
||||||
bool f = m_disable_tab_selected;
|
bool f = m_disable_tab_selected;
|
||||||
m_disable_tab_selected = true;
|
m_disable_tab_selected = true;
|
||||||
while (mp_tab_bar->count () > 0) {
|
while (mp_tab_widget->count () > 0) {
|
||||||
mp_tab_bar->removeTab (mp_tab_bar->count () - 1);
|
mp_tab_widget->removeTab (mp_tab_widget->count () - 1);
|
||||||
}
|
}
|
||||||
m_disable_tab_selected = f;
|
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.
|
// 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
|
// Sometimes, the focus was set to the hierarchy level spin buttons which caught Copy&Paste
|
||||||
// events in effect.
|
// events in effect.
|
||||||
mp_tab_bar->setFocus ();
|
mp_tab_widget->setFocus ();
|
||||||
|
|
||||||
if (! m_disable_tab_selected) {
|
if (! m_disable_tab_selected) {
|
||||||
select_view (index);
|
select_view (index);
|
||||||
|
|
@ -2335,7 +2336,7 @@ MainWindow::select_view (int index)
|
||||||
|
|
||||||
tl_assert (index >= 0 && index < int (views ()));
|
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);
|
bool box_set = (m_synchronized_views && current_view () != 0);
|
||||||
db::DBox box;
|
db::DBox box;
|
||||||
|
|
@ -2564,7 +2565,7 @@ MainWindow::clone_current_view ()
|
||||||
|
|
||||||
bool f = m_disable_tab_selected;
|
bool f = m_disable_tab_selected;
|
||||||
m_disable_tab_selected = true;
|
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;
|
m_disable_tab_selected = f;
|
||||||
|
|
||||||
view_created_event (index);
|
view_created_event (index);
|
||||||
|
|
@ -2805,7 +2806,7 @@ MainWindow::close_view (int index)
|
||||||
box = view (index)->viewport ().box ();
|
box = view (index)->viewport ().box ();
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_tab_bar->removeTab (index);
|
mp_tab_widget->removeTab (index);
|
||||||
mp_view_stack->remove_widget (index);
|
mp_view_stack->remove_widget (index);
|
||||||
mp_lp_stack->remove_widget (index);
|
mp_lp_stack->remove_widget (index);
|
||||||
mp_layer_toolbox_stack->remove_widget (index);
|
mp_layer_toolbox_stack->remove_widget (index);
|
||||||
|
|
@ -3381,7 +3382,7 @@ MainWindow::create_view ()
|
||||||
|
|
||||||
bool f = m_disable_tab_selected;
|
bool f = m_disable_tab_selected;
|
||||||
m_disable_tab_selected = true;
|
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;
|
m_disable_tab_selected = f;
|
||||||
|
|
||||||
view_created_event (index);
|
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;
|
bool f = m_disable_tab_selected;
|
||||||
m_disable_tab_selected = true;
|
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);
|
update_tab_title (index);
|
||||||
m_disable_tab_selected = f;
|
m_disable_tab_selected = f;
|
||||||
view_created_event (index);
|
view_created_event (index);
|
||||||
|
|
@ -3484,8 +3485,8 @@ MainWindow::update_tab_title (int i)
|
||||||
title += v->title ();
|
title += v->title ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tl::to_string (mp_tab_bar->tabText (i)) != title) {
|
if (tl::to_string (mp_tab_widget->tabText (i)) != title) {
|
||||||
mp_tab_bar->setTabText (i, tl::to_qstring (title));
|
mp_tab_widget->setTabText (i, tl::to_qstring (title));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v) {
|
if (v) {
|
||||||
|
|
@ -3500,8 +3501,8 @@ MainWindow::update_tab_title (int i)
|
||||||
files += tl::to_string (tr ("(not saved)"));
|
files += tl::to_string (tr ("(not saved)"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tl::to_string (mp_tab_bar->tabToolTip (i)) != files) {
|
if (tl::to_string (mp_tab_widget->tabToolTip (i)) != files) {
|
||||||
mp_tab_bar->setTabToolTip (i, tl::to_qstring (files));
|
mp_tab_widget->setTabToolTip (i, tl::to_qstring (files));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@
|
||||||
#include "tlDeferredExecution.h"
|
#include "tlDeferredExecution.h"
|
||||||
#include "gsi.h"
|
#include "gsi.h"
|
||||||
|
|
||||||
class QTabBar;
|
class QTabWidget;
|
||||||
class QToolBar;
|
class QToolBar;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class QAction;
|
class QAction;
|
||||||
|
|
@ -682,7 +682,7 @@ private:
|
||||||
TextProgressDelegate m_text_progress;
|
TextProgressDelegate m_text_progress;
|
||||||
|
|
||||||
// Main menu
|
// Main menu
|
||||||
QTabBar *mp_tab_bar;
|
QTabWidget *mp_tab_widget;
|
||||||
QToolBar *mp_tool_bar;
|
QToolBar *mp_tool_bar;
|
||||||
QDockWidget *mp_navigator_dock_widget;
|
QDockWidget *mp_navigator_dock_widget;
|
||||||
lay::Navigator *mp_navigator;
|
lay::Navigator *mp_navigator;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue