WIP: further development on selection tree on objects dialog

This commit is contained in:
Matthias Koefferlein 2022-10-07 00:44:12 +02:00
parent 56bdf3b2e0
commit 62e0d83b3a
20 changed files with 340 additions and 130 deletions

View File

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

View File

@ -46,6 +46,7 @@ public:
virtual size_t count () const;
virtual void select_entries (const std::vector<size_t> &entries);
virtual std::string description (size_t entry) const;
virtual std::string description () const;
virtual void update ();
virtual void leave ();
virtual bool readonly ();

View File

@ -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<lay::PropertiesPage *>
Service::properties_pages (db::Manager *manager, QWidget *parent)
{
return new PropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> pages;
pages.push_back (new PropertiesPage (this, manager, parent));
return pages;
}
#endif

View File

@ -350,7 +350,7 @@ public:
/**
* @brief Create the properties page
*/
virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent);
virtual std::vector<lay::PropertiesPage *> properties_pages (db::Manager *manager, QWidget *parent);
#endif
/**

View File

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

View File

@ -50,6 +50,7 @@ public:
virtual size_t count () const;
virtual void select_entries (const std::vector<size_t> &entries);
virtual std::string description (size_t entry) const;
virtual std::string description () const;
virtual void leave ();
private:

View File

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

View File

@ -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<size_t> &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<lay::ObjectInstPath> &new_sel);
protected:
std::string m_description;
std::vector<edt::Service::obj_iterator> m_selection_ptrs;
unsigned int m_index;
edt::Service *mp_service;

View File

@ -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<lay::PropertiesPage *>
PolygonService::properties_pages (db::Manager *manager, QWidget *parent)
{
return new edt::PolygonPropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> 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<lay::PropertiesPage *>
BoxService::properties_pages (db::Manager *manager, QWidget *parent)
{
return new edt::BoxPropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> 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<lay::PropertiesPage *>
TextService::properties_pages (db::Manager *manager, QWidget *parent)
{
return new edt::TextPropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> 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<lay::PropertiesPage *>
PathService::properties_pages (db::Manager *manager, QWidget *parent)
{
std::vector<lay::PropertiesPage *> 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<lay::PropertiesPage *>
InstService::properties_pages (db::Manager *manager, QWidget *parent)
{
return new edt::InstPropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> pages;
pages.push_back (new edt::InstPropertiesPage (this, manager, parent));
return pages;
}
#endif

View File

@ -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<lay::PropertiesPage *> 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<lay::PropertiesPage *> 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<lay::PropertiesPage *> 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<lay::PropertiesPage *> 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<lay::PropertiesPage *> 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);

View File

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

View File

@ -53,6 +53,7 @@ public:
virtual size_t count () const;
virtual void select_entries (const std::vector<size_t> &entries);
virtual std::string description (size_t entry) const;
virtual std::string description () const;
virtual void update ();
virtual void leave ();
virtual bool readonly ();

View File

@ -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<lay::PropertiesPage *>
Service::properties_pages (db::Manager *manager, QWidget *parent)
{
return new img::PropertiesPage (this, manager, parent);
std::vector<lay::PropertiesPage *> pages;
pages.push_back (new img::PropertiesPage (this, manager, parent));
return pages;
}
#endif

View File

@ -373,7 +373,7 @@ public:
/**
* @brief Create the properties page
*/
virtual lay::PropertiesPage *properties_page (db::Manager *manager, QWidget *parent);
virtual std::vector<lay::PropertiesPage *> properties_pages (db::Manager *manager, QWidget *parent);
#endif
/**

View File

@ -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<lay::PropertiesPage *> properties_pages (db::Manager * /*manager*/, QWidget * /*parent*/)
{
return 0;
return std::vector<lay::PropertiesPage *> ();
}
#endif

View File

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

View File

@ -6,43 +6,47 @@
<rect>
<x>0</x>
<y>0</y>
<width>601</width>
<height>391</height>
<width>828</width>
<height>567</height>
</rect>
</property>
<property name="windowTitle">
<string>Object Properties</string>
</property>
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="content_frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
<widget class="QFrame" name="content_frame">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</widget>
</item>
<item>

View File

@ -32,38 +32,146 @@
#include "ui_PropertiesDialog.h"
#include <QStackedLayout>
#include <QAbstractItemModel>
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

View File

@ -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<lay::PropertiesPage *> 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<lay::PropertiesPage *> &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 ();

View File

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