diff --git a/src/lay/lay/layControlWidgetStack.cc b/src/lay/lay/layControlWidgetStack.cc index 94e0680c9..671a338a7 100644 --- a/src/lay/lay/layControlWidgetStack.cc +++ b/src/lay/lay/layControlWidgetStack.cc @@ -23,12 +23,13 @@ #include "layControlWidgetStack.h" #include +#include namespace lay { -ControlWidgetStack::ControlWidgetStack(QWidget *parent, const char *name) - : QFrame (parent), mp_current_widget (0) +ControlWidgetStack::ControlWidgetStack(QWidget *parent, const char *name, bool size_follows_content) + : QFrame (parent), mp_current_widget (0), m_size_follows_content (size_follows_content) { setObjectName (QString::fromUtf8 (name)); @@ -66,10 +67,35 @@ void ControlWidgetStack::add_widget(QWidget *w) setMinimumWidth (mw); resize (minimumWidth (), height ()); } + + if (m_size_follows_content) { + updateGeometry (); + } +} + +bool ControlWidgetStack::event(QEvent *e) +{ + if (e->type () == QEvent::LayoutRequest) { + if (m_size_follows_content) { + int h = sizeHint ().height (); + setMinimumHeight (h); + setMaximumHeight (h); + updateGeometry (); + } + } + return QWidget::event (e); } QSize ControlWidgetStack::sizeHint() const { + if (m_size_follows_content) { + for (size_t i = 0; i < m_widgets.size (); ++i) { + if (m_widgets [i] && m_widgets [i]->isVisible ()) { + return m_widgets [i]->sizeHint (); + } + } + } + int w = 0; for (size_t i = 0; i < m_widgets.size (); ++i) { w = std::max (m_widgets [i]->sizeHint ().width (), w); @@ -88,6 +114,10 @@ void ControlWidgetStack::remove_widget(size_t index) if (m_widgets.size () == 0) { mp_bglabel->show (); } + + if (m_size_follows_content) { + updateGeometry (); + } } void ControlWidgetStack::raise_widget(size_t index) @@ -111,6 +141,10 @@ void ControlWidgetStack::raise_widget(size_t index) } else { mp_bglabel->hide (); } + + if (m_size_follows_content) { + updateGeometry (); + } } QWidget *ControlWidgetStack::widget(size_t index) diff --git a/src/lay/lay/layControlWidgetStack.h b/src/lay/lay/layControlWidgetStack.h index b68f42154..3d2fbcb5f 100644 --- a/src/lay/lay/layControlWidgetStack.h +++ b/src/lay/lay/layControlWidgetStack.h @@ -37,7 +37,7 @@ class ControlWidgetStack : public QFrame { public: - ControlWidgetStack (QWidget *parent = 0, const char *name = 0); + ControlWidgetStack (QWidget *parent = 0, const char *name = 0, bool size_follows_content = false); void focusInEvent (QFocusEvent *); @@ -67,9 +67,12 @@ protected: void resize_children (); + bool event (QEvent *e); + std::vector m_widgets; QWidget *mp_current_widget; QLabel *mp_bglabel; + bool m_size_follows_content; }; } diff --git a/src/lay/lay/layMainWindow.cc b/src/lay/lay/layMainWindow.cc index 924fdf29e..524fda937 100644 --- a/src/lay/lay/layMainWindow.cc +++ b/src/lay/lay/layMainWindow.cc @@ -274,9 +274,9 @@ MainWindow::MainWindow (QApplication *app, const char *name, bool undo_enabled) mp_layer_toolbox_dock_widget = new QDockWidget (QObject::tr ("Layer Toolbox"), this); mp_layer_toolbox_dock_widget->setObjectName (QString::fromUtf8 ("lt_dock_widget")); - mp_layer_toolbox = new LayerToolbox (mp_layer_toolbox_dock_widget, "layer_toolbox"); - mp_layer_toolbox_dock_widget->setWidget (mp_layer_toolbox); - mp_layer_toolbox_dock_widget->setFocusProxy (mp_layer_toolbox); + mp_layer_toolbox_stack = new ControlWidgetStack (mp_layer_toolbox_dock_widget, "layer_toolbox_stack", true); + mp_layer_toolbox_dock_widget->setWidget (mp_layer_toolbox_stack); + mp_layer_toolbox_dock_widget->setFocusProxy (mp_layer_toolbox_stack); connect (mp_layer_toolbox_dock_widget, SIGNAL (visibilityChanged (bool)), this, SLOT (dock_widget_visibility_changed (bool))); m_layer_toolbox_visible = true; @@ -667,7 +667,6 @@ void MainWindow::close_all () { cancel (); - mp_layer_toolbox->set_view (0); // try a smooth shutdown of the current view lay::LayoutView::set_current (0); @@ -697,6 +696,7 @@ MainWindow::close_all () lay::LayoutViewWidget *view = mp_views.back (); mp_views.pop_back (); + mp_layer_toolbox_stack->remove_widget (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 ()); @@ -980,63 +980,6 @@ MainWindow::configure (const std::string &name, const std::string &value) return true; - } else if (name == cfg_stipple_palette) { - - lay::StipplePalette palette = lay::StipplePalette::default_palette (); - - try { - // empty string means: default palette - if (! value.empty ()) { - palette.from_string (value); - } - } catch (...) { - // ignore errors: just reset the palette - palette = lay::StipplePalette::default_palette (); - } - - mp_layer_toolbox->set_palette (palette); - - // others need this property too .. - return false; - - } else if (name == cfg_line_style_palette) { - - lay::LineStylePalette palette = lay::LineStylePalette::default_palette (); - - try { - // empty string means: default palette - if (! value.empty ()) { - palette.from_string (value); - } - } catch (...) { - // ignore errors: just reset the palette - palette = lay::LineStylePalette::default_palette (); - } - - mp_layer_toolbox->set_palette (palette); - - // others need this property too .. - return false; - - } else if (name == cfg_color_palette) { - - lay::ColorPalette palette = lay::ColorPalette::default_palette (); - - try { - // empty string means: default palette - if (! value.empty ()) { - palette.from_string (value); - } - } catch (...) { - // ignore errors: just reset the palette - palette = lay::ColorPalette::default_palette (); - } - - mp_layer_toolbox->set_palette (palette); - - // others need this property too .. - return false; - } else if (name == cfg_mru) { tl::Extractor ex (value.c_str ()); @@ -2391,8 +2334,6 @@ MainWindow::select_view (int index) view (index)->set_current (); - mp_layer_toolbox->set_view (current_view ()); - if (current_view ()) { if (box_set) { @@ -2401,6 +2342,7 @@ MainWindow::select_view (int index) mp_view_stack->raise_widget (index); mp_hp_stack->raise_widget (index); + mp_layer_toolbox_stack->raise_widget (index); mp_lp_stack->raise_widget (index); mp_libs_stack->raise_widget (index); mp_eo_stack->raise_widget (index); @@ -2601,10 +2543,9 @@ MainWindow::clone_current_view () mp_views.back ()->view ()->set_current (); - mp_layer_toolbox->set_view (current_view ()); - mp_view_stack->add_widget (view_widget); mp_lp_stack->add_widget (view_widget->layer_control_frame ()); + mp_layer_toolbox_stack->add_widget (view_widget->layer_toolbox_frame ()); mp_hp_stack->add_widget (view_widget->hierarchy_control_frame ()); mp_libs_stack->add_widget (view_widget->libraries_frame ()); mp_eo_stack->add_widget (view_widget->editor_options_frame ()); @@ -2856,6 +2797,7 @@ MainWindow::close_view (int 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); mp_hp_stack->remove_widget (index); mp_libs_stack->remove_widget (index); mp_eo_stack->remove_widget (index); @@ -2880,7 +2822,6 @@ MainWindow::close_view (int index) // last view closed - mp_layer_toolbox->set_view (0); current_view_changed (); clear_current_pos (); @@ -3419,10 +3360,9 @@ MainWindow::create_view () // add a new tab and make the new view the current one mp_views.back ()->view ()->set_current (); - mp_layer_toolbox->set_view (current_view ()); - mp_view_stack->add_widget (mp_views.back ()); mp_lp_stack->add_widget (mp_views.back ()->layer_control_frame ()); + mp_layer_toolbox_stack->add_widget (mp_views.back ()->layer_toolbox_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 ()); @@ -3483,10 +3423,9 @@ MainWindow::create_or_load_layout (const std::string *filename, const db::LoadLa mp_views.back ()->view ()->set_current (); - mp_layer_toolbox->set_view (current_view ()); - mp_view_stack->add_widget (mp_views.back ()); mp_lp_stack->add_widget (mp_views.back ()->layer_control_frame ()); + mp_layer_toolbox_stack->add_widget (mp_views.back ()->layer_toolbox_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 ()); diff --git a/src/lay/lay/layMainWindow.h b/src/lay/lay/layMainWindow.h index c1df91385..c2a34468d 100644 --- a/src/lay/lay/layMainWindow.h +++ b/src/lay/lay/layMainWindow.h @@ -687,10 +687,9 @@ private: QDockWidget *mp_navigator_dock_widget; lay::Navigator *mp_navigator; QDockWidget *mp_hp_dock_widget, *mp_lp_dock_widget, *mp_libs_dock_widget, *mp_eo_dock_widget, *mp_bm_dock_widget; - ControlWidgetStack *mp_hp_stack, *mp_lp_stack, *mp_libs_stack, *mp_eo_stack, *mp_bm_stack; + ControlWidgetStack *mp_hp_stack, *mp_lp_stack, *mp_layer_toolbox_stack, *mp_libs_stack, *mp_eo_stack, *mp_bm_stack; bool m_hp_visible, m_lp_visible, m_libs_visible, m_eo_visible, m_bm_visible, m_navigator_visible, m_layer_toolbox_visible, m_always_exit_without_saving; QDockWidget *mp_layer_toolbox_dock_widget; - lay::LayerToolbox *mp_layer_toolbox; ViewWidgetStack *mp_view_stack; lay::FileDialog *mp_bookmarks_fdia; lay::FileDialog *mp_session_fdia; diff --git a/src/layui/layui/layLayerToolbox.cc b/src/layui/layui/layLayerToolbox.cc index ab19c19c5..bfe251c47 100644 --- a/src/layui/layui/layLayerToolbox.cc +++ b/src/layui/layui/layLayerToolbox.cc @@ -1047,6 +1047,8 @@ LayerToolbox::panel_button_clicked (int index) int h = sizeHint ().height (); setMinimumHeight (h); setMaximumHeight (h); + + updateGeometry (); } template diff --git a/src/layview/layview/gsiDeclLayLayoutView_qt.cc b/src/layview/layview/gsiDeclLayLayoutView_qt.cc index f55a8c244..a46586861 100644 --- a/src/layview/layview/gsiDeclLayLayoutView_qt.cc +++ b/src/layview/layview/gsiDeclLayLayoutView_qt.cc @@ -65,6 +65,11 @@ static QWidget *layer_control_frame (lay::LayoutViewWidget *lv) return lv->layer_control_frame (); } +static QWidget *layer_toolbox_frame (lay::LayoutViewWidget *lv) +{ + return lv->layer_toolbox_frame (); +} + static QWidget *hierarchy_control_frame (lay::LayoutViewWidget *lv) { return lv->hierarchy_control_frame (); @@ -102,6 +107,16 @@ Class decl_LayoutViewWidget (QT_EXTERNAL_BASE (QFrame) "l "\n" "This method has been introduced in version 0.27\n" ) + + gsi::method_ext ("layer_toolbox_frame", &layer_toolbox_frame, + "@brief Gets the layer toolbox side widget\n" + "A 'side widget' is a widget attached to the view. It does not have a parent, so you can " + "embed it into a different context. Please note that with embedding through 'setParent' it will be " + "destroyed when your parent widget gets destroyed. It will be lost then to the view.\n" + "\n" + "The side widget can be configured through the views configuration interface.\n" + "\n" + "This method has been introduced in version 0.28\n" + ) + gsi::method_ext ("hierarchy_control_frame", &hierarchy_control_frame, "@brief Gets the cell view (hierarchy view) side widget\n" "For details about side widgets see \\layer_control_frame.\n" diff --git a/src/layview/layview/layLayoutView_qt.cc b/src/layview/layview/layLayoutView_qt.cc index 26bc8a78e..c8e9e9218 100644 --- a/src/layview/layview/layLayoutView_qt.cc +++ b/src/layview/layview/layLayoutView_qt.cc @@ -62,6 +62,7 @@ #include "laySelector.h" #include "layLayoutCanvas.h" #include "layLayerControlPanel.h" +#include "layLayerToolbox.h" #include "layHierarchyControlPanel.h" #include "layLibrariesView.h" #include "layBrowser.h" @@ -166,6 +167,11 @@ QWidget *LayoutViewWidget::layer_control_frame () return !mp_view ? 0 : mp_view->layer_control_frame (); } +QWidget *LayoutViewWidget::layer_toolbox_frame () +{ + return !mp_view ? 0 : mp_view->layer_toolbox_frame (); +} + QWidget *LayoutViewWidget::hierarchy_control_frame () { return !mp_view ? 0 : mp_view->hierarchy_control_frame (); @@ -345,6 +351,8 @@ LayoutView::init_ui () mp_libraries_view = 0; mp_bookmarks_view = 0; mp_control_frame = 0; + mp_toolbox = 0; + mp_toolbox_frame = 0; mp_hierarchy_frame = 0; mp_libraries_frame = 0; mp_bookmarks_frame = 0; @@ -463,6 +471,18 @@ LayoutView::init_ui () QObject::connect (mp_control_panel, SIGNAL (order_changed ()), mp_connector, SLOT (layer_order_changed ())); QObject::connect (mp_control_panel, SIGNAL (current_layer_changed (const lay::LayerPropertiesConstIterator &)), mp_connector, SLOT (current_layer_changed_slot (const lay::LayerPropertiesConstIterator &))); + mp_toolbox_frame = new QFrame (0); + mp_toolbox_frame->setObjectName (QString::fromUtf8 ("lt_frame")); + QVBoxLayout *lt_frame_ly = new QVBoxLayout (mp_toolbox_frame); + lt_frame_ly->setContentsMargins (0, 0, 0, 0); + lt_frame_ly->setSpacing (0); + + mp_toolbox = new lay::LayerToolbox (mp_toolbox_frame, "lt"); + mp_toolbox->set_view (this); + lt_frame_ly->addWidget (mp_toolbox, 0 /*stretch*/); + + QObject::connect (mp_toolbox_frame, SIGNAL (destroyed ()), mp_connector, SLOT (side_panel_destroyed ())); + } mp_timer = new QTimer (mp_widget); @@ -506,6 +526,12 @@ void LayoutView::close() mp_control_panel = 0; mp_control_frame = 0; + if (mp_toolbox_frame) { + delete mp_toolbox_frame; + } + mp_toolbox = 0; + mp_toolbox_frame = 0; + if (mp_hierarchy_frame) { delete mp_hierarchy_frame; } @@ -584,6 +610,9 @@ void LayoutView::side_panel_destroyed (QObject *sender) } else if (sender == mp_bookmarks_frame) { mp_bookmarks_frame = 0; mp_bookmarks_view = 0; + } else if (sender == mp_toolbox_frame) { + mp_toolbox_frame = 0; + mp_toolbox = 0; } } @@ -797,6 +826,69 @@ LayoutView::configure (const std::string &name, const std::string &value) return true; + } else if (name == cfg_stipple_palette) { + + lay::StipplePalette palette = lay::StipplePalette::default_palette (); + + try { + // empty string means: default palette + if (! value.empty ()) { + palette.from_string (value); + } + } catch (...) { + // ignore errors: just reset the palette + palette = lay::StipplePalette::default_palette (); + } + + if (mp_toolbox) { + mp_toolbox->set_palette (palette); + } + + // others need this property too .. + return false; + + } else if (name == cfg_line_style_palette) { + + lay::LineStylePalette palette = lay::LineStylePalette::default_palette (); + + try { + // empty string means: default palette + if (! value.empty ()) { + palette.from_string (value); + } + } catch (...) { + // ignore errors: just reset the palette + palette = lay::LineStylePalette::default_palette (); + } + + if (mp_toolbox) { + mp_toolbox->set_palette (palette); + } + + // others need this property too .. + return false; + + } else if (name == cfg_color_palette) { + + lay::ColorPalette palette = lay::ColorPalette::default_palette (); + + try { + // empty string means: default palette + if (! value.empty ()) { + palette.from_string (value); + } + } catch (...) { + // ignore errors: just reset the palette + palette = lay::ColorPalette::default_palette (); + } + + if (mp_toolbox) { + mp_toolbox->set_palette (palette); + } + + // others need this property too .. + return false; + } else { return false; } diff --git a/src/layview/layview/layLayoutView_qt.h b/src/layview/layview/layLayoutView_qt.h index 1c3c4ca4b..061c7551f 100644 --- a/src/layview/layview/layLayoutView_qt.h +++ b/src/layview/layview/layLayoutView_qt.h @@ -75,6 +75,7 @@ namespace lay { class LayoutViewWidget; class AbstractMenu; class LayerControlPanel; +class LayerToolbox; class HierarchyControlPanel; class LibrariesView; class BookmarksView; @@ -379,6 +380,14 @@ public: return mp_hierarchy_panel; } + /** + * @brief Gets the layer toolbox + */ + virtual lay::LayerToolbox *layer_toolbox () + { + return mp_toolbox; + } + /** * @brief Resizes the view to the given width and height in pixels */ @@ -597,7 +606,8 @@ private: lay::HierarchyControlPanel *mp_hierarchy_panel; lay::LibrariesView *mp_libraries_view; lay::BookmarksView *mp_bookmarks_view; - QWidget *mp_control_frame, *mp_hierarchy_frame, *mp_libraries_frame, *mp_bookmarks_frame; + lay::LayerToolbox *mp_toolbox; + QWidget *mp_control_frame, *mp_toolbox_frame, *mp_hierarchy_frame, *mp_libraries_frame, *mp_bookmarks_frame; lay::EditorOptionsFrame *mp_editor_options_frame; QSpinBox *mp_min_hier_spbx; QSpinBox *mp_max_hier_spbx; @@ -623,6 +633,7 @@ private: void do_setup_editor_options_pages (); QWidget *layer_control_frame () { return mp_control_frame; } + QWidget *layer_toolbox_frame () { return mp_toolbox_frame; } QWidget *hierarchy_control_frame () { return mp_hierarchy_frame; } QWidget *libraries_frame () { return mp_libraries_frame; } QWidget *bookmarks_frame () { return mp_bookmarks_frame; } @@ -727,6 +738,11 @@ public: */ QWidget *layer_control_frame (); + /** + * @brief Gets the container with the layer toolbox + */ + QWidget *layer_toolbox_frame (); + /** * @brief Gets the container with the hierarchy control panel */