diff --git a/icons/valuetreeeditor.png b/icons/valuetreeeditor.png new file mode 100644 index 0000000..1dc3065 Binary files /dev/null and b/icons/valuetreeeditor.png differ diff --git a/libs/piqt_utils/pivaluetree_edit.cpp b/libs/piqt_utils/pivaluetree_edit.cpp index 5354136..ae02018 100644 --- a/libs/piqt_utils/pivaluetree_edit.cpp +++ b/libs/piqt_utils/pivaluetree_edit.cpp @@ -122,6 +122,18 @@ void PIValueTreeEdit::setReadOnly(bool yes) { } +void PIValueTreeEdit::setPermissions(Permissions p) { + perm = p; + applyPermissions(); +} + + +void PIValueTreeEdit::setPermission(Permission p, bool on) { + perm.setFlag(p, on); + applyPermissions(); +} + + void PIValueTreeEdit::rollback() { current = source; build(); @@ -261,6 +273,38 @@ void PIValueTreeEdit::applyValues() const { } +void PIValueTreeEdit::applyPermissions() { + auto * wp = widget_params; + wp->actionValue->setVisible(perm.testFlag(AddValue)); + wp->actionGroup->setVisible(perm.testFlag(AddGroup)); + wp->actionArray->setVisible(perm.testFlag(AddArray)); + wp->actionCut->setVisible(perm.testFlag(CanCut)); + wp->actionCopy->setVisible(perm.testFlag(CanCopy)); + wp->actionPaste->setVisible(perm.testFlag(CanPaste)); + wp->actionPasteAfter->setVisible(perm.testFlag(CanPaste)); + wp->actionPasteBefore->setVisible(perm.testFlag(CanPaste)); + wp->checkHidden->setVisible(perm.testFlag(ChangeHidden)); + wp->checkLabel->setVisible(perm.testFlag(ChangeLabel)); + wp->checkReadOnly->setVisible(perm.testFlag(ChangeReadOnly)); + wp->lineComment->setVisible(perm.testFlag(ChangeComment)); + wp->labelComment->setVisible(perm.testFlag(ChangeComment)); + wp->comboType->setVisible(perm.testFlag(ChangeType)); + wp->labelType->setVisible(perm.testFlag(ChangeType)); + wp->menu_grouping.menuAction()->setVisible(perm.testFlag(ChangeGrouping)); + wp->actionRename->setVisible(perm.testFlag(CanRename)); + wp->actionRemove->setVisible(perm.testFlag(CanRemove)); + wp->actionReorder->setVisible(perm.testFlag(CanReorder)); + for (auto * c: {wp->checkHidden, wp->checkLabel, wp->checkReadOnly}) + if (!c->isEnabled()) c->setChecked(false); + grid->button_add->setVisible( + PIVector({wp->actionValue, wp->actionGroup, wp->actionArray, wp->actionPaste}).any([](QAction * a) { + return a->isVisible(); + })); + for (auto c: tree_edits) + c.second->setPermissions(perm); +} + + void PIValueTreeEdit::actionRename(QToolButton * button, const PIString & vn) { PIString nn = Q2PIString(QInputDialog::getText(nullptr, tr("Rename"), tr("Input new name:"), QLineEdit::Normal, PI2QString(vn))); if (nn.isEmpty() || (nn == vn)) return; @@ -475,6 +519,7 @@ PIValueTreeEdit * PIValueTreeEdit::addTreeEdit(const PIValueTree & vt) { ve->m_read_only = m_read_only; ve->setGrouping((Grouping)vt.attribute(Attribute::grouping, PIVariantEditorBase::createGrouping()).toEnum().selectedValue()); ve->setFullEditMode(is_full_edit); + ve->setPermissions(permissions()); ve->setValue(vt); switch (cur_grouping) { case Indent: grid->add(vt, vt.name(), ve, vt.comment(), true); break; diff --git a/libs/piqt_utils/pivaluetree_edit.h b/libs/piqt_utils/pivaluetree_edit.h index 28c724c..1b76f69 100644 --- a/libs/piqt_utils/pivaluetree_edit.h +++ b/libs/piqt_utils/pivaluetree_edit.h @@ -40,7 +40,10 @@ class PIValueTreeEditArray; class QAD_PIQT_UTILS_EXPORT PIValueTreeEdit: public QWidget { Q_OBJECT - Q_ENUMS(Grouping) + Q_PROPERTY(Grouping grouping READ grouping WRITE setGrouping) + Q_PROPERTY(bool fullEditMode READ isFullEditMode WRITE setFullEditMode) + Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) + Q_PROPERTY(Permissions permissions READ permissions WRITE setPermissions) public: PIValueTreeEdit(QWidget * parent = nullptr); @@ -51,17 +54,46 @@ public: Groups, Tabs }; + Q_ENUM(Grouping) + + enum Permission { + AddValue = 0x1, + AddGroup = 0x2, + AddArray = 0x4, + ChangeHidden = 0x8, + ChangeLabel = 0x10, + ChangeReadOnly = 0x20, + ChangeComment = 0x40, + ChangeType = 0x80, + ChangeGrouping = 0x100, + CanCut = 0x200, + CanCopy = 0x400, + CanPaste = 0x800, + CanRename = 0x1000, + CanRemove = 0x2000, + CanReorder = 0x4000, + PermissionsAll = 0xFFFFFFFF + }; + Q_ENUM(Permission) + Q_DECLARE_FLAGS(Permissions, Permission) + Q_FLAG(Permissions) void setValue(const PIValueTree & v); PIValueTree value() const; Grouping grouping() const { return cur_grouping; } void setGrouping(Grouping g); + bool isFullEditMode() const { return is_full_edit; } void setFullEditMode(bool yes); + bool isReadOnly() const { return m_read_only; } void setReadOnly(bool yes); + Permissions permissions() const { return perm; } + void setPermissions(Permissions p); + void setPermission(Permission p, bool on); + void setAllowedNamesFunction(std::function f) { allowed_names = f; } void setValueForNameFunction(std::function f) { value_by_name = f; } @@ -81,6 +113,7 @@ private: void removeAll(); void build(); void applyValues() const; + void applyPermissions(); void actionRename(QToolButton * button, const PIString & vn); void actionRemove(QToolButton * button, const PIString & vn); void actionChange(QToolButton * button, const PIString & vn); @@ -145,10 +178,11 @@ private: PIMap value_edits; PIMap tree_edits; PIMap comm_labels, label_labels; - QTabWidget * tab_widget = nullptr; + QTabWidget * tab_widget = nullptr; Ui::PIValueTreeEditArray * ui_array = nullptr; - GridWidgets * grid = nullptr; - Grouping cur_grouping = Groups; + GridWidgets * grid = nullptr; + Grouping cur_grouping = Groups; + Permissions perm = PermissionsAll; mutable PIValueTree source, current; bool is_full_edit = false, m_read_only = false; std::function allowed_names; diff --git a/libs/piqt_utils/pivaluetree_edit_parameters.ui b/libs/piqt_utils/pivaluetree_edit_parameters.ui index 74f2466..90d46ab 100644 --- a/libs/piqt_utils/pivaluetree_edit_parameters.ui +++ b/libs/piqt_utils/pivaluetree_edit_parameters.ui @@ -38,7 +38,7 @@ - + Type: @@ -48,7 +48,7 @@ - + Comment: diff --git a/libs/piqt_utils/plugin/CMakeLists.txt b/libs/piqt_utils/plugin/CMakeLists.txt new file mode 100644 index 0000000..a9ecba7 --- /dev/null +++ b/libs/piqt_utils/plugin/CMakeLists.txt @@ -0,0 +1 @@ +qad_plugin(piqt_utils "Gui;Widgets" "") diff --git a/libs/piqt_utils/plugin/pivaluetree_edit_plugin.cpp b/libs/piqt_utils/plugin/pivaluetree_edit_plugin.cpp new file mode 100644 index 0000000..a257051 --- /dev/null +++ b/libs/piqt_utils/plugin/pivaluetree_edit_plugin.cpp @@ -0,0 +1,70 @@ +#include "pivaluetree_edit_plugin.h" + +#include "pivaluetree_edit.h" + +#include + + +PIValueTreeEditPlugin::PIValueTreeEditPlugin(QObject * parent): QObject(parent) { + m_initialized = m_designer = false; +} + + +void PIValueTreeEditPlugin::initialize(QDesignerFormEditorInterface * /* core */) { + m_designer = true; + if (m_initialized) return; + + // Add extension registrations, etc. here + + m_initialized = true; +} + + +bool PIValueTreeEditPlugin::isInitialized() const { + return m_initialized; +} + + +QWidget * PIValueTreeEditPlugin::createWidget(QWidget * parent) { + return new PIValueTreeEdit(parent); +} + + +QString PIValueTreeEditPlugin::name() const { + return QLatin1String("PIValueTreeEdit"); +} + + +QString PIValueTreeEditPlugin::group() const { + return QLatin1String("Editor Widgets"); +} + + +QIcon PIValueTreeEditPlugin::icon() const { + return QIcon(":/icons/valuetreeeditor.png"); +} + + +QString PIValueTreeEditPlugin::toolTip() const { + return QLatin1String(""); // QLatin1String("Widget for display any math graphics with grid and navigation"); +} + + +QString PIValueTreeEditPlugin::whatsThis() const { + return QLatin1String(""); +} + + +bool PIValueTreeEditPlugin::isContainer() const { + return false; +} + + +QString PIValueTreeEditPlugin::domXml() const { + return QLatin1String("\n\n"); +} + + +QString PIValueTreeEditPlugin::includeFile() const { + return QLatin1String("pivaluetree_edit.h"); +} diff --git a/libs/piqt_utils/plugin/pivaluetree_edit_plugin.h b/libs/piqt_utils/plugin/pivaluetree_edit_plugin.h new file mode 100644 index 0000000..9128818 --- /dev/null +++ b/libs/piqt_utils/plugin/pivaluetree_edit_plugin.h @@ -0,0 +1,36 @@ +#ifndef pivaluetree_edit_plugin_H +#define pivaluetree_edit_plugin_H + +#include +#if QT_VERSION >= 0x050000 +# include +#else +# include +#endif + +class PIValueTreeEditPlugin + : public QObject + , public QDesignerCustomWidgetInterface { + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + PIValueTreeEditPlugin(QObject * parent = 0); + + bool isContainer() const; + bool isInitialized() const; + QIcon icon() const; + QString domXml() const; + QString group() const; + QString includeFile() const; + QString name() const; + QString toolTip() const; + QString whatsThis() const; + QWidget * createWidget(QWidget * parent); + void initialize(QDesignerFormEditorInterface * core); + +private: + bool m_initialized, m_designer; +}; + +#endif diff --git a/libs/piqt_utils/plugin/qad_piqt_utils.cpp b/libs/piqt_utils/plugin/qad_piqt_utils.cpp new file mode 100644 index 0000000..ba999e3 --- /dev/null +++ b/libs/piqt_utils/plugin/qad_piqt_utils.cpp @@ -0,0 +1,17 @@ +#include "qad_piqt_utils.h" + +#include "pivaluetree_edit_plugin.h" + +QADPiQtUtils::QADPiQtUtils(QObject * parent): QObject(parent) { + m_widgets.append(new PIValueTreeEditPlugin(this)); +} + + +QList QADPiQtUtils::customWidgets() const { + return m_widgets; +} + + +#if QT_VERSION < 0x050000 +Q_EXPORT_PLUGIN2(qad_piqt_utils_plugin, QADPiQtUtils) +#endif diff --git a/libs/piqt_utils/plugin/qad_piqt_utils.h b/libs/piqt_utils/plugin/qad_piqt_utils.h new file mode 100644 index 0000000..28189b3 --- /dev/null +++ b/libs/piqt_utils/plugin/qad_piqt_utils.h @@ -0,0 +1,24 @@ +#ifndef qad_piqt_utils_H +#define qad_piqt_utils_H + +#include +#include + +class QADPiQtUtils + : public QObject + , public QDesignerCustomWidgetCollectionInterface { + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) +#if QT_VERSION >= 0x050000 + Q_PLUGIN_METADATA(IID "qad.piqt_utils") +#endif + +public: + explicit QADPiQtUtils(QObject * parent = 0); + virtual QList customWidgets() const; + +private: + QList m_widgets; +}; + +#endif diff --git a/libs/piqt_utils/qad_piqt_widgets.qrc b/libs/piqt_utils/qad_piqt_widgets.qrc index 98468f6..21dc5bf 100644 --- a/libs/piqt_utils/qad_piqt_widgets.qrc +++ b/libs/piqt_utils/qad_piqt_widgets.qrc @@ -13,5 +13,6 @@ ../../icons/document-edit.png ../../icons/layer-visible-off.png ../../icons/layer-visible-on.png + ../../icons/valuetreeeditor.png