Added edit menu functionality
authordanigm <dani@danigm.net>
Tue, 11 May 2010 20:25:41 +0000 (22:25 +0200)
committerdanigm <dani@danigm.net>
Tue, 11 May 2010 20:25:41 +0000 (22:25 +0200)
data/ui/tbo-menu-ui.xml
src/selector-tool.c
src/selector-tool.h
src/ui-menu.c
src/ui-menu.h
src/ui-toolbar.c

index bc5173e..758e8b3 100644 (file)
@@ -17,6 +17,8 @@
        <menuitem name="delete" action="DeleteObj" />
        <menuitem name="fliph" action="FlipHObj" />
        <menuitem name="flipv" action="FlipVObj" />
+       <menuitem name="orderup" action="OrderUpObj" />
+       <menuitem name="orderdown" action="OrderDownObj" />
      </menu>
      <menu name="HelpMenu" action="Help">
          <menuitem name="About" action="About" />
index f0fef46..6820e61 100644 (file)
@@ -158,12 +158,14 @@ set_selected (Frame *frame, TboWindow *tbo)
     empty_tool_area (tbo);
     if (SELECTED != NULL)
         update_tool_area (tbo);
+    update_menubar (tbo);
 }
 
 void
 set_selected_obj (tbo_object *obj, TboWindow *tbo)
 {
     OBJ = obj;
+    update_menubar (tbo);
 }
 
 gboolean
@@ -788,3 +790,9 @@ selector_tool_get_selected_frame ()
     return SELECTED;
 }
 
+
+tbo_object *
+selector_tool_get_selected_obj ()
+{
+    return OBJ;
+}
index 79ea442..ba54913 100644 (file)
@@ -14,6 +14,7 @@ void selector_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo
 void selector_tool_drawing (cairo_t *cr);
 
 Frame *selector_tool_get_selected_frame ();
+tbo_object *selector_tool_get_selected_obj ();
 void frame_view_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
 void page_view_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo);
 void frame_view_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo);
index 57272cc..d0f6f92 100644 (file)
 #include "tbo-window.h"
 #include "ui-drawing.h"
 #include "export.h"
+#include "selector-tool.h"
+#include "comic.h"
+#include "frame.h"
+#include "page.h"
 
+static GtkActionGroup *MENU_ACTION_GROUP = NULL;
+
+void
+update_menubar (TboWindow *tbo)
+{
+    GtkAction *action;
+    int i;
+    char *actions[20] = {"FlipHObj", "FlipVObj", "OrderUpObj", "OrderDownObj", "DeleteObj", "CloneObj"};
+    int elements = 6;
+    int obj_n_elements = 4;
+    gboolean activated = FALSE;
+
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    Frame *frame = selector_tool_get_selected_frame ();
+
+    if (!MENU_ACTION_GROUP)
+        return;
+
+    if (get_frame_view () && obj)
+    {
+        for (i=0; i<elements; i++)
+        {
+            action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
+            gtk_action_set_sensitive (action, TRUE);
+        }
+    }
+    else if (!get_frame_view () && frame)
+    {
+        for (i=obj_n_elements; i<elements; i++)
+        {
+            action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
+            gtk_action_set_sensitive (action, TRUE);
+        }
+    }
+    else
+    {
+        for (i=0; i<elements; i++)
+        {
+            action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
+            gtk_action_set_sensitive (action, FALSE);
+        }
+    }
+}
 
 gboolean menu_handler (GtkWidget *widget, gpointer data){
     printf ("Menu :%s\n", ((TboWindow *) data)->comic->title);
     return FALSE;
 }
 
