mirror of https://github.com/KLayout/klayout.git
WIP: further development on selection tree on objects dialog
This commit is contained in:
parent
56bdf3b2e0
commit
62e0d83b3a
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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 ()) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue