From 3cddc3484e89c3a8c5226989785565c0824e6590 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 11 Apr 2019 22:54:04 +0200 Subject: [PATCH] VisualBuilder: Add [x, y, width, height] properties for all widgets. At first I tried doing this as a single "rect" property but I like the feel of the individual properties much better. :^) --- Applications/VisualBuilder/VBProperty.h | 1 + Applications/VisualBuilder/VBWidget.cpp | 22 +++++++++++++++++++ Applications/VisualBuilder/VBWidget.h | 5 +++-- .../VisualBuilder/VBWidgetPropertyModel.h | 2 +- .../VisualBuilder/VBWidgetRegistry.cpp | 7 ++++-- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Applications/VisualBuilder/VBProperty.h b/Applications/VisualBuilder/VBProperty.h index 25df176ce3..9825e78fb9 100644 --- a/Applications/VisualBuilder/VBProperty.h +++ b/Applications/VisualBuilder/VBProperty.h @@ -10,6 +10,7 @@ public: String name() const { return m_name; } const GVariant& value() const { return m_value; } + void set_value(const GVariant& value) { m_value = value; } bool is_readonly() const { return m_readonly; } void set_readonly(bool b) { m_readonly = b; } diff --git a/Applications/VisualBuilder/VBWidget.cpp b/Applications/VisualBuilder/VBWidget.cpp index 42b986d37b..4ff797462e 100644 --- a/Applications/VisualBuilder/VBWidget.cpp +++ b/Applications/VisualBuilder/VBWidget.cpp @@ -24,7 +24,10 @@ Rect VBWidget::rect() const void VBWidget::set_rect(const Rect& rect) { + if (rect == m_gwidget->relative_rect()) + return; m_gwidget->set_relative_rect(rect); + synchronize_properties(); } bool VBWidget::is_selected() const @@ -74,3 +77,22 @@ void VBWidget::for_each_property(Function callback) callback(*it); } } + +void VBWidget::synchronize_properties() +{ + property_by_name("width")->set_value(m_gwidget->width()); + property_by_name("height")->set_value(m_gwidget->height()); + property_by_name("x")->set_value(m_gwidget->x()); + property_by_name("y")->set_value(m_gwidget->y()); + + m_property_model->update(); +} + +VBProperty* VBWidget::property_by_name(const String& name) +{ + for (auto& property : m_properties) { + if (property->name() == name) + return property.ptr(); + } + return nullptr; +} diff --git a/Applications/VisualBuilder/VBWidget.h b/Applications/VisualBuilder/VBWidget.h index 9abeb9e8c7..561057d647 100644 --- a/Applications/VisualBuilder/VBWidget.h +++ b/Applications/VisualBuilder/VBWidget.h @@ -51,10 +51,11 @@ public: VBWidgetPropertyModel& property_model() { return *m_property_model; } -protected: - VBWidget(VBWidgetType, VBForm&); + void synchronize_properties(); private: + VBWidget(VBWidgetType, VBForm&); + VBWidgetType m_type { VBWidgetType::None }; VBForm& m_form; GWidget* m_gwidget { nullptr }; diff --git a/Applications/VisualBuilder/VBWidgetPropertyModel.h b/Applications/VisualBuilder/VBWidgetPropertyModel.h index 4b712e9660..0d7ee5909b 100644 --- a/Applications/VisualBuilder/VBWidgetPropertyModel.h +++ b/Applications/VisualBuilder/VBWidgetPropertyModel.h @@ -21,7 +21,7 @@ public: virtual String column_name(int column) const override; virtual ColumnMetadata column_metadata(int column) const override; virtual GVariant data(const GModelIndex&, Role = Role::Display) const override; - virtual void update() override { } + virtual void update() override { did_update(); } private: explicit VBWidgetPropertyModel(VBWidget&); diff --git a/Applications/VisualBuilder/VBWidgetRegistry.cpp b/Applications/VisualBuilder/VBWidgetRegistry.cpp index 5082706794..2b5722bc21 100644 --- a/Applications/VisualBuilder/VBWidgetRegistry.cpp +++ b/Applications/VisualBuilder/VBWidgetRegistry.cpp @@ -73,15 +73,18 @@ static GWidget* build_gwidget(VBWidgetType type, GWidget* parent) } } - GWidget* VBWidgetRegistry::build_gwidget(VBWidgetType type, GWidget* parent, Vector>& properties) { auto* gwidget = ::build_gwidget(type, parent); - auto add_property = [&properties] (const String& name, const GVariant& value, bool is_readonly) { + auto add_property = [&properties] (const String& name, const GVariant& value = { }, bool is_readonly = false) { auto property = make(name, value); property->set_readonly(is_readonly); properties.append(move(property)); }; add_property("class", to_class_name(type), true); + add_property("width"); + add_property("height"); + add_property("x"); + add_property("y"); return gwidget; }