From 76e39eac8cee2175ec62a191f7c91ca53857e80c Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Fri, 5 Mar 2021 18:07:48 -0500 Subject: more raleigh, including button and vbox widgets --- src/user/include/cxx/raleigh/util.h | 16 ++++++++++------ src/user/include/cxx/raleigh/w/button.h | 26 ++++++++++++++++++++++++++ src/user/include/cxx/raleigh/w/label.h | 9 ++++++--- src/user/include/cxx/raleigh/w/padding.h | 7 ++++--- src/user/include/cxx/raleigh/w/vbox.h | 22 ++++++++++++++++++++++ src/user/include/cxx/raleigh/widget.h | 9 +++++++++ src/user/include/cxx/raleigh/window.h | 10 +++++++++- 7 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 src/user/include/cxx/raleigh/w/button.h create mode 100644 src/user/include/cxx/raleigh/w/vbox.h (limited to 'src/user/include/cxx') diff --git a/src/user/include/cxx/raleigh/util.h b/src/user/include/cxx/raleigh/util.h index d2ed13d..9142b69 100644 --- a/src/user/include/cxx/raleigh/util.h +++ b/src/user/include/cxx/raleigh/util.h @@ -5,11 +5,15 @@ #define RGB(R, G, B) ((_pixel_t){.r = 0x##R, .g = 0x##G, .b = 0x##B}) -struct coord { - uint32_t x; - uint32_t y; - coord(uint32_t x, uint32_t y); - coord(); -}; +namespace raleigh { + struct coord { + uint32_t x; + uint32_t y; + coord(uint32_t x, uint32_t y); + coord(); + }; + + void show_error_and_quitf(const char *fmt, ...) __attribute__ ((noreturn)); +} #endif \ No newline at end of file diff --git a/src/user/include/cxx/raleigh/w/button.h b/src/user/include/cxx/raleigh/w/button.h new file mode 100644 index 0000000..1847cf1 --- /dev/null +++ b/src/user/include/cxx/raleigh/w/button.h @@ -0,0 +1,26 @@ +#ifndef RALEIGH_W_BUTTON_H +#define RALEIGH_W_BUTTON_H + +#include + +namespace raleigh { + class button : public widget { + public: + button(widget &inner, void (*on_click)(button &), _pixel_t border_color=RGB(00, 00, 00), + _pixel_t bg_color=RGB(bf, bf, bf), _pixel_t pressed_color=RGB(9f, 9f, 9f)); + + void notify_window_change() override; + void paint(_pixel_t *pixbuf, uint32_t pitch) override; + bool try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override; + void notify_has_opaque_parent(widget *parent) override; + private: + widget &inner; + void (*on_click)(button &); + _pixel_t border_color; + _pixel_t bg_color; + _pixel_t pressed_color; + bool is_pressed; + }; +} + +#endif \ No newline at end of file diff --git a/src/user/include/cxx/raleigh/w/label.h b/src/user/include/cxx/raleigh/w/label.h index 51bf541..d133841 100644 --- a/src/user/include/cxx/raleigh/w/label.h +++ b/src/user/include/cxx/raleigh/w/label.h @@ -8,16 +8,19 @@ namespace raleigh { class label : public widget { public: //this pointer is used directly, and the contents of the string should not be changed afterward - label(const char *value, const char *font="fixed-10", - _pixel_t bg=RGB(bf, bf, bf), _pixel_t fg=RGB(00, 00, 00)); + label(const char *value, const char *font="fixed-10", bool bg_transparent=true, + _pixel_t fg=RGB(00, 00, 00), _pixel_t bg=RGB(bf, bf, bf)); void notify_window_change() override; void paint(_pixel_t *pixbuf, uint32_t pitch) override; + bool try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override __attribute__ ((const)); + void notify_has_opaque_parent(widget *parent) override; private: const char *const value; const struct font_info *const fi; - const _pixel_t bg; + bool bg_transparent; const _pixel_t fg; + const _pixel_t bg; }; } diff --git a/src/user/include/cxx/raleigh/w/padding.h b/src/user/include/cxx/raleigh/w/padding.h index 108cd28..216b984 100644 --- a/src/user/include/cxx/raleigh/w/padding.h +++ b/src/user/include/cxx/raleigh/w/padding.h @@ -6,14 +6,15 @@ namespace raleigh { class padding : public widget { public: - padding(uint32_t pad_by, _pixel_t color, widget &inner); + padding(widget &inner, uint32_t pad_by); void notify_window_change() override; void paint(_pixel_t *pixbuf, uint32_t pitch) override; + bool try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override; + void notify_has_opaque_parent(widget *parent) override; private: - uint32_t pad_by; - _pixel_t color; widget &inner; + uint32_t pad_by; }; } diff --git a/src/user/include/cxx/raleigh/w/vbox.h b/src/user/include/cxx/raleigh/w/vbox.h new file mode 100644 index 0000000..aead128 --- /dev/null +++ b/src/user/include/cxx/raleigh/w/vbox.h @@ -0,0 +1,22 @@ +#ifndef RALEIGH_W_VBOX_H +#define RALEIGH_W_VBOX_H + +#include +#include + +namespace raleigh { + class vbox : public widget { + public: + //do not modify this list afterward + vbox(dllist widgets); + + void notify_window_change() override; + void paint(_pixel_t *pixbuf, uint32_t pitch) override; + bool try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override; + void notify_has_opaque_parent(widget *parent) override; + private: + dllist widgets; + }; +} + +#endif \ No newline at end of file diff --git a/src/user/include/cxx/raleigh/widget.h b/src/user/include/cxx/raleigh/widget.h index 1839333..de6c5a4 100644 --- a/src/user/include/cxx/raleigh/widget.h +++ b/src/user/include/cxx/raleigh/widget.h @@ -18,9 +18,18 @@ namespace raleigh { window *w; coord window_offset; + //fewest steps up that a widget can be redrawn without needing its parents + //if a widget is opaque, it will set this to a pointer to itself, and then call + // notify_has_opaque_parent on any children, passing itself as an argument. + //in notify_has_opaque_parent's handler, it should set this if it isn't already set, + // and then call notify_has_opaque_parent on any children (with the opaque parent). + widget *closest_opaque; + //called by window class (or parent widget) virtual void notify_window_change() = 0; virtual void paint(_pixel_t *pixbuf, uint32_t pitch) = 0; + virtual bool try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) = 0; + virtual void notify_has_opaque_parent(widget *parent) = 0; }; } diff --git a/src/user/include/cxx/raleigh/window.h b/src/user/include/cxx/raleigh/window.h index 7e45e22..f82f9a9 100644 --- a/src/user/include/cxx/raleigh/window.h +++ b/src/user/include/cxx/raleigh/window.h @@ -5,22 +5,30 @@ namespace raleigh { class window; } +#include #include #include #include namespace raleigh { class window { + friend void start_runtime(); public: - window(widget &root); + //pass on_close to specify a close handler. if on_close returns false, the window will not be closed. + window(widget &root, _pixel_t bg_color=RGB(bf, bf, bf), bool (*on_close)(window &)=0); void notify_needs_paint(widget &from); enum try_actions_return_t {NONE, GOOD, DELETE}; try_actions_return_t try_actions(); + void show(); private: _window_handle_t handle; _pixel_t *pixbuf; coord size; widget &root; + _pixel_t bg_color; + bool needs_repaint; + void paint_full(); + bool (*on_close)(window &); }; } -- cgit v1.2.3