1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2026-01-20 09:30:59 +00:00
serenity/Applications/VisualBuilder/VBWidget.h
Andreas Kling 3a33b8ea08 VisualBuilder: Hook up everything needed for widget property editing.
It's now possible to edit widget properties inline in the properties window.
We're currently relying on the basic GVariant conversion functions to do
all the "parsing" but that's not gonna be good enough.
2019-04-19 01:05:59 +02:00

69 lines
1.8 KiB
C++

#pragma once
#include <SharedGraphics/Rect.h>
#include <AK/Retainable.h>
#include <AK/Retained.h>
#include <AK/Weakable.h>
#include <AK/HashMap.h>
#include <AK/Function.h>
#include "VBWidgetType.h"
class GPainter;
class GVariant;
class GWidget;
class VBForm;
class VBProperty;
class VBWidgetPropertyModel;
enum class Direction { None, Left, UpLeft, Up, UpRight, Right, DownRight, Down, DownLeft };
template<typename Callback>
inline void for_each_direction(Callback callback)
{
callback(Direction::Left);
callback(Direction::UpLeft);
callback(Direction::Up);
callback(Direction::UpRight);
callback(Direction::Right);
callback(Direction::DownRight);
callback(Direction::Down);
callback(Direction::DownLeft);
}
class VBWidget : public Retainable<VBWidget>, public Weakable<VBWidget> {
friend class VBWidgetPropertyModel;
public:
static Retained<VBWidget> create(VBWidgetType type, VBForm& form) { return adopt(*new VBWidget(type, form)); }
~VBWidget();
bool is_selected() const;
Rect rect() const;
void set_rect(const Rect&);
Rect grabber_rect(Direction) const;
Direction grabber_at(const Point&) const;
GWidget* gwidget() { return m_gwidget; }
VBProperty& property(const String&);
void for_each_property(Function<void(VBProperty&)>);
VBWidgetPropertyModel& property_model() { return *m_property_model; }
void setup_properties();
void synchronize_properties();
void property_did_change();
private:
VBWidget(VBWidgetType, VBForm&);
void add_property(const String& name, Function<GVariant(const GWidget&)>&& getter, Function<void(GWidget&, const GVariant&)>&& setter);
VBWidgetType m_type { VBWidgetType::None };
VBForm& m_form;
GWidget* m_gwidget { nullptr };
Vector<OwnPtr<VBProperty>> m_properties;
Retained<VBWidgetPropertyModel> m_property_model;
};