Allow dynamic resizing. Reverse animation direction.

svn path=/trunk/netsurf/; revision=2996
This commit is contained in:
Richard Wilson 2006-10-12 13:36:28 +00:00
parent a6d038c543
commit 161b073f08
2 changed files with 32 additions and 12 deletions

View File

@ -42,9 +42,13 @@ struct progress_bar {
bool recalculate; /**< recalculation required */
int cur_width; /**< current calculated width */
int cur_height; /**< current calculated height */
bool icon_obscured; /**< icon is partially obscured */
};
static char progress_animation_sprite[] = "progress\0";
static osspriteop_header *progress_icon;
static unsigned int progress_width;
static unsigned int progress_height;
struct wimp_window_base progress_bar_definition = {
{0, 0, 1, 1},
@ -69,12 +73,8 @@ struct wimp_window_base progress_bar_definition = {
{""},
0
};
static osspriteop_header *progress_icon;
static unsigned int progress_width;
static unsigned int progress_height;
static void ro_gui_progress_bar_update(struct progress_bar *pb);
static void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width,
int height);
static void ro_gui_progress_bar_redraw(wimp_draw *redraw);
@ -187,7 +187,7 @@ void ro_gui_progress_bar_set_icon(struct progress_bar *pb, const char *icon) {
}
pb->recalculate = true;
xwimp_force_redraw(pb->w, 0, 0, 32, 32);
ro_gui_progress_bar_update(pb);
ro_gui_progress_bar_update(pb, pb->cur_width, pb->cur_height);
}
@ -203,7 +203,7 @@ void ro_gui_progress_bar_set_value(struct progress_bar *pb, unsigned int value)
pb->value = value;
if (pb->value > pb->range)
pb->range = pb->value;
ro_gui_progress_bar_update(pb);
ro_gui_progress_bar_update(pb, pb->cur_width, pb->cur_height);
}
@ -232,7 +232,7 @@ void ro_gui_progress_bar_set_range(struct progress_bar *pb, unsigned int range)
pb->range = range;
if (pb->value > pb->range)
pb->value = pb->range;
ro_gui_progress_bar_update(pb);
ro_gui_progress_bar_update(pb, pb->cur_width, pb->cur_height);
}
@ -250,16 +250,22 @@ unsigned int ro_gui_progress_bar_get_range(struct progress_bar *pb) {
/**
* Update the display to reflect new values
* Update the progress bar to a new dimension.
*
* \param pb the progress bar to update
* \param width the new progress bar width
* \param height the new progress bar height
*/
void ro_gui_progress_bar_update(struct progress_bar *pb) {
void ro_gui_progress_bar_update(struct progress_bar *pb, int width, int height) {
wimp_draw redraw;
os_error *error;
osbool more;
os_box cur;
/* don't allow negative dimensions */
width = max(width, 0);
height = max(height, 0);
/* update the animation state */
if ((pb->value == 0) || (pb->value == pb->range)) {
if (pb->animating)
@ -274,7 +280,7 @@ void ro_gui_progress_bar_update(struct progress_bar *pb) {
/* get old and new positions */
cur = pb->visible;
pb->recalculate = true;
ro_gui_progress_bar_calculate(pb, pb->cur_width, pb->cur_height);
ro_gui_progress_bar_calculate(pb, width, height);
/* see if the progress bar hasn't moved. we don't need to consider
* the left edge moving as this is handled by the icon setting
@ -365,6 +371,7 @@ void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width, int heigh
int icon_width, icon_height;
int icon_x0 = 0, icon_y0 = 0, progress_x0, progress_x1, progress_ymid = 0;
osspriteop_header *icon = NULL;
bool icon_redraw = false;
/* try to use cached values */
if ((!pb->recalculate) && (pb->cur_width == width) &&
@ -396,8 +403,20 @@ void ro_gui_progress_bar_calculate(struct progress_bar *pb, int width, int heigh
width -= 32;
icon_x0 = 16 - icon_width;
icon_y0 = progress_ymid - icon_height;
if (width < 0) {
icon_x0 += width;
icon_redraw = true;
}
}
}
/* update the icon */
if ((pb->icon_obscured) || (icon_redraw)) {
if (icon_x0 != pb->icon_x0)
xwimp_force_redraw(pb->w, 0, 0, 32, 32);
}
pb->icon_obscured = icon_redraw;
progress_x1 = progress_x0;
if (pb->range > 0)
progress_x1 += (width * pb->value) / pb->range;
@ -439,7 +458,7 @@ void ro_gui_progress_bar_redraw_window(wimp_draw *redraw, struct progress_bar *p
/* redraw the window */
while (more) {
if (pb->icon)
_swix(Tinct_Plot, _IN(2) | _IN(3) | _IN(4) | _IN(7),
_swix(Tinct_PlotAlpha, _IN(2) | _IN(3) | _IN(4) | _IN(7),
pb->icon_img,
redraw->box.x0 + pb->icon_x0,
redraw->box.y0 + pb->icon_y0,
@ -458,7 +477,7 @@ void ro_gui_progress_bar_redraw_window(wimp_draw *redraw, struct progress_bar *p
clip_x1, clip_y1);
_swix(Tinct_Plot, _IN(2) | _IN(3) | _IN(4) | _IN(7),
progress_icon,
redraw->box.x0 + pb->offset,
redraw->box.x0 - pb->offset,
progress_ymid - progress_height,
tinct_FILL_HORIZONTALLY);
}

View File

@ -22,6 +22,7 @@ void ro_gui_progress_bar_init(osspriteop_area *icons);
struct progress_bar *ro_gui_progress_bar_create(void);
void ro_gui_progress_bar_destroy(struct progress_bar *pb);
void ro_gui_progress_bar_update(struct progress_bar *pb, int width, int height);
wimp_w ro_gui_progress_bar_get_window(struct progress_bar *pb);
void ro_gui_progress_bar_set_icon(struct progress_bar *pb, const char *icon);