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 = >K_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