mirror of
https://github.com/gryf/wmaker.git
synced 2026-01-01 11:32:34 +01:00
- added WMRemoveFromArrayMatching(array, match, cdata), which will remove the
first element in the array that is matched by match(item, cdata)==True. - added WMArrayFirst(), WMArrayLast(), WMArrayNext() and WMArrayPrevious() functions and also WM_ITERATE_ARRAY() and WM_ETARETI_ARRAY() macros, to make interfaces to WMBag and WMArray similar and to make life a little simpler when iterating through all elements of an array. - replaced bags with arrays wherever appropriate. This will improve performance a bit. - replaced some recursive code with iterative code in WINGs/selection.c - some code cleanup is src/
This commit is contained in:
@@ -56,7 +56,7 @@ typedef struct W_EditMenu {
|
||||
|
||||
struct W_EditMenu *parent;
|
||||
|
||||
WMBag *items; /* EditMenuItem */
|
||||
WMArray *items; /* EditMenuItem */
|
||||
|
||||
EditMenuItem *selectedItem;
|
||||
|
||||
@@ -457,7 +457,7 @@ makeEditMenu(WMScreen *scr, WMWidget *parent, char *title)
|
||||
WMAddNotificationObserver(itemSelectObserver, mPtr,
|
||||
"EditMenuItemSelected", NULL);
|
||||
|
||||
mPtr->items = WMCreateBag(4);
|
||||
mPtr->items = WMCreateArray(4);
|
||||
|
||||
WMCreateEventHandler(mPtr->view, ExposureMask|StructureNotifyMask,
|
||||
handleEvents, mPtr);
|
||||
@@ -467,7 +467,7 @@ makeEditMenu(WMScreen *scr, WMWidget *parent, char *title)
|
||||
item = WCreateEditMenuItem(mPtr, title, True);
|
||||
|
||||
WMMapWidget(item);
|
||||
WMPutInBag(mPtr->items, item);
|
||||
WMAddToArray(mPtr->items, item);
|
||||
|
||||
mPtr->flags.isTitled = 1;
|
||||
}
|
||||
@@ -511,14 +511,14 @@ WInsertMenuItemWithTitle(WEditMenu *mPtr, int index, char *title)
|
||||
|
||||
WMMapWidget(item);
|
||||
|
||||
if (index >= WMGetBagItemCount(mPtr->items)) {
|
||||
WMPutInBag(mPtr->items, item);
|
||||
if (index >= WMGetArrayItemCount(mPtr->items)) {
|
||||
WMAddToArray(mPtr->items, item);
|
||||
} else {
|
||||
if (index < 0)
|
||||
index = 0;
|
||||
if (mPtr->flags.isTitled)
|
||||
index++;
|
||||
WMInsertInBag(mPtr->items, index, item);
|
||||
WMInsertInArray(mPtr->items, index, item);
|
||||
}
|
||||
|
||||
updateMenuContents(mPtr);
|
||||
@@ -530,17 +530,17 @@ WInsertMenuItemWithTitle(WEditMenu *mPtr, int index, char *title)
|
||||
WEditMenuItem*
|
||||
WGetEditMenuItem(WEditMenu *mPtr, int index)
|
||||
{
|
||||
if (index >= WMGetBagItemCount(mPtr->items))
|
||||
if (index >= WMGetArrayItemCount(mPtr->items))
|
||||
return NULL;
|
||||
else
|
||||
return WMGetFromBag(mPtr->items, index + (mPtr->flags.isTitled ? 1 : 0));
|
||||
|
||||
return WMGetFromArray(mPtr->items, index + (mPtr->flags.isTitled ? 1 : 0));
|
||||
}
|
||||
|
||||
|
||||
WEditMenuItem*
|
||||
WAddMenuItemWithTitle(WEditMenu *mPtr, char *title)
|
||||
{
|
||||
return WInsertMenuItemWithTitle(mPtr, WMGetBagItemCount(mPtr->items),
|
||||
return WInsertMenuItemWithTitle(mPtr, WMGetArrayItemCount(mPtr->items),
|
||||
title);
|
||||
}
|
||||
|
||||
@@ -551,7 +551,7 @@ WSetEditMenuTitle(WEditMenu *mPtr, char *title)
|
||||
{
|
||||
WEditMenuItem *item;
|
||||
|
||||
item = WMGetFromBag(mPtr->items, 0);
|
||||
item = WMGetFromArray(mPtr->items, 0);
|
||||
|
||||
wfree(item->label);
|
||||
item->label = wstrdup(title);
|
||||
@@ -568,7 +568,7 @@ WGetEditMenuTitle(WEditMenu *mPtr)
|
||||
{
|
||||
WEditMenuItem *item;
|
||||
|
||||
item = WMGetFromBag(mPtr->items, 0);
|
||||
item = WMGetFromArray(mPtr->items, 0);
|
||||
|
||||
return item->label;
|
||||
}
|
||||
@@ -598,27 +598,12 @@ WGetEditMenuSubmenu(WEditMenu *mPtr, WEditMenuItem *item)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
simpleMatch(void *a, void *b)
|
||||
{
|
||||
return ((a == b) ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WRemoveEditMenuItem(WEditMenu *mPtr, WEditMenuItem *item)
|
||||
{
|
||||
int index;
|
||||
|
||||
index = WMFindInBag(mPtr->items, simpleMatch, item);
|
||||
|
||||
if (index == WBNotFound) {
|
||||
return;
|
||||
if (WMRemoveFromArray(mPtr->items, item) != 0) {
|
||||
updateMenuContents(mPtr);
|
||||
}
|
||||
|
||||
WMDeleteFromBag(mPtr->items, index);
|
||||
|
||||
updateMenuContents(mPtr);
|
||||
}
|
||||
|
||||
|
||||
@@ -662,7 +647,7 @@ WSetEditMenuMaxSize(WEditMenu *mPtr, WMSize size)
|
||||
WMPoint
|
||||
WGetEditMenuLocationForSubmenu(WEditMenu *mPtr, WEditMenu *submenu)
|
||||
{
|
||||
WMBagIterator iter;
|
||||
WMArrayIterator iter;
|
||||
WEditMenuItem *item;
|
||||
int y;
|
||||
|
||||
@@ -670,7 +655,7 @@ WGetEditMenuLocationForSubmenu(WEditMenu *mPtr, WEditMenu *submenu)
|
||||
y = -mPtr->titleHeight;
|
||||
else
|
||||
y = 0;
|
||||
WM_ITERATE_BAG(mPtr->items, item, iter) {
|
||||
WM_ITERATE_ARRAY(mPtr->items, item, iter) {
|
||||
if (item->submenu == submenu) {
|
||||
WMPoint pt = WMGetViewScreenPosition(mPtr->view);
|
||||
|
||||
@@ -705,7 +690,7 @@ WTearOffEditMenu(WEditMenu *menu, WEditMenu *submenu)
|
||||
|
||||
submenu->flags.isTornOff = 1;
|
||||
|
||||
item = (WEditMenuItem*)WMGetFromBag(submenu->items, 0);
|
||||
item = (WEditMenuItem*)WMGetFromArray(submenu->items, 0);
|
||||
|
||||
submenu->closeB = WMCreateCommandButton(item);
|
||||
WMResizeWidget(submenu->closeB, 15, 15);
|
||||
@@ -802,14 +787,14 @@ updateMenuContents(WEditMenu *mPtr)
|
||||
int i;
|
||||
int iheight = mPtr->itemHeight;
|
||||
int offs = 1;
|
||||
WMBagIterator iter;
|
||||
WMArrayIterator iter;
|
||||
WEditMenuItem *item;
|
||||
|
||||
newW = 0;
|
||||
newH = offs;
|
||||
|
||||
i = 0;
|
||||
WM_ITERATE_BAG(mPtr->items, item, iter) {
|
||||
WM_ITERATE_ARRAY(mPtr->items, item, iter) {
|
||||
w = getItemTextWidth(item);
|
||||
|
||||
newW = WMAX(w, newW);
|
||||
@@ -847,7 +832,7 @@ updateMenuContents(WEditMenu *mPtr)
|
||||
newW -= 2*offs;
|
||||
|
||||
i = 0;
|
||||
WM_ITERATE_BAG(mPtr->items, item, iter) {
|
||||
WM_ITERATE_ARRAY(mPtr->items, item, iter) {
|
||||
if (i == 0 && mPtr->flags.isTitled) {
|
||||
WMResizeWidget(item, newW, mPtr->titleHeight);
|
||||
} else {
|
||||
@@ -999,8 +984,8 @@ textEndedEditing(struct WMTextFieldDelegate *self, WMNotification *notif)
|
||||
case WMTabTextMovement:
|
||||
stopEditItem(menu, True);
|
||||
|
||||
i = WMFindInBag(menu->items, simpleMatch, menu->selectedItem);
|
||||
item = WMGetFromBag(menu->items, i+1);
|
||||
i = WMGetFirstInArray(menu->items, menu->selectedItem);
|
||||
item = WMGetFromArray(menu->items, i+1);
|
||||
if (item != NULL) {
|
||||
selectItem(menu, item);
|
||||
editItemLabel(item);
|
||||
@@ -1010,8 +995,8 @@ textEndedEditing(struct WMTextFieldDelegate *self, WMNotification *notif)
|
||||
case WMBacktabTextMovement:
|
||||
stopEditItem(menu, True);
|
||||
|
||||
i = WMFindInBag(menu->items, simpleMatch, menu->selectedItem);
|
||||
item = WMGetFromBag(menu->items, i-1);
|
||||
i = WMGetFirstInArray(menu->items, menu->selectedItem);
|
||||
item = WMGetFromArray(menu->items, i-1);
|
||||
if (item != NULL) {
|
||||
selectItem(menu, item);
|
||||
editItemLabel(item);
|
||||
@@ -1037,7 +1022,6 @@ editItemLabel(WEditMenuItem *item)
|
||||
{
|
||||
WEditMenu *mPtr = item->parent;
|
||||
WMTextField *tf;
|
||||
int i;
|
||||
|
||||
if (!mPtr->flags.isEditable) {
|
||||
return;
|
||||
@@ -1058,8 +1042,6 @@ editItemLabel(WEditMenuItem *item)
|
||||
}
|
||||
tf = mPtr->tfield;
|
||||
|
||||
i = WMFindInBag(mPtr->items, simpleMatch, item);
|
||||
|
||||
WMSetTextFieldText(tf, item->label);
|
||||
WMSelectTextFieldRange(tf, wmkrange(0, strlen(item->label)));
|
||||
WMResizeWidget(tf, mPtr->view->size.width, mPtr->itemHeight);
|
||||
@@ -1210,10 +1192,10 @@ handleItemDrop(WEditMenu *menu, WEditMenuItem *item, int x, int y)
|
||||
index++;
|
||||
}
|
||||
|
||||
if (index > WMGetBagItemCount(menu->items)) {
|
||||
WMPutInBag(menu->items, item);
|
||||
if (index > WMGetArrayItemCount(menu->items)) {
|
||||
WMAddToArray(menu->items, item);
|
||||
} else {
|
||||
WMInsertInBag(menu->items, index, item);
|
||||
WMInsertInArray(menu->items, index, item);
|
||||
}
|
||||
|
||||
W_ReparentView(item->view, menu->view, 0, index*menu->itemHeight);
|
||||
@@ -1300,7 +1282,7 @@ duplicateMenu(WEditMenu *menu)
|
||||
{
|
||||
WEditMenu *nmenu;
|
||||
WEditMenuItem *item;
|
||||
WMBagIterator iter;
|
||||
WMArrayIterator iter;
|
||||
Bool first = menu->flags.isTitled;
|
||||
|
||||
nmenu = WCreateEditMenu(WMWidgetScreen(menu), WGetEditMenuTitle(menu));
|
||||
@@ -1308,7 +1290,7 @@ duplicateMenu(WEditMenu *menu)
|
||||
memcpy(&nmenu->flags, &menu->flags, sizeof(menu->flags));
|
||||
nmenu->delegate = menu->delegate;
|
||||
|
||||
WM_ITERATE_BAG(menu->items, item, iter) {
|
||||
WM_ITERATE_ARRAY(menu->items, item, iter) {
|
||||
WEditMenuItem *nitem;
|
||||
|
||||
if (first) {
|
||||
@@ -1536,17 +1518,17 @@ static void
|
||||
destroyEditMenu(WEditMenu *mPtr)
|
||||
{
|
||||
WEditMenuItem *item;
|
||||
WMBagIterator iter;
|
||||
WMArrayIterator iter;
|
||||
|
||||
WMRemoveNotificationObserver(mPtr);
|
||||
|
||||
WM_ITERATE_BAG(mPtr->items, item, iter) {
|
||||
WM_ITERATE_ARRAY(mPtr->items, item, iter) {
|
||||
if (item->submenu) {
|
||||
WMDestroyWidget(item->submenu);
|
||||
}
|
||||
}
|
||||
|
||||
WMFreeBag(mPtr->items);
|
||||
WMFreeArray(mPtr->items);
|
||||
|
||||
wfree(mPtr->tdelegate);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user