New studio command. Closes #7

This commit is contained in:
Nedko Arnaudov 2009-08-30 16:13:38 +03:00
parent 3978e8c4db
commit f55a45416e
7 changed files with 138 additions and 23 deletions

View File

@ -183,6 +183,25 @@ static void ladish_delete_studio(method_call_t * call_ptr)
}
}
static void ladish_new_studio(method_call_t * call_ptr)
{
const char * name;
dbus_error_init(&g_dbus_error);
if (!dbus_message_get_args(call_ptr->message, &g_dbus_error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "Invalid arguments to method \"%s\": %s", call_ptr->method_name, g_dbus_error.message);
dbus_error_free(&g_dbus_error);
return;
}
if (studio_new(call_ptr, name))
{
method_return_new_void(call_ptr);
}
}
static void ladish_get_application_list(method_call_t * call_ptr)
{
DBusMessageIter iter;
@ -281,6 +300,10 @@ METHOD_ARGS_BEGIN(GetStudioList, "Get list of studios")
METHOD_ARG_DESCRIBE_OUT("studio_list", "a(sa{sv})", "List of studios, name and properties")
METHOD_ARGS_END
METHOD_ARGS_BEGIN(NewStudio, "New studio")
METHOD_ARG_DESCRIBE_IN("studio_name", "s", "Name of studio, if empty name will be generated")
METHOD_ARGS_END
METHOD_ARGS_BEGIN(LoadStudio, "Load studio")
METHOD_ARG_DESCRIBE_IN("studio_name", "s", "Name of studio to load")
METHOD_ARG_DESCRIBE_IN("options", "a{sv}", "Load options")
@ -300,6 +323,7 @@ METHOD_ARGS_END
METHODS_BEGIN
METHOD_DESCRIBE(IsStudioLoaded, ladish_is_studio_loaded)
METHOD_DESCRIBE(GetStudioList, ladish_get_studio_list)
METHOD_DESCRIBE(NewStudio, ladish_new_studio)
METHOD_DESCRIBE(LoadStudio, ladish_load_studio)
METHOD_DESCRIBE(DeleteStudio, ladish_delete_studio)
METHOD_DESCRIBE(GetApplicationList, ladish_get_application_list)

View File

@ -1607,6 +1607,43 @@ static void ladish_save_studio(method_call_t * call_ptr)
}
}
bool studio_new(void * call_ptr, const char * studio_name)
{
studio_clear();
assert(g_studio.name == NULL);
if (*studio_name != 0)
{
g_studio.name = strdup(studio_name);
if (g_studio.name == NULL)
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "strdup() failed to allocate studio name.");
return false;
}
}
else if (!studio_name_generate(&g_studio.name))
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_name_generate() failed.");
return false;
}
if (!studio_activate())
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_activate() failed.");
studio_clear();
return false;
}
if (!studio_fetch_jack_settings(g_studio))
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "studio_fetch_jack_settings() failed.");
studio_clear();
return false;
}
return true;
}
METHOD_ARGS_BEGIN(GetName, "Get studio name")
METHOD_ARG_DESCRIBE_OUT("studio_name", "s", "Name of studio")
METHOD_ARGS_END

View File

@ -33,6 +33,7 @@ void studio_run(void);
bool studio_is_loaded(void);
bool studios_iterate(void * call_ptr, void * context, bool (* callback)(void * call_ptr, void * context, const char * studio, uint32_t modtime));
bool studio_new(void * call_ptr, const char * studio_name);
bool studio_load(void * call_ptr, const char * studio_name);
bool studio_delete(void * call_ptr, const char * studio_name);

View File

@ -149,6 +149,22 @@ bool control_proxy_get_studio_list(void (* callback)(void * context, const char
return true;
}
bool control_proxy_new_studio(const char * studio_name)
{
if (studio_name == NULL)
{
studio_name = "";
}
if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "NewStudio", "s", &studio_name, ""))
{
lash_error("NewStudio() failed.");
return false;
}
return true;
}
bool control_proxy_load_studio(const char * studio_name)
{
if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "LoadStudio", "s", &studio_name, ""))

View File

@ -36,6 +36,7 @@ void control_proxy_uninit(void);
void control_proxy_on_studio_appeared(void);
void control_proxy_on_studio_disappeared(void);
bool control_proxy_get_studio_list(void (* callback)(void * context, const char * studio_name), void * context);
bool control_proxy_new_studio(const char * studio_name);
bool control_proxy_load_studio(const char * studio_name);
bool control_proxy_delete_studio(const char * studio_name);
bool control_proxy_exit(void);

View File

@ -20,6 +20,21 @@
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="studio_menu">
<child>
<widget class="GtkImageMenuItem" id="menu_item_new_studio">
<property name="visible">True</property>
<property name="label" translatable="yes">_New Studio...</property>
<property name="use_underline">True</property>
<accelerator key="N" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="menu-item-new-studio-image">
<property name="visible">True</property>
<property name="stock">gtk-new</property>
<property name="icon_size">1</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="menu_item_load_studio">
<property name="visible">True</property>
@ -784,10 +799,10 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
</widget>
</child>
</widget>
<widget class="GtkDialog" id="rename_dialog">
<widget class="GtkDialog" id="name_dialog">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Rename</property>
<property name="title" translatable="yes">Set name</property>
<property name="modal">True</property>
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
@ -810,7 +825,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
<property name="label_xalign">0</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<widget class="GtkEntry" id="rename_entry">
<widget class="GtkEntry" id="name_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@ -818,7 +833,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
</widget>
</child>
<child>
<widget class="GtkLabel" id="rename_label">
<widget class="GtkLabel" id="name_label">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">&lt;b&gt;Name&lt;/b&gt;</property>
@ -844,7 +859,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="rename_cancel_button">
<widget class="GtkButton" id="name_cancel_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
@ -856,7 +871,7 @@ along with LADI Session Handler; if not, write to the Free Software Foundation,
</widget>
</child>
<child>
<widget class="GtkButton" id="rename_ok_button">
<widget class="GtkButton" id="name_ok_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>

