r139 - in trunk/src/target/OM-2007: artwork/themes/openmoko-standard/gtk-2.0 examples/openmoko-paned-demo libraries/mokoui

mickey at gta01.hmw-consulting.de mickey at gta01.hmw-consulting.de
Sat Oct 28 20:12:30 CEST 2006


Author: mickey
Date: 2006-10-28 18:12:29 +0000 (Sat, 28 Oct 2006)
New Revision: 139

Modified:
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokotoolbox
   trunk/src/target/OM-2007/examples/openmoko-paned-demo/demo-main.c
   trunk/src/target/OM-2007/libraries/mokoui/moko-menubox.c
   trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.c
   trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.h
   trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.c
   trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.h
Log:
mokoui: MokoPixmapButton features a popup menu mode now


Modified: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc
===================================================================
--- trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc	2006-10-28 18:12:29 UTC (rev 139)
@@ -1,5 +1,3 @@
-gtk-font-name = "Vera Sans 16"
-
 include "gtkmenuitem"
 include "gtkscrollbar"
 
@@ -34,6 +32,8 @@
     text[SELECTED]    = "#ffffff" # white
     text[INSENSITIVE] = "#a69872" # very dark brown
 
+    font_name = "Vera Sans 16"
+
 }
-# class "GtkWidget" style "default"
+class "GtkWidget" style "default"
 

Modified: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokotoolbox
===================================================================
--- trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokotoolbox	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokotoolbox	2006-10-28 18:12:29 UTC (rev 139)
@@ -62,3 +62,7 @@
 }
 widget "*.mokotoolbox-action-button" style "mokotoolbox-action-button"
 
+style "mokotoolbox-action-button-label" {
+    font_name = "Vera Sans 12"
+}
+widget "*.mokotoolbox-action-button.GtkLabel" style "mokotoolbox-action-button-label"

Modified: trunk/src/target/OM-2007/examples/openmoko-paned-demo/demo-main.c
===================================================================
--- trunk/src/target/OM-2007/examples/openmoko-paned-demo/demo-main.c	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/examples/openmoko-paned-demo/demo-main.c	2006-10-28 18:12:29 UTC (rev 139)
@@ -22,11 +22,32 @@
 #include <mokoui/moko-toolbox.h>
 
 #include <gtk/gtkactiongroup.h>
+#include <gtk/gtkbutton.h>
 #include <gtk/gtklabel.h>
 #include <gtk/gtkcheckmenuitem.h>
 #include <gtk/gtkmain.h>
 #include <gtk/gtkmenu.h>
 
+void cb_button1_clicked(GtkButton *button, gpointer user_data)
+{
+    g_debug( "openmoko-paned-demo: button1 clicked" );
+}
+
+void cb_button2_clicked(GtkButton *button, gpointer user_data)
+{
+    g_debug( "openmoko-paned-demo: button2 clicked" );
+}
+
+void cb_button3_clicked(GtkButton *button, gpointer user_data)
+{
+    g_debug( "openmoko-paned-demo: button3 clicked" );
+}
+
+void cb_button4_clicked(GtkButton *button, gpointer user_data)
+{
+    g_debug( "openmoko-paned-demo: button4 clicked" );
+}
+
 static gboolean searchmode = TRUE;
 
 int main( int argc, char** argv )
@@ -72,28 +93,33 @@
     GtkLabel* navigation = gtk_label_new( "Add your widget for navigating\nthrough appplication specific\ndata here" );
     moko_paned_window_set_upper_pane( window, GTK_WIDGET(navigation) );
 
+    GtkButton* button1;
+    GtkButton* button2;
+    GtkButton* button3;
+    GtkButton* button4;
+
     /* tool bar */
     MokoToolBox* toolbox;
     if (!searchmode)
     {
         toolbox = MOKO_TOOL_BOX(moko_tool_box_new());
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
     } else {
         toolbox = MOKO_TOOL_BOX(moko_tool_box_new_with_search());
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
-        moko_tool_box_add_action_button( toolbox );
     }
