Menu y barras de herramientas con UIManager. config.h para definir el
authordanigm <danigm>
Sat, 19 Dec 2009 19:01:18 +0000 (19:01 +0000)
committerdanigm <danigm@aa302d1f-72b1-406a-902b-8593ca2b2744>
Sat, 19 Dec 2009 19:01:18 +0000 (19:01 +0000)
directorio de datos

git-svn-id: https://forja.rediris.es/svn/cusl4-tbo@11 aa302d1f-72b1-406a-902b-8593ca2b2744

13 files changed:
CMakeLists.txt
TODO
compile.sh
data/icon.png [new file with mode: 0644]
data/ui/tbo-menu-ui.xml [new file with mode: 0644]
src/CMakeLists.txt
src/config.h.cmake [new file with mode: 0644]
src/icon.png [deleted file]
src/tbo.c
src/ui-menu.c
src/ui-menu.h
src/ui-toolbar.c
src/ui-toolbar.h

index 757f3c3..9ec4dd6 100644 (file)
@@ -6,3 +6,4 @@ ADD_SUBDIRECTORY(src)
 
 INSTALL(PROGRAMS build/src/tbo DESTINATION bin)
 
+#TODO, install data
diff --git a/TODO b/TODO
index aaec431..90f2e3c 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
-- Menu y barra de herramientas con UIManager y actiongroups
 - Dialogo de nuevo comic (pedir tamaño)
 - Varios controles avanzados sobre cairo, como viñeta, globo, texto,
   etc
index 28409f9..a531290 100755 (executable)
@@ -5,8 +5,10 @@ then
     mkdir build
 fi
 
+DATA="$PWD/data"
+
 cd build
-cmake ../
+cmake -DDATA_DIR=$DATA ../
 make
 cd ..
 cp build/src/tbo .
diff --git a/data/icon.png b/data/icon.png
new file mode 100644 (file)
index 0000000..8700550
Binary files /dev/null and b/data/icon.png differ
diff --git a/data/ui/tbo-menu-ui.xml b/data/ui/tbo-menu-ui.xml
new file mode 100644 (file)
index 0000000..babedf0
--- /dev/null
@@ -0,0 +1,20 @@
+<ui>
+    <menubar>
+     <menu name="FileMenu" action="File">
+       <menuitem name="New" action="NewFile" />
+       <menuitem name="Open" action="OpenFile" />
+       <menuitem name="Save" action="SaveFile" />
+       <menuitem name="Quit" action="Quit" />
+     </menu>
+    </menubar>
+    <toolbar action="toolbar">
+     <placeholder name="FileItems">
+       <separator/>
+       <toolitem name="New" action="NewFile"/>
+       <toolitem name="Open" action="OpenFile"/>
+       <toolitem name="Right" action="SaveFile"/>
+       <separator/>
+     </placeholder>
+    </toolbar>
+</ui>
+
index 491fadf..366951b 100644 (file)
@@ -2,6 +2,11 @@ project(TBO)
 
 cmake_minimum_required(VERSION 2.8)
 
