From 3cbfb2d937a836fbe720a37c0ab52173595c6650 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 24 Nov 2001 05:54:32 +0000 Subject: [PATCH] working on the iconbar. it now accepts scroll arrows in the iconbar bit - u can scroll around 9if you have too many icons to fit) it also will clip the icons to the icon area. also u can scroll the icons up and down the bar to a position you like. a new test iconbar bit to demo this too. SVN revision: 5726 --- data/iconbar/iconbar_bottom.bits.db | Bin 94208 -> 172032 bytes src/actions.c | 14 ++ src/exec.c | 2 + src/iconbar.c | 222 +++++++++++++++++++++++++++- src/iconbar.h | 7 + src/main.c | 5 +- src/view.c | 17 ++- src/view.h | 2 + 8 files changed, 258 insertions(+), 11 deletions(-) diff --git a/data/iconbar/iconbar_bottom.bits.db b/data/iconbar/iconbar_bottom.bits.db index 898cf302b97b22c87fc28a69000b51e6d135b77f..bc38aaad4a6e475cb9ffbd6f9dddceb30e618e39 100644 GIT binary patch literal 172032 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 z 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 literal 94208 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 = 1; @@ -69,10 +118,15 @@ e_iconbar_cleanup(E_Iconbar *ib) /* free the list itself */ evas_list_free(ib->icons); } + /* cleaup the clip object */ + if ((ib->view) && (ib->view->evas) && (ib->clip)) + evas_del_object(ib->view->evas, ib->clip); /* delete any timers intended to work on this iconbar */ sprintf(buf, "iconbar_reload:%s", ib->view->dir); ecore_del_event_timer(buf); - + sprintf(buf, "iconbar_scroll:%s", ib->view->dir); + ecore_del_event_timer(buf); + /* call the destructor of the base class */ e_object_cleanup(E_OBJECT(ib)); @@ -109,6 +163,7 @@ e_iconbar_init() /* the list */ cf_iconbar = e_config_type_new(); E_CONFIG_NODE(cf_iconbar, "icons", E_CFG_TYPE_LIST, cf_iconbar_icon, E_Iconbar, icons, 0, 0, NULL); + E_CONFIG_NODE(cf_iconbar, "scroll", E_CFG_TYPE_FLOAT, NULL, E_Iconbar, scroll, 0, 0, NULL); D_RETURN; } @@ -154,6 +209,10 @@ e_iconbar_new(E_View *v) /* the iconbar needs to know what view it's in */ ib->view = v; + /* clip object = NULL */ + ib->clip = NULL; + /* reset has been scrolled flag */ + ib->has_been_scrolled = 0; /* now go thru all the icons that were loaded */ for (l = ib->icons; l; l = l->next) @@ -164,7 +223,7 @@ e_iconbar_new(E_View *v) /* and init the iocnbar icon object */ e_object_init(E_OBJECT(ic), (E_Cleanup_Func) e_iconbar_icon_cleanup); - /* and have the iconbar icon knwo what iconbar it belongs to */ + /* and have the iconbar icon know what iconbar it belongs to */ ic->iconbar = ib; } @@ -181,6 +240,11 @@ e_iconbar_new(E_View *v) /* to put it */ D_RETURN_(NULL); } + ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow1", CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib); + ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow1", CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib); + ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow2", CALLBACK_MOUSE_DOWN, e_ib_bit_down_cb, ib); + ebits_set_classed_bit_callback(ib->bit, "Scrollbar_Arrow2", CALLBACK_MOUSE_UP, e_ib_bit_up_cb, ib); + /* aaah. our nicely constructed iconbar data struct with all the goodies */ /* we need. return it. she's ready for use. */ D_RETURN_(ib); @@ -230,6 +294,9 @@ e_iconbar_realize(E_Iconbar *ib) D_ENTER; + /* create clip object */ + ib->clip = evas_add_rectangle(ib->view->evas); + evas_set_color(ib->view->evas, ib->clip, 255, 255, 255, 255); /* go thru every icon in the iconbar */ for (l = ib->icons; l; l = l->next) { @@ -244,6 +311,8 @@ e_iconbar_realize(E_Iconbar *ib) sprintf(buf, "%s/.e_iconbar.db:%s", ib->view->dir, ic->image_path); /* add the icon image object */ ic->image = evas_add_image_from_file(ib->view->evas, buf); + /* clip the icon */ + evas_set_clip(ib->view->evas, ic->image, ib->clip); /* set it to be semi-transparent */ evas_set_color(ib->view->evas, ic->image, 255, 255, 255, 128); /* set up callbacks on events - so the ib_* functions will be */ @@ -285,6 +354,53 @@ e_iconbar_realize(E_Iconbar *ib) D_RETURN; } +/** + * e_iconbar_get_length - get lenght of the icons in the iconbar + * @ib: The iconbar for which to fix the geometry + * + * This functionc alculates the length of the iconbar (either horizontal) + * or vertical - and returns that. + * + */ +double +e_iconbar_get_length(E_Iconbar *ib) +{ + double ix, iy, aw, ah; + double len; + Evas_List l; + + D_ENTER; + + /* init len */ + len = 0; + /* find icon area geometry */ + ix = ib->icon_area.x; + iy = ib->icon_area.y; + aw = ib->icon_area.w; + ah = ib->icon_area.h; + + /* loop throught icons */ + for (l = ib->icons; l; l = l->next) + { + E_Iconbar_Icon *ic; + int iw, ih; + + ic = l->data; + /* find out the original image size (of the image file) */ + evas_get_image_size(ic->iconbar->view->evas, ic->image, &iw, &ih); + if (aw > ah) /* horizontal */ + { + len += iw; + } + else /* vertical */ + { + len += ih; + } + } + /* return length */ + D_RETURN_(len); +} + /** * e_iconbar_fix - iconbar geometry update * @ib: The iconbar for which to fix the geometry @@ -318,14 +434,57 @@ e_iconbar_fix(E_Iconbar *ib) aw = ib->icon_area.w; ah = ib->icon_area.h; - /* not used yet... */ + /* if we have icons- show the clipper that will clip them */ + if (ib->icons) evas_show(ib->view->evas, ib->clip); + /* no icons - hide the clipper as it will be a real object */ + else evas_hide(ib->view->evas, ib->clip); + /* move the clip object to fill the icon area */ + evas_move(ib->view->evas, ib->clip, ix, iy); + evas_resize(ib->view->evas, ib->clip, aw, ah); + if (aw > ah) /* horizontal */ { + double len; + + len = e_iconbar_get_length(ib); + if (aw > len) + { + if ((ib->scroll + len) > aw) + ib->scroll = aw - len; + else if (ib->scroll < 0) + ib->scroll = 0; + } + else + { + if ((ib->scroll + len) > aw) + ib->scroll = aw - len; + else if (ib->scroll > 0) + ib->scroll = 0; + } + ix += ib->scroll; } else /* vertical */ { + double len; + + len = e_iconbar_get_length(ib); + if (ah > len) + { + if ((ib->scroll + len) > ah) + ib->scroll = ah - len; + else if (ib->scroll < 0) + ib->scroll = 0; + } + else + { + if ((ib->scroll + len) < ah) + ib->scroll = ah - len; + else if (ib->scroll > 0) + ib->scroll = 0; + } + iy += ib->scroll; } - + /* now go thru all the icons... */ for (l = ib->icons; l; l = l->next) { @@ -410,6 +569,10 @@ e_iconbar_file_add(E_View *v, char *file) /* unique timer name */ sprintf(buf, "iconbar_reload:%s", v->dir); + /* if we've scrolled since. save */ + if ((v->iconbar) && + (v->iconbar->has_been_scrolled)) + e_iconbar_save_out_final(v->iconbar); /* in 0.5 secs call our timout handler */ ecore_add_event_timer(buf, 0.5, ib_reload_timeout, 0, v); } @@ -465,14 +628,34 @@ e_iconbar_file_change(E_View *v, char *file) /* unique timer name */ sprintf(buf, "iconbar_reload:%s", v->dir); - /* in 0.5 secsm call the realod timeout */ + /* if we've scrolled since. save */ + if ((v->iconbar) && + (v->iconbar->has_been_scrolled)) + e_iconbar_save_out_final(v->iconbar); + /* in 0.5 secs call the realod timeout */ ecore_add_event_timer(buf, 0.5, ib_reload_timeout, 0, v); } D_RETURN; } - +/** + * e_iconbar_save_out_final - save out final state of iconbar back to disk + * @ib: The iconbar + * + * This function saves the state of the iconbar to the db it comes from + */ +void +e_iconbar_save_out_final(E_Iconbar *ib) +{ + char buf[PATH_MAX]; + + if (ib->view) + { + sprintf(buf, "%s/.e_iconbar.db", ib->view->dir); + E_DB_FLOAT_SET(buf, "/scroll", ib->scroll); + } +} /* static (internal to iconbar use only) callbacks */ @@ -502,6 +685,31 @@ ib_reload_timeout(int val, void *data) D_RETURN; } +/* scroll timeout. called to continuously scroll when arrow button down */ +static void +ib_scroll_timeout(int val, void *data) +{ + E_Iconbar *ib; + char buf[PATH_MAX]; + + D_ENTER; + + /* get our iconbar pointer */ + ib = (E_Iconbar *)data; + + sprintf(buf, "iconbar_scroll:%s", ib->view->dir); + if (val == 0) + ecore_del_event_timer(buf); + else + { + ib->has_been_scrolled = 1; + ib->scroll += val; + e_iconbar_fix(ib); + ecore_add_event_timer(buf, 0.02, ib_scroll_timeout, val, ib); + } + D_RETURN; +} + /* this timeout is responsible for doing the mouse over animation */ static void ib_timeout(int val, void *data) diff --git a/src/iconbar.h b/src/iconbar.h index e3d3cec9b..8fdd4915d 100644 --- a/src/iconbar.h +++ b/src/iconbar.h @@ -24,6 +24,11 @@ struct _E_Iconbar E_View *view; Evas_List icons; + + Evas_Object clip; + + int has_been_scrolled; + float scroll; Ebits_Object *bit; struct { @@ -55,8 +60,10 @@ E_Iconbar *e_iconbar_new(E_View *v); void e_iconbar_icon_free(E_Iconbar_Icon *); void e_iconbar_realize(E_Iconbar *ib); void e_iconbar_fix(E_Iconbar *ib); +double e_iconbar_get_length(E_Iconbar *ib); void e_iconbar_file_add(E_View *v, char *file); void e_iconbar_file_delete(E_View *v, char *file); void e_iconbar_file_change(E_View *v, char *file); +void e_iconbar_save_out_final(E_Iconbar *ib); #endif diff --git a/src/main.c b/src/main.c index 700a32f19..55898d84d 100644 --- a/src/main.c +++ b/src/main.c @@ -62,12 +62,11 @@ static void setup(void) { D_ENTER; - + ecore_grab(); ecore_sync(); - /* Start to manage all those windows that - we're interested in ... */ + /* Start to manage all those windows that we're interested in ... */ e_border_adopt_children(0); ecore_ungrab(); diff --git a/src/view.c b/src/view.c index ce6d076c9..33c5aef5d 100644 --- a/src/view.c +++ b/src/view.c @@ -1648,6 +1648,18 @@ e_view_find_by_monitor_id(int id) D_RETURN_(NULL); } +void +e_view_close_all(void) +{ + while (views) + { + E_View *v; + + v = views->data; + e_object_unref(E_OBJECT(v)); + } +} + static void e_view_cleanup(E_View *v) { @@ -1656,7 +1668,10 @@ e_view_cleanup(E_View *v) D_ENTER; if (v->iconbar) - e_object_unref(E_OBJECT(v->iconbar)); + { + e_iconbar_save_out_final(v->iconbar); + e_object_unref(E_OBJECT(v->iconbar)); + } sprintf(name, "resort_timer.%s", v->dir); ecore_del_event_timer(name); diff --git a/src/view.h b/src/view.h index cca9b3fe9..f783623f4 100644 --- a/src/view.h +++ b/src/view.h @@ -228,4 +228,6 @@ void e_view_bg_load(E_View *v); void e_view_bg_change(E_View *v, char *file); +void e_view_close_all(void); + #endif