1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 22:52:34 +01:00

changed stringselector for enumeration selector

This commit is contained in:
kojima
2000-12-21 21:06:00 +00:00
parent f912d9f38d
commit 4c60cd5ba4
5 changed files with 308 additions and 22 deletions

View File

@@ -5,6 +5,15 @@
#include "wtableview.h" #include "wtableview.h"
typedef struct {
WMTableView *table;
WMFont *font;
GC gc;
GC selGc;
GC selTextGc;
} StringData;
typedef struct { typedef struct {
WMTextField *widget; WMTextField *widget;
WMTableView *table; WMTableView *table;
@@ -15,6 +24,19 @@ typedef struct {
} StringEditorData; } StringEditorData;
typedef struct {
WMPopUpButton *widget;
WMTableView *table;
WMFont *font;
char **options;
int count;
GC gc;
GC selGc;
GC selTextGc;
} EnumSelectorData;
static void stringDraw(WMScreen *scr, Drawable d, GC gc, static void stringDraw(WMScreen *scr, Drawable d, GC gc,
GC sgc, GC stgc, WMFont *font, void *data, GC sgc, GC stgc, WMFont *font, void *data,
WMRect rect, Bool selected) WMRect rect, Bool selected)
@@ -52,8 +74,10 @@ static void stringDraw(WMScreen *scr, Drawable d, GC gc,
static void cellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row)
static void SECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{ {
StringEditorData *strdata = (StringEditorData*)self->data; StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column); WMTableView *table = WMGetTableColumnTableView(column);
@@ -67,7 +91,7 @@ static void cellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
} }
static void selectedCellPainter(WMTableColumnDelegate *self, static void selectedSECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row) WMTableColumn *column, int row)
{ {
StringEditorData *strdata = (StringEditorData*)self->data; StringEditorData *strdata = (StringEditorData*)self->data;
@@ -82,7 +106,7 @@ static void selectedCellPainter(WMTableColumnDelegate *self,
} }
static void beginCellEdit(WMTableColumnDelegate *self, static void beginSECellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row) WMTableColumn *column, int row)
{ {
StringEditorData *strdata = (StringEditorData*)self->data; StringEditorData *strdata = (StringEditorData*)self->data;
@@ -97,8 +121,19 @@ static void beginCellEdit(WMTableColumnDelegate *self,
} }
static void endSECellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
char *text;
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent) text = WMGetTextFieldText(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)text);
}
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *parent)
{ {
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate)); WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent); WMScreen *scr = WMWidgetScreen(parent);
@@ -115,13 +150,180 @@ WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
data->gc = WMColorGC(WMBlackColor(scr)); data->gc = WMColorGC(WMBlackColor(scr));
delegate->data = data; delegate->data = data;
delegate->drawCell = cellPainter; delegate->drawCell = SECellPainter;
delegate->drawSelectedCell = selectedCellPainter; delegate->drawSelectedCell = selectedSECellPainter;
delegate->beginCellEdit = beginCellEdit; delegate->beginCellEdit = beginSECellEdit;
delegate->endCellEdit = NULL; delegate->endCellEdit = endSECellEdit;
return delegate; return delegate;
} }
/* ---------------------------------------------------------------------- */
static void ESCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedESCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
True);
}
static void beginESCellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int data = (int)WMTableViewDataForCell(strdata->table, column, row);
wassertr(data < strdata->count);
WMSetPopUpButtonSelectedItem(strdata->widget, data);
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y-1);
WMResizeWidget(strdata->widget, rect.size.width, rect.size.height+2);
WMMapWidget(strdata->widget);
}
static void endESCellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int option;
option = WMGetPopUpButtonSelectedItem(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)option);
}
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
data->widget = WMCreatePopUpButton(parent);
W_ReparentView(WMWidgetView(data->widget),
WMGetTableViewDocumentView(parent),
0, 0);
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->selGc = WMColorGC(WMDarkGrayColor(scr));
data->selTextGc = WMColorGC(WMWhiteColor(scr));
data->gc = WMColorGC(WMBlackColor(scr));
data->count = 0;
data->options = NULL;
delegate->data = data;
delegate->drawCell = ESCellPainter;
delegate->drawSelectedCell = selectedESCellPainter;
delegate->beginCellEdit = beginESCellEdit;
delegate->endCellEdit = endESCellEdit;
return delegate;
}
void WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate,
char **options, int count)
{
EnumSelectorData *data = (EnumSelectorData*)delegate->data;
int i;
for (i = 0;
i < WMGetPopUpButtonNumberOfItems(data->widget);
i++) {
WMRemovePopUpButtonItem(data->widget, 0);
}
data->options = options;
data->count = count;
for (i = 0; i < count; i++) {
WMAddPopUpButtonItem(data->widget, options[i]);
}
}
/* ---------------------------------------------------------------------- */
static void SCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
True);
}
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
StringData *data = wmalloc(sizeof(StringData));
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->selGc = WMColorGC(WMDarkGrayColor(scr));
data->selTextGc = WMColorGC(WMWhiteColor(scr));
data->gc = WMColorGC(WMBlackColor(scr));
delegate->data = data;
delegate->drawCell = SCellPainter;
delegate->drawSelectedCell = selectedSCellPainter;
delegate->beginCellEdit = NULL;
delegate->endCellEdit = NULL;
return delegate;
}

View File

