From 3ad4fc180a2b3a0511d89917e2c78c031e52cc8d Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Thu, 28 Aug 2025 20:38:53 +0200 Subject: [PATCH] add tabview --- .../main/java/de/unixwork/ui/ArgFuncs.java | 69 ++++++ .../main/java/de/unixwork/ui/Container.java | 5 + .../java/de/unixwork/ui/TabViewBuilder.java | 203 ++++++++++++++++++ .../main/java/de/unixwork/ui/TabViewType.java | 20 ++ .../kotlin/de/unixwork/ui/kotlin/Toplevel.kt | 78 +++++++ 5 files changed, 375 insertions(+) create mode 100644 ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java create mode 100644 ui-java/src/main/java/de/unixwork/ui/TabViewType.java diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index 3bf857a..03818b4 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -150,6 +150,29 @@ class ArgFuncs { MethodHandle splitpane_args_set_max_panes; MethodHandle splitpane_args_free; + MethodHandle tabview_args_new; + MethodHandle tabview_args_set_fill; + MethodHandle tabview_args_set_hexpand; + MethodHandle tabview_args_set_vexpand; + MethodHandle tabview_args_set_hfill; + MethodHandle tabview_args_set_vfill; + MethodHandle tabview_args_set_override_defaults; + MethodHandle tabview_args_set_colspan; + MethodHandle tabview_args_set_rowspan; + MethodHandle tabview_args_set_name; + MethodHandle tabview_args_set_style_class; + MethodHandle tabview_args_set_margin; + MethodHandle tabview_args_set_spacing; + MethodHandle tabview_args_set_columnspacing; + MethodHandle tabview_args_set_rowspacing; + MethodHandle tabview_args_set_type; + MethodHandle tabview_args_set_onchange; + MethodHandle tabview_args_set_onchangedata; + MethodHandle tabview_args_set_varname; + MethodHandle tabview_args_set_value; + MethodHandle tabview_args_set_subcontainer; + MethodHandle tabview_args_free; + MethodHandle sidebar_args_new; MethodHandle sidebar_args_set_name; MethodHandle sidebar_args_set_style_class; @@ -534,6 +557,29 @@ class ArgFuncs { MemorySegment ui_splitpane_args_set_max_panes_addr = lib.find("ui_splitpane_args_set_max_panes").orElseThrow(); MemorySegment ui_splitpane_args_free_addr = lib.find("ui_splitpane_args_free").orElseThrow(); + MemorySegment ui_tabview_args_new_addr = lib.find("ui_tabview_args_new").orElseThrow(); + MemorySegment ui_tabview_args_set_fill_addr = lib.find("ui_tabview_args_set_fill").orElseThrow(); + MemorySegment ui_tabview_args_set_hexpand_addr = lib.find("ui_tabview_args_set_hexpand").orElseThrow(); + MemorySegment ui_tabview_args_set_vexpand_addr = lib.find("ui_tabview_args_set_vexpand").orElseThrow(); + MemorySegment ui_tabview_args_set_hfill_addr = lib.find("ui_tabview_args_set_hfill").orElseThrow(); + MemorySegment ui_tabview_args_set_vfill_addr = lib.find("ui_tabview_args_set_vfill").orElseThrow(); + MemorySegment ui_tabview_args_set_override_defaults_addr = lib.find("ui_tabview_args_set_override_defaults").orElseThrow(); + MemorySegment ui_tabview_args_set_colspan_addr = lib.find("ui_tabview_args_set_colspan").orElseThrow(); + MemorySegment ui_tabview_args_set_rowspan_addr = lib.find("ui_tabview_args_set_rowspan").orElseThrow(); + MemorySegment ui_tabview_args_set_name_addr = lib.find("ui_tabview_args_set_name").orElseThrow(); + MemorySegment ui_tabview_args_set_style_class_addr = lib.find("ui_tabview_args_set_style_class").orElseThrow(); + MemorySegment ui_tabview_args_set_margin_addr = lib.find("ui_tabview_args_set_margin").orElseThrow(); + MemorySegment ui_tabview_args_set_spacing_addr = lib.find("ui_tabview_args_set_spacing").orElseThrow(); + MemorySegment ui_tabview_args_set_columnspacing_addr = lib.find("ui_tabview_args_set_columnspacing").orElseThrow(); + MemorySegment ui_tabview_args_set_rowspacing_addr = lib.find("ui_tabview_args_set_rowspacing").orElseThrow(); + MemorySegment ui_tabview_args_set_type_addr = lib.find("ui_tabview_args_set_type").orElseThrow(); + MemorySegment ui_tabview_args_set_onchange_addr = lib.find("ui_tabview_args_set_onchange").orElseThrow(); + MemorySegment ui_tabview_args_set_onchangedata_addr = lib.find("ui_tabview_args_set_onchangedata").orElseThrow(); + MemorySegment ui_tabview_args_set_varname_addr = lib.find("ui_tabview_args_set_varname").orElseThrow(); + MemorySegment ui_tabview_args_set_value_addr = lib.find("ui_tabview_args_set_value").orElseThrow(); + MemorySegment ui_tabview_args_set_subcontainer_addr = lib.find("ui_tabview_args_set_subcontainer").orElseThrow(); + MemorySegment ui_tabview_args_free_addr = lib.find("ui_tabview_args_free").orElseThrow(); + MemorySegment ui_sidebar_args_new_addr = lib.find("ui_sidebar_args_new").orElseThrow(); MemorySegment ui_sidebar_args_set_name_addr = lib.find("ui_sidebar_args_set_name").orElseThrow(); MemorySegment ui_sidebar_args_set_style_class_addr = lib.find("ui_sidebar_args_set_style_class").orElseThrow(); @@ -909,6 +955,29 @@ class ArgFuncs { splitpane_args_set_max_panes = linker.downcallHandle(ui_splitpane_args_set_max_panes_addr, sigv_mi); splitpane_args_free = linker.downcallHandle(ui_splitpane_args_free_addr, sigv_m); + tabview_args_new = linker.downcallHandle(ui_tabview_args_new_addr, sigm); + tabview_args_set_fill = linker.downcallHandle(ui_tabview_args_set_fill_addr, sigv_mb); + tabview_args_set_hexpand = linker.downcallHandle(ui_tabview_args_set_hexpand_addr, sigv_mb); + tabview_args_set_vexpand = linker.downcallHandle(ui_tabview_args_set_vexpand_addr, sigv_mb); + tabview_args_set_hfill = linker.downcallHandle(ui_tabview_args_set_hfill_addr, sigv_mb); + tabview_args_set_vfill = linker.downcallHandle(ui_tabview_args_set_vfill_addr, sigv_mb); + tabview_args_set_override_defaults = linker.downcallHandle(ui_tabview_args_set_override_defaults_addr, sigv_mb); + tabview_args_set_colspan = linker.downcallHandle(ui_tabview_args_set_colspan_addr, sigv_mi); + tabview_args_set_rowspan = linker.downcallHandle(ui_tabview_args_set_rowspan_addr, sigv_mi); + tabview_args_set_name = linker.downcallHandle(ui_tabview_args_set_name_addr, sigv_mm); + tabview_args_set_style_class = linker.downcallHandle(ui_tabview_args_set_style_class_addr, sigv_mm); + tabview_args_set_margin = linker.downcallHandle(ui_tabview_args_set_margin_addr, sigv_mi); + tabview_args_set_spacing = linker.downcallHandle(ui_tabview_args_set_spacing_addr, sigv_mi); + tabview_args_set_columnspacing = linker.downcallHandle(ui_tabview_args_set_columnspacing_addr, sigv_mi); + tabview_args_set_rowspacing = linker.downcallHandle(ui_tabview_args_set_rowspacing_addr, sigv_mi); + tabview_args_set_type = linker.downcallHandle(ui_tabview_args_set_type_addr, sigv_mi); + tabview_args_set_onchange = linker.downcallHandle(ui_tabview_args_set_onchange_addr, sigv_mm); + tabview_args_set_onchangedata = linker.downcallHandle(ui_tabview_args_set_onchangedata_addr, sigv_mm); + tabview_args_set_varname = linker.downcallHandle(ui_tabview_args_set_varname_addr, sigv_mm); + tabview_args_set_value = linker.downcallHandle(ui_tabview_args_set_value_addr, sigv_mm); + tabview_args_set_subcontainer = linker.downcallHandle(ui_tabview_args_set_subcontainer_addr, sigv_mi); + tabview_args_free = linker.downcallHandle(ui_tabview_args_free_addr, sigv_m); + sidebar_args_new = linker.downcallHandle(ui_sidebar_args_new_addr, sigm); sidebar_args_set_name = linker.downcallHandle(ui_sidebar_args_set_name_addr, sigv_mm); sidebar_args_set_style_class = linker.downcallHandle(ui_sidebar_args_set_style_class_addr, sigv_mm); diff --git a/ui-java/src/main/java/de/unixwork/ui/Container.java b/ui-java/src/main/java/de/unixwork/ui/Container.java index fbf76ef..5468445 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Container.java +++ b/ui-java/src/main/java/de/unixwork/ui/Container.java @@ -43,6 +43,11 @@ public class Container implements AutoCloseable { return new ContainerBuilder(obj, ui.grid_create); } + public static TabViewBuilder tabview(UiObject obj) { + ContainerFuncs ui = ContainerFuncs.getInstance(); + return new TabViewBuilder(obj, ui.tabview_create); + } + public static void newline(UiObject obj) { ContainerFuncs ui = ContainerFuncs.getInstance(); try { diff --git a/ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java new file mode 100644 index 0000000..5f1ea13 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/TabViewBuilder.java @@ -0,0 +1,203 @@ +package de.unixwork.ui; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.invoke.MethodHandle; + +public class TabViewBuilder extends AbstractWidgetBuilder{ + private boolean fill; + private boolean hexpand; + private boolean vexpand; + private boolean hfill; + private boolean vfill; + private boolean overrideDefaults; + private int colspan; + private int rowspan; + private String name; + private String styleClass; + private int margin; + private int spacing; + private int columnspacing; + private int rowspacing; + private TabViewType type = TabViewType.DEFAULT; + private EventHandler onChange; + private String varname; + private UiInteger value; + // TODO: subcontainer type + + public TabViewBuilder(UiObject obj, MethodHandle widgetConstructor) { + this.obj = obj; + this.widgetConstructor = widgetConstructor; + } + + public TabViewBuilder fill(boolean fill) { + this.fill = fill; + return this; + } + + public TabViewBuilder hexpand(boolean hexpand) { + this.hexpand = hexpand; + return this; + } + + public TabViewBuilder vexpand(boolean vexpand) { + this.vexpand = vexpand; + return this; + } + + public TabViewBuilder hfill(boolean hfill) { + this.hfill = hfill; + return this; + } + + public TabViewBuilder vfill(boolean vfill) { + this.vfill = vfill; + return this; + } + + public TabViewBuilder overrideDefaults(boolean overrideDefaults) { + this.overrideDefaults = overrideDefaults; + return this; + } + + public TabViewBuilder colspan(int colspan) { + this.colspan = colspan; + return this; + } + + public TabViewBuilder rowspan(int rowspan) { + this.rowspan = rowspan; + return this; + } + + public TabViewBuilder name(String name) { + this.name = name; + return this; + } + + public TabViewBuilder styleClass(String styleClass) { + this.styleClass = styleClass; + return this; + } + + public TabViewBuilder margin(int margin) { + this.margin = margin; + return this; + } + + public TabViewBuilder spacing(int sacing) { + this.spacing = sacing; + return this; + } + + public TabViewBuilder columnspacing(int columnspacing) { + this.columnspacing = columnspacing; + return this; + } + + public TabViewBuilder rowspacing(int rowspacing) { + this.rowspacing = rowspacing; + return this; + } + + public TabViewBuilder type(TabViewType type) { + this.type = type; + return this; + } + + public TabViewBuilder onChange(EventHandler onChange) { + this.onChange = onChange; + return this; + } + + public TabViewBuilder varname(String varname) { + this.varname = varname; + return this; + } + + public TabViewBuilder value(UiInteger value) { + this.value = value; + return this; + } + + @Override + public MemorySegment createArgs(Arena arena) throws Throwable { + ArgFuncs ui = ArgFuncs.getInstance(); + + args = (MemorySegment)ui.tabview_args_new.invoke(); + if(fill) { + ui.tabview_args_set_fill.invoke(args, fill); + } + if(hexpand) { + ui.tabview_args_set_hexpand.invoke(args, hexpand); + } + if(vexpand) { + ui.tabview_args_set_vexpand.invoke(args, vexpand); + } + if(hfill) { + ui.tabview_args_set_hfill.invoke(args, hfill); + } + if(vfill) { + ui.tabview_args_set_vfill.invoke(args, vfill); + } + if(overrideDefaults) { + ui.tabview_args_set_override_defaults.invoke(args, overrideDefaults); + } + if(colspan > 0) { + ui.tabview_args_set_colspan.invoke(args, colspan); + } + if(rowspan > 0) { + ui.tabview_args_set_rowspan.invoke(args, rowspan); + } + if(name != null) { + MemorySegment cstr = arena.allocateFrom(name); + ui.tabview_args_set_name.invoke(args, cstr); + } + if(styleClass != null) { + MemorySegment cstr = arena.allocateFrom(styleClass); + ui.tabview_args_set_style_class.invoke(args, cstr); + } + if(margin > 0) { + ui.tabview_args_set_margin.invoke(args, margin); + } + if(spacing > 0) { + ui.tabview_args_set_spacing.invoke(args, spacing); + } + if(columnspacing > 0) { + ui.tabview_args_set_columnspacing.invoke(args, columnspacing); + } + if(rowspacing > 0) { + ui.tabview_args_set_rowspacing.invoke(args, rowspacing); + } + ui.tabview_args_set_type.invoke(args, type.getValue()); + if(onChange != null) { + EventWrapper event = new EventWrapper(obj, onChange); + + // set toolkit args + ui.tabview_args_set_onchange.invoke(args, event.getCallback()); + ui.tabview_args_set_onchangedata.invoke(args, event.getUserData()); + } + if(varname != null) { + MemorySegment cstr = arena.allocateFrom(varname); + ui.tabview_args_set_varname.invoke(args, cstr); + } + if(value != null) { + ui.tabview_args_set_value.invoke(args, value.valuePtr); + } + // TODO: subcontainer type + + return args; + } + + public Container createContainer() { + UiWidget w = create(); + return new Container(obj, w); + } + + public UiWidget create(ContainerUI ui) { + Container container = createContainer(); + ui.callback(); + container.close(); + return container.getWidget(); + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/TabViewType.java b/ui-java/src/main/java/de/unixwork/ui/TabViewType.java new file mode 100644 index 0000000..ca76599 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/TabViewType.java @@ -0,0 +1,20 @@ +package de.unixwork.ui; + +public enum TabViewType { + DEFAULT(0), + DOC(1), + NAVIGATION_SIDE(2), + NAVIGATION_TOP(3), + NAVIGATION_TOP2(4), + INVISIBLE(5); + + TabViewType(int value) { + this.value = value; + } + + private final int value; + + public int getValue() { + return value; + } +} diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt index 5822d8b..ad155da 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Toplevel.kt @@ -25,6 +25,7 @@ import de.unixwork.ui.WebView import de.unixwork.ui.Label import de.unixwork.ui.LinkButtonType import de.unixwork.ui.ListViewBuilder +import de.unixwork.ui.TabViewType import de.unixwork.ui.TableModel import de.unixwork.ui.TableViewBuilder import de.unixwork.ui.UiText @@ -386,6 +387,83 @@ class Toplevel(obj: UiObject) { ) } + fun tabview( + fill: Boolean = false, + hexpand: Boolean = false, + vexpand: Boolean = false, + hfill: Boolean = false, + vfill: Boolean = false, + overrideDefaults: Boolean = false, + colspan: Int = -1, + rowspan: Int = -1, + name: String? = null, + styleClass: String? = null, + margin: Int = -1, + spacing: Int = -1, + columnspacing: Int = -1, + rowspacing: Int = -1, + type: TabViewType = TabViewType.DEFAULT, + varname: String? = null, + value: UiInteger? = null, + onChange: EventHandler? = null, + ui: ContainerUI? = null + ): UiWidget { + val container = Container.tabview(this@Toplevel.ui) + if(fill) { + container.fill(true) + } + if(hexpand) { + container.hexpand(true) + } + if(vexpand) { + container.vexpand(true) + } + if(hfill) { + container.hfill(true) + } + if(vfill) { + container.vfill(true) + } + if(overrideDefaults) { + container.overrideDefaults(true) + } + if(name != null) { + container.name(name) + } + if(styleClass != null) { + container.styleClass(styleClass) + } + if(colspan > 0) { + container.colspan(colspan) + } + if(rowspan > 0) { + container.rowspan(rowspan) + } + if(margin > 0) { + container.margin(margin) + } + if(spacing > 0) { + container.spacing(spacing) + } + if(columnspacing > 0) { + container.columnspacing(columnspacing) + } + if(rowspacing > 0) { + container.rowspacing(rowspacing) + } + container.type(type) + if(varname != null) { + container.varname(varname) + } + if(value != null) { + container.value(value) + } + if(onChange != null) { + container.onChange(onChange) + } + return container.create(ui) + } + private fun createSplitpane( horizontal: Boolean, fill: Boolean = false, -- 2.47.3