create room dialog

This commit is contained in:
Nedko Arnaudov 2010-03-21 16:33:39 +02:00
parent 37f2f972ce
commit ec1300100c
9 changed files with 403 additions and 5 deletions

168
gui/create_room_dialog.c Normal file
View File

@ -0,0 +1,168 @@
/* -*- Mode: C ; c-basic-offset: 2 -*- */
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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 <http://www.gnu.org/licenses/>
* or write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <gdk/gdkkeysyms.h>
#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;
}

36
gui/create_room_dialog.h Normal file
View File

@ -0,0 +1,36 @@
/* -*- Mode: C ; c-basic-offset: 2 -*- */
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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 <http://www.gnu.org/licenses/>
* 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 */

View File

@ -1262,4 +1262,124 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
<property name="visible">True</property>
<property name="stock">gtk-open</property>
</object>
<object class="GtkDialog" id="create_room_dialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Create room</property>
<property name="type_hint">normal</property>
<property name="transient_for">main_win</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="create_room_dialog_vbox_top">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkVBox" id="create_room_dialog_vbox_main">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkFrame" id="create_room_dialog_name_frame">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkEntry" id="create_room_name_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x2022;</property>
<property name="activates_default">True</property>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="create_room_dialog_name_label">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Name&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="create_room_dialog_templates_frame">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkTreeView" id="room_templates_treeview">
<property name="width_request">200</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="create_room_dialog_template_label">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Create from template&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="create_room_dialog_action_area">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="create_room_cancel_button">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="create_room_ok_button">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="1">create_room_cancel_button</action-widget>
<action-widget response="2">create_room_ok_button</action-widget>
</action-widgets>
</object>
</interface>

View File

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

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

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 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 */

View File

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

View File

@ -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 */

View File

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