Skip to content

Commit a977285

Browse files
feat(js): flex grow, text max width
1 parent 867a205 commit a977285

File tree

8 files changed

+604
-1028
lines changed

8 files changed

+604
-1028
lines changed

dependencies/breeze-ui.lua

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ package("breeze-glfw")
44
add_versions("latest", "master")
55

66
package("breeze-ui")
7-
-- add_urls("https://github.com/std-microblock/breeze-ui.git")
8-
-- add_versions("2025.10.08+9", "2a84657f33791b33059405983ea5d9d4ea52094c")
9-
set_sourcedir("E:/breeze-ui")
7+
add_urls("https://github.com/std-microblock/breeze-ui.git")
8+
add_versions("2025.10.09+2", "6cda70342717701f7074e3d57356e18ae29a0474")
109
add_deps("breeze-glfw", "nanovg", "glad", "nanosvg")
1110
add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true})
1211

src/shell/script/binding_qjs.h

Lines changed: 561 additions & 952 deletions
Large diffs are not rendered by default.

src/shell/script/binding_types.d.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ export class js_text_widget extends js_widget {
5757
set text(value: string);
5858
get font_size(): number;
5959
set font_size(value: number);
60-
get color(): [number, number, number, number];
60+
get max_width(): number;
61+
set max_width(value: number);
62+
get color(): [number, number, number, number] | undefined;
6163
set color(value: [number, number, number, number] | undefined);
6264
}
6365
}
@@ -75,6 +77,8 @@ export class js_flex_layout_widget extends js_widget {
7577
set padding_top(value: number);
7678
get padding_bottom(): number;
7779
set padding_bottom(value: number);
80+
get flex_grow(): number;
81+
set flex_grow(value: number);
7882
get padding(): [number, number, number, number];
7983
get on_click(): ((arg1: number) => void);
8084
set on_click(value: ((arg1: number) => void));
@@ -762,14 +766,14 @@ export class menu_controller {
762766
* This method is only available for detached menu controllers
763767
* @param x: number
764768
* @param y: number
765-
* @returns Promise<number>
769+
* @returns void
766770
*/
767-
show_at(x: number, y: number): Promise<number>
771+
show_at(x: number, y: number): void
768772
/**
769773
* This method is only available for detached menu controllers
770-
@returns Promise<number>
774+
@returns void
771775
*/
772-
show_at_cursor(): Promise<number>
776+
show_at_cursor(): void
773777
}
774778
export class clipboard {
775779
/**

src/shell/script/binding_types_breeze_ui.cc

Lines changed: 20 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include "shell/script/binding_types_breeze_ui.h"
12
#include "binding_types.hpp"
23
#include "breeze_ui/animator.h"
34
#include "breeze_ui/ui.h"
@@ -41,6 +42,7 @@ namespace mb_shell::js {
4142
return; \
4243
auto lock = $rt_lock(); \
4344
widget->prop_name = value; \
45+
widget->needs_repaint = true; \
4446
}
4547

4648
// Macro for callback function getter/setter pairs
@@ -112,60 +114,10 @@ breeze_ui::js_widget::children() const {
112114
return result;
113115
}
114116

115-
std::string breeze_ui::js_text_widget::get_text() const {
116-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
117-
if (!text_widget)
118-
return "";
119-
return text_widget->text;
120-
}
121-
122-
void breeze_ui::js_text_widget::set_text(std::string text) {
123-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
124-
if (!text_widget)
125-
return;
126-
auto lock = $rt_lock();
127-
text_widget->text = text;
128-
text_widget->needs_repaint = true;
129-
}
130-
131-
int breeze_ui::js_text_widget::get_font_size() const {
132-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
133-
if (!text_widget)
134-
return 0;
135-
return text_widget->font_size;
136-
}
137-
138-
void breeze_ui::js_text_widget::set_font_size(int size) {
139-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
140-
if (!text_widget)
141-
return;
142-
auto lock = $rt_lock();
143-
text_widget->font_size = size;
144-
text_widget->needs_repaint = true;
145-
}
146-
147-
std::tuple<float, float, float, float>
148-
breeze_ui::js_text_widget::get_color() const {
149-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
150-
if (!text_widget)
151-
return {0.0f, 0.0f, 0.0f, 0.0f};
152-
auto color_array = *text_widget->color;
153-
return {color_array[0], color_array[1], color_array[2], color_array[3]};
154-
}
155-
156-
void breeze_ui::js_text_widget::set_color(
157-
std::optional<std::tuple<float, float, float, float>> color) {
158-
auto text_widget = std::dynamic_pointer_cast<ui::text_widget>($widget);
159-
if (!text_widget)
160-
return;
161-
if (color.has_value()) {
162-
text_widget->color.animate_to(
163-
{std::get<0>(color.value()), std::get<1>(color.value()),
164-
std::get<2>(color.value()), std::get<3>(color.value())});
165-
} else {
166-
text_widget->color.animate_to({0.0f, 0.0f, 0.0f, 0.0f});
167-
}
168-
}
117+
IMPL_SIMPLE_PROP(breeze_ui::js_text_widget, ui::text_widget, text, std::string);
118+
IMPL_SIMPLE_PROP(breeze_ui::js_text_widget, ui::text_widget, font_size, int);
119+
IMPL_SIMPLE_PROP(breeze_ui::js_text_widget, ui::text_widget, max_width, float);
120+
IMPL_COLOR_PROP(breeze_ui::js_text_widget, ui::text_widget, color);
169121

170122
void breeze_ui::js_widget::append_child_after(std::shared_ptr<js_widget> child,
171123
int after_index) {
@@ -317,40 +269,44 @@ struct widget_js_base : public ui::flex_widget {
317269
ctx.rt.post_loop_thread_task(
318270
[=, callback = this->on_update]() mutable {
319271
callback(ctx);
320-
}, true);
272+
},
273+
true);
321274
}
322275

323276
if (ctx.hovered(this) && ctx.mouse_clicked && on_click) {
324277
ctx.rt.post_loop_thread_task(
325-
[callback = this->on_click]() mutable { callback(0); }, true);
278+
[callback = this->on_click]() mutable { callback(0); },
279+
true);
326280
}
327281

328282
if (ctx.hovered(this) && !previous_hovered && on_mouse_enter) {
329283
ctx.rt.post_loop_thread_task(
330284
[=, callback = this->on_mouse_enter]() mutable {
331285
callback();
332-
}, true);
286+
},
287+
true);
333288
} else if (!ctx.hovered(this) && previous_hovered &&
334289
on_mouse_leave) {
335290
ctx.rt.post_loop_thread_task(
336291
[=, callback = this->on_mouse_leave]() mutable {
337292
callback();
338-
}, true);
293+
},
294+
true);
339295
}
340296

341297
previous_hovered = ctx.hovered(this);
342298
if (ctx.mouse_down_on(this) && on_mouse_down) {
343299
ctx.rt.post_loop_thread_task(
344300
[=, callback = this->on_mouse_down]() mutable {
345301
callback();
346-
}, true);
302+
},
303+
true);
347304
}
348305

349306
if (ctx.mouse_up && on_mouse_up) {
350307
ctx.rt.post_loop_thread_task(
351-
[=, callback = this->on_mouse_up]() mutable {
352-
callback();
353-
}, true);
308+
[=, callback = this->on_mouse_up]() mutable { callback(); },
309+
true);
354310
}
355311

356312
if (ctx.mouse_x != prev_mouse_x || ctx.mouse_y != prev_mouse_y) {
@@ -506,7 +462,8 @@ IMPL_ANIMATED_PROP(breeze_ui::js_flex_layout_widget, widget_js_base,
506462

507463
IMPL_SIMPLE_PROP(breeze_ui::js_flex_layout_widget, widget_js_base, auto_size,
508464
bool)
509-
465+
IMPL_SIMPLE_PROP(breeze_ui::js_flex_layout_widget, widget_js_base, flex_grow,
466+
float)
510467
IMPL_SIMPLE_PROP(breeze_ui::js_flex_layout_widget, widget_js_base, gap, float)
511468
std::string breeze_ui::js_flex_layout_widget::get_justify_content() const {
512469
auto widget = std::dynamic_pointer_cast<ui::flex_widget>($widget);

src/shell/script/binding_types_breeze_ui.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ struct breeze_ui {
6464
void set_text(std::string text);
6565
int get_font_size() const;
6666
void set_font_size(int size);
67-
std::tuple<float, float, float, float> get_color() const;
67+
float get_max_width() const;
68+
void set_max_width(float w);
69+
std::optional<std::tuple<float, float, float, float>> get_color() const;
6870
void
6971
set_color(std::optional<std::tuple<float, float, float, float>> color);
7072
};
@@ -81,6 +83,7 @@ struct breeze_ui {
8183
DEFINE_PROP(float, padding_right)
8284
DEFINE_PROP(float, padding_top)
8385
DEFINE_PROP(float, padding_bottom)
86+
DEFINE_PROP(float, flex_grow)
8487
std::tuple<float, float, float, float> get_padding() const;
8588
void set_padding(float left, float right, float top, float bottom);
8689

src/shell/script/script.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/shell/script/ts/src/jsx.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ declare module 'react' {
3333
height?: number;
3434
autoSize?: boolean;
3535
gap?: number;
36+
flexGrow?: number;
3637
},
3738
text: {
3839
text?: string[] | string;
@@ -44,6 +45,7 @@ declare module 'react' {
4445
y?: number;
4546
width?: number;
4647
height?: number;
48+
maxWidth?: number;
4749
},
4850
img: {
4951
svg?: string;

src/shell/script/ts/src/react/renderer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ const componentMap = {
108108
},
109109
fontSize: getSetFactory('font_size'),
110110
color: getSetFactoryColor('color'),
111+
maxWidth: getSetFactory('max_width'),
111112
...commonProps
112113
}
113114
},
@@ -136,6 +137,7 @@ const componentMap = {
136137
justifyContent: getSetFactory('justify_content'),
137138
alignItems: getSetFactory('align_items'),
138139
gap: getSetFactory('gap'),
140+
flexGrow: getSetFactory('flex_grow'),
139141
...commonProps
140142
}
141143
},

0 commit comments

Comments
 (0)