From 3282d252439d4166ed8f95ce42c82f0d21582e17 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Sat, 5 Sep 2020 17:35:32 +0300 Subject: SidebarWidget: List item for the context menu --- src/ui/listwidget.h | 2 +- src/ui/sidebarwidget.c | 44 ++++++++++++++++++++++++++++++-------------- src/ui/util.c | 24 ++++++++++++++---------- 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/ui/listwidget.h b/src/ui/listwidget.h index 37afe895..71635eaf 100644 --- a/src/ui/listwidget.h +++ b/src/ui/listwidget.h @@ -62,7 +62,7 @@ void updateVisible_ListWidget (iListWidget *); void updateMouseHover_ListWidget (iListWidget *); size_t numItems_ListWidget (const iListWidget *); -size_t itemIndex_ListWidget(const iListWidget *, iInt2 pos); +size_t itemIndex_ListWidget(const iListWidget *, iInt2 pos); const iAnyObject *constHoverItem_ListWidget(const iListWidget *); iAnyObject *hoverItem_ListWidget(iListWidget *); diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index 8d7b47b7..4cedd731 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c @@ -92,6 +92,7 @@ struct Impl_SidebarWidget { iWidget *resizer; SDL_Cursor *resizeCursor; iWidget *menu; + iSidebarItem *menuItem; /* list item accessed in the context menu */ }; iDefineObjectConstruction(SidebarWidget) @@ -347,6 +348,15 @@ static const iGmIdentity *constHoverIdentity_SidebarWidget_(const iSidebarWidget return NULL; } +static iGmIdentity *menuIdentity_SidebarWidget_(const iSidebarWidget *d) { + if (d->mode == identities_SidebarMode) { + if (d->menuItem) { + return identity_GmCerts(certs_App(), d->menuItem->id); + } + } + return NULL; +} + static iGmIdentity *hoverIdentity_SidebarWidget_(const iSidebarWidget *d) { return iConstCast(iGmIdentity *, constHoverIdentity_SidebarWidget_(d)); } @@ -477,6 +487,12 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) itemClicked_SidebarWidget_(d, pointerLabel_Command(cmd, "item")); return iTrue; } + else if (isCommand_Widget(w, ev, "menu.opened")) { + setFlags_Widget(as_Widget(d->list), disabled_WidgetFlag, iTrue); + } + else if (isCommand_Widget(w, ev, "menu.closed")) { + setFlags_Widget(as_Widget(d->list), disabled_WidgetFlag, iFalse); + } else if (equal_Command(cmd, "sidebar.width")) { setWidth_SidebarWidget(d, arg_Command(cmd)); return iTrue; @@ -508,14 +524,14 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) updateItems_SidebarWidget_(d); } else if (equal_Command(cmd, "bookmark.copy")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); + const iSidebarItem *item = d->menuItem; //hoverItem_ListWidget(d->list); if (d->mode == bookmarks_SidebarMode && item) { SDL_SetClipboardText(cstr_String(&item->url)); } return iTrue; } else if (equal_Command(cmd, "bookmark.edit")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); + const iSidebarItem *item = d->menuItem; //hoverItem_ListWidget(d->list); if (d->mode == bookmarks_SidebarMode && item) { setFlags_Widget(w, disabled_WidgetFlag, iTrue); iWidget *dlg = makeBookmarkEditor_Widget(); @@ -529,7 +545,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (equal_Command(cmd, "bookmark.delete")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); + const iSidebarItem *item = d->menuItem; if (d->mode == bookmarks_SidebarMode && item && remove_Bookmarks(bookmarks_App(), item->id)) { postCommand_App("bookmarks.changed"); } @@ -542,7 +558,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) updateItems_SidebarWidget_(d); } else if (isCommand_Widget(w, ev, "ident.use")) { - iGmIdentity * ident = hoverIdentity_SidebarWidget_(d); + iGmIdentity * ident = menuIdentity_SidebarWidget_(d); const iString *tabUrl = url_DocumentWidget(document_App()); if (ident) { if (argLabel_Command(cmd, "clear")) { @@ -559,7 +575,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (isCommand_Widget(w, ev, "ident.showuse")) { - const iGmIdentity *ident = constHoverIdentity_SidebarWidget_(d); + const iGmIdentity *ident = menuIdentity_SidebarWidget_(d); if (ident) { makeMessage_Widget(uiHeading_ColorEscape "IDENTITY USAGE", cstrCollect_String(joinCStr_StringSet(ident->useUrls, "\n"))); @@ -567,7 +583,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (isCommand_Widget(w, ev, "ident.edit")) { - const iGmIdentity *ident = constHoverIdentity_SidebarWidget_(d); + const iGmIdentity *ident = menuIdentity_SidebarWidget_(d); if (ident) { makeValueInput_Widget(get_Window()->root, &ident->notes, @@ -590,7 +606,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (isCommand_Widget(w, ev, "ident.reveal")) { - const iGmIdentity *ident = constHoverIdentity_SidebarWidget_(d); + const iGmIdentity *ident = menuIdentity_SidebarWidget_(d); if (ident) { const iString *crtPath = certificatePath_GmCerts(certs_App(), ident); if (crtPath) { @@ -600,7 +616,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (equal_Command(cmd, "ident.delete")) { - iSidebarItem *item = hoverItem_ListWidget(d->list); + iSidebarItem *item = d->menuItem; if (argLabel_Command(cmd, "confirm")) { makeQuestion_Widget(uiTextCaution_ColorEscape "DELETE IDENTITY", format_CStr("Do you really want to delete the identity\n" @@ -620,23 +636,22 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) return iTrue; } else if (equal_Command(cmd, "history.delete")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); - if (item && !isEmpty_String(&item->url)) { - removeUrl_Visited(visited_App(), &item->url); + if (d->menuItem && !isEmpty_String(&d->menuItem->url)) { + removeUrl_Visited(visited_App(), &d->menuItem->url); updateItems_SidebarWidget_(d); scrollOffset_ListWidget(d->list, 0); } return iTrue; } else if (equal_Command(cmd, "history.copy")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); + const iSidebarItem *item = d->menuItem; if (item && !isEmpty_String(&item->url)) { SDL_SetClipboardText(cstr_String(&item->url)); } return iTrue; } else if (equal_Command(cmd, "history.addbookmark")) { - const iSidebarItem *item = hoverItem_ListWidget(d->list); + const iSidebarItem *item = d->menuItem; if (!isEmpty_String(&item->url)) { makeBookmarkCreation_Widget( &item->url, @@ -660,7 +675,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) } return iTrue; } - } + } if (ev->type == SDL_MOUSEMOTION && !isVisible_Widget(d->menu)) { const iInt2 mouse = init_I2(ev->motion.x, ev->motion.y); if (contains_Widget(d->resizer, mouse)) { @@ -685,6 +700,7 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) updateMouseHover_ListWidget(d->list); } if (constHoverItem_ListWidget(d->list) || isVisible_Widget(d->menu)) { + d->menuItem = hoverItem_ListWidget(d->list); /* Update menu items. */ if (d->mode == identities_SidebarMode) { const iGmIdentity *ident = constHoverIdentity_SidebarWidget_(d); diff --git a/src/ui/util.c b/src/ui/util.c index 120be3be..50aabf88 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -181,6 +181,9 @@ iWidget *addAction_Widget(iWidget *parent, int key, int kmods, const char *comma static iBool menuHandler_(iWidget *menu, const char *cmd) { if (isVisible_Widget(menu)) { + if (equalWidget_Command(cmd, menu, "menu.opened")) { + return iFalse; + } if (equal_Command(cmd, "menu.open") && pointer_Command(cmd) == menu->parent) { /* Don't reopen self; instead, root will close the menu. */ return iFalse; @@ -259,12 +262,14 @@ void openMenu_Widget(iWidget *d, iInt2 coord) { d->rect.pos.x += leftExcess; } refresh_App(); + postCommand_Widget(d, "menu.opened"); } void closeMenu_Widget(iWidget *d) { setFlags_Widget(d, hidden_WidgetFlag, iTrue); setFlags_Widget(findChild_Widget(d, "menu.cancel"), disabled_WidgetFlag, iTrue); refresh_App(); + postCommand_Widget(d, "menu.closed"); } int checkContextMenu_Widget(iWidget *menu, const SDL_Event *ev) { @@ -663,8 +668,10 @@ void updateValueInput_Widget(iWidget *d, const char *title, const char *prompt) } static iBool messageHandler_(iWidget *msg, const char *cmd) { - /* Any command dismisses the sheet. */ - iUnused(cmd); + /* Almost any command dismisses the sheet. */ +// if (equal_Command(cmd, "menu.closed")) { +// return iFalse; +// } destroy_Widget(msg); return iFalse; } @@ -677,12 +684,9 @@ iWidget *makeMessage_Widget(const char *title, const char *msg) { return dlg; } -iWidget *makeQuestion_Widget(const char *title, - const char *msg, - const char *labels[], - const char *commands[], - size_t count) { -// processEvents_App(postedEventsOnly_AppEventMode); +iWidget *makeQuestion_Widget(const char *title, const char *msg, const char *labels[], + const char *commands[], size_t count) { + processEvents_App(postedEventsOnly_AppEventMode); iWidget *dlg = makeSheet_Widget(""); setCommandHandler_Widget(dlg, messageHandler_); addChildFlags_Widget(dlg, iClob(new_LabelWidget(title, 0, 0, NULL)), frameless_WidgetFlag); @@ -715,8 +719,8 @@ static iBool toggleHandler_(iWidget *d, const char *cmd) { setToggle_Widget(d, (flags_Widget(d) & selected_WidgetFlag) == 0); postCommand_Widget(d, format_CStr("%s.changed arg:%d", - cstr_String(id_Widget(d)), - isSelected_Widget(d) ? 1 : 0)); + cstr_String(id_Widget(d)), + isSelected_Widget(d) ? 1 : 0)); return iTrue; } return iFalse; -- cgit v1.2.3