Lagrange [release]
Preferences: Add bookmarks to bottom/top
[1mdiff --git a/po/en.po b/po/en.po[m
[1mindex 9b09ec9c..dcbcc67f 100644[m
[1m--- a/po/en.po[m
[1m+++ b/po/en.po[m
[36m@@ -1314,6 +1314,9 @@[m [mmsgstr "Vertical centering:"[m
msgid "prefs.collapsepreonload"[m
msgstr "Collapse preformatted:"[m
[m
[32m+[m[32mmsgid "prefs.bookmarks.addbottom"[m
[32m+[m[32mmsgstr "Add bookmarks to bottom:"[m
[32m+[m
# User preference that controls whether index.gmi pages get automatically opened when browsing the contents of a directory inside a compressed archive.[m
msgid "prefs.archive.openindex"[m
msgstr "Open archive indices:"[m
[1mdiff --git a/src/app.c b/src/app.c[m
[1mindex 5fc01a5b..b7db6dce 100644[m
[1m--- a/src/app.c[m
[1m+++ b/src/app.c[m
[36m@@ -238,6 +238,7 @@[m [mstatic iString *serializePrefs_App_(const iApp *d) {[m
appendFormat_String(str, "prefs.centershort.changed arg:%d\n", d->prefs.centerShortDocs);[m
appendFormat_String(str, "prefs.collapsepreonload.changed arg:%d\n", d->prefs.collapsePreOnLoad);[m
appendFormat_String(str, "prefs.hoverlink.changed arg:%d\n", d->prefs.hoverLink);[m
[32m+[m[32m appendFormat_String(str, "prefs.bookmarks.addbottom.changed arg:%d\n", d->prefs.addBookmarksToBottom);[m
appendFormat_String(str, "prefs.archive.openindex.changed arg:%d\n", d->prefs.openArchiveIndexPages);[m
appendFormat_String(str, "quoteicon.set arg:%d\n", d->prefs.quoteIcon ? 1 : 0);[m
appendFormat_String(str, "theme.set arg:%d auto:1\n", d->prefs.theme);[m
[36m@@ -2358,6 +2359,10 @@[m [miBool handleCommand_App(const char *cmd) {[m
d->prefs.openArchiveIndexPages = arg_Command(cmd) != 0;[m
return iTrue;[m
}[m
[32m+[m[32m else if (equal_Command(cmd, "prefs.bookmarks.addbottom.changed")) {[m
[32m+[m[32m d->prefs.addBookmarksToBottom = arg_Command(cmd) != 0;[m
[32m+[m[32m return iTrue;[m
[32m+[m[32m }[m
else if (equal_Command(cmd, "prefs.animate.changed")) {[m
d->prefs.uiAnimations = arg_Command(cmd) != 0;[m
return iTrue;[m
[36m@@ -2654,6 +2659,7 @@[m [miBool handleCommand_App(const char *cmd) {[m
setToggle_Widget(findChild_Widget(dlg, "prefs.smoothscroll"), d->prefs.smoothScrolling);[m
setToggle_Widget(findChild_Widget(dlg, "prefs.imageloadscroll"), d->prefs.loadImageInsteadOfScrolling);[m
setToggle_Widget(findChild_Widget(dlg, "prefs.hidetoolbarscroll"), d->prefs.hideToolbarOnScroll);[m
[32m+[m[32m setToggle_Widget(findChild_Widget(dlg, "prefs.bookmarks.addbottom"), d->prefs.addBookmarksToBottom);[m
setToggle_Widget(findChild_Widget(dlg, "prefs.archive.openindex"), d->prefs.openArchiveIndexPages);[m
setToggle_Widget(findChild_Widget(dlg, "prefs.ostheme"), d->prefs.useSystemTheme);[m
setToggle_Widget(findChild_Widget(dlg, "prefs.customframe"), d->prefs.customFrame);[m
[1mdiff --git a/src/bookmarks.c b/src/bookmarks.c[m
[1mindex 67c6a25f..1a260f3a 100644[m
[1m--- a/src/bookmarks.c[m
[1m+++ b/src/bookmarks.c[m
[36m@@ -327,11 +327,18 @@[m [mvoid save_Bookmarks(const iBookmarks *d, const char *dirPath) {[m
unlock_Mutex(d->mtx);[m
}[m
[m
[31m-static int maxOrder_Bookmarks_(const iBookmarks *d) {[m
[31m- int ord = 0;[m
[32m+[m[32mstatic iRangei orderRange_Bookmarks_(const iBookmarks *d) {[m
[32m+[m[32m iRangei ord = { 0, 0 };[m
iConstForEach(Hash, i, &d->bookmarks) {[m
const iBookmark *bm = (const iBookmark *) i.value;[m
[31m- ord = iMax(ord, bm->order);[m
[32m+[m[32m if (isEmpty_Range(&ord)) {[m
[32m+[m[32m ord.start = bm->order;[m
[32m+[m[32m ord.end = bm->order + 1;[m
[32m+[m[32m }[m
[32m+[m[32m else {[m
[32m+[m[32m ord.start = iMin(ord.start, bm->order);[m
[32m+[m[32m ord.end = iMax(ord.end, bm->order + 1);[m
[32m+[m[32m }[m
}[m
return ord;[m
}[m
[36m@@ -349,7 +356,13 @@[m [muint32_t add_Bookmarks(iBookmarks *d, const iString *url, const iString *title,[m
}[m
bm->icon = icon;[m
initCurrent_Time(&bm->when);[m
[31m- bm->order = maxOrder_Bookmarks_(d) + 1; /* Last in lists. */[m
[32m+[m[32m const iRangei ord = orderRange_Bookmarks_(d);[m
[32m+[m[32m if (prefs_App()->addBookmarksToBottom) {[m
[32m+[m[32m bm->order = ord.end; /* Last in lists. */[m
[32m+[m[32m }[m
[32m+[m[32m else {[m
[32m+[m[32m bm->order = ord.start - 1; /* First in lists. */[m
[32m+[m[32m }[m
insert_Bookmarks_(d, bm);[m
unlock_Mutex(d->mtx);[m
return id_Bookmark(bm);[m
[1mdiff --git a/src/prefs.c b/src/prefs.c[m
[1mindex 088cc7bc..5fed0a76 100644[m
[1m--- a/src/prefs.c[m
[1m+++ b/src/prefs.c[m
[36m@@ -47,6 +47,7 @@[m [mvoid init_Prefs(iPrefs *d) {[m
d->loadImageInsteadOfScrolling = iFalse;[m
d->collapsePreOnLoad = iFalse;[m
d->openArchiveIndexPages = iTrue;[m
[32m+[m[32m d->addBookmarksToBottom = iTrue;[m
d->decodeUserVisibleURLs = iTrue;[m
d->maxCacheSize = 10;[m
d->maxMemorySize = 200;[m
[1mdiff --git a/src/prefs.h b/src/prefs.h[m
[1mindex 37aeb260..a04cda70 100644[m
[1m--- a/src/prefs.h[m
[1m+++ b/src/prefs.h[m
[36m@@ -63,6 +63,7 @@[m [mstruct Impl_Prefs {[m
iBool collapsePreOnLoad;[m
iString searchUrl;[m
iBool openArchiveIndexPages;[m
[32m+[m[32m iBool addBookmarksToBottom;[m
/* Network */[m
iString caFile;[m
iString caPath;[m
[1mdiff --git a/src/ui/util.c b/src/ui/util.c[m
[1mindex adca6269..b18a3292 100644[m
[1m--- a/src/ui/util.c[m
[1m+++ b/src/ui/util.c[m
[36m@@ -2349,6 +2349,7 @@[m [miWidget *makePreferences_Widget(void) {[m
setUrlContent_InputWidget(searchUrl, iTrue);[m
addDialogPadding_(headings, values);[m
addDialogToggle_(headings, values, "${prefs.hoverlink}", "prefs.hoverlink");[m
[32m+[m[32m addDialogToggle_(headings, values, "${prefs.bookmarks.addbottom}", "prefs.bookmarks.addbottom");[m
addDialogToggle_(headings, values, "${prefs.archive.openindex}", "prefs.archive.openindex");[m
if (deviceType_App() != phone_AppDeviceType) {[m
addChild_Widget(headings, iClob(makeHeading_Widget("${prefs.pinsplit}")));[m