Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_button.c etk_button.h etk_widget.c 


Log Message:
* [Button] Fix potential bugs and cleanup/doc


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_button.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -3 -r1.34 -r1.35
--- etk_button.c        22 Feb 2007 04:36:25 -0000      1.34
+++ etk_button.c        23 Feb 2007 03:25:39 -0000      1.35
@@ -119,9 +119,10 @@
 }
 
 /**
- * @brief Creates a new button with a label and an icon defined by a stock id
- * @param stock_id the stock id corresponding to the label and the icon to use
+ * @brief Creates a new button with a label and an icon defined by a stock-id
+ * @param stock_id the stock-id corresponding to the label and the icon to use
  * @return Returns the new button
+ * @note For some stock-id, the label is empty
  * @see Etk_Stock
  */
 Etk_Widget *etk_button_new_from_stock(Etk_Stock_Id stock_id)
@@ -135,7 +136,7 @@
 }
 
 /**
- * @brief Presses the button (the button should be released)
+ * @brief Presses the button if it wasn't already pressed
  * @param button a button
  */
 void etk_button_press(Etk_Button *button)
@@ -148,7 +149,7 @@
 }
 
 /**
- * @brief Releases the button (the button should be pressed)
+ * @brief Releases the button if it was pressed
  * @param button a button
  */
 void etk_button_release(Etk_Button *button)
@@ -178,30 +179,34 @@
  */
 void etk_button_label_set(Etk_Button *button, const char *label)
 {
-   Etk_Widget *widget, *parent;
+   Etk_Widget *parent;
    Etk_Bool rebuild;
 
-   if (!(widget = ETK_WIDGET(button)))
+   if (!button)
       return;
    
    etk_label_set(ETK_LABEL(button->label), label);
-   if (!label || *label == '\0')
-      etk_widget_hide(button->label);
-   else
-      etk_widget_show(button->label);
 
    /* Rebuild the button only if necessary (i.e. if the label is currently not 
packed into the button) */
    rebuild = ETK_TRUE;
    for (parent = etk_widget_parent_get(button->label); parent; parent = 
etk_widget_parent_get(parent))
    {
-      if (parent == widget)
+      if (parent == ETK_WIDGET(button))
       {
          rebuild = ETK_FALSE;
          break;
       }
    }
+   
    if (rebuild)
       _etk_button_rebuild(button);
+   else
+   {
+      if (!label || *label == '\0')
+         etk_widget_hide(button->label);
+      else
+         etk_widget_show(button->label);
+   }
    
    etk_object_notify(ETK_OBJECT(button), "label");
 }
@@ -219,9 +224,13 @@
 }
 
 /**
- * @brief Sets the image of the button. The current image will be unpacked, 
but not destroyed
+ * @brief Sets the image of the button
  * @param button a button
  * @param image the image to set
+ * @note The current image will be destroyed only if it has been set with 
etk_button_new_from_stock()
+ * or with etk_button_set_from_stock(). Otherwise, it will just be unpacked 
and you'll still be able to use it
+ * @note The image will be automatically shown, but you can still manually 
hide it with calling etk_widget_hide()
+ * after having called etk_button_image_set()
  */
 void etk_button_image_set(Etk_Button *button, Etk_Image *image)
 {
@@ -230,12 +239,16 @@
    
    if (button->image)
    {
-      etk_signal_block("child_removed", ETK_OBJECT(button->box), 
ETK_CALLBACK(_etk_button_image_removed_cb));
-      etk_container_remove(ETK_CONTAINER(button->box), 
ETK_WIDGET(button->image));
-      etk_signal_unblock("child_removed", ETK_OBJECT(button->box), 
ETK_CALLBACK(_etk_button_image_removed_cb));
+      button->ignore_image_remove = ETK_TRUE;
+      if (button->image_from_stock)
+         etk_object_destroy(ETK_OBJECT(button->image));
+      else
+         etk_container_remove(ETK_CONTAINER(button->box), 
ETK_WIDGET(button->image));
+      button->ignore_image_remove = ETK_FALSE;
    }
 
    button->image = image;
+   button->image_from_stock = ETK_FALSE;
    _etk_button_rebuild(button);
    etk_object_notify(ETK_OBJECT(button), "image");
 }
