gui: canvas popup menu

This commit is contained in:
Nedko Arnaudov 2010-09-05 18:51:17 +03:00
parent 649f30fea6
commit 8a4d7e354f
8 changed files with 155 additions and 81 deletions

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2008, 2009 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2007 Dave Robillard <http://drobilla.net>
*
**************************************************************************
@ -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<FlowCanvas::Connectable> port1, boost::shared_ptr<FlowCanvas::Connectable> port2);
virtual void disconnect(boost::shared_ptr<FlowCanvas::Connectable> port1, boost::shared_ptr<FlowCanvas::Connectable> 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_cls>(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_cls> * canvas;
canvas = new boost::shared_ptr<canvas_cls>(new canvas_cls(width, height, connect_request, disconnect_request, module_location_changed));
canvas = new boost::shared_ptr<canvas_cls>(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<FlowCanvas::Connectable> c1,

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2009 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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 *

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2009 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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;

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2009 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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
{