From f57e2eabe0a10c9732c83532e01654a499fb8dcf Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Mon, 21 Jun 2021 17:47:13 -0400 Subject: many, many changes; settings is broken --- src/user/include/cxx/raleigh/d/dialog.h | 14 ++++-- src/user/include/cxx/raleigh/s/text_flower.h | 40 +++++++++++++++++ src/user/include/cxx/raleigh/util.h | 4 ++ src/user/include/cxx/raleigh/w/entry.h | 67 ++++++++++++---------------- src/user/include/cxx/raleigh/w/label.h | 16 +++++-- src/user/include/cxx/raleigh/widget.h | 2 +- src/user/include/cxx/raleigh/window.h | 2 +- src/user/include/cxx/structs/alist.h | 63 ++++++++++++++++++++++---- src/user/include/cxx/structs/duple.h | 1 + src/user/include/cxx/structs/map.h | 7 +-- 10 files changed, 153 insertions(+), 63 deletions(-) create mode 100644 src/user/include/cxx/raleigh/s/text_flower.h (limited to 'src/user/include/cxx') diff --git a/src/user/include/cxx/raleigh/d/dialog.h b/src/user/include/cxx/raleigh/d/dialog.h index f207033..1712b03 100644 --- a/src/user/include/cxx/raleigh/d/dialog.h +++ b/src/user/include/cxx/raleigh/d/dialog.h @@ -14,15 +14,21 @@ namespace raleigh { YES, NO, CANCEL, - RETRY + RETRY, + OKAY }; - extern alist> &yes_no_cancel; - extern alist> &yes_no_retry; + + typedef alist> button_list; + extern button_list &yes_no_cancel; + extern button_list &yes_no_retry; + extern button_list &okay_cancel; + extern button_list &okay; + class dialog : public window { public: //button names are copied //alist isn't needed past constructor - dialog(widget &top_part, alist> buttons); + dialog(widget &top_part, button_list buttons); //zero means not set yet diag_result_t result; diff --git a/src/user/include/cxx/raleigh/s/text_flower.h b/src/user/include/cxx/raleigh/s/text_flower.h new file mode 100644 index 0000000..f5cfcca --- /dev/null +++ b/src/user/include/cxx/raleigh/s/text_flower.h @@ -0,0 +1,40 @@ +#ifndef RALEIGH_S_TEXT_FLOWER_H +#define RALEIGH_S_TEXT_FLOWER_H + +#include +#include + +namespace raleigh { + class text_flower { + public: + //max_rows or cols 0 means no limit + //s is not copied + text_flower(const char *s, uint32_t cols=50, uint32_t max_rows=0); + + uint32_t get_n_lines() __attribute__ ((pure)); + //not a copy + char *get_nth_line(uint32_t n) __attribute__ ((pure)); + uint32_t get_line_offset(uint32_t n) __attribute__ ((pure)); + + void draw_text(_pixel_t *start, uint32_t pitch, const struct font_info *fi, _pixel_t color); + void flow_text(); + + //call flow_text after any changes + const char *s; + + private: + alist lines; + alist offsets; + + uint32_t max_rows; + uint32_t cols; + + //for use inside flow_text + const char *on_char; + const char *line_start; + uint32_t row_len; + void push_line(); + }; +} + +#endif \ No newline at end of file diff --git a/src/user/include/cxx/raleigh/util.h b/src/user/include/cxx/raleigh/util.h index 9142b69..c366e80 100644 --- a/src/user/include/cxx/raleigh/util.h +++ b/src/user/include/cxx/raleigh/util.h @@ -5,6 +5,9 @@ #define RGB(R, G, B) ((_pixel_t){.r = 0x##R, .g = 0x##G, .b = 0x##B}) +#define RALEIGH_FG RGB(00, 00, 00) +#define RALEIGH_BG RGB(bf, bf, bf) + namespace raleigh { struct coord { uint32_t x; @@ -14,6 +17,7 @@ namespace raleigh { }; void show_error_and_quitf(const char *fmt, ...) __attribute__ ((noreturn)); + void show_error_popup_and_quitf(const char *fmt, ...) __attribute__ ((noreturn)); } #endif \ No newline at end of file diff --git a/src/user/include/cxx/raleigh/w/entry.h b/src/user/include/cxx/raleigh/w/entry.h index c86b281..cc797b0 100644 --- a/src/user/include/cxx/raleigh/w/entry.h +++ b/src/user/include/cxx/raleigh/w/entry.h @@ -1,72 +1,61 @@ #ifndef RALEIGH_W_ENTRY_H #define RALEIGH_W_ENTRY_H +#include #include #include namespace raleigh { class entry : public widget { public: - //default_text's data is copied, so it's okay if it changes or if the memory is freed entry(uint32_t rows=25, uint32_t cols=25, const char *default_text="", - const char *font="fixed-10", _pixel_t bg=RGB(ff, ff, ff), + const struct font_info *fi=get_font("fixed-10"), _pixel_t bg=RGB(ff, ff, ff), _pixel_t fg=RGB(00, 00, 00), _pixel_t border_color=RGB(00, 00, 00)); //not a copy - const char *get_contents(); - //s's data is copied + const char *get_contents() __attribute__ ((pure)); + //s is copied void set_contents(const char *s); - void notify_window_change() override; void paint(_pixel_t *pixbuf, uint32_t pitch) override; - void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override; void notify_has_opaque_parent(widget *parent) override; + void handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) override; void handle_key(struct key_packet kp) override; void on_focus() override; void on_unfocus() override; + private: + const struct font_info *fi; + _pixel_t border_color; + _pixel_t fg; + _pixel_t bg; uint32_t rows; uint32_t cols; - _pixel_t bg; - _pixel_t fg; - _pixel_t border_color; - struct font_info *fi; - char *data; - //line_indices[end_y + 1] == end_d - uint32_t *line_indices; + void left(); + void right(); + void up(); + void down(); - uint32_t cur_y; - uint32_t cur_x; - uint32_t cur_d; + void check_y(); + void check_x(); - //the row of the last character - uint32_t end_y; - //the column after the last character - uint32_t end_x; - //the index of the null terminator - uint32_t end_d; + void on_text_change(); + void on_cursor_change(); - bool has_focus; - bool had_focus_last_paint; - bool text_changed_since_last_paint; - uint32_t cur_y_last_paint; - uint32_t cur_x_last_paint; - uint32_t cur_d_last_paint; + alist text_back; + text_flower flower; - //uses cur_x, not cur_d; sets both - //will not modify cur_y - void ensure_cursor_in_line(); + bool text_change; + bool cursor_change; - void paint_text(_pixel_t *pixbuf, uint32_t pitch); - //sets line_indices[from_y + 1 .. end_y + 1], end_y, end_x and end_d - void get_indices(uint32_t from_y, uint32_t from_x, uint32_t from_d); + bool was_cur_before; + uint32_t old_cur_x; + uint32_t old_cur_y; - //these four return true on success, and do not send a paint request to the window - bool cursor_left(); - bool cursor_right(); - bool cursor_up(); - bool cursor_down(); + bool is_cur; + uint32_t cur_x; + uint32_t cur_y; }; } diff --git a/src/user/include/cxx/raleigh/w/label.h b/src/user/include/cxx/raleigh/w/label.h index a78ce46..ebc6890 100644 --- a/src/user/include/cxx/raleigh/w/label.h +++ b/src/user/include/cxx/raleigh/w/label.h @@ -1,6 +1,7 @@ #ifndef RALEIGH_W_LABEL_H #define RALEIGH_W_LABEL_H +#include #include #include @@ -8,20 +9,27 @@ namespace raleigh { class label : public widget { public: //value's data is copied - 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)); + label(const char *value, const char *font="fixed-10", + uint32_t cols=0, bool bg_transparent=true, + _pixel_t fg=RALEIGH_FG, _pixel_t bg=RALEIGH_BG); + ~label(); + + //new_value's data is copied void change_value(const char *new_value); void paint(_pixel_t *pixbuf, uint32_t pitch) override; void notify_has_opaque_parent(widget *parent) override; private: - char *value; - uint32_t v_size; const struct font_info *const fi; + uint32_t cols; bool bg_transparent; const _pixel_t fg; const _pixel_t bg; + + text_flower tf; + + coord determine_size(); }; } diff --git a/src/user/include/cxx/raleigh/widget.h b/src/user/include/cxx/raleigh/widget.h index b53718a..cbd499c 100644 --- a/src/user/include/cxx/raleigh/widget.h +++ b/src/user/include/cxx/raleigh/widget.h @@ -12,7 +12,7 @@ namespace raleigh { namespace raleigh { class widget { public: - //these three are set by window class (or parent widget) + //these four are set by window class (or parent widget) widget *parent;//set to zero when root widget window *w; coord window_offset; diff --git a/src/user/include/cxx/raleigh/window.h b/src/user/include/cxx/raleigh/window.h index 3448536..63a3786 100644 --- a/src/user/include/cxx/raleigh/window.h +++ b/src/user/include/cxx/raleigh/window.h @@ -20,7 +20,7 @@ namespace raleigh { friend void start_runtime(); public: //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_tag_t)=0, window_tag_t tag=0); + window(widget &root, _pixel_t bg_color=RALEIGH_BG, bool (*on_close)(window_tag_t)=0, window_tag_t tag=0); void add_keybind(struct key_packet kp, void (*handler)(window_tag_t)); void notify_needs_paint(widget &from); diff --git a/src/user/include/cxx/structs/alist.h b/src/user/include/cxx/structs/alist.h index 050f775..13a24c4 100644 --- a/src/user/include/cxx/structs/alist.h +++ b/src/user/include/cxx/structs/alist.h @@ -15,20 +15,67 @@ public: uint32_t expand_by; data *buf; - alist(uint32_t default_size=10, uint32_t expand_by=10) + alist(uint32_t default_size = 10, uint32_t expand_by = 10) : n_entries(0), buf_size(default_size), expand_by(expand_by), - buf((data *)get_block(default_size * sizeof(data))) {} + buf(new data[default_size]) {} + + //from is copied + alist(const data *from, uint32_t count, uint32_t extra_size = 10, uint32_t expand_by = 10) + : n_entries(count), buf_size(count + extra_size), expand_by(expand_by), + buf(new data[count + extra_size]) { + for (uint32_t i = 0; i < count; ++i) + buf[i] = from[i]; + } + + ~alist() { + delete[] buf; + } + + void copy_from(const data *from, uint32_t count) { + expand_to(count); + n_entries = count; + for (uint32_t i = 0; i < count; ++i) + buf[i] = from[i]; + } + + void expand_to(uint32_t size) { + if (size <= buf_size) + return; + data *const new_buf = new data[size * sizeof(data)]; + for (uint32_t i = 0; i < buf_size; ++i) + new_buf[i] = buf[i]; + delete[] buf; + buf = new_buf; + buf_size = size; + } + + void copy_from(const alist &other) { + expand_to(n_entries = other.n_entries); + for (uint32_t i = 0; i < n_entries; ++i) + buf[i] = other.buf[i]; + } void add_back(data d) { - if (n_entries == buf_size) { - data *const new_buf = (data *)get_block((buf_size += expand_by) * sizeof(data)); - blockcpy(new_buf, buf, n_entries * sizeof(data)); - free_block(buf); - buf = new_buf; - } + if (n_entries == buf_size) + expand_to(buf_size + expand_by); buf[n_entries++] = d; } + void insert(uint32_t i, data d) { + if (n_entries == buf_size) + expand_to(buf_size + expand_by); + for (uint32_t n = n_entries; n > i; --n) + buf[n] = buf[n - 1]; + buf[i] = d; + ++n_entries; + } + + void remove(uint32_t i) { + --n_entries; + for (uint32_t n = i; n < n_entries; ++n) + buf[n] = buf[n + 1]; + } + //returns -1 if not found uint32_t index_of(data d) { for (uint32_t i = 0; i < n_entries; ++i) diff --git a/src/user/include/cxx/structs/duple.h b/src/user/include/cxx/structs/duple.h index 874e4f6..0b23c92 100644 --- a/src/user/include/cxx/structs/duple.h +++ b/src/user/include/cxx/structs/duple.h @@ -4,6 +4,7 @@ template class duple { public: + duple() : a(), b() {} duple(at a, bt b) : a(a), b(b) {} at a; diff --git a/src/user/include/cxx/structs/map.h b/src/user/include/cxx/structs/map.h index f9c477f..311bfa9 100644 --- a/src/user/include/cxx/structs/map.h +++ b/src/user/include/cxx/structs/map.h @@ -3,12 +3,7 @@ #include -template -bool default_equals(type a, type b) { - return a == b; -} - -template> +template class map { public: alist keys; -- cgit v1.2.3