View File

@ -48,16 +48,15 @@ GtkWidget * g_clear_load_button;
GtkWidget * g_xrun_progress_bar;
GtkWidget * g_buffer_size_combo;
GtkWidget * g_menu_item_load_studio;
GtkWidget * g_menu_item_new_studio;
GtkWidget * g_menu_item_save_studio;
GtkWidget * g_menu_item_rename_studio;
GtkWidget * g_menu_item_delete_studio;
GtkWidget * g_menu_item_create_room;
GtkWidget * g_menu_item_destroy_room;
GtkWidget * g_menu_item_load_project;
GtkWidget * g_menu_item_start_app;
GtkWidget * g_rename_dialog;
GtkWidget * g_name_dialog;
graph_view_handle g_jack_view = NULL;
graph_view_handle g_studio_view = NULL;
@ -177,33 +176,33 @@ static void clear_load(void)
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(g_xrun_progress_bar), 0.0);
}
bool rename_dialog(const char * object, const char * old_name, char ** new_name)
bool name_dialog(const char * title, const char * object, const char * old_name, char ** new_name)
{
guint result;
bool renamed;
GtkEntry * entry = GTK_ENTRY(get_glade_widget("rename_entry"));
bool ok;
GtkEntry * entry = GTK_ENTRY(get_glade_widget("name_entry"));
gtk_widget_show(g_rename_dialog);
gtk_widget_show(g_name_dialog);
gtk_label_set_text(GTK_LABEL(get_glade_widget("rename_label")), object);
gtk_label_set_text(GTK_LABEL(get_glade_widget("name_label")), object);
gtk_entry_set_text(entry, old_name);
gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1);
result = gtk_dialog_run(GTK_DIALOG(g_rename_dialog));
renamed = result == 2;
if (renamed)
result = gtk_dialog_run(GTK_DIALOG(g_name_dialog));
ok = result == 2;
if (ok)
{
*new_name = strdup(gtk_entry_get_text(entry));
if (*new_name == NULL)
{
lash_error("strdup failed for new name (rename)");
renamed = false;
lash_error("strdup failed for new name (name_dialog)");
ok = false;
}
}
gtk_widget_hide(g_rename_dialog);
gtk_widget_hide(g_name_dialog);
return renamed;
return ok;
}
static void arrange(void)
@ -315,6 +314,25 @@ static void save_studio(void)
if (!studio_proxy_save())
{
lash_error("studio save failed");
/* TODO: display error message */
}
}
static void new_studio(void)
{
char * new_name;
lash_info("new studio request");
if (name_dialog("New studio", "Studio name", "", &new_name))
{
if (!control_proxy_new_studio(new_name))
{
lash_error("creation of new studio failed");
/* TODO: display error message */
}
free(new_name);
}
}
@ -322,11 +340,12 @@ static void rename_studio(void)
{
char * new_name;
if (rename_dialog("Studio name", get_view_name(g_studio_view), &new_name))
if (name_dialog("Rename studio", "Studio name", get_view_name(g_studio_view), &new_name))
{
if (!studio_proxy_rename(new_name))
{
lash_error("studio rename failed");
/* TODO: display error message */
}
free(new_name);
@ -498,6 +517,7 @@ int main(int argc, char** argv)
g_clear_load_button = get_glade_widget("clear_load_button");
g_xrun_progress_bar = get_glade_widget("xrun_progress_bar");
g_buffer_size_combo = get_glade_widget("buffer_size_combo");
g_menu_item_new_studio = get_glade_widget("menu_item_new_studio");
g_menu_item_save_studio = get_glade_widget("menu_item_save_studio");
g_menu_item_rename_studio = get_glade_widget("menu_item_rename_studio");
g_menu_item_create_room = get_glade_widget("menu_item_create_room");
@ -505,7 +525,7 @@ int main(int argc, char** argv)
g_menu_item_load_project = get_glade_widget("menu_item_load_project");
g_menu_item_start_app = get_glade_widget("menu_item_start_app");
g_rename_dialog = get_glade_widget("rename_dialog");
g_name_dialog = get_glade_widget("name_dialog");
init_studio_list(&g_load_studio_list, "menu_item_load_studio", "load_studio_menu", on_load_studio);
init_studio_list(&g_delete_studio_list, "menu_item_delete_studio", "delete_studio_menu", on_delete_studio);
@ -539,6 +559,7 @@ int main(int argc, char** argv)
g_signal_connect(G_OBJECT(g_buffer_size_combo), "changed", G_CALLBACK(buffer_size_change_request), NULL);
g_signal_connect(G_OBJECT(g_clear_load_button), "clicked", G_CALLBACK(clear_load), NULL);
g_signal_connect(G_OBJECT(get_glade_widget("menu_item_view_arrange")), "activate", G_CALLBACK(arrange), NULL);
g_signal_connect(G_OBJECT(g_menu_item_new_studio), "activate", G_CALLBACK(new_studio), NULL);
g_signal_connect(G_OBJECT(g_menu_item_save_studio), "activate", G_CALLBACK(save_studio), NULL);
g_signal_connect(G_OBJECT(g_menu_item_rename_studio), "activate", G_CALLBACK(rename_studio), NULL);