+set(DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/tbo CACHE string "Shared directory")
+
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake 
+${CMAKE_CURRENT_SOURCE_DIR}/config.h)
+
 FIND_PACKAGE(GTK2)
 
 set(SRCS
diff --git a/src/config.h.cmake b/src/config.h.cmake
new file mode 100644 (file)
index 0000000..967a49b
--- /dev/null
@@ -0,0 +1 @@
+#cmakedefine DATA_DIR "${DATA_DIR}"
diff --git a/src/icon.png b/src/icon.png
deleted file mode 100644 (file)
index 8700550..0000000
Binary files a/src/icon.png and /dev/null differ
index 2b60a6a..740568c 100644 (file)
--- a/src/tbo.c
+++ b/src/tbo.c
@@ -4,6 +4,7 @@
 #include "ui-menu.h"
 #include "ui-toolbar.h"
 #include "ui-drawing.h"
+#include "config.h"
 
 GdkPixbuf *create_pixbuf (const gchar * filename)
 {
@@ -18,6 +19,7 @@ GdkPixbuf *create_pixbuf (const gchar * filename)
    return pixbuf;
 }
 
+
 int main (int argc, char**argv){
     gtk_init (&argc, &argv);
 
@@ -26,10 +28,13 @@ int main (int argc, char**argv){
     GtkWidget *menu;
     GtkWidget *toolbar;
     GtkWidget *darea;
+    GError *error = NULL;
+
+    GtkUIManager *manager;
 
     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
-    gtk_window_set_icon (GTK_WINDOW (window), create_pixbuf ("icon.png"));
+    gtk_window_set_icon (GTK_WINDOW (window), create_pixbuf (DATA_DIR "/icon.png"));
 
     g_signal_connect (window, "delete-event", G_CALLBACK (close_cb), NULL);
 
@@ -37,12 +42,20 @@ int main (int argc, char**argv){
     container = gtk_vbox_new (FALSE, 0);
     gtk_container_add (GTK_CONTAINER (window), container);
 
+    manager = gtk_ui_manager_new ();
+    gtk_ui_manager_add_ui_from_file (manager, DATA_DIR "/ui/tbo-menu-ui.xml", &error);
+    if (error != NULL)
+    {
+        g_warning ("Could not merge tbo-menu-ui.xml: %s", error->message);
+        g_error_free (error);
+    }
+
     // Generando el menu de la aplicacion
-    menu = generate_menu ();
+    menu = generate_menu (manager, window);
     gtk_box_pack_start (GTK_BOX (container), menu, FALSE, FALSE, 0);
 
     // Generando la barra de herramientas de la aplicacion
-    toolbar = generate_toolbar ();
+    toolbar = generate_toolbar (manager, window);
     gtk_box_pack_start (GTK_BOX (container), toolbar, FALSE, FALSE, 0);
 
     //darea = get_drawing_area();
index 21a6f12..bb1a74d 100644 (file)
@@ -12,36 +12,42 @@ gboolean close_cb (GtkWidget *widget, GdkEvent *event, gpointer data){
     gtk_main_quit ();
 }
 
-void add_new_menu_item (GtkWidget *menu, const char *label, void *cb, gpointer data){
-    GtkWidget *item;
-    item = gtk_menu_item_new_with_label (label);
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-    g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK(cb), data);
-}
+static const GtkActionEntry tbo_menu_entries [] = {
+    /* Toplevel */
 
-void add_new_image_menu_item (GtkWidget *menu, const gchar *stock_id, void *cb, gpointer data){
-    GtkWidget *item;
-    item = gtk_image_menu_item_new_from_stock (stock_id, gtk_accel_group_new ());
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-    g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK(cb), data);
-}
+    { "File", NULL, "_File" },
+
+    /* File menu */
+
+    { "NewFile", GTK_STOCK_NEW, "_New", "<control>N",
+      "Create a new file",
+      G_CALLBACK (menu_handler) },
+
+    { "OpenFile", GTK_STOCK_OPEN, "_Open", "<control>O",
+      "Open a new file",
+      G_CALLBACK (menu_handler) },
 
-GtkWidget *generate_menu (){
+    { "SaveFile", GTK_STOCK_SAVE, "_Save", "<control>S",
+      "Save current document",
+      G_CALLBACK (menu_handler) },
+
+    { "Quit", GTK_STOCK_QUIT, "_Quit", "<control>Q",
+      "Quit",
+      G_CALLBACK (close_cb) },
+};
+
+GtkWidget *generate_menu (GtkUIManager *manager, GtkWidget *window){
     GtkWidget *menu;
-    GtkWidget *file_item, *menu_file;
-    
-    menu = gtk_menu_bar_new ();
+    GtkActionGroup *action_group;
 
-    menu_file = gtk_menu_new ();   
-    add_new_image_menu_item(menu_file, GTK_STOCK_NEW, G_CALLBACK(menu_handler), NULL);
-    add_new_image_menu_item(menu_file, GTK_STOCK_OPEN, G_CALLBACK(menu_handler), NULL);
-    add_new_image_menu_item(menu_file, GTK_STOCK_SAVE, G_CALLBACK(menu_handler), NULL);
-    add_new_image_menu_item(menu_file, GTK_STOCK_QUIT, G_CALLBACK(close_cb), NULL);
+    action_group = gtk_action_group_new ("MenuActions");
+    gtk_action_group_add_actions (action_group, tbo_menu_entries,
+                        G_N_ELEMENTS (tbo_menu_entries), window);
 
-    file_item = gtk_menu_item_new_with_label ("Archivo");
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (file_item), menu_file);
-    gtk_menu_bar_append (GTK_MENU_BAR (menu), file_item);
+    gtk_ui_manager_insert_action_group (manager, action_group, 0);
 
+    menu = gtk_ui_manager_get_widget (manager, "/menubar");
+    
     return menu;
 }
 
index fef0d17..9e3f667 100644 (file)
@@ -5,8 +5,6 @@
 
 gboolean menu_handler (GtkWidget *widget, GdkEvent *event, gpointer data);
 gboolean close_cb (GtkWidget *widget, GdkEvent *event, gpointer data);
-void add_new_menu_item (GtkWidget *menu, const char *label, void *cb, gpointer data);
-void add_new_image_menu_item (GtkWidget *menu, const gchar *stock_id, void *cb, gpointer data);
-GtkWidget *generate_menu ();
+GtkWidget *generate_menu (GtkUIManager *manager, GtkWidget *window);
 
 #endif
index 0cb9f3c..84b4ce7 100644 (file)
@@ -1,28 +1,37 @@
 #include <stdio.h>
 #include <gtk/gtk.h>
+#include "ui-menu.h"
 #include "ui-toolbar.h"
 
 gboolean toolbar_handler (GtkWidget *widget, GdkEvent *event, gpointer data){
     printf("toolbar\n");
 }
 
-void add_new_image_toolbar_item (GtkWidget *toolbar, const gchar *stock_id, void *cb, gpointer data){
-    GtkToolItem *item;
-    item = gtk_tool_button_new_from_stock (stock_id);
-    gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
-    g_signal_connect (G_OBJECT (item), "clicked", G_CALLBACK (cb), data);
-}
+static const GtkActionEntry tbo_tools_entries [] = {
+    { "NewFile", GTK_STOCK_NEW, "_New", "<control>N",
+      "Create a new file",
+      G_CALLBACK (toolbar_handler) },
+
+    { "OpenFile", GTK_STOCK_OPEN, "_Open", "<control>O",
+      "Open a new file",
+      G_CALLBACK (toolbar_handler) },
 
-GtkWidget *generate_toolbar (){
+    { "SaveFile", GTK_STOCK_SAVE, "_Save", "<control>S",
+      "Save current document",
+      G_CALLBACK (toolbar_handler) },
+};
+
+GtkWidget *generate_toolbar (GtkUIManager *manager, GtkWidget *window){
     GtkWidget *toolbar;
+    GtkActionGroup *action_group;
 
-    toolbar = gtk_toolbar_new ();
-    gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
-    
-    add_new_image_toolbar_item (toolbar, GTK_STOCK_NEW, G_CALLBACK (toolbar_handler), NULL);
-    add_new_image_toolbar_item (toolbar, GTK_STOCK_OPEN, G_CALLBACK (toolbar_handler), NULL);
-    add_new_image_toolbar_item (toolbar, GTK_STOCK_SAVE, G_CALLBACK (toolbar_handler), NULL);
+    action_group = gtk_action_group_new ("ToolsActions");
+    gtk_action_group_add_actions (action_group, tbo_tools_entries,
+                        G_N_ELEMENTS (tbo_tools_entries), window);
 
+    gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+    toolbar = gtk_ui_manager_get_widget (manager, "/toolbar");
+    
     return toolbar;
 }
-
index 6368164..643fff7 100644 (file)
@@ -4,8 +4,7 @@
 #include <gtk/gtk.h>
 
 gboolean toolbar_handler (GtkWidget *widget, GdkEvent *event, gpointer data);
-void add_new_image_toolbar_item (GtkWidget *toolbar, const gchar *stock_id, void *cb, gpointer data);
-GtkWidget *generate_toolbar ();
+GtkWidget *generate_toolbar (GtkUIManager *manager, GtkWidget *window);
 
 #endif