gui: canvas popup menu
This commit is contained in:
parent
649f30fea6
commit
8a4d7e354f
|
@ -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,
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
81
gui/menu.c
81
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue