--- 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; + } +}