summaryrefslogtreecommitdiff
path: root/src/ui/sidebarwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/sidebarwidget.c')
-rw-r--r--src/ui/sidebarwidget.c64
1 files changed, 55 insertions, 9 deletions
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 78227cf3..7729ccca 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -2,6 +2,7 @@
2#include "labelwidget.h" 2#include "labelwidget.h"
3#include "scrollwidget.h" 3#include "scrollwidget.h"
4#include "documentwidget.h" 4#include "documentwidget.h"
5#include "inputwidget.h"
5#include "bookmarks.h" 6#include "bookmarks.h"
6#include "paint.h" 7#include "paint.h"
7#include "util.h" 8#include "util.h"
@@ -10,6 +11,7 @@
10#include "app.h" 11#include "app.h"
11 12
12#include <the_Foundation/array.h> 13#include <the_Foundation/array.h>
14#include <SDL_clipboard.h>
13#include <SDL_mouse.h> 15#include <SDL_mouse.h>
14 16
15iDeclareType(SidebarItem) 17iDeclareType(SidebarItem)
@@ -132,7 +134,12 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
132 pushBack_Array(&d->items, &item); 134 pushBack_Array(&d->items, &item);
133 } 135 }
134 d->menu = makeMenu_Widget( 136 d->menu = makeMenu_Widget(
135 as_Widget(d), (iMenuItem[]){ { "Delete Bookmark", 0, 0, "bookmark.delete" } }, 1); 137 as_Widget(d),
138 (iMenuItem[]){ { "Edit Bookmark...", 0, 0, "bookmark.edit" },
139 { "Copy URL", 0, 0, "bookmark.copy" },
140 { "---", 0, 0, NULL },
141 { orange_ColorEscape "Delete Bookmark", 0, 0, "bookmark.delete" } },
142 4);
136 break; 143 break;
137 } 144 }
138 case history_SidebarMode: 145 case history_SidebarMode:
@@ -150,7 +157,7 @@ void setMode_SidebarWidget(iSidebarWidget *d, enum iSidebarMode mode) {
150 for (enum iSidebarMode i = 0; i < max_SidebarMode; i++) { 157 for (enum iSidebarMode i = 0; i < max_SidebarMode; i++) {
151 setFlags_Widget(as_Widget(d->modeButtons[i]), selected_WidgetFlag, i == d->mode); 158 setFlags_Widget(as_Widget(d->modeButtons[i]), selected_WidgetFlag, i == d->mode);
152 } 159 }
153 const float heights[max_SidebarMode] = { 1.2f, 2, 3, 3 }; 160 const float heights[max_SidebarMode] = { 1.2f, 2.4f, 3, 3 };
154 d->itemHeight = heights[mode] * lineHeight_Text(default_FontId); 161 d->itemHeight = heights[mode] * lineHeight_Text(default_FontId);
155} 162}
156 163
@@ -286,6 +293,13 @@ static void checkModeButtonLayout_SidebarWidget_(iSidebarWidget *d) {
286 } 293 }
287} 294}
288 295
296static iSidebarItem *hoverItem_SidebarWidget_(iSidebarWidget *d) {
297 if (d->hoverItem < size_Array(&d->items)) {
298 return at_Array(&d->items, d->hoverItem);
299 }
300 return NULL;
301}
302
289void setWidth_SidebarWidget(iSidebarWidget *d, int width) { 303void setWidth_SidebarWidget(iSidebarWidget *d, int width) {
290 iWidget *w = as_Widget(d); 304 iWidget *w = as_Widget(d);
291 width = iMax(30 * gap_UI, width); 305 width = iMax(30 * gap_UI, width);
@@ -301,6 +315,16 @@ void setWidth_SidebarWidget(iSidebarWidget *d, int width) {
301 } 315 }
302} 316}
303 317
318iBool handleBookmarkEditorCommands_SidebarWidget_(iWidget *editor, const char *cmd) {
319 iSidebarWidget *d = findWidget_App("sidebar");
320 if (equal_Command(cmd, "bmed.accept") || equal_Command(cmd, "cancel")) {
321 setFlags_Widget(as_Widget(d), disabled_WidgetFlag, iFalse);
322 destroy_Widget(editor);
323 return iTrue;
324 }
325 return iFalse;
326}
327
304static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) { 328static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) {
305 iWidget *w = as_Widget(d); 329 iWidget *w = as_Widget(d);
306 /* Handle commands. */ 330 /* Handle commands. */
@@ -341,6 +365,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
341 else if (equal_Command(cmd, "sidebar.mode")) { 365 else if (equal_Command(cmd, "sidebar.mode")) {
342 setMode_SidebarWidget(d, arg_Command(cmd)); 366 setMode_SidebarWidget(d, arg_Command(cmd));
343 updateItems_SidebarWidget_(d); 367 updateItems_SidebarWidget_(d);
368 if (argLabel_Command(cmd, "show") && !isVisible_Widget(w)) {
369 postCommand_App("sidebar.toggle");
370 }
344 return iTrue; 371 return iTrue;
345 } 372 }
346 else if (equal_Command(cmd, "sidebar.toggle")) { 373 else if (equal_Command(cmd, "sidebar.toggle")) {
@@ -363,12 +390,29 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
363 d->scrollY = 0; 390 d->scrollY = 0;
364 updateItems_SidebarWidget_(d); 391 updateItems_SidebarWidget_(d);
365 } 392 }
393 else if (equal_Command(cmd, "bookmark.copy")) {
394 const iSidebarItem *item = hoverItem_SidebarWidget_(d);
395 if (d->mode == bookmarks_SidebarMode && item) {
396 SDL_SetClipboardText(cstr_String(&item->url));
397 }
398 return iTrue;
399 }
400 else if (equal_Command(cmd, "bookmark.edit")) {
401 const iSidebarItem *item = hoverItem_SidebarWidget_(d);
402 if (d->mode == bookmarks_SidebarMode && item) {
403 setFlags_Widget(w, disabled_WidgetFlag, iTrue);
404 iWidget *dlg = makeBookmarkEditor_Widget();
405 setText_InputWidget(findChild_Widget(dlg, "bmed.title"), &item->label);
406 setText_InputWidget(findChild_Widget(dlg, "bmed.url"), &item->url);
407 //setText_InputWidget(findChild_Widget(dlg, "bmed.tags"), &item->)
408 setCommandHandler_Widget(dlg, handleBookmarkEditorCommands_SidebarWidget_);
409 }
410 return iTrue;
411 }
366 else if (equal_Command(cmd, "bookmark.delete")) { 412 else if (equal_Command(cmd, "bookmark.delete")) {
367 if (d->mode == bookmarks_SidebarMode && d->hoverItem < size_Array(&d->items)) { 413 const iSidebarItem *item = hoverItem_SidebarWidget_(d);
368 const iSidebarItem *item = at_Array(&d->items, d->hoverItem); 414 if (d->mode == bookmarks_SidebarMode && item && remove_Bookmarks(bookmarks_App(), item->id)) {
369 if (remove_Bookmarks(bookmarks_App(), item->id)) { 415 postCommand_App("bookmarks.changed");
370 postCommand_App("bookmarks.changed");
371 }
372 } 416 }
373 return iTrue; 417 return iTrue;
374 } 418 }
@@ -405,7 +449,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
405 return iTrue; 449 return iTrue;
406 } 450 }
407 if (d->menu && ev->type == SDL_MOUSEBUTTONDOWN) { 451 if (d->menu && ev->type == SDL_MOUSEBUTTONDOWN) {
408 processContextMenuEvent_Widget(d->menu, ev, {}); 452 if (d->hoverItem != iInvalidPos || isVisible_Widget(d->menu)) {
453 processContextMenuEvent_Widget(d->menu, ev, {});
454 }
409 } 455 }
410 switch (processEvent_Click(&d->click, ev)) { 456 switch (processEvent_Click(&d->click, ev)) {
411 case started_ClickResult: 457 case started_ClickResult:
@@ -463,7 +509,7 @@ static void draw_SidebarWidget_(const iSidebarWidget *d) {
463 "%s", 509 "%s",
464 cstr_String(&str)); 510 cstr_String(&str));
465 deinit_String(&str); 511 deinit_String(&str);
466 iInt2 textPos = topRight_Rect(iconArea); 512 iInt2 textPos = addY_I2(topRight_Rect(iconArea), 0.2f * lineHeight_Text(font));
467 drawRange_Text(font, textPos, fg, range_String(&item->label)); 513 drawRange_Text(font, textPos, fg, range_String(&item->label));
468 drawRange_Text(font, 514 drawRange_Text(font,
469 addY_I2(textPos, lineHeight_Text(font)), 515 addY_I2(textPos, lineHeight_Text(font)),