Added checkbox table cells. Now just to add progressbar cells and we'll be good.

This commit is contained in:
Pietro Gagliardi 2016-06-26 15:36:46 -04:00
parent 44a723b314
commit d7caa150b8
4 changed files with 73 additions and 5 deletions

View File

@ -2,6 +2,16 @@
#include "../ui.h" #include "../ui.h"
#include "uipriv.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 *uiTableAppendTextColumn(uiTable *t, const char *name, int modelColumn)
{ {
uiTableColumn *tc; uiTableColumn *tc;

View File

@ -7,6 +7,7 @@
// - background color shows up for a line or two below selection // - background color shows up for a line or two below selection
// - editable NSTextFields have no intrinsic width // - editable NSTextFields have no intrinsic width
// - changing a part property does not refresh views // - changing a part property does not refresh views
// - is the Y position of checkbox cells correct?
@interface tableModel : NSObject<NSTableViewDataSource, NSTableViewDelegate> { @interface tableModel : NSObject<NSTableViewDataSource, NSTableViewDelegate> {
uiTableModel *libui_m; uiTableModel *libui_m;
@ -19,6 +20,7 @@ enum {
partText, partText,
partImage, partImage,
partButton, partButton,
partCheckbox,
}; };
@interface tablePart : NSObject @interface tablePart : NSObject
@ -26,6 +28,7 @@ enum {
@property int textColumn; @property int textColumn;
@property int textColorColumn; @property int textColorColumn;
@property int imageColumn; @property int imageColumn;
@property int valueColumn;
@property int expand; @property int expand;
@property int editable; @property int editable;
- (NSView *)mkView:(uiTableModel *)m row:(int)row; - (NSView *)mkView:(uiTableModel *)m row:(int)row;
@ -153,7 +156,6 @@ done:
uiTable *t = tv.libui_t; uiTable *t = tv.libui_t;
NSColor *color; NSColor *color;
[rv setBackgroundColor:nil]; // make default by default
if (t->backgroundColumn == -1) if (t->backgroundColumn == -1)
return; return;
color = (NSColor *) ((*(m->mh->CellValue))(m->mh, m, row, t->backgroundColumn)); color = (NSColor *) ((*(m->mh->CellValue))(m->mh, m, row, t->backgroundColumn));
@ -182,9 +184,16 @@ done:
if ([view isKindOfClass:[NSTextField class]]) if ([view isKindOfClass:[NSTextField class]])
data = [[((NSTextField *) view) stringValue] UTF8String]; data = [[((NSTextField *) view) stringValue] UTF8String];
else if ([view isKindOfClass:[NSButton class]]) else if ([view isKindOfClass:[NSButton class]]) {
data = NULL; NSButton *b;
else
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"); 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 // 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]; [b setTag:self.textColumn];
view = b; view = b;
break; 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 // if stretchy, don't hug, otherwise hug forcibly
@ -403,6 +433,18 @@ void uiTableColumnAppendButtonPart(uiTableColumn *c, int modelColumn, int expand
[c->parts addObject:part]; [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) void uiTableColumnPartSetEditable(uiTableColumn *c, int part, int editable)
{ {
tablePart *p; tablePart *p;

View File

@ -5,7 +5,7 @@ static uiTableModelHandler mh;
static int modelNumColumns(uiTableModelHandler *mh, uiTableModel *m) static int modelNumColumns(uiTableModelHandler *mh, uiTableModel *m)
{ {
return 7; return 8;
} }
static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableModel *m, int column) static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableModel *m, int column)
@ -14,6 +14,8 @@ static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableMo
return uiTableModelColumnColor; return uiTableModelColumnColor;
if (column == 5) if (column == 5)
return uiTableModelColumnImage; return uiTableModelColumnImage;
if (column == 7)
return uiTableModelColumnInt;
return uiTableModelColumnString; return uiTableModelColumnString;
} }
@ -25,6 +27,7 @@ static int modelNumRows(uiTableModelHandler *mh, uiTableModel *m)
static uiImage *img[2]; static uiImage *img[2];
static char row9text[1024]; static char row9text[1024];
static int yellowRow = -1; static int yellowRow = -1;
static int checkStates[15];
static void *modelCellValue(uiTableModelHandler *mh, uiTableModel *m, int row, int col) 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[0];
return img[1]; return img[1];
} }
if (col == 7)
return uiTableModelGiveInt(checkStates[row]);
switch (col) { switch (col) {
case 0: case 0:
sprintf(buf, "Row %d", row); sprintf(buf, "Row %d", row);
@ -73,6 +78,8 @@ static void modelSetCellValue(uiTableModelHandler *mh, uiTableModel *m, int row,
strcpy(row9text, (const char *) val); strcpy(row9text, (const char *) val);
if (col == 6) if (col == 6)
yellowRow = row; yellowRow = row;
if (col == 7)
checkStates[row] = uiTableModelTakeInt(val);
} }
uiBox *makePage16(void) uiBox *makePage16(void)
@ -91,6 +98,8 @@ uiBox *makePage16(void)
strcpy(row9text, "Part"); strcpy(row9text, "Part");
memset(checkStates, 0, 15 * sizeof (int));
page16 = newVerticalBox(); page16 = newVerticalBox();
mh.NumColumns = modelNumColumns; mh.NumColumns = modelNumColumns;
@ -115,6 +124,7 @@ uiBox *makePage16(void)
uiTableSetRowBackgroundColorModelColumn(t, 3); uiTableSetRowBackgroundColorModelColumn(t, 3);
tc = uiTableAppendColumn(t, "Buttons"); tc = uiTableAppendColumn(t, "Buttons");
uiTableColumnAppendCheckboxPart(tc, 7, 0);
uiTableColumnAppendButtonPart(tc, 6, 1); uiTableColumnAppendButtonPart(tc, 6, 1);
return page16; return page16;

View File

@ -11,9 +11,11 @@ _UI_EXTERN void uiImageAppend(uiImage *i, void *pixels, int pixelWidth, int pixe
typedef struct uiTableModel uiTableModel; typedef struct uiTableModel uiTableModel;
typedef struct uiTableModelHandler uiTableModelHandler; typedef struct uiTableModelHandler uiTableModelHandler;
// TODO actually validate these
_UI_ENUM(uiTableModelColumnType) { _UI_ENUM(uiTableModelColumnType) {
uiTableModelColumnString, uiTableModelColumnString,
uiTableModelColumnImage, uiTableModelColumnImage,
uiTableModelColumnInt,
uiTableModelColumnColor, uiTableModelColumnColor,
}; };
@ -28,6 +30,8 @@ struct uiTableModelHandler {
_UI_EXTERN void *uiTableModelStrdup(const char *str); _UI_EXTERN void *uiTableModelStrdup(const char *str);
// TODO rename the strdup one to this too // TODO rename the strdup one to this too
_UI_EXTERN void *uiTableModelGiveColor(double r, double g, double b, double a); _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 uiTableModel *uiNewTableModel(uiTableModelHandler *mh);
_UI_EXTERN void uiFreeTableModel(uiTableModel *m); _UI_EXTERN void uiFreeTableModel(uiTableModel *m);
@ -42,6 +46,8 @@ _UI_EXTERN void uiTableColumnAppendTextPart(uiTableColumn *c, int modelColumn, i
// TODO images shouldn't expand... // TODO images shouldn't expand...
_UI_EXTERN void uiTableColumnAppendImagePart(uiTableColumn *c, int modelColumn, int expand); _UI_EXTERN void uiTableColumnAppendImagePart(uiTableColumn *c, int modelColumn, int expand);
_UI_EXTERN void uiTableColumnAppendButtonPart(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? // TODO Editable?
_UI_EXTERN void uiTableColumnPartSetEditable(uiTableColumn *c, int part, int editable); _UI_EXTERN void uiTableColumnPartSetEditable(uiTableColumn *c, int part, int editable);
_UI_EXTERN void uiTableColumnPartSetTextColor(uiTableColumn *c, int part, int modelColumn); _UI_EXTERN void uiTableColumnPartSetTextColor(uiTableColumn *c, int part, int modelColumn);