diff --git a/Libraries/LibGUI/GRadioButton.cpp b/Libraries/LibGUI/GRadioButton.cpp index 9c488f6ffa..48eac5720a 100644 --- a/Libraries/LibGUI/GRadioButton.cpp +++ b/Libraries/LibGUI/GRadioButton.cpp @@ -1,12 +1,17 @@ +#include #include #include -#include static RefPtr s_unfilled_circle_bitmap; static RefPtr s_filled_circle_bitmap; static RefPtr s_changing_filled_circle_bitmap; static RefPtr s_changing_unfilled_circle_bitmap; +GRadioButton::GRadioButton(GWidget* parent) + : GRadioButton({}, parent) +{ +} + GRadioButton::GRadioButton(const StringView& text, GWidget* parent) : GAbstractButton(text, parent) { diff --git a/Libraries/LibGUI/GRadioButton.h b/Libraries/LibGUI/GRadioButton.h index 9a15c6b57b..5595605ea2 100644 --- a/Libraries/LibGUI/GRadioButton.h +++ b/Libraries/LibGUI/GRadioButton.h @@ -10,7 +10,8 @@ public: virtual void click() override; protected: - GRadioButton(const StringView& text, GWidget* parent); + explicit GRadioButton(GWidget* parent); + explicit GRadioButton(const StringView& text, GWidget* parent); virtual void paint_event(GPaintEvent&) override; private: diff --git a/Libraries/LibGUI/GScrollBar.cpp b/Libraries/LibGUI/GScrollBar.cpp index 6df7569dce..d9fe40bcc7 100644 --- a/Libraries/LibGUI/GScrollBar.cpp +++ b/Libraries/LibGUI/GScrollBar.cpp @@ -1,8 +1,8 @@ -#include -#include #include #include #include +#include +#include static const char* s_up_arrow_bitmap_data = { " " @@ -57,6 +57,11 @@ static CharacterBitmap* s_down_arrow_bitmap; static CharacterBitmap* s_left_arrow_bitmap; static CharacterBitmap* s_right_arrow_bitmap; +GScrollBar::GScrollBar(GWidget* parent) + : GScrollBar(Orientation::Vertical, parent) +{ +} + GScrollBar::GScrollBar(Orientation orientation, GWidget* parent) : GWidget(parent) , m_orientation(orientation) @@ -239,7 +244,7 @@ void GScrollBar::mousedown_event(GMouseEvent& event) return; } if (has_scrubber() && scrubber_rect().contains(event.position())) { - m_scrubber_in_use = true; + m_scrubber_in_use = true; m_scrubbing = true; m_scrub_start_value = value(); m_scrub_origin = event.position(); diff --git a/Libraries/LibGUI/GScrollBar.h b/Libraries/LibGUI/GScrollBar.h index 4a3ba0b908..3d13841b1b 100644 --- a/Libraries/LibGUI/GScrollBar.h +++ b/Libraries/LibGUI/GScrollBar.h @@ -38,6 +38,7 @@ public: }; private: + explicit GScrollBar(GWidget* parent); explicit GScrollBar(Orientation, GWidget* parent); virtual void paint_event(GPaintEvent&) override; diff --git a/Libraries/LibGUI/GSlider.cpp b/Libraries/LibGUI/GSlider.cpp index ea1eddbc6f..730b1d27ad 100755 --- a/Libraries/LibGUI/GSlider.cpp +++ b/Libraries/LibGUI/GSlider.cpp @@ -2,6 +2,11 @@ #include #include +GSlider::GSlider(GWidget* parent) + : GSlider(Orientation::Horizontal, parent) +{ +} + GSlider::GSlider(Orientation orientation, GWidget* parent) : GWidget(parent) , m_orientation(orientation) diff --git a/Libraries/LibGUI/GSlider.h b/Libraries/LibGUI/GSlider.h index aaa01779ed..abfa95498a 100755 --- a/Libraries/LibGUI/GSlider.h +++ b/Libraries/LibGUI/GSlider.h @@ -44,7 +44,8 @@ public: Function on_value_changed; protected: - GSlider(Orientation, GWidget*); + explicit GSlider(GWidget*); + explicit GSlider(Orientation, GWidget*); virtual void paint_event(GPaintEvent&) override; virtual void mousedown_event(GMouseEvent&) override; diff --git a/Libraries/LibGUI/GTextEditor.cpp b/Libraries/LibGUI/GTextEditor.cpp index 39fd42cfa8..8842f00f37 100644 --- a/Libraries/LibGUI/GTextEditor.cpp +++ b/Libraries/LibGUI/GTextEditor.cpp @@ -15,6 +15,11 @@ //#define DEBUG_GTEXTEDITOR +GTextEditor::GTextEditor(GWidget* parent) + : GTextEditor(Type::MultiLine, parent) +{ +} + GTextEditor::GTextEditor(Type type, GWidget* parent) : GScrollableWidget(parent) , m_type(type) diff --git a/Libraries/LibGUI/GTextEditor.h b/Libraries/LibGUI/GTextEditor.h index 8012aad532..bfb443f21f 100644 --- a/Libraries/LibGUI/GTextEditor.h +++ b/Libraries/LibGUI/GTextEditor.h @@ -102,7 +102,8 @@ public: void set_cursor(const GTextPosition&); protected: - GTextEditor(Type, GWidget* parent); + explicit GTextEditor(GWidget* parent); + explicit GTextEditor(Type, GWidget* parent); virtual void did_change_font() override; virtual void paint_event(GPaintEvent&) override; diff --git a/Libraries/LibGUI/GWidget.cpp b/Libraries/LibGUI/GWidget.cpp index 4e7eff78df..7ea80e4c79 100644 --- a/Libraries/LibGUI/GWidget.cpp +++ b/Libraries/LibGUI/GWidget.cpp @@ -12,6 +12,59 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +REGISTER_GWIDGET(GButton) +REGISTER_GWIDGET(GCheckBox) +REGISTER_GWIDGET(GGroupBox) +REGISTER_GWIDGET(GLabel) +REGISTER_GWIDGET(GRadioButton) +REGISTER_GWIDGET(GScrollBar) +REGISTER_GWIDGET(GSlider) +REGISTER_GWIDGET(GSpinBox) +REGISTER_GWIDGET(GTextBox) +REGISTER_GWIDGET(GWidget) + +static HashMap& widget_classes() +{ + static HashMap* map; + if (!map) + map = new HashMap; + return *map; +} + +GWidgetClassRegistration::GWidgetClassRegistration(const String& class_name, Function(GWidget*)> factory) + : m_class_name(class_name) + , m_factory(move(factory)) +{ + widget_classes().set(class_name, this); +} + +GWidgetClassRegistration::~GWidgetClassRegistration() +{ + ASSERT_NOT_REACHED(); +} + +void GWidgetClassRegistration::for_each(Function callback) +{ + for (auto& it : widget_classes()) { + callback(*it.value); + } +} + +const GWidgetClassRegistration* GWidgetClassRegistration::find(const String& class_name) +{ + return widget_classes().get(class_name).value_or(nullptr); +} + GWidget::GWidget(GWidget* parent) : CObject(parent, true) , m_font(Font::default_font()) diff --git a/Libraries/LibGUI/GWidget.h b/Libraries/LibGUI/GWidget.h index b7acaa773b..870dc3dedb 100644 --- a/Libraries/LibGUI/GWidget.h +++ b/Libraries/LibGUI/GWidget.h @@ -1,8 +1,8 @@ #pragma once -#include #include #include +#include #include #include #include @@ -12,6 +12,10 @@ #include #include +#define REGISTER_GWIDGET(class_name) \ + extern GWidgetClassRegistration registration_##class_name; \ + GWidgetClassRegistration registration_##class_name(#class_name, [](GWidget* parent) { return class_name::construct(parent); }); + class GraphicsBitmap; class GAction; class GLayout; @@ -42,6 +46,26 @@ enum class VerticalDirection { Down }; +class GWidget; + +class GWidgetClassRegistration { + AK_MAKE_NONCOPYABLE(GWidgetClassRegistration) + AK_MAKE_NONMOVABLE(GWidgetClassRegistration) +public: + GWidgetClassRegistration(const String& class_name, Function(GWidget*)> factory); + ~GWidgetClassRegistration(); + + String class_name() const { return m_class_name; } + NonnullRefPtr construct(GWidget* parent) const { return m_factory(parent); } + + static void for_each(Function); + static const GWidgetClassRegistration* find(const String& class_name); + +private: + String m_class_name; + Function(GWidget*)> m_factory; +}; + class GWidget : public CObject { C_OBJECT(GWidget) public: