From 6804f263d48764cf58aeed000f6cb6a3c4698686 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 26 Jun 2016 18:19:34 -0400 Subject: [PATCH] And implemented (mostly) the progressbar table parts. I think that'll do for uiTable features now. --- darwin/table.m | 42 ++++++++++++++++++++++++++++++++++++++++++ test/page16.c | 16 ++++++++++++++-- uitable.h | 3 +++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/darwin/table.m b/darwin/table.m index c0fd79ed..ff458caa 100644 --- a/darwin/table.m +++ b/darwin/table.m @@ -8,6 +8,10 @@ // - editable NSTextFields have no intrinsic width // - changing a part property does not refresh views // - is the Y position of checkbox cells correct? +// - progressbars appear ABOVE the table header + +// LONGTERM +// - reuse row views instead of creating a new one each time @interface tableModel : NSObject { uiTableModel *libui_m; @@ -21,6 +25,7 @@ enum { partImage, partButton, partCheckbox, + partProgressBar, }; @interface tablePart : NSObject @@ -227,6 +232,8 @@ if(1); else NSTextField *tf; NSImageView *iv; NSButton *b; + NSProgressIndicator *p; + int value; switch (self.type) { case partText: @@ -307,6 +314,30 @@ if(1); else [b setTag:self.valueColumn]; view = b; break; + case partProgressBar: + data = (*(m->mh->CellValue))(m->mh, m, row, self.valueColumn); + value = uiTableModelTakeInt(data); + // TODO no intrinsic width + p = [[NSProgressIndicator alloc] initWithFrame:NSZeroRect]; + [p setControlSize:NSRegularControlSize]; + [p setBezeled:YES]; + [p setStyle:NSProgressIndicatorBarStyle]; + if (value == -1) { + [p setIndeterminate:YES]; + [p startAnimation:p]; + } else if (value == 100) { + [p setIndeterminate:NO]; + [p setMaxValue:101]; + [p setDoubleValue:101]; + [p setDoubleValue:100]; + [p setMaxValue:100]; + } else { + [p setIndeterminate:NO]; + [p setDoubleValue:(value + 1)]; + [p setDoubleValue:value]; + } + view = p; + break; } // if stretchy, don't hug, otherwise hug forcibly @@ -445,6 +476,17 @@ void uiTableColumnAppendCheckboxPart(uiTableColumn *c, int modelColumn, int expa [c->parts addObject:part]; } +void uiTableColumnAppendProgressBarPart(uiTableColumn *c, int modelColumn, int expand) +{ + tablePart *part; + + part = [tablePart new]; + part.type = partProgressBar; + part.valueColumn = modelColumn; + part.expand = expand; + [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 176290a9..80ac0139 100644 --- a/test/page16.c +++ b/test/page16.c @@ -5,7 +5,7 @@ static uiTableModelHandler mh; static int modelNumColumns(uiTableModelHandler *mh, uiTableModel *m) { - return 8; + return 9; } static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableModel *m, int column) @@ -14,7 +14,7 @@ static uiTableModelColumnType modelColumnType(uiTableModelHandler *mh, uiTableMo return uiTableModelColumnColor; if (column == 5) return uiTableModelColumnImage; - if (column == 7) + if (column == 7 || column == 8) return uiTableModelColumnInt; return uiTableModelColumnString; } @@ -54,6 +54,15 @@ static void *modelCellValue(uiTableModelHandler *mh, uiTableModel *m, int row, i } if (col == 7) return uiTableModelGiveInt(checkStates[row]); + if (col == 8) { + if (row == 0) + return uiTableModelGiveInt(0); + if (row == 13) + return uiTableModelGiveInt(100); + if (row == 14) + return uiTableModelGiveInt(-1); + return uiTableModelGiveInt(50); + } switch (col) { case 0: sprintf(buf, "Row %d", row); @@ -127,5 +136,8 @@ uiBox *makePage16(void) uiTableColumnAppendCheckboxPart(tc, 7, 0); uiTableColumnAppendButtonPart(tc, 6, 1); + tc = uiTableAppendColumn(t, "Progress Bar"); + uiTableColumnAppendProgressBarPart(tc, 8, 0); + return page16; } diff --git a/uitable.h b/uitable.h index aed49495..66aeffaf 100644 --- a/uitable.h +++ b/uitable.h @@ -31,6 +31,8 @@ _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); +// TODO TakeString +// TODO add const _UI_EXTERN int uiTableModelTakeInt(void *v); _UI_EXTERN uiTableModel *uiNewTableModel(uiTableModelHandler *mh); @@ -48,6 +50,7 @@ _UI_EXTERN void uiTableColumnAppendImagePart(uiTableColumn *c, int modelColumn, _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); +_UI_EXTERN void uiTableColumnAppendProgressBarPart(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);