From a5ba520f758b5be2a71f8a8a375ccc99ebe4b2f2 Mon Sep 17 00:00:00 2001 From: Johannes Mueller Date: Mon, 3 Jul 2017 14:30:05 +0200 Subject: Also handle Route templates Following measures: * Split up into two classes * TemplateDialog: the general dialog * TemplateManager: A widget to rename and remove templates * Make TemplateManager abstract and derive a class for session templates and one for route templates. This is needed, as session templates and route templates are stored in a different way. Thus we need different methods to rename and remove them. --- gtk2_ardour/template_dialog.cc | 216 ++++++++++++++++++++++++++--------------- 1 file changed, 139 insertions(+), 77 deletions(-) (limited to 'gtk2_ardour/template_dialog.cc') diff --git a/gtk2_ardour/template_dialog.cc b/gtk2_ardour/template_dialog.cc index 19b72d0067..0da64816b9 100644 --- a/gtk2_ardour/template_dialog.cc +++ b/gtk2_ardour/template_dialog.cc @@ -20,6 +20,7 @@ #include +#include #include #include @@ -36,27 +37,45 @@ using namespace PBD; using namespace ARDOUR; TemplateDialog::TemplateDialog () - : ArdourDialog (_("Manage Templates")) + : ArdourDialog ("Manage Templates") +{ + Notebook* nb = manage (new Notebook); + + SessionTemplateManager* session_tm = manage (new SessionTemplateManager); + session_tm->init (); + nb->append_page (*session_tm, _("Session Templates")); + + RouteTemplateManager* route_tm = manage (new RouteTemplateManager); + route_tm->init (); + nb->append_page (*route_tm, _("Track Templates")); + + get_vbox()->pack_start (*nb); + add_button (_("Ok"), Gtk::RESPONSE_OK); + + show_all_children (); +} + +TemplateManager::TemplateManager () + : HBox () , _remove_button (_("Remove")) , _rename_button (_("Rename")) { - _session_template_model = ListStore::create (_session_template_columns); - setup_session_templates (); - _session_template_treeview.set_model (_session_template_model); + _template_model = ListStore::create (_template_columns); + _template_treeview.set_model (_template_model); _validated_column.set_title (_("Template Name")); _validated_column.pack_start (_validating_cellrenderer); - _session_template_treeview.append_column (_validated_column); + _template_treeview.append_column (_validated_column); _validating_cellrenderer.property_editable() = true; - _validated_column.set_cell_data_func (_validating_cellrenderer, sigc::mem_fun (*this, &TemplateDialog::render_template_names)); - _validating_cellrenderer.signal_edited().connect (sigc::mem_fun (*this, &TemplateDialog::validate_edit)); - _session_template_treeview.signal_cursor_changed().connect (sigc::mem_fun (*this, &TemplateDialog::row_selection_changed)); - _session_template_treeview.signal_key_press_event().connect (sigc::mem_fun (*this, &TemplateDialog::key_event)); + _validated_column.set_cell_data_func (_validating_cellrenderer, sigc::mem_fun (*this, &TemplateManager::render_template_names)); + _validating_cellrenderer.signal_edited().connect (sigc::mem_fun (*this, &TemplateManager::validate_edit)); + _template_treeview.signal_cursor_changed().connect (sigc::mem_fun (*this, &TemplateManager::row_selection_changed)); + _template_treeview.signal_key_press_event().connect (sigc::mem_fun (*this, &TemplateManager::key_event)); ScrolledWindow* sw = manage (new ScrolledWindow); sw->property_hscrollbar_policy() = POLICY_AUTOMATIC; - sw->add (_session_template_treeview); + sw->add (_template_treeview); sw->set_size_request (300, 200); @@ -66,45 +85,37 @@ TemplateDialog::TemplateDialog () vb->pack_start (_remove_button, false, false); _rename_button.set_sensitive (false); - _rename_button.signal_clicked().connect (sigc::mem_fun (*this, &TemplateDialog::start_edit)); + _rename_button.signal_clicked().connect (sigc::mem_fun (*this, &TemplateManager::start_edit)); _remove_button.set_sensitive (false); - _remove_button.signal_clicked().connect (sigc::mem_fun (*this, &TemplateDialog::delete_selected_template)); + _remove_button.signal_clicked().connect (sigc::mem_fun (*this, &TemplateManager::delete_selected_template)); - HBox* hb = manage (new HBox); - hb->set_spacing (6); - hb->pack_start (*sw); - hb->pack_start (*vb); - - get_vbox()->pack_start (*hb); + set_spacing (6); + pack_start (*sw); + pack_start (*vb); show_all_children (); - - add_button (_("Ok"), Gtk::RESPONSE_OK); } void -TemplateDialog::setup_session_templates () +TemplateManager::setup_model (const vector& templates) { - vector templates; - find_session_templates (templates); - - _session_template_model->clear (); + _template_model->clear (); - for (vector::iterator it = templates.begin(); it != templates.end(); ++it) { + for (vector::const_iterator it = templates.begin(); it != templates.end(); ++it) { TreeModel::Row row; - row = *(_session_template_model->append ()); + row = *(_template_model->append ()); - row[_session_template_columns.name] = it->name; - row[_session_template_columns.path] = it->path; + row[_template_columns.name] = it->name; + row[_template_columns.path] = it->path; } } void -TemplateDialog::row_selection_changed () +TemplateManager::row_selection_changed () { bool has_selection = false; - if (_session_template_treeview.get_selection()->count_selected_rows () != 0) { - Gtk::TreeModel::const_iterator it = _session_template_treeview.get_selection()->get_selected (); + if (_template_treeview.get_selection()->count_selected_rows () != 0) { + Gtk::TreeModel::const_iterator it = _template_treeview.get_selection()->get_selected (); if (it) { has_selection = true; } @@ -115,28 +126,28 @@ TemplateDialog::row_selection_changed () } void -TemplateDialog::render_template_names (Gtk::CellRenderer*, const Gtk::TreeModel::iterator& it) +TemplateManager::render_template_names (Gtk::CellRenderer*, const Gtk::TreeModel::iterator& it) { if (it) { - _validating_cellrenderer.property_text () = it->get_value (_session_template_columns.name); + _validating_cellrenderer.property_text () = it->get_value (_template_columns.name); } } void -TemplateDialog::validate_edit (const Glib::ustring& path_string, const Glib::ustring& new_name) +TemplateManager::validate_edit (const Glib::ustring& path_string, const Glib::ustring& new_name) { const TreePath path (path_string); - TreeModel::iterator current = _session_template_model->get_iter (path); + TreeModel::iterator current = _template_model->get_iter (path); - if (current->get_value (_session_template_columns.name) == new_name) { + if (current->get_value (_template_columns.name) == new_name) { return; } - TreeModel::Children rows = _session_template_model->children (); + TreeModel::Children rows = _template_model->children (); bool found = false; for (TreeModel::Children::const_iterator it = rows.begin(); it != rows.end(); ++it) { - if (it->get_value (_session_template_columns.name) == new_name) { + if (it->get_value (_template_columns.name) == new_name) { found = true; break; } @@ -152,29 +163,87 @@ TemplateDialog::validate_edit (const Glib::ustring& path_string, const Glib::ust } void -TemplateDialog::start_edit () +TemplateManager::start_edit () { TreeModel::Path path; TreeViewColumn* col; - _session_template_treeview.get_cursor (path, col); - _session_template_treeview.set_cursor (path, *col, /*set_editing =*/ true); + _template_treeview.get_cursor (path, col); + _template_treeview.set_cursor (path, *col, /*set_editing =*/ true); +} + +bool +TemplateManager::key_event (GdkEventKey* ev) +{ + if (ev->keyval == GDK_KEY_F2) { + start_edit (); + return true; + } + if (ev->keyval == GDK_KEY_Delete) { + delete_selected_template (); + return true; + } + + return false; +} + + +void SessionTemplateManager::init () +{ + vector templates; + find_session_templates (templates); + setup_model (templates); +} + +void RouteTemplateManager::init () +{ + vector templates; + find_route_templates (templates); + setup_model (templates); } void -TemplateDialog::delete_selected_template () +SessionTemplateManager::rename_template (TreeModel::iterator& item, const Glib::ustring& new_name) { - if (_session_template_treeview.get_selection()->count_selected_rows() == 0) { + const string path = item->get_value (_template_columns.path); + const string name = item->get_value (_template_columns.name); + + const string old_filepath = Glib::build_filename (path, name+".template"); + const string new_filepath = Glib::build_filename (path, new_name+".template"); + const string new_path = Glib::build_filename (user_template_directory (), new_name); + + if (g_rename (old_filepath.c_str(), new_filepath.c_str()) != 0) { + error << string_compose (_("Renaming of the template file failed: %1"), strerror (errno)) << endmsg; return; } - Gtk::TreeModel::const_iterator it = _session_template_treeview.get_selection()->get_selected(); + if (g_rename (path.c_str(), new_path.c_str()) != 0) { + error << string_compose (_("Renaming of the template directory failed: %1"), strerror (errno)) << endmsg; + if (g_rename (new_filepath.c_str(), old_filepath.c_str()) != 0) { + error << string_compose (_("Couldn't even undo renaming of template file: %1. Please examine the situation using filemanager or terminal."), + strerror (errno)) << endmsg; + } + return; + } + + item->set_value (_template_columns.name, string (new_name)); + item->set_value (_template_columns.path, new_path); +} + +void +SessionTemplateManager::delete_selected_template () +{ + if (_template_treeview.get_selection()->count_selected_rows() == 0) { + return; + } + + Gtk::TreeModel::const_iterator it = _template_treeview.get_selection()->get_selected(); if (!it) { return; } - const string path = it->get_value (_session_template_columns.path); - const string name = it->get_value (_session_template_columns.name); + const string path = it->get_value (_template_columns.path); + const string name = it->get_value (_template_columns.name); const string file_path = Glib::build_filename (path, name+".template"); if (g_unlink (file_path.c_str()) != 0) { @@ -186,52 +255,45 @@ TemplateDialog::delete_selected_template () error << string_compose(_("Could not delete template directory \"%1\": %2"), path, strerror (errno)) << endmsg; } - _session_template_model->erase (it); + _template_model->erase (it); row_selection_changed (); } -bool -TemplateDialog::key_event (GdkEventKey* ev) +void +RouteTemplateManager::rename_template (TreeModel::iterator& item, const Glib::ustring& new_name) { - if (ev->keyval == GDK_KEY_F2) { - start_edit (); - return true; - } - if (ev->keyval == GDK_KEY_Delete) { - delete_selected_template (); - return true; + const string old_filepath = item->get_value (_template_columns.path); + const string new_filepath = Glib::build_filename (user_route_template_directory(), new_name+".template"); + + if (g_rename (old_filepath.c_str(), new_filepath.c_str()) != 0) { + error << string_compose (_("Renaming of the template file failed: %1"), strerror (errno)) << endmsg; + return; } - return false; + item->set_value (_template_columns.name, string (new_name)); + item->set_value (_template_columns.path, new_filepath); } void -TemplateDialog::rename_template (TreeModel::iterator& item, const Glib::ustring& new_name) +RouteTemplateManager::delete_selected_template () { - const string path = item->get_value (_session_template_columns.path); - const string name = item->get_value (_session_template_columns.name); - - const string old_filepath = Glib::build_filename (path, name+".template"); - const string new_filepath = Glib::build_filename (path, new_name+".template"); - const string new_path = Glib::build_filename (user_template_directory(), new_name); + if (_template_treeview.get_selection()->count_selected_rows() == 0) { + return; + } - cout << old_filepath << " " << new_filepath << endl; - cout << path << " " << new_path << endl; + Gtk::TreeModel::const_iterator it = _template_treeview.get_selection()->get_selected(); - if (g_rename (old_filepath.c_str(), new_filepath.c_str()) != 0) { - error << string_compose (_("Renaming of the template file failed: %1"), strerror (errno)) << endmsg; + if (!it) { return; } - if (g_rename (path.c_str(), new_path.c_str()) != 0) { - error << string_compose (_("Renaming of the template directory failed: %1"), strerror (errno)) << endmsg; - if (g_rename (new_filepath.c_str(), old_filepath.c_str()) != 0) { - error << string_compose (_("Couldn't even undo renaming of template file: %1. Please examine the situation using filemanager or terminal."), - strerror (errno)) << endmsg; - } + const string file_path = it->get_value (_template_columns.path); + + if (g_unlink (file_path.c_str()) != 0) { + error << string_compose(_("Could not delete template file \"%1\": %2"), file_path, strerror (errno)) << endmsg; return; } - item->set_value (_session_template_columns.name, string(new_name)); - item->set_value (_session_template_columns.path, new_path); + _template_model->erase (it); + row_selection_changed (); } -- cgit v1.2.3