class App : Application {
override fun startup() {
val window = MainWindow()
-
- val data = FeedSourceList()
- window.window.ui.attach(data)
-
window.show()
}
import java.sql.Connection
import java.sql.DriverManager
+import java.sql.Statement
object Database {
val connection: Connection
groups.add(currentGroup)
}
- currentGroup.feeds.add(FeedCollection(feedId, feedName))
+ if(feedId != null && feedName != null) {
+ currentGroup.feeds.add(FeedCollection(feedId, feedName))
+ }
+
}
rs.close()
}
return groups
}
+
+ public fun newFeedGroup(name: String) : FeedGroup {
+ var groupId = 0
+ connection.prepareStatement("""
+ insert into groups (pos, name) select max(pos)+1, ? from groups
+ """.trimIndent(), Statement.RETURN_GENERATED_KEYS).use { stmt ->
+ stmt.setString(1, name)
+ stmt.execute()
+ stmt.generatedKeys.use { rs ->
+ if(rs.next()) {
+ groupId = rs.getInt(1)
+ } else {
+ throw Exception("Insert Group failed")
+ }
+ }
+ }
+ return FeedGroup(groupId, name)
+ }
}
import de.unixwork.ui.Document
import de.unixwork.ui.SubList
+import de.unixwork.ui.UiList
class FeedSourceList : Document() {
val feeds = this.sourcelist("feeds")
+ val groups: List<FeedGroup>
init {
val db = Database
- val groups = db.getFeedTree()
+ groups = db.getFeedTree()
groups.forEach {
val sublist = SubList<FeedCollection>()
sublist.header = it.name
package de.unixwork.rssreader
import de.unixwork.ui.SubListItem
+import de.unixwork.ui.UiString
import de.unixwork.ui.kotlin.Toplevel
import de.unixwork.ui.kotlin.sidebarWindow
import de.unixwork.ui.kotlin.dialogWindow
class MainWindow {
val window : Toplevel
+ val sourceList = FeedSourceList()
init {
window = sidebarWindow("RSS Reader") {
}
}
+
+ window.ui.attach(sourceList)
}
private fun createFeedDialog() {
title = "Add Feed",
lbutton1 = "Add",
rbutton4 = "Cancel",
+ modal = true,
+ showCloseButton = false,
onClick = { ev ->
ev.`object`.close()
- },
- modal = true)
+ })
{
+ // data
+ ui.list<FeedGroup>("groups").addAll(sourceList.groups)
+
+ // UI
grid(
margin = 12,
columnspacing = 8,
{
row {
rlabel("Category")
- dropdown<String>(varname = "group", hexpand = true) { elm, column ->
- ""
+ dropdown<FeedGroup>(varname = "groups", hexpand = true) { elm, column ->
+ elm.name
}
}
row {
}
private fun createCategoryDialog() {
+ var name: UiString? = null
val w = dialogWindow(
parent = window.ui,
title = "Add Category",
lbutton1 = "Add",
- modal = true)
+ rbutton4 = "Cancel",
+ modal = true,
+ showCloseButton = false,
+ onClick = { ev ->
+ val nameStr = name.toString()
+ Database.newFeedGroup(nameStr)
+ ev.`object`.close()
+ })
{
+ name = ui.string()
+
grid(
margin = 12,
columnspacing = 8,
{
row {
rlabel("Name")
- textfield(varname = "name", hexpand = true)
+ textfield(value = name, hexpand = true)
}
}
}
public MethodHandle list_set_data;
public MethodHandle list_get_iter;
public MethodHandle list_set_iter;
+ public MethodHandle list_update_row;
public MethodHandle srclist_new;
public MethodHandle srclist_add;
MemorySegment ui_list_set_data_addr = lib.find("ui_list_set_data").orElseThrow();
MemorySegment ui_list_get_iter_addr = lib.find("ui_list_get_iter").orElseThrow();
MemorySegment ui_list_set_iter_addr = lib.find("ui_list_set_iter").orElseThrow();
+ MemorySegment ui_list_update_row_addr = lib.find("ui_list_update_row").orElseThrow();
MemorySegment ui_srclist_new_addr = lib.find("ui_srclist_new").orElseThrow();
MemorySegment ui_srclist_add_addr = lib.find("ui_srclist_add").orElseThrow();
list_set_data = linker.downcallHandle(ui_list_set_data_addr, sigm_mm);
list_get_iter = linker.downcallHandle(ui_list_get_iter_addr, sigm_m);
list_set_iter = linker.downcallHandle(ui_list_set_iter_addr, sigm_mm);
+ list_update_row = linker.downcallHandle(ui_list_update_row_addr, sigv_mi);
srclist_new = linker.downcallHandle(ui_srclist_new_addr, sigm_mm);
srclist_add = linker.downcallHandle(ui_srclist_add_addr, sigv_mm);
}
}
+ public void update() {
+ update(-1);
+ }
+
+ public void update(int row) {
+ ListFuncs ui = ListFuncs.getInstance();
+ try {
+ ui.list_update_row.invoke(valuePtr, row);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public void free() {
ToolkitFuncs tk = ToolkitFuncs.getInstance();
try {
protected static MemorySegment next(MemorySegment ls) {
UiList list = UiList.getList(ls);
- if(list.iter >= list.size()) {
+ if(list.iter+1 >= list.size()) {
return MemorySegment.NULL;
}
list.iter++;