summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--po/en.po12
-rw-r--r--res/lang/en.binbin17031 -> 17173 bytes
-rw-r--r--res/lang/es.binbin18642 -> 18784 bytes
-rw-r--r--res/lang/fi.binbin18777 -> 18919 bytes
-rw-r--r--res/lang/ie.binbin17812 -> 17954 bytes
-rw-r--r--res/lang/ru.binbin27657 -> 27799 bytes
-rw-r--r--res/lang/sr.binbin27107 -> 27249 bytes
-rw-r--r--res/lang/zh_Hans.binbin16223 -> 16365 bytes
-rw-r--r--res/lang/zh_Hant.binbin16306 -> 16448 bytes
-rw-r--r--src/ui/listwidget.c4
-rw-r--r--src/ui/listwidget.h2
-rw-r--r--src/ui/sidebarwidget.c45
-rw-r--r--src/ui/sidebarwidget.h5
13 files changed, 58 insertions, 10 deletions
diff --git a/po/en.po b/po/en.po
index f6b96fca..91c2f20c 100644
--- a/po/en.po
+++ b/po/en.po
@@ -331,6 +331,18 @@ msgstr "Identities"
331msgid "sidebar.outline" 331msgid "sidebar.outline"
332msgstr "Outline" 332msgstr "Outline"
333 333
334msgid "sidebar.action.feeds.showall"
335msgstr "All"
336
337msgid "sidebar.action.feeds.showunread"
338msgstr "Unread"
339
340msgid "sidebar.action.ident.new"
341msgstr "New…"
342
343msgid "sidebar.action.ident.import"
344msgstr "Import…"
345
334# Usage: "(count) Unread" in the sidebar tab title, referring to feed entries. 346# Usage: "(count) Unread" in the sidebar tab title, referring to feed entries.
335msgid "sidebar.unread" 347msgid "sidebar.unread"
336msgid_plural "sidebar.unread.n" 348msgid_plural "sidebar.unread.n"
diff --git a/res/lang/en.bin b/res/lang/en.bin
index 30b7912e..68dd31cf 100644
--- a/res/lang/en.bin
+++ b/res/lang/en.bin
Binary files differ
diff --git a/res/lang/es.bin b/res/lang/es.bin
index 88b03d81..baf7eda5 100644
--- a/res/lang/es.bin
+++ b/res/lang/es.bin
Binary files differ
diff --git a/res/lang/fi.bin b/res/lang/fi.bin
index 10024bf7..683ff2f3 100644
--- a/res/lang/fi.bin
+++ b/res/lang/fi.bin
Binary files differ
diff --git a/res/lang/ie.bin b/res/lang/ie.bin
index 13845d4e..c01c564d 100644
--- a/res/lang/ie.bin
+++ b/res/lang/ie.bin
Binary files differ
diff --git a/res/lang/ru.bin b/res/lang/ru.bin
index a975b1ad..8bafab5b 100644
--- a/res/lang/ru.bin
+++ b/res/lang/ru.bin
Binary files differ
diff --git a/res/lang/sr.bin b/res/lang/sr.bin
index d121123a..402394f8 100644
--- a/res/lang/sr.bin
+++ b/res/lang/sr.bin
Binary files differ
diff --git a/res/lang/zh_Hans.bin b/res/lang/zh_Hans.bin
index f43b47b0..56f31979 100644
--- a/res/lang/zh_Hans.bin
+++ b/res/lang/zh_Hans.bin
Binary files differ
diff --git a/res/lang/zh_Hant.bin b/res/lang/zh_Hant.bin
index d192f1fe..3e9b4725 100644
--- a/res/lang/zh_Hant.bin
+++ b/res/lang/zh_Hant.bin
Binary files differ
diff --git a/src/ui/listwidget.c b/src/ui/listwidget.c
index 1f5572bd..dbd8e540 100644
--- a/src/ui/listwidget.c
+++ b/src/ui/listwidget.c
@@ -165,7 +165,7 @@ void setScrollPos_ListWidget(iListWidget *d, int pos) {
165 refresh_Widget(as_Widget(d)); 165 refresh_Widget(as_Widget(d));
166} 166}
167 167
168void scrollOffset_ListWidget(iListWidget *d, int offset) { 168iBool scrollOffset_ListWidget(iListWidget *d, int offset) {
169 const int oldScroll = d->scrollY; 169 const int oldScroll = d->scrollY;
170 d->scrollY += offset; 170 d->scrollY += offset;
171 if (d->scrollY < 0) { 171 if (d->scrollY < 0) {
@@ -180,7 +180,9 @@ void scrollOffset_ListWidget(iListWidget *d, int offset) {
180 } 180 }
181 updateVisible_ListWidget(d); 181 updateVisible_ListWidget(d);
182 refresh_Widget(as_Widget(d)); 182 refresh_Widget(as_Widget(d));
183 return iTrue;
183 } 184 }
185 return iFalse;
184} 186}
185 187
186void scrollToItem_ListWidget(iListWidget *d, size_t index) { 188void scrollToItem_ListWidget(iListWidget *d, size_t index) {
diff --git a/src/ui/listwidget.h b/src/ui/listwidget.h
index 16adf664..d7e2c55e 100644
--- a/src/ui/listwidget.h
+++ b/src/ui/listwidget.h
@@ -61,7 +61,7 @@ int scrollPos_ListWidget (const iListWidget *);
61 61
62void setScrollPos_ListWidget (iListWidget *, int pos); 62void setScrollPos_ListWidget (iListWidget *, int pos);
63void scrollToItem_ListWidget (iListWidget *, size_t index); 63void scrollToItem_ListWidget (iListWidget *, size_t index);
64void scrollOffset_ListWidget (iListWidget *, int offset); 64iBool scrollOffset_ListWidget (iListWidget *, int offset); /* returns true if position changed */
65void updateVisible_ListWidget (iListWidget *); 65void updateVisible_ListWidget (iListWidget *);
66void updateMouseHover_ListWidget (iListWidget *); 66void updateMouseHover_ListWidget (iListWidget *);
67 67
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index b865679e..5c71ef0d 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -91,6 +91,7 @@ struct Impl_SidebarWidget {
91 iWidget widget; 91 iWidget widget;
92 enum iSidebarSide side; 92 enum iSidebarSide side;
93 enum iSidebarMode mode; 93 enum iSidebarMode mode;
94 enum iFeedsMode feedsMode;
94 iString cmdPrefix; 95 iString cmdPrefix;
95 iWidget * blank; 96 iWidget * blank;
96 iListWidget * list; 97 iListWidget * list;
@@ -139,6 +140,7 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
139 d->actions->rect.size.y = 0; 140 d->actions->rect.size.y = 0;
140 destroy_Widget(d->menu); 141 destroy_Widget(d->menu);
141 d->menu = NULL; 142 d->menu = NULL;
143 iBool isEmpty = iFalse; /* show blank? */
142 switch (d->mode) { 144 switch (d->mode) {
143 case feeds_SidebarMode: { 145 case feeds_SidebarMode: {
144 const iString *docUrl = withSpacesEncoded_String(url_DocumentWidget(document_App())); 146 const iString *docUrl = withSpacesEncoded_String(url_DocumentWidget(document_App()));
@@ -150,6 +152,7 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
150 const iDate today = on; 152 const iDate today = on;
151 iZap(on); 153 iZap(on);
152 size_t numItems = 0; 154 size_t numItems = 0;
155 isEmpty = iTrue;
153 iConstForEach(PtrArray, i, listEntries_Feeds()) { 156 iConstForEach(PtrArray, i, listEntries_Feeds()) {
154 const iFeedEntry *entry = i.ptr; 157 const iFeedEntry *entry = i.ptr;
155 if (isHidden_FeedEntry(entry)) { 158 if (isHidden_FeedEntry(entry)) {
@@ -163,6 +166,12 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
163 if (secondsSince_Time(&now, &entry->discovered) > maxAge_Visited) { 166 if (secondsSince_Time(&now, &entry->discovered) > maxAge_Visited) {
164 break; /* the rest are even older */ 167 break; /* the rest are even older */
165 } 168 }
169 isEmpty = iFalse;
170 const iBool isOpen = equal_String(docUrl, &entry->url);
171 const iBool isUnread = isUnread_FeedEntry(entry);
172 if (d->feedsMode == unread_FeedsMode && !isUnread && !isOpen) {
173 continue;
174 }
166 /* Insert date separators. */ { 175 /* Insert date separators. */ {
167 iDate entryDate; 176 iDate entryDate;
168 init_Date(&entryDate, &entry->posted); 177 init_Date(&entryDate, &entry->posted);
@@ -188,10 +197,8 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
188 } 197 }
189 } 198 }
190 iSidebarItem *item = new_SidebarItem(); 199 iSidebarItem *item = new_SidebarItem();
191 if (equal_String(docUrl, &entry->url)) { 200 item->listItem.isSelected = isOpen; /* currently being viewed */
192 item->listItem.isSelected = iTrue; /* currently being viewed */ 201 item->indent = isUnread;
193 }
194 item->indent = isUnread_FeedEntry(entry);
195 set_String(&item->url, &entry->url); 202 set_String(&item->url, &entry->url);
196 set_String(&item->label, &entry->title); 203 set_String(&item->label, &entry->title);
197 const iBookmark *bm = get_Bookmarks(bookmarks_App(), entry->bookmarkId); 204 const iBookmark *bm = get_Bookmarks(bookmarks_App(), entry->bookmarkId);
@@ -208,6 +215,16 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
208 break; 215 break;
209 } 216 }
210 } 217 }
218 /* Actions. */ {
219 addChildFlags_Widget(
220 d->actions,
221 iClob(new_LabelWidget("${sidebar.action.feeds.showall}", "feeds.mode arg:0")),
222 d->feedsMode == all_FeedsMode ? selected_WidgetFlag : 0);
223 addChildFlags_Widget(d->actions,
224 iClob(new_LabelWidget("${sidebar.action.feeds.showunread}",
225 "feeds.mode arg:1")),
226 d->feedsMode == unread_FeedsMode ? selected_WidgetFlag : 0);
227 }
211 d->menu = makeMenu_Widget( 228 d->menu = makeMenu_Widget(
212 as_Widget(d), 229 as_Widget(d),
213 (iMenuItem[]){ { openTab_Icon " ${feeds.entry.newtab}", 0, 0, "feed.entry.opentab" }, 230 (iMenuItem[]){ { openTab_Icon " ${feeds.entry.newtab}", 0, 0, "feed.entry.opentab" },
@@ -343,11 +360,14 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
343 case identities_SidebarMode: { 360 case identities_SidebarMode: {
344 /* Actions. */ { 361 /* Actions. */ {
345 checkIcon_LabelWidget(addChild_Widget( 362 checkIcon_LabelWidget(addChild_Widget(
346 d->actions, iClob(new_LabelWidget(add_Icon " New...", "ident.new")))); 363 d->actions,
364 iClob(new_LabelWidget(add_Icon " ${sidebar.action.ident.new}", "ident.new"))));
347 checkIcon_LabelWidget(addChild_Widget( 365 checkIcon_LabelWidget(addChild_Widget(
348 d->actions, iClob(new_LabelWidget("Import...", "ident.import")))); 366 d->actions,
367 iClob(new_LabelWidget("${sidebar.action.ident.import}", "ident.import"))));
349 } 368 }
350 const iString *tabUrl = url_DocumentWidget(document_App()); 369 const iString *tabUrl = url_DocumentWidget(document_App());
370 isEmpty = iTrue;
351 iConstForEach(PtrArray, i, identities_GmCerts(certs_App())) { 371 iConstForEach(PtrArray, i, identities_GmCerts(certs_App())) {
352 const iGmIdentity *ident = i.ptr; 372 const iGmIdentity *ident = i.ptr;
353 iSidebarItem *item = new_SidebarItem(); 373 iSidebarItem *item = new_SidebarItem();
@@ -380,6 +400,7 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
380 item->listItem.isSelected = isActive; 400 item->listItem.isSelected = isActive;
381 addItem_ListWidget(d->list, item); 401 addItem_ListWidget(d->list, item);
382 iRelease(item); 402 iRelease(item);
403 isEmpty = iFalse;
383 } 404 }
384 const iMenuItem menuItems[] = { 405 const iMenuItem menuItems[] = {
385 { person_Icon " ${ident.use}", 0, 0, "ident.use arg:1" }, 406 { person_Icon " ${ident.use}", 0, 0, "ident.use arg:1" },
@@ -400,10 +421,12 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
400 default: 421 default:
401 break; 422 break;
402 } 423 }
403 updateVisible_ListWidget(d->list); 424 if (!scrollOffset_ListWidget(d->list, 0)) {
425 updateVisible_ListWidget(d->list);
426 }
404 invalidate_ListWidget(d->list); 427 invalidate_ListWidget(d->list);
405 /* Content for a blank tab. */ 428 /* Content for a blank tab. */
406 if (isEmpty_ListWidget(d->list)) { 429 if (isEmpty) {
407 if (d->mode == feeds_SidebarMode) { 430 if (d->mode == feeds_SidebarMode) {
408 iWidget *div = makeVDiv_Widget(); 431 iWidget *div = makeVDiv_Widget();
409 setPadding_Widget(div, 3 * gap_UI, 0, 3 * gap_UI, 2 * gap_UI); 432 setPadding_Widget(div, 3 * gap_UI, 0, 3 * gap_UI, 2 * gap_UI);
@@ -536,6 +559,7 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
536 iZap(d->modeScroll); 559 iZap(d->modeScroll);
537 d->side = side; 560 d->side = side;
538 d->mode = -1; 561 d->mode = -1;
562 d->feedsMode = all_FeedsMode;
539 d->numUnreadEntries = 0; 563 d->numUnreadEntries = 0;
540 d->itemFonts[0] = uiContent_FontId; 564 d->itemFonts[0] = uiContent_FontId;
541 d->itemFonts[1] = uiContentBold_FontId; 565 d->itemFonts[1] = uiContentBold_FontId;
@@ -1031,6 +1055,11 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
1031 updateItems_SidebarWidget_(d); 1055 updateItems_SidebarWidget_(d);
1032 } 1056 }
1033 } 1057 }
1058 else if (equalWidget_Command(cmd, w, "feeds.mode")) {
1059 d->feedsMode = arg_Command(cmd);
1060 updateItems_SidebarWidget_(d);
1061 return iTrue;
1062 }
1034 else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) { 1063 else if (equal_Command(cmd, "feeds.markallread") && d->mode == feeds_SidebarMode) {
1035 iConstForEach(PtrArray, i, listEntries_Feeds()) { 1064 iConstForEach(PtrArray, i, listEntries_Feeds()) {
1036 const iFeedEntry *entry = i.ptr; 1065 const iFeedEntry *entry = i.ptr;
diff --git a/src/ui/sidebarwidget.h b/src/ui/sidebarwidget.h
index 8027adc0..2e418aa4 100644
--- a/src/ui/sidebarwidget.h
+++ b/src/ui/sidebarwidget.h
@@ -40,6 +40,11 @@ enum iSidebarSide {
40 right_SideBarSide, 40 right_SideBarSide,
41}; 41};
42 42
43enum iFeedsMode {
44 all_FeedsMode,
45 unread_FeedsMode
46};
47
43iDeclareWidgetClass(SidebarWidget) 48iDeclareWidgetClass(SidebarWidget)
44iDeclareObjectConstructionArgs(SidebarWidget, enum iSidebarSide side) 49iDeclareObjectConstructionArgs(SidebarWidget, enum iSidebarSide side)
45 50