mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-29 09:52:29 +01:00
more updates to editable menu
This commit is contained in:
@@ -36,6 +36,7 @@ typedef struct W_EditMenuItem {
|
|||||||
struct W_EditMenu *parent;
|
struct W_EditMenu *parent;
|
||||||
|
|
||||||
char *label;
|
char *label;
|
||||||
|
WMPixmap *pixmap; /* pixmap to show at left */
|
||||||
|
|
||||||
void *data;
|
void *data;
|
||||||
WMCallback *destroyData;
|
WMCallback *destroyData;
|
||||||
@@ -167,7 +168,6 @@ char *WGetEditMenuItemTitle(WEditMenuItem *item)
|
|||||||
return item->label;
|
return item->label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *WGetEditMenuItemData(WEditMenuItem *item)
|
void *WGetEditMenuItemData(WEditMenuItem *item)
|
||||||
{
|
{
|
||||||
return item->data;
|
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
|
static void
|
||||||
@@ -196,7 +202,7 @@ paintEditMenuItem(WEditMenuItem *iPtr)
|
|||||||
|
|
||||||
if (!iPtr->view->flags.realized)
|
if (!iPtr->view->flags.realized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
color = scr->black;
|
color = scr->black;
|
||||||
if (iPtr->flags.isTitle && !iPtr->flags.isHighlighted) {
|
if (iPtr->flags.isTitle && !iPtr->flags.isHighlighted) {
|
||||||
color = scr->white;
|
color = scr->white;
|
||||||
@@ -210,7 +216,12 @@ paintEditMenuItem(WEditMenuItem *iPtr)
|
|||||||
WMDrawString(scr, win, WMColorGC(color), font, 5, 3, iPtr->label,
|
WMDrawString(scr, win, WMColorGC(color), font, 5, 3, iPtr->label,
|
||||||
strlen(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 */
|
/* draw the cascade indicator */
|
||||||
XDrawLine(scr->display,win,WMColorGC(scr->darkGray),
|
XDrawLine(scr->display,win,WMColorGC(scr->darkGray),
|
||||||
w-11, 6, w-6, h/2-1);
|
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 stopEditItem(WEditMenu *menu, Bool apply);
|
||||||
|
|
||||||
|
|
||||||
|
static void unmapMenu(WEditMenu *menu);
|
||||||
static void deselectItem(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*
|
WEditMenuItem*
|
||||||
WAddMenuItemWithTitle(WEditMenu *mPtr, char *title)
|
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
|
void
|
||||||
WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag)
|
WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag)
|
||||||
{
|
{
|
||||||
@@ -650,7 +683,7 @@ closeMenuAction(WMWidget *w, void *data)
|
|||||||
WMAddIdleHandler(WMDestroyWidget, menu->closeB);
|
WMAddIdleHandler(WMDestroyWidget, menu->closeB);
|
||||||
menu->closeB = NULL;
|
menu->closeB = NULL;
|
||||||
|
|
||||||
WMUnmapWidget(menu);
|
unmapMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -728,6 +761,9 @@ updateMenuContents(WEditMenu *mPtr)
|
|||||||
|
|
||||||
W_ResizeView(mPtr->view, newW, newH+1);
|
W_ResizeView(mPtr->view, newW, newH+1);
|
||||||
|
|
||||||
|
if (mPtr->closeB)
|
||||||
|
WMMoveWidget(mPtr->closeB, newW - 20, 3);
|
||||||
|
|
||||||
newW -= 2*offs;
|
newW -= 2*offs;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
@@ -869,6 +905,12 @@ stopEditItem(WEditMenu *menu, Bool apply)
|
|||||||
menu->selectedItem->label = wstrdup(text);
|
menu->selectedItem->label = wstrdup(text);
|
||||||
|
|
||||||
updateMenuContents(menu);
|
updateMenuContents(menu);
|
||||||
|
|
||||||
|
if (menu->delegate && menu->delegate->itemEdited) {
|
||||||
|
(*menu->delegate->itemEdited)(menu->delegate, menu,
|
||||||
|
menu->selectedItem);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
WMUnmapWidget(menu->tfield);
|
WMUnmapWidget(menu->tfield);
|
||||||
menu->flags.isEditing = 0;
|
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
|
static void
|
||||||
dragItem(WEditMenu *menu, WEditMenuItem *item)
|
dragItem(WEditMenu *menu, WEditMenuItem *item)
|
||||||
{
|
{
|
||||||
@@ -1237,7 +1293,7 @@ dragItem(WEditMenu *menu, WEditMenuItem *item)
|
|||||||
W_RealizeView(dview);
|
W_RealizeView(dview);
|
||||||
|
|
||||||
if (menu->flags.isFactory) {
|
if (menu->flags.isFactory) {
|
||||||
dritem = WCreateEditMenuItem(menu, item->label, False);
|
dritem = duplicateItem(item);
|
||||||
|
|
||||||
W_ReparentView(dritem->view, dview, 0, 0);
|
W_ReparentView(dritem->view, dview, 0, 0);
|
||||||
WMResizeWidget(dritem, oldSize.width, oldSize.height);
|
WMResizeWidget(dritem, oldSize.width, oldSize.height);
|
||||||
@@ -1298,12 +1354,12 @@ dragItem(WEditMenu *menu, WEditMenuItem *item)
|
|||||||
Bool rem = True;
|
Bool rem = True;
|
||||||
|
|
||||||
if (!menu->flags.isFactory) {
|
if (!menu->flags.isFactory) {
|
||||||
WMUnmapWidget(dritem);
|
W_UnmapView(dview);
|
||||||
if (menu->delegate && menu->delegate->shouldRemoveItem) {
|
if (menu->delegate && menu->delegate->shouldRemoveItem) {
|
||||||
rem = (*menu->delegate->shouldRemoveItem)(menu->delegate,
|
rem = (*menu->delegate->shouldRemoveItem)(menu->delegate,
|
||||||
menu, item);
|
menu, item);
|
||||||
}
|
}
|
||||||
WMMapWidget(dritem);
|
W_MapView(dview);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rem || menu->flags.isFactory) {
|
if (!rem || menu->flags.isFactory) {
|
||||||
@@ -1319,7 +1375,8 @@ dragItem(WEditMenu *menu, WEditMenuItem *item)
|
|||||||
} else {
|
} else {
|
||||||
WRemoveEditMenuItem(menu, dritem);
|
WRemoveEditMenuItem(menu, dritem);
|
||||||
|
|
||||||
if (menu->delegate && menu->delegate->itemCloned) {
|
if (menu->delegate && menu->delegate->itemCloned
|
||||||
|
&& menu->flags.isFactory) {
|
||||||
(*menu->delegate->itemCloned)(menu->delegate, menu,
|
(*menu->delegate->itemCloned)(menu->delegate, menu,
|
||||||
item, dritem);
|
item, dritem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ typedef struct WEditMenuDelegate {
|
|||||||
|
|
||||||
void (*itemCloned)(struct WEditMenuDelegate*, WEditMenu*,
|
void (*itemCloned)(struct WEditMenuDelegate*, WEditMenu*,
|
||||||
WEditMenuItem*, WEditMenuItem *);
|
WEditMenuItem*, WEditMenuItem *);
|
||||||
|
void (*itemEdited)(struct WEditMenuDelegate*, WEditMenu*,
|
||||||
|
WEditMenuItem*);
|
||||||
void (*itemSelected)(struct WEditMenuDelegate*, WEditMenu*,
|
void (*itemSelected)(struct WEditMenuDelegate*, WEditMenu*,
|
||||||
WEditMenuItem*);
|
WEditMenuItem*);
|
||||||
void (*itemDeselected)(struct WEditMenuDelegate*, WEditMenu*,
|
void (*itemDeselected)(struct WEditMenuDelegate*, WEditMenu*,
|
||||||
@@ -52,6 +54,8 @@ void *WGetEditMenuItemData(WEditMenuItem *item);
|
|||||||
void WSetEditMenuItemData(WEditMenuItem *item, void *data,
|
void WSetEditMenuItemData(WEditMenuItem *item, void *data,
|
||||||
WMCallback *destroyer);
|
WMCallback *destroyer);
|
||||||
|
|
||||||
|
void WSetEditMenuItemImage(WEditMenuItem *item, WMPixmap *pixmap);
|
||||||
|
|
||||||
WEditMenu *WCreateEditMenu(WMScreen *scr, char *title);
|
WEditMenu *WCreateEditMenu(WMScreen *scr, char *title);
|
||||||
|
|
||||||
WEditMenu *WCreateEditMenuPad(WMWidget *parent);
|
WEditMenu *WCreateEditMenuPad(WMWidget *parent);
|
||||||
@@ -63,8 +67,12 @@ WEditMenuItem *WInsertMenuItemWithTitle(WEditMenu *mPtr, int index,
|
|||||||
|
|
||||||
WEditMenuItem *WAddMenuItemWithTitle(WEditMenu *mPtr, char *title);
|
WEditMenuItem *WAddMenuItemWithTitle(WEditMenu *mPtr, char *title);
|
||||||
|
|
||||||
|
WEditMenuItem *WGetEditMenuItem(WEditMenu *mPtr, int index);
|
||||||
|
|
||||||
void WSetEditMenuTitle(WEditMenu *mPtr, char *title);
|
void WSetEditMenuTitle(WEditMenu *mPtr, char *title);
|
||||||
|
|
||||||
|
char *WGetEditMenuTitle(WEditMenu *mPtr);
|
||||||
|
|
||||||
void WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag);
|
void WSetEditMenuAcceptsDrop(WEditMenu *mPtr, Bool flag);
|
||||||
|
|
||||||
void WSetEditMenuSubmenu(WEditMenu *mPtr, WEditMenuItem *item,
|
void WSetEditMenuSubmenu(WEditMenu *mPtr, WEditMenuItem *item,
|
||||||
|
|||||||
Reference in New Issue
Block a user