+gboolean
+clone_obj_cb (GtkWidget *widget, gpointer data)
+{
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    Frame *frame = selector_tool_get_selected_frame ();
+    Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
+
+    if (!get_frame_view () && frame)
+    {
+        Frame *cloned_frame = tbo_frame_clone (frame);
+        cloned_frame->x += 10;
+        cloned_frame->y -= 10;
+        tbo_page_add_frame (page, cloned_frame);
+        set_selected (cloned_frame, (TboWindow*)data);
+    }
+    else if (obj && get_frame_view ())
+    {
+        tbo_object *cloned_obj = obj->clone (obj);
+        cloned_obj->x += 10;
+        cloned_obj->y -= 10;
+        tbo_frame_add_obj (frame, cloned_obj);
+        set_selected_obj (cloned_obj, (TboWindow*)data);
+    }
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
+gboolean
+delete_obj_cb (GtkWidget *widget, gpointer data)
+{
+    TboWindow *tbo = (TboWindow *)data;
+
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    Frame *frame = selector_tool_get_selected_frame ();
+    Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
+
+    if (obj && get_frame_view ())
+    {
+        tbo_frame_del_obj (frame, obj);
+        set_selected_obj (NULL, tbo);
+    }
+    else if (!get_frame_view () && frame)
+    {
+        tbo_page_del_frame (page, frame);
+        set_selected (NULL, tbo);
+    }
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
+gboolean
+flip_v_cb (GtkWidget *widget, gpointer data)
+{
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    if (obj)
+        tbo_object_flipv (obj);
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
+gboolean
+flip_h_cb (GtkWidget *widget, gpointer data)
+{
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    if (obj)
+        tbo_object_fliph (obj);
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
+gboolean
+order_up_cb (GtkWidget *widget, gpointer data)
+{
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    if (obj)
+        tbo_object_order_up (obj);
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
+gboolean
+order_down_cb (GtkWidget *widget, gpointer data)
+{
+    tbo_object *obj = selector_tool_get_selected_obj ();
+    if (obj)
+        tbo_object_order_down (obj);
+    update_drawing ((TboWindow *)data);
+    return FALSE;
+}
+
 gboolean close_cb (GtkWidget *widget, gpointer data){
     printf ("Ventana cerrada\n");
     tbo_window_free_cb (widget, NULL, ((TboWindow *) data));
@@ -102,16 +239,22 @@ static const GtkActionEntry tbo_menu_entries [] = {
 
     { "CloneObj", GTK_STOCK_COPY, N_("Clone"), "<control>d",
       N_("Clone"),
-      G_CALLBACK (menu_handler) },
+      G_CALLBACK (clone_obj_cb) },
     { "DeleteObj", GTK_STOCK_DELETE, N_("Delete"), "Delete",
       N_("Delete"),
-      G_CALLBACK (menu_handler) },
+      G_CALLBACK (delete_obj_cb) },
     { "FlipHObj", NULL, N_("Horizontal flip"), "h",
       N_("Horizontal flip"),
-      G_CALLBACK (menu_handler) },
+      G_CALLBACK (flip_h_cb) },
     { "FlipVObj", NULL, N_("Vertical flip"), "v",
       N_("Vertical flip"),
-      G_CALLBACK (menu_handler) },
+      G_CALLBACK (flip_v_cb) },
+    { "OrderUpObj", NULL, N_("Move to front"), "Page_Up",
+      N_("Move up"),
+      G_CALLBACK ( order_up_cb ) },
+    { "OrderDownObj", NULL, N_("Move to back"), "Page_Down",
+      N_("Move up"),
+      G_CALLBACK ( order_down_cb ) },
 
     /* Help menu */
 
@@ -122,7 +265,6 @@ static const GtkActionEntry tbo_menu_entries [] = {
 
 GtkWidget *generate_menu (TboWindow *window){
     GtkWidget *menu;
-    GtkActionGroup *action_group;
     GtkUIManager *manager;
     GError *error = NULL;
 
@@ -134,15 +276,15 @@ GtkWidget *generate_menu (TboWindow *window){
         g_error_free (error);
     }
 
-    action_group = gtk_action_group_new ("MenuActions");
-    gtk_action_group_set_translation_domain (action_group, NULL);
-    gtk_action_group_add_actions (action_group, tbo_menu_entries,
+    MENU_ACTION_GROUP = gtk_action_group_new ("MenuActions");
+    gtk_action_group_set_translation_domain (MENU_ACTION_GROUP, NULL);
+    gtk_action_group_add_actions (MENU_ACTION_GROUP, tbo_menu_entries,
                         G_N_ELEMENTS (tbo_menu_entries), window);
 
-    gtk_ui_manager_insert_action_group (manager, action_group, 0);
+    gtk_ui_manager_insert_action_group (manager, MENU_ACTION_GROUP, 0);
 
     menu = gtk_ui_manager_get_widget (manager, "/menubar");
-    
+
     return menu;
 }
 
index 4a0341a..9a79cfc 100644 (file)
@@ -5,5 +5,6 @@
 #include "tbo-window.h"
 
 GtkWidget *generate_menu (TboWindow *window);
+void update_menubar (TboWindow *tbo);
 
 #endif
index 5be0285..d913df7 100644 (file)
@@ -171,6 +171,7 @@ update_toolbar (TboWindow *tbo)
         gtk_action_set_sensitive (pix, TRUE);
         gtk_action_set_sensitive (new_frame, FALSE);
     }
+    update_menubar (tbo);
 }
 
 gboolean