diff options
-rw-r--r-- | res/about/version.gmi | 5 | ||||
-rw-r--r-- | src/ui/labelwidget.c | 8 | ||||
-rw-r--r-- | src/ui/sidebarwidget.c | 23 | ||||
-rw-r--r-- | src/ui/util.c | 10 | ||||
-rw-r--r-- | src/ui/widget.c | 2 |
5 files changed, 39 insertions, 9 deletions
diff --git a/res/about/version.gmi b/res/about/version.gmi index f3cd21c0..08f39691 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi | |||
@@ -7,6 +7,10 @@ | |||
7 | # Release notes | 7 | # Release notes |
8 | 8 | ||
9 | ## 1.9.2 | 9 | ## 1.9.2 |
10 | * Fixed possible crash when switching Feeds sidebar filter mode via the popup menu. | ||
11 | * Shorter label for "Mark All as Read" in Feeds sidebar actions. | ||
12 | * In popup menus, differentiate between selected item and hover item. | ||
13 | * Updated UI translations. | ||
10 | * Windows: Use the correct version number for update checks. | 14 | * Windows: Use the correct version number for update checks. |
11 | 15 | ||
12 | ## 1.9.1 | 16 | ## 1.9.1 |
@@ -20,7 +24,6 @@ | |||
20 | * Fixed the New Tab button not staying at the right edge of the window, depending on how many tabs are open. | 24 | * Fixed the New Tab button not staying at the right edge of the window, depending on how many tabs are open. |
21 | 25 | ||
22 | ## 1.9 | 26 | ## 1.9 |
23 | |||
24 | New features: | 27 | New features: |
25 | * Added a toolbar button for toggling the left sidebar. | 28 | * Added a toolbar button for toggling the left sidebar. |
26 | * Added an unsplit button in the toolbar when in split view mode. | 29 | * Added an unsplit button in the toolbar when in split view mode. |
diff --git a/src/ui/labelwidget.c b/src/ui/labelwidget.c index f6ddfd43..4dd66a28 100644 --- a/src/ui/labelwidget.c +++ b/src/ui/labelwidget.c | |||
@@ -198,6 +198,7 @@ static void getColors_LabelWidget_(const iLabelWidget *d, int *bg, int *fg, int | |||
198 | const iBool isSel = (flags & selected_WidgetFlag) != 0; | 198 | const iBool isSel = (flags & selected_WidgetFlag) != 0; |
199 | const iBool isFrameless = (flags & frameless_WidgetFlag) != 0; | 199 | const iBool isFrameless = (flags & frameless_WidgetFlag) != 0; |
200 | const iBool isButton = d->click.button != 0; | 200 | const iBool isButton = d->click.button != 0; |
201 | const iBool isMenuItem = !cmp_String(id_Widget(parent_Widget(d)), "menu"); | ||
201 | const iBool isKeyRoot = (w->root == get_Window()->keyRoot); | 202 | const iBool isKeyRoot = (w->root == get_Window()->keyRoot); |
202 | const iBool isDarkTheme = isDark_ColorTheme(colorTheme_App()); | 203 | const iBool isDarkTheme = isDark_ColorTheme(colorTheme_App()); |
203 | /* Default color state. */ | 204 | /* Default color state. */ |
@@ -215,7 +216,12 @@ static void getColors_LabelWidget_(const iLabelWidget *d, int *bg, int *fg, int | |||
215 | *meta = uiTextDisabled_ColorId; | 216 | *meta = uiTextDisabled_ColorId; |
216 | } | 217 | } |
217 | if (isSel) { | 218 | if (isSel) { |
218 | *bg = uiBackgroundSelected_ColorId; | 219 | if (isMenuItem) { |
220 | *bg = uiBackgroundUnfocusedSelection_ColorId; | ||
221 | } | ||
222 | else { | ||
223 | *bg = uiBackgroundSelected_ColorId; | ||
224 | } | ||
219 | // if (!isKeyRoot) { | 225 | // if (!isKeyRoot) { |
220 | // *bg = uiEmbossSelected1_ColorId; //uiBackgroundUnfocusedSelection_ColorId; | 226 | // *bg = uiEmbossSelected1_ColorId; //uiBackgroundUnfocusedSelection_ColorId; |
221 | // } | 227 | // } |
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 3d663afd..2219eba9 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c | |||
@@ -264,10 +264,12 @@ static iBool isBookmarkFolded_SidebarWidget_(const iSidebarWidget *d, const iBoo | |||
264 | return iFalse; | 264 | return iFalse; |
265 | } | 265 | } |
266 | 266 | ||
267 | static void updateItems_SidebarWidget_(iSidebarWidget *d) { | 267 | static void updateItemsWithFlags_SidebarWidget_(iSidebarWidget *d, iBool keepActions) { |
268 | clear_ListWidget(d->list); | 268 | clear_ListWidget(d->list); |
269 | releaseChildren_Widget(d->blank); | 269 | releaseChildren_Widget(d->blank); |
270 | if (!keepActions) { | ||
270 | releaseChildren_Widget(d->actions); | 271 | releaseChildren_Widget(d->actions); |
272 | } | ||
271 | d->actions->rect.size.y = 0; | 273 | d->actions->rect.size.y = 0; |
272 | destroy_Widget(d->menu); | 274 | destroy_Widget(d->menu); |
273 | destroy_Widget(d->modeMenu); | 275 | destroy_Widget(d->modeMenu); |
@@ -348,7 +350,8 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { | |||
348 | break; | 350 | break; |
349 | } | 351 | } |
350 | } | 352 | } |
351 | /* Actions. */ { | 353 | /* Actions. */ |
354 | if (!keepActions) { | ||
352 | addActionButton_SidebarWidget_( | 355 | addActionButton_SidebarWidget_( |
353 | d, check_Icon " ${sidebar.action.feeds.markallread}", "feeds.markallread", expand_WidgetFlag | | 356 | d, check_Icon " ${sidebar.action.feeds.markallread}", "feeds.markallread", expand_WidgetFlag | |
354 | tight_WidgetFlag); | 357 | tight_WidgetFlag); |
@@ -362,6 +365,8 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { | |||
362 | iWidget *dropButton = addChild_Widget( | 365 | iWidget *dropButton = addChild_Widget( |
363 | d->actions, | 366 | d->actions, |
364 | iClob(makeMenuButton_LabelWidget(items[d->feedsMode].label, items, 2))); | 367 | iClob(makeMenuButton_LabelWidget(items[d->feedsMode].label, items, 2))); |
368 | setId_Widget(dropButton, "feeds.modebutton"); | ||
369 | checkIcon_LabelWidget((iLabelWidget *) dropButton); | ||
365 | setFixedSize_Widget( | 370 | setFixedSize_Widget( |
366 | dropButton, | 371 | dropButton, |
367 | init_I2(iMaxi(20 * gap_UI, measure_Text( | 372 | init_I2(iMaxi(20 * gap_UI, measure_Text( |
@@ -371,6 +376,10 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { | |||
371 | 6 * gap_UI), | 376 | 6 * gap_UI), |
372 | -1)); | 377 | -1)); |
373 | } | 378 | } |
379 | else { | ||
380 | updateDropdownSelection_LabelWidget(findChild_Widget(d->actions, "feeds.modebutton"), | ||
381 | format_CStr(" arg:%d", d->feedsMode)); | ||
382 | } | ||
374 | d->menu = makeMenu_Widget( | 383 | d->menu = makeMenu_Widget( |
375 | as_Widget(d), | 384 | as_Widget(d), |
376 | (iMenuItem[]){ { openTab_Icon " ${feeds.entry.newtab}", 0, 0, "feed.entry.opentab" }, | 385 | (iMenuItem[]){ { openTab_Icon " ${feeds.entry.newtab}", 0, 0, "feed.entry.opentab" }, |
@@ -653,6 +662,10 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) { | |||
653 | updateMouseHover_ListWidget(d->list); | 662 | updateMouseHover_ListWidget(d->list); |
654 | } | 663 | } |
655 | 664 | ||
665 | static void updateItems_SidebarWidget_(iSidebarWidget *d) { | ||
666 | updateItemsWithFlags_SidebarWidget_(d, iFalse); | ||
667 | } | ||
668 | |||
656 | static size_t findItem_SidebarWidget_(const iSidebarWidget *d, int id) { | 669 | static size_t findItem_SidebarWidget_(const iSidebarWidget *d, int id) { |
657 | /* Note that this is O(n), so only meant for infrequent use. */ | 670 | /* Note that this is O(n), so only meant for infrequent use. */ |
658 | for (size_t i = 0; i < numItems_ListWidget(d->list); i++) { | 671 | for (size_t i = 0; i < numItems_ListWidget(d->list); i++) { |
@@ -1315,9 +1328,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
1315 | } | 1328 | } |
1316 | return iTrue; | 1329 | return iTrue; |
1317 | } | 1330 | } |
1318 | else if (isCommand_Widget(w, ev, "menu.closed")) { | 1331 | // else if (isCommand_Widget(w, ev, "menu.closed")) { |
1319 | // invalidateItem_ListWidget(d->list, d->contextIndex); | 1332 | // invalidateItem_ListWidget(d->list, d->contextIndex); |
1320 | } | 1333 | // } |
1321 | else if (isCommand_Widget(w, ev, "bookmark.open")) { | 1334 | else if (isCommand_Widget(w, ev, "bookmark.open")) { |
1322 | const iSidebarItem *item = d->contextItem; | 1335 | const iSidebarItem *item = d->contextItem; |
1323 | if (d->mode == bookmarks_SidebarMode && item) { | 1336 | if (d->mode == bookmarks_SidebarMode && item) { |
@@ -1474,7 +1487,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
1474 | } | 1487 | } |
1475 | else if (equalWidget_Command(cmd, w, "feeds.mode")) { | 1488 | else if (equalWidget_Command(cmd, w, "feeds.mode")) { |
1476 | d->feedsMode = arg_Command(cmd); | 1489 | d->feedsMode = arg_Command(cmd); |
1477 | updateItems_SidebarWidget_(d); | 1490 | updateItemsWithFlags_SidebarWidget_(d, iTrue); |
1478 | return iTrue; | 1491 | return iTrue; |
1479 | } | 1492 | } |
1480 | else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { | 1493 | else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { |
diff --git a/src/ui/util.c b/src/ui/util.c index 84de4b74..cfb2b230 100644 --- a/src/ui/util.c +++ b/src/ui/util.c | |||
@@ -1036,7 +1036,8 @@ void openMenuFlags_Widget(iWidget *d, iInt2 windowCoord, int menuOpenFlags) { | |||
1036 | setFlags_Widget(findChild_Widget(d, "menu.cancel"), disabled_WidgetFlag, iFalse); | 1036 | setFlags_Widget(findChild_Widget(d, "menu.cancel"), disabled_WidgetFlag, iFalse); |
1037 | arrange_Widget(d); /* need to know the height */ | 1037 | arrange_Widget(d); /* need to know the height */ |
1038 | iBool allowOverflow = iFalse; | 1038 | iBool allowOverflow = iFalse; |
1039 | /* A vertical offset determined by a possible selected label in the menu. */ { | 1039 | /* A vertical offset determined by a possible selected label in the menu. */ |
1040 | if (windowCoord.y < rootSize.y - lineHeight_Text(uiNormal_FontSize) * 3) { | ||
1040 | iConstForEach(ObjectList, child, children_Widget(d)) { | 1041 | iConstForEach(ObjectList, child, children_Widget(d)) { |
1041 | const iWidget *item = constAs_Widget(child.object); | 1042 | const iWidget *item = constAs_Widget(child.object); |
1042 | if (flags_Widget(item) & selected_WidgetFlag) { | 1043 | if (flags_Widget(item) & selected_WidgetFlag) { |
@@ -1269,6 +1270,9 @@ const iString *removeMenuItemLabelPrefixes_String(const iString *d) { | |||
1269 | } | 1270 | } |
1270 | 1271 | ||
1271 | void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *selectedCommand) { | 1272 | void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *selectedCommand) { |
1273 | if (!dropButton) { | ||
1274 | return; | ||
1275 | } | ||
1272 | iWidget *menu = findChild_Widget(as_Widget(dropButton), "menu"); | 1276 | iWidget *menu = findChild_Widget(as_Widget(dropButton), "menu"); |
1273 | if (flags_Widget(menu) & nativeMenu_WidgetFlag) { | 1277 | if (flags_Widget(menu) & nativeMenu_WidgetFlag) { |
1274 | unselectAllNativeMenuItems_Widget(menu); | 1278 | unselectAllNativeMenuItems_Widget(menu); |
@@ -1277,6 +1281,7 @@ void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *s | |||
1277 | setSelected_NativeMenuItem(item, iTrue); | 1281 | setSelected_NativeMenuItem(item, iTrue); |
1278 | updateText_LabelWidget( | 1282 | updateText_LabelWidget( |
1279 | dropButton, removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); | 1283 | dropButton, removeMenuItemLabelPrefixes_String(collectNewCStr_String(item->label))); |
1284 | checkIcon_LabelWidget(dropButton); | ||
1280 | } | 1285 | } |
1281 | return; | 1286 | return; |
1282 | } | 1287 | } |
@@ -1287,6 +1292,7 @@ void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *s | |||
1287 | setFlags_Widget(as_Widget(item), selected_WidgetFlag, isSelected); | 1292 | setFlags_Widget(as_Widget(item), selected_WidgetFlag, isSelected); |
1288 | if (isSelected) { | 1293 | if (isSelected) { |
1289 | updateText_LabelWidget(dropButton, sourceText_LabelWidget(item)); | 1294 | updateText_LabelWidget(dropButton, sourceText_LabelWidget(item)); |
1295 | checkIcon_LabelWidget(dropButton); | ||
1290 | } | 1296 | } |
1291 | } | 1297 | } |
1292 | } | 1298 | } |
@@ -2352,6 +2358,7 @@ iWidget *makePreferences_Widget(void) { | |||
2352 | { "radio device:1 id:prefs.pinsplit", 0, 0, (const void *) pinSplitItems }, | 2358 | { "radio device:1 id:prefs.pinsplit", 0, 0, (const void *) pinSplitItems }, |
2353 | { "padding" }, | 2359 | { "padding" }, |
2354 | { "dropdown id:prefs.uilang", 0, 0, (const void *) langItems }, | 2360 | { "dropdown id:prefs.uilang", 0, 0, (const void *) langItems }, |
2361 | { "toggle id:prefs.time.24h" }, | ||
2355 | { NULL } | 2362 | { NULL } |
2356 | }; | 2363 | }; |
2357 | const iMenuItem uiPanelItems[] = { | 2364 | const iMenuItem uiPanelItems[] = { |
@@ -2436,6 +2443,7 @@ iWidget *makePreferences_Widget(void) { | |||
2436 | const iMenuItem aboutPanelItems[] = { | 2443 | const iMenuItem aboutPanelItems[] = { |
2437 | { format_CStr("heading text:%s", cstr_String(aboutText)) }, | 2444 | { format_CStr("heading text:%s", cstr_String(aboutText)) }, |
2438 | { "button text:" clock_Icon " ${menu.releasenotes}", 0, 0, "!open url:about:version" }, | 2445 | { "button text:" clock_Icon " ${menu.releasenotes}", 0, 0, "!open url:about:version" }, |
2446 | { "padding" }, | ||
2439 | { "button text:" globe_Icon " ${menu.website}", 0, 0, "!open url:https://gmi.skyjake.fi/lagrange" }, | 2447 | { "button text:" globe_Icon " ${menu.website}", 0, 0, "!open url:https://gmi.skyjake.fi/lagrange" }, |
2440 | { "button text:" envelope_Icon " @jk@skyjake.fi", 0, 0, "!open url:https://skyjake.fi/@jk" }, | 2448 | { "button text:" envelope_Icon " @jk@skyjake.fi", 0, 0, "!open url:https://skyjake.fi/@jk" }, |
2441 | { "padding" }, | 2449 | { "padding" }, |
diff --git a/src/ui/widget.c b/src/ui/widget.c index a171a6cd..cedda461 100644 --- a/src/ui/widget.c +++ b/src/ui/widget.c | |||
@@ -1528,7 +1528,7 @@ static void addToPotentiallyVisible_Widget_(const iWidget *d, iPtrArray *pvs, iR | |||
1528 | } | 1528 | } |
1529 | if (isFullyContainedByOther_Rect(bounds, *fullyMasked)) { | 1529 | if (isFullyContainedByOther_Rect(bounds, *fullyMasked)) { |
1530 | return; /* can't be seen */ | 1530 | return; /* can't be seen */ |
1531 | } | 1531 | } |
1532 | pushBack_PtrArray(pvs, d); | 1532 | pushBack_PtrArray(pvs, d); |
1533 | if (d->bgColor >= 0 && ~d->flags & noBackground_WidgetFlag && | 1533 | if (d->bgColor >= 0 && ~d->flags & noBackground_WidgetFlag && |
1534 | isFullyContainedByOther_Rect(*fullyMasked, bounds)) { | 1534 | isFullyContainedByOther_Rect(*fullyMasked, bounds)) { |