From d7caa150b814a98639206fb7a4b3b4583c5160d2 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 26 Jun 2016 15:36:46 -0400 Subject: [PATCH] Added checkbox table cells. Now just to add progressbar cells and we'll be good. --- common/table.c | 10 ++++++++++ darwin/table.m | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- test/page16.c | 12 +++++++++++- uitable.h | 6 ++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/common/table.c b/common/table.c index c2190b3b..3726883a 100644 --- a/common/table.c +++ b/common/table.c @@ -2,6 +2,16 @@ #include "../ui.h" #include "uipriv.h" +void *uiTableModelGiveInt(int i) +{ + return (void *) ((intptr_t) i); +} + +int uiTableModelTakeInt(void *v) +{ + return (int) ((intptr_t) v); +} + uiTableColumn *uiTableAppendTextColumn(uiTable *t, const char *name, int modelColumn) { uiTableColumn *tc; diff --git a/darwin/table.m b/darwin/table.m index 178e3cd3..c0fd79ed 100644 --- a/darwin/table.m +++ b/darwin/table.m @@ -7,6 +7,7 @@ // - background color shows up for a line or two below selection // - editable NSTextFields have no intrinsic width // - changing a part property does not refresh views +// - is the Y position of checkbox cells correct? @interface tableModel : NSObject { uiTableModel *libui_m; @@ -19,6 +20,7 @@ enum { partText, partImage, partButton, + partCheckbox, }; @interface tablePart : NSObject @@ -26,6 +28,7 @@ enum { @property int textColumn; @property int textColorColumn; @property int imageColumn; +@property int valueColumn; @property int expand; @property int editable; - (NSView *)mkView:(uiTableModel *)m row:(int)row; @@ -153,7 +156,6 @@ done: uiTable *t = tv.libui_t; NSColor *color; - [rv setBackgroundColor:nil]; // make default by default if (t->backgroundColumn == -1) return; color = (NSColor *) ((*(m->mh->CellValue))(m->mh, m, row, t->backgroundColumn)); @@ -182,9 +184,16 @@ done: if ([view isKindOfClass:[NSTextField class]]) data = [[((NSTextField *) view) stringValue] UTF8String]; - else if ([view isKindOfClass:[NSButton class]]) - data = NULL; - else + else if ([view isKindOfClass:[NSButton class]]) { + NSButton *b; + + b = (NSButton *) view; +// if ([b buttonType] == NSSwitchButton) + data = uiTableModelGiveInt([b state] == NSOnState); +// TODO there is no buttonType getter +if(1); else + data = NULL; + } else implbug("table model editing action triggered on non-editable view"); // note the use of [view tag] — we need the model column, which we store in the view tag for relevant views below @@ -277,6 +286,27 @@ done: [b setTag:self.textColumn]; view = b; break; + case partCheckbox: + data = (*(m->mh->CellValue))(m->mh, m, row, self.valueColumn); + b = [[NSButton alloc] initWithFrame:NSZeroRect]; + [b setTitle:@""]; + [b setButtonType:NSSwitchButton]; + // doesn't seem to have an associated bezel style + [b setBordered:NO]; + [b setTransparent:NO]; + uiDarwinSetControlFont(b, NSRegularControlSize); + if (uiTableModelTakeInt(data) != 0) + [b setState:NSOnState]; + else + [b setState:NSOffState]; + if (self.editable) { + [b setTarget:m->m]; + [b setAction:@selector(onAction:)]; + } else + [b setEnabled:NO]; + [b setTag:self.valueColumn]; + view = b; + break; } // if stretchy, don't hug, otherwise hug forcibly @@ -403,6 +433,18 @@ void uiTableColumnAppendButtonPart(uiTableColumn *c, int modelColumn, int expand [c->parts addObject:part]; } +void uiTableColumnAppendCheckboxPart(uiTableColumn *c, int modelColumn, int expand) +{ + tablePart *part; + + part = [tablePart new]; + part.type = partCheckbox; + part.valueColumn = modelColumn; + part.expand = expand; + part.editable = 1; // editable by default + [c->parts addObject:part]; +} + void uiTableColumnPartSetEditable(uiTableColumn *c, int part, int editable) { tablePart *p; diff --git a/test/page16.c b/test/page16.c index 35239d0c..176290a9 100644 --- a/test/page16.c +++ b/test/page16.c @@ -5,7 +5,7 @@ static uiTableModelHandler mh; static int modelNumColumns(uiTableModelHandler *mh, uiTableModel *m) { - return 7; + return 8; } static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableModel *m, int column) @@ -14,6 +14,8 @@ static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableMo return uiTableModelColumnColor; if (column == 5) return uiTableModelColumnImage; + if (column == 7) + return uiTableModelColumnInt; return uiTableModelColumnString; } @@ -25,6 +27,7 @@ static int modelNumRows(uiTableModelHandler *mh, uiTableModel *m) static uiImage *img[2]; static char row9text[1024]; static int yellowRow = -1; +static int checkStates[15]; static void *modelCellValue(uiTableModelHandler *mh, uiTableModel *m, int row, int col) { @@ -49,6 +52,8 @@ static void *modelCellValue(uiTableModelHandler *mh, uiTableModel *m, int row, i return img[0]; return img[1]; } + if (col == 7) + return uiTableModelGiveInt(checkStates[row]); switch (col) { case 0: sprintf(buf, "Row %d", row); @@ -73,6 +78,8 @@ static void modelSetCellValue(uiTableModelHandler *mh, uiTableModel *m, int row, strcpy(row9text, (const char *) val); if (col == 6) yellowRow = row; + if (col == 7) + checkStates[row] = uiTableModelTakeInt(val); } uiBox *makePage16(void) @@ -91,6 +98,8 @@ uiBox *makePage16(void) strcpy(row9text, "Part"); + memset(checkStates, 0, 15 * sizeof (int)); + page16 = newVerticalBox(); mh.NumColumns = modelNumColumns; @@ -115,6 +124,7 @@ uiBox *makePage16(void) uiTableSetRowBackgroundColorModelColumn(t, 3); tc = uiTableAppendColumn(t, "Buttons"); + uiTableColumnAppendCheckboxPart(tc, 7, 0); uiTableColumnAppendButtonPart(tc, 6, 1); return page16; diff --git a/uitable.h b/uitable.h index df87addb..aed49495 100644 --- a/uitable.h +++ b/uitable.h @@ -11,9 +11,11 @@ _UI_EXTERN void uiImageAppend(uiImage *i, void *pixels, int pixelWidth, int pixe typedef struct uiTableModel uiTableModel; typedef struct uiTableModelHandler uiTableModelHandler; +// TODO actually validate these _UI_ENUM(uiTableModelColumnType) { uiTableModelColumnString, uiTableModelColumnImage, + uiTableModelColumnInt, uiTableModelColumnColor, }; @@ -28,6 +30,8 @@ struct uiTableModelHandler { _UI_EXTERN void *uiTableModelStrdup(const char *str); // TODO rename the strdup one to this too _UI_EXTERN void *uiTableModelGiveColor(double r, double g, double b, double a); +_UI_EXTERN void *uiTableModelGiveInt(int i); +_UI_EXTERN int uiTableModelTakeInt(void *v); _UI_EXTERN uiTableModel *uiNewTableModel(uiTableModelHandler *mh); _UI_EXTERN void uiFreeTableModel(uiTableModel *m); @@ -42,6 +46,8 @@ _UI_EXTERN void uiTableColumnAppendTextPart(uiTableColumn *c, int modelColumn, i // TODO images shouldn't expand... _UI_EXTERN void uiTableColumnAppendImagePart(uiTableColumn *c, int modelColumn, int expand); _UI_EXTERN void uiTableColumnAppendButtonPart(uiTableColumn *c, int modelColumn, int expand); +// TODO should these have labels? +_UI_EXTERN void uiTableColumnAppendCheckboxPart(uiTableColumn *c, int modelColumn, int expand); // TODO Editable? _UI_EXTERN void uiTableColumnPartSetEditable(uiTableColumn *c, int part, int editable); _UI_EXTERN void uiTableColumnPartSetTextColor(uiTableColumn *c, int part, int modelColumn);