From ec1300100c55f594f9c15f2f22bdaf80f2553bae Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sun, 21 Mar 2010 16:33:39 +0200 Subject: [PATCH] create room dialog --- gui/create_room_dialog.c | 168 +++++++++++++++++++++++++++++++++++++++ gui/create_room_dialog.h | 36 +++++++++ gui/gladish.ui | 120 ++++++++++++++++++++++++++++ gui/main.c | 32 +++++++- proxies/control_proxy.c | 41 +++++++++- proxies/control_proxy.h | 3 +- proxies/studio_proxy.c | 5 ++ proxies/studio_proxy.h | 2 + wscript | 1 + 9 files changed, 403 insertions(+), 5 deletions(-) create mode 100644 gui/create_room_dialog.c create mode 100644 gui/create_room_dialog.h diff --git a/gui/create_room_dialog.c b/gui/create_room_dialog.c new file mode 100644 index 00000000..71b8363a --- /dev/null +++ b/gui/create_room_dialog.c @@ -0,0 +1,168 @@ +/* -*- Mode: C ; c-basic-offset: 2 -*- */ +/* + * LADI Session Handler (ladish) + * + * Copyright (C) 2010 Nedko Arnaudov + * + ************************************************************************** + * This file contains implementation of the "create room" dialog + ************************************************************************** + * + * LADI Session Handler is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * LADI Session Handler is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LADI Session Handler. If not, see + * or write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "create_room_dialog.h" +#include "gtk_builder.h" +#include "../proxies/control_proxy.h" + +enum +{ + COL_NAME = 0, + NUM_COLS +}; + +static GtkWidget * g_dialog; +static GtkListStore * g_liststore; +static GtkTreeView * g_treeview; + +bool on_key_press_event(GtkWidget * widget_ptr, GdkEventKey * event_ptr, gpointer user_data) +{ + if (event_ptr->type == GDK_KEY_PRESS && + (event_ptr->keyval == GDK_Return || + event_ptr->keyval == GDK_KP_Enter)) + { + gtk_dialog_response(GTK_DIALOG(g_dialog), 2); + return true; + } + + return false; +} + +void create_room_dialog_init(void) +{ + GtkTreeViewColumn * col; + GtkCellRenderer * renderer; + + g_dialog = get_gtk_builder_widget("create_room_dialog"); + g_treeview = GTK_TREE_VIEW(get_gtk_builder_widget("room_templates_treeview")); + + gtk_tree_view_set_headers_visible(g_treeview, FALSE); + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, "Name"); + gtk_tree_view_append_column(g_treeview, col); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_add_attribute(col, renderer, "text", COL_NAME); + + g_liststore = gtk_list_store_new(NUM_COLS, G_TYPE_STRING); + gtk_tree_view_set_model(g_treeview, GTK_TREE_MODEL(g_liststore)); + + g_signal_connect(G_OBJECT(g_treeview), "key-press-event", G_CALLBACK(on_key_press_event), NULL); +} + +void create_room_dialog_uninit(void) +{ + g_object_unref(g_liststore); +} + +static void fill_templates_callback(void * context, const char * template_name) +{ + GtkTreeIter iter; + + gtk_list_store_append(g_liststore, &iter); + gtk_list_store_set(g_liststore, &iter, COL_NAME, template_name, -1); + + /* select the first item */ + if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(g_liststore), NULL) == 1) + { + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(g_treeview), &iter); + } +} + +static bool fill_templates(void) +{ + gtk_list_store_clear(g_liststore); + return control_proxy_get_room_template_list(fill_templates_callback, NULL); +} + +bool create_room_dialog_run(char ** name_ptr_ptr, char ** template_ptr_ptr) +{ + guint result; + bool ok; + GtkWidget * dialog = get_gtk_builder_widget("create_room_dialog"); + GtkEntry * entry = GTK_ENTRY(get_gtk_builder_widget("create_room_name_entry")); + GtkTreeSelection * selection; + GtkTreeIter iter; + char * template; + char * name; + + gtk_entry_set_text(entry, ""); + if (!fill_templates()) + { + log_error("Cannot fetch room template list"); + return false; + } + + gtk_widget_show(dialog); + +again: + result = gtk_dialog_run(GTK_DIALOG(dialog)); + ok = result == 2; + if (ok) + { + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(g_treeview)); + if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) + { + goto again; + } + + gtk_tree_model_get(GTK_TREE_MODEL(g_liststore), &iter, COL_NAME, &template, -1); + template = strdup(template); + if (template == NULL) + { + log_error("strdup failed for template name (create room dialog)"); + ok = false; + goto exit; + } + + name = (char *)gtk_entry_get_text(entry); + if (strlen(name) == 0) + { + goto again; + } + + name = strdup(name); + if (name == NULL) + { + log_error("strdup failed for room name (create room dialog)"); + free(template); + ok = false; + goto exit; + } + + *name_ptr_ptr = name; + *template_ptr_ptr = template; + } + +exit: + gtk_widget_hide(dialog); + + return ok; +} diff --git a/gui/create_room_dialog.h b/gui/create_room_dialog.h new file mode 100644 index 00000000..2b522e44 --- /dev/null +++ b/gui/create_room_dialog.h @@ -0,0 +1,36 @@ +/* -*- Mode: C ; c-basic-offset: 2 -*- */ +/* + * LADI Session Handler (ladish) + * + * Copyright (C) 2010 Nedko Arnaudov + * + ************************************************************************** + * This file contains interface to "create room" dialog + ************************************************************************** + * + * LADI Session Handler is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * LADI Session Handler is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LADI Session Handler. If not, see + * or write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef CREATE_ROOM_DIALOG_H__4CB9233D_A861_4DEF_959E_D560E6118452__INCLUDED +#define CREATE_ROOM_DIALOG_H__4CB9233D_A861_4DEF_959E_D560E6118452__INCLUDED + +#include "common.h" + +void create_room_dialog_init(void); +void create_room_dialog_uninit(void); +bool create_room_dialog_run(char ** name_ptr_ptr, char ** template_ptr_ptr); + +#endif /* #ifndef CREATE_ROOM_DIALOG_H__4CB9233D_A861_4DEF_959E_D560E6118452__INCLUDED */ diff --git a/gui/gladish.ui b/gui/gladish.ui index 43b62b97..aa9b28da 100644 --- a/gui/gladish.ui +++ b/gui/gladish.ui @@ -1262,4 +1262,124 @@ along with LADI Session Handler; if not, write to the Free Software Foundation, True gtk-open + + 5 + Create room + normal + main_win + False + + + True + vertical + 2 + + + True + vertical + 5 + + + True + 0 + none + + + True + True + + True + + + + + True + <b>Name</b> + True + + + + + False + 0 + + + + + True + 0 + none + + + 200 + 100 + True + True + + + + + True + <b>Create from template</b> + True + + + + + 1 + + + + + 1 + + + + + True + end + + + gtk-cancel + True + True + True + True + + + False + False + 0 + + + + + gtk-ok + True + True + True + True + True + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + create_room_cancel_button + create_room_ok_button + + diff --git a/gui/main.c b/gui/main.c index 99c11422..6ce491f5 100644 --- a/gui/main.c +++ b/gui/main.c @@ -49,6 +49,7 @@ #include "../proxies/studio_proxy.h" #include "ask_dialog.h" #include "../proxies/app_supervisor_proxy.h" +#include "create_room_dialog.h" GtkWidget * g_main_win; @@ -220,9 +221,9 @@ bool studio_state_changed(char ** name_ptr_ptr) gtk_widget_set_sensitive(g_menu_item_unload_studio, g_studio_state != STUDIO_STATE_UNLOADED); gtk_widget_set_sensitive(g_menu_item_rename_studio, g_studio_state == STUDIO_STATE_STOPPED || g_studio_state == STUDIO_STATE_STARTED); gtk_widget_set_sensitive(g_menu_item_start_app, g_studio_state == STUDIO_STATE_STOPPED || g_studio_state == STUDIO_STATE_STARTED); - //gtk_widget_set_sensitive(g_menu_item_create_room, g_studio_loaded); - //gtk_widget_set_sensitive(g_menu_item_destroy_room, g_studio_loaded); - //gtk_widget_set_sensitive(g_menu_item_load_project, g_studio_loaded); + gtk_widget_set_sensitive(g_menu_item_create_room, g_studio_state == STUDIO_STATE_STOPPED || g_studio_state == STUDIO_STATE_STARTED); + //gtk_widget_set_sensitive(g_menu_item_destroy_room, g_studio_state == STUDIO_STATE_STOPPED || g_studio_state == STUDIO_STATE_STARTED); + //gtk_widget_set_sensitive(g_menu_item_load_project, g_studio_state == STUDIO_STATE_STARTED); tooltip = NULL; status_image_path = NULL; @@ -866,6 +867,27 @@ static void rename_studio(void) } } +static void create_room(void) +{ + char * name; + char * template; + + log_info("create room request"); + + if (create_room_dialog_run(&name, &template)) + { + log_info("Creating new room '%s' from template '%s'", name, template); + + if (!studio_proxy_create_room(name, template)) + { + error_message_box("Room creation failed, please inspect logs."); + } + + free(name); + free(template); + } +} + static gboolean poll_jack(gpointer data) { update_load(); @@ -1355,6 +1377,8 @@ int main(int argc, char** argv) gtk_box_pack_start(GTK_BOX(g_statusbar), g_dsp_load_label, FALSE, TRUE, 10); gtk_box_reorder_child(GTK_BOX(g_statusbar), g_dsp_load_label, 5); + create_room_dialog_init(); + buffer_size_clear(); world_tree_init(); @@ -1399,6 +1423,7 @@ int main(int argc, char** argv) g_signal_connect(G_OBJECT(g_menu_item_jack_configure), "activate", G_CALLBACK(jack_configure), NULL); g_signal_connect(G_OBJECT(get_gtk_builder_widget("menu_item_help_about")), "activate", G_CALLBACK(show_about), NULL); g_signal_connect(G_OBJECT(g_menu_item_start_app), "activate", G_CALLBACK(start_app), NULL); + g_signal_connect(G_OBJECT(g_menu_item_create_room), "activate", G_CALLBACK(create_room), NULL); g_signal_connect(G_OBJECT(g_menu_item_jack_latency_32), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)32); g_signal_connect(G_OBJECT(g_menu_item_jack_latency_64), "toggled", G_CALLBACK(buffer_size_change_request), (gpointer)64); @@ -1421,6 +1446,7 @@ int main(int argc, char** argv) studio_proxy_uninit(); control_proxy_uninit(); dbus_uninit(); + create_room_dialog_uninit(); uninit_gtk_builder(); return 0; diff --git a/proxies/control_proxy.c b/proxies/control_proxy.c index a5a8af4a..29ec648d 100644 --- a/proxies/control_proxy.c +++ b/proxies/control_proxy.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 code that interfaces @@ -224,3 +224,42 @@ bool control_proxy_exit(void) return true; } + +bool control_proxy_get_room_template_list(void (* callback)(void * context, const char * template_name), void * context) +{ + DBusMessage * reply_ptr; + const char * reply_signature; + DBusMessageIter top_iter; + DBusMessageIter struct_iter; + DBusMessageIter array_iter; + const char * name; + + if (!dbus_call(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "GetRoomList", "", NULL, &reply_ptr)) + { + log_error("GetRoomList() failed."); + return false; + } + + reply_signature = dbus_message_get_signature(reply_ptr); + if (strcmp(reply_signature, "a(sa{sv})") != 0) + { + log_error("GetRoomList() reply signature mismatch. '%s'", reply_signature); + dbus_message_unref(reply_ptr); + return false; + } + + dbus_message_iter_init(reply_ptr, &top_iter); + for (dbus_message_iter_recurse(&top_iter, &array_iter); + dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_INVALID; + dbus_message_iter_next(&array_iter)) + { + dbus_message_iter_recurse(&array_iter, &struct_iter); + dbus_message_iter_get_basic(&struct_iter, &name); + callback(context, name); + dbus_message_iter_next(&struct_iter); + dbus_message_iter_next(&struct_iter); + } + + dbus_message_unref(reply_ptr); + return true; +} diff --git a/proxies/control_proxy.h b/proxies/control_proxy.h index 76cdcad7..4e2b1d4d 100644 --- a/proxies/control_proxy.h +++ b/proxies/control_proxy.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 code that interfaces @@ -42,5 +42,6 @@ bool control_proxy_load_studio(const char * studio_name); bool control_proxy_delete_studio(const char * studio_name); bool control_proxy_exit(void); void control_proxy_ping(void); +bool control_proxy_get_room_template_list(void (* callback)(void * context, const char * template_name), void * context); #endif /* #ifndef CONTROL_PROXY_H__8BC89E98_FE1B_4831_8B89_1A48F676E019__INCLUDED */ diff --git a/proxies/studio_proxy.c b/proxies/studio_proxy.c index 8bf417fa..81f6f50c 100644 --- a/proxies/studio_proxy.c +++ b/proxies/studio_proxy.c @@ -329,3 +329,8 @@ studio_proxy_set_room_callbacks( unref: dbus_message_unref(reply_ptr); } + +bool studio_proxy_create_room(const char * name, const char * template) +{ + return dbus_call(SERVICE_NAME, STUDIO_OBJECT_PATH, IFACE_STUDIO, "NewRoom", "ss", &name, &template, ""); +} diff --git a/proxies/studio_proxy.h b/proxies/studio_proxy.h index 2eef0410..475a0006 100644 --- a/proxies/studio_proxy.h +++ b/proxies/studio_proxy.h @@ -50,4 +50,6 @@ studio_proxy_set_room_callbacks( void (* disappeared)(const char * opath, const char * name, const char * template), void (* changed)(const char * opath, const char * name, const char * template)); +bool studio_proxy_create_room(const char * name, const char * template); + #endif /* #ifndef STUDIO_PROXY_H__2CEC623F_C998_4618_A947_D1A0016DF978__INCLUDED */ diff --git a/wscript b/wscript index 0eedd88a..631b9b51 100644 --- a/wscript +++ b/wscript @@ -309,6 +309,7 @@ def build(bld): 'graph_canvas.c', 'gtk_builder.c', 'ask_dialog.c', + 'create_room_dialog.c', ]: gladish.source.append(os.path.join("gui", source))