From eb004e45e10fb88e5a9ae6bdb32d34b690901375 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 6 Oct 2022 21:31:16 +0200 Subject: [PATCH] WIP: generalized interface of properties page --- src/ant/ant/antPropertiesPage.cc | 45 +++++--------- src/ant/ant/antPropertiesPage.h | 11 ++-- src/edt/edt/edtInstPropertiesPage.cc | 37 +++-------- src/edt/edt/edtInstPropertiesPage.h | 9 +-- src/edt/edt/edtPropertiesPages.cc | 37 +++-------- src/edt/edt/edtPropertiesPages.h | 9 +-- src/img/img/imgPropertiesPage.cc | 54 +++++----------- src/img/img/imgPropertiesPage.h | 11 ++-- src/laybasic/laybasic/layProperties.h | 86 ++++++-------------------- src/layui/layui/layPropertiesDialog.cc | 52 +++++++++------- src/layui/layui/layPropertiesDialog.h | 2 +- 11 files changed, 117 insertions(+), 236 deletions(-) diff --git a/src/ant/ant/antPropertiesPage.cc b/src/ant/ant/antPropertiesPage.cc index 7e55c2afc..6af023f14 100644 --- a/src/ant/ant/antPropertiesPage.cc +++ b/src/ant/ant/antPropertiesPage.cc @@ -65,7 +65,7 @@ PropertiesPage::PropertiesPage (ant::Service *rulers, db::Manager *manager, QWid : lay::PropertiesPage (parent, manager, rulers), mp_rulers (rulers), m_enable_cb_callback (true), m_in_something_changed (false) { mp_rulers->get_selection (m_selection); - m_pos = m_selection.begin (); + m_index = 0; setupUi (this); @@ -126,18 +126,6 @@ PropertiesPage::~PropertiesPage () mp_rulers->restore_highlights (); } -void -PropertiesPage::back () -{ - m_pos = m_selection.end (); -} - -void -PropertiesPage::front () -{ - m_pos = m_selection.begin (); -} - void PropertiesPage::swap_points_clicked () { @@ -374,32 +362,27 @@ PropertiesPage::snap_to_layout_clicked () const ant::Object & PropertiesPage::current () const { - const ant::Object *ruler = dynamic_cast ((*m_pos)->ptr ()); + const ant::Object *ruler = dynamic_cast (m_selection [m_index]->ptr ()); return *ruler; } -bool -PropertiesPage::at_begin () const +size_t +PropertiesPage::count () const { - return (m_pos == m_selection.begin ()); + return m_selection.size (); } -bool -PropertiesPage::at_end () const +void +PropertiesPage::select_entries (const std::vector &entries) { - return (m_pos == m_selection.end ()); + tl_assert (entries.size () == 1); // @@@ + m_index = entries.front (); } -void -PropertiesPage::operator-- () +std::string +PropertiesPage::description (size_t entry) const { - --m_pos; -} - -void -PropertiesPage::operator++ () -{ - ++m_pos; + return "Ruler"; // @@@ } void @@ -411,7 +394,7 @@ PropertiesPage::leave () void PropertiesPage::update () { - mp_rulers->highlight (std::distance (m_selection.begin (), m_pos)); + mp_rulers->highlight (m_index); update_with (current ()); } @@ -504,7 +487,7 @@ PropertiesPage::apply () { ant::Object obj; get_object (obj); - mp_rulers->change_ruler (*m_pos, obj); + mp_rulers->change_ruler (m_selection [m_index], obj); // @@@ multi-apply } void PropertiesPage::get_object(ant::Object &obj) diff --git a/src/ant/ant/antPropertiesPage.h b/src/ant/ant/antPropertiesPage.h index 1f1ead4da..ce90940f0 100644 --- a/src/ant/ant/antPropertiesPage.h +++ b/src/ant/ant/antPropertiesPage.h @@ -43,12 +43,9 @@ public: PropertiesPage (ant::Service *rulers, db::Manager *manager, QWidget *parent); ~PropertiesPage (); - virtual void back (); - virtual void front (); - virtual bool at_begin () const; - virtual bool at_end () const; - virtual void operator-- (); - virtual void operator++ (); + virtual size_t count () const; + virtual void select_entries (const std::vector &entries); + virtual std::string description (size_t entry) const; virtual void update (); virtual void leave (); virtual bool readonly (); @@ -61,7 +58,7 @@ private slots: private: std::vector m_selection; - std::vector ::iterator m_pos; + size_t m_index; ant::Service *mp_rulers; bool m_enable_cb_callback; bool m_in_something_changed; diff --git a/src/edt/edt/edtInstPropertiesPage.cc b/src/edt/edt/edtInstPropertiesPage.cc index cde690911..abd87b16a 100644 --- a/src/edt/edt/edtInstPropertiesPage.cc +++ b/src/edt/edt/edtInstPropertiesPage.cc @@ -226,40 +226,23 @@ InstPropertiesPage::display_mode_changed (bool) update (); } -void -InstPropertiesPage::back () +size_t +InstPropertiesPage::count () const { - m_index = (unsigned int) m_selection_ptrs.size (); + return m_selection_ptrs.size (); } -void -InstPropertiesPage::front () +void +InstPropertiesPage::select_entries (const std::vector &entries) { - m_index = 0; + tl_assert (entries.size () == 1); // @@@ + m_index = entries.front (); } -bool -InstPropertiesPage::at_begin () const +std::string +InstPropertiesPage::description (size_t entry) const { - return (m_index == 0); -} - -bool -InstPropertiesPage::at_end () const -{ - return (m_index == m_selection_ptrs.size ()); -} - -void -InstPropertiesPage::operator-- () -{ - --m_index; -} - -void -InstPropertiesPage::operator++ () -{ - ++m_index; + return m_selection_ptrs [entry]->back ().inst_ptr.to_string (); // @@@ } void diff --git a/src/edt/edt/edtInstPropertiesPage.h b/src/edt/edt/edtInstPropertiesPage.h index 07a193a76..603c0f9da 100644 --- a/src/edt/edt/edtInstPropertiesPage.h +++ b/src/edt/edt/edtInstPropertiesPage.h @@ -47,12 +47,9 @@ public: InstPropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent); ~InstPropertiesPage (); - virtual void back (); - virtual void front (); - virtual bool at_begin () const; - virtual bool at_end () const; - virtual void operator-- (); - virtual void operator++ (); + virtual size_t count () const; + virtual void select_entries (const std::vector &entries); + virtual std::string description (size_t entry) const; virtual void leave (); private: diff --git a/src/edt/edt/edtPropertiesPages.cc b/src/edt/edt/edtPropertiesPages.cc index 7f01f3158..a89f07b23 100644 --- a/src/edt/edt/edtPropertiesPages.cc +++ b/src/edt/edt/edtPropertiesPages.cc @@ -73,40 +73,23 @@ ShapePropertiesPage::setup () m_enable_cb_callback = true; } -void -ShapePropertiesPage::back () +size_t +ShapePropertiesPage::count () const { - m_index = (unsigned int) m_selection_ptrs.size (); + return m_selection_ptrs.size (); } -void -ShapePropertiesPage::front () +void +ShapePropertiesPage::select_entries (const std::vector &entries) { - m_index = 0; + tl_assert (entries.size () == 1); // @@@ + m_index = entries.front (); } -bool -ShapePropertiesPage::at_begin () const +std::string +ShapePropertiesPage::description (size_t entry) const { - return (m_index == 0); -} - -bool -ShapePropertiesPage::at_end () const -{ - return (m_index == m_selection_ptrs.size ()); -} - -void -ShapePropertiesPage::operator-- () -{ - --m_index; -} - -void -ShapePropertiesPage::operator++ () -{ - ++m_index; + return m_selection_ptrs [entry]->shape ().to_string (); // @@@ } void diff --git a/src/edt/edt/edtPropertiesPages.h b/src/edt/edt/edtPropertiesPages.h index 0172cd1c5..03c156fb2 100644 --- a/src/edt/edt/edtPropertiesPages.h +++ b/src/edt/edt/edtPropertiesPages.h @@ -49,12 +49,9 @@ public: ShapePropertiesPage (edt::Service *service, db::Manager *manager, QWidget *parent); ~ShapePropertiesPage (); - virtual void back (); - virtual void front (); - virtual bool at_begin () const; - virtual bool at_end () const; - virtual void operator-- (); - virtual void operator++ (); + virtual size_t count () const; + virtual void select_entries (const std::vector &entries); + virtual std::string description (size_t entry) const; virtual void leave (); protected: diff --git a/src/img/img/imgPropertiesPage.cc b/src/img/img/imgPropertiesPage.cc index 7107a0a90..09b11ed16 100644 --- a/src/img/img/imgPropertiesPage.cc +++ b/src/img/img/imgPropertiesPage.cc @@ -44,7 +44,7 @@ PropertiesPage::PropertiesPage (img::Service *service, db::Manager *manager, QWi : lay::PropertiesPage (parent, manager, service), mp_service (service), mp_direct_image (0) { mp_service->get_selection (m_selection); - m_pos = m_selection.begin (); + m_index = 0; mp_service->clear_highlights (); @@ -154,44 +154,24 @@ PropertiesPage::invalidate () } } -void -PropertiesPage::back () +size_t +PropertiesPage::count () const { - m_pos = m_selection.end (); + return m_selection.size (); +} + +void +PropertiesPage::select_entries (const std::vector &entries) +{ + tl_assert (entries.size () == 1); // @@@ + m_index = entries.front (); invalidate (); } -void -PropertiesPage::front () +std::string +PropertiesPage::description (size_t entry) const { - m_pos = m_selection.begin (); - invalidate (); -} - -bool -PropertiesPage::at_begin () const -{ - return (m_pos == m_selection.begin ()); -} - -bool -PropertiesPage::at_end () const -{ - return (m_pos == m_selection.end ()); -} - -void -PropertiesPage::operator-- () -{ - --m_pos; - invalidate (); -} - -void -PropertiesPage::operator++ () -{ - ++m_pos; - invalidate (); + return "image"; // @@@ } void @@ -378,11 +358,11 @@ PropertiesPage::update () if (mp_service) { - mp_service->highlight (std::distance (m_selection.begin (), m_pos)); + mp_service->highlight (m_index); // create a local copy in which we can apply modifications if (! mp_direct_image) { - const img::Object *image = dynamic_cast ((*m_pos)->ptr ()); + const img::Object *image = dynamic_cast (m_selection [m_index]->ptr ()); mp_direct_image = new img::Object (*image); } @@ -908,7 +888,7 @@ PropertiesPage::apply () mp_direct_image->set_data_mapping (dm); if (mp_service) { - mp_service->change_image (*m_pos, *mp_direct_image); + mp_service->change_image (m_selection [m_index], *mp_direct_image); } } diff --git a/src/img/img/imgPropertiesPage.h b/src/img/img/imgPropertiesPage.h index 797bedd86..4659009ab 100644 --- a/src/img/img/imgPropertiesPage.h +++ b/src/img/img/imgPropertiesPage.h @@ -50,12 +50,9 @@ public: PropertiesPage (QWidget *parent); ~PropertiesPage (); - virtual void back (); - virtual void front (); - virtual bool at_begin () const; - virtual bool at_end () const; - virtual void operator-- (); - virtual void operator++ (); + virtual size_t count () const; + virtual void select_entries (const std::vector &entries); + virtual std::string description (size_t entry) const; virtual void update (); virtual void leave (); virtual bool readonly (); @@ -91,7 +88,7 @@ private slots: private: std::vector m_selection; - std::vector ::iterator m_pos; + size_t m_index; img::Service *mp_service; img::Object *mp_direct_image; bool m_no_signals; diff --git a/src/laybasic/laybasic/layProperties.h b/src/laybasic/laybasic/layProperties.h index 07c6ffe98..605489b12 100644 --- a/src/laybasic/laybasic/layProperties.h +++ b/src/laybasic/laybasic/layProperties.h @@ -69,80 +69,33 @@ public: virtual ~PropertiesPage (); /** - * @brief Move the current pointer to the end of the selected objects list - * - * Must be implemented by the Editable function and must set the - * selected object pointer to past-the-end of the list. at_end () must - * return true after this. + * @brief Gets the number of entries represented by this page */ - virtual void back () = 0; + virtual size_t count () const = 0; /** - * @brief A helper function for the dialog that additionally reports - * if there are any elements in the selection + * @brief Selects the entries with the given indexes + * + * If multiple indexes are selected, the properties page shows + * all items with different values as "leave as is". Items with + * same value are shown with the given value. */ - bool back_checked () + virtual void select_entries (const std::vector &entries) = 0; + + /** + * @brief Convenience function to select a specific entry + */ + void select_entry (size_t entry) { - back (); - return ! at_begin (); + std::vector entries; + entries.push_back (entry); + select_entries (entries); } /** - * @brief Move the current pointer to the beginning of the selected objects list - * - * Must be implemented by the Editable function and must set the - * selected object pointer to the beginning of the list. at_begin () must - * return true after this. - * This method must return true, if there are any elements in the selection - * - i.e. operator++ () will be successful afterwards. + * @brief Gets a description text for the nth entry */ - virtual void front () = 0; - - /** - * @brief A helper function for the dialog that additionally reports - * if there are any elements in the selection - */ - bool front_checked () - { - front (); - return ! at_end (); - } - - /** - * @brief Tell if the current object references the first one - * - * Must be implemented by the Editable function and must return - * true if the current object is the first one - i.e. if an - * operator-- would render the status invalid. - * If no object is referenced, this method and at_end () must return true. - */ - virtual bool at_begin () const = 0; - - /** - * @brief Tell if the current object references past the last one - * - * If the current object pointer is past the end of the selected - * object space, - */ - virtual bool at_end () const = 0; - - /** - * @brief Step one element back - * - * This method is supposed to move the current pointer one position - * back. If at_begin () was true before, the result may be unpredictable. - * The dialog will call update () to update the display accordingly. - */ - virtual void operator-- () = 0; - - /** - * @brief Advance one element - * - * This method is supposed to move the current pointer one position - * forward. If at_end () was true before, the result may be unpredictable. - * The dialog will call update () to update the display accordingly. - */ - virtual void operator++ () = 0; + virtual std::string description (size_t entry) const = 0; /** * @brief Update the display @@ -176,7 +129,7 @@ public: /** * @brief Apply any changes to the current object * - * Apply any changes to the current object. If nothing was + * Apply any changes to the current objects. If nothing was * changed, the object may be left untouched. * The dialog will start a transaction on the manager object. */ @@ -187,6 +140,7 @@ public: /** * @brief Returns true, if the properties page supports "apply all" + * @@@ TODO: remove */ virtual bool can_apply_to_all () const { diff --git a/src/layui/layui/layPropertiesDialog.cc b/src/layui/layui/layPropertiesDialog.cc index 37e00cda9..02986a16f 100644 --- a/src/layui/layui/layPropertiesDialog.cc +++ b/src/layui/layui/layPropertiesDialog.cc @@ -38,7 +38,7 @@ namespace lay PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, lay::Editables *editables) : QDialog (0 /*parent*/), - mp_manager (manager), mp_editables (editables), m_index (-1), m_auto_applied (false), m_transaction_id (0) + mp_manager (manager), mp_editables (editables), m_index (-1), m_object_index (0), m_auto_applied (false), m_transaction_id (0) { mp_ui = new Ui::PropertiesDialog (); @@ -83,7 +83,7 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, // look for next usable editable while (m_index < int (mp_properties_pages.size ()) && - (m_index < 0 || mp_properties_pages [m_index] == 0 || mp_properties_pages [m_index]->at_end ())) { + (m_index < 0 || mp_properties_pages [m_index] == 0 || m_object_index >= int (mp_properties_pages [m_index]->count ()))) { ++m_index; } @@ -103,8 +103,9 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager, } else { mp_ui->next_button->setEnabled (any_next ()); - mp_properties_pages [m_index]->update (); 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_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 ()); @@ -152,21 +153,26 @@ BEGIN_PROTECTED } // advance the current entry - ++(*mp_properties_pages [m_index]); + ++m_object_index; // look for next usable editable if at end - if (mp_properties_pages [m_index]->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]->front_checked ())) { + (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; @@ -177,6 +183,7 @@ BEGIN_PROTECTED 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 (); END_PROTECTED @@ -195,25 +202,28 @@ BEGIN_PROTECTED } } - if (mp_properties_pages [m_index]->at_begin ()) { + 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]->back_checked ())) { + (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]); - + } // decrement the current entry - --(*mp_properties_pages [m_index]); + --m_object_index; --m_current_object; update_title (); @@ -223,6 +233,7 @@ BEGIN_PROTECTED 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 (); END_PROTECTED @@ -237,32 +248,31 @@ PropertiesDialog::update_title () bool PropertiesDialog::any_next () const { - // test-advance + // look for the next applicable page + // @@@ Pages should not be empty int index = m_index; - ++(*mp_properties_pages [index]); - if (mp_properties_pages [index]->at_end ()) { + if (m_object_index + 1 >= int (mp_properties_pages [index]->count ())) { ++index; - while (index < int (mp_properties_pages.size ()) && - (mp_properties_pages [index] == 0 || ! mp_properties_pages [index]->front_checked ())) { + while (index < int (mp_properties_pages.size ()) && + (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { ++index; } } // return true, if not at end - bool ret = (index < int (mp_properties_pages.size ())); - --(*mp_properties_pages [m_index]); - return ret; + return (index < int (mp_properties_pages.size ())); } bool PropertiesDialog::any_prev () const { - // test-decrement + // look for the next applicable page + // @@@ Pages should not be empty int index = m_index; - if (mp_properties_pages [index]->at_begin ()) { + if (m_object_index == 0) { --index; while (index >= 0 && - (mp_properties_pages [index] == 0 || ! mp_properties_pages [index]->back_checked ())) { + (mp_properties_pages [index] == 0 || mp_properties_pages [index]->count () == 0)) { --index; } } diff --git a/src/layui/layui/layPropertiesDialog.h b/src/layui/layui/layPropertiesDialog.h index 94fab9db2..583141a25 100644 --- a/src/layui/layui/layPropertiesDialog.h +++ b/src/layui/layui/layPropertiesDialog.h @@ -82,7 +82,7 @@ private: std::vector mp_properties_pages; db::Manager *mp_manager; lay::Editables *mp_editables; - int m_index; + int m_index, m_object_index; QStackedLayout *mp_stack; lay::MainWindow *mp_mw; size_t m_objects, m_current_object;