@@ -243,7 +256,7 @@
 /**
  * @brief Gets the image of the button
  * @param button a button
- * @return Returns the image of button
+ * @return Returns the image of the button, or NULL if the button has no image
  */
 Etk_Image *etk_button_image_get(Etk_Button *button)
 {
@@ -253,9 +266,10 @@
 }
 
 /**
- * @brief Sets the label and the image of the button from a stock id
+ * @brief Sets the label and the image of the button from a stock-id
  * @param button a button
- * @param stock_id the stock id to use
+ * @param stock_id the stock-id to use
+ * @note For some stock-id, the label is empty
  */
 void etk_button_set_from_stock(Etk_Button *button, Etk_Stock_Id stock_id)
 {
@@ -270,15 +284,16 @@
    
    image = etk_image_new_from_stock(stock_id, button->stock_size);
    etk_widget_internal_set(image, ETK_TRUE);
-   etk_widget_show(image);
    etk_button_image_set(ETK_BUTTON(button), ETK_IMAGE(image));
+   button->image_from_stock = ETK_TRUE;
 }
 
 /**
- * @brief Sets the alignment of the child of the button (it only has effect if 
the child is a label, or an alignment)
+ * @brief Sets the alignment of the child of the button
  * @param button a button
  * @param xalign the horizontal alignment (0.0 = left, 0.5 = center, 1.0 = 
right, ...)
  * @param yalign the vertical alignment (0.0 = top, 0.5 = center, 1.0 = 
bottom, ...)
+ * @note It only has effect if the child is a label or an alignment
  */
 void etk_button_alignment_set(Etk_Button *button, float xalign, float yalign)
 {
@@ -314,7 +329,7 @@
 }
 
 /**
- * @brief Gets the alignment of the child of the button
+ * @brief Gets the alignment of the button's child
  * @param button a button
  * @param xalign the location where to store the horizontal alignment
  * @param yalign the location where to store the vertical alignment
@@ -340,17 +355,13 @@
    button->style = style;
    if (button->box)
    {
-      if (button->image)
-      {
-         etk_signal_block("child_removed", ETK_OBJECT(button->box), 
ETK_CALLBACK(_etk_button_image_removed_cb));
-         etk_container_remove(ETK_CONTAINER(button->box), 
ETK_WIDGET(button->image));
-         etk_signal_unblock("child_removed", ETK_OBJECT(button->box), 
ETK_CALLBACK(_etk_button_image_removed_cb));
-      }
-      if (button->label)
-         etk_container_remove(ETK_CONTAINER(button->box), 
ETK_WIDGET(button->label));
+      button->ignore_image_remove = ETK_TRUE;
+      etk_container_remove_all(ETK_CONTAINER(button->box));
       etk_object_destroy(ETK_OBJECT(button->box));
+      button->ignore_image_remove = ETK_FALSE;
       button->box = NULL;
    }
+   
    _etk_button_rebuild(button);
    etk_object_notify(ETK_OBJECT(button), "style");
 }
@@ -432,8 +443,9 @@
    button->released = _etk_button_released_handler;
    button->clicked = _etk_button_clicked_handler;
 
-   button->building = ETK_FALSE;
+   button->ignore_image_remove = ETK_FALSE;
    button->is_pressed = ETK_FALSE;
+   button->image_from_stock = ETK_FALSE;
    button->xalign = 0.5;
    button->yalign = 0.5;
 
@@ -537,10 +549,12 @@
    if (!(button = ETK_BUTTON(data)) || (child != ETK_WIDGET(button->image)))
       return;
    
-   if (!button->building)
+   if (!button->ignore_image_remove)
    {
       button->image = NULL;
-      _etk_button_rebuild(button);
+      /* We rebuild the button only if the button's child is not a 
user-defined widget */
+      if (button->alignment == etk_bin_child_get(ETK_BIN(button)))
+         _etk_button_rebuild(button);
       etk_object_notify(ETK_OBJECT(button), "image");
    }
 }
@@ -640,22 +654,24 @@
    etk_widget_theme_signal_emit(ETK_WIDGET(button), "etk,state,clicked", 
ETK_FALSE);
 }
 
