Skip to content

Commit a4b0745

Browse files
committed
1 parent f1220e9 commit a4b0745

File tree

11 files changed

+158
-103
lines changed

11 files changed

+158
-103
lines changed

packages/eez-studio-types/index.d.ts

-1
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,6 @@ export interface IWasmFlowRuntime {
716716
_lvglSetScrollSnapX(obj: number, align: number);
717717
_lvglSetScrollSnapY(obj: number, align: number);
718718

719-
_lvglTabviewSetActive(obj: number, tab_id: number, anim_en: number);
720719
_lvglLineSetPoints(obj: number, point_values: number, point_num: number);
721720
_lvglScrollTo(obj: number, x: number, y: number, anim_en: boolean);
722721
_lvglGetScrollX(obj: number): number;

packages/project-editor/flow/editor/bounding-rects.ts

+7
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ export function getObjectIdFromPoint(
149149
undefined;
150150

151151
if (result) {
152+
if (
153+
object.object instanceof
154+
ProjectEditor.LVGLTabWidgetClass
155+
) {
156+
continue;
157+
}
158+
152159
if (
153160
!object.selected ||
154161
(result.connectionOutput && !connectionOutput) ||

packages/project-editor/flow/runtime/lvgl_runtime_v8.3.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -4848,8 +4848,6 @@ var _lvglSetScrollSnapX = Module['_lvglSetScrollSnapX'] = createExportWrapper('l
48484848
var _lv_obj_set_scroll_snap_x = Module['_lv_obj_set_scroll_snap_x'] = createExportWrapper('lv_obj_set_scroll_snap_x');
48494849
var _lvglSetScrollSnapY = Module['_lvglSetScrollSnapY'] = createExportWrapper('lvglSetScrollSnapY');
48504850
var _lv_obj_set_scroll_snap_y = Module['_lv_obj_set_scroll_snap_y'] = createExportWrapper('lv_obj_set_scroll_snap_y');
4851-
var _lvglTabviewSetActive = Module['_lvglTabviewSetActive'] = createExportWrapper('lvglTabviewSetActive');
4852-
var _lv_tabview_set_act = Module['_lv_tabview_set_act'] = createExportWrapper('lv_tabview_set_act');
48534851
var _lvglLineSetPoints = Module['_lvglLineSetPoints'] = createExportWrapper('lvglLineSetPoints');
48544852
var _lv_line_set_points = Module['_lv_line_set_points'] = createExportWrapper('lv_line_set_points');
48554853
var _lvglScrollTo = Module['_lvglScrollTo'] = createExportWrapper('lvglScrollTo');
@@ -5669,6 +5667,7 @@ var _lv_arc_set_rotation = Module['_lv_arc_set_rotation'] = createExportWrapper(
56695667
var _lv_arc_set_end_angle = Module['_lv_arc_set_end_angle'] = createExportWrapper('lv_arc_set_end_angle');
56705668
var _lv_arc_set_start_angle = Module['_lv_arc_set_start_angle'] = createExportWrapper('lv_arc_set_start_angle');
56715669
var _lv_btnmatrix_set_one_checked = Module['_lv_btnmatrix_set_one_checked'] = createExportWrapper('lv_btnmatrix_set_one_checked');
5670+
var _lv_tabview_set_act = Module['_lv_tabview_set_act'] = createExportWrapper('lv_tabview_set_act');
56725671
var _lv_tabview_create = Module['_lv_tabview_create'] = createExportWrapper('lv_tabview_create');
56735672
var _lv_tabview_add_tab = Module['_lv_tabview_add_tab'] = createExportWrapper('lv_tabview_add_tab');
56745673
var _lv_tabview_get_content = Module['_lv_tabview_get_content'] = createExportWrapper('lv_tabview_get_content');
Binary file not shown.

packages/project-editor/flow/runtime/lvgl_runtime_v9.0.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -4850,8 +4850,6 @@ var _lvglSetScrollSnapX = Module['_lvglSetScrollSnapX'] = createExportWrapper('l
48504850
var _lv_obj_set_scroll_snap_x = Module['_lv_obj_set_scroll_snap_x'] = createExportWrapper('lv_obj_set_scroll_snap_x');
48514851
var _lvglSetScrollSnapY = Module['_lvglSetScrollSnapY'] = createExportWrapper('lvglSetScrollSnapY');
48524852
var _lv_obj_set_scroll_snap_y = Module['_lv_obj_set_scroll_snap_y'] = createExportWrapper('lv_obj_set_scroll_snap_y');
4853-
var _lvglTabviewSetActive = Module['_lvglTabviewSetActive'] = createExportWrapper('lvglTabviewSetActive');
4854-
var _lv_tabview_set_active = Module['_lv_tabview_set_active'] = createExportWrapper('lv_tabview_set_active');
48554853
var _lvglLineSetPoints = Module['_lvglLineSetPoints'] = createExportWrapper('lvglLineSetPoints');
48564854
var _lv_line_set_points = Module['_lv_line_set_points'] = createExportWrapper('lv_line_set_points');
48574855
var _lvglScrollTo = Module['_lvglScrollTo'] = createExportWrapper('lvglScrollTo');
@@ -6367,6 +6365,7 @@ var _lv_table_has_cell_ctrl = Module['_lv_table_has_cell_ctrl'] = createExportWr
63676365
var _lv_table_get_selected_cell = Module['_lv_table_get_selected_cell'] = createExportWrapper('lv_table_get_selected_cell');
63686366
var _lv_table_get_cell_user_data = Module['_lv_table_get_cell_user_data'] = createExportWrapper('lv_table_get_cell_user_data');
63696367
var _lv_tabview_set_tab_bar_position = Module['_lv_tabview_set_tab_bar_position'] = createExportWrapper('lv_tabview_set_tab_bar_position');
6368+
var _lv_tabview_set_active = Module['_lv_tabview_set_active'] = createExportWrapper('lv_tabview_set_active');
63706369
var _lv_tabview_create = Module['_lv_tabview_create'] = createExportWrapper('lv_tabview_create');
63716370
var _lv_tabview_add_tab = Module['_lv_tabview_add_tab'] = createExportWrapper('lv_tabview_add_tab');
63726371
var _lv_tabview_get_content = Module['_lv_tabview_get_content'] = createExportWrapper('lv_tabview_get_content');
Binary file not shown.

packages/project-editor/lvgl/page-runtime.ts

+13-20
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ import {
5050
import type { IFlowContext } from "project-editor/flow/flow-interfaces";
5151
import {
5252
LVGLStylePropCode,
53-
LVGL_CONSTANTS_ALL,
54-
LV_ANIM_OFF
53+
LVGL_CONSTANTS_ALL
5554
} from "project-editor/lvgl/lvgl-constants";
5655
import {
5756
BUILT_IN_FONTS,
@@ -109,6 +108,7 @@ export abstract class LVGLPageRuntime {
109108
callback: () => void;
110109
}[] = [];
111110
stringLiterals = new Map<string, number>();
111+
postCreateCallbacks: (() => void)[] = [];
112112

113113
constructor(public page: Page) {
114114
this.lvglVersion = this.project.settings.general.lvglVersion;
@@ -543,7 +543,9 @@ export abstract class LVGLPageRuntime {
543543

544544
registerGroupWidget(group: string, groupIndex: number, obj: number) {}
545545

546-
addPostCreateCallback(callback: () => void) {}
546+
addPostCreateCallback(callback: () => void) {
547+
this.postCreateCallbacks.push(callback);
548+
}
547549

548550
stringLiteral(str: string) {
549551
let strPtr = this.stringLiterals.get(str);
@@ -680,6 +682,11 @@ export class LVGLPageEditorRuntime extends LVGLPageRuntime {
680682
console.error("pageObj is undefined");
681683
}
682684

685+
for (const callback of this.postCreateCallbacks) {
686+
callback();
687+
}
688+
this.postCreateCallbacks = [];
689+
683690
const editor =
684691
this.projectStore.editorsStore.getEditorByObject(
685692
this.page
@@ -715,21 +722,12 @@ export class LVGLPageEditorRuntime extends LVGLPageRuntime {
715722
);
716723
if (tabWidget) {
717724
const tabviewWidget = tabWidget.tabview;
718-
if (
719-
tabviewWidget &&
720-
tabviewWidget._lvglObj
721-
) {
725+
if (tabviewWidget) {
722726
const tabIndex = tabWidget.tabIndex;
723-
724727
if (tabIndex != -1) {
725-
this.wasm._lvglTabviewSetActive(
726-
tabviewWidget._lvglObj,
727-
tabWidget.tabIndex,
728-
LV_ANIM_OFF
729-
);
730-
731728
runInAction(() => {
732-
tabWidget._refreshRelativePosition++;
729+
tabviewWidget._selectedTabIndex =
730+
tabIndex;
733731
});
734732
}
735733
}
@@ -981,7 +979,6 @@ export class LVGLPageViewerRuntime extends LVGLPageRuntime {
981979
eventCode: number;
982980
callback: (event: number) => void;
983981
}[] = [];
984-
postCreateCallbacks: (() => void)[] = [];
985982

986983
constructor(private runtime: WasmRuntime) {
987984
super(runtime.selectedPage);
@@ -1405,10 +1402,6 @@ export class LVGLPageViewerRuntime extends LVGLPageRuntime {
14051402
}
14061403
}
14071404
}
1408-
1409-
override addPostCreateCallback(callback: () => void) {
1410-
this.postCreateCallbacks.push(callback);
1411-
}
14121405
}
14131406

14141407
////////////////////////////////////////////////////////////////////////////////

packages/project-editor/lvgl/widgets/Base.tsx

+16-1
Original file line numberDiff line numberDiff line change
@@ -2397,12 +2397,27 @@ export class LVGLWidget extends Widget {
23972397
}
23982398
}
23992399

2400+
get childrenToRender() {
2401+
// do not render Tab's that are not visible
2402+
return this.children.filter(child => {
2403+
if (child instanceof ProjectEditor.LVGLTabWidgetClass) {
2404+
if (
2405+
child.tabview &&
2406+
child.tabIndex != child.tabview.selectedTabIndex
2407+
) {
2408+
return false;
2409+
}
2410+
}
2411+
return true;
2412+
});
2413+
}
2414+
24002415
override render(flowContext: IFlowContext, width: number, height: number) {
24012416
return this._lvglObj ? (
24022417
<>
24032418
<ComponentsContainerEnclosure
24042419
parent={this}
2405-
components={this.children}
2420+
components={this.childrenToRender}
24062421
flowContext={flowContext}
24072422
width={width}
24082423
height={height}

packages/project-editor/lvgl/widgets/Keyboard.tsx

+71-68
Original file line numberDiff line numberDiff line change
@@ -213,84 +213,87 @@ export class LVGLKeyboardWidget extends LVGLWidget {
213213
);
214214
}
215215

216-
const textarea = this.textarea;
217-
if (textarea) {
218-
const lvglIdentifier = ProjectEditor.getProjectStore(
219-
this
220-
).lvglIdentifiers.getIdentifierByName(
221-
ProjectEditor.getFlow(this),
222-
textarea
223-
);
224-
if (
225-
lvglIdentifier != undefined &&
226-
lvglIdentifier.widgets.length == 1
227-
) {
228-
const textareaWidget = lvglIdentifier.widgets[0];
229-
230-
if (textareaWidget instanceof LVGLTextareaWidget) {
231-
if (
232-
code.pageRuntime &&
233-
!(code.pageRuntime instanceof LVGLPageViewerRuntime)
234-
) {
235-
return;
236-
}
216+
if (!code.pageRuntime || !code.pageRuntime.isEditor) {
217+
const textarea = this.textarea;
218+
if (textarea) {
219+
const lvglIdentifier = ProjectEditor.getProjectStore(
220+
this
221+
).lvglIdentifiers.getIdentifierByName(
222+
ProjectEditor.getFlow(this),
223+
textarea
224+
);
225+
if (
226+
lvglIdentifier != undefined &&
227+
lvglIdentifier.widgets.length == 1
228+
) {
229+
const textareaWidget = lvglIdentifier.widgets[0];
230+
231+
if (textareaWidget instanceof LVGLTextareaWidget) {
232+
if (
233+
code.pageRuntime &&
234+
!(code.pageRuntime instanceof LVGLPageViewerRuntime)
235+
) {
236+
return;
237+
}
237238

238-
code.postPageExecute(() => {
239-
let keyboardAccessor;
240-
let textareaAccessor;
241-
242-
if (code.lvglBuild) {
243-
const build = code.lvglBuild;
244-
245-
keyboardAccessor =
246-
build.getLvglObjectAccessor(this);
247-
textareaAccessor =
248-
build.getLvglObjectAccessor(textareaWidget);
249-
250-
if (
251-
textareaAccessor.indexOf(
252-
"startWidgetIndex +"
253-
) != -1
254-
) {
255-
let index = build.getWidgetObjectIndexByName(
256-
this,
257-
textarea
258-
);
239+
code.postPageExecute(() => {
240+
let keyboardAccessor;
241+
let textareaAccessor;
242+
243+
if (code.lvglBuild) {
244+
const build = code.lvglBuild;
245+
246+
keyboardAccessor =
247+
build.getLvglObjectAccessor(this);
248+
textareaAccessor =
249+
build.getLvglObjectAccessor(textareaWidget);
259250

260251
if (
261-
keyboardAccessor.indexOf(
252+
textareaAccessor.indexOf(
262253
"startWidgetIndex +"
263254
) != -1
264255
) {
265-
textareaAccessor = `((lv_obj_t **)&objects)[startWidgetIndex + ${index}]`;
266-
} else {
267-
textareaAccessor = `((lv_obj_t **)&objects)[${index}]`;
256+
let index =
257+
build.getWidgetObjectIndexByName(
258+
this,
259+
textarea
260+
);
261+
262+
if (
263+
keyboardAccessor.indexOf(
264+
"startWidgetIndex +"
265+
) != -1
266+
) {
267+
textareaAccessor = `((lv_obj_t **)&objects)[startWidgetIndex + ${index}]`;
268+
} else {
269+
textareaAccessor = `((lv_obj_t **)&objects)[${index}]`;
270+
}
268271
}
269-
}
270-
} else {
271-
const runtime =
272-
code.pageRuntime as LVGLPageViewerRuntime;
272+
} else {
273+
const runtime =
274+
code.pageRuntime as LVGLPageViewerRuntime;
273275

274-
keyboardAccessor = code.callFreeFunction(
275-
"getLvglObjectFromIndex",
276-
runtime.getWidgetIndex(this)
277-
);
276+
keyboardAccessor = code.callFreeFunction(
277+
"getLvglObjectFromIndex",
278+
runtime.getWidgetIndex(this)
279+
);
278280

279-
textareaAccessor = code.callFreeFunction(
280-
"getLvglObjectFromIndex",
281-
runtime.getLvglObjectByName(
282-
textarea,
283-
runtime.userWidgetsStack
284-
)
285-
);
286-
}
281+
textareaAccessor = code.callFreeFunction(
282+
"getLvglObjectFromIndex",
283+
runtime.getLvglObjectByName(
284+
textarea,
285+
runtime.userWidgetsStack
286+
)
287+
);
288+
}
287289

288-
code.callFreeFunction(
289-
"lv_keyboard_set_textarea",
290-
keyboardAccessor,
291-
textareaAccessor
292-
);
293-
});
290+
code.callFreeFunction(
291+
"lv_keyboard_set_textarea",
292+
keyboardAccessor,
293+
textareaAccessor
294+
);
295+
});
296+
}
294297
}
295298
}
296299
}

packages/project-editor/lvgl/widgets/Tabview.tsx

+49-1
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,40 @@ export class LVGLTabviewWidget extends LVGLWidget {
152152
tabviewPosition: keyof typeof TABVIEW_POSITION;
153153
tabviewSize: number;
154154

155+
_selectedTabIndex: number = 0;
156+
157+
get selectedTabIndex() {
158+
let numTabs = 0;
159+
for (const child of this.children) {
160+
if (child instanceof LVGLTabWidget) {
161+
numTabs++;
162+
} else {
163+
for (const child2 of child.children) {
164+
if (child2 instanceof LVGLTabWidget) {
165+
numTabs++;
166+
}
167+
}
168+
}
169+
}
170+
171+
if (this._selectedTabIndex < numTabs) {
172+
return this._selectedTabIndex;
173+
}
174+
175+
if (this._selectedTabIndex - 1 > 0) {
176+
return this._selectedTabIndex - 1;
177+
}
178+
179+
return 0;
180+
}
181+
155182
override makeEditable() {
156183
super.makeEditable();
157184

158185
makeObservable(this, {
159186
tabviewPosition: observable,
160-
tabviewSize: observable
187+
tabviewSize: observable,
188+
_selectedTabIndex: observable
161189
});
162190
}
163191

@@ -179,5 +207,25 @@ export class LVGLTabviewWidget extends LVGLWidget {
179207
size
180208
);
181209
}
210+
211+
if (code.pageRuntime && code.pageRuntime.isEditor) {
212+
const selectedTabIndex = this.selectedTabIndex;
213+
214+
code.postPageExecute(() => {
215+
if (code.isV9) {
216+
code.callObjectFunction(
217+
"lv_tabview_set_active",
218+
selectedTabIndex,
219+
code.constant("LV_ANIM_OFF")
220+
);
221+
} else {
222+
code.callObjectFunction(
223+
"lv_tabview_set_act",
224+
selectedTabIndex,
225+
code.constant("LV_ANIM_OFF")
226+
);
227+
}
228+
});
229+
}
182230
}
183231
}

0 commit comments

Comments
 (0)