diff options
Diffstat (limited to 'src/ui/sidebarwidget.c')
-rw-r--r-- | src/ui/sidebarwidget.c | 39 |
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 @@ | |||
15 | iDeclareType(SidebarItem) | 15 | iDeclareType(SidebarItem) |
16 | 16 | ||
17 | struct Impl_SidebarItem { | 17 | struct 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 | ||
26 | void init_SidebarItem(iSidebarItem *d) { | 27 | void 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 | ||
61 | iDefineObjectConstruction(SidebarWidget) | 64 | iDefineObjectConstruction(SidebarWidget) |
@@ -85,7 +88,6 @@ static int scrollMax_SidebarWidget_(const iSidebarWidget *d) { | |||
85 | } | 88 | } |
86 | 89 | ||
87 | static void updateVisible_SidebarWidget_(iSidebarWidget *d) { | 90 | static 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 | ||
99 | static void updateItems_SidebarWidget_(iSidebarWidget *d) { | 101 | static 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 | ||
214 | void deinit_SidebarWidget(iSidebarWidget *d) { | 223 | void 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); |