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.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 8108c797..b8e29a7d 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -15,18 +15,20 @@
15iDeclareType(SidebarItem) 15iDeclareType(SidebarItem)
16 16
17struct Impl_SidebarItem { 17struct Impl_SidebarItem {
18 int indent; 18 int indent;
19 iChar icon; 19 iChar icon;
20 iString label; 20 iString label;
21 iString meta; 21 iString meta;
22 iString url; 22 iString url;
23 size_t index; 23 size_t index;
24 const void *src;
24}; 25};
25 26
26void init_SidebarItem(iSidebarItem *d) { 27void init_SidebarItem(iSidebarItem *d) {
27 d->indent = 0; 28 d->indent = 0;
28 d->icon = 0; 29 d->icon = 0;
29 d->index = 0; 30 d->index = 0;
31 d->src = NULL;
30 init_String(&d->label); 32 init_String(&d->label);
31 init_String(&d->meta); 33 init_String(&d->meta);
32 init_String(&d->url); 34 init_String(&d->url);
@@ -56,6 +58,7 @@ struct Impl_SidebarWidget {
56 iClick click; 58 iClick click;
57 iWidget *resizer; 59 iWidget *resizer;
58 SDL_Cursor *resizeCursor; 60 SDL_Cursor *resizeCursor;
61 iWidget *menu;
59}; 62};
60 63
61iDefineObjectConstruction(SidebarWidget) 64iDefineObjectConstruction(SidebarWidget)
@@ -85,7 +88,6 @@ static int scrollMax_SidebarWidget_(const iSidebarWidget *d) {
85} 88}
86 89
87static void updateVisible_SidebarWidget_(iSidebarWidget *d) { 90static void updateVisible_SidebarWidget_(iSidebarWidget *d) {
88 // iWidget *w = as_Widget(d);
89 const int contentSize = size_Array(&d->items) * d->itemHeight; 91 const int contentSize = size_Array(&d->items) * d->itemHeight;
90 const iRect bounds = contentBounds_SidebarWidget_(d); 92 const iRect bounds = contentBounds_SidebarWidget_(d);
91 setRange_ScrollWidget(d->scroll, (iRangei){ 0, scrollMax_SidebarWidget_(d) }); 93 setRange_ScrollWidget(d->scroll, (iRangei){ 0, scrollMax_SidebarWidget_(d) });
@@ -98,6 +100,9 @@ static void updateVisible_SidebarWidget_(iSidebarWidget *d) {
98 100
99static void updateItems_SidebarWidget_(iSidebarWidget *d) { 101static void updateItems_SidebarWidget_(iSidebarWidget *d) {
100 clearItems_SidebarWidget_(d); 102 clearItems_SidebarWidget_(d);
103 destroy_Widget(d->menu);
104 d->menu = NULL;
105 d->hoverItem = iInvalidPos;
101 switch (d->mode) { 106 switch (d->mode) {
102 case documentOutline_SidebarMode: { 107 case documentOutline_SidebarMode: {
103 const iGmDocument *doc = document_DocumentWidget(document_App()); 108 const iGmDocument *doc = document_DocumentWidget(document_App());
@@ -124,9 +129,12 @@ static void updateItems_SidebarWidget_(iSidebarWidget *d) {
124 init_Date(&date, &bm->when); 129 init_Date(&date, &bm->when);
125 iString *ds = format_Date(&date, "%Y %b %d"); 130 iString *ds = format_Date(&date, "%Y %b %d");
126 set_String(&item.meta, ds); 131 set_String(&item.meta, ds);
132 item.src = bm;
127 delete_String(ds); 133 delete_String(ds);
128 pushBack_Array(&d->items, &item); 134 pushBack_Array(&d->items, &item);
129 } 135 }
136 d->menu = makeMenu_Widget(
137 as_Widget(d), (iMenuItem[]){ { "Delete Bookmark", 0, 0, "bookmark.delete" } }, 1);
130 break; 138 break;
131 } 139 }
132 case history_SidebarMode: 140 case history_SidebarMode:
@@ -209,6 +217,7 @@ void init_SidebarWidget(iSidebarWidget *d) {
209 d->resizer->rect.size.x = gap_UI; 217 d->resizer->rect.size.x = gap_UI;
210 setBackgroundColor_Widget(d->resizer, none_ColorId); 218 setBackgroundColor_Widget(d->resizer, none_ColorId);
211 d->resizeCursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); 219 d->resizeCursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE);
220 d->menu = NULL;
212} 221}
213 222
214void deinit_SidebarWidget(iSidebarWidget *d) { 223void deinit_SidebarWidget(iSidebarWidget *d) {
@@ -356,11 +365,16 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
356 d->scrollY = 0; 365 d->scrollY = 0;
357 updateItems_SidebarWidget_(d); 366 updateItems_SidebarWidget_(d);
358 } 367 }
368 else if (equal_Command(cmd, "bookmark.delete")) {
369 if (d->mode == bookmarks_SidebarMode && d->hoverItem < size_Array(&d->items)) {
370
371 }
372 }
359 else if (equal_Command(cmd, "bookmarks.changed")) { 373 else if (equal_Command(cmd, "bookmarks.changed")) {
360 updateItems_SidebarWidget_(d); 374 updateItems_SidebarWidget_(d);
361 } 375 }
362 } 376 }
363 if (ev->type == SDL_MOUSEMOTION) { 377 if (ev->type == SDL_MOUSEMOTION && !isVisible_Widget(d->menu)) {
364 const iInt2 mouse = init_I2(ev->motion.x, ev->motion.y); 378 const iInt2 mouse = init_I2(ev->motion.x, ev->motion.y);
365 size_t hover = iInvalidPos; 379 size_t hover = iInvalidPos;
366 if (contains_Widget(d->resizer, mouse)) { 380 if (contains_Widget(d->resizer, mouse)) {
@@ -388,6 +402,9 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
388 refresh_Widget(w); 402 refresh_Widget(w);
389 return iTrue; 403 return iTrue;
390 } 404 }
405 if (d->menu && ev->type == SDL_MOUSEBUTTONDOWN) {
406 processContextMenuEvent_Widget(d->menu, ev, {});
407 }
391 switch (processEvent_Click(&d->click, ev)) { 408 switch (processEvent_Click(&d->click, ev)) {
392 case started_ClickResult: 409 case started_ClickResult:
393 refresh_Widget(w); 410 refresh_Widget(w);
@@ -416,9 +433,9 @@ static void draw_SidebarWidget_(const iSidebarWidget *d) {
416 const iRanges visRange = visRange_SidebarWidget_(d); 433 const iRanges visRange = visRange_SidebarWidget_(d);
417 iInt2 pos = addY_I2(topLeft_Rect(bounds), -(d->scrollY % d->itemHeight)); 434 iInt2 pos = addY_I2(topLeft_Rect(bounds), -(d->scrollY % d->itemHeight));
418 for (size_t i = visRange.start; i < visRange.end; i++) { 435 for (size_t i = visRange.start; i < visRange.end; i++) {
419 const iSidebarItem *item = constAt_Array(&d->items, i); 436 const iSidebarItem *item = constAt_Array(&d->items, i);
420 const iRect itemRect = { pos, init_I2(width_Rect(bounds), d->itemHeight) }; 437 const iRect itemRect = { pos, init_I2(width_Rect(bounds), d->itemHeight) };
421 const iBool isHover = (d->hoverItem == i); 438 const iBool isHover = (d->hoverItem == i);
422 setClip_Paint(&p, intersect_Rect(itemRect, bounds)); 439 setClip_Paint(&p, intersect_Rect(itemRect, bounds));
423 if (isHover) { 440 if (isHover) {
424 fillRect_Paint(&p, itemRect, isPressing ? orange_ColorId : teal_ColorId); 441 fillRect_Paint(&p, itemRect, isPressing ? orange_ColorId : teal_ColorId);