@@ -6,7 +6,9 @@
extern "C" { extern "C" {
#endif #endif
WMTableColumnDelegate *WTCreateStringDelegate(WMScreen *scr); WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *table);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -5,6 +5,18 @@
#include "tabledelegates.h" #include "tabledelegates.h"
static char *col1[20] = {0};
static int col2[20];
static char *options[] = {
"Option1",
"Option2",
"Option3",
"Option4",
"Option5"
};
int numberOfRows(WMTableViewDelegate *self, WMTableView *table) int numberOfRows(WMTableViewDelegate *self, WMTableView *table)
{ {
@@ -15,8 +27,27 @@ int numberOfRows(WMTableViewDelegate *self, WMTableView *table)
void *valueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row) void *valueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row)
{ {
WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column); WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column);
int i;
if (col1[0] == 0) {
for (i = 0; i < 20; i++) {
col1[i] = "teste";
col2[i] = 0;
}
}
if (WMGetTableColumnId(column) == 1)
return col1[row];
else
return col2[row];
}
return "TESTE";
void setValueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row,
void *data)
{
if (WMGetTableColumnId(column) == 1)
col1[row] = data;
else
col2[row] = data;
} }
@@ -24,11 +55,21 @@ static WMTableViewDelegate delegate = {
NULL, NULL,
numberOfRows, numberOfRows,
valueForCell, valueForCell,
NULL setValueForCell
}; };
void selectedRowObserver(void *self, WMNotification *notif)
{
int row = (int)WMGetNotificationClientData(notif);
WMEditTableViewRow(self, row);
}
main(int argc, char **argv) main(int argc, char **argv)
{ {
Display *dpy = XOpenDisplay(""); Display *dpy = XOpenDisplay("");
@@ -60,8 +101,11 @@ main(int argc, char **argv)
WMSetTableViewGridColor(table, WMGrayColor(scr)); WMSetTableViewGridColor(table, WMGrayColor(scr));
WMSetTableViewHeaderHeight(table, 20); WMSetTableViewHeaderHeight(table, 20);
WMSetTableViewDelegate(table, &delegate); WMSetTableViewDelegate(table, &delegate);
WMAddNotificationObserver(selectedRowObserver, table,
WMTableViewRowWasSelectedNotification,
table);
colDeleg = WTCreateStringDelegate(table); colDeleg = WTCreateStringEditorDelegate(table);
col = WMCreateTableColumn("Group"); col = WMCreateTableColumn("Group");
WMSetTableColumnWidth(col, 180); WMSetTableColumnWidth(col, 180);
@@ -69,10 +113,11 @@ main(int argc, char **argv)
WMSetTableColumnDelegate(col, colDeleg); WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)1); WMSetTableColumnId(col, (void*)1);
colDeleg = WTCreateStringDelegate(table); colDeleg = WTCreateEnumSelectorDelegate(table);
WTSetEnumSelectorOptions(colDeleg, options, 5);
col = WMCreateTableColumn("Package"); col = WMCreateTableColumn("Package");
WMSetTableColumnWidth(col, 240); WMSetTableColumnWidth(col, 140);
WMAddTableViewColumn(table, col); WMAddTableViewColumn(table, col);
WMSetTableColumnDelegate(col, colDeleg); WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)2); WMSetTableColumnId(col, (void*)2);

View File

@@ -143,6 +143,8 @@ struct W_TableView {
WMTableViewDelegate *delegate; WMTableViewDelegate *delegate;
int editingRow;
unsigned headerHeight; unsigned headerHeight;
unsigned rowHeight; unsigned rowHeight;
@@ -297,6 +299,8 @@ WMTableView *WMCreateTableView(WMWidget *parent)
GCForeground, &gcv); GCForeground, &gcv);
} }
table->editingRow = -1;
table->drawsGrid = 1; table->drawsGrid = 1;
table->rowHeight = 16; table->rowHeight = 16;
@@ -428,6 +432,13 @@ void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
} }
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data)
{
(*table->delegate->setValueForCell)(table->delegate, column, row, data);
}
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column, WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row) int row)
{ {
@@ -686,15 +697,37 @@ static void repaintTable(WMTableView *table, int x, int y,
} }
static void startRowEdit(WMTableView *table, int row) static void stopRowEdit(WMTableView *table, int row)
{ {
int i; int i;
WMTableColumn *column; WMTableColumn *column;
table->editingRow = -1;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) { for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i); column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->drawCell); wassertr(column->delegate && column->delegate->endCellEdit);
(*column->delegate->endCellEdit)(column->delegate, column, row);
}
}
void WMEditTableViewRow(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
if (table->editingRow >= 0) {
stopRowEdit(table, table->editingRow);
}
table->editingRow = row;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->beginCellEdit);
(*column->delegate->beginCellEdit)(column->delegate, column, row); (*column->delegate->beginCellEdit)(column->delegate, column, row);
} }
@@ -708,7 +741,6 @@ static void handleTableEvents(XEvent *event, void *data)
switch (event->type) { switch (event->type) {
case ButtonPress: case ButtonPress:
setRowSelected(table, event->xbutton.y/table->rowHeight, True); setRowSelected(table, event->xbutton.y/table->rowHeight, True);
startRowEdit(table, event->xbutton.y/table->rowHeight);
break; break;
case Expose: case Expose:

View File

@@ -72,9 +72,14 @@ void WMSetTableViewDelegate(WMTableView *table, WMTableViewDelegate *delegate);
WMView *WMGetTableViewDocumentView(WMTableView *table); WMView *WMGetTableViewDocumentView(WMTableView *table);
void WMEditTableViewRow(WMTableView *table, int row);
void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column, void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row); int row);
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data);
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column, WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row); int row);