Enlightenment CVS committal Author : moom16 Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c etk_tree_model.c etk_tree_model.h Log Message: * Add the checkbox tree model: the cells of a tree can now contain a checkbox =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -3 -r1.27 -r1.28 --- etk_tree.c 15 Jan 2006 11:07:16 -0000 1.27 +++ etk_tree.c 22 Jan 2006 16:31:57 -0000 1.28 @@ -66,6 +66,12 @@ ETK_TREE_ROW_HEIGHT_PROPERTY }; +enum _Etk_Tree_Col_Signal_Id +{ + ETK_TREE_COL_CELL_VALUE_CHANGED, + ETK_TREE_COL_NUM_SIGNALS +}; + enum _Etk_Tree_Col_Property_Id { ETK_TREE_COL_TITLE_PROPERTY, @@ -114,6 +120,7 @@ static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *first_row, Evas_List **items_objects, int x, int w, int h, int xoffset, int yoffset, int first_row_id, int first_row_color); static Etk_Tree_Row *_etk_tree_row_new_valist(Etk_Tree *tree, Etk_Tree_Row *row, va_list args); +static void _etk_tree_row_fields_set_valist_full(Etk_Tree_Row *row, va_list args, Etk_Bool emit_value_changed_signal); static Etk_Tree_Row_Objects *_etk_tree_row_objects_new(Etk_Tree *tree); static void _etk_tree_row_objects_free(Etk_Tree_Row_Objects *row_objects, Etk_Tree *tree); static void _etk_tree_row_free(Etk_Tree_Row *row); @@ -127,6 +134,7 @@ static void _etk_tree_heapify(Etk_Tree *tree, Etk_Tree_Row **heap, int root, int size, int (*compare_cb)(Etk_Tree *tree, Etk_Tree_Row *row1, Etk_Tree_Row *row2, Etk_Tree_Col *col, void *data), int asc, Etk_Tree_Col *col, void *data); static Etk_Signal *_etk_tree_signals[ETK_TREE_NUM_SIGNALS]; +static Etk_Signal *_etk_tree_col_signals[ETK_TREE_COL_NUM_SIGNALS]; /************************** * @@ -186,6 +194,8 @@ { tree_col_type = etk_type_new("Etk_Tree_Col", ETK_OBJECT_TYPE, sizeof(Etk_Tree_Col), ETK_CONSTRUCTOR(_etk_tree_col_constructor), ETK_DESTRUCTOR(_etk_tree_col_destructor)); + _etk_tree_col_signals[ETK_TREE_COL_CELL_VALUE_CHANGED] = etk_signal_new("cell_value_changed", tree_col_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); + etk_type_property_add(tree_col_type, "title", ETK_TREE_COL_TITLE_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); etk_type_property_add(tree_col_type, "width", ETK_TREE_COL_WIDTH_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_TREE_MIN_HEADER_WIDTH)); etk_type_property_add(tree_col_type, "min_width", ETK_TREE_COL_MIN_WIDTH_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(-1)); @@ -215,8 +225,13 @@ Etk_Tree_Col *new_col; Etk_Widget *new_header; - if (!tree) + if (!tree || !model) + return NULL; + if (model->col) + { + ETK_WARNING("The tree model to use for that column is already used for another column"); return NULL; + } tree->columns = realloc(tree->columns, sizeof(Etk_Tree_Col *) * (tree->num_cols + 1)); new_col = ETK_TREE_COL(etk_object_new(ETK_TREE_COL_TYPE, "title", title, "width", width, "visible", ETK_TRUE, "resizable", ETK_TRUE, NULL)); @@ -227,6 +242,7 @@ etk_object_notify(ETK_OBJECT(new_col), "place"); new_col->tree = tree; new_col->model = model; + new_col->model->col = new_col; /* Creates the header widget */ new_header = etk_widget_new(ETK_BUTTON_TYPE, "theme_group", "tree_header", "label", title, "xalign", 0.0, "repeat_events", ETK_TRUE, "visibility_locked", ETK_TRUE, NULL); @@ -987,24 +1003,9 @@ */ void etk_tree_row_fields_set_valist(Etk_Tree_Row *row, va_list args) { - Etk_Tree_Col *col; - va_list args2; - - if (!row) - return; - - va_copy(args2, args); - while ((col = va_arg(args2, Etk_Tree_Col *))) - { - if (col->model->cell_data_set) - col->model->cell_data_set(col->model, row->cells_data[col->id], &args2); - } - va_end(args2); - - if (!row->tree->frozen) - etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); + _etk_tree_row_fields_set_valist_full(row, args, ETK_TRUE); } - + /** * @brief Gets the different values of the cells of the row * @param row a row @@ -2235,7 +2236,7 @@ geometry.y = item_y + tree->cell_margins[2]; geometry.w = tree->columns[j]->visible_width - tree->cell_margins[0] - tree->cell_margins[1]; geometry.h = tree->row_height - tree->cell_margins[2] - tree->cell_margins[3]; - tree->columns[j]->model->render(tree->columns[j]->model, geometry, row->cells_data[j], row_objects->cells_objects[j].objects); + tree->columns[j]->model->render(tree->columns[j]->model, row, geometry, row->cells_data[j], row_objects->cells_objects[j].objects); } i++; } @@ -2279,7 +2280,7 @@ if (tree->columns[i]->model->cell_data_init) tree->columns[i]->model->cell_data_init(tree->columns[i]->model, new_row->cells_data[i]); } - etk_tree_row_fields_set_valist(new_row, args); + _etk_tree_row_fields_set_valist_full(new_row, args, ETK_FALSE); for (r = new_row->parent; r; r = r->parent) { @@ -2306,6 +2307,31 @@ return new_row; } +/* Sets the different values of the cells of the row */ +static void _etk_tree_row_fields_set_valist_full(Etk_Tree_Row *row, va_list args, Etk_Bool emit_value_changed_signal) +{ + Etk_Tree_Col *col; + va_list args2; + + if (!row) + return; + + va_copy(args2, args); + while ((col = va_arg(args2, Etk_Tree_Col *))) + { + if (col->model->cell_data_set) + { + col->model->cell_data_set(col->model, row->cells_data[col->id], &args2); + if (emit_value_changed_signal) + etk_signal_emit(_etk_tree_col_signals[ETK_TREE_COL_CELL_VALUE_CHANGED], ETK_OBJECT(col), NULL, row); + } + } + va_end(args2); + + if (!row->tree->frozen) + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); +} + /* Creates the evas objects needed by a row */ static Etk_Tree_Row_Objects *_etk_tree_row_objects_new(Etk_Tree *tree) { =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree_model.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_tree_model.c 15 Jan 2006 11:07:17 -0000 1.4 +++ etk_tree_model.c 22 Jan 2006 16:31:57 -0000 1.5 @@ -37,27 +37,33 @@ static void etk_tree_model_text_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_text_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_text_objects_create(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas); -static void etk_tree_model_text_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_text_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); /* Int model */ static void etk_tree_model_int_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_int_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); -static void etk_tree_model_int_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_int_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); /* Double model */ static void etk_tree_model_double_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_double_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); -static void etk_tree_model_double_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_double_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); /* Image model */ static void etk_tree_model_image_cell_data_free(Etk_Tree_Model *model, void *cell_data); static void etk_tree_model_image_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_image_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_image_objects_create(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas); -static void etk_tree_model_image_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_image_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); /* Icon Text model */ static void etk_tree_model_icon_text_cell_data_free(Etk_Tree_Model *model, void *cell_data); static void etk_tree_model_icon_text_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_icon_text_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); static void etk_tree_model_icon_text_objects_create(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas); -static void etk_tree_model_icon_text_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_icon_text_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +/* Checkbox model */ +static void etk_tree_model_checkbox_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args); +static void etk_tree_model_checkbox_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args); +static void etk_tree_model_checkbox_objects_create(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas); +static void etk_tree_model_checkbox_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); +static void etk_tree_model_checkbox_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); /** * @brief Creates a model of column whose cells contain a text @@ -191,6 +197,30 @@ } /** + * @brief Creates a model of column whose cells contain a checkbox + * @param tree a tree + * @return Returns the new model + * @note You don't need to free it with etk_tree_model_free() if you use it in a tree. It will be freed when the tree is destroyed + */ +Etk_Tree_Model *etk_tree_model_checkbox_new(Etk_Tree *tree) +{ + Etk_Tree_Model *tree_model; + + tree_model = calloc(1, sizeof(Etk_Tree_Model)); + + tree_model->tree = tree; + tree_model->xalign = 0.5; + tree_model->yalign = 0.5; + tree_model->cell_data_size = sizeof(Etk_Bool); + tree_model->cell_data_set = etk_tree_model_checkbox_cell_data_set; + tree_model->cell_data_get = etk_tree_model_checkbox_cell_data_get; + tree_model->objects_create = etk_tree_model_checkbox_objects_create; + tree_model->render = etk_tree_model_checkbox_render; + + return tree_model; +} + +/** * @brief Frees a tree model. Usually, you don't need to call it, it's automatically called when the tree is destroyed * @param model the model to free */ @@ -320,7 +350,7 @@ } /* Text: Render */ -static void etk_tree_model_text_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +static void etk_tree_model_text_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) { char **text_data; Evas_Coord tw, th; @@ -362,7 +392,7 @@ } /* Int: render */ -static void etk_tree_model_int_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +static void etk_tree_model_int_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) { int *int_data; char string[256]; @@ -406,7 +436,7 @@ } /* Double: render */ -static void etk_tree_model_double_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +static void etk_tree_model_double_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) { double *double_data; char string[256]; @@ -517,7 +547,7 @@ } /* Image: render */ -static void etk_tree_model_image_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +static void etk_tree_model_image_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) { Etk_Tree_Model_Image_Data *image_data; int image_width = 0, image_height = 0; @@ -692,7 +722,7 @@ } /* Icon Text: render */ -static void etk_tree_model_icon_text_render(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +static void etk_tree_model_icon_text_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) { Etk_Tree_Model_Icon_Text_Data *icon_text_data; int model_icon_width; @@ -780,3 +810,87 @@ evas_object_move(cell_objects[1], geometry.x + icon_offset + (geometry.w - icon_offset - tw) * model->xalign, geometry.y + (geometry.h - th) * model->yalign); evas_object_show(cell_objects[1]); } + +/*--------------------- + * Checkbox Model + *-------------------*/ + +/* Checkbox: cell_data_set */ +static void etk_tree_model_checkbox_cell_data_set(Etk_Tree_Model *model, void *cell_data, va_list *args) +{ + Etk_Bool *checked; + + if (!(checked = cell_data) || !args) + return; + *checked = va_arg(*args, int); +} + +/* Checkbox: cell_data_get */ +static void etk_tree_model_checkbox_cell_data_get(Etk_Tree_Model *model, void *cell_data, va_list *args) +{ + Etk_Bool *checked; + Etk_Bool *return_location; + + if (!(checked = cell_data) || !args) + return; + + return_location = va_arg(*args, Etk_Bool *); + if (return_location) + *return_location = *checked; +} + +/* TODO */ +#include "etk_theme.h" + +/* Checkbox: objects_create */ +static void etk_tree_model_checkbox_objects_create(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas) +{ + if (!cell_objects || !evas) + return; + + /* TODO */ + cell_objects[0] = edje_object_add(evas); + edje_object_file_set(cell_objects[0], etk_theme_widget_theme_get(), "tree_checkbox"); + evas_object_event_callback_add(cell_objects[0], EVAS_CALLBACK_MOUSE_UP, etk_tree_model_checkbox_clicked_cb, model); +} + +/* Checkbox: Render */ +static void etk_tree_model_checkbox_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects) +{ + Etk_Bool *checked; + Evas_Coord w, h; + + if (!(checked = cell_data)) + return; + + if (*checked) + edje_object_signal_emit(cell_objects[0], "activated", ""); + else + edje_object_signal_emit(cell_objects[0], "deactivated", ""); + + evas_object_data_set(cell_objects[0], "_Etk_Tree_Model_Checkbox::Row", row); + edje_object_size_min_get(cell_objects[0], &w, &h); + evas_object_move(cell_objects[0], geometry.x + (geometry.w - w) * model->xalign, geometry.y + (geometry.h - h) * model->yalign); + evas_object_resize(cell_objects[0], w, h); + evas_object_show(cell_objects[0]); +} + +/* Called when the checkbox is released by the mouse */ +static void etk_tree_model_checkbox_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Tree_Model *model; + Etk_Tree_Row *row; + Evas_Event_Mouse_Up *event; + Evas_Coord ox, oy, ow, oh; + Etk_Bool checked; + + if (!(model = data) || !model->col || !(event = event_info) || !(row = evas_object_data_get(obj, "_Etk_Tree_Model_Checkbox::Row"))) + return; + + evas_object_geometry_get(obj, &ox, &oy, &ow, &oh); + if (event->canvas.x >= ox && event->canvas.x <= ox + ow && event->canvas.y >= oy && event->canvas.y <= oy + oh) + { + etk_tree_row_fields_get(row, model->col, &checked, NULL); + etk_tree_row_fields_set(row, model->col, !checked, NULL); + } +} =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree_model.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_tree_model.h 19 Dec 2005 13:30:32 -0000 1.2 +++ etk_tree_model.h 22 Jan 2006 16:31:57 -0000 1.3 @@ -28,6 +28,7 @@ struct _Etk_Tree_Model { Etk_Tree *tree; + Etk_Tree_Col *col; int cell_data_size; float xalign; float yalign; @@ -38,8 +39,7 @@ void (*cell_data_set)(Etk_Tree_Model *model, void *cell_data, va_list *args); void (*cell_data_get)(Etk_Tree_Model *model, void *cell_data, va_list *args); void (*objects_create)(Etk_Tree_Model *model, Evas_Object **cell_objects, Evas *evas); - void (*pre_render)(Etk_Tree_Model *model, void *cell_data); - void (*render)(Etk_Tree_Model *model, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); + void (*render)(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object **cell_objects); void (*ideal_size_calc)(Etk_Tree_Model *model, void *cell_data, int *w, int *h); }; @@ -48,6 +48,7 @@ Etk_Tree_Model *etk_tree_model_double_new(Etk_Tree *tree); Etk_Tree_Model *etk_tree_model_image_new(Etk_Tree *tree, Etk_Tree_Model_Image_Type image_type); Etk_Tree_Model *etk_tree_model_icon_text_new(Etk_Tree *tree, Etk_Tree_Model_Image_Type icon_type); +Etk_Tree_Model *etk_tree_model_checkbox_new(Etk_Tree *tree); void etk_tree_model_free(Etk_Tree_Model *model); void etk_tree_model_alignement_set(Etk_Tree_Model *model, float xalign, float yalign); ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs