Enlightenment CVS committal
Author : moom16
Project : e17
Module : proto
Dir : e17/proto/etk/src/lib
Modified Files:
Etk.h Makefile.am etk_menu.c etk_menu.h etk_menu_item.c
etk_menu_item.h etk_menu_shell.c etk_menu_shell.h
etk_radio_button.c etk_toggle_button.c etk_toggle_button.h
etk_tree.c etk_tree_model.c etk_types.h etk_widget.c
Added Files:
etk_combobox.c etk_combobox.h etk_menu_window.c
etk_menu_window.h
Log Message:
* The menus have been rewritten: you can now have check and radio items. There also has been an API breakage: etk_menu_item_imageèset now requires an Etk_Menu_Item_Image and not an Etk_Menu_Item anymore
* The toggle/check/radio buttons has been rewritten
* Some fixes/cleanup
* The combobox widget has been started
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Etk.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -3 -r1.24 -r1.25
--- Etk.h 1 Mar 2006 23:51:21 -0000 1.24
+++ Etk.h 4 Mar 2006 23:29:47 -0000 1.25
@@ -53,9 +53,11 @@
#include "etk_scrollbar.h"
#include "etk_separator.h"
#include "etk_menu_shell.h"
+#include "etk_menu_window.h"
#include "etk_menu.h"
#include "etk_menu_bar.h"
#include "etk_menu_item.h"
+#include "etk_combobox.h"
#include "etk_statusbar.h"
#include "etk_filechooser_widget.h"
#include "etk_notebook.h"
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Makefile.am,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -3 -r1.28 -r1.29
--- Makefile.am 1 Mar 2006 23:51:21 -0000 1.28
+++ Makefile.am 4 Mar 2006 23:29:47 -0000 1.29
@@ -38,7 +38,9 @@
etk_tree.h etk_tree_model.h \
etk_range.h etk_slider.h etk_scrollbar.h \
etk_separator.h \
+etk_menu_window.h \
etk_menu_shell.h etk_menu.h etk_menu_bar.h etk_menu_item.h \
+etk_combobox.h \
etk_statusbar.h \
etk_filechooser_widget.h \
etk_notebook.h \
@@ -73,7 +75,9 @@
etk_tree.c etk_tree_model.c \
etk_range.c etk_slider.c etk_scrollbar.c \
etk_separator.c \
+etk_menu_window.c \
etk_menu_shell.c etk_menu.c etk_menu_bar.c etk_menu_item.c \
+etk_combobox.c \
etk_statusbar.c \
etk_filechooser_widget.c \
etk_notebook.c \
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- etk_menu.c 11 Feb 2006 16:33:38 -0000 1.8
+++ etk_menu.c 4 Mar 2006 23:29:47 -0000 1.9
@@ -1,9 +1,7 @@
/** @file etk_menu.c */
#include "etk_menu.h"
#include <stdlib.h>
-#include <Ecore.h>
-#include <Ecore_X.h>
-#include "etk_window.h"
+#include "etk_menu_window.h"
#include "etk_menu_item.h"
#include "etk_utils.h"
#include "etk_signal.h"
@@ -14,26 +12,21 @@
* @{
*/
-#define ETK_MENU_MIN_POP_TIME 400
-
-typedef enum _Etk_Menu_Screen_Edge
+enum _Etk_Menu_Signal_Id
{
- ETK_MENU_NO_EDGE = 0,
- ETK_MENU_LEFT_EDGE = (1 << 0),
- ETK_MENU_RIGHT_EDGE = (1 << 1),
- ETK_MENU_BOTTOM_EDGE = (1 << 2),
- ETK_MENU_TOP_EDGE = (1 << 3)
-} Etk_Menu_Screen_Edge;
+ ETK_MENU_POPPED_DOWN_SIGNAL,
+ ETK_MENU_POPPED_UP_SIGNAL,
+ ETK_MENU_NUM_SIGNALS
+};
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_allocate(Etk_Widget *widget, Etk_Geometry geometry);
-static void _etk_menu_items_update(Etk_Menu_Shell *menu_shell);
+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);
static void _etk_menu_item_added_cb(Etk_Object *object, void *item, void *data);
static void _etk_menu_item_removed_cb(Etk_Object *object, void *item, void *data);
-static int _etk_menu_mouse_up_cb(void *data, int type, void *event);
-static int _etk_menu_mouse_move_cb(void *data, int type, void *event);
static void _etk_menu_item_enter_cb(Etk_Object *object, void *data);
static void _etk_menu_item_leave_cb(Etk_Object *object, void *data);
static void _etk_menu_item_mouse_up_cb(Etk_Object *object, void *event, void *data);
@@ -41,20 +34,7 @@
static void _etk_menu_item_deselected_cb(Etk_Object *object, void *data);
static void _etk_menu_item_activated_cb(Etk_Object *object, void *data);
-static Etk_Menu_Screen_Edge _etk_menu_over_screen_edge(Etk_Menu *menu);
-static Etk_Menu_Screen_Edge _etk_menu_mouse_on_screen_edge();
-static void _etk_menu_slide_timer_update(Etk_Menu *menu);
-static int _etk_menu_slide_timer_cb(void *data);
-
-static Ecore_X_Window _etk_menu_input_window = 0;
-static Etk_Menu *_etk_menu_root = NULL;
-static Evas_List *_etk_menu_popped_menus = NULL;
-static Ecore_Event_Handler *_etk_menu_mouse_up_handler = NULL;
-static Ecore_Event_Handler *_etk_menu_mouse_move_handler = NULL;
-static int _etk_menu_root_popup_timestamp = 0;
-static int _etk_menu_mouse_x = -100000;
-static int _etk_menu_mouse_y = -100000;
-static Ecore_Timer *_etk_menu_slide_timer = NULL;
+static Etk_Signal *_etk_menu_signals[ETK_MENU_NUM_SIGNALS];
/**************************
*
@@ -71,7 +51,12 @@
static Etk_Type *menu_type = NULL;
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));
+
+ _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;
}
@@ -95,39 +80,7 @@
{
if (!menu)
return;
-
- if (_etk_menu_input_window == 0)
- {
- Ecore_X_Window root, parent;
- int root_x, root_y, root_w, root_h;
-
- root = menu->window->x_window;
- while ((parent = ecore_x_window_parent_get(root)) != 0)
- root = parent;
-
- ecore_x_window_geometry_get(root, &root_x, &root_y, &root_w, &root_h);
- _etk_menu_input_window = ecore_x_window_input_new(root, root_x, root_y, root_w, root_h);
- }
- if (!_etk_menu_root)
- {
- _etk_menu_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _etk_menu_mouse_up_cb, menu);
- _etk_menu_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _etk_menu_mouse_move_cb, menu);
- ecore_x_window_show(_etk_menu_input_window);
- ecore_x_keyboard_grab(_etk_menu_input_window);
- /* TODO: fixme pointer_grab!!
- ecore_x_pointer_grab(_etk_menu_input_window); */
-
- _etk_menu_root_popup_timestamp = ecore_x_current_time_get();
- _etk_menu_root = menu;
- }
- etk_window_move(menu->window, x, y);
- etk_widget_show(ETK_WIDGET(menu->window));
- etk_widget_show(ETK_WIDGET(menu));
- evas_event_feed_mouse_move(ETK_TOPLEVEL_WIDGET(menu->window)->evas, -100000, -100000, ecore_x_current_time_get(), NULL);
- evas_event_feed_mouse_in(ETK_TOPLEVEL_WIDGET(menu->window)->evas, ecore_x_current_time_get(), NULL);
- _etk_menu_popped_menus = evas_list_append(_etk_menu_popped_menus, menu);
-
- _etk_menu_slide_timer_update(menu);
+ etk_menu_window_popup_at_xy(menu->window, x, y);
}
/**
@@ -136,10 +89,9 @@
*/
void etk_menu_popup(Etk_Menu *menu)
{
- int x, y;
-
- ecore_x_pointer_last_xy_get(&x, &y);
- etk_menu_popup_at_xy(menu, x + 1, y + 1);
+ if (!menu)
+ return;
+ etk_menu_window_popup(menu->window);
}
/**
@@ -148,30 +100,16 @@
*/
void etk_menu_popdown(Etk_Menu *menu)
{
- Evas_List *l, *menu_list;
-
- if (!menu || !(menu_list = evas_list_find_list(_etk_menu_popped_menus, menu)))
+ if (!menu)
return;
-
- for (l = ETK_MENU_SHELL(menu)->items; l; l = l->next)
+ etk_menu_window_popdown(menu->window);
+
+ /* TODO: popdown */
+ /*for (l = ETK_MENU_SHELL(menu)->items; l; l = l->next)
etk_menu_item_deselect(ETK_MENU_ITEM(l->data));
-
- etk_widget_hide(ETK_WIDGET(menu->window));
- if (menu == _etk_menu_root)
- {
- ecore_x_keyboard_ungrab();
- /* TODO: pointer grab, fixme!!
- ecore_x_pointer_ungrab(); */
- ecore_x_window_hide(_etk_menu_input_window);
- ecore_event_handler_del(_etk_menu_mouse_up_handler);
- ecore_event_handler_del(_etk_menu_mouse_move_handler);
- _etk_menu_root = NULL;
- }
if (ETK_MENU_SHELL(menu)->parent)
- etk_signal_emit_by_name("submenu_popped_down", ETK_OBJECT(ETK_MENU_SHELL(menu)->parent), NULL);
-
- _etk_menu_popped_menus = evas_list_remove_list(_etk_menu_popped_menus, menu_list);
+ etk_signal_emit_by_name("submenu_popped_down", ETK_OBJECT(ETK_MENU_SHELL(menu)->parent), NULL);*/
}
/**************************
@@ -186,15 +124,13 @@
if (!menu)
return;
- menu->window = ETK_WINDOW(etk_widget_new(ETK_WINDOW_TYPE, NULL));
- etk_window_decorated_set(menu->window, ETK_FALSE);
- etk_window_skip_taskbar_hint_set(menu->window, ETK_TRUE);
- etk_window_skip_pager_hint_set(menu->window, ETK_TRUE);
+ menu->window = ETK_MENU_WINDOW(etk_widget_new(ETK_MENU_WINDOW_TYPE, NULL));
+ etk_signal_connect("popped_up", ETK_OBJECT(menu->window), ETK_CALLBACK(_etk_menu_window_popped_up_cb), menu);
+ etk_signal_connect("popped_down", ETK_OBJECT(menu->window), ETK_CALLBACK(_etk_menu_window_popped_down_cb), menu);
etk_container_add(ETK_CONTAINER(menu->window), ETK_WIDGET(menu));
ETK_WIDGET(menu)->size_request = _etk_menu_size_request;
ETK_WIDGET(menu)->size_allocate = _etk_menu_size_allocate;
- ETK_MENU_SHELL(menu)->items_update = _etk_menu_items_update;
etk_signal_connect("item_added", ETK_OBJECT(menu), ETK_CALLBACK(_etk_menu_item_added_cb), NULL);
etk_signal_connect("item_removed", ETK_OBJECT(menu), ETK_CALLBACK(_etk_menu_item_removed_cb), NULL);
@@ -228,6 +164,8 @@
size_requisition->w = ETK_MAX(size_requisition->w, child_requisition.w);
size_requisition->h += child_requisition.h;
}
+ /* TODO: Fixme: size request */
+ size_requisition->w += 15;
}
/* Resizes the menu to the size allocation */
@@ -236,62 +174,87 @@
Etk_Geometry child_geometry;
Etk_Menu_Shell *menu_shell;
Evas_List *l;
+ Etk_Menu_Item *item;
int y_offset;
+ Etk_Bool items_have_left_widget = ETK_FALSE;
+ Etk_Bool items_have_submenu = ETK_FALSE;
if (!(menu_shell = ETK_MENU_SHELL(widget)))
return;
+ for (l = menu_shell->items; l; l = l->next)
+ {
+ item = ETK_MENU_ITEM(l->data);
+ if (item->left_widget)
+ items_have_left_widget = ETK_TRUE;
+ if (item->submenu)
+ items_have_submenu = ETK_TRUE;
+ }
+
+ for (l = menu_shell->items; l; l = l->next)
+ {
+ item = ETK_MENU_ITEM(l->data);
+
+ if (items_have_submenu)
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(item), item->submenu ? "arrow_show" : "arrow_spacer");
+ 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");
+ }
+
y_offset = geometry.y;
child_geometry.x = geometry.x;
for (l = menu_shell->items; l; l = l->next)
{
Etk_Size child_requisition;
- etk_widget_size_request(ETK_WIDGET(l->data), &child_requisition);
+ item = ETK_MENU_ITEM(l->data);
+ etk_widget_size_request(ETK_WIDGET(item), &child_requisition);
child_geometry.y = y_offset;
child_geometry.w = geometry.w;
child_geometry.h = child_requisition.h;
- etk_widget_size_allocate(ETK_WIDGET(l->data), child_geometry);
+ etk_widget_size_allocate(ETK_WIDGET(item), child_geometry);
y_offset += child_requisition.h;
}
}
-/* Updates the items */
-static void _etk_menu_items_update(Etk_Menu_Shell *menu_shell)
+/**************************
+ *
+ * Callbacks and handlers
+ *
+ **************************/
+
+/* Called when the menu window is popped up */
+static void _etk_menu_window_popped_up_cb(Etk_Object *object, void *data)
+{
+ Etk_Widget *menu_widget;
+
+ if (!(menu_widget = ETK_WIDGET(data)))
+ return;
+
+ etk_widget_show(menu_widget);
+ etk_signal_emit(_etk_menu_signals[ETK_MENU_POPPED_UP_SIGNAL], ETK_OBJECT(menu_widget), NULL);
+}
+
+/* Called when the menu window is popped down */
+static void _etk_menu_window_popped_down_cb(Etk_Object *object, void *data)
{
- Etk_Menu *menu;
Evas_List *l;
- Etk_Bool items_has_image = ETK_FALSE;
- Etk_Bool items_has_right_element = ETK_FALSE;
- Etk_Menu_Item *i;
+ Etk_Menu_Shell *menu_shell;
- if (!(menu = ETK_MENU(menu_shell)))
+ if (!(menu_shell = ETK_MENU_SHELL(data)))
return;
-
- for (l = menu_shell->items; l; l = l->next)
- {
- i = ETK_MENU_ITEM(l->data);
-
- if (i->image)
- items_has_image = ETK_TRUE;
- if (i->submenu)
- items_has_right_element = ETK_TRUE;
- }
for (l = menu_shell->items; l; l = l->next)
- etk_menu_item_image_show(ETK_MENU_ITEM(l->data), items_has_image);
+ etk_menu_item_deselect(ETK_MENU_ITEM(l->data));
- for (l = menu_shell->items; l; l = l->next)
- etk_menu_item_right_swallow_show(ETK_MENU_ITEM(l->data), items_has_right_element);
+ etk_signal_emit(_etk_menu_signals[ETK_MENU_POPPED_DOWN_SIGNAL], ETK_OBJECT(menu_shell), NULL);
+ if (menu_shell->parent)
+ etk_signal_emit_by_name("submenu_popped_down", ETK_OBJECT(menu_shell->parent), NULL);
}
-/**************************
- *
- * Callbacks and handlers
- *
- **************************/
-
/* Called when an item is added to the menu */
static void _etk_menu_item_added_cb(Etk_Object *object, void *item, void *data)
{
@@ -306,7 +269,6 @@
etk_signal_connect("selected", item_object, ETK_CALLBACK(_etk_menu_item_selected_cb), NULL);
etk_signal_connect("deselected", item_object, ETK_CALLBACK(_etk_menu_item_deselected_cb), NULL);
etk_signal_connect("activated", item_object, ETK_CALLBACK(_etk_menu_item_activated_cb), NULL);
- etk_menu_shell_update(ETK_MENU_SHELL(object));
}
/* Called when an item is removed from the menu */
@@ -323,73 +285,6 @@
etk_signal_disconnect("selected", item_object, ETK_CALLBACK(_etk_menu_item_selected_cb));
etk_signal_disconnect("deselected", item_object, ETK_CALLBACK(_etk_menu_item_deselected_cb));
etk_signal_disconnect("activated", item_object, ETK_CALLBACK(_etk_menu_item_activated_cb));
- etk_menu_shell_update(ETK_MENU_SHELL(object));
-}
-
-/*
- * Called when the user clicks on the menu input window:
- * it pops down the menus if needed and feeds the mouse up event to the menu window
- */
-static int _etk_menu_mouse_up_cb(void *data, int type, void *event)
-{
- Etk_Menu *menu, *m;
- Evas_List *l;
- Ecore_X_Event_Mouse_Button_Up *mouse_event;
- Etk_Bool pointer_over_menu = ETK_FALSE;
-
- if (!(menu = ETK_MENU(data)) || !(mouse_event = event) || mouse_event->win != _etk_menu_input_window)
- return 1;
-
- /* If the user clicks on a popped menu window, we feed the event */
- for (l = _etk_menu_popped_menus; l; l = l->next)
- {
- int mx, my, mw, mh;
-
- m = ETK_MENU(l->data);
- etk_window_geometry_get(m->window, &mx, &my, &mw, &mh);
- if (_etk_menu_mouse_x >= mx && _etk_menu_mouse_x <= mx + mw && _etk_menu_mouse_y >= my && _etk_menu_mouse_y <= my + mh)
- {
- pointer_over_menu = ETK_TRUE;
- evas_event_feed_mouse_up(ETK_TOPLEVEL_WIDGET(m->window)->evas, mouse_event->button, EVAS_BUTTON_NONE, mouse_event->time, NULL);
- if (!_etk_menu_popped_menus)
- break;
- }
- }
- /* Otherwize, we pop down the menu root and all its children */
- if (!pointer_over_menu && (mouse_event->time - _etk_menu_root_popup_timestamp) >= ETK_MENU_MIN_POP_TIME)
- etk_menu_popdown(_etk_menu_root);
-
- return 1;
-}
-
-/*
- * Called when the user moves the mouse above the menu input window:
- * It feeds the mouse move, in and out events to the menu windows and starts to make the menu windows slide if needed
- */
-static int _etk_menu_mouse_move_cb(void *data, int type, void *event)
-{
- Etk_Menu *menu, *m;
- Evas_List *l;
- Ecore_X_Event_Mouse_Move *mouse_event;
- int mx, my;
-
- if (!(menu = ETK_MENU(data)) || !(mouse_event = event) || mouse_event->win != _etk_menu_input_window)
- return 1;
-
- _etk_menu_mouse_x = mouse_event->x;
- _etk_menu_mouse_y = mouse_event->y;
-
- for (l = _etk_menu_popped_menus; l; l = l->next)
- {
- m = ETK_MENU(l->data);
- etk_window_geometry_get(m->window, &mx, &my, NULL, NULL);
- evas_event_feed_mouse_move(ETK_TOPLEVEL_WIDGET(m->window)->evas, mouse_event->x - mx, mouse_event->y - my, mouse_event->time, NULL);
-
- /* Start to make the menu window slide if needed */
- _etk_menu_slide_timer_update(m);
- }
-
- return 1;
}
/* Called when the mouse pointer enters the item */
@@ -442,7 +337,7 @@
int mx, my, mw, item_y;
item_y = ETK_WIDGET(item)->geometry.y;
- etk_window_geometry_get(menu->window, &mx, &my, &mw, NULL);
+ etk_window_geometry_get(ETK_WINDOW(menu->window), &mx, &my, &mw, NULL);
etk_menu_popup_at_xy(item->submenu, mx + mw, my + item_y);
}
}
@@ -459,162 +354,10 @@
etk_menu_popdown(item->submenu);
}
-
/* Called when the item is activated */
static void _etk_menu_item_activated_cb(Etk_Object *object, void *data)
{
- Etk_Menu_Item *item;
-
- if (!(item = ETK_MENU_ITEM(object)))
- return;
- etk_menu_popdown(_etk_menu_root);
-}
-
-/**************************
- *
- * Private functions
- *
- **************************/
-
-/* Returns a flag incating on which edges of the screen the menu is over */
-static Etk_Menu_Screen_Edge _etk_menu_over_screen_edge(Etk_Menu *menu)
-{
- int rx, ry, rw, rh;
- int mx, my, mw, mh;
- Etk_Menu_Screen_Edge result = ETK_MENU_NO_EDGE;
-
- if (!menu || _etk_menu_input_window == 0)
- return ETK_MENU_NO_EDGE;
-
- ecore_x_window_geometry_get(_etk_menu_input_window, &rx, &ry, &rw, &rh);
- etk_window_geometry_get(menu->window, &mx, &my, &mw, &mh);
-
- if (mx < rx)
- result |= ETK_MENU_LEFT_EDGE;
- if (mx + mw > rx + rw)
- result |= ETK_MENU_RIGHT_EDGE;
- if (my < ry)
- result |= ETK_MENU_TOP_EDGE;
- if (my + mh > ry + rh)
- result |= ETK_MENU_BOTTOM_EDGE;
-
- return result;
-}
-
-/* Returns a flag incating on which edges of the screen the mouse pointer is */
-static Etk_Menu_Screen_Edge _etk_menu_mouse_on_screen_edge()
-{
- int rx, ry, rw, rh;
- Etk_Menu_Screen_Edge result = ETK_MENU_NO_EDGE;
-
- if (_etk_menu_input_window == 0)
- return ETK_MENU_NO_EDGE;
-
- ecore_x_window_geometry_get(_etk_menu_input_window, &rx, &ry, &rw, &rh);
- if (_etk_menu_mouse_x - rx + 1 >= rw)
- result |= ETK_MENU_RIGHT_EDGE;
- if (_etk_menu_mouse_x <= rx)
- result |= ETK_MENU_LEFT_EDGE;
- if (_etk_menu_mouse_y - ry + 1 >= rh)
- result |= ETK_MENU_BOTTOM_EDGE;
- if (_etk_menu_mouse_y <= ry)
- result |= ETK_MENU_TOP_EDGE;
-
- return result;
-}
-
-/* Starts the slide timer if needed */
-static void _etk_menu_slide_timer_update(Etk_Menu *menu)
-{
- Etk_Menu_Screen_Edge mouse_on_edge, menu_over_edge;
-
- if (!menu)
- return;
-
- mouse_on_edge = _etk_menu_mouse_on_screen_edge();
- menu_over_edge = _etk_menu_over_screen_edge(menu);
- if (!_etk_menu_slide_timer && (mouse_on_edge & menu_over_edge) != ETK_MENU_NO_EDGE)
- _etk_menu_slide_timer = ecore_timer_add(1.0 / 60.0, _etk_menu_slide_timer_cb, NULL);
-}
-
-/* Makes the menu slide (called every 1/60 sec) */
-static int _etk_menu_slide_timer_cb(void *data)
-{
- Etk_Menu *menu = NULL, *m;
- Evas_List *l;
- Etk_Menu_Screen_Edge mouse_edge, menu_edge;
- int rx, ry, rw, rh;
- int mx, my, mw, mh;
- int x, y;
- int dx = 0, dy = 0, max_delta = (int)(1.0 / 60.0 * 800);
-
- /* TODO: FIXME */
- /* We first look for the menu that is over an edge of the screen */
- for (l = _etk_menu_popped_menus; l; l = l->next)
- {
- m = ETK_MENU(l->data);
- if ((menu_edge = _etk_menu_over_screen_edge(m)) != ETK_MENU_NO_EDGE)
- {
- menu = m;
- break;
- }
- }
- if (!menu)
- {
- _etk_menu_slide_timer = NULL;
- return 0;
- }
-
- /* Then we move all the menu windows in the right direction */
- mouse_edge = _etk_menu_mouse_on_screen_edge();
- ecore_x_window_geometry_get(_etk_menu_input_window, &rx, &ry, &rw, &rh);
- etk_window_geometry_get(menu->window, &mx, &my, &mw, &mh);
- if (mouse_edge & menu_edge & ETK_MENU_LEFT_EDGE)
- {
- if (max_delta < rx - mx)
- dx = max_delta;
- else
- dx = rx - mx;
- }
- if (mouse_edge & menu_edge & ETK_MENU_RIGHT_EDGE)
- {
- if (max_delta < mw - rx - rw + mx)
- dx = -max_delta;
- else
- dx = -mw + rx + rw - mx;
- }
- if (mouse_edge & menu_edge & ETK_MENU_TOP_EDGE)
- {
- if (max_delta < ry - my)
- dy = max_delta;
- else
- dy = ry - my;
- }
- if (mouse_edge & menu_edge & ETK_MENU_BOTTOM_EDGE)
- {
- if (max_delta < mh - ry - rh + my)
- dy = -max_delta;
- else
- dy = -mh + ry + rh - my;
- }
-
- if (dx == 0 && dy == 0)
- {
- _etk_menu_slide_timer = NULL;
- return 0;
- }
-
- for (l = _etk_menu_popped_menus; l; l = l->next)
- {
- m = ETK_MENU(l->data);
- etk_window_geometry_get(m->window, &x, &y, NULL, NULL);
- etk_window_move(m->window, x + dx, y + dy);
-
- /* We feed a mouse move event since the relative position between the mouse pointer and the menu window has changed */
- evas_event_feed_mouse_move(ETK_TOPLEVEL_WIDGET(m->window)->evas, _etk_menu_mouse_x - x, _etk_menu_mouse_y - y, ecore_x_current_time_get(), NULL);
- }
-
- return 1;
+ etk_menu_window_popdown_all();
}
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- etk_menu.h 13 Nov 2005 12:04:05 -0000 1.2
+++ etk_menu.h 4 Mar 2006 23:29:47 -0000 1.3
@@ -17,13 +17,14 @@
/** @brief Check if the object is an Etk_Menu */
#define ETK_IS_MENU(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_TYPE))
+/* TODO: doc */
struct _Etk_Menu
{
/* private: */
/* Inherit from Etk_Menu_Shell */
Etk_Menu_Shell menu_shell;
- Etk_Window *window;
+ Etk_Menu_Window *window;
};
Etk_Type *etk_menu_type_get();
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu_item.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- etk_menu_item.c 11 Feb 2006 00:28:33 -0000 1.7
+++ etk_menu_item.c 4 Mar 2006 23:29:47 -0000 1.8
@@ -21,23 +21,46 @@
ETK_MENU_ITEM_NUM_SIGNALS
};
+enum _Etk_Menu_Item_Check_Signal_Id
+{
+ ETK_MENU_ITEM_CHECK_TOGGLED_SIGNAL,
+ ETK_MENU_ITEM_CHECK_NUM_SIGNALS
+};
+
enum _Etk_Menu_Item_Property_Id
{
- ETK_MENU_ITEM_LABEL_PROPERTY
+ ETK_MENU_ITEM_LABEL_PROPERTY,
+ ETK_MENU_ITEM_IMAGE_PROPERTY,
+ ETK_MENU_ITEM_ACTIVE_PROPERTY,
+ ETK_MENU_ITEM_GROUP_PROPERTY
};
static void _etk_menu_item_constructor(Etk_Menu_Item *menu_item);
static void _etk_menu_item_destructor(Etk_Menu_Item *menu_item);
+static void _etk_menu_item_check_constructor(Etk_Menu_Item_Check *check_item);
+static void _etk_menu_item_radio_constructor(Etk_Menu_Item_Radio *radio_item);
+static void _etk_menu_item_radio_destructor(Etk_Menu_Item_Radio *radio_item);
static void _etk_menu_item_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
static void _etk_menu_item_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_image_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_image_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_check_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_check_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_radio_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
+static void _etk_menu_item_radio_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
static void _etk_menu_item_realize_cb(Etk_Object *object, void *data);
-static void _etk_menu_item_image_realize_cb(Etk_Object *object, void *data);
-static void _etk_menu_item_right_widget_realize_cb(Etk_Object *object, void *data);
+static void _etk_menu_item_left_widget_realize_cb(Etk_Object *object, void *data);
+static void _etk_menu_item_check_left_widget_realize_cb(Etk_Object *object, void *data);
+static void _etk_menu_item_check_activated_cb(Etk_Object *object, void *data);
static void _etk_menu_item_selected_handler(Etk_Menu_Item *menu_item);
static void _etk_menu_item_deselected_handler(Etk_Menu_Item *menu_item);
static void _etk_menu_item_activated_handler(Etk_Menu_Item *menu_item);
+static void _etk_menu_item_check_toggled_handler(Etk_Menu_Item_Check *check_item);
+static void _etk_menu_item_check_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active);
+static void _etk_menu_item_radio_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active);
static Etk_Signal *_etk_menu_item_signals[ETK_MENU_ITEM_NUM_SIGNALS];
+static Etk_Signal *_etk_menu_item_check_signals[ETK_MENU_ITEM_CHECK_TOGGLED_SIGNAL];
/**************************
*
@@ -66,7 +89,7 @@
_etk_menu_item_signals[ETK_MENU_ITEM_ACTIVATED_SIGNAL] = etk_signal_new("activated", menu_item_type, ETK_MEMBER_OFFSET(Etk_Menu_Item, activated), etk_marshaller_VOID__VOID, NULL, NULL);
_etk_menu_item_signals[ETK_MENU_ITEM_SUBMENU_POPPED_DOWN_SIGNAL] = etk_signal_new("submenu_popped_down", menu_item_type, -1, etk_marshaller_VOID__VOID, NULL, NULL);
- etk_type_property_add(menu_item_type, "label", ETK_MENU_ITEM_LABEL_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL));
+ etk_type_property_add(menu_item_type, "label", ETK_MENU_ITEM_LABEL_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL));
menu_item_type->property_set = _etk_menu_item_property_set;
menu_item_type->property_get = _etk_menu_item_property_get;
@@ -78,6 +101,7 @@
/**
* @brief Creates a new menu item
* @return Returns the new menu item widget
+ * @note Unlike the other widgets, you don't need to call etk_widget_shown, the widget is automatically shown at its creation
*/
Etk_Widget *etk_menu_item_new()
{
@@ -88,6 +112,7 @@
* @brief Creates a new menu item with a label
* @param label the label to set to the new menu item
* @return Returns the new menu item widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
*/
Etk_Widget *etk_menu_item_new_with_label(const char *label)
{
@@ -132,6 +157,30 @@
}
/**
+ * @brief Sets the submenu of the menu item: the submenu will be popped up when the menu item is activated
+ * @param menu_item a menu item
+ * @param submenu the submenu to set
+ */
+void etk_menu_item_submenu_set(Etk_Menu_Item *menu_item, Etk_Menu *submenu)
+{
+ if (!menu_item)
+ return;
+
+ if (menu_item->submenu)
+ ETK_MENU_SHELL(menu_item->submenu)->parent = NULL;
+ menu_item->submenu = submenu;
+ if (menu_item->submenu)
+ ETK_MENU_SHELL(menu_item->submenu)->parent = menu_item;
+
+ if (menu_item->submenu)
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "arrow_show");
+ else if (!menu_item->submenu)
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "arrow_hide");
+
+ etk_widget_size_recalc_queue(ETK_WIDGET(menu_item));
+}
+
+/**
* @brief Selects the menu item
* @param menu_item a menu_item
*/
@@ -168,56 +217,97 @@
etk_signal_emit(_etk_menu_item_signals[ETK_MENU_ITEM_ACTIVATED_SIGNAL], ETK_OBJECT(menu_item), NULL);
}
+/**************************
+ * Menu Item Separator
+ **************************/
+
/**
- * @brief Sets the submenu of the menu item: the submenu will be popped up when the menu item is activated
- * @param menu_item a menu item
- * @param submenu the submenu to set
+ * @brief Gets the type of an Etk_Menu_Item_Separator
+ * @return Returns the type on an Etk_Menu_Item_Separator
*/
-void etk_menu_item_submenu_set(Etk_Menu_Item *menu_item, Etk_Menu *submenu)
+Etk_Type *etk_menu_item_separator_type_get()
{
- if (!menu_item)
- return;
- menu_item->submenu = submenu;
- if (menu_item->submenu)
- ETK_MENU_SHELL(menu_item->submenu)->parent = menu_item;
-
- if (menu_item->submenu && !menu_item->right_widget)
- {
- menu_item->right_widget = etk_widget_new(ETK_WIDGET_TYPE, "theme_group", "menu_arrow", NULL);
- /* TODO: disconnect */
- etk_signal_connect("realize", ETK_OBJECT(menu_item->right_widget), ETK_CALLBACK(_etk_menu_item_right_widget_realize_cb), menu_item);
- etk_widget_parent_set(menu_item->right_widget, ETK_WIDGET(menu_item));
- etk_widget_pass_events_set(menu_item->right_widget, ETK_TRUE);
- menu_item->right_widget_is_arrow = ETK_TRUE;
- }
- else if (!menu_item->submenu && menu_item->right_widget && menu_item->right_widget_is_arrow)
+ static Etk_Type *menu_item_separator_type = NULL;
+
+ if (!menu_item_separator_type)
+ menu_item_separator_type = etk_type_new("Etk_Menu_Item_Separator", ETK_MENU_ITEM_TYPE, sizeof(Etk_Menu_Item_Separator), NULL, NULL);
+
+ return menu_item_separator_type;
+}
+
+/**
+ * @brief Creates a new menu separator
+ * @return Returns the new menu separator widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_separator_new()
+{
+ return etk_widget_new(ETK_MENU_ITEM_SEPARATOR_TYPE, "theme_group", "menu_separator", "visible", ETK_TRUE, NULL);
+}
+
+/**************************
+ * Menu Item Image
+ **************************/
+
+/**
+ * @brief Gets the type of an Etk_Menu_Item_Image
+ * @return Returns the type on an Etk_Menu_Item_Image
+ */
+Etk_Type *etk_menu_item_image_type_get()
+{
+ static Etk_Type *menu_item_image_type = NULL;
+
+ if (!menu_item_image_type)
{
- etk_object_destroy(ETK_OBJECT(menu_item->right_widget));
- menu_item->right_widget = NULL;
- menu_item->right_widget_is_arrow = ETK_FALSE;
+ menu_item_image_type = etk_type_new("Etk_Menu_Item_Image", ETK_MENU_ITEM_TYPE, sizeof(Etk_Menu_Item_Image), NULL, NULL);
+
+ etk_type_property_add(menu_item_image_type, "image", ETK_MENU_ITEM_IMAGE_PROPERTY, ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL));
+
+ menu_item_image_type->property_set = _etk_menu_item_image_property_set;
+ menu_item_image_type->property_get = _etk_menu_item_image_property_get;
}
-
- etk_menu_item_right_swallow_show(menu_item, menu_item->submenu != NULL);
- if (menu_item->parent)
- etk_menu_shell_update(menu_item->parent);
+
+ return menu_item_image_type;
+}
+
+/**
+ * @brief Creates a new menu item with an image
+ * @return Returns the new menu item with an image
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_image_new()
+{
+ return etk_widget_new(ETK_MENU_ITEM_IMAGE_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE, NULL);
+}
+
+/**
+ * @brief Creates a new menu item with an image
+ * @param label the label to set to the new menu item
+ * @return Returns the new menu item with an image
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_image_new_with_label(const char *label)
+{
+ return etk_widget_new(ETK_MENU_ITEM_IMAGE_TYPE, "theme_group", "menu_item", "label", label, "visible", ETK_TRUE, NULL);
}
/**
* @brief Sets the image of the menu item. It will be displayed at the left of the label
- * @param menu_item a menu_item
+ * @param image_item a image_item
* @param image the image to set (NULL to unset the image)
*/
-void etk_menu_item_image_set(Etk_Menu_Item *menu_item, Etk_Image *image)
+void etk_menu_item_image_set(Etk_Menu_Item_Image *image_item, Etk_Image *image)
{
+ Etk_Menu_Item *menu_item;
Etk_Widget *image_widget;
- if (!menu_item)
+ if (!(menu_item = ETK_MENU_ITEM(image_item)))
return;
- if (menu_item->image)
+ if (menu_item->left_widget)
{
- etk_widget_parent_set(ETK_WIDGET(menu_item->image), NULL);
- menu_item->image = NULL;
+ etk_widget_parent_set(ETK_WIDGET(menu_item->left_widget), NULL);
+ menu_item->left_widget = NULL;
}
if ((image_widget = ETK_WIDGET(image)))
@@ -226,77 +316,216 @@
etk_container_remove(ETK_CONTAINER(image_widget->parent), image_widget);
/* TODO: disconnect */
- etk_signal_connect("realize", ETK_OBJECT(image_widget), ETK_CALLBACK(_etk_menu_item_image_realize_cb), menu_item);
- etk_widget_parent_set(image_widget, ETK_WIDGET(menu_item));
- etk_widget_pass_events_set(image_widget, ETK_TRUE);
- menu_item->image = image;
+ menu_item->left_widget = image_widget;
+ etk_signal_connect("realize", ETK_OBJECT(menu_item->left_widget), ETK_CALLBACK(_etk_menu_item_left_widget_realize_cb), menu_item);
+ etk_widget_parent_set(menu_item->left_widget, ETK_WIDGET(menu_item));
+ etk_widget_pass_events_set(menu_item->left_widget, ETK_TRUE);
+
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "left_widget_show");
}
+ else
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "left_widget_hide");
- etk_menu_item_right_swallow_show(menu_item, menu_item->image != NULL);
- if (menu_item->parent)
- etk_menu_shell_update(menu_item->parent);
+ etk_widget_size_recalc_queue(ETK_WIDGET(menu_item));
}
+/**************************
+ * Menu Item Check
+ **************************/
+
/**
- * @brief Show the image swallow area of the menu item. It's a function used by etk_menu, do not use it manually!
- * @param menu_item a menu item
- * @param show ETK_TRUE whether the image swallow area should be show or not
+ * @brief Gets the type of an Etk_Menu_Item_Check
+ * @return Returns the type on an Etk_Menu_Item_Check
*/
-void etk_menu_item_image_show(Etk_Menu_Item *menu_item, Etk_Bool show)
+Etk_Type *etk_menu_item_check_type_get()
{
- if (!menu_item || menu_item->show_image == show)
- return;
-
- if (show)
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "image_show");
- else
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "image_hide");
- menu_item->show_image = show;
+ static Etk_Type *menu_item_check_type = NULL;
+
+ if (!menu_item_check_type)
+ {
+ menu_item_check_type = etk_type_new("Etk_Menu_Item_Check", ETK_MENU_ITEM_TYPE, sizeof(Etk_Menu_Item_Check), ETK_CONSTRUCTOR(_etk_menu_item_check_constructor), NULL);
+
+ _etk_menu_item_check_signals[ETK_MENU_ITEM_CHECK_TOGGLED_SIGNAL] = etk_signal_new("toggled", menu_item_check_type, ETK_MEMBER_OFFSET(Etk_Menu_Item_Check, toggled), etk_marshaller_VOID__VOID, NULL, NULL);
+
+ etk_type_property_add(menu_item_check_type, "active", ETK_MENU_ITEM_ACTIVE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE));
+
+ menu_item_check_type->property_set = _etk_menu_item_check_property_set;
+ menu_item_check_type->property_get = _etk_menu_item_check_property_get;
+ }
+
+ return menu_item_check_type;
}
/**
- * @brief Show the right swallow area of the menu item. It's a function used by Etk_Menu, do not use it manually!
- * @param menu_item a menu item
- * @param show ETK_TRUE whether the right swallow area should be show or not
+ * @brief Creates a new menu item with a checkbox
+ * @return Returns the new menu item with a checkbox
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
*/
-void etk_menu_item_right_swallow_show(Etk_Menu_Item *menu_item, Etk_Bool show)
+Etk_Widget *etk_menu_item_check_new()
{
- if (!menu_item || menu_item->show_right_swallow == show)
+ return etk_widget_new(ETK_MENU_ITEM_CHECK_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE, NULL);
+}
+
+/**
+ * @brief Creates a new menu item with a checkbox
+ * @param label the label to set to the new menu item
+ * @return Returns the new menu item with a checkbox
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_check_new_with_label(const char *label)
+{
+ return etk_widget_new(ETK_MENU_ITEM_CHECK_TYPE, "theme_group", "menu_item", "label", label, "visible", ETK_TRUE, NULL);
+}
+
+/**
+ * @brief Sets whether the check menu item is active (i.e. checked)
+ * @param check_item a check menu item
+ * @param active if @a active == ETK_TRUE, the check menu item will be active
+ */
+void etk_menu_item_check_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active)
+{
+ if (!check_item || !check_item->active_set)
return;
-
- if (show)
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "right_swallow_show");
- else
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "right_swallow_hide");
- menu_item->show_right_swallow = show;
+ check_item->active_set(check_item, active);
+}
+
+/**
+ * @brief Gets whether the check menu item is active
+ * @param check_item a check menu item
+ * @return Returns ETK_TRUE if @a check_item is active, ETK_FALSE otherwise
+ */
+Etk_Bool etk_menu_item_check_active_get(Etk_Menu_Item_Check *check_item)
+{
+ if (!check_item)
+ return ETK_FALSE;
+ return check_item->active;
}
/**************************
- * Menu Separator
+ * Menu Item Radio
**************************/
/**
- * @brief Gets the type of an Etk_Menu_Separator
- * @return Returns the type on an Etk_Menu_Separator
+ * @brief Gets the type of an Etk_Menu_Item_Radio
+ * @return Returns the type on an Etk_Menu_Item_Radio
*/
-Etk_Type *etk_menu_separator_type_get()
+Etk_Type *etk_menu_item_radio_type_get()
{
- static Etk_Type *menu_separator_type = NULL;
+ static Etk_Type *menu_item_radio_type = NULL;
- if (!menu_separator_type)
- menu_separator_type = etk_type_new("Etk_Menu_Separator", ETK_MENU_ITEM_TYPE, sizeof(Etk_Menu_Separator), NULL, NULL);
+ if (!menu_item_radio_type)
+ {
+ menu_item_radio_type = etk_type_new("Etk_Menu_Item_Radio", ETK_MENU_ITEM_CHECK_TYPE, sizeof(Etk_Menu_Item_Radio),
+ ETK_CONSTRUCTOR(_etk_menu_item_radio_constructor), ETK_DESTRUCTOR(_etk_menu_item_radio_destructor));
+
+ etk_type_property_add(menu_item_radio_type, "group", ETK_MENU_ITEM_GROUP_PROPERTY, ETK_PROPERTY_POINTER,
+ ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL));
+
+ menu_item_radio_type->property_set = _etk_menu_item_radio_property_set;
+ menu_item_radio_type->property_get = _etk_menu_item_radio_property_get;
+ }
- return menu_separator_type;
+ return menu_item_radio_type;
}
/**
- * @brief Creates a new menu separator
- * @return Returns the new menu separator widget
- * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automaticall shown at its creation
+ * @brief Creates a new radio menu item
+ * @param group the group which the radio menu item will be added to (NULL if the radio menu item should create its own group)
+ * @return Returns the new radio menu item widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_radio_new(Evas_List **group)
+{
+ return etk_widget_new(ETK_MENU_ITEM_RADIO_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE, "group", group, NULL);
+}
+
+/**
+ * @brief Creates a new radio menu item and uses the group of another radio menu item
+ * @param radio_item the radio menu item whose group will be used for the new radio menu item
+ * @return Returns the new radio menu item widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_radio_new_from_widget(Etk_Menu_Item_Radio *radio_item)
+{
+ return etk_widget_new(ETK_MENU_ITEM_RADIO_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE,
+ "group", etk_menu_item_radio_group_get(radio_item), NULL);
+}
+
+/**
+ * @brief Creates a new radio menu item with a label
+ * @param label the label
+ * @param group the group which the radio menu item will be added to (NULL if the radio menu item should create its own group)
+ * @return Returns the new radio menu item widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
+ */
+Etk_Widget *etk_menu_item_radio_new_with_label(const char *label, Evas_List **group)
+{
+ return etk_widget_new(ETK_MENU_ITEM_RADIO_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE, "group", group, "label", label, NULL);
+}
+
+/**
+ * @brief Creates a new radio menu item with a label and uses the group of another radio menu item
+ * @param label the label
+ * @param radio_item the radio menu item whose group will be used for the new radio menu item
+ * @return Returns the new radio menu item widget
+ * @note Unlike the other widgets, You don't need to call etk_widget_shown, the widget is automatically shown at its creation
*/
-Etk_Widget *etk_menu_separator_new()
+Etk_Widget *etk_menu_item_radio_new_with_label_from_widget(const char *label, Etk_Menu_Item_Radio *radio_item)
{
- return etk_widget_new(ETK_MENU_SEPARATOR_TYPE, "theme_group", "menu_separator", "visible", ETK_TRUE, NULL);
+ return etk_widget_new(ETK_MENU_ITEM_RADIO_TYPE, "theme_group", "menu_item", "visible", ETK_TRUE,
+ "group", etk_menu_item_radio_group_get(radio_item), "label", label, NULL);
+}
+
+/**
+ * @brief Sets the group of the radio menu item
+ * @param radio_item a radio menu item
+ * @param group the group to use
+ */
+void etk_menu_item_radio_group_set(Etk_Menu_Item_Radio *radio_item, Evas_List **group)
+{
+ Etk_Menu_Item_Check *check_item;
+ Etk_Bool active;
+
+ if (!(check_item = ETK_MENU_ITEM_CHECK(radio_item)) || (group && (radio_item->group == group)))
+ return;
+
+ if (radio_item->group)
+ {
+ *radio_item->group = evas_list_remove(*radio_item->group, radio_item);
+ if (!(*radio_item->group))
+ {
+ free(radio_item->group);
+ radio_item->group = NULL;
+ }
+ }
+
+ if (!group)
+ {
+ group = malloc(sizeof(Evas_List *));
+ *group = NULL;
+ active = ETK_TRUE;
+ }
+ else
+ active = ETK_FALSE;
+
+ *group = evas_list_append(*group, radio_item);
+ radio_item->group = group;
+ etk_object_notify(ETK_OBJECT(radio_item), "group");
+
+ radio_item->can_uncheck = ETK_TRUE;
+ etk_menu_item_check_active_set(check_item, active);
+}
+
+/**
+ * @brief Gets the group of the radio menu item
+ * @param radio_item a radio menu item
+ * @return Returns the group of the radio menu item
+ */
+Evas_List **etk_menu_item_radio_group_get(Etk_Menu_Item_Radio *radio_item)
+{
+ if (!radio_item)
+ return NULL;
+ return radio_item->group;
}
/**************************
@@ -305,7 +534,7 @@
*
**************************/
-/* Initializes the members */
+/* Menu_Item: Initializes the members of the new menu item */
static void _etk_menu_item_constructor(Etk_Menu_Item *menu_item)
{
if (!menu_item)
@@ -318,17 +547,13 @@
menu_item->submenu = NULL;
menu_item->parent = NULL;
menu_item->label = NULL;
- menu_item->image = NULL;
- menu_item->right_widget = NULL;
-
+ menu_item->left_widget = NULL;
menu_item->is_selected = ETK_FALSE;
- menu_item->show_image = ETK_FALSE;
- menu_item->show_right_swallow = ETK_FALSE;
etk_signal_connect("realize", ETK_OBJECT(menu_item), ETK_CALLBACK(_etk_menu_item_realize_cb), NULL);
}
-/* Destroys the menu item */
+/* Menu_Item: Destroys the menu item */
static void _etk_menu_item_destructor(Etk_Menu_Item *menu_item)
{
if (!menu_item)
@@ -336,7 +561,52 @@
free(menu_item->label);
}
-/* Sets the property whose id is "property_id" to the value "value" */
+/* Menu_Item_Ckeck: Initializes the members of the new menu item with a checkbox */
+static void _etk_menu_item_check_constructor(Etk_Menu_Item_Check *check_item)
+{
+ Etk_Menu_Item *menu_item;
+
+ if (!(menu_item = ETK_MENU_ITEM(check_item)))
+ return;
+
+ check_item->active = ETK_FALSE;
+ check_item->toggled = _etk_menu_item_check_toggled_handler;
+ check_item->active_set = _etk_menu_item_check_active_set;
+
+ menu_item->left_widget = etk_widget_new(ETK_WIDGET_TYPE, "theme_group", ETK_IS_MENU_ITEM_RADIO(check_item) ? "menu_radio" : "menu_check",
+ "pass_events", ETK_TRUE, "visible", ETK_TRUE, NULL);
+ etk_signal_connect("realize", ETK_OBJECT(menu_item->left_widget), ETK_CALLBACK(_etk_menu_item_left_widget_realize_cb), menu_item);
+ etk_signal_connect("realize", ETK_OBJECT(menu_item->left_widget), ETK_CALLBACK(_etk_menu_item_check_left_widget_realize_cb), menu_item);
+ etk_widget_parent_set(menu_item->left_widget, ETK_WIDGET(menu_item));
+
+ etk_signal_connect("activated", ETK_OBJECT(menu_item), ETK_CALLBACK(_etk_menu_item_check_activated_cb), menu_item);
+}
+
+/* Menu_Item_Radio: Initializes the members of the new menu item with a radiobox */
+static void _etk_menu_item_radio_constructor(Etk_Menu_Item_Radio *radio_item)
+{
+ if (!radio_item)
+ return;
+
+ radio_item->group = NULL;
+ radio_item->can_uncheck = ETK_FALSE;
+ ETK_MENU_ITEM_CHECK(radio_item)->active_set = _etk_menu_item_radio_active_set;
+}
+
+/* Menu_Item_Radio: Destroys the menu item with a radiobox */
+static void _etk_menu_item_radio_destructor(Etk_Menu_Item_Radio *radio_item)
+{
+ if (!radio_item || !radio_item->group)
+ return;
+
+ *radio_item->group = evas_list_remove(*radio_item->group, radio_item);
+ if (!(*radio_item->group))
+ free(radio_item->group);
+ else if (ETK_MENU_ITEM_CHECK(radio_item)->active)
+ etk_menu_item_check_active_set(ETK_MENU_ITEM_CHECK((*radio_item->group)->data), ETK_TRUE);
+}
+
+/* Menu_Item: Sets the property whose id is "property_id" to the value "value" */
static void _etk_menu_item_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value)
{
Etk_Menu_Item *menu_item;
@@ -354,7 +624,7 @@
}
}
-/* Gets the value of the property whose id is "property_id" */
+/* Menu_Item: Gets the value of the property whose id is "property_id" */
static void _etk_menu_item_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value)
{
Etk_Menu_Item *menu_item;
@@ -372,6 +642,114 @@
}
}
+/* Menu_Item_Image: Sets the property whose id is "property_id" to the value "value" */
+static void _etk_menu_item_image_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item_Image *image_item;
+
+ if (!(image_item = ETK_MENU_ITEM_IMAGE(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_IMAGE_PROPERTY:
+ etk_menu_item_image_set(image_item, etk_property_value_pointer_get(value));
+ break;
+ default:
+ break;
+ }
+}
+
+/* Menu_Item_Image: Gets the value of the property whose id is "property_id" */
+static void _etk_menu_item_image_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item *menu_item;
+
+ if (!(menu_item = ETK_MENU_ITEM(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_IMAGE_PROPERTY:
+ etk_property_value_pointer_set(value, menu_item->left_widget);
+ break;
+ default:
+ break;
+ }
+}
+
+/* Menu_Item_Check: Sets the property whose id is "property_id" to the value "value" */
+static void _etk_menu_item_check_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item_Check *check_item;
+
+ if (!(check_item = ETK_MENU_ITEM_CHECK(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_ACTIVE_PROPERTY:
+ etk_menu_item_check_active_set(check_item, etk_property_value_bool_get(value));
+ break;
+ default:
+ break;
+ }
+}
+
+/* Menu_Item_Check: Gets the value of the property whose id is "property_id" */
+static void _etk_menu_item_check_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item_Check *check_item;
+
+ if (!(check_item = ETK_MENU_ITEM_CHECK(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_ACTIVE_PROPERTY:
+ etk_property_value_bool_set(value, check_item->active);
+ break;
+ default:
+ break;
+ }
+}
+
+/* Menu_Item_Radio: Sets the property whose id is "property_id" to the value "value" */
+static void _etk_menu_item_radio_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item_Radio *radio_item;
+
+ if (!(radio_item = ETK_MENU_ITEM_RADIO(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_GROUP_PROPERTY:
+ etk_menu_item_radio_group_set(radio_item, etk_property_value_pointer_get(value));
+ break;
+ default:
+ break;
+ }
+}
+
+/* Menu_Item_Radio: Gets the value of the property whose id is "property_id" */
+static void _etk_menu_item_radio_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value)
+{
+ Etk_Menu_Item_Radio *radio_item;
+
+ if (!(radio_item = ETK_MENU_ITEM_RADIO(object)) || !value)
+ return;
+
+ switch (property_id)
+ {
+ case ETK_MENU_ITEM_GROUP_PROPERTY:
+ etk_property_value_pointer_set(value, radio_item->group);
+ break;
+ default:
+ break;
+ }
+}
+
/**************************
*
* Callbacks and handlers
@@ -386,44 +764,41 @@
if (!(menu_item = ETK_MENU_ITEM(object)))
return;
- if (menu_item->label)
- etk_widget_theme_object_part_text_set(ETK_WIDGET(menu_item), "label", menu_item->label);
- else
- etk_widget_theme_object_part_text_set(ETK_WIDGET(menu_item), "label", "");
-
- if (menu_item->image && ETK_WIDGET(menu_item->image)->realized)
- etk_widget_swallow_widget(ETK_WIDGET(menu_item), "image_swallow", ETK_WIDGET(menu_item->image));
- if (menu_item->right_widget && ETK_WIDGET(menu_item->right_widget)->realized)
- etk_widget_swallow_widget(ETK_WIDGET(menu_item), "right_swallow", ETK_WIDGET(menu_item->right_widget));
-
- if (menu_item->show_image)
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "image_show");
- if (menu_item->show_right_swallow)
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "right_swallow_show");
+ etk_widget_theme_object_part_text_set(ETK_WIDGET(menu_item), "label", menu_item->label ? menu_item->label : "");
+ if (menu_item->left_widget && menu_item->left_widget->realized)
+ etk_widget_swallow_widget(ETK_WIDGET(menu_item), "left_widget_swallow", menu_item->left_widget);
}
-/* Called when the image of the menu is realized */
-static void _etk_menu_item_image_realize_cb(Etk_Object *object, void *data)
+/* Called when the left widget of the menu item is realized */
+static void _etk_menu_item_left_widget_realize_cb(Etk_Object *object, void *data)
{
Etk_Menu_Item *menu_item;
- if (!(menu_item = ETK_MENU_ITEM(data)) || !menu_item->image)
+ if (!(menu_item = ETK_MENU_ITEM(data)) || !menu_item->left_widget)
return;
if (ETK_WIDGET(menu_item)->realized)
- etk_widget_swallow_widget(ETK_WIDGET(menu_item), "image_swallow", ETK_WIDGET(menu_item->image));
+ etk_widget_swallow_widget(ETK_WIDGET(menu_item), "left_widget_swallow", menu_item->left_widget);
}
-/* Called when the right widget of the menu is realized */
-static void _etk_menu_item_right_widget_realize_cb(Etk_Object *object, void *data)
+/* Called when the left widget of the check item is realized */
+static void _etk_menu_item_check_left_widget_realize_cb(Etk_Object *object, void *data)
{
Etk_Menu_Item *menu_item;
- if (!(menu_item = ETK_MENU_ITEM(data)) || !menu_item->right_widget)
+ if (!(menu_item = ETK_MENU_ITEM(data)) || !menu_item->left_widget)
return;
+ etk_widget_theme_object_signal_emit(menu_item->left_widget, ETK_MENU_ITEM_CHECK(menu_item)->active ? "check" : "uncheck");
+}
- if (ETK_WIDGET(menu_item)->realized)
- etk_widget_swallow_widget(ETK_WIDGET(menu_item), "right_swallow", ETK_WIDGET(menu_item->right_widget));
+/* Called when the check item is activated */
+static void _etk_menu_item_check_activated_cb(Etk_Object *object, void *data)
+{
+ Etk_Menu_Item_Check *check_item;
+
+ if (!(check_item = ETK_MENU_ITEM_CHECK(object)))
+ return;
+ etk_menu_item_check_active_set(check_item, !check_item->active);
}
/* Default handler for the "selected" signal */
@@ -432,8 +807,7 @@
if (!menu_item)
return;
etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "select");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->image), "select");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->right_widget), "select");
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->left_widget), "select");
}
/* Default handler for the "deselected" signal */
@@ -442,8 +816,7 @@
if (!menu_item)
return;
etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "deselect");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->image), "deselect");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->right_widget), "deselect");
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->left_widget), "deselect");
}
/* Default handler for the "activated" signal */
@@ -452,8 +825,64 @@
if (!menu_item)
return;
etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item), "activate");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->image), "activate");
- etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->right_widget), "activate");
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(menu_item->left_widget), "activate");
+}
+
+/* Default handler for the "toggled" signal */
+static void _etk_menu_item_check_toggled_handler(Etk_Menu_Item_Check *check_item)
+{
+ if (check_item && ETK_MENU_ITEM(check_item)->left_widget)
+ etk_widget_theme_object_signal_emit(ETK_MENU_ITEM(check_item)->left_widget, check_item->active ? "check" : "uncheck");
+}
+
+/**************************
+ *
+ * Private functions
+ *
+ **************************/
+
+/* Behavior of the "active_set" function for a check menu item */
+static void _etk_menu_item_check_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active)
+{
+ if (!check_item || check_item->active == active)
+ return;
+
+ check_item->active = active;
+ etk_object_notify(ETK_OBJECT(check_item), "active");
+ etk_signal_emit(_etk_menu_item_check_signals[ETK_MENU_ITEM_CHECK_TOGGLED_SIGNAL], ETK_OBJECT(check_item), NULL);
+}
+
+/* Behavior of the "active_set" function for a radio menu item */
+static void _etk_menu_item_radio_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active)
+{
+ Etk_Menu_Item_Radio *radio_item;
+ Etk_Menu_Item_Check *ci;
+ Evas_List *l;
+
+ if (!(radio_item = ETK_MENU_ITEM_RADIO(check_item)) || check_item->active == active)
+ return;
+
+ if (!check_item->active || (check_item->active && radio_item->can_uncheck))
+ {
+ check_item->active = active;
+ etk_object_notify(ETK_OBJECT(check_item), "active");
+ etk_signal_emit(_etk_menu_item_check_signals[ETK_MENU_ITEM_CHECK_TOGGLED_SIGNAL], ETK_OBJECT(check_item), NULL);
+
+ if (check_item->active)
+ {
+ /* Uncheck the previously checked item of the group */
+ for (l = *radio_item->group; l; l = l->next)
+ {
+ ci = ETK_MENU_ITEM_CHECK(l->data);
+ if (ci != check_item && ci->active)
+ {
+ ETK_MENU_ITEM_RADIO(ci)->can_uncheck = ETK_TRUE;
+ etk_menu_item_check_active_set(ci, ETK_FALSE);
+ }
+ }
+ }
+ radio_item->can_uncheck = ETK_FALSE;
+ }
}
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu_item.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- etk_menu_item.h 11 Feb 2006 00:28:33 -0000 1.5
+++ etk_menu_item.h 4 Mar 2006 23:29:47 -0000 1.6
@@ -17,12 +17,33 @@
/** @brief Checks if the object is an Etk_Menu_Item */
#define ETK_IS_MENU_ITEM(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_ITEM_TYPE))
-/** @brief Gets the type of a menu separator */
-#define ETK_MENU_SEPARATOR_TYPE (etk_menu_separator_type_get())
-/** @brief Casts the object to an Etk_Menu_Sepatator */
-#define ETK_MENU_SEPARATOR(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_SEPARATOR_TYPE, Etk_Menu_Separator))
-/** @brief Checks if the object is an Etk_Menu_Separator */
-#define ETK_IS_MENU_SEPARATOR(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_SEPARATOR_TYPE))
+/** @brief Gets the type of a menu item separator */
+#define ETK_MENU_ITEM_SEPARATOR_TYPE (etk_menu_item_separator_type_get())
+/** @brief Casts the object to an Etk_Menu_Item_Separator */
+#define ETK_MENU_ITEM_SEPARATOR(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_ITEM_SEPARATOR_TYPE, Etk_Menu_Item_Separator))
+/** @brief Checks if the object is an Etk_Menu_Item_Separator */
+#define ETK_IS_MENU_ITEM_SEPARATOR(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_ITEM_SEPARATOR_TYPE))
+
+/** @brief Gets the type of a menu item image */
+#define ETK_MENU_ITEM_IMAGE_TYPE (etk_menu_item_image_type_get())
+/** @brief Casts the object to an Etk_Menu_Item_Image */
+#define ETK_MENU_ITEM_IMAGE(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_ITEM_IMAGE_TYPE, Etk_Menu_Item_Image))
+/** @brief Checks if the object is an Etk_Menu_Item_Image */
+#define ETK_IS_MENU_ITEM_IMAGE(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_ITEM_IMAGE_TYPE))
+
+/** @brief Gets the type of a menu item check */
+#define ETK_MENU_ITEM_CHECK_TYPE (etk_menu_item_check_type_get())
+/** @brief Casts the object to an Etk_Menu_Item_Check */
+#define ETK_MENU_ITEM_CHECK(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_ITEM_CHECK_TYPE, Etk_Menu_Item_Check))
+/** @brief Checks if the object is an Etk_Menu_Item_Check */
+#define ETK_IS_MENU_ITEM_CHECK(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_ITEM_CHECK_TYPE))
+
+/** @brief Gets the type of a menu item radio */
+#define ETK_MENU_ITEM_RADIO_TYPE (etk_menu_item_radio_type_get())
+/** @brief Casts the object to an Etk_Menu_Item_Radio */
+#define ETK_MENU_ITEM_RADIO(obj) (ETK_OBJECT_CAST((obj), ETK_MENU_ITEM_RADIO_TYPE, Etk_Menu_Item_Radio))
+/** @brief Radios if the object is an Etk_Menu_Item_Radio */
+#define ETK_IS_MENU_ITEM_RADIO(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_MENU_ITEM_RADIO_TYPE))
/**
* @struct Etk_Menu_Item
@@ -42,46 +63,100 @@
Etk_Menu *submenu;
char *label;
- Etk_Image *image;
- /* "right_widget" can be the submenu arrow, the checkbox or the radiobox widget */
- Etk_Widget *right_widget;
+ Etk_Widget *left_widget;
Etk_Bool is_selected;
- Etk_Bool show_image;
- Etk_Bool show_right_swallow;
- Etk_Bool right_widget_is_arrow;
};
/**
- * @struct Etk_Menu_Separator
+ * @struct Etk_Menu_Item_Separator
* @brief An horizontal separator for the menus
*/
-struct _Etk_Menu_Separator
+struct _Etk_Menu_Item_Separator
{
/* private: */
/* Inherit from Etk_Menu_Item */
Etk_Menu_Item menu_item;
};
+/**
+ * @struct Etk_Menu_Item_Image
+ * @brief A menu item with an image
+ */
+struct _Etk_Menu_Item_Image
+{
+ /* private: */
+ /* Inherit from Etk_Menu_Item */
+ Etk_Menu_Item menu_item;
+};
+
+/**
+ * @struct Etk_Menu_Item_Check
+ * @brief A menu item with a checkbox
+ */
+struct _Etk_Menu_Item_Check
+{
+ /* private: */
+ /* Inherit from Etk_Menu_Item */
+ Etk_Menu_Item menu_item;
+
+ void (*toggled)(Etk_Menu_Item_Check *check_item);
+ void (*active_set)(Etk_Menu_Item_Check *check_item, Etk_Bool active);
+ Etk_Bool active;
+};
+
+/**
+ * @struct Etk_Menu_Item_Check
+ * @brief A menu item with a radiobox
+ */
+struct _Etk_Menu_Item_Radio
+{
+ /* private: */
+ /* Inherit from Etk_Menu_Item_Check */
+ Etk_Menu_Item_Check check_item;
+
+ Evas_List **group;
+ Etk_Bool can_uncheck;
+};
+
+/* Etk_Menu_Item */
Etk_Type *etk_menu_item_type_get();
Etk_Widget *etk_menu_item_new();
Etk_Widget *etk_menu_item_new_with_label(const char *label);
void etk_menu_item_label_set(Etk_Menu_Item *menu_item, const char *label);
const char *etk_menu_item_label_get(Etk_Menu_Item *menu_item);
+void etk_menu_item_submenu_set(Etk_Menu_Item *menu_item, Etk_Menu *submenu);
void etk_menu_item_select(Etk_Menu_Item *menu_item);
void etk_menu_item_deselect(Etk_Menu_Item *menu_item);
void etk_menu_item_activate(Etk_Menu_Item *menu_item);
-void etk_menu_item_submenu_set(Etk_Menu_Item *menu_item, Etk_Menu *submenu);
-void etk_menu_item_image_set(Etk_Menu_Item *menu_item, Etk_Image *image);
-
-void etk_menu_item_image_show(Etk_Menu_Item *menu_item, Etk_Bool show);
-void etk_menu_item_right_swallow_show(Etk_Menu_Item *menu_item, Etk_Bool show);
-
-Etk_Type *etk_menu_separator_type_get();
-Etk_Widget *etk_menu_separator_new();
+/* Etk_Menu_Item_Separator */
+Etk_Type *etk_menu_item_separator_type_get();
+Etk_Widget *etk_menu_item_separator_new();
+
+/* Etk_Menu_Item_Image */
+Etk_Type *etk_menu_item_image_type_get();
+Etk_Widget *etk_menu_item_image_new();
+Etk_Widget *etk_menu_item_image_new_with_label(const char *label);
+void etk_menu_item_image_set(Etk_Menu_Item_Image *image_item, Etk_Image *image);
+
+/* Etk_Menu_Item_Check */
+Etk_Type *etk_menu_item_check_type_get();
+Etk_Widget *etk_menu_item_check_new();
+Etk_Widget *etk_menu_item_check_new_with_label(const char *label);
+void etk_menu_item_check_active_set(Etk_Menu_Item_Check *check_item, Etk_Bool active);
+Etk_Bool etk_menu_item_check_active_get(Etk_Menu_Item_Check *check_item);
+
+/* Etk_Menu_Item_Radio */
+Etk_Type *etk_menu_item_radio_type_get();
+Etk_Widget *etk_menu_item_radio_new(Evas_List **group);
+Etk_Widget *etk_menu_item_radio_new_from_widget(Etk_Menu_Item_Radio *radio_item);
+Etk_Widget *etk_menu_item_radio_new_with_label(const char *label, Evas_List **group);
+Etk_Widget *etk_menu_item_radio_new_with_label_from_widget(const char *label, Etk_Menu_Item_Radio *radio_item);
+void etk_menu_item_radio_group_set(Etk_Menu_Item_Radio *radio_item, Evas_List **group);
+Evas_List **etk_menu_item_radio_group_get(Etk_Menu_Item_Radio *radio_item);
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu_shell.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- etk_menu_shell.c 11 Feb 2006 00:28:33 -0000 1.3
+++ etk_menu_shell.c 4 Mar 2006 23:29:47 -0000 1.4
@@ -20,6 +20,7 @@
static void _etk_menu_shell_constructor(Etk_Menu_Shell *menu_shell);
static void _etk_menu_shell_destructor(Etk_Menu_Shell *menu_shell);
+static void _etk_menu_shell_item_add(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item);
static Etk_Signal *_etk_menu_shell_signals[ETK_MENU_SHELL_NUM_SIGNALS];
@@ -58,30 +59,55 @@
}
/**
- * @brief Adds a menu_shell item at the end of the menu_shell
- * @param menu_shell a menu_shell
- * @param item the menu_shell item to add
+ * @brief Adds a menu_shell 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
*/
-void etk_menu_shell_append(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item)
+void etk_menu_shell_prepend(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item)
{
if (!menu_shell || !item)
return;
- menu_shell->items = evas_list_append(menu_shell->items, item);
+ 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);
}
+/**
+ * @brief Adds a menu_shell 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
+ */
+void etk_menu_shell_append(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item)
+{
+ if (!menu_shell || !item)
+ return;
+
+ menu_shell->items = evas_list_append(menu_shell->items, item);
+ _etk_menu_shell_item_add(menu_shell, item);
+}
+
/**
- * @brief Update the child items if needed. You don't need to call it manually, it's automatically called
- * @param menu shell a menu shell
+ * @brief Removes an item from the menu shell
+ * @param menu_shell a menu shell
+ * @param item the item to remove
*/
-void etk_menu_shell_update(Etk_Menu_Shell *menu_shell)
+void etk_menu_shell_remove(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item)
{
- if (!menu_shell || !menu_shell->items_update)
+ Evas_List *l;
+
+ if (!menu_shell || !item)
return;
- menu_shell->items_update(menu_shell);
+
+ if ((l = evas_list_find_list(menu_shell->items, item)))
+ {
+ etk_widget_parent_set(ETK_WIDGET(item), NULL);
+ item->parent = NULL;
+ etk_signal_emit(_etk_menu_shell_signals[ETK_MENU_SHELL_ITEM_REMOVED_SIGNAL], ETK_OBJECT(menu_shell), NULL, item);
+ menu_shell->items = evas_list_remove_list(menu_shell->items, l);
+ etk_widget_size_recalc_queue(ETK_WIDGET(menu_shell));
+ }
}
/**************************
@@ -97,7 +123,6 @@
return;
menu_shell->items = NULL;
menu_shell->parent = NULL;
- menu_shell->items_update = NULL;
}
/* Destroys the menu_shell */
@@ -108,4 +133,19 @@
evas_list_free(menu_shell->items);
}
+/**************************
+ *
+ * Private functions
+ *
+ **************************/
+
+/* Adds a menu item to the menu shell */
+static void _etk_menu_shell_item_add(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *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_widget_size_recalc_queue(ETK_WIDGET(menu_shell));
+}
+
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_menu_shell.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- etk_menu_shell.h 11 Feb 2006 00:28:33 -0000 1.3
+++ etk_menu_shell.h 4 Mar 2006 23:29:47 -0000 1.4
@@ -30,15 +30,14 @@
Etk_Menu_Item *parent;
Evas_List *items;
- void (*items_update)(Etk_Menu_Shell *menu_shell);
};
Etk_Type *etk_menu_shell_type_get();
Etk_Widget *etk_menu_shell_new();
+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_update(Etk_Menu_Shell *menu_shell);
+void etk_menu_shell_remove(Etk_Menu_Shell *menu_shell, Etk_Menu_Item *item);
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_radio_button.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- etk_radio_button.c 4 Mar 2006 18:04:10 -0000 1.6
+++ etk_radio_button.c 4 Mar 2006 23:29:47 -0000 1.7
@@ -18,7 +18,7 @@
static void _etk_radio_button_destructor(Etk_Radio_Button *radio_button);
static void _etk_radio_button_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
static void _etk_radio_button_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
-static void _etk_radio_button_clicked_handler(Etk_Button *button);
+static void _etk_radio_button_active_set(Etk_Toggle_Button *toggle_button, Etk_Bool active);
/**
* @brief Gets the type of an Etk_Radio_Button
@@ -89,7 +89,7 @@
}
/**
- * @brief Sets the group of the of the radio button
+ * @brief Sets the group of the radio button
* @param radio_button a radio button
* @param group the group to use
*/
@@ -126,7 +126,6 @@
radio_button->can_uncheck = ETK_TRUE;
etk_toggle_button_active_set(toggle_button, active);
- radio_button->can_uncheck = ETK_FALSE;
}
/**
@@ -155,7 +154,7 @@
radio_button->group = NULL;
radio_button->can_uncheck = ETK_FALSE;
- ETK_BUTTON(radio_button)->clicked = _etk_radio_button_clicked_handler;
+ ETK_TOGGLE_BUTTON(radio_button)->active_set = _etk_radio_button_active_set;
}
/* Destroys the radio button widget */
@@ -210,28 +209,25 @@
/**************************
*
- * Callbacks and handlers
+ * Private functions
*
**************************/
-/* Called when the radio is clicked */
-static void _etk_radio_button_clicked_handler(Etk_Button *button)
+/* Behavior for the active_set function of the radio button */
+static void _etk_radio_button_active_set(Etk_Toggle_Button *toggle_button, Etk_Bool active)
{
- Etk_Toggle_Button *toggle_button;
Etk_Radio_Button *radio_button;
Etk_Toggle_Button *tb;
Evas_List *l;
- if (!(toggle_button = ETK_TOGGLE_BUTTON(button)))
+ if (!(radio_button = ETK_RADIO_BUTTON(toggle_button)) || toggle_button->active == active)
return;
- radio_button = ETK_RADIO_BUTTON(toggle_button);
if (!toggle_button->active || (toggle_button->active && radio_button->can_uncheck))
{
- etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), "clicked");
- toggle_button->active = !toggle_button->active;
- etk_toggle_button_toggled(toggle_button);
+ toggle_button->active = active;
etk_object_notify(ETK_OBJECT(toggle_button), "active");
+ etk_signal_emit_by_name("toggled", ETK_OBJECT(toggle_button), NULL);
if (toggle_button->active)
{
@@ -243,10 +239,10 @@
{
ETK_RADIO_BUTTON(tb)->can_uncheck = ETK_TRUE;
etk_toggle_button_active_set(tb, ETK_FALSE);
- ETK_RADIO_BUTTON(tb)->can_uncheck = ETK_FALSE;
}
}
}
+ radio_button->can_uncheck = ETK_FALSE;
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_toggle_button.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- etk_toggle_button.c 15 Jan 2006 11:07:16 -0000 1.7
+++ etk_toggle_button.c 4 Mar 2006 23:29:47 -0000 1.8
@@ -24,8 +24,8 @@
static void _etk_toggle_button_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value);
static void _etk_toggle_button_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value);
static void _etk_toggle_button_realize_cb(Etk_Object *object, void *data);
-static void _etk_toggle_button_clicked_handler(Etk_Button *button);
-static void _etk_toggle_button_toggled_handler(Etk_Toggle_Button *button);
+static void _etk_toggle_button_toggled_handler(Etk_Toggle_Button *toggle_button);
+static void _etk_toggle_button_active_set_default(Etk_Toggle_Button *toggle_button, Etk_Bool active);
static Etk_Signal *_etk_toggle_button_signals[ETK_TOGGLE_BUTTON_NUM_SIGNALS];
@@ -78,25 +78,25 @@
}
/**
- * @brief Emits the "toggled" signal
+ * @brief Toggles the toggle button
* @param toggle_button a toggle button
*/
-void etk_toggle_button_toggled(Etk_Toggle_Button *toggle_button)
+void etk_toggle_button_toggle(Etk_Toggle_Button *toggle_button)
{
if (!toggle_button)
return;
- etk_signal_emit(_etk_toggle_button_signals[ETK_TOGGLE_BUTTON_TOGGLED_SIGNAL], ETK_OBJECT(toggle_button), NULL);
+ etk_toggle_button_active_set(toggle_button, !toggle_button->active);
}
/**
* @brief Sets the state of the toggle button
* @param toggle_button a toggle button
- * @param active if @a active != 0, the toggle button will be active
+ * @param active if @a active == ETK_TRUE, the toggle button will be active
*/
void etk_toggle_button_active_set(Etk_Toggle_Button *toggle_button, Etk_Bool active)
{
- if (toggle_button && toggle_button->active != active)
- etk_button_clicked(ETK_BUTTON(toggle_button));
+ if (toggle_button && toggle_button->active_set)
+ toggle_button->active_set(toggle_button, active);
}
/**
@@ -125,9 +125,10 @@
toggle_button->active = 0;
toggle_button->toggled = _etk_toggle_button_toggled_handler;
- ETK_BUTTON(toggle_button)->clicked = _etk_toggle_button_clicked_handler;
+ toggle_button->active_set = _etk_toggle_button_active_set_default;
etk_signal_connect("realize", ETK_OBJECT(toggle_button), ETK_CALLBACK(_etk_toggle_button_realize_cb), NULL);
+ etk_signal_connect_swapped("clicked", ETK_OBJECT(toggle_button), ETK_CALLBACK(etk_toggle_button_toggle), toggle_button);
}
/* Sets the property whose id is "property_id" to the value "value" */
@@ -179,35 +180,32 @@
if (!(toggle_button = ETK_TOGGLE_BUTTON(object)))
return;
- etk_toggle_button_toggled(toggle_button);
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), toggle_button->active ? "activate" : "deactivate");
}
-/* Called when the toggle button is clicked */
-static void _etk_toggle_button_clicked_handler(Etk_Button *button)
+/* Default handler for the "toggled" signal */
+static void _etk_toggle_button_toggled_handler(Etk_Toggle_Button *toggle_button)
{
- Etk_Toggle_Button *toggle_button;
-
- if (!(toggle_button = ETK_TOGGLE_BUTTON(button)))
+ if (!toggle_button)
return;
- /* TODO */
- etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), "clicked");
- toggle_button->active = !toggle_button->active;
- etk_toggle_button_toggled(toggle_button);
- etk_object_notify(ETK_OBJECT(toggle_button), "active");
+ etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), toggle_button->active ? "activate" : "deactivate");
}
-/* Default handler for "toggled" signal */
-static void _etk_toggle_button_toggled_handler(Etk_Toggle_Button *button)
-{
- Etk_Toggle_Button *toggle_button;
+/**************************
+ *
+ * Private functions
+ *
+ **************************/
- if (!(toggle_button = ETK_TOGGLE_BUTTON(button)))
+/* Default behavior for the "active_set" function */
+static void _etk_toggle_button_active_set_default(Etk_Toggle_Button *toggle_button, Etk_Bool active)
+{
+ if (!toggle_button || toggle_button->active == active)
return;
- if (toggle_button->active)
- etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), "activated");
- else
- etk_widget_theme_object_signal_emit(ETK_WIDGET(toggle_button), "desactivated");
+ toggle_button->active = active;
+ etk_object_notify(ETK_OBJECT(toggle_button), "active");
+ etk_signal_emit(_etk_toggle_button_signals[ETK_TOGGLE_BUTTON_TOGGLED_SIGNAL], ETK_OBJECT(toggle_button), NULL);
}
/** @} */
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_toggle_button.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- etk_toggle_button.h 1 Oct 2005 16:29:45 -0000 1.1
+++ etk_toggle_button.h 4 Mar 2006 23:29:47 -0000 1.2
@@ -22,7 +22,8 @@
/* private: */
/* Inherit from Etk_Button */
Etk_Button button;
-
+
+ void (*active_set)(Etk_Toggle_Button *toggle_button, Etk_Bool active);
void (*toggled)(Etk_Toggle_Button *toggle_button);
Etk_Bool active;
};
@@ -31,7 +32,7 @@
Etk_Widget *etk_toggle_button_new();
Etk_Widget *etk_toggle_button_new_with_label(const char *label);
-void etk_toggle_button_toggled(Etk_Toggle_Button *toggle_button);
+void etk_toggle_button_toggle(Etk_Toggle_Button *toggle_button);
void etk_toggle_button_active_set(Etk_Toggle_Button *toggle_button, Etk_Bool active);
Etk_Bool etk_toggle_button_active_get(Etk_Toggle_Button *toggle_button);
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -3 -r1.53 -r1.54
--- etk_tree.c 4 Mar 2006 18:04:12 -0000 1.53
+++ etk_tree.c 4 Mar 2006 23:29:47 -0000 1.54
@@ -2450,7 +2450,7 @@
new_row->cells_data = malloc(sizeof(void *) * tree->num_cols);
for (i = 0; i < tree->num_cols; i++)
{
- new_row->cells_data[i] = malloc(tree->columns[i]->model->cell_data_size);
+ new_row->cells_data[i] = calloc(1, tree->columns[i]->model->cell_data_size);
if (tree->columns[i]->model->cell_data_init)
tree->columns[i]->model->cell_data_init(tree->columns[i]->model, new_row->cells_data[i]);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree_model.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- etk_tree_model.c 1 Mar 2006 23:51:22 -0000 1.6
+++ etk_tree_model.c 4 Mar 2006 23:29:47 -0000 1.7
@@ -865,9 +865,9 @@
return;
if (*checked)
- edje_object_signal_emit(cell_objects[0], "activated", "");
+ edje_object_signal_emit(cell_objects[0], "activate", "");
else
- edje_object_signal_emit(cell_objects[0], "deactivated", "");
+ edje_object_signal_emit(cell_objects[0], "deactivate", "");
evas_object_data_set(cell_objects[0], "_Etk_Tree_Model_Checkbox::Row", row);
edje_object_size_min_get(cell_objects[0], &w, &h);
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -3 -r1.32 -r1.33
--- etk_types.h 2 Mar 2006 00:48:00 -0000 1.32
+++ etk_types.h 4 Mar 2006 23:29:47 -0000 1.33
@@ -93,13 +93,17 @@
typedef struct _Etk_VScrollbar Etk_VScrollbar;
typedef struct _Etk_HSeparator Etk_HSeparator;
typedef struct _Etk_VSeparator Etk_VSeparator;
+typedef struct _Etk_Menu_Window Etk_Menu_Window;
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_Separator Etk_Menu_Separator;
-typedef struct _Etk_Menu_Check_Item Etk_Menu_Check_Item;
-typedef struct _Etk_Menu_Radio_Item Etk_Menu_Radio_Item;
+typedef struct _Etk_Menu_Item_Separator Etk_Menu_Item_Separator;
+typedef struct _Etk_Menu_Item_Image Etk_Menu_Item_Image;
+typedef struct _Etk_Menu_Item_Check Etk_Menu_Item_Check;
+typedef struct _Etk_Menu_Item_Radio Etk_Menu_Item_Radio;
+typedef struct _Etk_Combobox Etk_Combobox;
+typedef struct _Etk_Combobox_Item Etk_Combobox_Item;
typedef struct _Etk_Statusbar Etk_Statusbar;
typedef struct _Etk_Filechooser_Widget Etk_Filechooser_Widget;
typedef struct _Etk_Notebook Etk_Notebook;
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -3 -r1.46 -r1.47
--- etk_widget.c 4 Mar 2006 19:48:20 -0000 1.46
+++ etk_widget.c 4 Mar 2006 23:29:47 -0000 1.47
@@ -191,10 +191,10 @@
_etk_widget_signals[ETK_WIDGET_UNFOCUS_SIGNAL] = etk_signal_new("unfocus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, unfocus), etk_marshaller_VOID__VOID, NULL, NULL);
_etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL] = etk_signal_new("drag_drop", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL);
_etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] = etk_signal_new("drag_motion", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_motion), etk_marshaller_VOID__VOID, NULL, NULL);
- _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL);
- _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL);
- _etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL] = etk_signal_new("drag_begin", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_begin), etk_marshaller_VOID__VOID, NULL, NULL);
- _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] = etk_signal_new("drag_end", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_end), etk_marshaller_VOID__VOID, NULL, NULL);
+ _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL);
+ _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL);
+ _etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL] = etk_signal_new("drag_begin", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_begin), etk_marshaller_VOID__VOID, NULL, NULL);
+ _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] = etk_signal_new("drag_end", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_end), etk_marshaller_VOID__VOID, NULL, NULL);
_etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = etk_signal_new("selection_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL);
_etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = etk_signal_new("clipboard_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL);
_etk_widget_signals[ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL] = etk_signal_new("scroll_size_changed", widget_type, -1, etk_marshaller_VOID__VOID, NULL, NULL);
@@ -373,7 +373,6 @@
etk_object_notify(ETK_OBJECT(widget), "theme_group");
}
- /* TODO */
_etk_widget_realize(widget);
}
|