mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	 3cddc3484e
			
		
	
	
		3cddc3484e
		
	
	
	
	
		
			
			At first I tried doing this as a single "rect" property but I like the feel of the individual properties much better. :^)
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 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 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; }
 | |
| 
 | |
|     const VBProperty* property_by_name(const String&) const;
 | |
|     VBProperty* property_by_name(const String&);
 | |
| 
 | |
|     void for_each_property(Function<void(VBProperty&)>);
 | |
| 
 | |
|     VBWidgetPropertyModel& property_model() { return *m_property_model; }
 | |
| 
 | |
|     void synchronize_properties();
 | |
| 
 | |
| private:
 | |
|     VBWidget(VBWidgetType, VBForm&);
 | |
| 
 | |
|     VBWidgetType m_type { VBWidgetType::None };
 | |
|     VBForm& m_form;
 | |
|     GWidget* m_gwidget { nullptr };
 | |
|     Vector<OwnPtr<VBProperty>> m_properties;
 | |
|     Retained<VBWidgetPropertyModel> m_property_model;
 | |
| };
 |