package de.unixwork.rssreader
import de.unixwork.ui.SubListItem
-import de.unixwork.ui.UiObject
-import de.unixwork.ui.UiSourceList
import de.unixwork.ui.kotlin.Toplevel
import de.unixwork.ui.kotlin.sidebarWindow
+import de.unixwork.ui.kotlin.dialogWindow
class MainWindow {
val window : Toplevel
}
hbox(margin = 4, spacing = 4) {
button(icon = "list-add") {
-
+ createFeedDialog()
}
button(icon = "folder-new") {
-
+ createCategoryDialog()
}
}
}
}
}
+ private fun createFeedDialog() {
+ val w = dialogWindow(
+ parent = window.ui,
+ title = "Add Feed",
+ lbutton1 = "Add",
+ rbutton4 = "Cancel",
+ onClick = { ev ->
+ ev.`object`.close()
+ },
+ modal = true)
+ {
+ grid(
+ margin = 12,
+ columnspacing = 8,
+ rowspacing = 8,
+ defhfill = true,
+ defvfill = true,
+ fill = true)
+ {
+ row {
+ rlabel("Category")
+ dropdown<String>(varname = "group", hexpand = true) { elm, column ->
+ ""
+ }
+ }
+ row {
+ rlabel("Name")
+ textfield(varname = "name", hexpand = true)
+ }
+ row {
+ rlabel("URLs", overrideDefaults = true, hfill = true) // overrideDefaults for disabling default vfill
+ textarea(varname = "url", hexpand = true, vexpand = true, vfill = true)
+ }
+ }
+ }
+ w.show()
+ }
+ private fun createCategoryDialog() {
+ val w = dialogWindow(
+ parent = window.ui,
+ title = "Add Category",
+ lbutton1 = "Add",
+ modal = true)
+ {
+ grid(
+ margin = 12,
+ columnspacing = 8,
+ rowspacing = 8,
+ defhfill = true,
+ defvfill = true,
+ fill = true)
+ {
+ row {
+ rlabel("Name")
+ textfield(varname = "name", hexpand = true)
+ }
+ }
+ }
+ w.show()
+ }
fun show() {
window.show()
ui.dialogwindow_args_set_width.invoke(args, width);
ui.dialogwindow_args_set_height.invoke(args, height);
- UiObject obj = UiObjectFuncs.instance.dialogWindow(parent.ptr, args);
if(onClick != null) {
- EventWrapper event = new EventWrapper(obj, onClick);
+ EventWrapper event = new EventWrapper(onClick);
ui.dialogwindow_args_set_onclick.invoke(args, event.getCallback());
ui.dialogwindow_args_set_onclickdata.invoke(args, event.getUserData());
}
+ UiObject obj = UiObjectFuncs.instance.dialogWindow(parent.ptr, args);
+
ui.dialogwindow_args_free.invoke(args);
return obj;
} catch (Throwable e) {
long index = toolkit.addOneshotEventHandler(handler);
userdata = MemorySegment.ofAddress(index);
} else {
- callback = toolkit.eventHandler;
+ callback = toolkit.globalEventHandler;
long index = toolkit.addEventHandler(handler);
userdata = MemorySegment.ofAddress(index);
}
UiObjectFuncs.instance.show(this);
}
+ public void close() {
+ UiObjectFuncs.instance.close(this);
+ }
+
public long addEventHandler(EventHandler handler) {
eventHandlers.add(handler);
return eventHandlers.size() - 1;
static UiObjectFuncs instance;
public MethodHandle ui_show;
+ public MethodHandle ui_close;
public MethodHandle ui_window;
public MethodHandle ui_sidebar_window;
public MethodHandle ui_simple_window;
FunctionDescriptor sigv_mmmm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
MemorySegment ui_show_addr = lib.find("ui_show").orElseThrow();
+ MemorySegment ui_close_addr = lib.find("ui_close").orElseThrow();
MemorySegment ui_window_addr = lib.find("ui_window").orElseThrow();
MemorySegment ui_sidebar_window_addr = lib.find("ui_sidebar_window").orElseThrow();
MemorySegment ui_simple_window_addr = lib.find("ui_simple_window").orElseThrow();
MemorySegment ui_savefiledialog_addr = lib.find("ui_savefiledialog").orElseThrow();
ui_show = linker.downcallHandle(ui_show_addr, sigv_m);
+ ui_close = linker.downcallHandle(ui_close_addr, sigv_m);
ui_window = linker.downcallHandle(ui_window_addr, sigm_mm);
ui_sidebar_window = linker.downcallHandle(ui_sidebar_window_addr, sigm_mm);
ui_simple_window = linker.downcallHandle(ui_simple_window_addr, sigm_mm);
}
}
+ void close(UiObject obj) {
+ try {
+ ui_close.invoke(obj.ptr);
+ } catch (Throwable e) {}
+ }
+
public void openFileDialog(UiObject obj, int mode, EventHandler callback) {
EventWrapper ew = new EventWrapper(callback, true);
try {
import de.unixwork.ui.UiWidget
import de.unixwork.ui.WebView
import de.unixwork.ui.Label
+import de.unixwork.ui.ListViewBuilder
+import de.unixwork.ui.UiText
+import java.awt.TextArea
class Toplevel(obj: UiObject) {
val ui: UiObject = obj
ui.show()
}
+ fun close() {
+ ui.close()
+ }
+
operator fun invoke(block: Toplevel.() -> Unit) {
block()
}
)
}
- fun <T>listview(
+ fun <T>createListView(
+ list: ListViewBuilder<T>,
varname: String? = null,
value: UiList<T>? = null,
fill: Boolean = false,
styleClass: String? = null,
getvalue: ListValueConverter<T>? = null
): UiWidget {
- val list = ListView.list<T>(ui)
varname?.let {
list.varname(varname)
}
return list.create()
}
+ fun <T>listview(
+ varname: String? = null,
+ value: UiList<T>? = null,
+ 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,
+ getvalue: ListValueConverter<T>? = null
+ ): UiWidget {
+ val list = ListView.list<T>(ui)
+ return createListView(
+ list = list,
+ varname = varname,
+ value = value,
+ fill = fill,
+ hexpand = hexpand,
+ vexpand = vexpand,
+ hfill = hfill,
+ vfill = vfill,
+ overrideDefaults = overrideDefaults,
+ colspan = colspan,
+ rowspan = rowspan,
+ name = name,
+ styleClass = styleClass,
+ getvalue = getvalue
+ )
+ }
+
+ fun <T>dropdown(
+ varname: String? = null,
+ value: UiList<T>? = null,
+ 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,
+ getvalue: ListValueConverter<T>? = null
+ ): UiWidget {
+ val list = ListView.dropdown<T>(ui)
+ return createListView(
+ list = list,
+ varname = varname,
+ value = value,
+ fill = fill,
+ hexpand = hexpand,
+ vexpand = vexpand,
+ hfill = hfill,
+ vfill = vfill,
+ overrideDefaults = overrideDefaults,
+ colspan = colspan,
+ rowspan = rowspan,
+ name = name,
+ styleClass = styleClass,
+ getvalue = getvalue
+ )
+ }
+
fun <T>sourcelist(
varname: String? = null,
sourceList: UiSourceList? = null,
return list.create()
}
+ fun textarea(
+ varname: String? = null,
+ value: UiText? = null,
+ 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,
+ onChange: EventHandler? = null
+ ): UiWidget {
+ val textarea = Text.textarea(ui)
+ varname?.let {
+ textarea.varname(it)
+ }
+ value?.let {
+ textarea.value(it)
+ }
+ if(fill) {
+ textarea.fill(fill);
+ }
+ if(hexpand) {
+ textarea.hexpand(true)
+ }
+ if(vexpand) {
+ textarea.vexpand(true)
+ }
+ if(hfill) {
+ textarea.hfill(true)
+ }
+ if(vfill) {
+ textarea.vfill(true)
+ }
+ if(colspan > 0) {
+ textarea.colspan(colspan)
+ }
+ if(rowspan > 0) {
+ textarea.rowspan(rowspan)
+ }
+ if(overrideDefaults) {
+ textarea.overrideDefaults(true)
+ }
+ name?.let {
+ textarea.name(it)
+ }
+ styleClass?.let {
+ textarea.styleClass(it)
+ }
+ onChange?.let {
+ textarea.onChange(onChange)
+ }
+ return textarea.create()
+ }
+
private fun createTextField(
textfield: TextFieldBuilder,
varname: String? = null,
fun dialogWindow(
parent: UiObject,
+ title: String? = null,
modal: Boolean? = null,
titlebarButtons: Boolean? = null,
showCloseButton: Boolean? = null,
ui: (Toplevel.() -> Unit)?): Toplevel
{
val builder = DialogWindowBuilder(parent)
+ title?.let {
+ builder.title(it)
+ }
modal?.let {
builder.modal(it)
}