From 8a4d7e354f95ed66450b43c1660d8d85e4c3a6d1 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sun, 5 Sep 2010 18:51:17 +0300 Subject: [PATCH] gui: canvas popup menu --- gui/canvas.cpp | 49 ++++++++++++++++++++++++++-- gui/canvas.h | 5 ++- gui/graph_canvas.c | 14 ++++++-- gui/graph_canvas.h | 3 +- gui/graph_view.c | 7 +++- gui/menu.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++ gui/menu.h | 3 ++ gui/world_tree.c | 74 +----------------------------------------- 8 files changed, 155 insertions(+), 81 deletions(-) diff --git a/gui/canvas.cpp b/gui/canvas.cpp index e141c61f..398d66b8 100644 --- a/gui/canvas.cpp +++ b/gui/canvas.cpp @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2008, 2009 Nedko Arnaudov + * Copyright (C) 2008, 2009, 2010 Nedko Arnaudov * Copyright (C) 2007 Dave Robillard * ************************************************************************** @@ -39,11 +39,17 @@ public: double height, void (* connect_request)(void * port1_context, void * port2_context), void (* disconnect_request)(void * port1_context, void * port2_context), - void (* module_location_changed)(void * module_context, double x, double y)) + void (* module_location_changed)(void * module_context, double x, double y), + void (* fill_canvas_menu)(GtkMenu * menu), + void (* fill_module_menu)(GtkMenu * menu, void * module_context), + void (* fill_port_menu)(GtkMenu * menu, void * port_context)) : FlowCanvas::Canvas(width, height) , m_connect_request(connect_request) , m_disconnect_request(disconnect_request) , m_module_location_changed(module_location_changed) + , m_fill_canvas_menu(fill_canvas_menu) + , m_fill_module_menu(fill_module_menu) + , m_fill_port_menu(fill_port_menu) {} virtual ~canvas_cls() {} @@ -66,12 +72,17 @@ public: } } + virtual bool canvas_event(GdkEvent * event); + virtual void connect(boost::shared_ptr port1, boost::shared_ptr port2); virtual void disconnect(boost::shared_ptr port1, boost::shared_ptr port2); void (* m_connect_request)(void * port1_context, void * port2_context); void (* m_disconnect_request)(void * port1_context, void * port2_context); void (* m_module_location_changed)(void * module_context, double x, double y); + void (* m_fill_canvas_menu)(GtkMenu * menu); + void (* m_fill_module_menu)(GtkMenu * menu, void * module_context); + void (* m_fill_port_menu)(GtkMenu * menu, void * port_context); }; class module_cls: public FlowCanvas::Module @@ -100,6 +111,11 @@ public: { _menu = new Gtk::Menu(); _menu->items().push_back(Gtk::Menu_Helpers::MenuElem("Disconnect All", sigc::mem_fun(this, &module_cls::menu_disconnect_all))); + void (* fill_module_menu)(GtkMenu * menu, void * module_context) = boost::dynamic_pointer_cast(canvas().lock())->m_fill_module_menu; + if (fill_module_menu != NULL) + { + fill_module_menu(_menu->gobj(), m_context); + } } void menu_disconnect_all() @@ -146,11 +162,21 @@ canvas_create( void (* connect_request)(void * port1_context, void * port2_context), void (* disconnect_request)(void * port1_context, void * port2_context), void (* module_location_changed)(void * module_context, double x, double y), + void (* fill_canvas_menu)(GtkMenu * menu), + void (* fill_module_menu)(GtkMenu * menu, void * module_context), + void (* fill_port_menu)(GtkMenu * menu, void * port_context), canvas_handle * canvas_handle_ptr) { boost::shared_ptr * canvas; - canvas = new boost::shared_ptr(new canvas_cls(width, height, connect_request, disconnect_request, module_location_changed)); + canvas = new boost::shared_ptr(new canvas_cls(width, + height, + connect_request, + disconnect_request, + module_location_changed, + fill_canvas_menu, + fill_module_menu, + fill_port_menu)); *canvas_handle_ptr = (canvas_handle)canvas; @@ -364,6 +390,23 @@ canvas_remove_connection( #undef port1_ptr #undef port2_ptr +bool canvas_cls::canvas_event(GdkEvent * event) +{ + assert(event); + + if (m_fill_canvas_menu != NULL && event->type == GDK_BUTTON_PRESS && event->button.button == 3) + { + Gtk::Menu * menu_ptr; + menu_ptr = new Gtk::Menu(); + m_fill_canvas_menu(menu_ptr->gobj()); + menu_ptr->show_all(); + menu_ptr->popup(event->button.button, event->button.time); + return true; + } + + return Canvas::canvas_event(event); +} + void canvas_cls::connect( boost::shared_ptr c1, diff --git a/gui/canvas.h b/gui/canvas.h index a95647a3..9d7b7a49 100644 --- a/gui/canvas.h +++ b/gui/canvas.h @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2009 Nedko Arnaudov + * Copyright (C) 2009, 2010 Nedko Arnaudov * ************************************************************************** * This file contains the interface to the canvas functionality @@ -51,6 +51,9 @@ canvas_create( void (* connect_request)(void * port1_context, void * port2_context), void (* disconnect_request)(void * port1_context, void * port2_context), void (* module_location_changed)(void * module_context, double x, double y), + void (* fill_canvas_menu)(GtkMenu * menu), + void (* fill_module_menu)(GtkMenu * menu, void * module_context), + void (* fill_port_menu)(GtkMenu * menu, void * port_context), canvas_handle * canvas_handle_ptr); GtkWidget * diff --git a/gui/graph_canvas.c b/gui/graph_canvas.c index d41dd4ae..7c2a9514 100644 --- a/gui/graph_canvas.c +++ b/gui/graph_canvas.c @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2009 Nedko Arnaudov + * Copyright (C) 2009, 2010 Nedko Arnaudov * ************************************************************************** * This file contains implementation of graph canvas object @@ -174,6 +174,7 @@ bool graph_canvas_create( int width, int height, + void (* fill_canvas_menu)(GtkMenu * menu), graph_canvas_handle * graph_canvas_handle_ptr) { struct graph_canvas * graph_canvas_ptr; @@ -184,7 +185,16 @@ graph_canvas_create( return false; } - if (!canvas_create(width, height, connect_request, disconnect_request, module_location_changed, &graph_canvas_ptr->canvas)) + if (!canvas_create( + width, + height, + connect_request, + disconnect_request, + module_location_changed, + fill_canvas_menu, + NULL, + NULL, + &graph_canvas_ptr->canvas)) { free(graph_canvas_ptr); return false; diff --git a/gui/graph_canvas.h b/gui/graph_canvas.h index 02d10a1e..3a4b1877 100644 --- a/gui/graph_canvas.h +++ b/gui/graph_canvas.h @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2009 Nedko Arnaudov + * Copyright (C) 2009, 2010 Nedko Arnaudov * ************************************************************************** * This file contains interface to graph canvas object @@ -36,6 +36,7 @@ bool graph_canvas_create( int width, int height, + void (* fill_canvas_menu)(GtkMenu * menu), graph_canvas_handle * graph_canvas_ptr); void diff --git a/gui/graph_view.c b/gui/graph_view.c index 2671854e..0ec3a7d7 100644 --- a/gui/graph_view.c +++ b/gui/graph_view.c @@ -176,6 +176,11 @@ static void project_properties_changed(void * context, const char * project_dir, #undef view_ptr +static void fill_canvas_menu(GtkMenu * menu) +{ + fill_view_popup_menu(menu, (graph_view_handle)g_current_view); +} + bool create_view( const char * name, @@ -212,7 +217,7 @@ create_view( goto free_name; } - if (!graph_canvas_create(1600 * 2, 1200 * 2, &view_ptr->graph_canvas)) + if (!graph_canvas_create(1600 * 2, 1200 * 2, fill_canvas_menu, &view_ptr->graph_canvas)) { goto destroy_graph; } diff --git a/gui/menu.c b/gui/menu.c index 2819e4b3..1c2367fe 100644 --- a/gui/menu.c +++ b/gui/menu.c @@ -224,3 +224,84 @@ void menu_view_activated(bool room) gtk_widget_set_sensitive(g_menu_item_save_project, room); gtk_widget_set_sensitive(g_menu_item_save_as_project, room); } + +static void on_popup_menu_action_start_app(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_start_app(); +} + +static void on_popup_menu_action_create_room(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_create_room(); +} + +static void on_popup_menu_action_destroy_room(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_destroy_room(); +} + +static void on_popup_menu_action_load_project(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_load_project(); +} + +static void on_popup_menu_action_unload_project(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_unload_project(); +} + +static void on_popup_menu_action_save_project(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_save_project(); +} + +static void on_popup_menu_action_save_project_as(GtkWidget * menuitem, gpointer userdata) +{ + menu_request_save_as_project(); +} + +void fill_view_popup_menu(GtkMenu * menu, graph_view_handle view) +{ + GtkWidget * menuitem; + + log_info("filling view menu..."); + + if (graph_view_get_app_supervisor(view) != NULL) + { + menuitem = gtk_menu_item_new_with_label("Run..."); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_start_app, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } + + if (is_room_view(view)) + { + menuitem = gtk_menu_item_new_with_label("Load Project..."); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_load_project, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label("Unload Project"); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_unload_project, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label("Save Project..."); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label("Save Project As..."); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project_as, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_separator_menu_item_new(); /* separator */ + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label("Destroy Room"); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_destroy_room, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } + else + { + menuitem = gtk_menu_item_new_with_label("Create Room..."); + g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_create_room, NULL); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } +} diff --git a/gui/menu.h b/gui/menu.h index 9ba58cff..7a288112 100644 --- a/gui/menu.h +++ b/gui/menu.h @@ -27,11 +27,14 @@ #ifndef MENU_H__37ACA2FE_C43D_4FA8_B7CF_6DD345F17CD1__INCLUDED #define MENU_H__37ACA2FE_C43D_4FA8_B7CF_6DD345F17CD1__INCLUDED +#include "graph_view.h" + void menu_init(void); void menu_studio_state_changed(unsigned int studio_state); void menu_set_jack_latency_items_sensivity(bool sensitive); bool menu_set_jack_latency(uint32_t buffer_size, bool force, bool * changed_ptr); void menu_view_activated(bool room); +void fill_view_popup_menu(GtkMenu * menu, graph_view_handle view); void menu_request_daemon_exit(void); void menu_request_jack_configure(void); diff --git a/gui/world_tree.c b/gui/world_tree.c index fd6a3823..a2733bfb 100644 --- a/gui/world_tree.c +++ b/gui/world_tree.c @@ -329,41 +329,6 @@ void on_popup_menu_action_app_properties(GtkWidget * menuitem, gpointer userdata gtk_widget_hide(g_app_dialog); } -void on_popup_menu_action_start_app(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_start_app(); -} - -void on_popup_menu_action_create_room(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_create_room(); -} - -void on_popup_menu_action_destroy_room(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_destroy_room(); -} - -void on_popup_menu_action_load_project(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_load_project(); -} - -void on_popup_menu_action_unload_project(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_unload_project(); -} - -void on_popup_menu_action_save_project(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_save_project(); -} - -void on_popup_menu_action_save_project_as(GtkWidget * menuitem, gpointer userdata) -{ - menu_request_save_as_project(); -} - void popup_menu(GtkWidget * treeview, GdkEventButton * event) { GtkTreeSelection * selection; @@ -428,44 +393,7 @@ void popup_menu(GtkWidget * treeview, GdkEventButton * event) } else if (type == entry_type_view) { - if (graph_view_get_app_supervisor(view) != NULL) - { - menuitem = gtk_menu_item_new_with_label("Run..."); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_start_app, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - - if (is_room_view(view)) - { - menuitem = gtk_menu_item_new_with_label("Load Project..."); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_load_project, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label("Unload Project"); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_unload_project, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label("Save Project..."); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label("Save Project As..."); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_save_project_as, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_separator_menu_item_new(); /* separator */ - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - - menuitem = gtk_menu_item_new_with_label("Destroy Room"); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_destroy_room, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - else - { - menuitem = gtk_menu_item_new_with_label("Create Room..."); - g_signal_connect(menuitem, "activate", (GCallback)on_popup_menu_action_create_room, NULL); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } + fill_view_popup_menu(GTK_MENU(menu), view); } else {