+    button1 = moko_tool_box_add_action_button( toolbox );
+    gtk_button_set_label( button1, "Action 1" );
+    button2 = moko_tool_box_add_action_button( toolbox );
+    gtk_button_set_label( button2, "Action 2" );
+    button3 = moko_tool_box_add_action_button( toolbox );
+    gtk_button_set_label( button3, "ActMenu" );
+    button4 = moko_tool_box_add_action_button( toolbox );
+    gtk_button_set_label( button4, "Action 4" );
     moko_paned_window_add_toolbox( window, toolbox );
 
-#if 0
-    GtkToolButton* tool_action1 = GTK_TOOL_BUTTON(gtk_tool_button_new( NULL, "action1" ));
-    gtk_toolbar_insert( GTK_TOOLBAR(toolbar), tool_action1, -1 );
+    g_signal_connect( G_OBJECT(button1), "clicked", G_CALLBACK(cb_button1_clicked), NULL );
+    g_signal_connect( G_OBJECT(button2), "clicked", G_CALLBACK(cb_button2_clicked), NULL );
+    g_signal_connect( G_OBJECT(button3), "clicked", G_CALLBACK(cb_button3_clicked), NULL );
+    g_signal_connect( G_OBJECT(button4), "clicked", G_CALLBACK(cb_button4_clicked), NULL );
 
     GtkMenu* actionmenu = GTK_MENU(gtk_menu_new());
     GtkMenuItem* fooitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Foo" ));
@@ -102,18 +128,10 @@
     gtk_widget_show( GTK_WIDGET(baritem) );
     gtk_menu_shell_append( actionmenu, fooitem );
     gtk_menu_shell_append( actionmenu, baritem );
+    moko_pixmap_button_set_menu( MOKO_PIXMAP_BUTTON(button3), actionmenu );
+    gtk_widget_show_all( actionmenu );
 
-    GtkMenuToolButton* tool_menu = GTK_MENU_TOOL_BUTTON(gtk_menu_tool_button_new( NULL, "amenu" ));
-    gtk_menu_tool_button_set_menu( tool_menu, actionmenu );
-    gtk_toolbar_insert( GTK_TOOLBAR(toolbar), GTK_TOOL_BUTTON(tool_menu), -1 );
-
-    GtkToolButton* tool_action3 = GTK_TOOL_BUTTON(gtk_tool_button_new( NULL, "action3" ));
-    gtk_toolbar_insert( GTK_TOOLBAR(toolbar), tool_action3, -1 );
-
-    GtkToolButton* tool_action4 = GTK_TOOL_BUTTON(gtk_tool_button_new( NULL, "action4" ));
-    gtk_toolbar_insert( GTK_TOOLBAR(toolbar), tool_action4, -1 );
-#endif
-                                                                                /* details area */
+    /* details area */
     GtkLabel* details = gtk_label_new( "Add your widget for showing\ndetails for the selected\ndata entry here" );
     moko_paned_window_set_lower_pane( window, GTK_WIDGET(details) );
 

Modified: trunk/src/target/OM-2007/libraries/mokoui/moko-menubox.c
===================================================================
--- trunk/src/target/OM-2007/libraries/mokoui/moko-menubox.c	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/libraries/mokoui/moko-menubox.c	2006-10-28 18:12:29 UTC (rev 139)
@@ -27,7 +27,11 @@
 typedef struct _MokoMenuBoxPriv
 {
     GtkMenuBar* menubar_l;
+    GtkMenuItem* appitem;
+    GtkMenu* appmenu;
     GtkMenuBar* menubar_r;
+    GtkMenuItem* filteritem;
+    GtkMenu* filtermenu;
 } MokoMenuBoxPriv;
 
 /* add your signals here */
@@ -101,11 +105,24 @@
     /* destruct your widgets here */
 }
 
