From: Enlightenment C. <no...@cv...> - 2006-04-11 15:03:46
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_combobox.c etk_iconbox.c etk_iconbox.h Log Message: * [Iconbox] Clip only the icons that are on the edges, it seems to improve perfs a bit =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_combobox.c 11 Apr 2006 13:51:44 -0000 1.8 +++ etk_combobox.c 11 Apr 2006 15:03:12 -0000 1.9 @@ -946,17 +946,13 @@ Etk_Event_Mouse_Up_Down *event; Etk_Combobox_Item *item; - if (!(item = ETK_COMBOBOX_ITEM(object))) + if (!(item = ETK_COMBOBOX_ITEM(object)) || !(event = event_info)) return; - - event = event_info; - if (event->button != 1 && event->button != 3) return; etk_combobox_item_activate(item); - - if (event->button == 1) + if (event->button == 1) etk_popup_window_popdown(ETK_COMBOBOX(item->combobox)->window); } =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_iconbox.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_iconbox.c 10 Apr 2006 09:23:47 -0000 1.4 +++ etk_iconbox.c 11 Apr 2006 15:03:12 -0000 1.5 @@ -73,6 +73,8 @@ static void _etk_iconbox_grid_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_iconbox_grid_scroll(Etk_Widget *widget, int x, int y); static void _etk_iconbox_grid_scroll_size_get(Etk_Widget *widget, Etk_Size scrollview_size, Etk_Size scrollbar_size, Etk_Size *scroll_size); + +static void _etk_iconbox_realize_cb(Etk_Object *object, void *data); static void _etk_iconbox_grid_realize_cb(Etk_Object *object, void *data); static void _etk_iconbox_grid_unrealize_cb(Etk_Object *object, void *data); static void _etk_iconbox_grid_mouse_down_cb(Etk_Object *object, void *event_info, void *data); @@ -81,7 +83,7 @@ static void _etk_iconbox_icon_object_add(Etk_Iconbox_Grid *grid); static void _etk_iconbox_icon_object_delete(Etk_Iconbox_Grid *grid); -static void _etk_iconbox_icon_draw(Etk_Iconbox_Icon *icon, Etk_Iconbox_Icon_Object *icon_object, Etk_Iconbox_Model *model, int x, int y); +static void _etk_iconbox_icon_draw(Etk_Iconbox_Icon *icon, Etk_Iconbox_Icon_Object *icon_object, Etk_Iconbox_Model *model, int x, int y, Etk_Bool clip); static void _etk_iconbox_grid_selection_rect_update(Etk_Iconbox_Grid *grid); static Etk_Signal *_etk_iconbox_signals[ETK_ICONBOX_NUM_SIGNALS]; @@ -132,7 +134,8 @@ */ Etk_Widget *etk_iconbox_new() { - return etk_widget_new(ETK_ICONBOX_TYPE, "theme_group", "iconbox", "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); + return etk_widget_new(ETK_ICONBOX_TYPE, "theme_group", "iconbox", + "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); } /** @@ -807,10 +810,11 @@ ETK_WIDGET(iconbox)->size_allocate = _etk_iconbox_size_allocate; + etk_signal_connect("realize", ETK_OBJECT(iconbox), ETK_CALLBACK(_etk_iconbox_realize_cb), NULL); + /* TODO: focus, unfocus, keynav */ /*etk_signal_connect("focus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_unfocus_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_key_down_cb), NULL);*/ - } /* Destroys the iconbox */ @@ -847,7 +851,10 @@ static Etk_Type *iconbox_type = NULL; if (!iconbox_type) - iconbox_type = etk_type_new("Etk_Iconbox_Grid", ETK_WIDGET_TYPE, sizeof(Etk_Iconbox_Grid), ETK_CONSTRUCTOR(_etk_iconbox_grid_constructor), NULL); + { + iconbox_type = etk_type_new("Etk_Iconbox_Grid", ETK_WIDGET_TYPE, sizeof(Etk_Iconbox_Grid), + ETK_CONSTRUCTOR(_etk_iconbox_grid_constructor), NULL); + } return iconbox_type; } @@ -888,6 +895,7 @@ int num_cols, num_rows; int num_visible_icons; int num_icons_to_add; + Etk_Bool need_clip; int first_icon_id; int i, j; int x, y; @@ -903,8 +911,9 @@ else { num_cols = ETK_MAX(geometry.w / iconbox->current_model->width, 1); - /* TODO: Do we always need the "+ 1" ?? */ - num_rows = ETK_MAX((geometry.h + iconbox->current_model->height - 1) / iconbox->current_model->height + 1, 1); + num_rows = ETK_MAX((geometry.h + iconbox->current_model->height - 1) / iconbox->current_model->height, 1); + if (((num_rows * iconbox->current_model->height) - (grid->yoffset % iconbox->current_model->height)) < geometry.h) + num_rows++; } num_visible_icons = ETK_MIN(num_cols * num_rows, iconbox->num_icons); num_icons_to_add = num_visible_icons - evas_list_count(grid->icon_objects); @@ -938,17 +947,6 @@ _etk_iconbox_icon_object_delete(grid); } - /* Move/resize the clip */ - if (iconbox->current_model && num_visible_icons > 0) - { - evas_object_move(grid->clip, geometry.x, geometry.y); - evas_object_resize(grid->clip, geometry.w, geometry.h); - evas_object_show(grid->clip); - } - else - evas_object_hide(grid->clip); - - /* Draw the icons */ l = grid->icon_objects; if (iconbox->current_model) @@ -961,11 +959,21 @@ for (i = 0; i < num_rows; i++) { x = -(grid->xoffset % iconbox->current_model->width) + geometry.x; - + for (j = 0; j < num_cols && icon && l; j++, icon = icon->next, l = l->next) { icon_object = l->data; - _etk_iconbox_icon_draw(icon, icon_object, iconbox->current_model, x, y); + + need_clip = ETK_FALSE; + if (i == 0 || i == num_rows - 1 || j == 0 || j == num_cols - 1) + { + if (x < geometry.x || x + iconbox->current_model->width > geometry.x + geometry.w || + y < geometry.y || y + iconbox->current_model->height > geometry.y + geometry.h) + { + need_clip = ETK_TRUE; + } + } + _etk_iconbox_icon_draw(icon, icon_object, iconbox->current_model, x, y, need_clip); x += iconbox->current_model->width; } y += iconbox->current_model->height; @@ -980,6 +988,10 @@ etk_widget_hide(icon_object->label); } + /* Move/resize the clip */ + evas_object_move(grid->clip, geometry.x, geometry.y); + evas_object_resize(grid->clip, geometry.w, geometry.h); + /* Raise the selection rect */ etk_widget_member_object_raise(ETK_WIDGET(grid), grid->selection_rect); } @@ -1046,6 +1058,29 @@ **************************/ /************************** + * Iconbox + **************************/ + +/* Called when the iconbox is realized */ +static void _etk_iconbox_realize_cb(Etk_Object *object, void *data) +{ + Etk_Iconbox *iconbox; + + if (!(iconbox = ETK_ICONBOX(object))) + return; + + if (etk_widget_theme_object_data_get(ETK_WIDGET(iconbox), "selected_icon_color", "%d %d %d %d", + &iconbox->selected_icon_color.r, &iconbox->selected_icon_color.g, + &iconbox->selected_icon_color.b, &iconbox->selected_icon_color.a) != 4) + { + iconbox->selected_icon_color.r = 128; + iconbox->selected_icon_color.g = 128; + iconbox->selected_icon_color.b = 128; + iconbox->selected_icon_color.a = 255; + } +} + +/************************** * Iconbox Grid **************************/ @@ -1059,6 +1094,7 @@ return; grid->clip = evas_object_rectangle_add(evas); + evas_object_show(grid->clip); etk_widget_member_object_add(ETK_WIDGET(grid), grid->clip); grid->selection_rect = etk_theme_object_load_from_parent(evas, ETK_WIDGET(grid->iconbox), NULL, "selection"); @@ -1165,13 +1201,6 @@ } } - -/************************** - * Iconbox - **************************/ - -/* TODO: events, focus */ - /************************** * * Private functions @@ -1197,8 +1226,6 @@ etk_widget_theme_group_set(icon_object->label, "label"); etk_widget_theme_parent_set(icon_object->label, ETK_WIDGET(grid->iconbox)); etk_widget_parent_set(icon_object->label, ETK_WIDGET(grid)); - if (grid->clip) - etk_widget_clip_set(icon_object->label, grid->clip); grid->icon_objects = evas_list_append(grid->icon_objects, icon_object); } @@ -1228,7 +1255,7 @@ } /* Draws the icon according to the icon model */ -static void _etk_iconbox_icon_draw(Etk_Iconbox_Icon *icon, Etk_Iconbox_Icon_Object *icon_object, Etk_Iconbox_Model *model, int x, int y) +static void _etk_iconbox_icon_draw(Etk_Iconbox_Icon *icon, Etk_Iconbox_Icon_Object *icon_object, Etk_Iconbox_Model *model, int x, int y, Etk_Bool clip) { Evas *evas; Etk_Iconbox *iconbox; @@ -1279,12 +1306,14 @@ } etk_widget_member_object_add(iconbox->grid, icon_object->image); - /* TODO: theme */ if (icon->selected) - evas_object_color_set(icon_object->image, 226, 211, 174, 255); + { + evas_object_color_set(icon_object->image, iconbox->selected_icon_color.r, iconbox->selected_icon_color.g, + iconbox->selected_icon_color.b, iconbox->selected_icon_color.a); + } else evas_object_color_set(icon_object->image, 255, 255, 255, 255); - if (grid->clip) + if (grid->clip && clip) evas_object_clip_set(icon_object->image, grid->clip); if (model->icon_expand) @@ -1324,6 +1353,10 @@ etk_label_set(ETK_LABEL(icon_object->label), icon->label); etk_widget_theme_object_signal_emit(icon_object->label, icon->selected ? "select" : "unselect"); + if (clip && grid->clip) + etk_widget_clip_set(icon_object->label, grid->clip); + else + etk_widget_clip_unset(icon_object->label); etk_widget_show(icon_object->label); etk_container_child_space_fill(icon_object->label, &label_geometry, ETK_FALSE, ETK_FALSE, model->label_xalign, model->label_yalign); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_iconbox.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_iconbox.h 10 Apr 2006 09:23:47 -0000 1.4 +++ etk_iconbox.h 11 Apr 2006 15:03:12 -0000 1.5 @@ -91,6 +91,7 @@ Etk_Iconbox_Icon *first_icon; Etk_Iconbox_Icon *last_icon; + Etk_Color selected_icon_color; Etk_Bool frozen; }; |
From: Enlightenment C. <no...@cv...> - 2006-04-11 15:55:34
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_iconbox.c Log Message: * Dragging the selection rect can now make the iconbox scroll if the mouse is outside =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_iconbox.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_iconbox.c 11 Apr 2006 15:03:12 -0000 1.5 +++ etk_iconbox.c 11 Apr 2006 15:55:04 -0000 1.6 @@ -2,6 +2,7 @@ #include "etk_iconbox.h" #include <stdlib.h> #include <string.h> +#include <Ecore.h> #include <Edje.h> #include "etk_container.h" #include "etk_scrolled_view.h" @@ -21,6 +22,11 @@ #define ETK_ICONBOX_GRID(obj) (ETK_OBJECT_CAST((obj), ETK_ICONBOX_GRID_TYPE, Etk_Iconbox_Grid)) #define ETK_IS_ICONBOX_GRID(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_ICONBOX_GRID_TYPE)) +#define ETK_ICONBOX_SCROLL_DELAY (1 / 30.0) +#define ETK_ICONBOX_MAX_SCROLL_SPEED 40.0 +#define ETK_ICONBOX_MAX_SCROLL_DISTANCE 100 +#define ETK_ICONBOX_SCROLL_MARGIN 15 + typedef struct _Etk_Iconbox_Grid { /* Inherit form Etk_Widget */ @@ -44,6 +50,10 @@ int selection_last_col; int selection_first_row; int selection_last_row; + + Ecore_Timer *scroll_timer; + float hscrolling_speed; + float vscrolling_speed; } Etk_Iconbox_Grid; typedef struct _Etk_Iconbox_Icon_Object @@ -70,6 +80,7 @@ static Etk_Type *_etk_iconbox_grid_type_get(); static void _etk_iconbox_grid_constructor(Etk_Iconbox_Grid *grid); +static void _etk_iconbox_grid_destructor(Etk_Iconbox_Grid *grid); static void _etk_iconbox_grid_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_iconbox_grid_scroll(Etk_Widget *widget, int x, int y); static void _etk_iconbox_grid_scroll_size_get(Etk_Widget *widget, Etk_Size scrollview_size, Etk_Size scrollbar_size, Etk_Size *scroll_size); @@ -85,6 +96,7 @@ static void _etk_iconbox_icon_object_delete(Etk_Iconbox_Grid *grid); static void _etk_iconbox_icon_draw(Etk_Iconbox_Icon *icon, Etk_Iconbox_Icon_Object *icon_object, Etk_Iconbox_Model *model, int x, int y, Etk_Bool clip); static void _etk_iconbox_grid_selection_rect_update(Etk_Iconbox_Grid *grid); +static int _etk_iconbox_grid_scroll_cb(void *data); static Etk_Signal *_etk_iconbox_signals[ETK_ICONBOX_NUM_SIGNALS]; @@ -853,7 +865,7 @@ if (!iconbox_type) { iconbox_type = etk_type_new("Etk_Iconbox_Grid", ETK_WIDGET_TYPE, sizeof(Etk_Iconbox_Grid), - ETK_CONSTRUCTOR(_etk_iconbox_grid_constructor), NULL); + ETK_CONSTRUCTOR(_etk_iconbox_grid_constructor), ETK_DESTRUCTOR(_etk_iconbox_grid_destructor)); } return iconbox_type; @@ -872,6 +884,7 @@ grid->clip = NULL; grid->selection_rect = NULL; grid->selection_started = ETK_FALSE; + grid->scroll_timer = NULL; ETK_WIDGET(grid)->size_allocate = _etk_iconbox_grid_size_allocate; ETK_WIDGET(grid)->scroll = _etk_iconbox_grid_scroll; @@ -883,6 +896,16 @@ etk_signal_connect("mouse_move", ETK_OBJECT(grid), ETK_CALLBACK(_etk_iconbox_grid_mouse_move_cb), NULL); } +/* Destroys the iconbox grid */ +static void _etk_iconbox_grid_destructor(Etk_Iconbox_Grid *grid) +{ + if (!grid) + return; + + if (grid->scroll_timer) + ecore_timer_del(grid->scroll_timer); +} + /* Creates or destroys the objects of the icons according to the new size * of the iconbox grid, and then updates the iconbox */ static void _etk_iconbox_grid_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) @@ -1182,6 +1205,11 @@ grid->selection_started = ETK_FALSE; evas_object_hide(grid->selection_rect); } + if (grid->scroll_timer) + { + ecore_timer_del(grid->scroll_timer); + grid->scroll_timer = NULL; + } } /* Called when the mouse moves over the iconbox */ @@ -1189,6 +1217,8 @@ { Etk_Iconbox_Grid *grid; Etk_Event_Mouse_Move *move_event; + Etk_Bool should_scroll = ETK_FALSE; + int x, y, w, h; if (!(grid = ETK_ICONBOX_GRID(object)) || !(move_event = event_info)) return; @@ -1198,6 +1228,43 @@ grid->selection_mouse_x = move_event->cur.widget.x + grid->xoffset; grid->selection_mouse_y = move_event->cur.widget.y + grid->yoffset; _etk_iconbox_grid_selection_rect_update(grid); + + /* Scroll the grid if the mouse is outside the edges of the grid */ + grid->hscrolling_speed = 0.0; + grid->vscrolling_speed = 0.0; + etk_widget_geometry_get(ETK_WIDGET(grid), &x, &y, &w, &h); + if (move_event->cur.canvas.x <= x + ETK_ICONBOX_SCROLL_MARGIN) + { + grid->hscrolling_speed = -ETK_ICONBOX_MAX_SCROLL_SPEED / ETK_ICONBOX_MAX_SCROLL_DISTANCE * + ETK_MIN((x + ETK_ICONBOX_SCROLL_MARGIN) - move_event->cur.canvas.x, ETK_ICONBOX_MAX_SCROLL_DISTANCE); + should_scroll = ETK_TRUE; + } + else if (move_event->cur.canvas.x >= x + w - ETK_ICONBOX_SCROLL_MARGIN) + { + grid->hscrolling_speed = ETK_ICONBOX_MAX_SCROLL_SPEED / ETK_ICONBOX_MAX_SCROLL_DISTANCE * + ETK_MIN(move_event->cur.canvas.x - (x + w - ETK_ICONBOX_SCROLL_MARGIN), ETK_ICONBOX_MAX_SCROLL_DISTANCE); + should_scroll = ETK_TRUE; + } + if (move_event->cur.canvas.y <= y + ETK_ICONBOX_SCROLL_MARGIN) + { + grid->vscrolling_speed = -ETK_ICONBOX_MAX_SCROLL_SPEED / ETK_ICONBOX_MAX_SCROLL_DISTANCE * + ETK_MIN((y + ETK_ICONBOX_SCROLL_MARGIN) - move_event->cur.canvas.y, ETK_ICONBOX_MAX_SCROLL_DISTANCE); + should_scroll = ETK_TRUE; + } + else if (move_event->cur.canvas.y >= y + h - ETK_ICONBOX_SCROLL_MARGIN) + { + grid->vscrolling_speed = ETK_ICONBOX_MAX_SCROLL_SPEED / ETK_ICONBOX_MAX_SCROLL_DISTANCE * + ETK_MIN(move_event->cur.canvas.y - (y + h - ETK_ICONBOX_SCROLL_MARGIN), ETK_ICONBOX_MAX_SCROLL_DISTANCE); + should_scroll = ETK_TRUE; + } + + if (should_scroll && !grid->scroll_timer) + grid->scroll_timer = ecore_timer_add(ETK_ICONBOX_SCROLL_DELAY, _etk_iconbox_grid_scroll_cb, grid); + else if (!should_scroll && grid->scroll_timer) + { + ecore_timer_del(grid->scroll_timer); + grid->scroll_timer = NULL; + } } } @@ -1436,4 +1503,23 @@ evas_object_resize(grid->selection_rect, rect_geometry.w, rect_geometry.h); evas_object_show(grid->selection_rect); etk_widget_member_object_raise(ETK_WIDGET(grid), grid->selection_rect); +} + +/* Scrolls the grid when the selection rect is being dragged and the mouse is outside the edges of the grid */ +static int _etk_iconbox_grid_scroll_cb(void *data) +{ + Etk_Iconbox_Grid *grid; + Etk_Iconbox *iconbox; + Etk_Range *hrange, *vrange; + + if (!(grid = ETK_ICONBOX_GRID(data)) || !(iconbox = grid->iconbox)) + return 1; + + hrange = etk_scrolled_view_hscrollbar_get(ETK_SCROLLED_VIEW(iconbox->scrolled_view)); + vrange = etk_scrolled_view_vscrollbar_get(ETK_SCROLLED_VIEW(iconbox->scrolled_view)); + + etk_range_value_set(hrange, etk_range_value_get(hrange) + grid->hscrolling_speed); + etk_range_value_set(vrange, etk_range_value_get(vrange) + grid->vscrolling_speed); + + return 1; } |
From: Enlightenment C. <no...@cv...> - 2006-04-11 16:42:15
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/widgets Modified Files: iconbox.edc Log Message: * Change the color of the selected icon =================================================================== RCS file: /cvs/e/e17/proto/etk/data/themes/default/widgets/iconbox.edc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- iconbox.edc 7 Apr 2006 15:48:23 -0000 1.1 +++ iconbox.edc 11 Apr 2006 16:41:44 -0000 1.2 @@ -1,4 +1,11 @@ group { + name: "iconbox"; + data { + item: "selected_icon_color" "191 178 147 255"; + } +} + +group { name: "iconbox/scrolled_view"; min: 120 18; data { @@ -137,6 +144,59 @@ } group { + name: "iconbox/label"; + data { + item: "inset" "8 6 0 0"; + } + parts { + part { + name: "background"; + description { + state: "default" 0.0; + visible: 0; + rel1 { + relative: 0.0 0.0; + offset: 0 -3; + } + rel2 { + relative: 1.0 1.0; + offset: 0 3; + } + image { + normal: "iconbox_label_bg.png"; + border: 12 15 12 15; + middle: 0; + } + fill { + smooth: 0; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "select"; + signal: "select"; + source: ""; + action: STATE_SET "selected" 0.0; + target: "background"; + } + program { + name: "unselect"; + signal: "unselect"; + source: ""; + action: STATE_SET "default" 0.0; + target: "background"; + } + } +} + +group { name: "iconbox/scrolled_view/vscrollbar"; min: 18 68; parts { @@ -206,7 +266,7 @@ } image { normal: "iconbox_selection.png"; - border: 3 3 3 3; + border: 1 1 1 1; middle: 0; } fill { @@ -219,14 +279,14 @@ type: RECT; description { state: "default" 0.0; - color: 255 218 128 115; + color: 255 218 128 30; rel1 { relative: 0.0 0.0; - offset: 3 3; + offset: 1 1; } rel2 { relative: 1.0 1.0; - offset: -4 -4; + offset: -2 -2; } } } |
From: Enlightenment C. <no...@cv...> - 2006-04-12 16:20:30
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_main.c etk_range.c etk_range.h Log Message: * [Range] Use a job that will send the "value_changed" signal instead of emitting it immediately. It should make scrolling a bit faster (at least, content will be refreshed now when it's too laggy) =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_main.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- etk_main.c 10 Apr 2006 09:23:47 -0000 1.19 +++ etk_main.c 12 Apr 2006 16:19:55 -0000 1.20 @@ -207,8 +207,8 @@ /* Runs an iteration (used as callback for an ecore_job)*/ static void _etk_main_iterate_job_cb(void *data) { - _etk_main_iterate_job = NULL; etk_main_iterate(); + _etk_main_iterate_job = NULL; } /* Recusively requests the size of all the widgets */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_range.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_range.c 7 Apr 2006 15:36:11 -0000 1.8 +++ etk_range.c 12 Apr 2006 16:19:55 -0000 1.9 @@ -28,8 +28,10 @@ }; static void _etk_range_constructor(Etk_Range *range); +static void _etk_range_destructor(Etk_Range *range); static void _etk_range_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_range_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); +static void _etk_range_change_value_job_cb(void *data); static Etk_Signal *_etk_range_signals[ETK_RANGE_NUM_SIGNALS]; @@ -49,16 +51,24 @@ if (!range_type) { - range_type = etk_type_new("Etk_Range", ETK_WIDGET_TYPE, sizeof(Etk_Range), ETK_CONSTRUCTOR(_etk_range_constructor), NULL); + range_type = etk_type_new("Etk_Range", ETK_WIDGET_TYPE, sizeof(Etk_Range), + ETK_CONSTRUCTOR(_etk_range_constructor), ETK_DESTRUCTOR(_etk_range_destructor)); - _etk_range_signals[ETK_RANGE_VALUE_CHANGED_SIGNAL] = etk_signal_new("value_changed", range_type, ETK_MEMBER_OFFSET(Etk_Range, value_changed), etk_marshaller_VOID__DOUBLE, NULL, NULL); + _etk_range_signals[ETK_RANGE_VALUE_CHANGED_SIGNAL] = etk_signal_new("value_changed", + range_type, ETK_MEMBER_OFFSET(Etk_Range, value_changed), etk_marshaller_VOID__DOUBLE, NULL, NULL); - etk_type_property_add(range_type, "lower", ETK_RANGE_LOWER_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); - etk_type_property_add(range_type, "upper", ETK_RANGE_UPPER_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); - etk_type_property_add(range_type, "value", ETK_RANGE_VALUE_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); - etk_type_property_add(range_type, "step_increment", ETK_RANGE_STEP_INC_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); - etk_type_property_add(range_type, "page_increment", ETK_RANGE_PAGE_INC_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); - etk_type_property_add(range_type, "page_size", ETK_RANGE_PAGE_SIZE_PROPERTY, ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "lower", ETK_RANGE_LOWER_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "upper", ETK_RANGE_UPPER_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "value", ETK_RANGE_VALUE_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "step_increment", ETK_RANGE_STEP_INC_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "page_increment", ETK_RANGE_PAGE_INC_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); + etk_type_property_add(range_type, "page_size", ETK_RANGE_PAGE_SIZE_PROPERTY, + ETK_PROPERTY_DOUBLE, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_double(0.0)); range_type->property_set = _etk_range_property_set; range_type->property_get = _etk_range_property_get; @@ -95,8 +105,8 @@ if (new_value != range->value) { range->value = new_value; - etk_signal_emit(_etk_range_signals[ETK_RANGE_VALUE_CHANGED_SIGNAL], ETK_OBJECT(range), NULL, range->value); - etk_object_notify(ETK_OBJECT(range), "value"); + if (!range->change_value_job) + range->change_value_job = ecore_job_add(_etk_range_change_value_job_cb, range); } } @@ -131,7 +141,8 @@ /** * @brief Sets the increment value of the range * @param range a range - * @param step the step increment value. Used when the arrow of a scrollbar is clicked, or when the keyboard arrows are pressed (for a scale) + * @param step the step increment value. Used when the arrow of a scrollbar is clicked, @n + * or when the keyboard arrows are pressed (for a scale) * @param page the page increment value. Used when the trough of a scrollbar is clicked, or when page up/down are pressed */ void etk_range_increments_set(Etk_Range *range, double step, double page) @@ -202,9 +213,20 @@ range->page_increment = 0.0; range->page_size = 0.0; + range->change_value_job = NULL; range->value_changed = NULL; } +/* Destroys the range */ +static void _etk_range_destructor(Etk_Range *range) +{ + if (!range) + return; + + if (range->change_value_job) + ecore_job_del(range->change_value_job); +} + /* Sets the property whose id is "property_id" to the value "value" */ static void _etk_range_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) { @@ -269,6 +291,26 @@ default: break; } +} + +/************************** + * + * Private functions + * + **************************/ + +/* Emits the the "value changed" signal (doing it in a job to avoid emitting it too + often when the mouse is moved for scrollbars or sliders for example) */ +static void _etk_range_change_value_job_cb(void *data) +{ + Etk_Range *range; + + if (!(range = ETK_RANGE(data))) + return; + + etk_signal_emit(_etk_range_signals[ETK_RANGE_VALUE_CHANGED_SIGNAL], ETK_OBJECT(range), NULL, range->value); + etk_object_notify(ETK_OBJECT(range), "value"); + range->change_value_job = NULL; } /** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_range.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_range.h 7 Apr 2006 15:36:11 -0000 1.6 +++ etk_range.h 12 Apr 2006 16:19:55 -0000 1.7 @@ -3,6 +3,7 @@ #define _ETK_RANGE_H_ #include "etk_widget.h" +#include <Ecore_Job.h> #include "etk_types.h" /** @@ -35,6 +36,7 @@ double page_increment; double page_size; + Ecore_Job *change_value_job; void (*value_changed)(Etk_Range *range, double value); }; |
From: Enlightenment C. <no...@cv...> - 2006-05-11 08:48:51
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_string.c Log Message: * Fix a segv with amd64. Thanks to drexil :) =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_string.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_string.c 7 Apr 2006 15:36:11 -0000 1.6 +++ etk_string.c 11 May 2006 08:47:37 -0000 1.7 @@ -575,6 +575,8 @@ va_copy(args2, args); length = vsnprintf(&c, 1, format, args2); + va_end(args2); + va_copy(args2, args); text = malloc(length + 1); vsprintf(text, format, args2); va_end(args2); |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:14:55
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: Etk.h Makefile.am etk_alignment.c etk_alignment.h etk_bin.c etk_bin.h etk_box.c etk_box.h etk_button.c etk_button.h etk_cache.c etk_cache.h etk_canvas.c etk_canvas.h etk_check_button.c etk_check_button.h etk_colorpicker.c etk_colorpicker.h etk_combobox.c etk_combobox.h etk_container.c etk_container.h etk_dialog.c etk_dialog.h etk_filechooser_widget.c etk_frame.c etk_frame.h etk_iconbox.c etk_iconbox.h etk_image.c etk_image.h etk_label.c etk_label.h etk_main.c etk_main.h etk_marshallers.h etk_menu_bar.h etk_message_dialog.c etk_string.c etk_table.h etk_types.h Removed Files: etk_hbox.c etk_hbox.h etk_vbox.c etk_vbox.h Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/Etk.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- Etk.h 7 Apr 2006 15:36:10 -0000 1.29 +++ Etk.h 12 May 2006 19:13:39 -0000 1.30 @@ -1,6 +1,6 @@ /** * @file Etk.h - * @brief The file to include in an Etk project + * @brief This file has to be included in all the Etk projects. It includes all the other headers. */ #ifndef _ETK_H_ #define _ETK_H_ @@ -22,8 +22,6 @@ #include "etk_stock.h" #include "etk_bin.h" #include "etk_box.h" -#include "etk_hbox.h" -#include "etk_vbox.h" #include "etk_table.h" #include "etk_alignment.h" #include "etk_frame.h" =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/Makefile.am,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- Makefile.am 7 Apr 2006 15:36:10 -0000 1.34 +++ Makefile.am 12 May 2006 19:13:39 -0000 1.35 @@ -23,7 +23,7 @@ etk_theme.h etk_cache.h \ etk_widget.h etk_toplevel_widget.h \ etk_container.h etk_bin.h etk_table.h etk_alignment.h \ -etk_box.h etk_hbox.h etk_vbox.h \ +etk_box.h \ etk_paned.h etk_frame.h \ etk_scrolled_view.h etk_viewport.h \ etk_window.h etk_dialog.h \ @@ -63,7 +63,7 @@ etk_theme.c etk_cache.c \ etk_widget.c etk_toplevel_widget.c \ etk_container.c etk_bin.c etk_table.c etk_alignment.c \ -etk_box.c etk_hbox.c etk_vbox.c \ +etk_box.c \ etk_paned.c etk_frame.c \ etk_scrolled_view.c etk_viewport.c \ etk_window.c etk_dialog.c \ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_alignment.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_alignment.c 7 Apr 2006 15:36:10 -0000 1.4 +++ etk_alignment.c 12 May 2006 19:13:39 -0000 1.5 @@ -8,7 +8,7 @@ * @{ */ -enum _Etk_Alignment_Property_Id +enum Etk_Alignment_Property_Id { ETK_ALIGNMENT_XALIGN_PROPERTY, ETK_ALIGNMENT_YALIGN_PROPERTY, @@ -29,7 +29,7 @@ /** * @brief Gets the type of an Etk_Alignment - * @return Returns the type on an Etk_Alignment + * @return Returns the type of an Etk_Alignment */ Etk_Type *etk_alignment_type_get() { @@ -37,12 +37,17 @@ if (!alignment_type) { - alignment_type = etk_type_new("Etk_Alignment", ETK_BIN_TYPE, sizeof(Etk_Alignment), ETK_CONSTRUCTOR(_etk_alignment_constructor), NULL); + alignment_type = etk_type_new("Etk_Alignment", ETK_BIN_TYPE, sizeof(Etk_Alignment), + ETK_CONSTRUCTOR(_etk_alignment_constructor), NULL); - etk_type_property_add(alignment_type, "xalign", ETK_ALIGNMENT_XALIGN_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); - etk_type_property_add(alignment_type, "yalign", ETK_ALIGNMENT_YALIGN_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); - etk_type_property_add(alignment_type, "xscale", ETK_ALIGNMENT_XSCALE_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(1.0)); - etk_type_property_add(alignment_type, "yscale", ETK_ALIGNMENT_YSCALE_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(1.0)); + etk_type_property_add(alignment_type, "xalign", ETK_ALIGNMENT_XALIGN_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); + etk_type_property_add(alignment_type, "yalign", ETK_ALIGNMENT_YALIGN_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); + etk_type_property_add(alignment_type, "xscale", ETK_ALIGNMENT_XSCALE_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(1.0)); + etk_type_property_add(alignment_type, "yscale", ETK_ALIGNMENT_YSCALE_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(1.0)); alignment_type->property_set = _etk_alignment_property_set; alignment_type->property_get = _etk_alignment_property_get; @@ -61,7 +66,8 @@ */ Etk_Widget *etk_alignment_new(float xalign, float yalign, float xscale, float yscale) { - return etk_widget_new(ETK_ALIGNMENT_TYPE, "xalign", xalign, "yalign", yalign, "xscale", xscale, "yscale", yscale, NULL); + return etk_widget_new(ETK_ALIGNMENT_TYPE, "xalign", xalign, + "yalign", yalign, "xscale", xscale, "yscale", yscale, NULL); } /** @@ -133,7 +139,7 @@ * **************************/ -/* Initializes the members */ +/* Initializes the alignment */ static void _etk_alignment_constructor(Etk_Alignment *alignment) { if (!alignment) @@ -150,23 +156,25 @@ static void _etk_alignment_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) { Etk_Alignment *alignment; + float setting; if (!(alignment = ETK_ALIGNMENT(object)) || !value) return; + setting = etk_property_value_float_get(value); switch (property_id) { case ETK_ALIGNMENT_XALIGN_PROPERTY: - etk_alignment_set(alignment, etk_property_value_float_get(value), alignment->yalign, alignment->xscale, alignment->yscale); + etk_alignment_set(alignment, setting, alignment->yalign, alignment->xscale, alignment->yscale); break; case ETK_ALIGNMENT_YALIGN_PROPERTY: - etk_alignment_set(alignment, alignment->xalign, etk_property_value_float_get(value), alignment->xscale, alignment->yscale); + etk_alignment_set(alignment, alignment->xalign, setting, alignment->xscale, alignment->yscale); break; case ETK_ALIGNMENT_XSCALE_PROPERTY: - etk_alignment_set(alignment, alignment->xalign, alignment->yalign, etk_property_value_float_get(value), alignment->yscale); + etk_alignment_set(alignment, alignment->xalign, alignment->yalign, setting, alignment->yscale); break; case ETK_ALIGNMENT_YSCALE_PROPERTY: - etk_alignment_set(alignment, alignment->xalign, alignment->yalign, alignment->xscale, etk_property_value_float_get(value)); + etk_alignment_set(alignment, alignment->xalign, alignment->yalign, alignment->xscale, setting); break; default: break; @@ -200,7 +208,7 @@ } } -/* Resizes the alignment to the size allocation */ +/* Resizes the alignment to the allocated size */ static void _etk_alignment_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Alignment *alignment; @@ -240,3 +248,49 @@ } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Alignment + * + * The scale settings control how much the child should expand to fill the available space, + * from 0.0 (the child doesn't expand at all) to 1.0 (the child takes all the available space). @n + * The align settings control the alignment of the child inside the container, + * from 0.0 (the child is aligned on the left/top) to 1.0 (the child is aligned on the right/bottom). @n + * The align settings have no effect if the scale factors are set to 1.0. + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Container + * - Etk_Bin + * - Etk_Alignment + * + * \par Properties: + * @prop_name "xalign": Horizontal alignment of the child in the available space, from 0.0 (left) to 1.0 (right). + * @prop_type Float + * @prop_rw + * @prop_val 0.5 + * \par + * @prop_name "yalign": Vertical alignment of the child in the available space, from 0.0 (top) to 1.0 (bottom). + * @prop_type Float + * @prop_rw + * @prop_val 0.5 + * \par + * @prop_name "xscale": How much of the horizontal space should use the child, + * from 0.0 (none, the child does not expand) to 1.0 (the child fill all the horizontal space). + * @prop_type Float + * @prop_rw + * @prop_val 1.0 + * \par + * @prop_name "yscale": How much of the vertical space should use the child, + * from 0.0 (none, the child does not expand) to 1.0 (the child fill all the vertical space). + * @prop_type Float + * @prop_rw + * @prop_val 1.0 + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_alignment.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_alignment.h 7 Apr 2006 15:36:10 -0000 1.2 +++ etk_alignment.h 12 May 2006 19:13:39 -0000 1.3 @@ -7,21 +7,23 @@ /** * @defgroup Etk_Alignment Etk_Alignment + * @brief The Etk_Alignment widget is a container that can contain + * one child which can be aligned and scaled inside the container * @{ */ - -/** @brief Gets the type of an alignment */ + +/** Gets the type of an alignment */ #define ETK_ALIGNMENT_TYPE (etk_alignment_type_get()) -/** @brief Casts the object to an Etk_Alignment */ +/** Casts the object to an Etk_Alignment */ #define ETK_ALIGNMENT(obj) (ETK_OBJECT_CAST((obj), ETK_ALIGNMENT_TYPE, Etk_Alignment)) -/** @brief Checks if the object is an Etk_Alignment */ +/** Checks if the object is an Etk_Alignment */ #define ETK_IS_ALIGNMENT(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_ALIGNMENT_TYPE)) /** - * @struct Etk_Alignment - * @brief An Etk_Alignment is a container that can contain one child which can be aligned and scaled inside the container - */ -struct _Etk_Alignment + * @brief @widget The structure of an alignment + * @structinfo + */ +struct Etk_Alignment { /* private: */ /* Inherit from Etk_Bin */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_bin.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_bin.c 7 Apr 2006 15:36:10 -0000 1.9 +++ etk_bin.c 12 May 2006 19:13:39 -0000 1.10 @@ -1,6 +1,7 @@ /** @file etk_bin.c */ #include "etk_bin.h" #include <stdlib.h> +#include <Evas.h> #include "etk_utils.h" #include "etk_signal.h" #include "etk_signal_callback.h" @@ -10,12 +11,18 @@ * @{ */ +enum Etk_Bin_Property_Id +{ + ETK_BIN_CHILD_PROPERTY +}; + static void _etk_bin_constructor(Etk_Bin *bin); -static void _etk_bin_destructor(Etk_Bin *bin); +static void _etk_bin_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); +static void _etk_bin_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_bin_child_add(Etk_Container *container, Etk_Widget *widget); static void _etk_bin_child_remove(Etk_Container *container, Etk_Widget *widget); static Evas_List *_etk_bin_children_get(Etk_Container *container); -static void _etk_bin_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_bin_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_bin_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_bin_realize_cb(Etk_Object *object, void *data); static void _etk_bin_child_realize_cb(Etk_Object *object, void *data); @@ -28,14 +35,23 @@ /** * @brief Gets the type of an Etk_Bin - * @return Returns the type on an Etk_Bin + * @return Returns the type of an Etk_Bin */ Etk_Type *etk_bin_type_get() { static Etk_Type *bin_type = NULL; if (!bin_type) - bin_type = etk_type_new("Etk_Bin", ETK_CONTAINER_TYPE, sizeof(Etk_Bin), ETK_CONSTRUCTOR(_etk_bin_constructor), ETK_DESTRUCTOR(_etk_bin_destructor)); + { + bin_type = etk_type_new("Etk_Bin", ETK_CONTAINER_TYPE, sizeof(Etk_Bin), + ETK_CONSTRUCTOR(_etk_bin_constructor), NULL); + + etk_type_property_add(bin_type, "child", ETK_BIN_CHILD_PROPERTY, + ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); + + bin_type->property_set = _etk_bin_property_set; + bin_type->property_get = _etk_bin_property_get; + } return bin_type; } @@ -69,8 +85,8 @@ etk_signal_connect("realize", ETK_OBJECT(child), ETK_CALLBACK(_etk_bin_child_realize_cb), bin); etk_widget_parent_set(child, ETK_WIDGET(bin)); bin->child = child; - bin->child_list = evas_list_append(bin->child_list, child); + etk_object_notify(ETK_OBJECT(bin), "child"); etk_signal_emit_by_name("child_added", ETK_OBJECT(bin), NULL, child); } } @@ -81,14 +97,13 @@ * **************************/ -/* Initializes the default values of the bin */ +/* Initializes the bin */ static void _etk_bin_constructor(Etk_Bin *bin) { if (!bin) return; bin->child = NULL; - bin->child_list = NULL; ETK_CONTAINER(bin)->child_add = _etk_bin_child_add; ETK_CONTAINER(bin)->child_remove = _etk_bin_child_remove; ETK_CONTAINER(bin)->children_get = _etk_bin_children_get; @@ -98,37 +113,65 @@ etk_signal_connect("realize", ETK_OBJECT(bin), ETK_CALLBACK(_etk_bin_realize_cb), NULL); } -/* Destroys the bin */ -static void _etk_bin_destructor(Etk_Bin *bin) +/* Sets the property whose id is "property_id" to the value "value" */ +static void _etk_bin_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) { - if (!bin) + Etk_Bin *bin; + + if (!(bin = ETK_BIN(object)) || !value) return; - bin->child_list = evas_list_free(bin->child_list); + + switch (property_id) + { + case ETK_BIN_CHILD_PROPERTY: + etk_bin_child_set(bin, ETK_WIDGET(etk_property_value_pointer_get(value))); + break; + default: + break; + } +} + +/* Gets the value of the property whose id is "property_id" */ +static void _etk_bin_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value) +{ + Etk_Bin *bin; + + if (!(bin = ETK_BIN(object)) || !value) + return; + + switch (property_id) + { + case ETK_BIN_CHILD_PROPERTY: + etk_property_value_pointer_set(value, bin->child); + break; + default: + break; + } } /* Calculates the ideal size of the bin */ -static void _etk_bin_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_bin_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Bin *bin; Etk_Container *container; - if (!(bin = ETK_BIN(widget)) || !size_requisition) + if (!(bin = ETK_BIN(widget)) || !size) return; container = ETK_CONTAINER(bin); if (!bin->child || etk_widget_is_swallowed(bin->child)) { - size_requisition->w = 0; - size_requisition->h = 0; + size->w = 0; + size->h = 0; } else - etk_widget_size_request(bin->child, size_requisition); + etk_widget_size_request(bin->child, size); - size_requisition->w += 2 * etk_container_border_width_get(container); - size_requisition->h += 2 * etk_container_border_width_get(container); + size->w += 2 * etk_container_border_width_get(container); + size->h += 2 * etk_container_border_width_get(container); } -/* Resizes the bin to the size allocation */ +/* Resizes the bin to the allocated size */ static void _etk_bin_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Bin *bin; @@ -170,8 +213,8 @@ etk_signal_disconnect("realize", ETK_OBJECT(bin->child), ETK_CALLBACK(_etk_bin_child_realize_cb)); bin->child = NULL; - bin->child_list = evas_list_free(bin->child_list); + etk_object_notify(ETK_OBJECT(bin), "child"); etk_signal_emit_by_name("child_removed", ETK_OBJECT(bin), NULL, widget); } @@ -179,10 +222,16 @@ static Evas_List *_etk_bin_children_get(Etk_Container *container) { Etk_Bin *bin; + Evas_List *children; if (!(bin = ETK_BIN(container))) return NULL; - return bin->child_list; + + children = NULL; + if (bin->child) + children = evas_list_append(children, bin->child); + + return children; } /************************** @@ -216,3 +265,28 @@ } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Bin + * + * The Etk_Bin widget is mainly used as a base class for containers that only have one children + * (such as Etk_Alignment, Etk_Window, Etk_Frame...). + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Container + * - Etk_Bin + * + * \par Properties: + * @prop_name "child": The child of the bin. + * @prop_type Pointer (Etk_Widget *) + * @prop_rw + * @prop_val NULL + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_bin.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_bin.h 11 Feb 2006 00:28:32 -0000 1.4 +++ etk_bin.h 12 May 2006 19:13:39 -0000 1.5 @@ -3,33 +3,32 @@ #define _ETK_BIN_H_ #include "etk_container.h" -#include <Evas.h> #include "etk_types.h" /** * @defgroup Etk_Bin Etk_Bin + * @brief The Etk_Bin widget is a container that can contain only one child * @{ */ -/** @brief Gets the type of a bin */ +/** Gets the type of a bin */ #define ETK_BIN_TYPE (etk_bin_type_get()) -/** @brief Casts the object to an Etk_Bin */ +/** Casts the object to an Etk_Bin */ #define ETK_BIN(obj) (ETK_OBJECT_CAST((obj), ETK_BIN_TYPE, Etk_Bin)) -/** @brief Checks if the object is an Etk_Bin */ +/** Checks if the object is an Etk_Bin */ #define ETK_IS_BIN(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_BIN_TYPE)) /** - * @struct Etk_Bin - * @brief An Etk_Bin is a container that can contain only one child + * @brief @widget The structure of a bin + * @structinfo */ -struct _Etk_Bin +struct Etk_Bin { /* private: */ /* Inherit from Etk_Container */ Etk_Container container; Etk_Widget *child; - Evas_List *child_list; }; Etk_Type *etk_bin_type_get(); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_box.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_box.c 7 Apr 2006 15:36:11 -0000 1.9 +++ etk_box.c 12 May 2006 19:13:39 -0000 1.10 @@ -1,15 +1,23 @@ /** @file etk_box.c */ #include "etk_box.h" #include <stdlib.h> -#include <Evas.h> #include "etk_utils.h" /** * @addtogroup Etk_Box -* @{ + * @{ */ -enum _Etk_Box_Property_Id +typedef struct Etk_Box_Cell +{ + Etk_Widget *child; + int padding; + Etk_Bool expand; + Etk_Bool fill; + Etk_Bool pack_end; +} Etk_Box_Cell; + +enum Etk_Box_Property_Id { ETK_BOX_SPACING_PROPERTY, ETK_BOX_HOMOGENEOUS_PROPERTY @@ -24,6 +32,14 @@ static Evas_List *_etk_box_children_get(Etk_Container *container); static void _etk_box_pack_full(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding, Etk_Bool pack_end); +static void _etk_hbox_constructor(Etk_HBox *hbox); +static void _etk_hbox_size_request(Etk_Widget *widget, Etk_Size *size); +static void _etk_hbox_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); + +static void _etk_vbox_constructor(Etk_VBox *vbox); +static void _etk_vbox_size_request(Etk_Widget *widget, Etk_Size *size); +static void _etk_vbox_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); + /************************** * * Implementation @@ -32,7 +48,7 @@ /** * @brief Gets the type of an Etk_Box - * @return Returns the type on an Etk_Box + * @return Returns the type of an Etk_Box */ Etk_Type *etk_box_type_get() { @@ -40,10 +56,13 @@ if (!box_type) { - box_type = etk_type_new("Etk_Box", ETK_CONTAINER_TYPE, sizeof(Etk_Box), ETK_CONSTRUCTOR(_etk_box_constructor), ETK_DESTRUCTOR(_etk_box_destructor)); + box_type = etk_type_new("Etk_Box", ETK_CONTAINER_TYPE, sizeof(Etk_Box), + ETK_CONSTRUCTOR(_etk_box_constructor), ETK_DESTRUCTOR(_etk_box_destructor)); - etk_type_property_add(box_type, "spacing", ETK_BOX_SPACING_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(0)); - etk_type_property_add(box_type, "homogeneous", ETK_BOX_HOMOGENEOUS_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); + etk_type_property_add(box_type, "spacing", ETK_BOX_SPACING_PROPERTY, + ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(0)); + etk_type_property_add(box_type, "homogeneous", ETK_BOX_HOMOGENEOUS_PROPERTY, + ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); box_type->property_set = _etk_box_property_set; box_type->property_get = _etk_box_property_get; @@ -53,12 +72,68 @@ } /** - * @brief Adds the child at the start of the box + * @brief Gets the type of an Etk_HBox + * @return Returns the type of an Etk_HBox + */ +Etk_Type *etk_hbox_type_get() +{ + static Etk_Type *hbox_type = NULL; + + if (!hbox_type) + { + hbox_type = etk_type_new("Etk_HBox", ETK_BOX_TYPE, sizeof(Etk_HBox), + ETK_CONSTRUCTOR(_etk_hbox_constructor), NULL); + } + + return hbox_type; +} + +/** + * @brief Gets the type of an Etk_VBox + * @return Returns the type of an Etk_VBox + */ +Etk_Type *etk_vbox_type_get() +{ + static Etk_Type *vbox_type = NULL; + + if (!vbox_type) + { + vbox_type = etk_type_new("Etk_VBox", ETK_BOX_TYPE, sizeof(Etk_VBox), + ETK_CONSTRUCTOR(_etk_vbox_constructor), NULL); + } + + return vbox_type; +} + +/** + * @brief Creates a new hbox + * @param homogeneous if @a homogeneous == ETK_TRUE, all the children will have the same size + * @param spacing the amount of space between two children + */ +Etk_Widget *etk_hbox_new(Etk_Bool homogeneous, int spacing) +{ + return etk_widget_new(ETK_HBOX_TYPE, "homogeneous", homogeneous, "spacing", spacing, NULL); +} + +/** + * @brief Creates a new vbox + * @param homogeneous if @a homogeneous == ETK_TRUE, all the cells will have the same size + * @param spacing the amount of space between two cells + */ +Etk_Widget *etk_vbox_new(Etk_Bool homogeneous, int spacing) +{ + return etk_widget_new(ETK_VBOX_TYPE, "homogeneous", homogeneous, "spacing", spacing, NULL); +} + +/** + * @brief Adds the child at the start of the box. @n + * Repeated calls to etk_box_pack_start() will pack widgets from start to end + * (left to right for an Etk_HBbox, top to bottom for an Etk_VBox) * @param box a box * @param child the child to add * @param expand if @a expand == ETK_TRUE, the cell that contains the child will take all the available space - * @param fill if @a fill == ETK_TRUE, the child will take all the available space in its cell - * @param padding the size of the free space on the sides of the child + * @param fill if @a fill == ETK_TRUE, the child will fill all the available space in its cell + * @param padding the amount of free space on the two sides of the child */ void etk_box_pack_start(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding) { @@ -66,12 +141,16 @@ } /** - * @brief Adds the child at the end of the box + * @brief Adds the child at the end of the box. @n + * Repeated calls to etk_box_pack_end() will pack widgets from end to start + * (right to left for Etk_HBbox, bottom to top for Etk_VBox) * @param box a box * @param child the child to add * @param expand if @a expand == ETK_TRUE, the cell that contains the child will take all the available space - * @param fill if @a fill == ETK_TRUE, the child will take all the available space in its cell - * @param padding the size of the free space on the sides of the child + * @param fill if @a fill == ETK_TRUE, the child will fill all the available space in its cell + * @param padding the amount of free space on the two sides of the child + * @note To pack several widgets in a specific order, at the end of a box, you have to call etk_box_pack_end() in + * the reverse order */ void etk_box_pack_end(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding) { @@ -87,28 +166,30 @@ void etk_box_child_reorder(Etk_Box *box, Etk_Widget *child, int position) { Evas_List *l; + Etk_Box_Cell *cell; int i; if (!box || !child || (child->parent != ETK_WIDGET(box))) return; - position = ETK_CLAMP(0, evas_list_count(box->children) - 1, position); + position = ETK_CLAMP(0, evas_list_count(box->cells) - 1, position); - for (l = box->children, i = 0; l; l = l->next, i++) + for (l = box->cells, i = 0; l; l = l->next, i++) { - if (l->data == child) + cell = l->data; + if (cell->child == child) { if (i == position) return; else if (i < position) { - box->children = evas_list_append_relative(box->children, child, evas_list_nth(box->children, position)); - box->children = evas_list_remove_list(box->children, l); + box->cells = evas_list_append_relative(box->cells, cell, evas_list_nth(box->cells, position)); + box->cells = evas_list_remove_list(box->cells, l); } else { - box->children = evas_list_prepend_relative(box->children, child, evas_list_nth(box->children, position)); - box->children = evas_list_remove_list(box->children, l); + box->cells = evas_list_prepend_relative(box->cells, cell, evas_list_nth(box->cells, position)); + box->cells = evas_list_remove_list(box->cells, l); } return; } @@ -116,9 +197,9 @@ } /** - * @brief Sets the size of the space between two cells + * @brief Sets the amount of free space between two cells * @param box a box - * @param spacing the size of the space between two cells + * @param spacing the amount of free space between two cells */ void etk_box_spacing_set(Etk_Box *box, int spacing) { @@ -131,9 +212,9 @@ } /** - * @brief Gets the size of the space between two cells + * @brief Gets the amount of free space between two cells * @param box a box - * @return Returns the size of the space between two cells + * @return Returns the amount of free space between two cells */ int etk_box_spacing_get(Etk_Box *box) { @@ -143,9 +224,9 @@ } /** - * @brief Changes the homogenous property of the box + * @brief Sets whether or not all the cells of the box should have the same size * @param box a box - * @param homogeneous if homogeneous == ETK_TRUE, all the cells will have the same size + * @param homogeneous if @a homogeneous == ETK_TRUE, all the cells will have the same size */ void etk_box_homogeneous_set(Etk_Box *box, Etk_Bool homogeneous) { @@ -158,7 +239,7 @@ } /** - * @brief Checks if the box is homogenous + * @brief Checks whether all the cells of the box have the same size * @param box a box * @return Returns ETK_TRUE if the box is homogeneous, ETK_FALSE otherwise */ @@ -175,15 +256,20 @@ * **************************/ -/* Initializes the default values of the box */ +/************************** + * Box + **************************/ + +/* Initializes the box */ static void _etk_box_constructor(Etk_Box *box) { if (!box) return; - box->children = NULL; + box->cells = NULL; box->spacing = 0; box->homogeneous = ETK_FALSE; + box->requested_sizes = NULL; ETK_CONTAINER(box)->child_add = _etk_box_child_add; ETK_CONTAINER(box)->child_remove = _etk_box_child_remove; @@ -193,18 +279,15 @@ /* Destroys the box */ static void _etk_box_destructor(Etk_Box *box) { - Etk_Widget *child; - if (!box) return; - while (box->children) + while (box->cells) { - child = ETK_WIDGET(box->children->data); - free(child->child_properties); - child->child_properties = NULL; - box->children = evas_list_remove_list(box->children, box->children); + free(box->cells->data); + box->cells = evas_list_remove_list(box->cells, box->cells); } + free(box->requested_sizes); } /* Sets the property whose id is "property_id" to the value "value" */ @@ -249,12 +332,6 @@ } } -/************************** - * - * Callbacks and handlers - * - **************************/ - /* Adds a child to the box */ static void _etk_box_child_add(Etk_Container *container, Etk_Widget *widget) { @@ -265,25 +342,440 @@ static void _etk_box_child_remove(Etk_Container *container, Etk_Widget *widget) { Etk_Box *box; + Evas_List *l; + Etk_Box_Cell *cell; if (!(box = ETK_BOX(container)) || !widget || (widget->parent != ETK_WIDGET(container))) return; - free(widget->child_properties); - widget->child_properties = NULL; - box->children = evas_list_remove(box->children, widget); - etk_widget_parent_set_full(widget, NULL, ETK_FALSE); - etk_widget_size_recalc_queue(ETK_WIDGET(box)); + for (l = box->cells; l; l = l->next) + { + cell = l->data; + if (cell->child == widget) + { + etk_widget_parent_set_full(widget, NULL, ETK_FALSE); + free(cell); + box->cells = evas_list_remove_list(box->cells, l); + etk_widget_size_recalc_queue(ETK_WIDGET(box)); + return; + } + } } /* Gets the list of the children of the box */ static Evas_List *_etk_box_children_get(Etk_Container *container) { Etk_Box *box; + Evas_List *children, *l; + Etk_Box_Cell *cell; if (!(box = ETK_BOX(container))) return NULL; - return box->children; + + children = NULL; + for (l = box->cells; l; l = l->next) + { + cell = l->data; + children = evas_list_append(children, cell->child); + } + + return children; +} + +/************************** + * HBox + **************************/ + +/* Initializes the hbox */ +static void _etk_hbox_constructor(Etk_HBox *hbox) +{ + if (!hbox) + return; + + ETK_WIDGET(hbox)->size_request = _etk_hbox_size_request; + ETK_WIDGET(hbox)->size_allocate = _etk_hbox_size_allocate; +} + +/* Calculates the ideal size of the hbox */ +static void _etk_hbox_size_request(Etk_Widget *widget, Etk_Size *size) +{ + Evas_List *l; + Etk_HBox *hbox; + Etk_Box *box; + Etk_Container *container; + Etk_Box_Cell *cell; + Etk_Widget *child; + Etk_Size child_size; + int num_children, num_visible_children; + int i; + + if (!(hbox = ETK_HBOX(widget)) || !size) + return; + + box = ETK_BOX(hbox); + container = ETK_CONTAINER(hbox); + size->w = 0; + size->h = 0; + num_children = evas_list_count(box->cells); + num_visible_children = 0; + box->requested_sizes = realloc(box->requested_sizes, num_children * sizeof(int)); + + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + box->requested_sizes[i] = 0; + + if (!etk_widget_is_visible(child)) + continue; + + etk_widget_size_request(child, &child_size); + + if (box->homogeneous) + { + if (size->w < child_size.w + 2 * cell->padding) + size->w = child_size.w + 2 * cell->padding; + } + else + { + box->requested_sizes[i] = child_size.w + 2 * cell->padding; + size->w += box->requested_sizes[i]; + } + + if (size->h < child_size.h) + size->h = child_size.h; + + num_visible_children++; + } + if (box->homogeneous) + { + for (i = 0; i < num_children; i++) + box->requested_sizes[i] = size->w; + size->w *= num_visible_children; + } + if (num_visible_children > 1) + size->w += (num_visible_children - 1) * box->spacing; + + size->w += 2 * container->border_width; + size->h += 2 * container->border_width; +} + +/* Resizes the hbox to the allocated size */ +static void _etk_hbox_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) +{ + Evas_List *l; + Etk_HBox *hbox; + Etk_Box *box; + Etk_Container *container; + Etk_Widget *child; + Etk_Box_Cell *cell; + Etk_Size requested_size; + Etk_Size allocated_size; + Etk_Geometry child_geometry; + int num_children_to_expand = 0, i; + float start_offset, end_offset; + + if (!(hbox = ETK_HBOX(widget))) + return; + + box = ETK_BOX(hbox); + container = ETK_CONTAINER(hbox); + + _etk_hbox_size_request(widget, &requested_size); + requested_size.w -= 2 * container->border_width; + requested_size.h -= 2 * container->border_width; + allocated_size.w = geometry.w - 2 * container->border_width; + allocated_size.h = geometry.h - 2 * container->border_width; + + start_offset = container->border_width; + end_offset = container->border_width; + + if (allocated_size.w <= requested_size.w) + { + float ratio; + + ratio = (float)allocated_size.w / requested_size.w; + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + child_geometry.y = geometry.y + container->border_width; + child_geometry.w = box->requested_sizes[i] * ratio; + child_geometry.h = allocated_size.h; + + if (!cell->pack_end) + { + child_geometry.x = geometry.x + start_offset; + start_offset += child_geometry.w + box->spacing; + } + else + { + child_geometry.x = geometry.x + geometry.w - end_offset - child_geometry.w; + end_offset += child_geometry.w + box->spacing; + } + + child_geometry.x += cell->padding; + child_geometry.w -= 2 * cell->padding; + + etk_container_child_space_fill(child, &child_geometry, cell->fill, ETK_TRUE, 0.5, 0.5); + etk_widget_size_allocate(child, child_geometry); + } + } + else + { + float free_space; + + for (l = box->cells; l; l = l->next) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + if (cell->expand) + num_children_to_expand++; + } + + if (num_children_to_expand <= 0) + free_space = 0; + else + free_space = (float)(allocated_size.w - requested_size.w) / num_children_to_expand; + + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + child_geometry.y = geometry.y + container->border_width; + child_geometry.w = box->requested_sizes[i]; + if (cell->expand) + child_geometry.w += free_space; + child_geometry.h = allocated_size.h; + + if (!cell->pack_end) + { + child_geometry.x = geometry.x + start_offset; + start_offset += child_geometry.w + box->spacing; + } + else + { + child_geometry.x = geometry.x + geometry.w - end_offset - child_geometry.w; + end_offset += child_geometry.w + box->spacing; + } + + child_geometry.x += cell->padding; + child_geometry.w -= 2 * cell->padding; + + etk_container_child_space_fill(child, &child_geometry, cell->fill, ETK_TRUE, 0.5, 0.5); + etk_widget_size_allocate(child, child_geometry); + } + } +} + +/************************** + * VBox + **************************/ + +/* Initializes the vbox */ +static void _etk_vbox_constructor(Etk_VBox *vbox) +{ + if (!vbox) + return; + + ETK_WIDGET(vbox)->size_request = _etk_vbox_size_request; + ETK_WIDGET(vbox)->size_allocate = _etk_vbox_size_allocate; +} + +/* Calculates the ideal size of the vbox */ +static void _etk_vbox_size_request(Etk_Widget *widget, Etk_Size *size) +{ + Evas_List *l; + Etk_VBox *vbox; + Etk_Box *box; + Etk_Container *container; + Etk_Box_Cell *cell; + Etk_Widget *child; + Etk_Size child_size; + int num_children, num_visible_children; + int i; + + if (!(vbox = ETK_VBOX(widget)) || !size) + return; + + box = ETK_BOX(vbox); + container = ETK_CONTAINER(vbox); + size->w = 0; + size->h = 0; + num_children = evas_list_count(box->cells); + num_visible_children = 0; + box->requested_sizes = realloc(box->requested_sizes, num_children * sizeof(int)); + + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + box->requested_sizes[i] = 0; + + if (!etk_widget_is_visible(child)) + continue; + + etk_widget_size_request(child, &child_size); + + if (box->homogeneous) + { + if (size->h < child_size.h + 2 * cell->padding) + size->h = child_size.h + 2 * cell->padding; + } + else + { + box->requested_sizes[i] = child_size.h + 2 * cell->padding; + size->h += box->requested_sizes[i]; + } + + if (size->w < child_size.w) + size->w = child_size.w; + + num_visible_children++; + } + if (box->homogeneous) + { + for (i = 0; i < num_children; i++) + box->requested_sizes[i] = size->h; + size->h *= num_visible_children; + } + if (num_visible_children > 1) + size->h += (num_visible_children - 1) * box->spacing; + + size->w += 2 * container->border_width; + size->h += 2 * container->border_width; +} + +/* Resizes the vbox to the allocated size */ +static void _etk_vbox_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) +{ + Evas_List *l; + Etk_VBox *vbox; + Etk_Box *box; + Etk_Container *container; + Etk_Widget *child; + Etk_Box_Cell *cell; + Etk_Size requested_size; + Etk_Size allocated_size; + Etk_Geometry child_geometry; + int num_children_to_expand = 0, i; + float start_offset, end_offset; + + if (!(vbox = ETK_VBOX(widget))) + return; + + box = ETK_BOX(vbox); + container = ETK_CONTAINER(vbox); + + _etk_vbox_size_request(widget, &requested_size); + requested_size.w -= 2 * container->border_width; + requested_size.h -= 2 * container->border_width; + allocated_size.w = geometry.w - 2 * container->border_width; + allocated_size.h = geometry.h - 2 * container->border_width; + + start_offset = container->border_width; + end_offset = container->border_width; + + if (allocated_size.h <= requested_size.h) + { + float ratio; + + ratio = (float)allocated_size.h / requested_size.h; + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + child_geometry.x = geometry.x + container->border_width; + child_geometry.w = allocated_size.w; + child_geometry.h = box->requested_sizes[i] * ratio; + + if (!cell->pack_end) + { + child_geometry.y = geometry.y + start_offset; + start_offset += child_geometry.h + box->spacing; + } + else + { + child_geometry.y = geometry.y + geometry.h - end_offset - child_geometry.h; + end_offset += child_geometry.h + box->spacing; + } + + child_geometry.y += cell->padding; + child_geometry.h -= 2 * cell->padding; + + etk_container_child_space_fill(child, &child_geometry, ETK_TRUE, cell->fill, 0.5, 0.5); + etk_widget_size_allocate(child, child_geometry); + } + } + else + { + float free_space; + + for (l = box->cells; l; l = l->next) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + if (cell->expand) + num_children_to_expand++; + } + + if (num_children_to_expand <= 0) + free_space = 0; + else + free_space = (float)(allocated_size.h - requested_size.h) / num_children_to_expand; + + for (l = box->cells, i = 0; l; l = l->next, i++) + { + cell = l->data; + child = cell->child; + + if (!etk_widget_is_visible(child)) + continue; + + child_geometry.x = geometry.x + container->border_width; + child_geometry.w = allocated_size.w; + child_geometry.h = box->requested_sizes[i]; + if (cell->expand) + child_geometry.h += free_space; + + if (!cell->pack_end) + { + child_geometry.y = geometry.y + start_offset; + start_offset += child_geometry.h + box->spacing; + } + else + { + child_geometry.y = geometry.y + geometry.h - end_offset - child_geometry.h; + end_offset += child_geometry.h + box->spacing; + } + + child_geometry.y += cell->padding; + child_geometry.h -= 2 * cell->padding; + + etk_container_child_space_fill(child, &child_geometry, ETK_TRUE, cell->fill, 0.5, 0.5); + etk_widget_size_allocate(child, child_geometry); + } + } } /************************** @@ -296,21 +788,56 @@ * on the sides of the child and if "pack_end" == ETK_TRUE, the child will be packed at the end of the box */ static void _etk_box_pack_full(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding, Etk_Bool pack_end) { - Etk_Box_Child_Props *child_props; + Etk_Box_Cell *cell; if (!box || !child) return; - child_props = malloc(sizeof(Etk_Box_Child_Props)); - child_props->expand = expand; - child_props->fill = fill; - child_props->padding = padding; - child_props->pack_end = pack_end; - child->child_properties = child_props; - - box->children = evas_list_append(box->children, child); + cell = malloc(sizeof(Etk_Box_Cell)); + cell->expand = expand; + cell->fill = fill; + cell->padding = padding; + cell->pack_end = pack_end; + cell->child = child; + + box->cells = evas_list_append(box->cells, cell); etk_widget_parent_set(child, ETK_WIDGET(box)); } - /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Box + * + * Etk_Box is the base class for Etk_HBox and Etk_VBox: + * in an Etk_HBox, the children are packed horizontally, and in an Etk_VBox, the children are packed vertically. @n + * A child can be packed at the start of the box (left for the hbox, top for the vbox), + * or at the end of the box (right for the hbox, bottom for the vbox). @n @n + * The "homogeneous" setting controls whether or not all the children of the box should take the same amount of space. @n + * The "spacing" setting determines the amount of space between two children. + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Container + * - Etk_Box + * - Etk_HBox + * - Etk_VBox + * + * \par Properties: + * @prop_name "homogeneous": Whether or not the children of the box should take the same amount of space + * @prop_type Boolean + * @prop_rw + * @prop_val ETK_FALSE + * \par + * @prop_name "spacing": The amount of space between two children + * @prop_type Integer + * @prop_rw + * @prop_val 0 + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_box.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_box.h 7 Apr 2006 15:36:11 -0000 1.3 +++ etk_box.h 12 May 2006 19:13:39 -0000 1.4 @@ -8,34 +8,37 @@ /** * @defgroup Etk_Box Etk_Box + * @brief The Etk_Box widget is a container that can contain several children + * packed in one direction (horizontal of vertical) * @{ */ -/** @brief Gets the type of a box */ +/** Gets the type of a box */ #define ETK_BOX_TYPE (etk_box_type_get()) -/** @brief Casts the object to an Etk_Box */ +/** Casts the object to an Etk_Box */ #define ETK_BOX(obj) (ETK_OBJECT_CAST((obj), ETK_BOX_TYPE, Etk_Box)) -/** @brief Checks if the object is an Etk_Box */ +/** Checks if the object is an Etk_Box */ #define ETK_IS_BOX(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_BOX_TYPE)) -/** - * @struct Etk_Box_Child_Props - * @brief Describes how a child of the box should expand, fill (...) the allocated space - * @note You can change directly those values, but you'll then have to call @a etk_widget_size_recalc() on the bin - */ -struct _Etk_Box_Child_Props -{ - int padding; - Etk_Bool expand; - Etk_Bool fill; - Etk_Bool pack_end; -}; +/** Gets the type of a hbox */ +#define ETK_HBOX_TYPE (etk_hbox_type_get()) +/** Casts the object to an Etk_HBox */ +#define ETK_HBOX(obj) (ETK_OBJECT_CAST((obj), ETK_HBOX_TYPE, Etk_HBox)) +/** Checks if the object is an Etk_HBox */ +#define ETK_IS_HBOX(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_HBOX_TYPE)) + +/** Gets the type of a vbox */ +#define ETK_VBOX_TYPE (etk_vbox_type_get()) +/** Casts the object to an Etk_VBox */ +#define ETK_VBOX(obj) (ETK_OBJECT_CAST((obj), ETK_VBOX_TYPE, Etk_VBox)) +/** Checks if the object is an Etk_VBox */ +#define ETK_IS_VBOX(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_VBOX_TYPE)) /** - * @struct Etk_Box - * @brief An Etk_Box is a container that can contain several children packed in one direction (horizontal of vertical) + * @brief @widget The structure of a box + * @structinfo */ -struct _Etk_Box +struct Etk_Box { /* private: */ /* Inherit from Etk_Container */ @@ -43,10 +46,38 @@ int spacing; Etk_Bool homogeneous; - Evas_List *children; + Evas_List *cells; + int *requested_sizes; +}; + +/** + * @brief @widget The structure of a hbox + * @structinfo + */ +struct Etk_HBox +{ + /* private: */ + /* Inherit from Etk_Box */ + Etk_Box box; +}; + +/** + * @brief @widget The structure of a vbox + * @structinfo + */ +struct Etk_VBox +{ + /* private: */ + /* Inherit from Etk_Box */ + Etk_Box box; }; Etk_Type *etk_box_type_get(); +Etk_Type *etk_hbox_type_get(); +Etk_Type *etk_vbox_type_get(); + +Etk_Widget *etk_hbox_new(Etk_Bool homogeneous, int spacing); +Etk_Widget *etk_vbox_new(Etk_Bool homogeneous, int spacing); void etk_box_pack_start(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding); void etk_box_pack_end(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_button.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_button.c 7 Apr 2006 15:36:11 -0000 1.13 +++ etk_button.c 12 May 2006 19:13:39 -0000 1.14 @@ -2,7 +2,7 @@ #include "etk_button.h" #include <stdlib.h> #include <string.h> -#include "etk_hbox.h" +#include "etk_box.h" #include "etk_alignment.h" #include "etk_image.h" #include "etk_label.h" @@ -12,10 +12,10 @@ /** * @addtogroup Etk_Button -* @{ + * @{ */ -enum _Etk_Button_Signal_Id +enum Etk_Button_Signal_Id { ETK_BUTTON_PRESSED_SIGNAL, ETK_BUTTON_RELEASED_SIGNAL, @@ -23,7 +23,7 @@ ETK_BUTTON_NUM_SIGNALS }; -enum _Etk_Button_Property_Id +enum Etk_Button_Property_Id { ETK_BUTTON_LABEL_PROPERTY, ETK_BUTTON_IMAGE_PROPERTY, @@ -56,7 +56,7 @@ /** * @brief Gets the type of an Etk_Button - * @return Returns the type on an Etk_Button + * @return Returns the type of an Etk_Button */ Etk_Type *etk_button_type_get() { @@ -64,16 +64,24 @@ if (!button_type) { - button_type = etk_type_new("Etk_Button", ETK_BIN_TYPE, sizeof(Etk_Button), ETK_CONSTRUCTOR(_etk_button_constructor), NULL); + button_type = etk_type_new("Etk_Button", ETK_BIN_TYPE, sizeof(Etk_Button), + ETK_CONSTRUCTOR(_etk_button_constructor), NULL); - _etk_button_signals[ETK_BUTTON_PRESSED_SIGNAL] = etk_signal_new("pressed", button_type, ETK_MEMBER_OFFSET(Etk_Button, pressed), etk_marshaller_VOID__VOID, NULL, NULL); - _etk_button_signals[ETK_BUTTON_RELEASED_SIGNAL] = etk_signal_new("released", button_type, ETK_MEMBER_OFFSET(Etk_Button, released), etk_marshaller_VOID__VOID, NULL, NULL); - _etk_button_signals[ETK_BUTTON_CLICKED_SIGNAL] = etk_signal_new("clicked", button_type, ETK_MEMBER_OFFSET(Etk_Button, clicked), etk_marshaller_VOID__VOID, NULL, NULL); - - etk_type_property_add(button_type, "label", ETK_BUTTON_LABEL_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); - etk_type_property_add(button_type, "image", ETK_BUTTON_IMAGE_PROPERTY, ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); - etk_type_property_add(button_type, "xalign", ETK_BUTTON_XALIGN_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); - etk_type_property_add(button_type, "yalign", ETK_BUTTON_YALIGN_PROPERTY, ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); + _etk_button_signals[ETK_BUTTON_PRESSED_SIGNAL] = etk_signal_new("pressed", + button_type, ETK_MEMBER_OFFSET(Etk_Button, pressed), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_button_signals[ETK_BUTTON_RELEASED_SIGNAL] = etk_signal_new("released", + button_type, ETK_MEMBER_OFFSET(Etk_Button, released), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_button_signals[ETK_BUTTON_CLICKED_SIGNAL] = etk_signal_new("clicked", + button_type, ETK_MEMBER_OFFSET(Etk_Button, clicked), etk_marshaller_VOID__VOID, NULL, NULL); + + etk_type_property_add(button_type, "label", ETK_BUTTON_LABEL_PROPERTY, + ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); + etk_type_property_add(button_type, "image", ETK_BUTTON_IMAGE_PROPERTY, + ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); + etk_type_property_add(button_type, "xalign", ETK_BUTTON_XALIGN_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); + etk_type_property_add(button_type, "yalign", ETK_BUTTON_YALIGN_PROPERTY, + ETK_PROPERTY_FLOAT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_float(0.5)); button_type->property_set = _etk_button_property_set; button_type->property_get = _etk_button_property_get; @@ -88,7 +96,8 @@ */ Etk_Widget *etk_button_new() { - return etk_widget_new(ETK_BUTTON_TYPE, "theme_group", "button", "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); + return etk_widget_new(ETK_BUTTON_TYPE, "theme_group", "button", + "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); } /** @@ -97,12 +106,13 @@ */ Etk_Widget *etk_button_new_with_label(const char *label) { - return etk_widget_new(ETK_BUTTON_TYPE, "theme_group", "button", "label", label, "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); + return etk_widget_new(ETK_BUTTON_TYPE, "theme_group", "button", + "label", label, "focusable", ETK_TRUE, "focus_on_press", ETK_TRUE, NULL); } /** * @brief Creates a new button with a label and an icon defined by a stock id - * @param stock_id the stock id corresponding to the label and the icon you want + * @param stock_id the stock id corresponding to a label and an icon * @return Returns the new button widget * @see Etk_Stock */ @@ -154,9 +164,9 @@ } /** - * @brief Sets the label of the button + * @brief Sets the text of the label of the button * @param button a button - * @param label the label to set + * @param label the text to set to the label of the button */ void etk_button_label_set(Etk_Button *button, const char *label) { @@ -173,9 +183,9 @@ } /** - * @brief Gets the label of the button + * @brief Gets the text of the label of the button * @param button a button - * @return Returns the label of the button + * @return Returns the text of the label of the button */ const char *etk_button_label_get(Etk_Button *button) { @@ -239,7 +249,7 @@ } /** - * @brief Sets the alignment of the child of the button, if it's a label or an alignment + * @brief Sets the alignment of the child of the button (only have effect if the child is a label, or an alignment) * @param button a button * @param xalign the horizontal alignment (0.0 = left, 0.5 = center, 1.0 = right, ...) * @param yalign the vertical alignment (0.0 = top, 0.5 = center, 1.0 = bottom, ...) @@ -297,7 +307,7 @@ * **************************/ -/* Initializes the members */ +/* Initializes the button */ static void _etk_button_constructor(Etk_Button *button) { if (!button) @@ -567,3 +577,63 @@ } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Button + * + * @image html button.png + * An Etk_Button usually contains only a label and an icon, but it can contain any type of widgets. + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Container + * - Etk_Bin + * - Etk_Button + * + * \par Signals: + * @signal_name "pressed": Emitted when the button is pressed + * @signal_cb void callback(Etk_Button *button, void *data) + * @signal_arg button: the button which has been pressed + * @signal_data + * \par + * @signal_name "released": Emitted when the button is released + * @signal_cb void callback(Etk_Button *button, void *data) + * @signal_arg button: the button which has been released + * @signal_data + * \par + * @signal_name "clicked": Emitted when the button is clicked + * (i.e. when the button is released, and if the mouse is still above it) + * @signal_cb void callback(Etk_Button *button, void *data) + * @signal_arg button: the button which has been clicked + * @signal_data + * + * \par Properties: + * @prop_name "label": The text of the label of the button + * @prop_type String (char *) + * @prop_rw + * @prop_val NULL + * \par + * @prop_name "image": The image packed on the left of the label, inside the button + * @prop_type Pointer (Etk_Image *) + * @prop_rw + * @prop_val NULL + * \par + * @prop_name "xalign": The horizontal alignment of the child of the button, + * from 0.0 (left aligned) to 1.0 (right aligned) + * @prop_type Float + * @prop_rw + * @prop_val 0.5 + * \par + * @prop_name "yalign": The vertical alignment of the child of the button, + * from 0.0 (top aligned) to 1.0 (bottom aligned) + * @prop_type Float + * @prop_rw + * @prop_val 0.5 + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_button.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_button.h 7 Apr 2006 15:36:11 -0000 1.3 +++ etk_button.h 12 May 2006 19:13:39 -0000 1.4 @@ -8,21 +8,22 @@ /** * @defgroup Etk_Button Etk_Button + * @brief The Etk_Button widget is a widget that emits a signal when it is pressed, released and clicked * @{ */ -/** @brief Gets the type of a button */ +/** Gets the type of a button */ #define ETK_BUTTON_TYPE (etk_button_type_get()) -/** @brief Casts the object to an Etk_Button */ +/** Casts the object to an Etk_Button */ #define ETK_BUTTON(obj) (ETK_OBJECT_CAST((obj), ETK_BUTTON_TYPE, Etk_Button)) -/** @brief Checks if the object is an Etk_Button */ +/** Checks if the object is an Etk_Button */ #define ETK_IS_BUTTON(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_BUTTON_TYPE)) /** - * @struct Etk_Button - * @brief An Etk_Button is a widget that can be pressed, released, clicked... + * @brief @widget The structure of a button + * @structinfo */ -struct _Etk_Button +struct Etk_Button { /* private: */ /* Inherit from Etk_Bin */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_cache.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_cache.c 7 Apr 2006 15:36:11 -0000 1.4 +++ etk_cache.c 12 May 2006 19:13:39 -0000 1.5 @@ -10,13 +10,13 @@ * @{ */ -typedef struct _Etk_Cache_Image_Object_Item +typedef struct Etk_Cache_Image_Object_Item { char *filename; Evas_Object *image_object; } Etk_Cache_Image_Object_Item; -typedef struct _Etk_Cache_Edje_Object_Item +typedef struct Etk_Cache_Edje_Object_Item { char *filename; char *group; @@ -24,7 +24,7 @@ Evas_Object *edje_object; } Etk_Cache_Edje_Object_Item; -typedef struct _Etk_Cache_System +typedef struct Etk_Cache_System { Evas *evas; @@ -74,7 +74,7 @@ /** * @brief Sets the number of image objects from @a evas that can be stored in the cache. @n - * Do not call it manually, unless you know what you do + * Do not call it manually, unless you know what you are doing * @param evas the evas which the cache system is attached to * @param size the number of image objects from @a evas that the cache can store */ @@ -105,7 +105,7 @@ /** * @brief Sets the number of edje objects from @a evas that can be stored in the cache. @n - * Do not call it manually, unless you know what you do + * Do not call it manually, unless you know what what you are doing * @param evas the evas which the cache system is attached to * @param size the number of edje objects from @a evas that the cache can store */ @@ -135,9 +135,11 @@ } /** - * @brief Adds an image object to the cache, so it will be available for a further use. The object will be automatically hidden + * @brief Adds an image object to the cache, so it will be available for a further use. + * The object will be automatically hidden * @param image_object the image object to cache - * @note You shouldn't keep references of the image objects you cache: they can be destoyed if there is no more space in the cache + * @note You should not keep references of the image objects that you cache: + * they can be destroyed if there is not enough space in the cache */ void etk_cache_image_object_add(Evas_Object *image_object) { @@ -179,7 +181,7 @@ } /** - * @brief Removes an image object from the cache. The image object won't be deleted + * @brief Removes an image object from the cache. The image object will not be deleted * @param image_object the object to remove from the cache */ void etk_cache_image_object_remove(Evas_Object *image_object) @@ -227,6 +229,7 @@ /** * @brief Finds in the cache an image object on evas @a evas and whose filename is @a filename. @n * If an image is found, it will be removed from the cache + * @param evas the evas which the searched object should belong * @param filename the filename of the image to find * @return Returns the corresponding image object, or NULL on failure * @note The object will need to be shown @@ -259,9 +262,11 @@ } /** - * @brief Adds an edje object to the cache, so it will be available for a further use. The object will be automatically hidden + * @brief Adds an edje object to the cache, so it will be available for a further use. + * The object will be automatically hidden * @param edje_object the edje object to cache - * @note You shouldn't keep references of the edje objects you cache: they can be destoyed if there is no more space in the cache + * @note You shouldn't keep references of the edje objects that you cache: + * they could be destroyed if there is not enough space in the cache */ void etk_cache_edje_object_add(Evas_Object *edje_object) { @@ -269,11 +274,14 @@ } /** - * @brief Adds an edje objec... [truncated message content] |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:14:55
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/doc/img Added Files: bg.jpg blank.gif button.png canvas.png check_button.png combobox.png dialog.png frame.png iconbox.png image.png item.png nav_blf.png nav_bot.png nav_brt.png nav_lef.png nav_rig.png nav_tlf.png nav_top.png nav_trt.png toggle_button.png Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() |
From: Enlightenment C. <no...@cv...> - 2006-05-13 12:05:18
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/doc/img Added Files: label.png menu.png menu_bar.png Log Message: * The widgets can now change the focus order of their children. * Implementation of a correct focus order in Etk_Box |
From: Enlightenment C. <no...@cv...> - 2006-05-13 12:05:18
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_bin.h etk_box.c etk_toplevel_widget.c etk_widget.c etk_widget.h Log Message: * The widgets can now change the focus order of their children. * Implementation of a correct focus order in Etk_Box =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_bin.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_bin.h 12 May 2006 19:13:39 -0000 1.5 +++ etk_bin.h 13 May 2006 12:04:00 -0000 1.6 @@ -5,6 +5,10 @@ #include "etk_container.h" #include "etk_types.h" +/* TODO: Etk_Bin + - The "swallow" code should be included in Etk_Widget.c + */ + /** * @defgroup Etk_Bin Etk_Bin * @brief The Etk_Bin widget is a container that can contain only one child =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_box.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- etk_box.c 12 May 2006 19:13:39 -0000 1.10 +++ etk_box.c 13 May 2006 12:04:00 -0000 1.11 @@ -274,6 +274,7 @@ ETK_CONTAINER(box)->child_add = _etk_box_child_add; ETK_CONTAINER(box)->child_remove = _etk_box_child_remove; ETK_CONTAINER(box)->children_get = _etk_box_children_get; + ETK_WIDGET(box)->use_focus_order = ETK_TRUE; } /* Destroys the box */ @@ -356,6 +357,7 @@ etk_widget_parent_set_full(widget, NULL, ETK_FALSE); free(cell); box->cells = evas_list_remove_list(box->cells, l); + ETK_WIDGET(box)->focus_order = evas_list_remove(ETK_WIDGET(box)->focus_order, widget); etk_widget_size_recalc_queue(ETK_WIDGET(box)); return; } @@ -784,11 +786,13 @@ * **************************/ -/* Adds the "child" to the "box" : "expand" and "fill" describe its fill policy, "padding" is the size of the space - * on the sides of the child and if "pack_end" == ETK_TRUE, the child will be packed at the end of the box */ +/* Adds the "child" to the "box" : "expand" and "fill" describe its fill policy, "padding" is the amount of space + * on the sides of the child and. If "pack_end" == ETK_TRUE, the child will be packed at the end of the box */ static void _etk_box_pack_full(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding, Etk_Bool pack_end) { - Etk_Box_Cell *cell; + Etk_Box_Cell *cell, *last_cell; + Evas_List *l; + Etk_Widget *w; if (!box || !child) return; @@ -799,6 +803,26 @@ cell->padding = padding; cell->pack_end = pack_end; cell->child = child; + + /* Adds the child in the focus_order list, at the right place */ + last_cell = evas_list_data(evas_list_last(box->cells)); + if (!last_cell) + ETK_WIDGET(box)->focus_order = evas_list_append(ETK_WIDGET(box)->focus_order, child); + else + { + for (l = ETK_WIDGET(box)->focus_order; l; l = l->next) + { + w = ETK_WIDGET(l->data); + if (w == last_cell->child) + { + if (last_cell->pack_end) + ETK_WIDGET(box)->focus_order = evas_list_prepend_relative(ETK_WIDGET(box)->focus_order, child, l); + else + ETK_WIDGET(box)->focus_order = evas_list_append_relative(ETK_WIDGET(box)->focus_order, child, l); + break; + } + } + } box->cells = evas_list_append(box->cells, cell); etk_widget_parent_set(child, ETK_WIDGET(box)); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_toplevel_widget.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- etk_toplevel_widget.c 7 Apr 2006 15:36:11 -0000 1.14 +++ etk_toplevel_widget.c 13 May 2006 12:04:00 -0000 1.15 @@ -112,39 +112,39 @@ } /** - * @brief Gets the next widget to focus. Mainly for widget implementations + * @brief Gets the previous widget to focus. Mainly for widget implementations * @param toplevel_widget a toplevel widget - * @return Returns the next widget to focus + * @return Returns the previous widget to focus */ -Etk_Widget *etk_toplevel_widget_focused_widget_next_get(Etk_Toplevel_Widget *toplevel_widget) +Etk_Widget *etk_toplevel_widget_focused_widget_prev_get(Etk_Toplevel_Widget *toplevel_widget) { Etk_Widget *focused_parent; if (!toplevel_widget) return NULL; - if (toplevel_widget->focused_widget && (focused_parent = ETK_WIDGET(toplevel_widget->focused_widget->parent))) - return _etk_toplevel_widget_next_to_focus_get(focused_parent, toplevel_widget->focused_widget); + if (toplevel_widget->focused_widget && (focused_parent = toplevel_widget->focused_widget->parent)) + return _etk_toplevel_widget_prev_to_focus_get(focused_parent, toplevel_widget->focused_widget); else - return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(toplevel_widget), NULL); + return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(toplevel_widget), NULL); } /** - * @brief Gets the previous widget to focus. Mainly for widget implementations + * @brief Gets the next widget to focus. Mainly for widget implementations * @param toplevel_widget a toplevel widget - * @return Returns the previous widget to focus + * @return Returns the next widget to focus */ -Etk_Widget *etk_toplevel_widget_focused_widget_prev_get(Etk_Toplevel_Widget *toplevel_widget) +Etk_Widget *etk_toplevel_widget_focused_widget_next_get(Etk_Toplevel_Widget *toplevel_widget) { Etk_Widget *focused_parent; if (!toplevel_widget) return NULL; - if (toplevel_widget->focused_widget && (focused_parent = ETK_WIDGET(toplevel_widget->focused_widget->parent))) - return _etk_toplevel_widget_prev_to_focus_get(focused_parent, toplevel_widget->focused_widget); + if (toplevel_widget->focused_widget && (focused_parent = toplevel_widget->focused_widget->parent)) + return _etk_toplevel_widget_next_to_focus_get(focused_parent, toplevel_widget->focused_widget); else - return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(toplevel_widget), NULL); + return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(toplevel_widget), NULL); } /** @@ -322,47 +322,53 @@ /* Gets recursively the next widget to focus */ static Etk_Widget *_etk_toplevel_widget_next_to_focus_get(Etk_Widget *node, Etk_Widget *from) { + Evas_List *focus_order; Evas_List *l; if (!node) return NULL; if (node->focusable) return node; - if (!node->children) - return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(node->parent), node); + + focus_order = node->use_focus_order ? node->focus_order : node->children; + if (!focus_order) + return _etk_toplevel_widget_next_to_focus_get(node->parent, node); - if (from && (l = evas_list_find_list(node->children, from))) + if (from && (l = evas_list_find_list(focus_order, from))) { if (l->next) return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(l->next->data), NULL); else - return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(node->parent), node); + return _etk_toplevel_widget_next_to_focus_get(node->parent, node); } else - return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(node->children->data), NULL); + return _etk_toplevel_widget_next_to_focus_get(ETK_WIDGET(focus_order->data), NULL); } /* Gets recursively the previous widget to focus */ static Etk_Widget *_etk_toplevel_widget_prev_to_focus_get(Etk_Widget *node, Etk_Widget *from) { + Evas_List *focus_order; Evas_List *l; if (!node) return NULL; if (node->focusable) return node; - if (!node->children) - return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(node->parent), node); + + focus_order = node->use_focus_order ? node->focus_order : node->children; + if (!focus_order) + return _etk_toplevel_widget_prev_to_focus_get(node->parent, node); - if (from && (l = evas_list_find_list(node->children, from))) + if (from && (l = evas_list_find_list(focus_order, from))) { if (l->prev) return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(l->prev->data), NULL); else - return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(node->parent), node); + return _etk_toplevel_widget_prev_to_focus_get(node->parent, node); } else - return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(evas_list_data(evas_list_last(node->children))), NULL); + return _etk_toplevel_widget_prev_to_focus_get(ETK_WIDGET(evas_list_data(evas_list_last(focus_order))), NULL); } /** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -3 -r1.51 -r1.52 --- etk_widget.c 7 Apr 2006 15:36:11 -0000 1.51 +++ etk_widget.c 13 May 2006 12:04:00 -0000 1.52 @@ -1741,6 +1741,7 @@ widget->toplevel_parent = NULL; widget->child_properties = NULL; widget->children = NULL; + widget->focus_order = NULL; widget->theme_object = NULL; widget->theme_min_width = 0; @@ -1793,6 +1794,7 @@ widget->focusable = ETK_FALSE; widget->focus_on_press = ETK_FALSE; widget->can_pass_focus = ETK_TRUE; + widget->use_focus_order = ETK_FALSE; widget->has_event_object = ETK_FALSE; widget->repeat_mouse_events = ETK_FALSE; widget->pass_mouse_events = ETK_FALSE; @@ -1833,8 +1835,8 @@ etk_container_remove(ETK_CONTAINER(widget->parent), widget); etk_widget_parent_set(widget, NULL); } + evas_list_free(widget->focus_order); - /* Unref theme children/parent */ while (widget->theme_children) { ETK_WIDGET(widget->theme_children->data)->theme_parent = NULL; @@ -1843,10 +1845,9 @@ if (widget->theme_parent) widget->theme_parent->theme_children = evas_list_remove(widget->theme_parent->theme_children, widget); - /* Free what need to be freed */ + /* Remove the widget from the dnd lists */ if (widget->accepts_dnd && widget->dnd_dest) _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); - if (widget->accepts_dnd && widget->dnd_source) _etk_widget_dnd_source_widgets = evas_list_remove(_etk_widget_dnd_source_widgets, widget); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -3 -r1.28 -r1.29 --- etk_widget.h 7 Apr 2006 15:36:11 -0000 1.28 +++ etk_widget.h 13 May 2006 12:04:00 -0000 1.29 @@ -142,6 +142,7 @@ Etk_Widget *parent; void *child_properties; Evas_List *children; + Evas_List *focus_order; Evas_Object *theme_object; int theme_min_width, theme_min_height; @@ -159,9 +160,9 @@ int left_inset, right_inset, top_inset, bottom_inset; Etk_Geometry geometry; Etk_Geometry inner_geometry; - /* The size wanted by the user */ + /* The size requested by the user */ Etk_Size requested_size; - /* The result of the last etk_widget_size_request() */ + /* The result of the last call to etk_widget_size_request() */ Etk_Size last_size_requisition; void (*size_request)(Etk_Widget *widget, Etk_Size *size_requisition); void (*size_allocate)(Etk_Widget *widget, Etk_Geometry geometry); @@ -192,6 +193,7 @@ unsigned char focusable : 1; unsigned char focus_on_press : 1; unsigned char can_pass_focus : 1; + unsigned char use_focus_order : 1; unsigned char need_size_recalc : 1; unsigned char need_redraw : 1; unsigned char need_theme_min_size_recalc : 1; |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:22
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/icons/default/icons/16x16/actions Modified Files: dialog-ok.png dialog-yes.png Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/data/icons/default/icons/16x16/actions/dialog-ok.png,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvsf0yaUB and /tmp/cvssylwJb differ =================================================================== RCS file: /cvs/e/e17/proto/etk/data/icons/default/icons/16x16/actions/dialog-yes.png,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvsEmUnSC and /tmp/cvsGmTeJc differ |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:22
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk Modified Files: Doxyfile TODO gendoc Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/Doxyfile,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- Doxyfile 1 Oct 2005 16:29:44 -0000 1.1 +++ Doxyfile 12 May 2006 19:13:38 -0000 1.2 @@ -18,7 +18,7 @@ GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO -DISABLE_INDEX = NO +DISABLE_INDEX = YES EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO @@ -28,7 +28,7 @@ HIDE_FRIEND_COMPOUNDS = YES BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO +ALWAYS_DETAILED_SEC = YES INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = @@ -41,22 +41,34 @@ SHOW_INCLUDE_FILES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO +DETAILS_AT_TOP = YES INHERIT_DOCS = YES INLINE_INFO = YES -SORT_MEMBER_DOCS = YES +SORT_MEMBER_DOCS = NO DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 2 +TAB_SIZE = 3 GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES -ALIASES = +ALIASES = "widget=<b>[Widget]</b>" +ALIASES += "structinfo=@note For more informations, see the documention page of the corresponding module (link above or in the <i>\"Widgets\"</i> page)" +ALIASES += "prop_name=- @b" +ALIASES += "prop_type= - <tt>Type:</tt>" +ALIASES += "prop_rw= - <tt>Access:</tt> Read/Write" +ALIASES += "prop_ro= - <tt>Access:</tt> Read Only" +ALIASES += "prop_wo= - <tt>Access:</tt> Write Only" +ALIASES += "prop_na= - <tt>Access:</tt> No Access" +ALIASES += "prop_val= - <tt>Default Value:</tt>" +ALIASES += "signal_name=- @b" +ALIASES += "signal_cb= - <tt>Callback:</tt>" +ALIASES += "signal_arg= - @c" +ALIASES += "signal_data= - @c data: the user data set when the callback has been connected to the signal" ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO -SHOW_USED_FILES = NO +SHOW_USED_FILES = YES QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES @@ -78,10 +90,10 @@ REFERENCES_RELATION = YES ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 2 -IGNORE_PREFIX = +IGNORE_PREFIX = "Etk_" GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 -GENERATE_LATEX = YES +GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex @@ -98,11 +110,11 @@ RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -GENERATE_MAN = YES +GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = YES -GENERATE_XML = YES +GENERATE_XML = NO XML_SCHEMA = XML_DTD = GENERATE_AUTOGEN_DEF = NO =================================================================== RCS file: /cvs/e/e17/proto/etk/TODO,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- TODO 7 Apr 2006 15:36:08 -0000 1.10 +++ TODO 12 May 2006 19:13:38 -0000 1.11 @@ -13,14 +13,12 @@ * The labels sometimes does not returns its ideal size requisition (happens when there is a <br>) Maybe a bug of the evas textblock * Fix and optimize the colorpicker -* Sometimes, the mouse cursor is not reset when you stop resizing a row in the tree (and also segv) -------------------- [Things that need to be improved (in order of pripority)] -------------------- * Improve the entry: add selection supports, better keyboard navigation [In progress: MoOm] -* Add a cache system to cache images used by the tree and the future iconbox in order to make -the scrolling smoother [In progress: MoOm] +* Implement the cache system in the tree [In progress: MoOm] * Allow the theme to change the color/font/style of the labels * More API work for the tree (get a row according to (x,y) position...) * The filechooser still need to be finished/rewritten [In progress: MoOm] =================================================================== RCS file: /cvs/e/e17/proto/etk/gendoc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- gendoc 1 Oct 2005 16:29:44 -0000 1.1 +++ gendoc 12 May 2006 19:13:38 -0000 1.2 @@ -3,6 +3,8 @@ mkdir -p doc/html doc/man doc/latex doxygen cp doc/img/*.png doc/html/ +cp doc/img/*.jpg doc/html/ +cp doc/img/*.gif doc/html/ rm -f etk_docs.tar etk_docs.tar.gz tar -cvf etk_docs.tar doc/html doc/man doc/latex gzip -9 etk_docs.tar |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:22
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/icons/default/icons/22x22/actions Modified Files: dialog-ok.png dialog-yes.png Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/data/icons/default/icons/22x22/actions/dialog-ok.png,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvsvRZZoJ and /tmp/cvscezOpj differ =================================================================== RCS file: /cvs/e/e17/proto/etk/data/icons/default/icons/22x22/actions/dialog-yes.png,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvsYMNqcK and /tmp/cvsoRGJek differ |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:23
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/doc Modified Files: etk.css foot.html head.html Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/doc/etk.css,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- etk.css 1 Oct 2005 16:29:44 -0000 1.1 +++ etk.css 12 May 2006 19:13:38 -0000 1.2 @@ -1,3 +1,30 @@ +BODY { + background : url("bg.jpg"); + background-repeat : repeat-x; + background-position : top left; + background-color : #b2a5b0; + padding-top : 0px; + padding-bottom : 0px; + padding-left : 0px; + padding-right : 0px; + margin-right: 20px; + margin-left: 20px; +} + +td.bx1[class] { background-image:url("nav_tlf.png"); } +td.bx2[class] { background-image:url("nav_top.png"); } +td.bx3[class] { background-image:url("nav_trt.png"); } +td.bx4[class] { background-image:url("nav_lef.png"); } +td.bx5 { + background : #fff; + text-align : left; + vertical-align : middle; +} +td.bx6[class] { background-image:url("nav_rig.png"); } +td.bx7[class] { background-image:url("nav_blf.png"); } +td.bx8[class] { background-image:url("nav_bot.png"); } +td.bx9[class] { background-image:url("nav_brt.png"); } + BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { font-family: Geneva, Arial, Helvetica, sans-serif; } @@ -17,7 +44,7 @@ CAPTION { font-weight: bold } DIV.qindex { width: 100%; - background-color: #eeeeff; + background-color: #eeeeee; border: 1px solid #b0b0b0; text-align: center; margin: 2px; @@ -26,7 +53,7 @@ } DIV.nav { width: 100%; - background-color: #eeeeff; + background-color: #eeeeee; border: 1px solid #b0b0b0; text-align: center; margin: 2px; @@ -34,7 +61,7 @@ line-height: 140%; } DIV.navtab { - background-color: #eeeeff; + background-color: #eeeeee; border: 1px solid #b0b0b0; text-align: center; margin: 2px; @@ -47,37 +74,37 @@ A.qindex { text-decoration: none; font-weight: bold; - color: #1A419D; + color: #444444; } A.qindex:visited { text-decoration: none; font-weight: bold; - color: #1A419D + color: #333333 } A.qindex:hover { text-decoration: none; - background-color: #ddddff; + background-color: #dddddd; } A.qindexHL { text-decoration: none; font-weight: bold; - background-color: #6666cc; + background-color: #666666; color: #ffffff; border: 1px double #9295C2; } A.qindexHL:hover { text-decoration: none; - background-color: #6666cc; + background-color: #666666; color: #ffffff; } -A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.qindexHL:visited { text-decoration: none; background-color: #666666; color: #ffffff } A.el { text-decoration: none; font-weight: bold } A.elRef { font-weight: bold } -A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} -A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} -A.codeRef:link { font-weight: normal; color: #0000FF} -A.codeRef:visited { font-weight: normal; color: #0000FF} -A:hover { text-decoration: none; background-color: #f2f2ff } +A.code:link { text-decoration: underline; font-weight: normal; color: #000000 } +A.code:visited { text-decoration: underline; font-weight: normal; color: #000000 } +A.codeRef:link { text-decoration: underline; font-weight: normal; color: #000000 } +A.codeRef:visited { text-decoration: underline; font-weight: normal; color: #000000 } +A:hover { text-decoration: none; background-color: #f2f2f2 } DL.el { margin-left: -1cm } .fragment { font-family: Fixed, monospace; @@ -96,14 +123,14 @@ padding-bottom: 4px; } DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } -TD.md { background-color: #F4F4FB; font-weight: bold; } +TD.md { background-color: #F4F4F4; font-weight: bold; } TD.mdPrefix { - background-color: #F4F4FB; + background-color: #F4F4F4; color: #606060; font-size: 80%; } -TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } -TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } +TD.mdname1 { background-color: #F4F4F4; font-weight: bold; color: #602020; } +TD.mdname { background-color: #F4F4F4; font-weight: bold; color: #602020; width: 600px; } DIV.groupHeader { margin-left: 16px; margin-top: 12px; @@ -111,14 +138,8 @@ font-weight: bold; } DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } -BODY { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} TD.indexkey { - background-color: #eeeeff; + background-color: #eeeeee; font-weight: bold; padding-right : 10px; padding-top : 2px; @@ -131,7 +152,7 @@ border: 1px solid #CCCCCC; } TD.indexvalue { - background-color: #eeeeff; + background-color: #eeeeee; font-style: italic; padding-right : 10px; padding-top : 2px; @@ -158,7 +179,7 @@ SPAN.charliteral { color: #008080 } .mdTable { border: 1px solid #868686; - background-color: #F4F4FB; + background-color: #F4F4F4; } .mdRow { padding: 8px 10px; @@ -286,21 +307,21 @@ INPUT.search { font-size: 75%; color: #000080; font-weight: normal; - background-color: #eeeeff; + background-color: #eeeeee; } TD.tiny { font-size: 75%; } a { - color: #252E78; + color: #525252; } a:visited { - color: #3D2185; + color: #525252; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #b0b0b0; } -TH.dirtab { background: #eeeeff; +TH.dirtab { background: #eeeeee; font-weight: bold; } HR { height: 1px; =================================================================== RCS file: /cvs/e/e17/proto/etk/doc/foot.html,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- foot.html 1 Oct 2005 16:29:44 -0000 1.1 +++ foot.html 12 May 2006 19:13:38 -0000 1.2 @@ -1,2 +1,12 @@ +</td> +<td class="bx6" height="*"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr><tr> +<td class="bx7"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx8" width="*"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx9"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr> +</table> +</center></td></tr></table> + </body> </html> =================================================================== RCS file: /cvs/e/e17/proto/etk/doc/head.html,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- head.html 1 Oct 2005 16:29:44 -0000 1.1 +++ head.html 12 May 2006 19:13:38 -0000 1.2 @@ -1,19 +1,63 @@ <html> <head> - <title>$title</title> <link href=etk.css rel=stylesheet type=text/css> - </head> <body> -<div class=nav> -<table border=0 align=center><tr> -<td width=16><img src=etk_mini.png width=16 height=16 alt=E></td> -<td width=100% align=center> -E : T : K +<table border=0 cellpadding=0 cellspacing=0 width=100%> + +<tr><td class="nav"><center> +<table border=0 cellpadding=0 cellspacing=0> +<tr> +<td class="bx1"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx2" width="*"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx3"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr><tr> +<td class="bx4" height="*"><img src="blank.gif" width=20 height=20 alt=""></td> + +<td class="bx5" height="*"> +<center> +<table border=0 cellpadding=0 cellspacing=0> +<tr><td><table class="menu"><tr> + + <td width=16><img src="etk_mini.png" width=16 height=16 alt="Etk" border=0></td> + <td width="*" align=center><table class='menu2'><tr> + <td class='nav_img'><img src='item.png' width=10 height=10 alt='' border=0></td> + <td class='nav_text'><a class="qindex" href='index.html'>Main Page</a></td> + <td class='nav_img'><img src='item.png' width=10 height=10 alt='' border=0></td> + <td class='nav_text'><a class="qindex" href='modules.html'>Widgets</a></td> + <td class='nav_img'><img src='item.png' width=10 height=10 alt='' border=0></td> + <td class='nav_text'><a class="qindex" href='annotated.html'>Data Structures</a></td> + <td class='nav_img'><img src='item.png' width=10 height=10 alt='' border=0></td> + <td class='nav_text'><a class="qindex" href='classes.html'>Index</a></td> + </tr></table></td> + <td width=16><img src="etk_mini.png" width=16 height=16 alt="Etk" border=0></td> + +</tr></table></td></tr> +</table> +</center> </td> -<td width=16><img src=etk_mini.png width=16 height=16 alt=E></td> -</tr></table> -</div> + +<td class="bx6" height="*"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr><tr> +<td class="bx7"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx8" width="*"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx9"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr> +</table> +</center></td></tr> + + + +<tr><td class="nav"><center> +<table border=0 cellpadding=0 cellspacing=0 width=100%> +<tr> +<td class="bx1"><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx2" width=100%><img src="blank.gif" width=20 height=20 alt=""></td> +<td class="bx3"><img src="blank.gif" width=20 height=20 alt=""></td> +</tr><tr> +<td class="bx4" height="*"><img src="blank.gif" width=20 height=20 alt=""></td> + +<td class="bx5" height="*"> |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:23
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_test.c Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/src/bin/etk_test.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- etk_test.c 7 Apr 2006 15:36:10 -0000 1.19 +++ etk_test.c 12 May 2006 19:13:39 -0000 1.20 @@ -125,7 +125,7 @@ if (!etk_init()) { fprintf(stderr, "Could not init etk. Exiting...\n"); - return 0; + return 1; }; etk_tooltips_enable(); @@ -133,7 +133,7 @@ etk_main(); etk_shutdown(); - return 1; + return 0; } /* Creates the main window */ |
From: Enlightenment C. <no...@cv...> - 2006-05-12 19:15:25
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/images Modified Files: frame_outline.png Log Message: * Full "rereading" and documentation of the following files: - etk_alignment.c/h - etk_bin.c/h - etk_box.c/h - etk_button.c/h - etk_cache.c/h - etk_canvas.c/h - etk_combobox.c/h - etk_container.c/h - etk_dialog.c/h - etk_frame.c/h - etk_iconbox.c/h - etk_image.c/h - etk_label.c/h - etk_main.c/h - etk_marshallers.c/h The signals and the properties of these files are now fully documented. The html doc also looks like the other e-related sites. Several small bugs have been also fixed, though I don't remember which ones exactly. Most important ones are: - Child padding is now taken in account by the boxes - Implementation of etk_canvas_object_remove() =================================================================== RCS file: /cvs/e/e17/proto/etk/data/themes/default/images/frame_outline.png,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 Binary files /tmp/cvskqYhbM and /tmp/cvsEJuGgm differ |
From: Enlightenment C. <no...@cv...> - 2006-05-13 21:47:41
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_scrolled_view.c Log Message: * Show the viewport created by etk_scrolled_view_add_with_viewport() =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_scrolled_view.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- etk_scrolled_view.c 7 Apr 2006 15:36:11 -0000 1.15 +++ etk_scrolled_view.c 13 May 2006 21:46:24 -0000 1.16 @@ -110,6 +110,9 @@ else { viewport = etk_viewport_new(); + etk_widget_visibity_locked_set(viewport, ETK_TRUE); + etk_widget_show(viewport, ETK_TRUE); + etk_container_add(ETK_CONTAINER(scrolled_view), viewport); } |
From: Enlightenment C. <no...@cv...> - 2006-05-13 22:08:44
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_scrolled_view.c Log Message: * Make it compile actually! =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_scrolled_view.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- etk_scrolled_view.c 13 May 2006 21:46:24 -0000 1.16 +++ etk_scrolled_view.c 13 May 2006 22:07:27 -0000 1.17 @@ -110,8 +110,8 @@ else { viewport = etk_viewport_new(); - etk_widget_visibity_locked_set(viewport, ETK_TRUE); - etk_widget_show(viewport, ETK_TRUE); + etk_widget_visibility_locked_set(viewport, ETK_TRUE); + etk_widget_show(viewport); etk_container_add(ETK_CONTAINER(scrolled_view), viewport); } |
From: Enlightenment C. <no...@cv...> - 2006-05-13 23:45:57
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_alignment.c etk_box.c etk_box.h etk_button.h etk_canvas.c etk_combobox.c etk_combobox.h Log Message: * [Etk_Box]Remove etk_box_child_reorder() because the position number doesn't really make sense in a box. If you want to reorder the children, you can just repack them * [Etk_Box]Implementation of etk_box_child_packing_set/get() to set/get the packing settings of a child of a box * [Etk_Box]Fix the focus order * [Etk_Combobox] Add etk_combobox_item_prepend/append_relative to the API, to add an item before/aftern an existing item * [Etk_Combobox] The item height can now be defined by the theme. And also by the user with etk_combobox_item_height_set() * Formatting and English fixes =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_alignment.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_alignment.c 12 May 2006 19:13:39 -0000 1.5 +++ etk_alignment.c 13 May 2006 23:44:40 -0000 1.6 @@ -214,7 +214,7 @@ Etk_Alignment *alignment; Etk_Widget *child; Etk_Container *container; - Etk_Size child_requisition; + Etk_Size child_size; if (!(alignment = ETK_ALIGNMENT(widget))) return; @@ -223,24 +223,24 @@ if ((child = etk_bin_child_get(ETK_BIN(alignment)))) { - etk_widget_size_request(child, &child_requisition); + etk_widget_size_request(child, &child_size); geometry.x += etk_container_border_width_get(container); geometry.y += etk_container_border_width_get(container); geometry.w -= 2 * etk_container_border_width_get(container); geometry.h -= 2 * etk_container_border_width_get(container); - if (geometry.w > child_requisition.w) + if (geometry.w > child_size.w) { - child_requisition.w += alignment->xscale * (geometry.w - child_requisition.w); - geometry.x += alignment->xalign * (geometry.w - child_requisition.w); - geometry.w = child_requisition.w; + child_size.w += alignment->xscale * (geometry.w - child_size.w); + geometry.x += alignment->xalign * (geometry.w - child_size.w); + geometry.w = child_size.w; } - if (geometry.h > child_requisition.h) + if (geometry.h > child_size.h) { - child_requisition.h += alignment->yscale * (geometry.h - child_requisition.h); - geometry.y += alignment->yalign * (geometry.h - child_requisition.h); - geometry.h = child_requisition.h; + child_size.h += alignment->yscale * (geometry.h - child_size.h); + geometry.y += alignment->yalign * (geometry.h - child_size.h); + geometry.h = child_size.h; } etk_widget_size_allocate(child, geometry); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_box.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- etk_box.c 13 May 2006 12:04:00 -0000 1.11 +++ etk_box.c 13 May 2006 23:44:40 -0000 1.12 @@ -158,42 +158,85 @@ } /** - * @brief Moves the child to a new position in the box + * @brief Sets the packing settings of a child of the box * @param box a box - * @param child the child to move - * @param position the new position of the child - */ -void etk_box_child_reorder(Etk_Box *box, Etk_Widget *child, int position) + * @param child a child of the box. If @a child is not packed in the box, this function has no effect + * @param padding the padding to set to the child. See etk_box_pack_start() for more information + * @param expand the expand setting to set to the child. See etk_box_pack_start() for more information + * @param fill the fill setting to set to the child. See etk_box_pack_start() for more information + * @param pack_end whether or not the child is packed at the end of the box. + * See etk_box_pack_start() for more information + * @see etk_box_pack_start() + */ +void etk_box_child_packing_set(Etk_Box *box, Etk_Widget *child, int padding, Etk_Bool expand, Etk_Bool fill, Etk_Bool pack_end) { Evas_List *l; Etk_Box_Cell *cell; - int i; - - if (!box || !child || (child->parent != ETK_WIDGET(box))) + + if (!box || !child) return; + + for (l = box->cells; l; l = l->next) + { + cell = l->data; + + if (cell->child == child) + { + cell->padding = padding; + cell->expand = expand; + cell->fill = fill; + cell->pack_end = pack_end; + etk_widget_size_recalc_queue(ETK_WIDGET(box)); + return; + } + } +} - position = ETK_CLAMP(0, evas_list_count(box->cells) - 1, position); - - for (l = box->cells, i = 0; l; l = l->next, i++) +/** + * @brief Gets the packing settings of a child of the box + * @param box a box + * @param child a child of the box. It has to be packed in the box. + * @param padding the location to store the padding of the child. See etk_box_pack_start() for more information + * @param expand the location to store the expand setting of the child. See etk_box_pack_start() for more information + * @param fill the location to store the fill setting of the child. See etk_box_pack_start() for more information + * @param pack_end the location to store whether or not the child is packed at the end of the box. + * See etk_box_pack_start() for more information + * @see etk_box_pack_start() + */ +void etk_box_child_packing_get(Etk_Box *box, Etk_Widget *child, int *padding, Etk_Bool *expand, Etk_Bool *fill, Etk_Bool *pack_end) +{ + Evas_List *l; + Etk_Box_Cell *cell; + + if (!box || !child) + return; + + for (l = box->cells; l; l = l->next) { cell = l->data; + if (cell->child == child) { - if (i == position) - return; - else if (i < position) - { - box->cells = evas_list_append_relative(box->cells, cell, evas_list_nth(box->cells, position)); - box->cells = evas_list_remove_list(box->cells, l); - } - else - { - box->cells = evas_list_prepend_relative(box->cells, cell, evas_list_nth(box->cells, position)); - box->cells = evas_list_remove_list(box->cells, l); - } + if (padding) + *padding = cell->padding; + if (expand) + *expand = cell->expand; + if (fill) + *fill = cell->fill; + if (pack_end) + *pack_end = cell->pack_end; return; } } + + if (padding) + *padding = 0; + if (expand) + *expand = ETK_FALSE; + if (fill) + *fill = ETK_FALSE; + if (pack_end) + *pack_end = ETK_FALSE; } /** @@ -791,8 +834,6 @@ static void _etk_box_pack_full(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding, Etk_Bool pack_end) { Etk_Box_Cell *cell, *last_cell; - Evas_List *l; - Etk_Widget *w; if (!box || !child) return; @@ -806,22 +847,14 @@ /* Adds the child in the focus_order list, at the right place */ last_cell = evas_list_data(evas_list_last(box->cells)); - if (!last_cell) + if (!last_cell || !evas_list_find(ETK_WIDGET(box)->focus_order, last_cell->child)) ETK_WIDGET(box)->focus_order = evas_list_append(ETK_WIDGET(box)->focus_order, child); else { - for (l = ETK_WIDGET(box)->focus_order; l; l = l->next) - { - w = ETK_WIDGET(l->data); - if (w == last_cell->child) - { - if (last_cell->pack_end) - ETK_WIDGET(box)->focus_order = evas_list_prepend_relative(ETK_WIDGET(box)->focus_order, child, l); - else - ETK_WIDGET(box)->focus_order = evas_list_append_relative(ETK_WIDGET(box)->focus_order, child, l); - break; - } - } + if (last_cell->pack_end) + ETK_WIDGET(box)->focus_order = evas_list_prepend_relative(ETK_WIDGET(box)->focus_order, child, last_cell->child); + else + ETK_WIDGET(box)->focus_order = evas_list_append_relative(ETK_WIDGET(box)->focus_order, child, last_cell->child); } box->cells = evas_list_append(box->cells, cell); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_box.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_box.h 12 May 2006 19:13:39 -0000 1.4 +++ etk_box.h 13 May 2006 23:44:40 -0000 1.5 @@ -81,11 +81,11 @@ void etk_box_pack_start(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding); void etk_box_pack_end(Etk_Box *box, Etk_Widget *child, Etk_Bool expand, Etk_Bool fill, int padding); -void etk_box_child_reorder(Etk_Box *box, Etk_Widget *child, int position); +void etk_box_child_packing_set(Etk_Box *box, Etk_Widget *child, int padding, Etk_Bool expand, Etk_Bool fill, Etk_Bool pack_end); +void etk_box_child_packing_get(Etk_Box *box, Etk_Widget *child, int *padding, Etk_Bool *expand, Etk_Bool *fill, Etk_Bool *pack_end); void etk_box_spacing_set(Etk_Box *box, int spacing); int etk_box_spacing_get(Etk_Box *box); - void etk_box_homogeneous_set(Etk_Box *box, Etk_Bool homogeneous); Etk_Bool etk_box_homogeneous_get(Etk_Box *box); =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_button.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_button.h 12 May 2006 19:13:39 -0000 1.4 +++ etk_button.h 13 May 2006 23:44:40 -0000 1.5 @@ -6,6 +6,10 @@ #include "etk_types.h" #include "etk_stock.h" +/* TODO/FIXME list: + * - For some reasons, sometimes the child is not "swallowed" (see Extrackt's combobox) + */ + /** * @defgroup Etk_Button Etk_Button * @brief The Etk_Button widget is a widget that emits a signal when it is pressed, released and clicked =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_canvas.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_canvas.c 12 May 2006 19:13:39 -0000 1.9 +++ etk_canvas.c 13 May 2006 23:44:40 -0000 1.10 @@ -55,7 +55,7 @@ * (probably because the canvas and the object do not belong to the same evas) * @note The object will be automatically deleted when the canvas is destroyed * @warning The object position remains relative to the window, and not to the canvas itself - * (See the detailed description Etk_Canvas, at the top of this page, for more informations) + * (See the detailed description Etk_Canvas, at the top of this page, for more information) */ Etk_Bool etk_canvas_object_add(Etk_Canvas *canvas, Evas_Object *object) { =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- etk_combobox.c 12 May 2006 19:13:39 -0000 1.10 +++ etk_combobox.c 13 May 2006 23:44:40 -0000 1.11 @@ -11,19 +11,22 @@ #include "etk_signal.h" #include "etk_signal_callback.h" +#define ETK_COMBOBOX_DEFAULT_ITEM_HEIGHT 24 + /** * @addtogroup Etk_Combobox * @{ */ -enum _Etk_Combobox_Signal_Id +enum Etk_Combobox_Signal_Id { ETK_COMBOBOX_ACTIVE_ITEM_CHANGED_SIGNAL, ETK_COMBOBOX_NUM_SIGNALS }; -enum _Etk_Combobox_Property_Id +enum Etk_Combobox_Property_Id { + ETK_COMBOBOX_ITEM_HEIGHT_PROPERTY, ETK_COMBOBOX_ACTIVE_ITEM_PROPERTY }; @@ -32,15 +35,16 @@ static void _etk_combobox_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_combobox_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_combobox_item_destructor(Etk_Combobox_Item *item); -static void _etk_combobox_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_combobox_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_combobox_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); -static void _etk_combobox_window_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_combobox_window_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_combobox_window_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_combobox_item_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); -static void _etk_combobox_active_item_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_combobox_active_item_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_combobox_active_item_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_combobox_focus_handler(Etk_Widget *widget); static void _etk_combobox_unfocus_handler(Etk_Widget *widget); +static void _etk_combobox_realize_cb(Etk_Object *object, void *data); static void _etk_combobox_key_down_cb(Etk_Object *object, void *event_info, void *data); static void _etk_combobox_button_toggled_cb(Etk_Object *object, void *data); static void _etk_combobox_window_popped_down_cb(Etk_Object *object, void *data); @@ -75,6 +79,8 @@ _etk_combobox_signals[ETK_COMBOBOX_ACTIVE_ITEM_CHANGED_SIGNAL] = etk_signal_new("active_item_changed", combobox_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); + etk_type_property_add(combobox_type, "item_height", ETK_COMBOBOX_ITEM_HEIGHT_PROPERTY, + ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_COMBOBOX_DEFAULT_ITEM_HEIGHT)); etk_type_property_add(combobox_type, "active_item", ETK_COMBOBOX_ACTIVE_ITEM_PROPERTY, ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); @@ -128,6 +134,47 @@ } /** + * @brief Set the height of the combobox's items. By default, it uses the height defined by the theme + * @param combobox a combobox + * @param item_height the height to set to the items of the combobox. + * If @a item_height <= 0, the default height defined by the theme will be used + */ +void etk_combobox_item_height_set(Etk_Combobox *combobox, int item_height) +{ + if (!combobox) + return; + + if (item_height > 0) + { + combobox->item_height = item_height; + combobox->item_height_set = ETK_TRUE; + etk_object_notify(ETK_OBJECT(combobox), "item_height"); + } + else if (combobox->item_height_set) + { + if (etk_widget_theme_object_data_get(ETK_WIDGET(combobox), "item_height", "%d", &combobox->item_height) != 1 || + combobox->item_height <= 0) + { + combobox->item_height = ETK_COMBOBOX_DEFAULT_ITEM_HEIGHT; + } + combobox->item_height_set = ETK_FALSE; + etk_object_notify(ETK_OBJECT(combobox), "item_height"); + } +} + +/** + * @brief Gets the height of the combobox's items + * @param combobox a combobox + * @return Returns the height of the combobox's items + */ +int etk_combobox_item_height_get(Etk_Combobox *combobox) +{ + if (!combobox) + return 0; + return combobox->item_height; +} + +/** * @brief Adds a column to the combobox. The combobox should not be already be built * @param combobox a combobox * @param col_type the type of widget that will be packed in the column @@ -299,7 +346,7 @@ * If the type of a column is ETK_COMBOBOX_IMAGE, the argument must be an "Etk_Image *" @n * If the type of a column is ETK_COMBOBOX_OTHER, the argument must be an "Etk_Widget *" * @return Returns the new item - * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() on it. + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() */ Etk_Combobox_Item *etk_combobox_item_prepend(Etk_Combobox *combobox, ...) { @@ -320,9 +367,9 @@ * @brief Prepends a new item to the combobox * @param combobox a combobox * @param args the different widgets to attach to the columns of the item. - * See: etk_combobox_item_prepend()'s ... argument for more informations + * See etk_combobox_item_prepend()'s "..." argument for more information * @return Returns the new item - * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() on it. + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() * @see etk_combobox_item_prepend */ Etk_Combobox_Item *etk_combobox_item_prepend_valist(Etk_Combobox *combobox, va_list args) @@ -347,9 +394,9 @@ * @brief Appends a new item to the combobox * @param combobox a combobox * @param ... the different widgets to attach to the columns of the item. - * See: etk_combobox_item_prepend()'s ... argument for more informations + * See etk_combobox_item_prepend()'s "..." argument for more information * @return Returns the new item - * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() on it. + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() * @see etk_combobox_item_prepend */ Etk_Combobox_Item *etk_combobox_item_append(Etk_Combobox *combobox, ...) @@ -371,9 +418,9 @@ * @brief Appends a new item to the combobox * @param combobox a combobox * @param args the different widgets to attach to the columns of the item. - * See: etk_combobox_item_prepend()'s ... argument for more informations + * See etk_combobox_item_prepend()'s "..." argument for more information * @return Returns the new item - * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() on it. + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() * @see etk_combobox_item_prepend */ Etk_Combobox_Item *etk_combobox_item_append_valist(Etk_Combobox *combobox, va_list args) @@ -395,6 +442,116 @@ } /** + * @brief Adds a new item to the combobox, before an existing item + * @param combobox a combobox + * @param relative the item before which the new item will be added. + * If @a relative is not in the combobox, the new item is prepended to the start of the combobox + * @param ... the different widgets to attach to the columns of the item. + * See etk_combobox_item_prepend()'s "..." argument for more information + * @return Returns the new item + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() + * @see etk_combobox_item_prepend + */ +Etk_Combobox_Item *etk_combobox_item_prepend_relative(Etk_Combobox *combobox, Etk_Combobox_Item *relative, ...) +{ + Etk_Combobox_Item *item; + va_list args; + + if (!combobox) + return NULL; + + va_start(args, relative); + item = etk_combobox_item_prepend_relative_valist(combobox, relative, args); + va_end(args); + + return item; +} + +/** + * @brief Adds a new item to the combobox, before an existing item + * @param combobox a combobox + * @param relative the item before which the new item will be added. + * If @a relative is not in the combobox, the new item is prepended to the start of the combobox + * @param args the different widgets to attach to the columns of the item. + * See etk_combobox_item_prepend()'s "..." argument for more information + * @return Returns the new item + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() + * @see etk_combobox_item_prepend + */ +Etk_Combobox_Item *etk_combobox_item_prepend_relative_valist(Etk_Combobox *combobox, Etk_Combobox_Item *relative, va_list args) +{ + Etk_Combobox_Item *item; + va_list args2; + + if (!combobox) + return NULL; + + va_copy(args2, args); + item = _etk_combobox_item_new_valist(combobox, args2); + va_end(args2); + + if (item) + combobox->items = evas_list_prepend_relative(combobox->items, item, relative); + + return item; +} + +/** + * @brief Adds a new item to the combobox, after an existing item + * @param combobox a combobox + * @param relative the item after which the new item will be added. + * If @a relative is not in the combobox, the new item is appended to the end of the combobox + * @param ... the different widgets to attach to the columns of the item. + * See etk_combobox_item_prepend()'s "..." argument for more information + * @return Returns the new item + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() + * @see etk_combobox_item_prepend() + */ +Etk_Combobox_Item *etk_combobox_item_append_relative(Etk_Combobox *combobox, Etk_Combobox_Item *relative, ...) +{ + Etk_Combobox_Item *item; + va_list args; + + if (!combobox) + return NULL; + + va_start(args, relative); + item = etk_combobox_item_append_relative_valist(combobox, relative, args); + va_end(args); + + return item; +} + +/** + * @brief Adds a new item to the combobox, after an existing item + * @param combobox a combobox + * @param relative the item after which the new item will be added. + * If @a relative is not in the combobox, the new item is appended to the end of the combobox + * @param args the different widgets to attach to the columns of the item. + * See etk_combobox_item_prepend()'s "..." argument for more information + * @return Returns the new item + * @note Unlike other widgets, the new item will be automatically shown, so you won't have to call etk_widget_show() + * @see etk_combobox_item_prepend + */ +Etk_Combobox_Item *etk_combobox_item_append_relative_valist(Etk_Combobox *combobox, Etk_Combobox_Item *relative, va_list args) +{ + Etk_Combobox_Item *item; + va_list args2; + + if (!combobox) + return NULL; + + va_copy(args2, args); + item = _etk_combobox_item_new_valist(combobox, args2); + va_end(args2); + + if (item) + combobox->items = evas_list_append_relative(combobox->items, item, relative); + + return item; +} + +/** * @brief Removes an item from the combobox * @param combobox a combobox * @param item the item to remove @@ -517,7 +674,8 @@ combobox->num_cols = 0; combobox->cols = NULL; combobox->items = NULL; - combobox->item_height = 24; + combobox->item_height = ETK_COMBOBOX_DEFAULT_ITEM_HEIGHT; + combobox->item_height_set = ETK_FALSE; combobox->built = ETK_FALSE; ETK_WIDGET(combobox)->focus = _etk_combobox_focus_handler; @@ -525,6 +683,7 @@ ETK_WIDGET(combobox)->size_request = _etk_combobox_size_request; ETK_WIDGET(combobox)->size_allocate = _etk_combobox_size_allocate; + etk_signal_connect("realize", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_realize_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(combobox), ETK_CALLBACK(_etk_combobox_key_down_cb), NULL); } @@ -559,6 +718,9 @@ switch (property_id) { + case ETK_COMBOBOX_ITEM_HEIGHT_PROPERTY: + etk_combobox_item_height_set(combobox, etk_property_value_int_get(value)); + break; case ETK_COMBOBOX_ACTIVE_ITEM_PROPERTY: etk_combobox_active_item_set(combobox, ETK_COMBOBOX_ITEM(etk_property_value_pointer_get(value))); break; @@ -577,6 +739,9 @@ switch (property_id) { + case ETK_COMBOBOX_ITEM_HEIGHT_PROPERTY: + etk_property_value_int_set(value, combobox->item_height); + break; case ETK_COMBOBOX_ACTIVE_ITEM_PROPERTY: etk_property_value_pointer_set(value, combobox->active_item); break; @@ -620,13 +785,13 @@ } /* Calculates the ideal size of the combobox */ -static void _etk_combobox_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_combobox_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Combobox *combobox; - if (!(combobox = ETK_COMBOBOX(widget)) || !size_requisition) + if (!(combobox = ETK_COMBOBOX(widget)) || !size) return; - etk_widget_size_request(combobox->button, size_requisition); + etk_widget_size_request(combobox->button, size); } /* Resizes the combobox to the allocated geometry */ @@ -640,21 +805,21 @@ } /* Calculates the ideal size of the combobox window */ -static void _etk_combobox_window_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_combobox_window_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Combobox *combobox; int i; - if (!widget || !size_requisition) + if (!widget || !size) return; if (!(combobox = ETK_COMBOBOX(etk_object_data_get(ETK_OBJECT(widget), "_Etk_Combobox_Window::Combobox")))) return; - size_requisition->w = 0; + size->w = 0; for (i = 0; i < combobox->num_cols; i++) - size_requisition->w += combobox->cols[i]->size; + size->w += combobox->cols[i]->size; - size_requisition->h = evas_list_count(combobox->items) * combobox->item_height; + size->h = evas_list_count(combobox->items) * combobox->item_height; } /* Resizes the combobox window to the allocated geometry */ @@ -734,22 +899,24 @@ } /* Calculates the ideal size of the active item of the combobox (the item in the combobox button */ -static void _etk_combobox_active_item_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_combobox_active_item_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Combobox *combobox; int i; - if (!widget || !size_requisition) + if (!widget || !size) return; if (!(combobox = ETK_COMBOBOX(etk_object_data_get(ETK_OBJECT(widget), "_Etk_Combobox_Window::Combobox")))) return; - size_requisition->w = 0; - size_requisition->h = 0; + size->w = 0; + /* TODO: active_item_size_request: height */ + /* size->h = combobox->item_height; */ + size->h = 0; for (i = 0; i < combobox->num_cols; i++) { if (combobox->cols[i]->type != ETK_COMBOBOX_OTHER) - size_requisition->w += combobox->cols[i]->size; + size->w += combobox->cols[i]->size; } } @@ -849,6 +1016,25 @@ etk_widget_theme_object_signal_emit(combobox->button, "unfocus"); } +/* Called when the combobox is realized */ +static void _etk_combobox_realize_cb(Etk_Object *object, void *data) +{ + Etk_Combobox *combobox; + + if (!(combobox = ETK_COMBOBOX(object))) + return; + + if (!combobox->item_height_set) + { + if (etk_widget_theme_object_data_get(ETK_WIDGET(combobox), "item_height", "%d", &combobox->item_height) != 1 || + combobox->item_height <= 0) + { + combobox->item_height = ETK_COMBOBOX_DEFAULT_ITEM_HEIGHT; + } + etk_object_notify(ETK_OBJECT(combobox), "item_height"); + } +} + /* Called when a key is pressed on the combobox */ static void _etk_combobox_key_down_cb(Etk_Object *object, void *event_info, void *data) { @@ -1097,6 +1283,11 @@ * @signal_data * * \par Properties: + * @prop_name "item_height": The height of an item of the combobox (should be > 0) + * @prop_type Integer + * @prop_rw + * @prop_val 24 + * \par * @prop_name "active_item": The active item of the combobox (the item displayed in the combobox button) * @prop_type Pointer (Etk_Combobox_Item *) * @prop_rw =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_combobox.h 12 May 2006 19:13:39 -0000 1.7 +++ etk_combobox.h 13 May 2006 23:44:40 -0000 1.8 @@ -7,6 +7,12 @@ #include <Evas.h> #include "etk_types.h" +/* TODO/FIXME list: + * - Combobox item separator! + * - Bug in the default theme: when you press the combobox button, and you release it with the mouse out of it, + * the button looks pressed. + */ + /** * @defgroup Etk_Combobox Etk_Combobox * @brief The Etk_Combobox widget is made up of a button that shows a popup menu when it is clicked, @@ -92,6 +98,7 @@ Evas_List *items; int item_height; + Etk_Bool item_height_set; Etk_Bool built; }; @@ -102,6 +109,9 @@ Etk_Widget *etk_combobox_new(); Etk_Widget *etk_combobox_new_default(); +void etk_combobox_item_height_set(Etk_Combobox *combobox, int item_height); +int etk_combobox_item_height_get(Etk_Combobox *combobox); + void etk_combobox_column_add(Etk_Combobox *combobox, Etk_Combobox_Column_Type col_type, int size, Etk_Bool expand, Etk_Bool hfill, Etk_Bool vfill, float xalign, float yalign); void etk_combobox_build(Etk_Combobox *combobox); @@ -113,6 +123,11 @@ Etk_Combobox_Item *etk_combobox_item_prepend_valist(Etk_Combobox *combobox, va_list args); Etk_Combobox_Item *etk_combobox_item_append(Etk_Combobox *combobox, ...); Etk_Combobox_Item *etk_combobox_item_append_valist(Etk_Combobox *combobox, va_list args); + +Etk_Combobox_Item *etk_combobox_item_prepend_relative(Etk_Combobox *combobox, Etk_Combobox_Item *relative, ...); +Etk_Combobox_Item *etk_combobox_item_prepend_relative_valist(Etk_Combobox *combobox, Etk_Combobox_Item *relative, va_list args); +Etk_Combobox_Item *etk_combobox_item_append_relative(Etk_Combobox *combobox, Etk_Combobox_Item *relative, ...); +Etk_Combobox_Item *etk_combobox_item_append_relative_valist(Etk_Combobox *combobox, Etk_Combobox_Item *relative, va_list args); void etk_combobox_item_remove(Etk_Combobox *combobox, Etk_Combobox_Item *item); void etk_combobox_clear(Etk_Combobox *combobox); |
From: Enlightenment C. <no...@cv...> - 2006-05-13 23:46:26
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/widgets Modified Files: combobox.edc Log Message: * [Etk_Box]Remove etk_box_child_reorder() because the position number doesn't really make sense in a box. If you want to reorder the children, you can just repack them * [Etk_Box]Implementation of etk_box_child_packing_set/get() to set/get the packing settings of a child of a box * [Etk_Box]Fix the focus order * [Etk_Combobox] Add etk_combobox_item_prepend/append_relative to the API, to add an item before/aftern an existing item * [Etk_Combobox] The item height can now be defined by the theme. And also by the user with etk_combobox_item_height_set() * Formatting and English fixes =================================================================== RCS file: /cvs/e/e17/proto/etk/data/themes/default/widgets/combobox.edc,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- combobox.edc 11 Apr 2006 15:03:12 -0000 1.5 +++ combobox.edc 13 May 2006 23:44:40 -0000 1.6 @@ -1,4 +1,10 @@ group { + name: "combobox"; + data { + item: "item_height" "24"; + } +} +group { name: "combobox/button"; min: 0 32; parts { |
From: Enlightenment C. <no...@cv...> - 2006-05-14 14:16:19
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/widgets Modified Files: combobox.edc toggle_button.edc Log Message: * [Theme] When you release a combobox button or a toggle button with the mouse out of the widget, it no longer looks pressed. * [Combobox] The hidden items are no longer displayed in the combobox window =================================================================== RCS file: /cvs/e/e17/proto/etk/data/themes/default/widgets/combobox.edc,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- combobox.edc 13 May 2006 23:44:40 -0000 1.6 +++ combobox.edc 14 May 2006 14:14:58 -0000 1.7 @@ -249,7 +249,7 @@ signal: "deactivate"; source: ""; script { - desactivate(); + deactivate(); } } program { @@ -365,7 +365,7 @@ set_state(PART:"combo_button", "on", 0.0); set_state(PART:"swallow_area", "down", 0.0); } - public desactivate() + public deactivate() { activated = 0; set_state(PART:"combo_button", "default", 0.0); @@ -373,10 +373,10 @@ } public up() { - if (activated) + if (activated == 1) activate(); else - desactivate(); + deactivate(); } } } =================================================================== RCS file: /cvs/e/e17/proto/etk/data/themes/default/widgets/toggle_button.edc,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- toggle_button.edc 12 Mar 2006 12:13:01 -0000 1.8 +++ toggle_button.edc 14 May 2006 14:14:58 -0000 1.9 @@ -236,7 +236,7 @@ signal: "deactivate"; source: ""; script { - desactivate(); + deactivate(); } } program { @@ -354,7 +354,7 @@ set_state(PART:"toggle_button", "on", 0.0); set_state(PART:"swallow_area", "down", 0.0); } - public desactivate() + public deactivate() { activated = 0; set_state(PART:"toggle_button", "default", 0.0); @@ -362,10 +362,10 @@ } public up() { - if (activated) + if (activated == 1) activate(); else - desactivate(); + deactivate(); } } } |
From: Enlightenment C. <no...@cv...> - 2006-05-14 14:16:19
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_combobox.c etk_combobox.h Log Message: * [Theme] When you release a combobox button or a toggle button with the mouse out of the widget, it no longer looks pressed. * [Combobox] The hidden items are no longer displayed in the combobox window =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- etk_combobox.c 13 May 2006 23:44:40 -0000 1.11 +++ etk_combobox.c 14 May 2006 14:14:58 -0000 1.12 @@ -808,7 +808,8 @@ static void _etk_combobox_window_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Combobox *combobox; - int i; + Evas_List *l; + int i, num_visible_items; if (!widget || !size) return; @@ -819,7 +820,14 @@ for (i = 0; i < combobox->num_cols; i++) size->w += combobox->cols[i]->size; - size->h = evas_list_count(combobox->items) * combobox->item_height; + num_visible_items = 0; + for (l = combobox->items; l; l = l->next) + { + if (etk_widget_is_visible(ETK_WIDGET(l->data))) + num_visible_items++; + } + + size->h = num_visible_items * combobox->item_height; } /* Resizes the combobox window to the allocated geometry */ @@ -834,8 +842,11 @@ geometry.h = combobox->item_height; for (l = combobox->items; l; l = l->next) { - etk_widget_size_allocate(ETK_WIDGET(l->data), geometry); - geometry.y += combobox->item_height; + if (etk_widget_is_visible(ETK_WIDGET(l->data))) + { + etk_widget_size_allocate(ETK_WIDGET(l->data), geometry); + geometry.y += combobox->item_height; + } } } @@ -910,8 +921,6 @@ return; size->w = 0; - /* TODO: active_item_size_request: height */ - /* size->h = combobox->item_height; */ size->h = 0; for (i = 0; i < combobox->num_cols; i++) { =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_combobox.h 13 May 2006 23:44:40 -0000 1.8 +++ etk_combobox.h 14 May 2006 14:14:58 -0000 1.9 @@ -9,8 +9,6 @@ /* TODO/FIXME list: * - Combobox item separator! - * - Bug in the default theme: when you press the combobox button, and you release it with the mouse out of it, - * the button looks pressed. */ /** |
From: Enlightenment C. <no...@cv...> - 2006-05-14 21:30:41
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_colorpicker_vertical.c etk_combobox.c etk_dialog.h etk_drag.h etk_image.c etk_label.c etk_label.h etk_menu.c etk_menu.h etk_menu_bar.c etk_menu_bar.h etk_menu_item.h etk_menu_shell.c etk_menu_shell.h etk_statusbar.c etk_tree.c etk_types.h Log Message: * [Menu_Shell] Add etk_menu_shell_prepend_relative(), etk_menu_shell_append_relative(), etk_menu_shell_insert() and etk_menu_shell_items_get() to the API. * [Tree] Display a warning when the user tries to add a row when the tree is not built * Documentation of these files: - etk_menu_bar.c/h - etk_menu.c/h * Added a "TODO/FIXME" list at the beginning of several headers * Formatting and small fixes * Doxygen's warnings-- =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker_vertical.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_colorpicker_vertical.c 15 Jan 2006 11:07:16 -0000 1.7 +++ etk_colorpicker_vertical.c 14 May 2006 21:29:22 -0000 1.8 @@ -569,3 +569,5 @@ if (cpv->cursor) evas_object_image_size_set(cpv->cursor, cpv->map_width, 1); } + +/** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- etk_combobox.c 14 May 2006 14:14:58 -0000 1.12 +++ etk_combobox.c 14 May 2006 21:29:22 -0000 1.13 @@ -191,7 +191,7 @@ return; if (combobox->built) { - ETK_WARNING("The combobox shouldn't be already built when you add a new column"); + ETK_WARNING("Unable to add a new column to the combobox because the combobox has been built"); return; } @@ -1186,7 +1186,7 @@ return NULL; if (!combobox->built) { - ETK_WARNING("The combobox should be already built when you add a new item to it"); + ETK_WARNING("Unable to add a new item to the combobox because etk_combobox_build() has not been called yet"); return NULL; } =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_dialog.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_dialog.h 12 May 2006 19:13:39 -0000 1.6 +++ etk_dialog.h 14 May 2006 21:29:22 -0000 1.7 @@ -5,6 +5,11 @@ #include "etk_window.h" #include "etk_types.h" +/* TODO/FIXME list: + * - We should certainly set some X hints to make the dialogs not simple windows anymore + * - Find a way to make modal dialogs + */ + /** * @defgroup Etk_Dialog Etk_Dialog * @brief A dialog is a window with buttons in its bottom area to allow the user to respond to a request =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_drag.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_drag.h 16 Feb 2006 01:40:16 -0000 1.2 +++ etk_drag.h 14 May 2006 21:29:22 -0000 1.3 @@ -1,4 +1,4 @@ -/** @file etk_dnd.h */ +/** @file etk_drag.h */ #ifndef _ETK_DRAG_H_ #define _ETK_DRAG_H_ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_image.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- etk_image.c 12 May 2006 19:13:39 -0000 1.18 +++ etk_image.c 14 May 2006 21:29:22 -0000 1.19 @@ -31,7 +31,7 @@ static void _etk_image_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_image_realize_cb(Etk_Object *object, void *data); static void _etk_image_unrealize_cb(Etk_Object *object, void *data); -static void _etk_image_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_image_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_image_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_image_load(Etk_Image *image); @@ -474,11 +474,11 @@ } /* Calculates the ideal size of the image */ -static void _etk_image_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_image_size_request(Etk_Widget *widget, Etk_Size *size) { Etk_Image *image; - if (!(image = ETK_IMAGE(widget)) || !size_requisition) + if (!(image = ETK_IMAGE(widget)) || !size) return; if (image->image_object) @@ -489,16 +489,16 @@ edje_object_size_min_get(image->image_object, &min_x, &min_y); edje_object_size_min_calc(image->image_object, &calc_x, &calc_y); - size_requisition->w = ETK_MAX(min_x, calc_x); - size_requisition->h = ETK_MAX(min_y, calc_y); + size->w = ETK_MAX(min_x, calc_x); + size->h = ETK_MAX(min_y, calc_y); } else - evas_object_image_size_get(image->image_object, &size_requisition->w, &size_requisition->h); + evas_object_image_size_get(image->image_object, &size->w, &size->h); } else { - size_requisition->w = 0; - size_requisition->h = 0; + size->w = 0; + size->h = 0; } } =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_label.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_label.c 12 May 2006 19:13:39 -0000 1.13 +++ etk_label.c 14 May 2006 21:29:22 -0000 1.14 @@ -351,6 +351,7 @@ /** * @addtogroup Etk_Label * + * @image html label.png * You can use html-like tags to format the text of the label. For example, "<b>Text</b>" makes <b>Text</b> bold. @n * Here is the list of the supported tags: @n * TODO: [Doc] List of the tags for the label =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_label.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_label.h 12 May 2006 19:13:39 -0000 1.2 +++ etk_label.h 14 May 2006 21:29:22 -0000 1.3 @@ -5,6 +5,13 @@ #include <Evas.h> #include "etk_widget.h" +/* + * TODO/FIXME list: + * - The style has to be defined by the theme + * - Fix bad size_request and bad rendering (evas_textblock bug?) + * - Document the different style tags + */ + /** * @defgroup Etk_Label Etk_Label * @brief The Etk_Label widget is a simple widget that can display text =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_menu.c 7 Apr 2006 15:36:11 -0000 1.13 +++ etk_menu.c 14 May 2006 21:29:22 -0000 1.14 @@ -12,7 +12,7 @@ * @{ */ -enum _Etk_Menu_Signal_Id +enum Etk_Menu_Signal_Id { ETK_MENU_POPPED_DOWN_SIGNAL, ETK_MENU_POPPED_UP_SIGNAL, @@ -21,7 +21,7 @@ static void _etk_menu_constructor(Etk_Menu *menu); static void _etk_menu_destructor(Etk_Menu *menu); -static void _etk_menu_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_menu_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_menu_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_menu_window_popped_up_cb(Etk_Object *object, void *data); static void _etk_menu_window_popped_down_cb(Etk_Object *object, void *data); @@ -45,7 +45,7 @@ /** * @brief Gets the type of an Etk_Menu - * @return Returns the type on an Etk_Menu + * @return Returns the type of an Etk_Menu */ Etk_Type *etk_menu_type_get() { @@ -53,10 +53,13 @@ if (!menu_type) { - menu_type = etk_type_new("Etk_Menu", ETK_MENU_SHELL_TYPE, sizeof(Etk_Menu), ETK_CONSTRUCTOR(_etk_menu_constructor), ETK_DESTRUCTOR(_etk_menu_destructor)); + menu_type = etk_type_new("Etk_Menu", ETK_MENU_SHELL_TYPE, sizeof(Etk_Menu), + ETK_CONSTRUCTOR(_etk_menu_constructor), ETK_DESTRUCTOR(_etk_menu_destructor)); - _etk_menu_signals[ETK_MENU_POPPED_UP_SIGNAL] = etk_signal_new("popped_up", menu_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); - _etk_menu_signals[ETK_MENU_POPPED_DOWN_SIGNAL] = etk_signal_new("popped_down", menu_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); + _etk_menu_signals[ETK_MENU_POPPED_UP_SIGNAL] = etk_signal_new("popped_up", + menu_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); + _etk_menu_signals[ETK_MENU_POPPED_DOWN_SIGNAL] = etk_signal_new("popped_down", + menu_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); } return menu_type; @@ -72,10 +75,10 @@ } /** - * @brief Popups the menu at the position (x, y) + * @brief Pops up the menu at the position (x, y) * @param menu a menu - * @param x the x component of the location where to popup the menu - * @param y the y component of the location where to popup the menu + * @param x the x component of the position where to popup the menu + * @param y the y component of the position where to popup the menu */ void etk_menu_popup_at_xy(Etk_Menu *menu, int x, int y) { @@ -85,7 +88,7 @@ } /** - * @brief Popups the menu at the mouse pointer position + * @brief Pops up the menu at the mouse position * @param menu a menu */ void etk_menu_popup(Etk_Menu *menu) @@ -96,7 +99,7 @@ } /** - * @brief Pops down the menu and its children + * @brief Pops down the menu and all its submenus (menus attached to its items) * @param menu a menu */ void etk_menu_popdown(Etk_Menu *menu) @@ -112,7 +115,7 @@ * **************************/ -/* Initializes the members */ +/* Initializes the menu */ static void _etk_menu_constructor(Etk_Menu *menu) { if (!menu) @@ -141,29 +144,29 @@ } /* Calculates the ideal size of the menu */ -static void _etk_menu_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +static void _etk_menu_size_request(Etk_Widget *widget, Etk_Size *size) { Evas_List *l; Etk_Menu_Shell *menu_shell; - if (!(menu_shell = ETK_MENU_SHELL(widget)) || !size_requisition) + if (!(menu_shell = ETK_MENU_SHELL(widget)) || !size) return; - size_requisition->w = 0; - size_requisition->h = 0; + size->w = 0; + size->h = 0; for (l = menu_shell->items; l; l = l->next) { - Etk_Size child_requisition; + Etk_Size child_size; - etk_widget_size_request(ETK_WIDGET(l->data), &child_requisition); - size_requisition->w = ETK_MAX(size_requisition->w, child_requisition.w); - size_requisition->h += child_requisition.h; + etk_widget_size_request(ETK_WIDGET(l->data), &child_size); + size->w = ETK_MAX(size->w, child_size.w); + size->h += child_size.h; } - /* TODO: Fixme: size request */ - size_requisition->w += 15; + /* TODO: FIXME: incorrect calculated width */ + size->w += 15; } -/* Resizes the menu to the size allocation */ +/* Resizes the menu to the allocated size */ static void _etk_menu_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Geometry child_geometry; @@ -195,23 +198,24 @@ else etk_widget_theme_object_signal_emit(ETK_WIDGET(item), "arrow_hide"); - etk_widget_theme_object_signal_emit(ETK_WIDGET(item), items_have_left_widget ? "left_widget_show" : "left_widget_hide"); + etk_widget_theme_object_signal_emit(ETK_WIDGET(item), + items_have_left_widget ? "left_widget_show" : "left_widget_hide"); } y_offset = geometry.y; child_geometry.x = geometry.x; for (l = menu_shell->items; l; l = l->next) { - Etk_Size child_requisition; + Etk_Size child_size; item = ETK_MENU_ITEM(l->data); - etk_widget_size_request(ETK_WIDGET(item), &child_requisition); + etk_widget_size_request(ETK_WIDGET(item), &child_size); child_geometry.y = y_offset; child_geometry.w = geometry.w; - child_geometry.h = child_requisition.h; + child_geometry.h = child_size.h; etk_widget_size_allocate(ETK_WIDGET(item), child_geometry); - y_offset += child_requisition.h; + y_offset += child_geometry.h; } } @@ -255,36 +259,11 @@ { Etk_Menu_Shell *menu_shell; Evas_Event_Key_Down *event; - //Evas_List *l; if (!(menu_shell = ETK_MENU_SHELL(data)) || !(event = event_info)) return; - /*if (strcmp(event->keyname, "Down") == 0) - { - if (!menu_shell->items) - return; - if (!combobox->selected_item || !(l = evas_list_find_list(combobox->items, combobox->selected_item)) || !l->next) - _etk_combobox_selected_item_set(combobox, ETK_COMBOBOX_ITEM(combobox->items->data)); - else - _etk_combobox_selected_item_set(combobox, ETK_COMBOBOX_ITEM(l->next->data)); - } - else if (strcmp(event->keyname, "Up") == 0) - { - if (!combobox->items) - return; - if (!combobox->selected_item || !(l = evas_list_find_list(combobox->items, combobox->selected_item)) || !l->prev) - _etk_combobox_selected_item_set(combobox, ETK_COMBOBOX_ITEM(evas_list_last(combobox->items)->data)); - else - _etk_combobox_selected_item_set(combobox, ETK_COMBOBOX_ITEM(l->prev->data)); - } - else if (strcmp(event->keyname, "Return") == 0 || strcmp(event->keyname, "space") == 0 || strcmp(event->keyname, "KP_Enter") == 0) - { - if (combobox->selected_item) - etk_combobox_active_item_set(combobox, combobox->selected_item); - } - else if (strcmp(event->keyname, "Escape") == 0) - etk_popup_window_popdown(combobox->window);*/ + /* TODO: keyboard navigation */ } /* Called when an item is added to the menu */ @@ -393,3 +372,39 @@ } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Menu + * + * @image html menu.png + * The items of the menu are packed vertically. @n + * To add or remove items, you have to use the functions provided by the Etk_Menu_Shell: + * etk_menu_shell_append(), etk_menu_shell_remove(), ... @n @n + * A menu is usually popped up by clicking on an item of a menu bar, or by activating an item of another menu. @n + * You can also pop up a menu at the mouse position with etk_menu_popup() or at a specific position with + * etk_menu_popup_xy(). The menu could then be popped down with etk_menu_popdown(). + * + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Menu_Shell + * - Etk_Menu + * + * \par Signals: + * @signal_name "popped_up": Emitted when the the menu has been popped up + * @signal_cb void callback(Etk_Menu *menu, void *data) + * @signal_arg menu: the menu that has been popped up + * @signal_data + * \par + * @signal_name "popped_down": Emitted when the the menu has been popped down + * @signal_cb void callback(Etk_Menu *menu, void *data) + * @signal_arg menu: the menu that has been popped down + * @signal_data + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_menu.h 7 Apr 2006 15:36:11 -0000 1.5 +++ etk_menu.h 14 May 2006 21:29:22 -0000 1.6 @@ -5,23 +5,33 @@ #include "etk_menu_shell.h" #include "etk_types.h" +/* TODO/FIXME list: + * - Sometimes, when the menu is popped down, the window stay visible, but its content is hidden + * - The width of the menu window is not correctly calculated. Probably a bug of edje_object_size_min_calc(). + * For now, 15 pixels are manually added to the calculated width + * - Keyboard navigation! + * - better theme grouping? + * - Sometimes the menu is not popped up at the right place (maybe a bug ot Etk_Popup_Window) + */ + /** * @defgroup Etk_Menu Etk_Menu + * @brief The Etk_Menu widget is a menu shell implemented in a popup window * @{ */ -/** @brief Gets the type of a menu */ +/** Gets the type of a menu */ #define ETK_MENU_TYPE (etk_menu_type_get()) -/** @brief Casts the object to an Etk_Menu */ +/** Casts the object to an Etk_Menu */ #define ETK_MENU(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_TYPE, Etk_Menu)) -/** @brief Check if the object is an Etk_Menu */ +/** Check if the object is an Etk_Menu */ #define ETK_IS_MENU(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_TYPE)) /** - * @struct Etk_Menu - * @brief An Etk_Menu is a popup window containing several menu items + * @brief @widget The structure of a menu + * @structinfo */ -struct _Etk_Menu +struct Etk_Menu { /* private: */ /* Inherit from Etk_Menu_Shell */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu_bar.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_menu_bar.c 7 Apr 2006 15:36:11 -0000 1.4 +++ etk_menu_bar.c 14 May 2006 21:29:22 -0000 1.5 @@ -16,7 +16,7 @@ */ static void _etk_menu_bar_constructor(Etk_Menu_Bar *menu_bar); -static void _etk_menu_bar_size_request(Etk_Widget *widget, Etk_Size *size_requisition); +static void _etk_menu_bar_size_request(Etk_Widget *widget, Etk_Size *size); static void _etk_menu_bar_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); static void _etk_menu_bar_item_added_cb(Etk_Object *object, void *item, void *data); static void _etk_menu_bar_item_removed_cb(Etk_Object *object, void *item, void *data); @@ -36,21 +36,24 @@ /** * @brief Gets the type of an Etk_Menu_Bar - * @return Returns the type on an Etk_Menu_Bar + * @return Returns the type of an Etk_Menu_Bar */ Etk_Type *etk_menu_bar_type_get() { static Etk_Type *menu_bar_type = NULL; if (!menu_bar_type) - menu_bar_type = etk_type_new("Etk_Menu_Bar", ETK_MENU_SHELL_TYPE, sizeof(Etk_Menu_Bar), ETK_CONSTRUCTOR(_etk_menu_bar_constructor), NULL); + { + menu_bar_type = etk_type_new("Etk_Menu_Bar", ETK_MENU_SHELL_TYPE, sizeof(Etk_Menu_Bar), + ETK_CONSTRUCTOR(_etk_menu_bar_constructor), NULL); + } return menu_bar_type; } /** - * @brief Creates a new menu_bar - * @return Returns the new menu_bar widget + * @brief Creates a new menu bar + * @return Returns the new menu bar widget */ Etk_Widget *etk_menu_bar_new() { @@ -63,7 +66,7 @@ * **************************/ -/* Initializes the members */ +/* Initializes the menu bar */ static void _etk_menu_bar_constructor(Etk_Menu_Bar *menu_bar) { if (!menu_bar) @@ -77,28 +80,28 @@ etk_signal_connect("item_removed", ETK_OBJECT(menu_bar), ETK_CALLBACK(_etk_menu_bar_item_removed_cb), NULL); } -/* Calculates the ideal size of the menu_bar */ -static void _etk_menu_bar_size_request(Etk_Widget *widget, Etk_Size *size_requisition) +/* Calculates the ideal size of the menu bar */ +static void _etk_menu_bar_size_request(Etk_Widget *widget, Etk_Size *size) { Evas_List *l; Etk_Menu_Shell *menu_shell; - if (!(menu_shell = ETK_MENU_SHELL(widget)) || !size_requisition) + if (!(menu_shell = ETK_MENU_SHELL(widget)) || !size) return; - size_requisition->w = 0; - size_requisition->h = 0; + size->w = 0; + size->h = 0; for (l = menu_shell->items; l; l = l->next) { - Etk_Size child_requisition; + Etk_Size child_size; - etk_widget_size_request(ETK_WIDGET(l->data), &child_requisition); - size_requisition->w += child_requisition.w; - size_requisition->h = ETK_MAX(size_requisition->h, child_requisition.h); + etk_widget_size_request(ETK_WIDGET(l->data), &child_size); + size->w += child_size.w; + size->h = ETK_MAX(size->h, child_size.h); } } -/* Resizes the menu_bar to the size allocation */ +/* Resizes the menu bar to the allocated size */ static void _etk_menu_bar_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Geometry child_geometry; @@ -113,15 +116,15 @@ child_geometry.y = geometry.y; for (l = menu_shell->items; l; l = l->next) { - Etk_Size child_requisition; + Etk_Size child_size; - etk_widget_size_request(ETK_WIDGET(l->data), &child_requisition); + etk_widget_size_request(ETK_WIDGET(l->data), &child_size); child_geometry.x = x_offset; - child_geometry.w = child_requisition.w; + child_geometry.w = child_size.w; child_geometry.h = geometry.h; etk_widget_size_allocate(ETK_WIDGET(l->data), child_geometry); - x_offset += child_requisition.w; + x_offset += child_geometry.w; } } @@ -173,8 +176,11 @@ Evas_List *l; Etk_Widget *item; - if (!(menu_bar = ETK_MENU_BAR(data)) || !(toplevel = etk_widget_toplevel_parent_get(ETK_WIDGET(menu_bar))) || !(mouse_event = event)) + if (!(menu_bar = ETK_MENU_BAR(data)) || !(toplevel = etk_widget_toplevel_parent_get(ETK_WIDGET(menu_bar))) || + !(mouse_event = event)) + { return 1; + } /* If the mouse pointer is above a menu item, we select it */ etk_toplevel_widget_geometry_get(toplevel, &tx, &ty, NULL, NULL); @@ -224,7 +230,10 @@ } if (!_etk_menu_bar_mouse_move_handler) - _etk_menu_bar_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _etk_menu_bar_mouse_move_cb, menu_bar); + { + _etk_menu_bar_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, + _etk_menu_bar_mouse_move_cb, menu_bar); + } menu_bar->item_selected = ETK_TRUE; } @@ -265,3 +274,25 @@ } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Menu_Bar + * + * @image html menu_bar.png + * The menu bar is a menu shell whose items are packed horizontally. + * A menu bar is usually packed at the top of a window. @n + * To add or remove items, you have to use the functions provided by the Etk_Menu_Shell: + * etk_menu_shell_append(), etk_menu_shell_remove(), ... + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Menu_Shell + * - Etk_Menu_Bar + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu_bar.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_menu_bar.h 12 May 2006 19:13:39 -0000 1.2 +++ etk_menu_bar.h 14 May 2006 21:29:22 -0000 1.3 @@ -5,6 +5,11 @@ #include "etk_menu_shell.h" #include "etk_types.h" +/* TODO/FIXME list: + * - Improve default theme + * - Add keyboard navigation + */ + /** * @defgroup Etk_Menu_Bar Etk_Menu_Bar * @brief A menu bar is an horizontal bar that can contain several menu items =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu_item.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_menu_item.h 4 Mar 2006 23:29:47 -0000 1.6 +++ etk_menu_item.h 14 May 2006 21:29:22 -0000 1.7 @@ -106,7 +106,7 @@ }; /** - * @struct Etk_Menu_Item_Check + * @struct Etk_Menu_Item_Radio * @brief A menu item with a radiobox */ struct _Etk_Menu_Item_Radio =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu_shell.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_menu_shell.c 7 Apr 2006 15:36:11 -0000 1.5 +++ etk_menu_shell.c 14 May 2006 21:29:22 -0000 1.6 @@ -11,7 +11,7 @@ * @{ */ -enum _Etk_Menu_Shell_Signal_Id +enum Etk_Menu_Shell_Signal_Id { ETK_MENU_SHELL_ITEM_ADDED_SIGNAL, ETK_MENU_SHELL_ITEM_REMOVED_SIGNAL, @@ -32,7 +32,7 @@ /** * @brief Gets the type of an Etk_Menu_Shell - * @return Returns the type on an Etk_Menu_Shell + * @return Returns the type of an Etk_Menu_Shell */ Etk_Type *etk_menu_shell_type_get() { @@ -40,17 +40,20 @@ if (!menu_shell_type) { - menu_shell_type = etk_type_new("Etk_Menu_Shell", ETK_WIDGET_TYPE, sizeof(Etk_Menu_Shell), ETK_CONSTRUCTOR(_etk_menu_shell_constructor), ETK_DESTRUCTOR(_etk_menu_shell_destructor)); + menu_shell_type = etk_type_new("Etk_Menu_Shell", ETK_WIDGET_TYPE, sizeof(Etk_Menu_Shell), + ETK_CONSTRUCTOR(_etk_menu_shell_constructor), ETK_DESTRUCTOR(_etk_menu_shell_destructor)); - _etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_ADDED_SIGNAL] = etk_signal_new("item_added", menu_shell_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); - _etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_REMOVED_SIGNAL] = etk_signal_new("item_removed", menu_shell_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); + _etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_ADDED_SIGNAL] = etk_signal_new("item_added", + menu_shell_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); + _etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_REMOVED_SIGNAL] = etk_signal_new("item_removed", + menu_shell_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); } return menu_shell_type; } /** - * @brief Adds a menu_shell item at the start of the menu shell + * @brief Adds a menu item at the start of the menu shell * @param menu_shell a menu shell * @param item the menu item to prepend to the menu shell */ @@ -60,13 +63,11 @@ return; menu_shell->items = evas_list_prepend(menu_shell->items, item); - etk_widget_parent_set(ETK_WIDGET(item), ETK_WIDGET(menu_shell)); - item->parent = menu_shell; - etk_signal_emit(_etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_ADDED_SIGNAL], ETK_OBJECT(menu_shell), NULL, item); + _etk_menu_shell_item_add(menu_shell, item); } /** - * @brief Adds a menu_shell item at the end of the menu shell + * @brief Adds a menu item at the end of the menu shell * @param menu_shell a menu shell * @param item the menu item to append to the menu shell */ @@ -80,6 +81,65 @@ } /** + * @brief Adds a menu item before an existing item of the menu shell + * @param menu_shell a menu shell + * @param item the menu item to add + * @param relative the item before which @a item will be added. + * If @a relative is not in the menu shell, @a item will be added at the start of the menu shell + */ +void etk_menu_shell_prepend_relative(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, Etk_Menu_Item *relative) +{ + if (!menu_shell || !item) + return; + + menu_shell->items = evas_list_prepend_relative(menu_shell->items, item, relative); + _etk_menu_shell_item_add(menu_shell, item); +} + +/** + * @brief Adds a menu item after an existing item of the menu shell + * @param menu_shell a menu shell + * @param item the menu item to add + * @param relative the item after which @a item will be added. + * If @a relative is not in the menu shell, @a item will be added at the end of the menu shell + */ +void etk_menu_shell_append_relative(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, Etk_Menu_Item *relative) +{ + if (!menu_shell || !item) + return; + + menu_shell->items = evas_list_append_relative(menu_shell->items, item, relative); + _etk_menu_shell_item_add(menu_shell, item); +} + +/** + * @brief Inserts a menu item to the menu shell at a specific position + * @param menu_shell a menu shell + * @param item the menu item to insert + * @param position the position where to insert the item (0 being the first). @n + * If @a position <= 0, the item will be prepended. @n + * If @a position >= the number of items of the menu shell, the item will be appended + */ +void etk_menu_shell_insert(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, int position) +{ + if (!menu_shell || !item) + return; + + if (position <= 0) + menu_shell->items = evas_list_prepend(menu_shell->items, item); + else if (position >= evas_list_count(menu_shell->items)) + menu_shell->items = evas_list_append(menu_shell->items, item); + else + { + void *rel; + + rel = evas_list_nth(menu_shell->items, position); + menu_shell->items = evas_list_prepend_relative(menu_shell->items, item, rel); + } + _etk_menu_shell_item_add(menu_shell, item); +} + +/** * @brief Removes an item from the menu shell * @param menu_shell a menu shell * @param item the item to remove @@ -101,6 +161,26 @@ } } +/** + * @brief Gets the list of the items of the menu shell + * @param menu_shell a menu shell + * @return Returns the list of the items of the menu shell. + * The returned list will have to be freed with evas_list_free() + */ +Evas_List *etk_menu_shell_items_get(Etk_Menu_Shell *menu_shell) +{ + Evas_List *list, *l; + + if (!menu_shell) + return NULL; + + list = NULL; + for (l = menu_shell->items; l; l = l->next) + list = evas_list_append(list, l->data); + + return list; +} + /************************** * * Etk specific functions @@ -136,7 +216,25 @@ etk_widget_parent_set(ETK_WIDGET(item), ETK_WIDGET(menu_shell)); item->parent = menu_shell; etk_signal_emit(_etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_ADDED_SIGNAL], ETK_OBJECT(menu_shell), NULL, item); - etk_widget_size_recalc_queue(ETK_WIDGET(menu_shell)); } /** @} */ + +/************************** + * + * Documentation + * + **************************/ + +/** + * @addtogroup Etk_Menu_Shell + * + * New menu items can be added to the menu shell with etk_menu_shell_append(), etk_menu_shell_insert()... @n + * Menu items can be removed from the menu shell with etk_menu_shell_remove(). @n + * You can also get the list of the menu items of the menu shell with etk_menu_shell_items_get(). + * + * \par Object Hierarchy: + * - Etk_Object + * - Etk_Widget + * - Etk_Menu_Shell + */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_menu_shell.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_menu_shell.h 7 Apr 2006 15:36:11 -0000 1.5 +++ etk_menu_shell.h 14 May 2006 21:29:22 -0000 1.6 @@ -8,21 +8,22 @@ /** * @defgroup Etk_Menu_Shell Etk_Menu_Shell + * @brief Etk_Menu_Shell is the base class used to derive Etk_Menu and Etk_Menu_Bar * @{ */ -/** @brief Gets the type of a menu shell */ +/** Gets the type of a menu shell */ #define ETK_MENU_SHELL_TYPE (etk_menu_shell_type_get()) -/** @brief Casts the object to an Etk_Menu_Shell */ +/** Casts the object to an Etk_Menu_Shell */ #define ETK_MENU_SHELL(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_SHELL_TYPE, Etk_Menu_Shell)) -/** @brief Check if the object is an Etk_Menu_Shell */ +/** Check if the object is an Etk_Menu_Shell */ #define ETK_IS_MENU_SHELL(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_SHELL_TYPE)) /** - * @struct Etk_Menu_Shell - * @brief Etk_Menu_Shell is the base class for Etk_Menu and Etk_Menu_Bar - */ -struct _Etk_Menu_Shell + * @brief @widget The structure of a menu shell + * @structinfo + */ +struct Etk_Menu_Shell { /* private: */ /* Inherit from Etk_Widget */ @@ -36,7 +37,11 @@ void etk_menu_shell_prepend(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item); void etk_menu_shell_append(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item); +void etk_menu_shell_prepend_relative(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, Etk_Menu_Item *relative); +void etk_menu_shell_append_relative(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, Etk_Menu_Item *relative); +void etk_menu_shell_insert(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item, int position); void etk_menu_shell_remove(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item); +Evas_List *etk_menu_shell_items_get(Etk_Menu_Shell *menu_shell); /** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_statusbar.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_statusbar.c 4 Mar 2006 18:04:10 -0000 1.7 +++ etk_statusbar.c 14 May 2006 21:29:22 -0000 1.8 @@ -115,7 +115,7 @@ * @brief Pushs on the statusbar message stack a new message * @param statusbar a statusbar * @param message the message to push - * @param context id the context id to associate to the message. You can generate a context id with @a etk_statusbar_context_id_get() + * @param context_id the context id to associate to the message. You can generate a context id with @a etk_statusbar_context_id_get() * @return Returns the message id of the pushed message, or -1 on failure */ int etk_statusbar_push(Etk_Statusbar *statusbar, const char *message, int context_id) @@ -171,7 +171,7 @@ /** * @brief Removes the message corresponding to the message id from the statusbar * @param statusbar a statusbar - * @param message id the message id of the message, returned when you've pushed the message with @a etk_statusbar_push() + * @param message_id the message id of the message, returned when you've pushed the message with @a etk_statusbar_push() */ void etk_statusbar_remove(Etk_Statusbar *statusbar, int message_id) { @@ -197,7 +197,7 @@ /** * @brief Sets whether the status bar has a resize grip - * @param status bar a status bar + * @param statusbar a status bar * @param has_resize_grip @a has_resize_grip == ETK_TRUE if the statusbar should have a resize grip */ void etk_statusbar_has_resize_grip_set(Etk_Statusbar *statusbar, Etk_Bool has_resize_grip) @@ -212,7 +212,7 @@ /** * @brief Gets whether the status bar has a resize grip - * @param status bar a status bar + * @param statusbar a status bar * @return Returns ETK_TRUE if the statusbar has a resize grip */ Etk_Bool etk_statusbar_has_resize_grip_get(Etk_Statusbar *statusbar) =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -3 -r1.63 -r1.64 --- etk_tree.c 19 Apr 2006 21:52:36 -0000 1.63 +++ etk_tree.c 14 May 2006 21:29:22 -0000 1.64 @@ -583,8 +583,14 @@ */ void etk_tree_mode_set(Etk_Tree *tree, Etk_Tree_Mode mode) { - if (!tree || tree->built) + if (!tree) + return; + if (tree->built) + { + ETK_WARNING("Unable to change the mode of the tree because the tree has been built."); return; + } + tree->mode = mode; etk_object_notify(ETK_OBJECT(tree), "mode"); } @@ -755,7 +761,7 @@ Etk_Tree_Row *new_row; va_list args; - if (!tree || !tree->built) + if (!tree) return NULL; va_start(args, tree); @@ -776,8 +782,13 @@ Etk_Tree_Row *new_row; - if (!tree || !tree->built) + if (!tree) + return NULL; + if (!tree->built) + { + ETK_WARNING("Unable to add a row to the tree because etk_tree_build() has not been called yet"); return NULL; + } new_row = _etk_tree_row_new_valist(tree, &tree->root, args); @@ -795,8 +806,19 @@ Etk_Tree_Row *new_row; va_list args; - if (!row || !row->tree || !row->tree->built || (row->tree->mode != ETK_TREE_MODE_TREE)) + if (!row || !row->tree) + return NULL; + if (row->tree->mode != ETK_TREE_MODE_TREE) + { + ETK_WARNING("Unable to add a row as a child of an existing row of " + "the tree because the mode of the tree is not ETK_TREE_MODE_TREE"); + return NULL; + } + if (!row->tree->built) + { + ETK_WARNING("Unable to add a row to the tree because etk_tree_build() has not been called yet"); return NULL; + } va_start(args, row); new_row = _etk_tree_row_new_valist(row->tree, row, args); @@ -3029,3 +3051,5 @@ { _etk_tree_drag_started = ETK_FALSE; } + +/** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.38 retrieving revision 1.39 diff -u -3 -r1.38 -r1.39 --- etk_types.h 12 May 2006 19:13:39 -0000 1.38 +++ etk_types.h 14 May 2006 21:29:22 -0000 1.39 @@ -85,8 +85,8 @@ typedef struct _Etk_HSeparator Etk_HSeparator; typedef struct _Etk_VSeparator Etk_VSeparator; typedef struct _Etk_Popup_Window Etk_Popup_Window; -typedef struct _Etk_Menu_Shell Etk_Menu_Shell; -typedef struct _Etk_Menu Etk_Menu; +typedef struct Etk_Menu_Shell Etk_Menu_Shell; +typedef struct Etk_Menu Etk_Menu; typedef struct Etk_Menu_Bar Etk_Menu_Bar; typedef struct _Etk_Menu_Item Etk_Menu_Item; typedef struct _Etk_Menu_Item_Separator Etk_Menu_Item_Separator; @@ -124,5 +124,7 @@ { int r, g, b, a; } Etk_Color; + +/** @} */ #endif |
From: Enlightenment C. <no...@cv...> - 2006-05-14 21:31:09
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk Modified Files: Doxyfile Log Message: * [Menu_Shell] Add etk_menu_shell_prepend_relative(), etk_menu_shell_append_relative(), etk_menu_shell_insert() and etk_menu_shell_items_get() to the API. * [Tree] Display a warning when the user tries to add a row when the tree is not built * Documentation of these files: - etk_menu_bar.c/h - etk_menu.c/h * Added a "TODO/FIXME" list at the beginning of several headers * Formatting and small fixes * Doxygen's warnings-- =================================================================== RCS file: /cvs/e/e17/proto/etk/Doxyfile,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Doxyfile 12 May 2006 19:13:38 -0000 1.2 +++ Doxyfile 14 May 2006 21:29:21 -0000 1.3 @@ -73,7 +73,7 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = +WARN_LOGFILE = gendoc_warnings.log FILE_PATTERNS = RECURSIVE = YES EXCLUDE = |
From: Enlightenment C. <no...@cv...> - 2006-05-16 22:04:24
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: Etk.h Makefile.am etk_colorpicker.c etk_colorpicker.h etk_combobox.h etk_types.h Removed Files: etk_colorpicker_square.c etk_colorpicker_square.h etk_colorpicker_vertical.c etk_colorpicker_vertical.h Log Message: * Start to rewrite the colorpicker =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/Etk.h,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- Etk.h 12 May 2006 19:13:39 -0000 1.30 +++ Etk.h 16 May 2006 22:02:59 -0000 1.31 @@ -42,8 +42,6 @@ #include "etk_text_view.h" #include "etk_canvas.h" #include "etk_colorpicker.h" -#include "etk_colorpicker_vertical.h" -#include "etk_colorpicker_square.h" #include "etk_tree.h" #include "etk_tree_model.h" #include "etk_range.h" =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/Makefile.am,v retrieving revision 1.35 retrieving revision 1.36 diff -u -3 -r1.35 -r1.36 --- Makefile.am 12 May 2006 19:13:39 -0000 1.35 +++ Makefile.am 16 May 2006 22:02:59 -0000 1.36 @@ -34,7 +34,7 @@ etk_button.h etk_toggle_button.h etk_check_button.h etk_radio_button.h \ etk_entry.h etk_text_view.h \ etk_canvas.h \ -etk_colorpicker.h etk_colorpicker_vertical.h etk_colorpicker_square.h \ +etk_colorpicker.h \ etk_tree.h etk_tree_model.h \ etk_range.h etk_slider.h etk_scrollbar.h \ etk_separator.h \ @@ -74,7 +74,7 @@ etk_button.c etk_toggle_button.c etk_check_button.c etk_radio_button.c \ etk_entry.c etk_text_view.c \ etk_canvas.c \ -etk_colorpicker.c etk_colorpicker_vertical.c etk_colorpicker_square.c \ +etk_colorpicker.c \ etk_tree.c etk_tree_model.c \ etk_range.c etk_slider.c etk_scrollbar.c \ etk_separator.c \ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_colorpicker.c 12 May 2006 19:13:39 -0000 1.9 +++ etk_colorpicker.c 16 May 2006 22:02:59 -0000 1.10 @@ -1,42 +1,58 @@ /** @file etk_colorpicker.c */ #include "etk_colorpicker.h" #include <stdlib.h> -#include <string.h> -#include <math.h> +#include <stdint.h> #include "etk_signal.h" #include "etk_signal_callback.h" #include "etk_utils.h" -#include "etk_box.h" #include "etk_radio_button.h" -#include "etk_colorpicker_vertical.h" -#include "etk_colorpicker_square.h" /** * @addtogroup Etk_Colorpicker * @{ */ -static int _etk_colorpicker_mode[6] = { - ETK_COLOR_MODE_H, - ETK_COLOR_MODE_S, - ETK_COLOR_MODE_V, - ETK_COLOR_MODE_R, - ETK_COLOR_MODE_G, - ETK_COLOR_MODE_B +enum Etk_Combobox_Signal_Id +{ + ETK_CP_COLOR_CHANGED_SIGNAL, + ETK_CP_NUM_SIGNALS }; -enum _Etk_Cp_Property_Id +enum Etk_Colorpicker_Property_Id { - ETK_CP_COLOR_MODE_PROPERTY + ETK_CP_MODE_PROPERTY }; static void _etk_colorpicker_constructor(Etk_Colorpicker *cp); static void _etk_colorpicker_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); static void _etk_colorpicker_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); +static void _etk_colorpicker_size_request(Etk_Widget *widget, Etk_Size *size); +static void _etk_colorpicker_size_allocate(Etk_Widget *widget, Etk_Geometry geometry); + +static void _etk_colorpicker_realize_cb(Etk_Object *object, void *data); +static void _etk_colorpicker_unrealize_cb(Etk_Object *object, void *data); +static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data); + +static void _etk_colorpicker_sp_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_colorpicker_sp_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_colorpicker_sp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_colorpicker_vp_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_colorpicker_vp_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_colorpicker_vp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void _etk_colorpicker_sp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h); +static void _etk_colorpicker_vp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h); + +static void _etk_colorpicker_update(Etk_Colorpicker *cp, Etk_Bool sp_image, Etk_Bool sp_cursor, Etk_Bool vp_image, Etk_Bool vp_cursor); +static void _etk_colorpicker_sp_image_update(Etk_Colorpicker *cp); +static void _etk_colorpicker_sp_cursor_update(Etk_Colorpicker *cp); +static void _etk_colorpicker_vp_image_update(Etk_Colorpicker *cp); +static void _etk_colorpicker_vp_cursor_update(Etk_Colorpicker *cp); +static void _etk_colorpicker_sp_color_get(Etk_Colorpicker *cp, int i, int j, int *r, int *g, int *b); +static void _etk_colorpicker_vp_color_get(Etk_Colorpicker *cp, int i, int *r, int *g, int *b); +static void _etk_colorpicker_color_calc(Etk_Colorpicker_Mode mode, float sp_xpos, float sp_ypos, float vp_pos, int *r, int *g, int *b); +static Etk_Signal *_etk_colorpicker_signals[ETK_CP_NUM_SIGNALS]; -static void _etk_colorpicker_cps_cb(Etk_Object *object, void *data); -static void _etk_colorpicker_cpv_cb(Etk_Object *object, void *data); -static void _etk_colorpicker_radio_cb(Etk_Object *object, void *data); /************************** * @@ -46,7 +62,7 @@ /** * @brief Gets the type of an Etk_Colorpicker - * @return Returns the type on an Etk_Colorpicker + * @return Returns the type of an Etk_Colorpicker */ Etk_Type *etk_colorpicker_type_get() { @@ -54,10 +70,15 @@ if (!cp_type) { - cp_type = etk_type_new("Etk_Colorpicker", ETK_HBOX_TYPE, sizeof(Etk_Colorpicker), ETK_CONSTRUCTOR(_etk_colorpicker_constructor), NULL); - - etk_type_property_add(cp_type, "color_mode", ETK_CP_COLOR_MODE_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_COLOR_MODE_H)); - + cp_type = etk_type_new("Etk_Colorpicker", ETK_WIDGET_TYPE, sizeof(Etk_Colorpicker), + ETK_CONSTRUCTOR(_etk_colorpicker_constructor), NULL); + + _etk_colorpicker_signals[ETK_CP_COLOR_CHANGED_SIGNAL] = etk_signal_new("color_changed", + cp_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); + + etk_type_property_add(cp_type, "mode", ETK_CP_MODE_PROPERTY, + ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_COLORPICKER_H)); + cp_type->property_set = _etk_colorpicker_property_set; cp_type->property_get = _etk_colorpicker_property_get; } @@ -71,243 +92,105 @@ */ Etk_Widget *etk_colorpicker_new() { - return etk_widget_new(ETK_COLORPICKER_TYPE, NULL); + return etk_widget_new(ETK_COLORPICKER_TYPE, "theme_group", "colorpicker", NULL); } /** - * @brief Sets the color mode used by the colorpicker + * @brief Sets the current color mode of the colorpicker * @param cp a colorpicker - * @param color_mode the color mode to use + * @param mode the color mode to use */ -void etk_colorpicker_color_mode_set(Etk_Colorpicker *cp, Etk_Color_Mode color_mode) +void etk_colorpicker_mode_set(Etk_Colorpicker *cp, Etk_Colorpicker_Mode mode) { - if (!cp) + if (!cp || (cp->mode == mode)) return; - - if (cp->color_mode != color_mode) - { - Etk_Colorpicker_Square *cps; - Etk_Colorpicker_Vertical *cpv; - - cps = ETK_COLORPICKER_SQUARE(cp->cps); - cpv = ETK_COLORPICKER_VERTICAL(cp->cpv); - - cp->color_mode = color_mode; - cps->current_color = cp->color; - - switch (cp->color_mode) - { - case ETK_COLOR_MODE_H: - { - double h, s, v; - - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - cpv->cursor_pos = 255 - h * 2.55; - cps->cursor_y = 255 - s * 2.55; - cps->cursor_x = v * 2.55; - break; - } - case ETK_COLOR_MODE_S: - { - double h, s, v; - - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - cpv->cursor_pos = 255 - s * 2.55; - cps->cursor_y = 255 - h * 2.55; - cps->cursor_x = v * 2.55; - break; - } - case ETK_COLOR_MODE_V: - { - double h, s, v; - - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - cpv->cursor_pos = 255 - v * 2.55; - cps->cursor_y = 255 - h * 2.55; - cps->cursor_x = s * 2.55; - break; - } - case ETK_COLOR_MODE_R: - { - cpv->cursor_pos = 255 - cp->color.r; - cps->cursor_y = 255 - cp->color.g; - cps->cursor_x = cp->color.b; - break; - } - case ETK_COLOR_MODE_G: - { - cpv->cursor_pos = 255 - cp->color.g; - cps->cursor_y = 255 - cp->color.r; - cps->cursor_x = cp->color.b; - break; - } - case ETK_COLOR_MODE_B: - { - cpv->cursor_pos = 255 - cp->color.b; - cps->cursor_y = 255 - cp->color.r; - cps->cursor_x = cp->color.g; - break; - } - } - etk_colorpicker_vertical_color_mode_set(ETK_COLORPICKER_VERTICAL(cp->cpv), cp->color_mode); - etk_colorpicker_square_color_mode_set(ETK_COLORPICKER_SQUARE(cp->cps), cp->color_mode); - etk_object_notify(ETK_OBJECT(cp), "color_mode"); - } + + cp->mode = mode; + etk_colorpicker_current_color_set(cp, cp->current_color); + + etk_object_notify(ETK_OBJECT(cp), "mode"); } /** - * @brief Gets the color mode used by the colorpicker + * @brief Gets the current color mode of colorpicker * @param cp a colorpicker - * @return Returns the color mode used by the colorpicker + * @return Returns the current color mode of colorpicker */ -Etk_Color_Mode etk_colorpicker_color_mode_get(Etk_Colorpicker *cp) +Etk_Colorpicker_Mode etk_colorpicker_mode_get(Etk_Colorpicker *cp) { if (!cp) - return ETK_COLOR_MODE_H; - return cp->color_mode; + return ETK_COLORPICKER_H; + return cp->mode; } /** - * @brief Gets the color selected by the colorpicker + * @brief Gets the color currently selected by the colorpicker * @param cp a colorpicker * @return Returns the color selected by the colorpicker */ -Etk_Color etk_colorpicker_color_get(Etk_Colorpicker *cp) +Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp) { if (!cp) { Etk_Color black; - black.a = 0; black.r = 0; black.g = 0; black.b = 0; + black.a = 255; return black; } - return cp->color; -} - -/** - * @brief Converts from rgb to hsv - * @param color the rgb color - * @param h the location to store the h component of the result - * @param s the location to store the s component of the result - * @param v the location to store the v component of the result - */ -void etk_colorpicker_rgb_to_hsv(Etk_Color color, double *h, double *s, double *v) -{ - int min, max; - int delta; - max = (color.r + color.g + abs(color.r - color.g)) / 2; - max = (max + color.b + abs(max - color.b)) / 2; - min = (color.r + color.g - abs(color.r - color.g)) / 2; - min = (min + color.b - abs(min - color.b)) / 2; - - delta = max - min; - *v = (double)(100 * max) / 255.0; - - if (max != 0) - *s = (double)(100 * delta) / (double)max; - else - { - *s = 0.0; - *h = 0.0; - *v = 0.0; - } - if (color.r == max) - { - *h = (double)(100 * (color.g - color.b)) / (double)(6.0 * delta); - } - else - { - if (color.g == max) - *h = (double)(100 * (2 * delta + color.b - color.r)) / (double)(6.0 * delta); - else - *h = (double)(100 * (4 * delta + color.r - color.g)) / (double)(6.0 * delta); - } - if (*h < 0.0) - *h += 100.0; - if (*h > 100.0) - *h -= 100.0; + return cp->current_color; } -/** - * @brief Converts from hsv to rgb - * @param h the h component of the color to convert - * @param s the s component of the color to convert - * @param v the v component of the color to convert - * @param color the location to store the resulting rgb color - */ -void etk_colorpicker_hsv_to_rgb(double h, double s, double v, Etk_Color *color) +/* TODO: doc, signal */ +void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color) { - double hh, f; - double p, q, t; - int i; - - h = fabs(h); - s = fabs(s); - v = fabs(v); - - if (s == 0.0) - { - color->r = ETK_ROUND((v * 255.0) / 100.0); - color->g = ETK_ROUND((v * 255.0) / 100.0); - color->b = ETK_ROUND((v * 255.0) / 100.0); - return; - } + int r, g, b; + float h, s, v; - hh = (h * 6.0) / 100.0; - i = floor(hh); - f = hh - (double)i; + r = color.r; + g = color.g; + b = color.b; + evas_color_rgb_to_hsv(r, g, b, &h, &s, &v); - p = fabs(v * (1.0 - s / 100.0) / 100.0); - q = fabs(v * (1.0 - (s * f) / 100.0) / 100.0); - t = fabs(v * (1.0 - s * (1.0 - f) / 100.0) / 100.0); - switch (i) + switch (cp->mode) { - case 0: - { - color->r = ETK_ROUND(v * 255.0 / 100.0); - color->g = ETK_ROUND(t * 255.0); - color->b = ETK_ROUND(p * 255.0); + case ETK_COLORPICKER_H: + cp->sp_xpos = v; + cp->sp_ypos = s; + cp->vp_pos = h / 360.0; + break; + case ETK_COLORPICKER_S: + cp->sp_xpos = v; + cp->sp_ypos = h / 360.0; + cp->vp_pos = s; + break; + case ETK_COLORPICKER_V: + cp->sp_xpos = s; + cp->sp_ypos = h / 360.0; + cp->vp_pos = v; + break; + case ETK_COLORPICKER_R: + cp->sp_xpos = b / 255.0; + cp->sp_ypos = g / 255.0; + cp->vp_pos = r / 255.0; + break; + case ETK_COLORPICKER_G: + cp->sp_xpos = b / 255.0; + cp->sp_ypos = r / 255.0; + cp->vp_pos = g / 255.0; + break; + case ETK_COLORPICKER_B: + cp->sp_xpos = g / 255.0; + cp->sp_ypos = r / 255.0; + cp->vp_pos = b / 255.0; break; - } - case 1: - { - color->r = ETK_ROUND(q * 255.0); - color->g = ETK_ROUND(v * 255.0 / 100.0); - color->b = ETK_ROUND(p * 255.0); - break; - } - case 2: - { - color->r = ETK_ROUND(p * 255.0); - color->g = ETK_ROUND(v * 255.0 / 100.0); - color->b = ETK_ROUND(t * 255.0); - break; - } - case 3: - { - color->r = ETK_ROUND(p * 255.0); - color->g = ETK_ROUND(q * 255.0); - color->b = ETK_ROUND(v * 255.0 / 100.0); - break; - } - case 4: - { - color->r = ETK_ROUND(t * 255.0); - color->g = ETK_ROUND(p * 255.0); - color->b = ETK_ROUND(v * 255.0 / 100.0); - break; - } - case 5: - { - color->r = ETK_ROUND(v * 255.0 / 100.0); - color->g = ETK_ROUND(p * 255.0); - color->b = ETK_ROUND(q * 255.0); + default: break; - } } + + _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE); } /************************** @@ -316,61 +199,69 @@ * **************************/ -/* Initializes the members */ +/* Initializes the colorpicker */ static void _etk_colorpicker_constructor(Etk_Colorpicker *cp) { - Etk_Widget *widget; - Etk_Widget *vbox; - char *label[6] = {"H", "S", "V", "R", "G", "B"}; + Etk_Widget *cp_widget; + char *labels[6] = {"H", "S", "V", "R", "G", "B"}; int i; - if (!(widget = ETK_WIDGET(cp))) + if (!(cp_widget = ETK_WIDGET(cp))) return; - - cp->cps = NULL; - cp->cpv = NULL; - cp->color_mode = ETK_COLOR_MODE_H; - cp->color.r = 0; - cp->color.g = 0; - cp->color.b = 0; - etk_box_spacing_set(ETK_BOX(cp), 6); - - cp->cps = etk_colorpicker_square_new(64, 64); - if (cp->cps) - { - etk_widget_visibility_locked_set(cp->cps, ETK_TRUE); - etk_widget_size_request_set(cp->cps, 256, 256); - etk_box_pack_start(ETK_BOX(cp), cp->cps, ETK_FALSE, ETK_FALSE, 0); - etk_signal_connect("color_selected", ETK_OBJECT(cp->cps), ETK_CALLBACK(_etk_colorpicker_cps_cb), NULL); - etk_widget_show(cp->cps); - } - - cp->cpv = etk_colorpicker_vertical_new(1, 256); - if (cp->cpv) - { - etk_widget_visibility_locked_set(cp->cpv, ETK_TRUE); - etk_widget_size_request_set(cp->cpv, 16, 256); - etk_box_pack_start(ETK_BOX(cp), cp->cpv, ETK_FALSE, ETK_FALSE, 0); - etk_signal_connect("color_selected", ETK_OBJECT(cp->cpv), ETK_CALLBACK(_etk_colorpicker_cpv_cb), NULL); - etk_widget_show(cp->cpv); - } - - vbox = etk_vbox_new(0, ETK_TRUE); - etk_widget_visibility_locked_set(vbox, ETK_TRUE); - etk_box_pack_start(ETK_BOX(cp), vbox, ETK_FALSE, ETK_FALSE, 0); - etk_widget_show(vbox); + + cp->mode = ETK_COLORPICKER_H; + cp->current_color.r = 0; + cp->current_color.g = 0; + cp->current_color.b = 0; + cp->current_color.a = 255; + + cp->sp_image = NULL; + cp->sp_hcursor = NULL; + cp->sp_vcursor = NULL; + cp->sp_res = 64; + cp->sp_xpos = 0.0; + cp->sp_ypos = 0.0; + + cp->vp_image = NULL; + cp->vp_cursor = NULL; + cp->vp_res = 256; + cp->vp_pos = 0.0; + + cp->sp_dragging = ETK_FALSE; + cp->vp_dragging = ETK_FALSE; + cp->sp_image_needs_update = ETK_FALSE; + cp->sp_cursor_needs_update = ETK_FALSE; + cp->vp_image_needs_update = ETK_FALSE; + cp->vp_cursor_needs_update = ETK_FALSE; + + cp->radio_vbox = etk_vbox_new(0, ETK_TRUE); + etk_widget_parent_set(cp->radio_vbox, cp_widget); + etk_widget_visibility_locked_set(cp->radio_vbox, ETK_TRUE); + etk_widget_show(cp->radio_vbox); + for (i = 0; i < 6; i++) { - if (i == 0) - cp->radio[i] = etk_radio_button_new_with_label(label[i], NULL); - else - cp->radio[i] = etk_radio_button_new_with_label_from_widget(label[i], ETK_RADIO_BUTTON(cp->radio[0])); - etk_widget_visibility_locked_set(cp->radio[i], ETK_TRUE); - etk_box_pack_start(ETK_BOX(vbox), cp->radio[i], ETK_TRUE, ETK_TRUE, 0); - etk_widget_show(cp->radio[i]); + cp->radios[i] = etk_radio_button_new_with_label_from_widget(labels[i], + (i == 0) ? NULL : ETK_RADIO_BUTTON(cp->radios[0])); + etk_box_pack_start(ETK_BOX(cp->radio_vbox), cp->radios[i], ETK_TRUE, ETK_TRUE, 0); + etk_widget_visibility_locked_set(cp->radios[i], ETK_TRUE); + etk_widget_show(cp->radios[i]); - etk_signal_connect("pressed", ETK_OBJECT(cp->radio[i]), ETK_CALLBACK(_etk_colorpicker_radio_cb), &_etk_colorpicker_mode[i]); + etk_signal_connect("toggled", ETK_OBJECT(cp->radios[i]), + ETK_CALLBACK(_etk_colorpicker_radio_toggled_cb), cp); } + + cp_widget->size_request = _etk_colorpicker_size_request; + cp_widget->size_allocate = _etk_colorpicker_size_allocate; + + etk_signal_connect("realize", ETK_OBJECT(cp), ETK_CALLBACK(_etk_colorpicker_realize_cb), NULL); + etk_signal_connect("unrealize", ETK_OBJECT(cp), ETK_CALLBACK(_etk_colorpicker_unrealize_cb), NULL); + + Etk_Color test; + test.r = 161; + test.g = 177; + test.b = 0; + etk_colorpicker_current_color_set(cp, test); } /* Sets the property whose id is "property_id" to the value "value" */ @@ -383,8 +274,8 @@ switch (property_id) { - case ETK_CP_COLOR_MODE_PROPERTY: - etk_colorpicker_color_mode_set(cp, etk_property_value_int_get(value)); + case ETK_CP_MODE_PROPERTY: + etk_colorpicker_mode_set(cp, etk_property_value_int_get(value)); break; default: break; @@ -401,140 +292,490 @@ switch (property_id) { - case ETK_CP_COLOR_MODE_PROPERTY: - etk_property_value_int_set(value, cp->color_mode); + case ETK_CP_MODE_PROPERTY: + etk_property_value_int_set(value, cp->mode); break; default: break; } } -/* Called when a color is selected with the cps */ -static void _etk_colorpicker_cps_cb(Etk_Object *object, void *data) +/* Calculates the ideal size of the colorpicker */ +/* TODO: size_request */ +static void _etk_colorpicker_size_request(Etk_Widget *widget, Etk_Size *size) +{ + if (!size) + return; + + size->w = 480; + size->h = 200; +} + +/* Resizes the colorpicker to the allocated size */ +/* TODO: size_allocate */ +static void _etk_colorpicker_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Colorpicker *cp; + Etk_Geometry child_geometry; + + if (!(cp = ETK_COLORPICKER(widget))) + return; + + /* First, updates the data of the images if needed */ + if (cp->sp_image_needs_update) + _etk_colorpicker_sp_image_update(cp); + if (cp->sp_cursor_needs_update) + _etk_colorpicker_sp_cursor_update(cp); + if (cp->vp_image_needs_update) + _etk_colorpicker_vp_image_update(cp); + if (cp->vp_cursor_needs_update) + _etk_colorpicker_vp_cursor_update(cp); + + /* Then, moves and resizes the objects */ + _etk_colorpicker_sp_move_resize(cp, geometry.x, geometry.y, (geometry.w / 2) - 30, geometry.h); + _etk_colorpicker_vp_move_resize(cp, geometry.x + (geometry.w / 2) - 25, geometry.y, 20, geometry.h); + + child_geometry.x = geometry.x + (geometry.w / 2); + child_geometry.y = geometry.y; + child_geometry.w = geometry.w / 2; + child_geometry.h = geometry.h; + etk_widget_size_allocate(cp->radio_vbox, child_geometry); - cp = ETK_COLORPICKER(ETK_WIDGET(object)->parent); - cp->color = etk_colorpicker_square_color_get(ETK_COLORPICKER_SQUARE(object), ETK_COLORPICKER_SQUARE(object)->cursor_x, ETK_COLORPICKER_SQUARE(object)->cursor_y); + cp->sp_image_needs_update = ETK_FALSE; + cp->sp_cursor_needs_update = ETK_FALSE; + cp->vp_image_needs_update = ETK_FALSE; + cp->vp_cursor_needs_update = ETK_FALSE; } -/* Called when a color is selected with the cpv */ -static void _etk_colorpicker_cpv_cb(Etk_Object *object, void *data) +/************************** + * + * Callbacks and handlers + * + **************************/ + +/* Called when the colorpicker is realized */ +/* TODO: use smart objects! */ +static void _etk_colorpicker_realize_cb(Etk_Object *object, void *data) { Etk_Colorpicker *cp; - Etk_Colorpicker_Square *cps; - Etk_Colorpicker_Vertical *cpv; - Etk_Color color; + Evas *evas; + + if (!(cp = ETK_COLORPICKER(object)) || !(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(cp)))) + return; + + /* Square picker */ + cp->sp_image = evas_object_image_add(evas); + evas_object_image_alpha_set(cp->sp_image, 0); + evas_object_image_size_set(cp->sp_image, cp->sp_res, cp->sp_res); + evas_object_show(cp->sp_image); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_image); + + cp->sp_hcursor = evas_object_image_add(evas); + evas_object_image_alpha_set(cp->sp_hcursor, 0); + evas_object_image_size_set(cp->sp_hcursor, cp->sp_res, 1); + evas_object_pass_events_set(cp->sp_hcursor, 1); + evas_object_show(cp->sp_hcursor); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_hcursor); + + cp->sp_vcursor = evas_object_image_add(evas); + evas_object_image_alpha_set(cp->sp_vcursor, 0); + evas_object_image_size_set(cp->sp_vcursor, 1, cp->sp_res); + evas_object_pass_events_set(cp->sp_vcursor, 1); + evas_object_show(cp->sp_vcursor); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_vcursor); + + /* Vertical picker */ + cp->vp_image = evas_object_image_add(evas); + evas_object_image_alpha_set(cp->vp_image, 0); + evas_object_image_size_set(cp->vp_image, 1, cp->vp_res); + evas_object_show(cp->vp_image); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->vp_image); + + cp->vp_cursor = evas_object_image_add(evas); + evas_object_image_alpha_set(cp->vp_cursor, 0); + evas_object_image_size_set(cp->vp_cursor, 1, 1); + evas_object_pass_events_set(cp->vp_cursor, 1); + evas_object_show(cp->vp_cursor); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->vp_cursor); - cp = ETK_COLORPICKER(ETK_WIDGET(object)->parent); - cps = ETK_COLORPICKER_SQUARE(cp->cps); - cpv = ETK_COLORPICKER_VERTICAL(cp->cpv); + /* Adds the mouse callbacks */ + evas_object_event_callback_add(cp->sp_image, EVAS_CALLBACK_MOUSE_DOWN, _etk_colorpicker_sp_mouse_down_cb, cp); + evas_object_event_callback_add(cp->sp_image, EVAS_CALLBACK_MOUSE_UP, _etk_colorpicker_sp_mouse_up_cb, cp); + evas_object_event_callback_add(cp->sp_image, EVAS_CALLBACK_MOUSE_MOVE, _etk_colorpicker_sp_mouse_move_cb, cp); + evas_object_event_callback_add(cp->vp_image, EVAS_CALLBACK_MOUSE_DOWN, _etk_colorpicker_vp_mouse_down_cb, cp); + evas_object_event_callback_add(cp->vp_image, EVAS_CALLBACK_MOUSE_UP, _etk_colorpicker_vp_mouse_up_cb, cp); + evas_object_event_callback_add(cp->vp_image, EVAS_CALLBACK_MOUSE_MOVE, _etk_colorpicker_vp_mouse_move_cb, cp); + + /* Updates the colorpicker */ + _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE); +} - color = etk_colorpicker_vertical_color_get(cpv, cpv->cursor_pos); +/* Called when the colorpicker is unrealized */ +static void _etk_colorpicker_unrealize_cb(Etk_Object *object, void *data) +{ + Etk_Colorpicker *cp; + + if (!(cp = ETK_COLORPICKER(object))) + return; + + cp->sp_image = NULL; + cp->sp_hcursor = NULL; + cp->sp_vcursor = NULL; + cp->vp_image = NULL; + cp->vp_cursor = NULL; +} - switch (cp->color_mode) +/* Called when the color mode is changed with the radio buttons */ +static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data) +{ + Etk_Colorpicker *cp; + Etk_Widget *radio; + int i; + + if (!(radio = ETK_WIDGET(object)) || !(cp = ETK_COLORPICKER(data))) + return; + if (!etk_toggle_button_active_get(ETK_TOGGLE_BUTTON(radio))) + return; + + for (i = 0; i < 6; i++) { - case ETK_COLOR_MODE_H: + if (cp->radios[i] == radio) { - double h, s, v; - double h1, s1, v1; - - etk_colorpicker_rgb_to_hsv(cp->color, &h1, &s1, &v1); - etk_colorpicker_rgb_to_hsv(color, &h, &s, &v); - etk_colorpicker_hsv_to_rgb(h, s1, v1, &color); - if (cp->color.r != color.r || - cp->color.g != color.g || - cp->color.b != color.b) - { - cp->color = color; - cps->current_color = color; - } - break; + etk_colorpicker_mode_set(cp, i); + return; } - case ETK_COLOR_MODE_S: + } +} + +/* Called when the square picker is pressed by the mouse */ +static void _etk_colorpicker_sp_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + Evas_Event_Mouse_Down *event; + int x, y, w, h; + + if (!(cp = ETK_COLORPICKER(data)) || !(event = event_info)) + return; + + evas_object_geometry_get(cp->sp_image, &x, &y, &w, &h); + cp->sp_xpos = ETK_CLAMP((float)(event->canvas.x - x) / w, 0.0, 1.0); + cp->sp_ypos = 1.0 - ETK_CLAMP((float)(event->canvas.y - y) / h, 0.0, 1.0); + _etk_colorpicker_update(cp, ETK_FALSE, ETK_TRUE, ETK_FALSE, ETK_FALSE); + + cp->sp_dragging = ETK_TRUE; +} + +/* Called when the square picker is released by the mouse */ +static void _etk_colorpicker_sp_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + + if (!(cp = ETK_COLORPICKER(data))) + return; + cp->sp_dragging = ETK_FALSE; +} + +/* Called when the mouse is moved over the square picker */ +static void _etk_colorpicker_sp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + Evas_Event_Mouse_Move *event; + int x, y, w, h; + + if (!(cp = ETK_COLORPICKER(data)) || !(event = event_info) || !cp->sp_dragging) + return; + + evas_object_geometry_get(cp->sp_image, &x, &y, &w, &h); + cp->sp_xpos = ETK_CLAMP((float)(event->cur.canvas.x - x) / w, 0.0, 1.0); + cp->sp_ypos = 1.0 - ETK_CLAMP((float)(event->cur.canvas.y - y) / h, 0.0, 1.0); + _etk_colorpicker_update(cp, ETK_FALSE, ETK_TRUE, ETK_FALSE, ETK_FALSE); +} + +/* Called when the vertical picker is pressed by the mouse */ +static void _etk_colorpicker_vp_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + Evas_Event_Mouse_Down *event; + int y, h; + + if (!(cp = ETK_COLORPICKER(data)) || !(event = event_info)) + return; + + evas_object_geometry_get(cp->vp_image, NULL, &y, NULL, &h); + cp->vp_pos = 1.0 - ETK_CLAMP((float)(event->canvas.y - y) / h, 0.0, 1.0); + _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE); + + cp->vp_dragging = ETK_TRUE; +} + +/* Called when the vertical picker is released by the mouse */ +static void _etk_colorpicker_vp_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + + if (!(cp = ETK_COLORPICKER(data))) + return; + cp->vp_dragging = ETK_FALSE; +} + +/* Called when the mouse is moved over the vertical picker */ +static void _etk_colorpicker_vp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Colorpicker *cp; + Evas_Event_Mouse_Move *event; + int y, h; + + if (!(cp = ETK_COLORPICKER(data)) || !(event = event_info) || !cp->vp_dragging) + return; + + evas_object_geometry_get(cp->vp_image, NULL, &y, NULL, &h); + cp->vp_pos = 1.0 - ETK_CLAMP((float)(event->cur.canvas.y - y) / h, 0.0, 1.0); + _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE); +} + +/************************** + * + * Private functions + * + **************************/ + +/* Moves and resizes the square picker */ +static void _etk_colorpicker_sp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h) +{ + if (!cp || !cp->sp_image || !cp->sp_hcursor || !cp->sp_vcursor) + return; + + evas_object_move(cp->sp_image, x, y); + evas_object_resize(cp->sp_image, w, h); + evas_object_image_fill_set(cp->sp_image, 0, 0, w, h); + + evas_object_move(cp->sp_hcursor, x, y + ((1.0 - cp->sp_ypos) * h)); + evas_object_resize(cp->sp_hcursor, w, 1); + evas_object_image_fill_set(cp->sp_hcursor, 0, 0, w, 1); + + evas_object_move(cp->sp_vcursor, x + (cp->sp_xpos * w), y); + evas_object_resize(cp->sp_vcursor, 1, h); + evas_object_image_fill_set(cp->sp_vcursor, 0, 0, 1, h); +} + +/* Moves and resizes the vertical picker */ +static void _etk_colorpicker_vp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h) +{ + if (!cp || !cp->vp_image || !cp->vp_cursor) + return; + + evas_object_move(cp->vp_image, x, y); + evas_object_resize(cp->vp_image, w, h); + evas_object_image_fill_set(cp->vp_image, 0, 0, w, h); + + evas_object_move(cp->vp_cursor, x, y + ((1.0 - cp->vp_pos) * h)); + evas_object_resize(cp->vp_cursor, w, 1); + evas_object_image_fill_set(cp->vp_cursor, 0, 0, w, 1); +} + +/* Updates of the colorpicker */ +static void _etk_colorpicker_update(Etk_Colorpicker *cp, Etk_Bool sp_image, Etk_Bool sp_cursor, Etk_Bool vp_image, Etk_Bool vp_cursor) +{ + int r, g, b; + + if (!cp) + return; + + cp->sp_image_needs_update |= sp_image; + cp->sp_cursor_needs_update |= sp_cursor; + cp->vp_image_needs_update |= vp_image; + cp->vp_cursor_needs_update |= vp_cursor; + + /* Updates the color */ + _etk_colorpicker_color_calc(cp->mode, cp->sp_xpos, cp->sp_ypos, cp->vp_pos, &r, &g, &b); + if (cp->current_color.r != r || cp->current_color.g != g || cp->current_color.b != b) + { + cp->current_color.r = r; + cp->current_color.g = g; + cp->current_color.b = b; + etk_signal_emit(_etk_colorpicker_signals[ETK_CP_COLOR_CHANGED_SIGNAL], ETK_OBJECT(cp), NULL); + } + + etk_widget_redraw_queue(ETK_WIDGET(cp)); +} + +/* Updates the square picker image */ +static void _etk_colorpicker_sp_image_update(Etk_Colorpicker *cp) +{ + uint32_t *data; + int i, j; + int r, g, b; + + if (!cp || !cp->sp_image) + return; + if (!(data = (uint32_t *)evas_object_image_data_get(cp->sp_image, 1))) + return; + + for (i = 0; i < cp->sp_res; i++) + { + for (j = 0; j < cp->sp_res; j++) { - double h, s, v; - double h1, s1, v1; - - etk_colorpicker_rgb_to_hsv(cp->color, &h1, &s1, &v1); - etk_colorpicker_rgb_to_hsv(color, &h, &s, &v); - etk_colorpicker_hsv_to_rgb(h1, s, v1, &color); - if (cp->color.r != color.r || - cp->color.g != color.g || - cp->color.b != color.b) - { - cp->color = color; - cps->current_color = color; - } - break; + _etk_colorpicker_sp_color_get(cp, i, j, &r, &g, &b); + *data = ((r << 16) | (g << 8) | b); + data++; } - case ETK_COLOR_MODE_V: + } + + evas_object_image_data_update_add(cp->sp_image, 0, 0, cp->sp_res, cp->sp_res); +} + +/* Updates the cursor of the square picker */ +static void _etk_colorpicker_sp_cursor_update(Etk_Colorpicker *cp) +{ + uint32_t *data; + int i, j; + int r, g, b; + + if (!cp) + return; + + /* Updates the horizontal cursor */ + if (cp->sp_hcursor && (data = (uint32_t *)evas_object_image_data_get(cp->sp_hcursor, 1))) + { + j = cp->sp_res * (1.0 - cp->sp_ypos); + for (i = 0; i < cp->sp_res; i++) { - double h, s, v; - double h1, s1, v1; - - etk_colorpicker_rgb_to_hsv(cp->color, &h1, &s1, &v1); - etk_colorpicker_rgb_to_hsv(color, &h, &s, &v); - etk_colorpicker_hsv_to_rgb(h1, s1, v, &color); - if (cp->color.r != color.r || - cp->color.g != color.g || - cp->color.b != color.b) - { - cp->color = color; - cps->current_color = color; - } - break; + _etk_colorpicker_sp_color_get(cp, i, j, &r, &g, &b); + *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); + data++; } - case ETK_COLOR_MODE_R: + evas_object_image_data_update_add(cp->sp_hcursor, 0, 0, cp->sp_res, 1); + } + + /* Updates the vertical cursor */ + if (cp->sp_vcursor && (data = (uint32_t *)evas_object_image_data_get(cp->sp_vcursor, 1))) + { + i = cp->sp_res * cp->sp_xpos; + for (j = 0; j < cp->sp_res; j++) { - double h, s, v; - - if (cp->color.r != color.r) - { - cp->color.r = color.r; - cps->current_color.r = color.r; - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - } - break; + _etk_colorpicker_sp_color_get(cp, i, j, &r, &g, &b); + *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); + data++; } - case ETK_COLOR_MODE_G: - { - double h, s, v; - - if (cp->color.g != color.g) - { - cp->color.g = color.g; - cps->current_color.g = color.g; - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - } + evas_object_image_data_update_add(cp->sp_vcursor, 0, 0, 1, cp->sp_res); + } +} + +/* Updates the vertical picker image */ +static void _etk_colorpicker_vp_image_update(Etk_Colorpicker *cp) +{ + uint32_t *data; + int i; + int r, g, b; + + if (!cp || !cp->vp_image) + return; + if (!(data = (uint32_t *)evas_object_image_data_get(cp->vp_image, 1))) + return; + + for (i = 0; i < cp->vp_res; i++) + { + _etk_colorpicker_vp_color_get(cp, i, &r, &g, &b); + *data = ((r << 16) | (g << 8) | b); + data++; + } + + evas_object_image_data_update_add(cp->vp_image, 0, 0, 1, cp->vp_res); +} + +/* Updates the vertical picker cursor */ +static void _etk_colorpicker_vp_cursor_update(Etk_Colorpicker *cp) +{ + uint32_t *data; + int r, g, b; + + if (!cp || !cp->vp_cursor) + return; + if (!(data = (uint32_t *)evas_object_image_data_get(cp->vp_cursor, 1))) + return; + + _etk_colorpicker_vp_color_get(cp, cp->vp_res * (1.0 - cp->vp_pos), &r, &g, &b); + *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); + + evas_object_image_data_update_add(cp->vp_cursor, 0, 0, 1, 1); +} + +/* Get the color of the square picker's image, at the point (i, j). (r, g, b) must not be NULL! */ +static void _etk_colorpicker_sp_color_get(Etk_Colorpicker *cp, int i, int j, int *r, int *g, int *b) +{ + _etk_colorpicker_color_calc(cp->mode, 1.0 - ((float)i / cp->sp_res), (float)j / cp->sp_res, cp->vp_pos, r, g, b); +} + +/* Get the color of the vertical picker's image, at the point i. (r, g, b) must not be NULL! */ +static void _etk_colorpicker_vp_color_get(Etk_Colorpicker *cp, int i, int *r, int *g, int *b) +{ + switch (cp->mode) + { + case ETK_COLORPICKER_H: + evas_color_hsv_to_rgb(360.0 * (1.0 - ((float)i / cp->vp_res)), 1.0, 1.0, r, g, b); break; - } - case ETK_COLOR_MODE_B: - { - double h, s, v; - - if (cp->color.b != color.b) - { - cp->color.b = color.b; - cps->current_color.b = color.b; - etk_colorpicker_rgb_to_hsv(cp->color, &h, &s, &v); - } + case ETK_COLORPICKER_S: + *r = 255 - ((i * 255) / cp->vp_res); + *g = 255 - ((i * 255) / cp->vp_res); + *b = 255 - ((i * 255) / cp->vp_res); + break; + case ETK_COLORPICKER_V: + *r = 255 - ((i * 255) / cp->vp_res); + *g = 255 - ((i * 255) / cp->vp_res); + *b = 255 - ((i * 255) / cp->vp_res); + break; + case ETK_COLORPICKER_R: + *r = 255 - ((i * 255) / cp->vp_res); + *g = 0; + *b = 0; + break; + case ETK_COLORPICKER_G: + *r = 0; + *g = 255 - ((i * 255) / cp->vp_res); + *b = 0; + break; + case ETK_COLORPICKER_B: + *r = 0; + *g = 0; + *b = 255 - ((i * 255) / cp->vp_res); + break; + default: break; - } } - etk_colorpicker_square_update(cps); } -/* Called when the color mode is changed with the radio buttons */ -static void _etk_colorpicker_radio_cb(Etk_Object *object, void *data) +/* Calculates a color according to the color mode and the positions of the cursors */ +static void _etk_colorpicker_color_calc(Etk_Colorpicker_Mode mode, float sp_xpos, float sp_ypos, float vp_pos, int *r, int *g, int *b) { - Etk_Colorpicker *cp; - Etk_Widget *w; - Etk_Color_Mode color_mode = *(Etk_Color_Mode *)data; - - w = ETK_WIDGET(ETK_WIDGET(object)->parent); - cp = ETK_COLORPICKER(w->parent); - etk_colorpicker_color_mode_set(cp, color_mode); + switch (mode) + { + case ETK_COLORPICKER_H: + evas_color_hsv_to_rgb(vp_pos * 360.0, sp_xpos, sp_ypos, r, g, b); + break; + case ETK_COLORPICKER_S: + evas_color_hsv_to_rgb(sp_xpos * 360.0, vp_pos, sp_ypos, r, g, b); + break; + case ETK_COLORPICKER_V: + evas_color_hsv_to_rgb(sp_xpos * 360.0, sp_ypos, vp_pos, r, g, b); + break; + case ETK_COLORPICKER_R: + *r = 255 * vp_pos; + *g = 255 * sp_xpos; + *b = 255 * sp_ypos; + break; + case ETK_COLORPICKER_G: + *r = 255 * sp_xpos; + *g = 255 * vp_pos; + *b = 255 * sp_ypos; + break; + case ETK_COLORPICKER_B: + *r = 255 * sp_xpos; + *g = 255 * sp_ypos; + *b = 255 * vp_pos; + break; + default: + break; + } } /** @} */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_colorpicker.h 12 May 2006 19:13:39 -0000 1.3 +++ etk_colorpicker.h 16 May 2006 22:03:00 -0000 1.4 @@ -7,55 +7,73 @@ /** * @defgroup Etk_Colorpicker Etk_Colorpicker + * @brief TODO: doc * @{ */ -/** @brief Gets the type of a colorpicker */ +/** Gets the type of a colorpicker */ #define ETK_COLORPICKER_TYPE (etk_colorpicker_type_get()) -/** @brief Casts the object to a colorpicker */ +/** Casts the object to a colorpicker */ #define ETK_COLORPICKER(obj) (ETK_OBJECT_CAST((obj), ETK_COLORPICKER_TYPE, Etk_Colorpicker)) -/** @brief Check if the object is an Etk_Colorpicker */ +/** Check if the object is an Etk_Colorpicker */ #define ETK_IS_COLORPICKER(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_COLORPICKER_TYPE)) -/** - * @enum Etk_Color_Mode - * @brief The color modes used by the colorpicker - */ -enum _Etk_Color_Mode +/** @brief The color modes used by the colorpicker */ +typedef enum Etk_Colorpicker_Mode { - ETK_COLOR_MODE_H, - ETK_COLOR_MODE_S, - ETK_COLOR_MODE_V, - ETK_COLOR_MODE_R, - ETK_COLOR_MODE_G, - ETK_COLOR_MODE_B -}; + ETK_COLORPICKER_H, /**< The "Hue" mode */ + ETK_COLORPICKER_S, /**< The "Saturation" mode */ + ETK_COLORPICKER_V, /**< The "Value" mode */ + ETK_COLORPICKER_R, /**< The "Red" mode */ + ETK_COLORPICKER_G, /**< The "Green" mode */ + ETK_COLORPICKER_B /**< The "Blue" mode */ +} Etk_Colorpicker_Mode; -struct _Etk_Colorpicker +/** + * @brief @widget The structure of a colorpicker + * @structinfo + */ +struct Etk_Colorpicker { - Etk_HBox hbox; - - Etk_Widget *cps; - Etk_Widget *cpv; - Etk_Widget *radio[6]; - - Etk_Color_Mode color_mode; - - Etk_Color color; + /* private: */ + /* Inherit from Etk_Widget */ + Etk_Widget widget; + + /* Square picker */ + Evas_Object *sp_image; + Evas_Object *sp_hcursor; + Evas_Object *sp_vcursor; + int sp_res; + float sp_xpos, sp_ypos; + Etk_Bool sp_dragging; + Etk_Bool sp_image_needs_update; + Etk_Bool sp_cursor_needs_update; + + /* Vertical picker */ + Evas_Object *vp_image; + Evas_Object *vp_cursor; + int vp_res; + float vp_pos; + Etk_Bool vp_dragging; + Etk_Bool vp_image_needs_update; + Etk_Bool vp_cursor_needs_update; + + Etk_Widget *radio_vbox; + Etk_Widget *radios[6]; + + Etk_Colorpicker_Mode mode; + Etk_Color current_color; }; Etk_Type *etk_colorpicker_type_get(); Etk_Widget *etk_colorpicker_new(); -void etk_colorpicker_color_mode_set(Etk_Colorpicker *cp, Etk_Color_Mode color_mode); -Etk_Color_Mode etk_colorpicker_color_mode_get(Etk_Colorpicker *cp); - -Etk_Color etk_colorpicker_color_get(Etk_Colorpicker *cp); +void etk_colorpicker_mode_set(Etk_Colorpicker *cp, Etk_Colorpicker_Mode mode); +Etk_Colorpicker_Mode etk_colorpicker_mode_get(Etk_Colorpicker *cp); -void etk_colorpicker_rgb_to_hsv(Etk_Color color, double *h, double *s, double *v); -void etk_colorpicker_hsv_to_rgb(double h, double s, double v, Etk_Color *color); +void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color); +Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp); /** @} */ - -#endif /* __ETK_COLORPICKER_H__ */ +#endif =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_combobox.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_combobox.h 14 May 2006 14:14:58 -0000 1.9 +++ etk_combobox.h 16 May 2006 22:03:00 -0000 1.10 @@ -58,7 +58,7 @@ }; /** - * @brief An item of a combobox + * @brief @widget The structure of an item of a combobox * @structinfo */ struct Etk_Combobox_Item =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -3 -r1.39 -r1.40 --- etk_types.h 14 May 2006 21:29:22 -0000 1.39 +++ etk_types.h 16 May 2006 22:03:00 -0000 1.40 @@ -65,10 +65,7 @@ typedef struct _Etk_Entry Etk_Entry; typedef struct _Etk_Text_View Etk_Text_View; typedef struct Etk_Canvas Etk_Canvas; -typedef struct _Etk_Colorpicker Etk_Colorpicker; -typedef struct _Etk_Colorpicker_Vertical Etk_Colorpicker_Vertical; -typedef struct _Etk_Colorpicker_Square Etk_Colorpicker_Square; -typedef enum _Etk_Color_Mode Etk_Color_Mode; +typedef struct Etk_Colorpicker Etk_Colorpicker; typedef struct _Etk_Tree Etk_Tree; typedef enum _Etk_Tree_Mode Etk_Tree_Mode; typedef struct _Etk_Tree_Col Etk_Tree_Col; @@ -118,11 +115,14 @@ /** * @struct Etk_Color - * @brief A color + * @brief A RGBA color */ typedef struct Etk_Color { - int r, g, b, a; + int r; /**< The red component of the color */ + int g; /**< The green component of the color */ + int b; /**< The blue component of the color */ + int a; /**< The alpha component of the color */ } Etk_Color; /** @} */ |
From: Enlightenment C. <no...@cv...> - 2006-05-17 15:16:33
|
Enlightenment CVS committal Author : moom Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_colorpicker.c etk_colorpicker.h Log Message: * More work on the colorpicker =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- etk_colorpicker.c 16 May 2006 22:02:59 -0000 1.10 +++ etk_colorpicker.c 17 May 2006 15:15:08 -0000 1.11 @@ -2,16 +2,25 @@ #include "etk_colorpicker.h" #include <stdlib.h> #include <stdint.h> +#include <Edje.h> #include "etk_signal.h" #include "etk_signal_callback.h" #include "etk_utils.h" #include "etk_radio_button.h" +#include "etk_theme.h" /** * @addtogroup Etk_Colorpicker * @{ */ +typedef struct Etk_Colorpicker_Picker_Data +{ + Evas_List *objects; + Etk_Colorpicker *cp; + void (*move_resize)(Etk_Colorpicker *cp, int x, int y, int w, int h); +} Etk_Colorpicker_Picker_Data; + enum Etk_Combobox_Signal_Id { ETK_CP_COLOR_CHANGED_SIGNAL, @@ -40,8 +49,20 @@ static void _etk_colorpicker_vp_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _etk_colorpicker_vp_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Evas_Object *_etk_colorpicker_picker_object_add(Evas *evas, Etk_Colorpicker *cp, void (*move_resize)(Etk_Colorpicker *cp, int x, int y, int w, int h)); +static void _etk_colorpicker_picker_smart_add(Evas_Object *obj); +static void _etk_colorpicker_picker_smart_del(Evas_Object *obj); +static void _etk_colorpicker_picker_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void _etk_colorpicker_picker_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h); +static void _etk_colorpicker_picker_smart_show(Evas_Object *obj); +static void _etk_colorpicker_picker_smart_hide(Evas_Object *obj); +static void _etk_colorpicker_picker_smart_clip_set(Evas_Object *obj, Evas_Object *clip); +static void _etk_colorpicker_picker_smart_clip_unset(Evas_Object *obj); + static void _etk_colorpicker_sp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h); static void _etk_colorpicker_vp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h); +static void _etk_colorpicker_sp_cursor_move_resize(Etk_Colorpicker *cp); +static void _etk_colorpicker_vp_cursor_move_resize(Etk_Colorpicker *cp); static void _etk_colorpicker_update(Etk_Colorpicker *cp, Etk_Bool sp_image, Etk_Bool sp_cursor, Etk_Bool vp_image, Etk_Bool vp_cursor); static void _etk_colorpicker_sp_image_update(Etk_Colorpicker *cp); @@ -51,6 +72,9 @@ static void _etk_colorpicker_sp_color_get(Etk_Colorpicker *cp, int i, int j, int *r, int *g, int *b); static void _etk_colorpicker_vp_color_get(Etk_Colorpicker *cp, int i, int *r, int *g, int *b); static void _etk_colorpicker_color_calc(Etk_Colorpicker_Mode mode, float sp_xpos, float sp_ypos, float vp_pos, int *r, int *g, int *b); + +static Evas_Smart *_etk_colorpicker_picker_smart = NULL; +static int _etk_colorpicker_picker_smart_use = 0; static Etk_Signal *_etk_colorpicker_signals[ETK_CP_NUM_SIGNALS]; @@ -143,7 +167,7 @@ return cp->current_color; } -/* TODO: doc, signal */ +/* TODO: doc */ void etk_colorpicker_current_color_set(Etk_Colorpicker *cp, Etk_Color color) { int r, g, b; @@ -215,6 +239,9 @@ cp->current_color.b = 0; cp->current_color.a = 255; + cp->picker_theme_object = NULL; + + cp->sp_object = NULL; cp->sp_image = NULL; cp->sp_hcursor = NULL; cp->sp_vcursor = NULL; @@ -222,6 +249,7 @@ cp->sp_xpos = 0.0; cp->sp_ypos = 0.0; + cp->vp_object = NULL; cp->vp_image = NULL; cp->vp_cursor = NULL; cp->vp_res = 256; @@ -312,7 +340,6 @@ } /* Resizes the colorpicker to the allocated size */ -/* TODO: size_allocate */ static void _etk_colorpicker_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Colorpicker *cp; @@ -332,8 +359,10 @@ _etk_colorpicker_vp_cursor_update(cp); /* Then, moves and resizes the objects */ - _etk_colorpicker_sp_move_resize(cp, geometry.x, geometry.y, (geometry.w / 2) - 30, geometry.h); - _etk_colorpicker_vp_move_resize(cp, geometry.x + (geometry.w / 2) - 25, geometry.y, 20, geometry.h); + evas_object_move(cp->picker_theme_object, geometry.x, geometry.y); + evas_object_resize(cp->picker_theme_object, (geometry.w / 2) - 5, geometry.h); + _etk_colorpicker_sp_cursor_move_resize(cp); + _etk_colorpicker_vp_cursor_move_resize(cp); child_geometry.x = geometry.x + (geometry.w / 2); child_geometry.y = geometry.y; @@ -354,49 +383,59 @@ **************************/ /* Called when the colorpicker is realized */ -/* TODO: use smart objects! */ static void _etk_colorpicker_realize_cb(Etk_Object *object, void *data) { Etk_Colorpicker *cp; + Etk_Colorpicker_Picker_Data *picker_data; Evas *evas; if (!(cp = ETK_COLORPICKER(object)) || !(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(cp)))) return; - /* Square picker */ + /* Picker theme object */ + cp->picker_theme_object = etk_theme_object_load_from_parent(evas, ETK_WIDGET(cp), NULL, "picker"); + evas_object_show(cp->picker_theme_object); + etk_widget_member_object_add(ETK_WIDGET(cp), cp->picker_theme_object); + + /* Square picker objects */ + cp->sp_object = _etk_colorpicker_picker_object_add(evas, cp, _etk_colorpicker_sp_move_resize); + edje_object_part_swallow(cp->picker_theme_object, "square_picker", cp->sp_object); + picker_data = evas_object_smart_data_get(cp->sp_object); + cp->sp_image = evas_object_image_add(evas); evas_object_image_alpha_set(cp->sp_image, 0); evas_object_image_size_set(cp->sp_image, cp->sp_res, cp->sp_res); - evas_object_show(cp->sp_image); - etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_image); + picker_data->objects = evas_list_append(picker_data->objects, cp->sp_image); cp->sp_hcursor = evas_object_image_add(evas); evas_object_image_alpha_set(cp->sp_hcursor, 0); evas_object_image_size_set(cp->sp_hcursor, cp->sp_res, 1); evas_object_pass_events_set(cp->sp_hcursor, 1); - evas_object_show(cp->sp_hcursor); - etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_hcursor); + picker_data->objects = evas_list_append(picker_data->objects, cp->sp_hcursor); cp->sp_vcursor = evas_object_image_add(evas); evas_object_image_alpha_set(cp->sp_vcursor, 0); evas_object_image_size_set(cp->sp_vcursor, 1, cp->sp_res); evas_object_pass_events_set(cp->sp_vcursor, 1); - evas_object_show(cp->sp_vcursor); - etk_widget_member_object_add(ETK_WIDGET(cp), cp->sp_vcursor); + picker_data->objects = evas_list_append(picker_data->objects, cp->sp_vcursor); + + evas_object_show(cp->sp_object); + + /* Vertical picker objects */ + cp->vp_object = _etk_colorpicker_picker_object_add(evas, cp, _etk_colorpicker_vp_move_resize); + edje_object_part_swallow(cp->picker_theme_object, "vertical_picker", cp->vp_object); + picker_data = evas_object_smart_data_get(cp->vp_object); - /* Vertical picker */ cp->vp_image = evas_object_image_add(evas); evas_object_image_alpha_set(cp->vp_image, 0); evas_object_image_size_set(cp->vp_image, 1, cp->vp_res); - evas_object_show(cp->vp_image); - etk_widget_member_object_add(ETK_WIDGET(cp), cp->vp_image); + picker_data->objects = evas_list_append(picker_data->objects, cp->vp_image); - cp->vp_cursor = evas_object_image_add(evas); - evas_object_image_alpha_set(cp->vp_cursor, 0); - evas_object_image_size_set(cp->vp_cursor, 1, 1); + cp->vp_cursor = evas_object_rectangle_add(evas); evas_object_pass_events_set(cp->vp_cursor, 1); - evas_object_show(cp->vp_cursor); - etk_widget_member_object_add(ETK_WIDGET(cp), cp->vp_cursor); + picker_data->objects = evas_list_append(picker_data->objects, cp->vp_cursor); + + evas_object_show(cp->vp_object); /* Adds the mouse callbacks */ evas_object_event_callback_add(cp->sp_image, EVAS_CALLBACK_MOUSE_DOWN, _etk_colorpicker_sp_mouse_down_cb, cp); @@ -418,9 +457,11 @@ if (!(cp = ETK_COLORPICKER(object))) return; + cp->sp_object = NULL; cp->sp_image = NULL; cp->sp_hcursor = NULL; cp->sp_vcursor = NULL; + cp->vp_object = NULL; cp->vp_image = NULL; cp->vp_cursor = NULL; } @@ -535,6 +576,163 @@ /************************** * + * Colorpicker's smart object + * + **************************/ + +/* Creates a new picker object */ +static Evas_Object *_etk_colorpicker_picker_object_add(Evas *evas, Etk_Colorpicker *cp, void (*move_resize)(Etk_Colorpicker *cp, int x, int y, int w, int h)) +{ + Evas_Object *obj; + Etk_Colorpicker_Picker_Data *picker_data; + + if (!evas || !cp) + return NULL; + + if (!_etk_colorpicker_picker_smart) + { + _etk_colorpicker_picker_smart = evas_smart_new("Picker_Object", + _etk_colorpicker_picker_smart_add, + _etk_colorpicker_picker_smart_del, + NULL, + NULL, + NULL, + NULL, + NULL, + _etk_colorpicker_picker_smart_move, + _etk_colorpicker_picker_smart_resize, + _etk_colorpicker_picker_smart_show, + _etk_colorpicker_picker_smart_hide, + NULL, + _etk_colorpicker_picker_smart_clip_set, + _etk_colorpicker_picker_smart_clip_unset, + NULL); + } + /* TODO: _etk_colorpicker_picker_smart_use */ + _etk_colorpicker_picker_smart_use++; + + obj = evas_object_smart_add(evas, _etk_colorpicker_picker_smart); + picker_data = evas_object_smart_data_get(obj); + picker_data->cp = cp; + picker_data->move_resize = move_resize; + + return obj; +} + +/* Initializes the new picker object */ +static void _etk_colorpicker_picker_smart_add(Evas_Object *obj) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas *evas; + + if (!obj || !(evas = evas_object_evas_get(obj))) + return; + + picker_data = malloc(sizeof(Etk_Colorpicker_Picker_Data)); + picker_data->objects = NULL; + picker_data->cp = NULL; + picker_data->move_resize = NULL; + evas_object_smart_data_set(obj, picker_data); +} + +/* Destroys the picker object */ +static void _etk_colorpicker_picker_smart_del(Evas_Object *obj) +{ + Etk_Colorpicker_Picker_Data *picker_data; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + while (picker_data->objects) + { + evas_object_del(picker_data->objects->data); + picker_data->objects = evas_list_remove_list(picker_data->objects, picker_data->objects); + } + free(picker_data); +} + +/* Moves the picker object */ +static void _etk_colorpicker_picker_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_Coord w, h; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + if (picker_data->cp && picker_data->move_resize) + picker_data->move_resize(picker_data->cp, x, y, w, h); +} + +/* Resizes the picker object */ +static void _etk_colorpicker_picker_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_Coord x, y; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + if (picker_data->cp && picker_data->move_resize) + picker_data->move_resize(picker_data->cp, x, y, w, h); +} + +/* Shows the picker object */ +static void _etk_colorpicker_picker_smart_show(Evas_Object *obj) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_List *l; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + for (l = picker_data->objects; l; l = l->next) + evas_object_show(l->data); +} + +/* Hides the picker object */ +static void _etk_colorpicker_picker_smart_hide(Evas_Object *obj) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_List *l; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + for (l = picker_data->objects; l; l = l->next) + evas_object_hide(l->data); +} + +/* Sets the clip of the picker object */ +static void _etk_colorpicker_picker_smart_clip_set(Evas_Object *obj, Evas_Object *clip) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_List *l; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + for (l = picker_data->objects; l; l = l->next) + evas_object_clip_set(l->data, clip); +} + +/* Unsets the clip of the picker object */ +static void _etk_colorpicker_picker_smart_clip_unset(Evas_Object *obj) +{ + Etk_Colorpicker_Picker_Data *picker_data; + Evas_List *l; + + if (!obj || !(picker_data = evas_object_smart_data_get(obj))) + return; + + for (l = picker_data->objects; l; l = l->next) + evas_object_clip_unset(l->data); +} + +/************************** + * * Private functions * **************************/ @@ -542,35 +740,59 @@ /* Moves and resizes the square picker */ static void _etk_colorpicker_sp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h) { - if (!cp || !cp->sp_image || !cp->sp_hcursor || !cp->sp_vcursor) + if (!cp || !cp->sp_image) return; evas_object_move(cp->sp_image, x, y); evas_object_resize(cp->sp_image, w, h); evas_object_image_fill_set(cp->sp_image, 0, 0, w, h); - evas_object_move(cp->sp_hcursor, x, y + ((1.0 - cp->sp_ypos) * h)); - evas_object_resize(cp->sp_hcursor, w, 1); - evas_object_image_fill_set(cp->sp_hcursor, 0, 0, w, 1); - - evas_object_move(cp->sp_vcursor, x + (cp->sp_xpos * w), y); - evas_object_resize(cp->sp_vcursor, 1, h); - evas_object_image_fill_set(cp->sp_vcursor, 0, 0, 1, h); + _etk_colorpicker_sp_cursor_move_resize(cp); } /* Moves and resizes the vertical picker */ static void _etk_colorpicker_vp_move_resize(Etk_Colorpicker *cp, int x, int y, int w, int h) { - if (!cp || !cp->vp_image || !cp->vp_cursor) + if (!cp || !cp->vp_image) return; evas_object_move(cp->vp_image, x, y); evas_object_resize(cp->vp_image, w, h); evas_object_image_fill_set(cp->vp_image, 0, 0, w, h); - evas_object_move(cp->vp_cursor, x, y + ((1.0 - cp->vp_pos) * h)); + _etk_colorpicker_vp_cursor_move_resize(cp); +} + +/* Moves and resizes the cursor of the square picker to the correct position/size */ +static void _etk_colorpicker_sp_cursor_move_resize(Etk_Colorpicker *cp) +{ + int x, y, w, h; + + if (!cp || !cp->sp_image || !cp->sp_hcursor || !cp->sp_vcursor) + return; + + evas_object_geometry_get(cp->sp_image, &x, &y, &w, &h); + + evas_object_move(cp->sp_hcursor, x, y + ((1.0 - cp->sp_ypos) * (h - 1))); + evas_object_resize(cp->sp_hcursor, w, 1); + evas_object_image_fill_set(cp->sp_hcursor, 0, 0, w, 1); + + evas_object_move(cp->sp_vcursor, x + (cp->sp_xpos * (w - 1)), y); + evas_object_resize(cp->sp_vcursor, 1, h); + evas_object_image_fill_set(cp->sp_vcursor, 0, 0, 1, h); +} + +/* Moves and resizes the cursor of the vertical picker to the correct position/size */ +static void _etk_colorpicker_vp_cursor_move_resize(Etk_Colorpicker *cp) +{ + int x, y, w, h; + + if (!cp || !cp->vp_image || !cp->vp_cursor) + return; + + evas_object_geometry_get(cp->vp_image, &x, &y, &w, &h); + evas_object_move(cp->vp_cursor, x, y + ((1.0 - cp->vp_pos) * (h - 1))); evas_object_resize(cp->vp_cursor, w, 1); - evas_object_image_fill_set(cp->vp_cursor, 0, 0, w, 1); } /* Updates of the colorpicker */ @@ -640,7 +862,7 @@ j = cp->sp_res * (1.0 - cp->sp_ypos); for (i = 0; i < cp->sp_res; i++) { - _etk_colorpicker_sp_color_get(cp, i, j, &r, &g, &b); + _etk_colorpicker_sp_color_get(cp, j, i, &r, &g, &b); *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); data++; } @@ -653,7 +875,7 @@ i = cp->sp_res * cp->sp_xpos; for (j = 0; j < cp->sp_res; j++) { - _etk_colorpicker_sp_color_get(cp, i, j, &r, &g, &b); + _etk_colorpicker_sp_color_get(cp, j, i, &r, &g, &b); *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); data++; } @@ -686,18 +908,13 @@ /* Updates the vertical picker cursor */ static void _etk_colorpicker_vp_cursor_update(Etk_Colorpicker *cp) { - uint32_t *data; int r, g, b; if (!cp || !cp->vp_cursor) return; - if (!(data = (uint32_t *)evas_object_image_data_get(cp->vp_cursor, 1))) - return; _etk_colorpicker_vp_color_get(cp, cp->vp_res * (1.0 - cp->vp_pos), &r, &g, &b); - *data = (((255 - r) << 16) | ((255 - g) << 8) | (255 - b)); - - evas_object_image_data_update_add(cp->vp_cursor, 0, 0, 1, 1); + evas_object_color_set(cp->vp_cursor, 255 - r, 255 - g, 255 - b, 255); } /* Get the color of the square picker's image, at the point (i, j). (r, g, b) must not be NULL! */ =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_colorpicker.h 16 May 2006 22:03:00 -0000 1.4 +++ etk_colorpicker.h 17 May 2006 15:15:08 -0000 1.5 @@ -3,6 +3,7 @@ #define __ETK_COLORPICKER_H__ #include "etk_box.h" +#include <Evas.h> #include "etk_types.h" /** @@ -39,7 +40,10 @@ /* Inherit from Etk_Widget */ Etk_Widget widget; + Evas_Object *picker_theme_object; + /* Square picker */ + Evas_Object *sp_object; Evas_Object *sp_image; Evas_Object *sp_hcursor; Evas_Object *sp_vcursor; @@ -50,6 +54,7 @@ Etk_Bool sp_cursor_needs_update; /* Vertical picker */ + Evas_Object *vp_object; Evas_Object *vp_image; Evas_Object *vp_cursor; int vp_res; |