progbar: directions + channels

pull/1212/head
nick black 4 years ago committed by Nick Black
parent ff798e69e9
commit 08b2d38721

@ -226,6 +226,12 @@ typedef struct ncprogbar {
double progress; // on the range [0, 1]
uint64_t maxchannels;
uint64_t minchannels;
enum { // dynamic unless locked into one direction
PROGRESS_DYNAMIC,
PROGRESS_VERT,
PROGRESS_HORIZ,
} direction;
bool retrograde;
} ncprogbar;
// terminfo cache

@ -5,8 +5,9 @@ ncprogbar* ncprogbar_create(ncplane* n, const ncprogbar_options* opts){
ncprogbar_options default_opts;
if(opts == NULL){
memset(&default_opts, 0, sizeof(default_opts));
default_opts.minchannels = CHANNELS_RGB_INITIALIZER(0x3d, 0x3d, 0x3d, 0, 0, 0);
default_opts.maxchannels = CHANNELS_RGB_INITIALIZER(0xe0, 0xee, 0xe0, 0, 0, 0);
opts = &default_opts;
// FIXME need sensible default channels
}
if(opts->flags > (NCPROGBAR_OPTION_FORCE_VERTICAL << 1u)){
logwarn(ncplane_notcurses(n), "Invalid flags %016lx\n", opts->flags);
@ -15,6 +16,16 @@ ncprogbar* ncprogbar_create(ncplane* n, const ncprogbar_options* opts){
ret->ncp = n;
ret->maxchannels = opts->maxchannels;
ret->minchannels = opts->minchannels;
if(opts->flags & NCPROGBAR_OPTION_LOCK_ORIENTATION){
if(opts->flags & NCPROGBAR_OPTION_FORCE_VERTICAL){
ret->direction = PROGRESS_VERT;
}else{
ret->direction = PROGRESS_HORIZ;
}
}else{
ret->direction = PROGRESS_DYNAMIC;
}
ret->retrograde = opts->flags & NCPROGBAR_OPTION_RETROGRADE;
return ret;
}
@ -24,6 +35,32 @@ ncplane* ncprogbar_plane(ncprogbar* n){
static int
progbar_redraw(ncprogbar* n){
enum {
DIR_UP,
DIR_RIGHT,
DIR_DOWN,
DIR_LEFT
} direction;
// get current dimensions; they might have changed
int dimy, dimx;
ncplane_dim_yx(ncprogbar_plane(n), &dimy, &dimx);
if(n->direction == PROGRESS_DYNAMIC){
if(dimx > dimy){
direction = n->retrograde ? DIR_LEFT : DIR_RIGHT;
}else{
direction = n->retrograde ? DIR_DOWN : DIR_UP;
}
}else if(n->direction == PROGRESS_VERT){
direction = n->retrograde ? DIR_DOWN : DIR_UP;
}else{ // PROGRESS_HORIZ
direction = n->retrograde ? DIR_LEFT : DIR_RIGHT;
}
int range;
if(direction == DIR_UP || direction == DIR_DOWN){
range = dimy;
}else{
range = dimx;
}
// FIXME
return 0;
}

Loading…
Cancel
Save