-static gboolean cb_button_release(GtkWidget *widget, GdkEventButton *event, GtkMenuShell* menu)
+static gboolean cb_button_release(GtkWidget *widget, GdkEventButton *event, GtkMenu* menu)
 {
     //FIXME don't open menu when it is already opened
-    g_debug( "menu open forwarder..." );
-    gtk_menu_shell_select_first( GTK_MENU_SHELL(widget), TRUE );
+    g_debug( "menu open forwarder activated..." );
+
+    g_debug( "clicked on %f, %f", event->x, event->y );
+
+    if ( !GTK_WIDGET_VISIBLE(menu) )
+    {
+        g_debug( "menu open forwarder: not yet open -- popping up" );
+        gtk_menu_shell_select_first( GTK_MENU_SHELL(widget), FALSE );
+        return FALSE;
+    }
+    {
+        g_debug( "menu open forwarder: already open -- ignoring" );
+        gtk_menu_popdown( menu );
+        return TRUE;
+    }
 }
 
 static void cb_filter_menu_update( GtkMenu* menu, GtkMenuItem* filtitem )
@@ -138,13 +155,16 @@
         priv->menubar_l = gtk_menu_bar_new();
         gtk_widget_set_name( GTK_WIDGET(priv->menubar_l), "mokomenubox-application-menubar" );
         gtk_box_pack_start( GTK_BOX(self), GTK_WIDGET(priv->menubar_l), TRUE, TRUE, 0 );
+
     }
     GtkMenuItem* appitem = gtk_menu_item_new_with_label( g_get_application_name() );
+    priv->appitem = appitem;
+    priv->appmenu = menu;
     gtk_menu_item_set_submenu( appitem, menu );
     gtk_menu_shell_append( GTK_MENU_BAR(priv->menubar_l), appitem );
 
     //FIXME hack to popup the first menu if user clicks on menubar
-    g_signal_connect( GTK_WIDGET(priv->menubar_l), "button-release-event", G_CALLBACK(cb_button_release), appitem );
+    //g_signal_connect( GTK_WIDGET(priv->menubar_l), "button-release-event", G_CALLBACK(cb_button_release), menu );
 }
 
 void moko_menu_box_set_filter_menu(MokoMenuBox* self, GtkMenu* menu)
@@ -159,11 +179,13 @@
         gtk_box_pack_end( GTK_BOX(self), GTK_WIDGET(priv->menubar_r), TRUE, TRUE, 0 );
     }
     GtkMenuItem* filtitem = gtk_menu_item_new_with_label( "Filter Menu" );
+    priv->filteritem = filtitem;
+    priv->filtermenu = menu;
     g_signal_connect (G_OBJECT(menu), "selection_done", G_CALLBACK(cb_filter_menu_update), filtitem );
     gtk_menu_item_set_submenu( filtitem, menu );
     gtk_menu_shell_append( GTK_MENU_BAR(priv->menubar_r), filtitem );
 
     //FIXME hack to popup the first menu if user clicks on menubar
-    g_signal_connect( GTK_WIDGET(priv->menubar_r), "button-release-event", G_CALLBACK(cb_button_release), filtitem );
+    //g_signal_connect( GTK_WIDGET(priv->menubar_r), "button-release-event", G_CALLBACK(cb_button_release), menu );
 }
 

Modified: trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.c
===================================================================
--- trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.c	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.c	2006-10-28 18:12:29 UTC (rev 139)
@@ -18,16 +18,17 @@
 
 #include "moko-pixmap-button.h"
 
+#include <gtk/gtkmenu.h>
+
 G_DEFINE_TYPE (MokoPixmapButton, moko_pixmap_button, GTK_TYPE_BUTTON);
 
-#define PIXMAP_BUTTON_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_PIXMAP_BUTTON, MokoPixmapButtonPrivate))
+#define MOKO_PIXMAP_BUTTON_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_PIXMAP_BUTTON, MokoPixmapButtonPrivate))
 #define CHILD_SPACING 1
 
