Layer toolbox is a view component now - that means it changes with the view.

This commit is contained in:
Matthias Koefferlein 2022-09-03 18:20:49 +02:00
parent 81eab3f1db
commit a9ef337c3b
8 changed files with 176 additions and 76 deletions

View File

@ -23,12 +23,13 @@
#include "layControlWidgetStack.h"
#include <QLabel>
#include <QEvent>
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)

View File

@ -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 <QWidget *> m_widgets;
QWidget *mp_current_widget;
QLabel *mp_bglabel;
bool m_size_follows_content;
};
}

View File

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

View File

@ -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;

View File

@ -1047,6 +1047,8 @@ LayerToolbox::panel_button_clicked (int index)
int h = sizeHint ().height ();
setMinimumHeight (h);
setMaximumHeight (h);
updateGeometry ();
}
template <class Op>

View File

@ -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<lay::LayoutViewWidget> 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"

View File

@ -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;
}

View File

@ -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
*/