From dcd44b17b11596c28e54d513ae2b69e1eebf46de Mon Sep 17 00:00:00 2001 From: kojima Date: Sat, 15 Jul 2000 22:00:41 +0000 Subject: [PATCH] more updates to editable menu --- WPrefs.app/editmenu.c | 73 ++++++++++++++++++++++++++++++++++++++----- WPrefs.app/editmenu.h | 8 +++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/WPrefs.app/editmenu.c b/WPrefs.app/editmenu.c index def507e3..381cc2af 100644 --- a/WPrefs.app/editmenu.c +++ b/WPrefs.app/editmenu.c @@ -36,6 +36,7 @@ typedef struct W_EditMenuItem { struct W_EditMenu *parent; char *label; + WMPixmap *pixmap; /* pixmap to show at left */ void *data; WMCallback *destroyData; @@ -167,7 +168,6 @@ char *WGetEditMenuItemTitle(WEditMenuItem *item) return item->label; } - void *WGetEditMenuItemData(WEditMenuItem *item) { return item->data; @@ -182,6 +182,12 @@ void WSetEditMenuItemData(WEditMenuItem *item, void *data, } +void WSetEditMenuItemImage(WEditMenuItem *item, WMPixmap *pixmap) +{ + if (item->pixmap) + WMReleasePixmap(item->pixmap); + item->pixmap = WMRetainPixmap(pixmap); +} static void @@ -196,7 +202,7 @@ paintEditMenuItem(WEditMenuItem *iPtr) if (!iPtr->view->flags.realized) return; - + color = scr->black; if (iPtr->flags.isTitle && !iPtr->flags.isHighlighted) { color = scr->white; @@ -210,7 +216,12 @@ paintEditMenuItem(WEditMenuItem *iPtr) WMDrawString(scr, win, WMColorGC(color), font, 5, 3, iPtr->label, strlen(iPtr->label)); - if (iPtr->submenu) { + if (iPtr->pixmap) { + WMSize size = WMGetPixmapSize(iPtr->pixmap); + + WMDrawPixmap(iPtr->pixmap, win, w - size.width - 5, + (h - size.height)/2); + } else if (iPtr->submenu) { /* draw the cascade indicator */ XDrawLine(scr->display,win,WMColorGC(scr->darkGray), w-11, 6, w-6, h/2-1); @@ -304,6 +315,7 @@ static void editItemLabel(WEditMenuItem *item); static void stopEditItem(WEditMenu *menu, Bool apply); +static void unmapMenu(WEditMenu *menu); static void deselectItem(WEditMenu *menu); @@ -505,6 +517,15 @@ WInsertMenuItemWithTitle(WEditMenu *mPtr, int index, char *title) } +WEditMenuItem* +WGetEditMenuItem(WEditMenu *mPtr, int index) +{ + if (index >= WMGetBagItemCount(mPtr->items)) + return NULL; + else + return WMGetFromBag(mPtr->items, index + (mPtr->flags.isTitled ? 1 : 0)); +} + WEditMenuItem* WAddMenuItemWithTitle(WEditMenu *mPtr, char *title) @@ -528,6 +549,18 @@ WSetEditMenuTitle(WEditMenu *mPtr, char *title) } + +char* +WGetEditMenuTitle(WEditMenu *mPtr) +{ + WEditMenuItem *item; + + item = WMGetFromBag(mPtr->items, 0); + + return item->label; +} + + void WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag) { @@ -650,7 +683,7 @@ closeMenuAction(WMWidget *w, void *data) WMAddIdleHandler(WMDestroyWidget, menu->closeB); menu->closeB = NULL; - WMUnmapWidget(menu); + unmapMenu(menu); } @@ -728,6 +761,9 @@ updateMenuContents(WEditMenu *mPtr) W_ResizeView(mPtr->view, newW, newH+1); + if (mPtr->closeB) + WMMoveWidget(mPtr->closeB, newW - 20, 3); + newW -= 2*offs; i = 0; @@ -869,6 +905,12 @@ stopEditItem(WEditMenu *menu, Bool apply) menu->selectedItem->label = wstrdup(text); updateMenuContents(menu); + + if (menu->delegate && menu->delegate->itemEdited) { + (*menu->delegate->itemEdited)(menu->delegate, menu, + menu->selectedItem); + } + } WMUnmapWidget(menu->tfield); menu->flags.isEditing = 0; @@ -1194,6 +1236,20 @@ duplicateMenu(WEditMenu *menu) } + +static WEditMenuItem* +duplicateItem(WEditMenuItem *item) +{ + WEditMenuItem *nitem; + + nitem = WCreateEditMenuItem(item->parent, item->label, False); + if (item->pixmap) + nitem->pixmap = WMRetainPixmap(item->pixmap); + + return nitem; +} + + static void dragItem(WEditMenu *menu, WEditMenuItem *item) { @@ -1237,7 +1293,7 @@ dragItem(WEditMenu *menu, WEditMenuItem *item) W_RealizeView(dview); if (menu->flags.isFactory) { - dritem = WCreateEditMenuItem(menu, item->label, False); + dritem = duplicateItem(item); W_ReparentView(dritem->view, dview, 0, 0); WMResizeWidget(dritem, oldSize.width, oldSize.height); @@ -1298,12 +1354,12 @@ dragItem(WEditMenu *menu, WEditMenuItem *item) Bool rem = True; if (!menu->flags.isFactory) { - WMUnmapWidget(dritem); + W_UnmapView(dview); if (menu->delegate && menu->delegate->shouldRemoveItem) { rem = (*menu->delegate->shouldRemoveItem)(menu->delegate, menu, item); } - WMMapWidget(dritem); + W_MapView(dview); } if (!rem || menu->flags.isFactory) { @@ -1319,7 +1375,8 @@ dragItem(WEditMenu *menu, WEditMenuItem *item) } else { WRemoveEditMenuItem(menu, dritem); - if (menu->delegate && menu->delegate->itemCloned) { + if (menu->delegate && menu->delegate->itemCloned + && menu->flags.isFactory) { (*menu->delegate->itemCloned)(menu->delegate, menu, item, dritem); } diff --git a/WPrefs.app/editmenu.h b/WPrefs.app/editmenu.h index f7caa463..e7349a4b 100644 --- a/WPrefs.app/editmenu.h +++ b/WPrefs.app/editmenu.h @@ -30,6 +30,8 @@ typedef struct WEditMenuDelegate { void (*itemCloned)(struct WEditMenuDelegate*, WEditMenu*, WEditMenuItem*, WEditMenuItem *); + void (*itemEdited)(struct WEditMenuDelegate*, WEditMenu*, + WEditMenuItem*); void (*itemSelected)(struct WEditMenuDelegate*, WEditMenu*, WEditMenuItem*); void (*itemDeselected)(struct WEditMenuDelegate*, WEditMenu*, @@ -52,6 +54,8 @@ void *WGetEditMenuItemData(WEditMenuItem *item); void WSetEditMenuItemData(WEditMenuItem *item, void *data, WMCallback *destroyer); +void WSetEditMenuItemImage(WEditMenuItem *item, WMPixmap *pixmap); + WEditMenu *WCreateEditMenu(WMScreen *scr, char *title); WEditMenu *WCreateEditMenuPad(WMWidget *parent); @@ -63,8 +67,12 @@ WEditMenuItem *WInsertMenuItemWithTitle(WEditMenu *mPtr, int index, WEditMenuItem *WAddMenuItemWithTitle(WEditMenu *mPtr, char *title); +WEditMenuItem *WGetEditMenuItem(WEditMenu *mPtr, int index); + void WSetEditMenuTitle(WEditMenu *mPtr, char *title); +char *WGetEditMenuTitle(WEditMenu *mPtr); + void WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag); void WSetEditMenuSubmenu(WEditMenu *mPtr, WEditMenuItem *item,