-typedef struct _MokoPixmapButtonPrivate MokoPixmapButtonPrivate;
-
-struct _MokoPixmapButtonPrivate
+typedef struct _MokoPixmapButtonPrivate
 {
-};
+    GtkMenu *menu;
+} MokoPixmapButtonPrivate;
 
 static void
 moko_pixmap_button_size_request (GtkWidget *widget, GtkRequisition *requisition);
@@ -68,19 +69,56 @@
     object_class->finalize = moko_pixmap_button_finalize;
 }
 
+/* callbacks */
 static void
-moko_pixmap_button_init (MokoPixmapButton *self)
+cb_menu_position_func (GtkMenu *menu, int *x, int *y, gboolean *push_in, MokoPixmapButton  *button)
 {
-    g_debug( "moko_pixmap_button_init" );
+    GtkAllocation* allocation = &GTK_WIDGET(button)->allocation;
+    GtkRequisition req;
+    GtkRequisition menu_req;
+    GtkOrientation orientation;
+    GtkTextDirection direction;
+
+    gdk_window_get_origin(GTK_BUTTON(button)->event_window, x, y);
+    g_debug( "menu popup @ %d, %d", *x, *y );
+
+    *y += allocation->height;
+
+    g_debug( "size allocate = %d, %d * %d, %d", allocation->x, allocation->y, allocation->width, allocation->height );
+    *push_in = TRUE;
+
+    g_debug( "menu popup @ %d, %d", *x, *y );
 }
 
-MokoPixmapButton*
-moko_pixmap_button_new (void)
+static void
+cb_button_clicked(MokoPixmapButton* self, gpointer data)
 {
-    return g_object_new (MOKO_TYPE_PIXMAP_BUTTON, NULL);
+  MokoPixmapButtonPrivate *priv = MOKO_PIXMAP_BUTTON_GET_PRIVATE(self);
+
+  if (!priv->menu)
+    return;
+
+  if (!GTK_WIDGET_VISIBLE(priv->menu))
+    {
+      /* we get here only when the menu is activated by a key
+       * press, so that we can select the first menu item */
+          gtk_menu_popup (priv->menu, NULL, NULL,
+                  (GtkMenuPositionFunc) cb_menu_position_func,
+                  self, 0, gtk_get_current_event_time ());
 }
+}
 
 static void
+moko_pixmap_button_init (MokoPixmapButton *self)
+{
+    g_debug( "moko_pixmap_button_init" );
+    gtk_button_set_focus_on_click( GTK_BUTTON(self), FALSE ); //FIXME probably don't need this when focus is invisible
+    g_object_set_property( GTK_BUTTON(self), "can-focus", FALSE ); //FIXME probably don't need this when focus is invisible
+
+    g_signal_connect( G_OBJECT(self), "clicked", G_CALLBACK(cb_button_clicked), NULL );
+}
+
+static void
 moko_pixmap_button_size_request (GtkWidget *widget, GtkRequisition *requisition)
 {
     g_debug( "moko_pixmap_button_size_request" );
@@ -102,6 +140,12 @@
         g_debug( "moko_pixmap_button_size_request: style requested size = '%d x %d'", size_request->right, size_request->bottom );
         requisition->width = size_request->right;
         requisition->height = size_request->bottom;
+
+        if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child))
+        {
+            GtkRequisition child_requisition;
+            gtk_widget_size_request (GTK_BIN (button)->child, &child_requisition);
+        }
     }
     else // old dynamic routine
     {
@@ -130,3 +174,18 @@
         requisition->height += 2 * (focus_width + focus_pad);
     }
 }
