m_widgets;
- QWidget *mp_current_widget;
- QLabel *mp_bglabel;
-};
-
-// -------------------------------------------------------------
-
-class ViewWidgetStack
- : public QWidget
-{
-public:
- ViewWidgetStack (QWidget *parent = 0, const char *name = 0)
- : QWidget (parent)
- {
- setObjectName (QString::fromUtf8 (name));
-
- mp_bglabel = new QLabel (this);
- mp_bglabel->setAutoFillBackground (true);
- mp_bglabel->setText (QObject::tr ("
Use File/Open to open a layout
"));
- mp_bglabel->setAlignment (Qt::AlignVCenter | Qt::AlignHCenter);
- mp_bglabel->show ();
- }
-
- void addWidget (LayoutView *w)
- {
- m_widgets.push_back (w);
- w->setParent (this);
- resize_children ();
- raiseWidget (m_widgets.size () - 1);
-
- updateGeometry ();
- }
-
- void removeWidget (size_t index)
- {
- if (index < m_widgets.size ()) {
- m_widgets.erase (m_widgets.begin () + index);
- }
- if (m_widgets.size () == 0) {
- mp_bglabel->show ();
- }
- }
-
- void raiseWidget (size_t index)
- {
- if (index < m_widgets.size ()) {
- mp_bglabel->hide ();
- m_widgets [index]->show ();
- } else {
- mp_bglabel->show ();
- }
-
- size_t i = 0;
- for (std::vector ::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child, ++i) {
- if (i != index) {
- (*child)->hide ();
- }
- }
- }
-
- LayoutView *widget (size_t index)
- {
- if (index < m_widgets.size ()) {
- return m_widgets [index];
- } else {
- return 0;
- }
- }
-
- QWidget *background_widget ()
- {
- return mp_bglabel;
- }
-
-protected:
- virtual void resizeEvent (QResizeEvent *)
- {
- resize_children ();
- }
-
- void resize_children ()
- {
- // set the geometry of all children
- for (std::vector ::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child) {
- (*child)->setGeometry (0, 0, width (), height ());
- }
- mp_bglabel->setGeometry (0, 0, width (), height ());
- }
-
- std::vector m_widgets;
- QLabel *mp_bglabel;
-};
-
-// -------------------------------------------------------------
-
-TextProgressDelegate::TextProgressDelegate (MainWindow *mw, int verbosity)
- : lay::TextProgress (verbosity), mp_mw (mw)
-{
- // .. nothing yet ..
-}
-
-void TextProgressDelegate::update_progress (tl::Progress *progress)
-{
- if (!mp_mw->update_progress (progress)) {
- lay::TextProgress::update_progress (progress);
- }
-}
-
-void TextProgressDelegate::show_progress_bar (bool show)
-{
- if (!mp_mw->show_progress_bar (show)) {
- lay::TextProgress::show_progress_bar (show);
- }
-}
-
-bool TextProgressDelegate::progress_wants_widget () const
-{
- return mp_mw != 0 && mp_mw->progress_wants_widget ();
-}
-
-void TextProgressDelegate::progress_add_widget (QWidget *widget)
-{
- if (mp_mw) {
- mp_mw->progress_add_widget (widget);
- }
-}
-
-QWidget *TextProgressDelegate::progress_get_widget () const
-{
- return mp_mw ? mp_mw->progress_get_widget () : 0;
-}
-
-void TextProgressDelegate::progress_remove_widget ()
-{
- if (mp_mw) {
- mp_mw->progress_remove_widget ();
- }
-}
-
-// -------------------------------------------------------------
-
static MainWindow *mw_instance = 0;
MainWindow *
@@ -1004,12 +678,12 @@ MainWindow::close_all ()
lay::LayoutView *view = mp_views.back ();
mp_views.pop_back ();
- mp_lp_stack->removeWidget (mp_views.size ());
- mp_hp_stack->removeWidget (mp_views.size ());
- mp_libs_stack->removeWidget (mp_views.size ());
- mp_eo_stack->removeWidget (mp_views.size ());
- mp_bm_stack->removeWidget (mp_views.size ());
- mp_view_stack->removeWidget (mp_views.size ());
+ mp_lp_stack->remove_widget (mp_views.size ());
+ mp_hp_stack->remove_widget (mp_views.size ());
+ mp_libs_stack->remove_widget (mp_views.size ());
+ mp_eo_stack->remove_widget (mp_views.size ());
+ mp_bm_stack->remove_widget (mp_views.size ());
+ mp_view_stack->remove_widget (mp_views.size ());
delete view;
@@ -2698,12 +2372,12 @@ MainWindow::select_view (int index)
current_view ()->zoom_box (box);
}
- mp_view_stack->raiseWidget (index);
- mp_hp_stack->raiseWidget (index);
- mp_lp_stack->raiseWidget (index);
- mp_libs_stack->raiseWidget (index);
- mp_eo_stack->raiseWidget (index);
- mp_bm_stack->raiseWidget (index);
+ mp_view_stack->raise_widget (index);
+ mp_hp_stack->raise_widget (index);
+ mp_lp_stack->raise_widget (index);
+ mp_libs_stack->raise_widget (index);
+ mp_eo_stack->raise_widget (index);
+ mp_bm_stack->raise_widget (index);
mp_setup_form->setup ();
}
@@ -2890,12 +2564,12 @@ MainWindow::clone_current_view ()
mp_layer_toolbox->set_view (current_view ());
- mp_view_stack->addWidget (view);
- mp_lp_stack->addWidget (view->layer_control_frame ());
- mp_hp_stack->addWidget (view->hierarchy_control_frame ());
- mp_libs_stack->addWidget (view->libraries_frame ());
- mp_eo_stack->addWidget (view->editor_options_frame ());
- mp_bm_stack->addWidget (view->bookmarks_frame ());
+ mp_view_stack->add_widget (view);
+ mp_lp_stack->add_widget (view->layer_control_frame ());
+ mp_hp_stack->add_widget (view->hierarchy_control_frame ());
+ mp_libs_stack->add_widget (view->libraries_frame ());
+ mp_eo_stack->add_widget (view->editor_options_frame ());
+ mp_bm_stack->add_widget (view->bookmarks_frame ());
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
@@ -3141,12 +2815,12 @@ MainWindow::close_view (int index)
}
mp_tab_bar->removeTab (index);
- mp_view_stack->removeWidget (index);
- mp_lp_stack->removeWidget (index);
- mp_hp_stack->removeWidget (index);
- mp_libs_stack->removeWidget (index);
- mp_eo_stack->removeWidget (index);
- mp_bm_stack->removeWidget (index);
+ mp_view_stack->remove_widget (index);
+ mp_lp_stack->remove_widget (index);
+ mp_hp_stack->remove_widget (index);
+ mp_libs_stack->remove_widget (index);
+ mp_eo_stack->remove_widget (index);
+ mp_bm_stack->remove_widget (index);
view_closed_event (int (index));
@@ -3684,12 +3358,12 @@ MainWindow::create_view ()
mp_layer_toolbox->set_view (current_view ());
- mp_view_stack->addWidget (mp_views.back ());
- mp_lp_stack->addWidget (mp_views.back ()->layer_control_frame ());
- mp_hp_stack->addWidget (mp_views.back ()->hierarchy_control_frame ());
- mp_libs_stack->addWidget (mp_views.back ()->libraries_frame ());
- mp_eo_stack->addWidget (mp_views.back ()->editor_options_frame ());
- mp_bm_stack->addWidget (mp_views.back ()->bookmarks_frame ());
+ mp_view_stack->add_widget (mp_views.back ());
+ mp_lp_stack->add_widget (mp_views.back ()->layer_control_frame ());
+ mp_hp_stack->add_widget (mp_views.back ()->hierarchy_control_frame ());
+ mp_libs_stack->add_widget (mp_views.back ()->libraries_frame ());
+ mp_eo_stack->add_widget (mp_views.back ()->editor_options_frame ());
+ mp_bm_stack->add_widget (mp_views.back ()->bookmarks_frame ());
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
@@ -3748,12 +3422,12 @@ MainWindow::create_or_load_layout (const std::string *filename, const db::LoadLa
mp_layer_toolbox->set_view (current_view ());
- mp_view_stack->addWidget (mp_views.back ());
- mp_lp_stack->addWidget (mp_views.back ()->layer_control_frame ());
- mp_hp_stack->addWidget (mp_views.back ()->hierarchy_control_frame ());
- mp_libs_stack->addWidget (mp_views.back ()->libraries_frame ());
- mp_eo_stack->addWidget (mp_views.back ()->editor_options_frame ());
- mp_bm_stack->addWidget (mp_views.back ()->bookmarks_frame ());
+ mp_view_stack->add_widget (mp_views.back ());
+ mp_lp_stack->add_widget (mp_views.back ()->layer_control_frame ());
+ mp_hp_stack->add_widget (mp_views.back ()->hierarchy_control_frame ());
+ mp_libs_stack->add_widget (mp_views.back ()->libraries_frame ());
+ mp_eo_stack->add_widget (mp_views.back ()->editor_options_frame ());
+ mp_bm_stack->add_widget (mp_views.back ()->bookmarks_frame ());
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
@@ -4475,108 +4149,6 @@ MainWindow::plugin_removed (lay::PluginDeclaration *cls)
}
}
-// ------------------------------------------------------------
-// Implementation of the "help about" dialog
-
-HelpAboutDialog::HelpAboutDialog (QWidget *parent)
- : QDialog (parent)
-{
- mp_ui = new Ui::HelpAboutDialog ();
- mp_ui->setupUi (this);
-
- std::vector build_options;
- if (lay::ApplicationBase::instance ()->ruby_interpreter ().available ()) {
- build_options.push_back (tl::to_string (tr ("Ruby interpreter ")) + lay::ApplicationBase::instance ()->ruby_interpreter ().version ());
- }
- if (lay::ApplicationBase::instance ()->python_interpreter ().available ()) {
- build_options.push_back (tl::to_string (tr ("Python interpreter ")) + lay::ApplicationBase::instance ()->python_interpreter ().version ());
- }
-#if defined(HAVE_QTBINDINGS)
- build_options.push_back (tl::to_string (tr ("Qt bindings for scripts")));
-#endif
-#if defined(HAVE_64BIT_COORD)
- build_options.push_back (tl::to_string (tr ("Wide coordinates (64 bit)")));
-#endif
-
- std::string s;
-
- s = "";
-
- s += "";
- s += escape_xml (std::string (lay::Version::name ()) + " " + lay::Version::version ());
- s += "
";
-
- std::vector about_paras = tl::split (lay::Version::about_text (), "\n\n");
- for (std::vector::const_iterator p = about_paras.begin (); p != about_paras.end (); ++p) {
- s += std::string ("") + escape_xml (*p) + "
";
- }
-
- if (! build_options.empty ()) {
- s += "";
- s += "
";
- s += escape_xml (tl::to_string (QObject::tr ("Build options:")));
- s += "
";
- for (std::vector::const_iterator bo = build_options.begin (); bo != build_options.end (); ++bo) {
- s += "- ";
- s += escape_xml (*bo);
- s += "
";
- }
- s += "
";
- }
-
- if (! lay::plugins ().empty () || ! db::plugins ().empty ()) {
-
- s += "";
- s += "
";
- s += escape_xml (tl::to_string (QObject::tr ("Binary extensions:")));
- s += "
";
-
- for (std::list::const_iterator pd = lay::plugins ().begin (); pd != lay::plugins ().end (); ++pd) {
- s += "- ";
- if (! pd->description.empty ()) {
- s += escape_xml (pd->description);
- } else {
- s += escape_xml (pd->path);
- }
- if (! pd->version.empty ()) {
- s += " (" + escape_xml (pd->version) + ")";
- }
- s += "
";
- }
-
- for (std::list::const_iterator pd = db::plugins ().begin (); pd != db::plugins ().end (); ++pd) {
- s += "- ";
- if (! pd->description.empty ()) {
- s += escape_xml (pd->description);
- } else {
- s += escape_xml (pd->path);
- }
- if (! pd->version.empty ()) {
- s += " (" + escape_xml (pd->version) + ")";
- }
- s += "
";
- }
-
- s += "
";
-
- }
-
- s += "";
-
- std::string t = tl::to_string (QObject::tr ("About ")) + lay::Version::name ();
-
- setWindowTitle (tl::to_qstring (t));
-
- mp_ui->main->setWordWrap (true);
- mp_ui->main->setText (tl::to_qstring (s));
-}
-
-HelpAboutDialog::~HelpAboutDialog ()
-{
- delete mp_ui;
- mp_ui = 0;
-}
-
// ------------------------------------------------------------
// Declaration of the "plugin" for the menu entries
diff --git a/src/lay/lay/layMainWindow.h b/src/lay/lay/layMainWindow.h
index 5ef8ccddf..b8c8b9b97 100644
--- a/src/lay/lay/layMainWindow.h
+++ b/src/lay/lay/layMainWindow.h
@@ -20,8 +20,6 @@
*/
-
-
#ifndef HDR_layMainWindow
#define HDR_layMainWindow
@@ -46,6 +44,7 @@
#include "layProgress.h"
#include "layTextProgress.h"
#include "layTechnology.h"
+#include "layTextProgressDelegate.h"
#include "tlException.h"
#include "tlDeferredExecution.h"
#include "tlObjectCollection.h"
@@ -61,10 +60,6 @@ class QStackedWidget;
class QDockWidget;
class QAction;
-namespace Ui {
- class HelpAboutDialog;
-}
-
namespace lay {
class SettingsForm;
@@ -84,38 +79,19 @@ class Navigator;
class LayerToolbox;
class MainWindow;
class HelpDialog;
+class HelpAboutDialog;
+class ControlWidgetStack;
+class ViewWidgetStack;
+class ProgressWidget;
/**
- * @brief A dialog for showing the "help about" dialog
+ * @brief A big main window class
+ *
+ * The main window is the core UI feature of the application.
+ * The main window is view container, basic controller, configuration root
+ * and holder of many resources.
+ * The main window is a singleton.
*/
-class LAY_PUBLIC HelpAboutDialog
- : public QDialog
-{
-public:
- HelpAboutDialog (QWidget *parent);
- ~HelpAboutDialog ();
-
-private:
- Ui::HelpAboutDialog *mp_ui;
-};
-
-class TextProgressDelegate
- : public lay::TextProgress
-{
-public:
- TextProgressDelegate (MainWindow *mw, int verbosity);
-
- virtual void update_progress (tl::Progress *progress);
- virtual void show_progress_bar (bool show);
- virtual bool progress_wants_widget () const;
- virtual void progress_add_widget (QWidget *widget);
- virtual QWidget *progress_get_widget () const;
- virtual void progress_remove_widget ();
-
-private:
- MainWindow *mp_mw;
-};
-
class LAY_PUBLIC MainWindow
: public QMainWindow,
public lay::Dispatcher
diff --git a/src/lay/lay/layProgressDialog.cc b/src/lay/lay/layProgressDialog.cc
new file mode 100644
index 000000000..5d74fed4f
--- /dev/null
+++ b/src/lay/lay/layProgressDialog.cc
@@ -0,0 +1,75 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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 "layProgressDialog.h"
+#include "layProgressWidget.h"
+
+#include
+
+namespace lay
+{
+
+ProgressDialog::ProgressDialog (QWidget *parent, ProgressReporter *pr)
+ : QDialog (parent), mp_pr (pr)
+{
+ QVBoxLayout *vbl = new QVBoxLayout (this);
+ vbl->setMargin (0);
+ vbl->setSpacing (0);
+
+ mp_progress_widget = new ProgressWidget (pr, this, true);
+ mp_progress_widget->setObjectName (QString::fromUtf8 ("progress"));
+ vbl->addWidget (mp_progress_widget);
+
+ setWindowTitle (QObject::tr ("Progress"));
+ setWindowModality (Qt::WindowModal);
+}
+
+void ProgressDialog::closeEvent (QCloseEvent *)
+{
+ if (mp_pr) {
+ // NOTE: We don't kill on close for now. This creates a too easy way to scrap results.
+ // mp_pr->signal_break ();
+ // TODO: there should be a warning saying some jobs are pending.
+ }
+}
+
+void ProgressDialog::set_progress (tl::Progress *progress)
+{
+ mp_progress_widget->set_progress (progress);
+}
+
+void ProgressDialog::add_widget (QWidget *widget)
+{
+ mp_progress_widget->add_widget (widget);
+}
+
+void ProgressDialog::remove_widget ()
+{
+ mp_progress_widget->remove_widget ();
+}
+
+QWidget *ProgressDialog::get_widget () const
+{
+ return mp_progress_widget->get_widget ();
+}
+
+}
diff --git a/src/lay/lay/layProgressDialog.h b/src/lay/lay/layProgressDialog.h
new file mode 100644
index 000000000..f1036fd2d
--- /dev/null
+++ b/src/lay/lay/layProgressDialog.h
@@ -0,0 +1,61 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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_layProgressDialog
+#define HDR_layProgressDialog
+
+#include "layCommon.h"
+
+#include "tlObject.h"
+#include "tlProgress.h"
+
+#include
+
+namespace lay
+{
+
+class ProgressReporter;
+class ProgressWidget;
+
+class ProgressDialog
+ : public QDialog,
+ public tl::Object
+{
+public:
+ ProgressDialog (QWidget *parent, lay::ProgressReporter *pr);
+
+ void closeEvent (QCloseEvent * /*event*/);
+
+ void set_progress (tl::Progress *progress);
+ void add_widget (QWidget *widget);
+ void remove_widget ();
+ QWidget *get_widget () const;
+
+private:
+ lay::ProgressWidget *mp_progress_widget;
+ lay::ProgressReporter *mp_pr;
+};
+
+}
+
+#endif
diff --git a/src/lay/lay/layTextProgressDelegate.cc b/src/lay/lay/layTextProgressDelegate.cc
new file mode 100644
index 000000000..d0dd0db2f
--- /dev/null
+++ b/src/lay/lay/layTextProgressDelegate.cc
@@ -0,0 +1,73 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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 "layTextProgressDelegate.h"
+#include "layMainWindow.h"
+
+namespace lay
+{
+
+TextProgressDelegate::TextProgressDelegate (MainWindow *mw, int verbosity)
+ : lay::TextProgress (verbosity), mp_mw (mw)
+{
+ // .. nothing yet ..
+}
+
+void TextProgressDelegate::update_progress (tl::Progress *progress)
+{
+ if (!mp_mw->update_progress (progress)) {
+ lay::TextProgress::update_progress (progress);
+ }
+}
+
+void TextProgressDelegate::show_progress_bar (bool show)
+{
+ if (!mp_mw->show_progress_bar (show)) {
+ lay::TextProgress::show_progress_bar (show);
+ }
+}
+
+bool TextProgressDelegate::progress_wants_widget () const
+{
+ return mp_mw != 0 && mp_mw->progress_wants_widget ();
+}
+
+void TextProgressDelegate::progress_add_widget (QWidget *widget)
+{
+ if (mp_mw) {
+ mp_mw->progress_add_widget (widget);
+ }
+}
+
+QWidget *TextProgressDelegate::progress_get_widget () const
+{
+ return mp_mw ? mp_mw->progress_get_widget () : 0;
+}
+
+void TextProgressDelegate::progress_remove_widget ()
+{
+ if (mp_mw) {
+ mp_mw->progress_remove_widget ();
+ }
+}
+
+}
diff --git a/src/lay/lay/layTextProgressDelegate.h b/src/lay/lay/layTextProgressDelegate.h
new file mode 100644
index 000000000..d45128861
--- /dev/null
+++ b/src/lay/lay/layTextProgressDelegate.h
@@ -0,0 +1,55 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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_layTextProgressDelegate
+#define HDR_layTextProgressDelegate
+
+#include "layCommon.h"
+
+#include "layTextProgress.h"
+
+namespace lay
+{
+
+class MainWindow;
+
+class TextProgressDelegate
+ : public lay::TextProgress
+{
+public:
+ TextProgressDelegate (MainWindow *mw, int verbosity);
+
+ virtual void update_progress (tl::Progress *progress);
+ virtual void show_progress_bar (bool show);
+ virtual bool progress_wants_widget () const;
+ virtual void progress_add_widget (QWidget *widget);
+ virtual QWidget *progress_get_widget () const;
+ virtual void progress_remove_widget ();
+
+private:
+ MainWindow *mp_mw;
+};
+
+}
+
+#endif
diff --git a/src/lay/lay/layViewWidgetStack.cc b/src/lay/lay/layViewWidgetStack.cc
new file mode 100644
index 000000000..7d7b51f81
--- /dev/null
+++ b/src/lay/lay/layViewWidgetStack.cc
@@ -0,0 +1,103 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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 "layViewWidgetStack.h"
+#include "layLayoutView.h"
+
+#include
+
+namespace lay
+{
+
+ViewWidgetStack::ViewWidgetStack (QWidget *parent, const char *name)
+ : QWidget (parent)
+{
+ setObjectName (QString::fromUtf8 (name));
+
+ mp_bglabel = new QLabel (this);
+ mp_bglabel->setAutoFillBackground (true);
+ mp_bglabel->setText (QObject::tr ("
Use File/Open to open a layout
"));
+ mp_bglabel->setAlignment (Qt::AlignVCenter | Qt::AlignHCenter);
+ mp_bglabel->show ();
+}
+
+void ViewWidgetStack::add_widget (LayoutView *w)
+{
+ m_widgets.push_back (w);
+ w->setParent (this);
+ resize_children ();
+ raise_widget (m_widgets.size () - 1);
+
+ updateGeometry ();
+}
+
+void ViewWidgetStack::remove_widget (size_t index)
+{
+ if (index < m_widgets.size ()) {
+ m_widgets.erase (m_widgets.begin () + index);
+ }
+ if (m_widgets.size () == 0) {
+ mp_bglabel->show ();
+ }
+}
+
+void ViewWidgetStack::raise_widget (size_t index)
+{
+ if (index < m_widgets.size ()) {
+ mp_bglabel->hide ();
+ m_widgets [index]->show ();
+ } else {
+ mp_bglabel->show ();
+ }
+
+ size_t i = 0;
+ for (std::vector ::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child, ++i) {
+ if (i != index) {
+ (*child)->hide ();
+ }
+ }
+}
+
+LayoutView *ViewWidgetStack::widget (size_t index)
+{
+ if (index < m_widgets.size ()) {
+ return m_widgets [index];
+ } else {
+ return 0;
+ }
+}
+
+QWidget *ViewWidgetStack::background_widget ()
+{
+ return mp_bglabel;
+}
+
+void ViewWidgetStack::resize_children ()
+{
+ // set the geometry of all children
+ for (std::vector ::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child) {
+ (*child)->setGeometry (0, 0, width (), height ());
+ }
+ mp_bglabel->setGeometry (0, 0, width (), height ());
+}
+
+}
diff --git a/src/lay/lay/layViewWidgetStack.h b/src/lay/lay/layViewWidgetStack.h
new file mode 100644
index 000000000..c4e7b1c1e
--- /dev/null
+++ b/src/lay/lay/layViewWidgetStack.h
@@ -0,0 +1,64 @@
+
+/*
+
+ KLayout Layout Viewer
+ Copyright (C) 2006-2020 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_layViewWidgetStack
+#define HDR_layViewWidgetStack
+
+#include "layCommon.h"
+
+#include
+
+class QLabel;
+
+namespace lay
+{
+
+class LayoutView;
+
+class ViewWidgetStack
+ : public QWidget
+{
+public:
+ ViewWidgetStack (QWidget *parent = 0, const char *name = 0);
+
+ void add_widget (LayoutView *w);
+ void remove_widget (size_t index);
+ void raise_widget (size_t index);
+ LayoutView *widget (size_t index);
+ QWidget *background_widget ();
+
+protected:
+ virtual void resizeEvent (QResizeEvent *)
+ {
+ resize_children ();
+ }
+
+ void resize_children ();
+
+ std::vector m_widgets;
+ QLabel *mp_bglabel;
+};
+
+}
+
+#endif