application/davcontroller.c

changeset 15
78684a24dc52
parent 13
5a8762fcfecc
child 16
f2e79b69d233
--- a/application/davcontroller.c	Tue Jan 30 14:01:04 2024 +0100
+++ b/application/davcontroller.c	Tue Jan 30 16:01:44 2024 +0100
@@ -38,6 +38,10 @@
     UiContext *ctx = ui_document_context(doc);
     doc->ctx = ctx;
 
+    doc->navigation_stack = cxLinkedListCreateSimple(CX_STORE_POINTERS);
+    doc->navstack_enabled = true;
+    doc->navstack_pos = 0;
+
     doc->dav_queue = ui_threadpool_create(1);
 
     doc->path = ui_string_new(ctx, "path");
@@ -149,6 +153,8 @@
     ui_threadpool_job(browser->dav_queue, ui, browser_query_path, query, browser_query_finished, query);
 
     window_progress(ui->window, 1);
+
+    davbrowser_add2navstack(browser, browser->repo_base, path);
 }
 
 void davbrowser_query_url(UiObject *ui, DavBrowser *browser, const char *url) {
@@ -165,3 +171,43 @@
 
     // TODO:
 }
+
+void davbrowser_add2navstack(DavBrowser *browser, const char *base, const char *path) {
+    if (browser->navstack_enabled) {
+        for (int i = 0; i < browser->navstack_pos; i++) {
+            char *nav_url = cxListAt(browser->navigation_stack, 0);
+            cxListRemove(browser->navigation_stack, 0);
+            free(nav_url);
+        }
+        browser->navstack_pos = 0;
+
+        char *nav_url = util_concat_path(base, path);
+        cxListInsert(browser->navigation_stack, 0, nav_url);
+
+        if (browser->navigation_stack->size > DAVBROWSER_MAX_NAVLIST) {
+            char *nav = cxListAt(browser->navigation_stack, browser->navigation_stack->size - 1);
+            free(nav);
+            cxListRemove(browser->navigation_stack, browser->navigation_stack->size - 1);
+        }
+    }
+}
+
+void davbrowser_navigation_back(UiObject *ui, DavBrowser *browser) {
+    if (browser->navstack_pos+1 < browser->navigation_stack->size) {
+        browser->navstack_pos++;
+        char *nav_url = cxListAt(browser->navigation_stack, browser->navstack_pos);
+        browser->navstack_enabled = false;
+        davbrowser_query_url(ui, browser, nav_url);
+        browser->navstack_enabled = true;
+    }
+}
+
+void davbrowser_navigation_forward(UiObject *ui, DavBrowser *browser) {
+    if (browser->navstack_pos > 0) {
+        browser->navstack_pos--;
+        char *nav_url = cxListAt(browser->navigation_stack, browser->navstack_pos);
+        browser->navstack_enabled = false;
+        davbrowser_query_url(ui, browser, nav_url);
+        browser->navstack_enabled = true;
+    }
+}

mercurial