1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 04:20:27 +01:00

Code to allow multiple selection in WMBrowser

This commit is contained in:
dan
2000-10-03 20:52:15 +00:00
parent b24b51b514
commit ed39c92de0
3 changed files with 74 additions and 7 deletions

View File

@@ -36,6 +36,9 @@ changes since wmaker 0.62.1:
counterparts, except it should scroll by page_size/3 instead of one full page
- added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection()
WMBrowserAllowsMultipleSelection() and WMBrowserAllowsEmptySelection()
- WMBrowser now allows multiple selections.
- Added WMGetBrowserPaths() to retrieve the paths for browsers that allow
multiple selections.
changes since wmaker 0.62.0:

View File

@@ -1182,9 +1182,13 @@ char* WMSetBrowserPath(WMBrowser *bPtr, char *path);
/* free the returned string */
char *WMGetBrowserPath(WMBrowser *bPtr);
/* free the returned string */
char *WMGetBrowserPathToColumn(WMBrowser *bPtr, int column);
/* free the returned array */
WMArray* WMGetBrowserPaths(WMBrowser *bPtr);
void WMSetBrowserAction(WMBrowser *bPtr, WMAction *action, void *clientData);
void WMSetBrowserDoubleAction(WMBrowser *bPtr, WMAction *action,

View File

@@ -702,7 +702,6 @@ WMSetBrowserHasScroller(WMBrowser *bPtr, int hasScroller)
}
char*
WMSetBrowserPath(WMBrowser *bPtr, char *path)
{
@@ -779,7 +778,6 @@ WMGetBrowserPath(WMBrowser *bPtr)
}
char*
WMGetBrowserPathToColumn(WMBrowser *bPtr, int column)
{
@@ -819,6 +817,66 @@ WMGetBrowserPathToColumn(WMBrowser *bPtr, int column)
}
WMArray*
WMGetBrowserPaths(WMBrowser *bPtr)
{
int column, i, k, size, selNo;
char *path;
WMListItem *item, *lastItem;
WMArray *paths, *items;
column = bPtr->usedColumnCount-1;
if (column < 0) {
paths = WMCreateArrayWithDestructor(1, wfree);
WMAddToArray(paths, wstrdup(bPtr->pathSeparator));
return paths;
}
items = WMGetListSelectedItems(bPtr->columns[column]);
selNo = WMGetArrayItemCount(items);
paths = WMCreateArrayWithDestructor(selNo, wfree);
if (selNo <= 1) {
WMAddToArray(paths, WMGetBrowserPath(bPtr));
return paths;
}
/* calculate size of buffer */
size = 0;
for (i=0; i<column; i++) {
item = WMGetListSelectedItem(bPtr->columns[i]);
if (!item)
break;
size += strlen(item->text);
}
size += (column+1)*strlen(bPtr->pathSeparator)+1;
for (k=0; k<selNo; k++) {
/* get the path */
lastItem = WMGetFromArray(items, k);
path = wmalloc(size + (lastItem!=NULL ? strlen(lastItem->text) : 0));
/* ignore first / */
*path = 0;
for (i=0; i<=column; i++) {
strcat(path, bPtr->pathSeparator);
if (i == column) {
item = lastItem;
} else {
item = WMGetListSelectedItem(bPtr->columns[i]);
}
if (!item)
break;
strcat(path, item->text);
}
WMAddToArray(paths, path);
}
return paths;
}
Bool
WMBrowserAllowsMultipleSelection(WMBrowser *bPtr)
{
@@ -966,12 +1024,14 @@ listCallback(void *self, void *clientData)
WMBrowser *bPtr = (WMBrowser*)clientData;
WMList *lPtr = (WMList*)self;
WMListItem *item;
int i, selNo;
static WMListItem *oldItem = NULL;
int i;
static int oldSelNo = 0;
item = WMGetListSelectedItem(lPtr);
selNo = WMGetArrayItemCount(WMGetListSelectedItems(lPtr));
if (oldItem==NULL || oldItem!=item) {
if (oldItem==NULL || oldItem!=item || oldSelNo!=selNo) {
for (i=0; i<bPtr->columnCount; i++) {
if (lPtr == bPtr->columns[i])
break;
@@ -983,7 +1043,7 @@ listCallback(void *self, void *clientData)
/* columns at right must be cleared */
removeColumn(bPtr, i+1);
/* open directory */
if (item && item->isBranch) {
if (item && item->isBranch && selNo==1) {
WMAddBrowserColumn(bPtr);
}
if (bPtr->usedColumnCount < bPtr->maxVisibleColumns)
@@ -991,17 +1051,17 @@ listCallback(void *self, void *clientData)
else
i = bPtr->usedColumnCount-bPtr->maxVisibleColumns;
scrollToColumn(bPtr, i, True);
if (item && item->isBranch) {
if (item && item->isBranch && selNo==1) {
loadColumn(bPtr, bPtr->usedColumnCount-1);
}
}
/* call callback for click */
if (bPtr->action)
(*bPtr->action)(bPtr, bPtr->clientData);
oldItem = item;
oldSelNo = selNo;
}