-/* Rebuilds the children of the button */
+/* Rebuilds the default layout for the button */
 static void _etk_button_rebuild(Etk_Button *button)
 {
+   const char *text;
+   
    if (!button)
       return;
 
-   button->building = ETK_TRUE;
+   button->ignore_image_remove = ETK_TRUE;
    
+   /* Rebuild the containers containing the label and image */
    if (button->image)
    {
       if (!button->alignment)
       {
          button->alignment = etk_alignment_new(button->xalign, button->yalign, 
0.0, 0.0);
-         etk_container_add(ETK_CONTAINER(button), button->alignment);
          etk_widget_internal_set(button->alignment, ETK_TRUE);
-         etk_widget_pass_mouse_events_set(button->alignment, ETK_TRUE);
+         etk_container_add(ETK_CONTAINER(button), button->alignment);
          etk_widget_show(button->alignment);
       }
 
@@ -665,11 +681,11 @@
             button->box = etk_vbox_new(ETK_FALSE, 2);
          else
             button->box = etk_hbox_new(ETK_FALSE, 8);
-         etk_container_add(ETK_CONTAINER(button->alignment), button->box);
          etk_widget_internal_set(button->box, ETK_TRUE);
-         etk_widget_pass_mouse_events_set(button->box, ETK_TRUE);
+         etk_container_add(ETK_CONTAINER(button->alignment), button->box);
          etk_widget_show(button->box);
-         etk_signal_connect("child_removed", ETK_OBJECT(button->box), 
ETK_CALLBACK(_etk_button_image_removed_cb), button);
+         etk_signal_connect("child_removed", ETK_OBJECT(button->box),
+            ETK_CALLBACK(_etk_button_image_removed_cb), button);
       }
       else
          etk_container_remove_all(ETK_CONTAINER(button->box));
@@ -685,17 +701,24 @@
       etk_object_destroy(ETK_OBJECT(button->alignment));
       button->alignment = NULL;
       button->box = NULL;
-
+      
       etk_label_alignment_set(ETK_LABEL(button->label), button->xalign, 
button->yalign);
       etk_container_add(ETK_CONTAINER(button), button->label);
    }
    
-   if (button->style == ETK_BUTTON_TEXT)
-      etk_widget_hide(ETK_WIDGET(button->image));
-   else if (button->style == ETK_BUTTON_ICON)
+   /* Show/hide the label and the image */
+   text = etk_label_get(ETK_LABEL(button->label));
+   if (button->style != ETK_BUTTON_ICON && text && *text != '\0')
+      etk_widget_show(button->label);
+   else
       etk_widget_hide(button->label);
    
-   button->building = ETK_FALSE;
+   if (button->style != ETK_BUTTON_TEXT)
+      etk_widget_show(ETK_WIDGET(button->image));
+   else
+      etk_widget_hide(ETK_WIDGET(button->image));
+   
+   button->ignore_image_remove = ETK_FALSE;
 }
 
 /** @} */
@@ -712,7 +735,7 @@
  * @image html widgets/button.png
  * An Etk_Button usually contains only a label and an icon, but it can contain 
any type of widgets. @n
  * You can change the label of the button with etk_button_label_set(), and you 
can change its icon with
- * etk_button_image_set()
+ * etk_button_image_set(). You can also pack your own widget with 
etk_bin_child_set()
  *
  * \par Object Hierarchy:
  * - Etk_Object
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_button.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- etk_button.h        22 Feb 2007 04:36:25 -0000      1.14
+++ etk_button.h        23 Feb 2007 03:25:40 -0000      1.15
@@ -19,10 +19,8 @@
 /** Checks if the object is an Etk_Button */
 #define ETK_IS_BUTTON(obj)    (ETK_OBJECT_CHECK_TYPE((obj), ETK_BUTTON_TYPE))
 
-/**
- * @enum Etk_Button_Style
- * @brief The button's style (icon, text, both vertically, both horizontally)
- */
+
+/** @brief The button's style (icon, text, both vertically, both horizontally) 
*/
 typedef enum Etk_Button_Style
 {
    ETK_BUTTON_ICON,             /**< Only the icon is visible */
@@ -31,6 +29,7 @@
    ETK_BUTTON_BOTH_VERT         /**< Both the icon and the label are visible, 
the icon is above the label */
 } Etk_Button_Style;
 
+
 /**
  * @brief @widget A widget that can be pressed, released or clicked
  * @structinfo
@@ -50,13 +49,15 @@
    void (*released)(Etk_Button *button);
    void (*clicked)(Etk_Button *button);
 
-   Etk_Bool building;
    Etk_Bool is_pressed;
+   Etk_Bool ignore_image_remove;
+   Etk_Bool image_from_stock;
    float xalign;
    float yalign;
    Etk_Button_Style style;
    Etk_Stock_Size stock_size;
 };
+
 
 Etk_Type   *etk_button_type_get(void);
 Etk_Widget *etk_button_new(void);
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_widget.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -3 -r1.98 -r1.99
--- etk_widget.c        22 Feb 2007 22:24:25 -0000      1.98
+++ etk_widget.c        23 Feb 2007 03:25:40 -0000      1.99
@@ -1693,7 +1693,7 @@
  */
 void etk_widget_dnd_source_set(Etk_Widget *widget, Etk_Bool on)
 {
-   if (!widget)
+   //if (!widget)
       return;
    
    if (on)
@@ -1767,7 +1767,7 @@
  */
 void etk_widget_dnd_drag_widget_set(Etk_Widget *widget, Etk_Widget 
*drag_widget)
 {
-   if(!widget || !drag_widget)
+   //if(!widget || !drag_widget)
      return;
    
    etk_container_add(ETK_CONTAINER(widget->drag), drag_widget);



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to