Added checkbox table cells. Now just to add progressbar cells and we'll be good.
This commit is contained in:
parent
44a723b314
commit
d7caa150b8
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue