From 62e0d83b3a011c73e7ceba1817928a237ab6efeb Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 7 Oct 2022 00:44:12 +0200 Subject: [PATCH] WIP: further development on selection tree on objects dialog --- src/ant/ant/antPropertiesPage.cc | 6 + src/ant/ant/antPropertiesPage.h | 1 + src/ant/ant/antService.cc | 8 +- src/ant/ant/antService.h | 2 +- src/edt/edt/edtInstPropertiesPage.cc | 8 +- src/edt/edt/edtInstPropertiesPage.h | 1 + src/edt/edt/edtPropertiesPages.cc | 22 +- src/edt/edt/edtPropertiesPages.h | 4 +- src/edt/edt/edtServiceImpl.cc | 42 ++-- src/edt/edt/edtServiceImpl.h | 10 +- src/img/img/imgPropertiesPage.cc | 6 + src/img/img/imgPropertiesPage.h | 1 + src/img/img/imgService.cc | 8 +- src/img/img/imgService.h | 2 +- src/laybasic/laybasic/layEditable.h | 4 +- src/laybasic/laybasic/layProperties.h | 5 + src/layui/layui/PropertiesDialog.ui | 64 +++--- src/layui/layui/layPropertiesDialog.cc | 260 ++++++++++++++++++------ src/layui/layui/layPropertiesDialog.h | 11 +- src/layview/layview/layLayoutView_qt.cc | 5 + 20 files changed, 340 insertions(+), 130 deletions(-) diff --git a/src/ant/ant/antPropertiesPage.cc b/src/ant/ant/antPropertiesPage.cc index 6af023f14..ecbe242b1 100644 --- a/src/ant/ant/antPropertiesPage.cc +++ b/src/ant/ant/antPropertiesPage.cc @@ -385,6 +385,12 @@ PropertiesPage::description (size_t entry) const return "Ruler"; // @@@ } +std::string +PropertiesPage::description () const +{ + return tl::to_string (tr ("Rulers and Annotations")); +} + void PropertiesPage::leave () { diff --git a/src/ant/ant/antPropertiesPage.h b/src/ant/ant/antPropertiesPage.h index ce90940f0..b83f5c5d5 100644 --- a/src/ant/ant/antPropertiesPage.h +++ b/src/ant/ant/antPropertiesPage.h @@ -46,6 +46,7 @@ public: virtual size_t count () const; virtual void select_entries (const std::vector &entries); virtual std::string description (size_t entry) const; + virtual std::string description () const; virtual void update (); virtual void leave (); virtual bool readonly (); diff --git a/src/ant/ant/antService.cc b/src/ant/ant/antService.cc index 49c3bca93..3d6fd3412 100644 --- a/src/ant/ant/antService.cc +++ b/src/ant/ant/antService.cc @@ -2507,10 +2507,12 @@ Service::display_status (bool transient) } #if defined(HAVE_QT) -lay::PropertiesPage * -Service::properties_page (db::Manager *manager, QWidget *parent) +std::vector +Service::properties_pages (db::Manager *manager, QWidget *parent) { - return new PropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new PropertiesPage (this, manager, parent)); + return pages; } #endif diff --git a/src/ant/ant/antService.h b/src/ant/ant/antService.h index a36bf6884..9fb952063 100644 --- a/src/ant/ant/antService.h +++ b/src/ant/ant/antService.h @@ -350,7 +350,7 @@ public: /** * @brief Create the properties page */ - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif /** diff --git a/src/edt/edt/edtInstPropertiesPage.cc b/src/edt/edt/edtInstPropertiesPage.cc index abd87b16a..9cbf7d4d2 100644 --- a/src/edt/edt/edtInstPropertiesPage.cc +++ b/src/edt/edt/edtInstPropertiesPage.cc @@ -245,7 +245,13 @@ InstPropertiesPage::description (size_t entry) const return m_selection_ptrs [entry]->back ().inst_ptr.to_string (); // @@@ } -void +std::string +InstPropertiesPage::description () const +{ + return "Instances"; // @@@ +} + +void InstPropertiesPage::leave () { mp_service->clear_highlights (); diff --git a/src/edt/edt/edtInstPropertiesPage.h b/src/edt/edt/edtInstPropertiesPage.h index 603c0f9da..5765f37a0 100644 --- a/src/edt/edt/edtInstPropertiesPage.h +++ b/src/edt/edt/edtInstPropertiesPage.h @@ -50,6 +50,7 @@ public: virtual size_t count () const; virtual void select_entries (const std::vector &entries); virtual std::string description (size_t entry) const; + virtual std::string description () const; virtual void leave (); private: diff --git a/src/edt/edt/edtPropertiesPages.cc b/src/edt/edt/edtPropertiesPages.cc index a89f07b23..1fc0fe92e 100644 --- a/src/edt/edt/edtPropertiesPages.cc +++ b/src/edt/edt/edtPropertiesPages.cc @@ -43,9 +43,9 @@ namespace edt // ------------------------------------------------------------------------- // ShapePropertiesPage implementation -ShapePropertiesPage::ShapePropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) +ShapePropertiesPage::ShapePropertiesPage (const std::string &description, edt::Service *service, db::Manager *manager, QWidget *parent) : lay::PropertiesPage (parent, manager, service), - mp_service (service), m_enable_cb_callback (true) + m_description (description), mp_service (service), m_enable_cb_callback (true) { m_selection_ptrs.reserve (service->selection ().size ()); for (edt::Service::obj_iterator s = service->selection ().begin (); s != service->selection ().end (); ++s) { @@ -92,7 +92,13 @@ ShapePropertiesPage::description (size_t entry) const return m_selection_ptrs [entry]->shape ().to_string (); // @@@ } -void +std::string +ShapePropertiesPage::description () const +{ + return m_description; +} + +void ShapePropertiesPage::leave () { mp_service->clear_highlights (); @@ -367,7 +373,7 @@ ShapePropertiesPage::readonly () // PolygonPropertiesPage implementation PolygonPropertiesPage::PolygonPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) - : ShapePropertiesPage (service, manager, parent), m_in_text_changed (false) + : ShapePropertiesPage (tl::to_string (tr ("Polygons")), service, manager, parent), m_in_text_changed (false) { setupUi (this); setup (); @@ -519,7 +525,7 @@ PolygonPropertiesPage::create_applicator (db::Shapes & /*shapes*/, const db::Sha static bool s_coordinateMode = true; BoxPropertiesPage::BoxPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) - : ShapePropertiesPage (service, manager, parent), + : ShapePropertiesPage (tl::to_string (tr ("Boxes")), service, manager, parent), m_recursion_sentinel (false), m_tab_index (0), m_dbu (1.0), m_lr_swapped (false), m_tb_swapped (false) { setupUi (this); @@ -756,7 +762,7 @@ BoxPropertiesPage::changed () // TextPropertiesPage implementation TextPropertiesPage::TextPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) - : ShapePropertiesPage (service, manager, parent) + : ShapePropertiesPage (tl::to_string (tr ("Texts")), service, manager, parent) { setupUi (this); setup (); @@ -890,7 +896,7 @@ TextPropertiesPage::create_applicator (db::Shapes & /*shapes*/, const db::Shape // PathPropertiesPage implementation PathPropertiesPage::PathPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) - : ShapePropertiesPage (service, manager, parent), m_in_text_changed (false) + : ShapePropertiesPage (tl::to_string (tr ("Paths")), service, manager, parent), m_in_text_changed (false) { setupUi (this); setup (); @@ -957,7 +963,7 @@ PathPropertiesPage::create_applicator (db::Shapes & /*shapes*/, const db::Shape // EditablePathPropertiesPage implementation EditablePathPropertiesPage::EditablePathPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent) - : ShapePropertiesPage (service, manager, parent), m_in_text_changed (false) + : ShapePropertiesPage (tl::to_string (tr ("Paths")), service, manager, parent), m_in_text_changed (false) { setupUi (this); setup (); diff --git a/src/edt/edt/edtPropertiesPages.h b/src/edt/edt/edtPropertiesPages.h index 03c156fb2..dd767f7ad 100644 --- a/src/edt/edt/edtPropertiesPages.h +++ b/src/edt/edt/edtPropertiesPages.h @@ -46,12 +46,13 @@ class ShapePropertiesPage Q_OBJECT public: - ShapePropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent); + ShapePropertiesPage (const std::string &description, edt::Service *service, db::Manager *manager, QWidget *parent); ~ShapePropertiesPage (); virtual size_t count () const; virtual void select_entries (const std::vector &entries); virtual std::string description (size_t entry) const; + virtual std::string description () const; virtual void leave (); protected: @@ -66,6 +67,7 @@ private: void recompute_selection_ptrs (const std::vector &new_sel); protected: + std::string m_description; std::vector m_selection_ptrs; unsigned int m_index; edt::Service *mp_service; diff --git a/src/edt/edt/edtServiceImpl.cc b/src/edt/edt/edtServiceImpl.cc index 60cd2ee29..a88ce7d88 100644 --- a/src/edt/edt/edtServiceImpl.cc +++ b/src/edt/edt/edtServiceImpl.cc @@ -381,10 +381,12 @@ PolygonService::PolygonService (db::Manager *manager, lay::LayoutViewBase *view) } #if defined(HAVE_QT) -lay::PropertiesPage * -PolygonService::properties_page (db::Manager *manager, QWidget *parent) +std::vector +PolygonService::properties_pages (db::Manager *manager, QWidget *parent) { - return new edt::PolygonPropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new edt::PolygonPropertiesPage (this, manager, parent)); + return pages; } #endif @@ -712,10 +714,12 @@ BoxService::BoxService (db::Manager *manager, lay::LayoutViewBase *view) } #if defined(HAVE_QT) -lay::PropertiesPage * -BoxService::properties_page (db::Manager *manager, QWidget *parent) +std::vector +BoxService::properties_pages (db::Manager *manager, QWidget *parent) { - return new edt::BoxPropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new edt::BoxPropertiesPage (this, manager, parent)); + return pages; } #endif @@ -812,10 +816,12 @@ TextService::~TextService () } #if defined(HAVE_QT) -lay::PropertiesPage * -TextService::properties_page (db::Manager *manager, QWidget *parent) +std::vector +TextService::properties_pages (db::Manager *manager, QWidget *parent) { - return new edt::TextPropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new edt::TextPropertiesPage (this, manager, parent)); + return pages; } #endif @@ -1004,14 +1010,16 @@ PathService::~PathService () } #if defined(HAVE_QT) -lay::PropertiesPage * -PathService::properties_page (db::Manager *manager, QWidget *parent) +std::vector +PathService::properties_pages (db::Manager *manager, QWidget *parent) { + std::vector pages; if (view ()->is_editable ()) { - return new edt::EditablePathPropertiesPage (this, manager, parent); + pages.push_back (new edt::EditablePathPropertiesPage (this, manager, parent)); } else { - return new edt::PathPropertiesPage (this, manager, parent); + pages.push_back (new edt::PathPropertiesPage (this, manager, parent)); } + return pages; } #endif @@ -1246,10 +1254,12 @@ InstService::InstService (db::Manager *manager, lay::LayoutViewBase *view) } #if defined(HAVE_QT) -lay::PropertiesPage * -InstService::properties_page (db::Manager *manager, QWidget *parent) +std::vector +InstService::properties_pages (db::Manager *manager, QWidget *parent) { - return new edt::InstPropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new edt::InstPropertiesPage (this, manager, parent)); + return pages; } #endif diff --git a/src/edt/edt/edtServiceImpl.h b/src/edt/edt/edtServiceImpl.h index 1de7c70a6..40a5ed584 100644 --- a/src/edt/edt/edtServiceImpl.h +++ b/src/edt/edt/edtServiceImpl.h @@ -90,7 +90,7 @@ public: PolygonService (db::Manager *manager, lay::LayoutViewBase *view); #if defined(HAVE_QT) - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif virtual void do_delete (); virtual void do_begin_edit (const db::DPoint &p); @@ -123,7 +123,7 @@ public: BoxService (db::Manager *manager, lay::LayoutViewBase *view); #if defined(HAVE_QT) - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif virtual void do_begin_edit (const db::DPoint &p); virtual void do_mouse_move (const db::DPoint &p); @@ -151,7 +151,7 @@ public: ~TextService (); #if defined(HAVE_QT) - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif virtual void do_begin_edit (const db::DPoint &p); virtual void do_mouse_transform (const db::DPoint &p, db::DFTrans trans); @@ -185,7 +185,7 @@ public: ~PathService (); #if defined(HAVE_QT) - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif virtual void do_begin_edit (const db::DPoint &p); virtual void do_mouse_move (const db::DPoint &p); @@ -223,7 +223,7 @@ public: InstService (db::Manager *manager, lay::LayoutViewBase *view); #if defined(HAVE_QT) - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif virtual void do_begin_edit (const db::DPoint &p); virtual void do_mouse_move_inactive (const db::DPoint &p); diff --git a/src/img/img/imgPropertiesPage.cc b/src/img/img/imgPropertiesPage.cc index 09b11ed16..a3f28e3f8 100644 --- a/src/img/img/imgPropertiesPage.cc +++ b/src/img/img/imgPropertiesPage.cc @@ -174,6 +174,12 @@ PropertiesPage::description (size_t entry) const return "image"; // @@@ } +std::string +PropertiesPage::description () const +{ + return tl::to_string (tr ("Images")); +} + void PropertiesPage::leave () { diff --git a/src/img/img/imgPropertiesPage.h b/src/img/img/imgPropertiesPage.h index 4659009ab..1c864d86e 100644 --- a/src/img/img/imgPropertiesPage.h +++ b/src/img/img/imgPropertiesPage.h @@ -53,6 +53,7 @@ public: virtual size_t count () const; virtual void select_entries (const std::vector &entries); virtual std::string description (size_t entry) const; + virtual std::string description () const; virtual void update (); virtual void leave (); virtual bool readonly (); diff --git a/src/img/img/imgService.cc b/src/img/img/imgService.cc index 6c9e2ec78..39448cb5d 100644 --- a/src/img/img/imgService.cc +++ b/src/img/img/imgService.cc @@ -1377,10 +1377,12 @@ Service::display_status (bool transient) } #if defined(HAVE_QT) -lay::PropertiesPage * -Service::properties_page (db::Manager *manager, QWidget *parent) +std::vector +Service::properties_pages (db::Manager *manager, QWidget *parent) { - return new img::PropertiesPage (this, manager, parent); + std::vector pages; + pages.push_back (new img::PropertiesPage (this, manager, parent)); + return pages; } #endif diff --git a/src/img/img/imgService.h b/src/img/img/imgService.h index 9379c9b49..929110152 100644 --- a/src/img/img/imgService.h +++ b/src/img/img/imgService.h @@ -373,7 +373,7 @@ public: /** * @brief Create the properties page */ - virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent); + virtual std::vector properties_pages (db::Manager *manager, QWidget *parent); #endif /** diff --git a/src/laybasic/laybasic/layEditable.h b/src/laybasic/laybasic/layEditable.h index 64b117efb..faeb9101a 100644 --- a/src/laybasic/laybasic/layEditable.h +++ b/src/laybasic/laybasic/layEditable.h @@ -368,9 +368,9 @@ public: * by the caller. The return value is 0 if the Editable object does * not support a properties page. */ - virtual lay::PropertiesPage *properties_page (db::Manager * /*manager*/, QWidget * /*parent*/) + virtual std::vector properties_pages (db::Manager * /*manager*/, QWidget * /*parent*/) { - return 0; + return std::vector (); } #endif diff --git a/src/laybasic/laybasic/layProperties.h b/src/laybasic/laybasic/layProperties.h index 605489b12..c346ce0da 100644 --- a/src/laybasic/laybasic/layProperties.h +++ b/src/laybasic/laybasic/layProperties.h @@ -97,6 +97,11 @@ public: */ virtual std::string description (size_t entry) const = 0; + /** + * @brief Gets a description text for the whole group + */ + virtual std::string description () const = 0; + /** * @brief Update the display * diff --git a/src/layui/layui/PropertiesDialog.ui b/src/layui/layui/PropertiesDialog.ui index 112840254..37f6353b1 100644 --- a/src/layui/layui/PropertiesDialog.ui +++ b/src/layui/layui/PropertiesDialog.ui @@ -6,43 +6,47 @@ 0 0 - 601 - 391 + 828 + 567 Object Properties - - - 6 - - - 9 - - - 9 - - - 9 - - - 9 - + - - - - 1 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised + + + Qt::Horizontal + + + + 0 + 0 + + + + true + + + false + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + diff --git a/src/layui/layui/layPropertiesDialog.cc b/src/layui/layui/layPropertiesDialog.cc index 02986a16f..fbc9dde4d 100644 --- a/src/layui/layui/layPropertiesDialog.cc +++ b/src/layui/layui/layPropertiesDialog.cc @@ -32,38 +32,146 @@ #include "ui_PropertiesDialog.h" #include +#include namespace lay { +// ---------------------------------------------------------------------------------------------------------- +// PropertiesTreeModel definition and implementation + +class PropertiesTreeModel + : public QAbstractItemModel +{ +public: + PropertiesTreeModel (PropertiesDialog *dialog) + : QAbstractItemModel (dialog), mp_dialog (dialog) + { } + + int columnCount (const QModelIndex &) const + { + return 1; + } + + QVariant data (const QModelIndex &index, int role) const + { + if (role == Qt::DisplayRole) { + if (index.internalId () < mp_dialog->properties_pages ().size ()) { + return tl::to_qstring (mp_dialog->properties_pages () [index.internalId ()]->description (index.row ())); + } else { + return tl::to_qstring (mp_dialog->properties_pages () [index.row ()]->description ()); + } + } + return QVariant (); + } + + Qt::ItemFlags flags (const QModelIndex &index) const + { + Qt::ItemFlags f = QAbstractItemModel::flags (index); + if (index.internalId () >= mp_dialog->properties_pages ().size ()) { + f &= ~Qt::ItemIsSelectable; + } + return f; + } + + bool hasChildren (const QModelIndex &parent) const + { + return (! parent.isValid () || parent.internalId () >= mp_dialog->properties_pages ().size ()); + } + + QModelIndex index (int row, int column, const QModelIndex &parent) const + { + if (! parent.isValid ()) { + return createIndex (row, column, qint64 (mp_dialog->properties_pages ().size ())); + } else { + return createIndex (row, column, qint64 (parent.row ())); + } + } + + QModelIndex parent (const QModelIndex &child) const + { + if (child.internalId () < mp_dialog->properties_pages ().size ()) { + return createIndex (int (child.internalId ()), child.column (), qint64 (mp_dialog->properties_pages ().size ())); + } else { + return QModelIndex (); + } + } + + int rowCount (const QModelIndex &parent) const + { + if (! hasChildren (parent)) { + return 0; + } else if (parent.isValid ()) { + return int (mp_dialog->properties_pages () [parent.row ()]->count ()); + } else { + return int (mp_dialog->properties_pages ().size ()); + } + } + + int page_index (const QModelIndex &index) + { + return int (index.internalId ()); + } + + int object_index (const QModelIndex &index) + { + return int (index.row ()); + } + + QModelIndex index_for (int page_index, int object_index) + { + return createIndex (object_index, 0, qint64 (page_index)); + } + +private: + PropertiesDialog *mp_dialog; +}; + +// ---------------------------------------------------------------------------------------------------------- +// PropertiesDialog + PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, lay::Editables *editables) : QDialog (0 /*parent*/), - mp_manager (manager), mp_editables (editables), m_index (-1), m_object_index (0), m_auto_applied (false), m_transaction_id (0) + mp_manager (manager), + mp_editables (editables), + m_index (0), m_prev_index (-1), + m_object_index (0), + m_auto_applied (false), + m_transaction_id (0), + m_signals_enabled (true) { mp_ui = new Ui::PropertiesDialog (); setObjectName (QString::fromUtf8 ("properties_dialog")); mp_ui->setupUi (this); + mp_tree_model = 0; mp_editables->enable_edits (false); mp_stack = new QStackedLayout; for (lay::Editables::iterator e = mp_editables->begin (); e != mp_editables->end (); ++e) { - mp_properties_pages.push_back (e->properties_page (mp_manager, mp_ui->content_frame)); - if (mp_properties_pages.back ()) { - mp_stack->addWidget (mp_properties_pages.back ()); - connect (mp_properties_pages.back (), SIGNAL (edited ()), this, SLOT (apply ())); + auto pp = e->properties_pages (mp_manager, mp_ui->content_frame); + for (auto p = pp.begin (); p != pp.end (); ++p) { + if ((*p)->count () == 0) { + delete *p; + } else { + mp_properties_pages.push_back (*p); + } } } + for (size_t i = 0; i < mp_properties_pages.size (); ++i) { + mp_stack->addWidget (mp_properties_pages [i]); + connect (mp_properties_pages [i], SIGNAL (edited ()), this, SLOT (apply ())); + } // Necessary to maintain the page order for UI regression testing of 0.18 vs. 0.19 (because tl::Collection has changed to order) .. std::reverse (mp_properties_pages.begin (), mp_properties_pages.end ()); // Add a label as a dummy - QLabel *dummy = new QLabel (QObject::tr ("No object with properties to display"), mp_ui->content_frame); - dummy->setAlignment (Qt::AlignHCenter | Qt::AlignVCenter); - mp_stack->addWidget (dummy); + mp_none = new QLabel (QObject::tr ("No object with properties to display"), mp_ui->content_frame); + mp_none->setAlignment (Qt::AlignHCenter | Qt::AlignVCenter); + mp_stack->addWidget (mp_none); mp_ui->content_frame->setLayout (mp_stack); @@ -79,45 +187,49 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, m_objects = mp_editables->selection_size (); m_current_object = 0; - update_title (); - // look for next usable editable - while (m_index < int (mp_properties_pages.size ()) && - (m_index < 0 || mp_properties_pages [m_index] == 0 || m_object_index >= int (mp_properties_pages [m_index]->count ()))) { - ++m_index; + if (m_index >= int (mp_properties_pages.size ())) { + m_index = -1; } - mp_ui->prev_button->setEnabled (false); + update_title (); // if at end disable the "Next" button and return (this may only happen at the first call) - if (m_index >= int (mp_properties_pages.size ())) { + if (m_index < 0) { + mp_ui->prev_button->setEnabled (false); mp_ui->next_button->setEnabled (false); - mp_stack->setCurrentWidget (dummy); + mp_stack->setCurrentWidget (mp_none); mp_ui->apply_to_all_cbx->setEnabled (false); mp_ui->apply_to_all_cbx->setChecked (false); mp_ui->relative_cbx->setEnabled (false); mp_ui->relative_cbx->setChecked (false); mp_ui->ok_button->setEnabled (false); + mp_ui->tree->setEnabled (false); } else { - mp_ui->next_button->setEnabled (any_next ()); - mp_stack->setCurrentWidget (mp_properties_pages [m_index]); - mp_properties_pages [m_index]->select_entry (m_object_index); - mp_properties_pages [m_index]->update (); - mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ()); + mp_tree_model = new PropertiesTreeModel (this); + mp_ui->tree->setModel (mp_tree_model); + mp_ui->tree->expandAll (); + + m_signals_enabled = false; + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + m_signals_enabled = true; + + update_controls (); + +// @@@ save this status! mp_ui->apply_to_all_cbx->setChecked (false); - mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ()); mp_ui->relative_cbx->setChecked (true); - mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ()); + + connect (mp_ui->ok_button, SIGNAL (clicked ()), this, SLOT (ok_pressed ())); + connect (mp_ui->cancel_button, SIGNAL (clicked ()), this, SLOT (cancel_pressed ())); + connect (mp_ui->prev_button, SIGNAL (clicked ()), this, SLOT (prev_pressed ())); + connect (mp_ui->next_button, SIGNAL (clicked ()), this, SLOT (next_pressed ())); + connect (mp_ui->tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &, const QModelIndex &))); } - - connect (mp_ui->ok_button, SIGNAL (clicked ()), this, SLOT (ok_pressed ())); - connect (mp_ui->cancel_button, SIGNAL (clicked ()), this, SLOT (cancel_pressed ())); - connect (mp_ui->prev_button, SIGNAL (clicked ()), this, SLOT (prev_pressed ())); - connect (mp_ui->next_button, SIGNAL (clicked ()), this, SLOT (next_pressed ())); } PropertiesDialog::~PropertiesDialog () @@ -139,6 +251,53 @@ PropertiesDialog::disconnect () mp_properties_pages.clear (); } +void +PropertiesDialog::current_index_changed (const QModelIndex &index, const QModelIndex & /*previous*/) +{ + if (m_signals_enabled && index.isValid ()) { + + if (mp_tree_model->parent (index).isValid ()) { + + m_index = mp_tree_model->page_index (index); + m_object_index = mp_tree_model->object_index (index); + + } else { + + m_index = index.row (); + m_object_index = 0; + + } + + m_current_object = 0; + for (int i = 0; i < m_index; ++i) { + m_current_object += mp_properties_pages [i]->count (); + } + m_current_object += m_object_index; + + update_title (); + update_controls (); + + } +} + +void +PropertiesDialog::update_controls () +{ + if (m_prev_index >= 0 && m_index != m_prev_index) { + mp_properties_pages [m_prev_index]->leave (); + } + m_prev_index = m_index; + + mp_stack->setCurrentWidget (mp_properties_pages [m_index]); + mp_ui->prev_button->setEnabled (any_prev ()); + mp_ui->next_button->setEnabled (any_next ()); + mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ()); + mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ()); + mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ()); + mp_properties_pages [m_index]->select_entry (m_object_index); + mp_properties_pages [m_index]->update (); +} + void PropertiesDialog::next_pressed () { @@ -158,33 +317,23 @@ BEGIN_PROTECTED // look for next usable editable if at end if (m_object_index >= int (mp_properties_pages [m_index]->count ())) { - mp_properties_pages [m_index]->leave (); ++m_index; m_object_index = 0; - while (m_index < int (mp_properties_pages.size ()) && - (mp_properties_pages [m_index] == 0 || mp_properties_pages [m_index]->count () == 0)) { - ++m_index; - } // because we checked that there are any further elements, this should not happen: if (m_index >= int (mp_properties_pages.size ())) { return; } - mp_stack->setCurrentWidget (mp_properties_pages [m_index]); - } ++m_current_object; update_title (); - mp_ui->prev_button->setEnabled (true); - mp_ui->next_button->setEnabled (any_next ()); - mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ()); - mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ()); - mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ()); - mp_properties_pages [m_index]->select_entry (m_object_index); - mp_properties_pages [m_index]->update (); + update_controls (); + m_signals_enabled = false; + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + m_signals_enabled = true; END_PROTECTED } @@ -205,20 +354,14 @@ BEGIN_PROTECTED if (m_object_index == 0) { // look for last usable editable if at end - mp_properties_pages [m_index]->leave (); --m_index; - while (m_index >= 0 && - (mp_properties_pages [m_index] == 0 || mp_properties_pages [m_index]->count () == 0)) { - --m_index; - } + // because we checked that there are any further elements, this should not happen: if (m_index < 0) { return; } - m_object_index = mp_properties_pages [m_index]->count () - 1; - - mp_stack->setCurrentWidget (mp_properties_pages [m_index]); + m_object_index = mp_properties_pages [m_index]->count (); } @@ -228,13 +371,10 @@ BEGIN_PROTECTED --m_current_object; update_title (); - mp_ui->next_button->setEnabled (true); - mp_ui->prev_button->setEnabled (any_prev ()); - mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ()); - mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ()); - mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ()); - mp_properties_pages [m_index]->select_entry (m_object_index); - mp_properties_pages [m_index]->update (); + update_controls (); + m_signals_enabled = false; + mp_ui->tree->setCurrentIndex (mp_tree_model->index_for (m_index, m_object_index)); + m_signals_enabled = true; END_PROTECTED } @@ -242,7 +382,11 @@ END_PROTECTED void PropertiesDialog::update_title () { - setWindowTitle (tl::to_qstring (tl::to_string (QObject::tr ("Object Properties - ")) + tl::to_string (m_current_object + 1) + tl::to_string (QObject::tr (" of ")) + tl::to_string (m_objects))); + if (m_index < 0) { + setWindowTitle (QObject::tr ("Object Properties")); + } else { + setWindowTitle (tl::to_qstring (tl::to_string (QObject::tr ("Object Properties - ")) + tl::to_string (m_current_object + 1) + tl::to_string (QObject::tr (" of ")) + tl::to_string (m_objects))); + } } bool diff --git a/src/layui/layui/layPropertiesDialog.h b/src/layui/layui/layPropertiesDialog.h index 583141a25..354d0cf3b 100644 --- a/src/layui/layui/layPropertiesDialog.h +++ b/src/layui/layui/layPropertiesDialog.h @@ -53,6 +53,7 @@ class Editable; class Editables; class PropertiesPage; class MainWindow; +class PropertiesTreeModel; /** * @brief The properties dialog @@ -79,20 +80,27 @@ public: ~PropertiesDialog (); private: + friend class PropertiesTreeModel; + std::vector mp_properties_pages; db::Manager *mp_manager; lay::Editables *mp_editables; - int m_index, m_object_index; + int m_index, m_prev_index, m_object_index; QStackedLayout *mp_stack; + QLabel *mp_none; lay::MainWindow *mp_mw; size_t m_objects, m_current_object; bool m_auto_applied; db::Manager::transaction_id_t m_transaction_id; + PropertiesTreeModel *mp_tree_model; + bool m_signals_enabled; + const std::vector &properties_pages () { return mp_properties_pages; } void disconnect (); bool any_prev () const; bool any_next () const; void update_title (); + void update_controls (); public slots: void apply (); @@ -100,6 +108,7 @@ public slots: void prev_pressed (); void cancel_pressed (); void ok_pressed (); + void current_index_changed (const QModelIndex &index, const QModelIndex &previous); protected: void reject (); diff --git a/src/layview/layview/layLayoutView_qt.cc b/src/layview/layview/layLayoutView_qt.cc index f99154707..aa80e886f 100644 --- a/src/layview/layview/layLayoutView_qt.cc +++ b/src/layview/layview/layLayoutView_qt.cc @@ -584,10 +584,15 @@ LayoutView::show_properties () } // re-create a new properties dialog + QByteArray geom; if (mp_properties_dialog) { + geom = mp_properties_dialog->saveGeometry (); delete mp_properties_dialog.data (); } mp_properties_dialog = new lay::PropertiesDialog (widget (), manager (), this); + if (! geom.isEmpty ()) { + mp_properties_dialog->restoreGeometry (geom); + } // if launched from a dialog, do not use "show" as this blocks user interaction if (QApplication::activeModalWidget ()) {