create room dialog
This commit is contained in:
parent
37f2f972ce
commit
ec1300100c
|
@ -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;
|
||||
}
|
|
@ -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 */
|
120
gui/gladish.ui
120
gui/gladish.ui
|
@ -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">•</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"><b>Name</b></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"><b>Create from template</b></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>
|
||||
|
|
32
gui/main.c
32
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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, "");
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue