mirror of
https://github.com/gryf/wmaker.git
synced 2026-02-13 12:25:53 +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
|
counterparts, except it should scroll by page_size/3 instead of one full page
|
||||||
- added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection()
|
- added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection()
|
||||||
WMBrowserAllowsMultipleSelection() and WMBrowserAllowsEmptySelection()
|
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:
|
changes since wmaker 0.62.0:
|
||||||
|
|||||||
@@ -1182,9 +1182,13 @@ char* WMSetBrowserPath(WMBrowser *bPtr, char *path);
|
|||||||
|
|
||||||
/* free the returned string */
|
/* free the returned string */
|
||||||
char *WMGetBrowserPath(WMBrowser *bPtr);
|
char *WMGetBrowserPath(WMBrowser *bPtr);
|
||||||
|
|
||||||
/* free the returned string */
|
/* free the returned string */
|
||||||
char *WMGetBrowserPathToColumn(WMBrowser *bPtr, int column);
|
char *WMGetBrowserPathToColumn(WMBrowser *bPtr, int column);
|
||||||
|
|
||||||
|
/* free the returned array */
|
||||||
|
WMArray* WMGetBrowserPaths(WMBrowser *bPtr);
|
||||||
|
|
||||||
void WMSetBrowserAction(WMBrowser *bPtr, WMAction *action, void *clientData);
|
void WMSetBrowserAction(WMBrowser *bPtr, WMAction *action, void *clientData);
|
||||||
|
|
||||||
void WMSetBrowserDoubleAction(WMBrowser *bPtr, WMAction *action,
|
void WMSetBrowserDoubleAction(WMBrowser *bPtr, WMAction *action,
|
||||||
|
|||||||
@@ -702,7 +702,6 @@ WMSetBrowserHasScroller(WMBrowser *bPtr, int hasScroller)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char*
|
char*
|
||||||
WMSetBrowserPath(WMBrowser *bPtr, char *path)
|
WMSetBrowserPath(WMBrowser *bPtr, char *path)
|
||||||
{
|
{
|
||||||
@@ -779,7 +778,6 @@ WMGetBrowserPath(WMBrowser *bPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char*
|
char*
|
||||||
WMGetBrowserPathToColumn(WMBrowser *bPtr, int column)
|
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
|
Bool
|
||||||
WMBrowserAllowsMultipleSelection(WMBrowser *bPtr)
|
WMBrowserAllowsMultipleSelection(WMBrowser *bPtr)
|
||||||
{
|
{
|
||||||
@@ -966,12 +1024,14 @@ listCallback(void *self, void *clientData)
|
|||||||
WMBrowser *bPtr = (WMBrowser*)clientData;
|
WMBrowser *bPtr = (WMBrowser*)clientData;
|
||||||
WMList *lPtr = (WMList*)self;
|
WMList *lPtr = (WMList*)self;
|
||||||
WMListItem *item;
|
WMListItem *item;
|
||||||
|
int i, selNo;
|
||||||
static WMListItem *oldItem = NULL;
|
static WMListItem *oldItem = NULL;
|
||||||
int i;
|
static int oldSelNo = 0;
|
||||||
|
|
||||||
item = WMGetListSelectedItem(lPtr);
|
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++) {
|
for (i=0; i<bPtr->columnCount; i++) {
|
||||||
if (lPtr == bPtr->columns[i])
|
if (lPtr == bPtr->columns[i])
|
||||||
break;
|
break;
|
||||||
@@ -983,7 +1043,7 @@ listCallback(void *self, void *clientData)
|
|||||||
/* columns at right must be cleared */
|
/* columns at right must be cleared */
|
||||||
removeColumn(bPtr, i+1);
|
removeColumn(bPtr, i+1);
|
||||||
/* open directory */
|
/* open directory */
|
||||||
if (item && item->isBranch) {
|
if (item && item->isBranch && selNo==1) {
|
||||||
WMAddBrowserColumn(bPtr);
|
WMAddBrowserColumn(bPtr);
|
||||||
}
|
}
|
||||||
if (bPtr->usedColumnCount < bPtr->maxVisibleColumns)
|
if (bPtr->usedColumnCount < bPtr->maxVisibleColumns)
|
||||||
@@ -991,17 +1051,17 @@ listCallback(void *self, void *clientData)
|
|||||||
else
|
else
|
||||||
i = bPtr->usedColumnCount-bPtr->maxVisibleColumns;
|
i = bPtr->usedColumnCount-bPtr->maxVisibleColumns;
|
||||||
scrollToColumn(bPtr, i, True);
|
scrollToColumn(bPtr, i, True);
|
||||||
if (item && item->isBranch) {
|
if (item && item->isBranch && selNo==1) {
|
||||||
loadColumn(bPtr, bPtr->usedColumnCount-1);
|
loadColumn(bPtr, bPtr->usedColumnCount-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* call callback for click */
|
/* call callback for click */
|
||||||
if (bPtr->action)
|
if (bPtr->action)
|
||||||
(*bPtr->action)(bPtr, bPtr->clientData);
|
(*bPtr->action)(bPtr, bPtr->clientData);
|
||||||
|
|
||||||
oldItem = item;
|
oldItem = item;
|
||||||
|
oldSelNo = selNo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user