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:
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user