+
+/* public API */
+MokoPixmapButton*
+moko_pixmap_button_new (void)
+{
+    return g_object_new (MOKO_TYPE_PIXMAP_BUTTON, NULL);
+}
+
+void
+moko_pixmap_button_set_menu (MokoPixmapButton* self, GtkMenu* menu)
+{
+    MokoPixmapButtonPrivate* priv = MOKO_PIXMAP_BUTTON_GET_PRIVATE(self);
+    g_assert( !priv->menu ); //FIXME what's canon for these things? a) Error out or b) just don't do it or c) free the old menu and set the new one?
+    priv->menu = menu;
+}

Modified: trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.h
===================================================================
--- trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.h	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/libraries/mokoui/moko-pixmap-button.h	2006-10-28 18:12:29 UTC (rev 139)
@@ -20,6 +20,8 @@
 #define _MOKO_PIXMAP_BUTTON_H_
 
 #include <gtk/gtkbutton.h>
+#include <gtk/gtkmenu.h>
+
 #include <glib-object.h>
 
 G_BEGIN_DECLS
@@ -39,9 +41,10 @@
     GtkButtonClass parent_class;
 } MokoPixmapButtonClass;
 
-GType moko_pixmap_button_get_type (void);
+GType moko_pixmap_button_get_type(void);
 
-MokoPixmapButton* moko_pixmap_button_new (void);
+MokoPixmapButton* moko_pixmap_button_new(void);
+void moko_pixmap_button_set_menu(MokoPixmapButton* self, GtkMenu* menu);
 
 G_END_DECLS
 

Modified: trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.c
===================================================================
--- trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.c	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.c	2006-10-28 18:12:29 UTC (rev 139)
@@ -158,7 +158,7 @@
 
 /* add new methods here */
 
-void moko_tool_box_add_search_button(MokoToolBox* self )
+void moko_tool_box_add_search_button(MokoToolBox* self)
 {
 #if 0
     MokoToolBoxPriv* priv = MOKO_TOOL_BOX_GET_PRIVATE(self);
@@ -176,7 +176,7 @@
     return priv->buttonbox;
 }
 
-void moko_tool_box_add_action_button(MokoToolBox* self)
+MokoPixmapButton* moko_tool_box_add_action_button(MokoToolBox* self)
 {
     g_debug( "moko_tool_box_add_action_button" );
     MokoToolBoxPriv* priv = MOKO_TOOL_BOX_GET_PRIVATE(self);
@@ -185,4 +185,6 @@
     gtk_widget_set_name( GTK_WIDGET(button), "mokotoolbox-action-button" );
 
     gtk_box_pack_start( GTK_BOX(priv->buttonbox), GTK_WIDGET(button), FALSE, FALSE, 0 );
+
+    return button;
 }
\ No newline at end of file

Modified: trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.h
===================================================================
--- trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.h	2006-10-28 12:43:23 UTC (rev 138)
+++ trunk/src/target/OM-2007/libraries/mokoui/moko-toolbox.h	2006-10-28 18:12:29 UTC (rev 139)
@@ -19,11 +19,15 @@
 #ifndef _MOKO_TOOL_BOX_H_
 #define _MOKO_TOOL_BOX_H_
 
-#include <glib.h>
-#include <glib-object.h>
+#include "moko-pixmap-button.h"
+
 #include <gtk/gtknotebook.h>
 #include <gtk/gtkhbox.h>
 
+#include <glib.h>
+#include <glib-object.h>
+
+
 G_BEGIN_DECLS
 
 #define MOKO_TYPE_TOOL_BOX            (moko_tool_box_get_type())
@@ -53,9 +57,8 @@
 void           moko_tool_box_clear       (MokoToolBox* self);
 
 /* add additional methods here */
-void moko_tool_box_add_search_button(MokoToolBox* self );
 GtkHBox* moko_tool_box_get_button_box( MokoToolBox* self );
-void moko_tool_box_add_action_button(MokoToolBox* self );
+MokoPixmapButton* moko_tool_box_add_action_button(MokoToolBox* self);
 
 G_END_DECLS
 





More information about the commitlog mailing list