From: Johannes Mueller Date: Thu, 17 Aug 2017 19:42:32 +0000 (+0200) Subject: Make template descriptions editable in template manager X-Git-Tag: 5.12~156 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=e933db1a12643426e2513162b4fc03854ff4f741;p=ardour.git Make template descriptions editable in template manager --- diff --git a/gtk2_ardour/template_dialog.cc b/gtk2_ardour/template_dialog.cc index ffeeaa8637..e5b430a7bb 100644 --- a/gtk2_ardour/template_dialog.cc +++ b/gtk2_ardour/template_dialog.cc @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -76,6 +77,8 @@ TemplateDialog::TemplateDialog () TemplateManager::TemplateManager () : HBox () , ProgressReporter () + , _save_desc (_("Save Description")) + , _desc_dirty (false) , _remove_button (_("Remove")) , _rename_button (_("Rename")) , _export_all_templates_button (_("Export all")) @@ -99,11 +102,11 @@ TemplateManager::TemplateManager () sw->add (_template_treeview); sw->set_size_request (300, 200); - VBox* vb_btns = manage (new VBox); vb_btns->set_spacing (4); vb_btns->pack_start (_rename_button, false, false); vb_btns->pack_start (_remove_button, false, false); + vb_btns->pack_start (_save_desc, false, false); _rename_button.set_sensitive (false); _rename_button.signal_clicked().connect (sigc::mem_fun (*this, &TemplateManager::start_edit)); @@ -127,7 +130,21 @@ TemplateManager::TemplateManager () vb->pack_start (*sw); vb->pack_start (_progress_bar); + Frame* desc_frame = manage (new Frame (_("Description"))); + + _description_editor.set_wrap_mode (Gtk::WRAP_WORD); + _description_editor.set_size_request (300,400); + _description_editor.set_border_width (6); + + _save_desc.set_sensitive (false); + _save_desc.signal_clicked().connect (sigc::mem_fun (*this, &TemplateManager::save_template_desc)); + + _description_editor.get_buffer()->signal_changed().connect (sigc::mem_fun (*this, &TemplateManager::set_desc_dirty)); + + desc_frame->add (_description_editor); + pack_start (*vb); + pack_start (*desc_frame); pack_start (*vb_btns); show_all_children (); @@ -145,6 +162,7 @@ TemplateManager::setup_model (const vector& templates) row[_template_columns.name] = it->name; row[_template_columns.path] = it->path; + row[_template_columns.description] = it->description; } _export_all_templates_button.set_sensitive (!templates.empty ()); @@ -158,6 +176,10 @@ TemplateManager::row_selection_changed () Gtk::TreeModel::const_iterator it = _template_treeview.get_selection()->get_selected (); if (it) { has_selection = true; + const string desc = it->get_value (_template_columns.description); + _description_editor.get_buffer()->set_text (desc); + _desc_dirty = false; + _save_desc.set_sensitive (false); } } @@ -211,6 +233,51 @@ TemplateManager::start_edit () _template_treeview.set_cursor (path, *col, /*set_editing =*/ true); } +void +TemplateManager::set_desc_dirty () +{ + _desc_dirty = true; + _save_desc.set_sensitive (true); +} + +void +TemplateManager::save_template_desc () +{ + const Gtk::TreeModel::const_iterator it = _template_treeview.get_selection()->get_selected (); + const string file_path = template_file (it); + + const string desc_txt = _description_editor.get_buffer()->get_text (); + it->set_value (_template_columns.description, desc_txt); + + XMLTree tree; + + if (!tree.read(file_path)) { + error << string_compose (_("Could not parse template file \"%1\"."), file_path) << endmsg; + return; + } + + XMLNode* md = tree.root()->child (X_("Metadata")); + if (!md) { + md = new XMLNode (X_("Metadata")); + tree.root()->add_child_nocopy (*md); + } + XMLNode* desc = md->child (X_("description")); + if (!desc) { + desc = new XMLNode (X_("description")); + md->add_child_nocopy (*desc); + } + XMLNode* dn = new XMLNode (X_("content"), desc_txt); + desc->add_child_nocopy (*dn); + + if (!tree.write ()) { + error << string_compose(X_("Could not write to template file \"%1\"."), file_path) << endmsg; + return; + } + + _save_desc.set_sensitive (false); + _desc_dirty = false; +} + bool TemplateManager::key_event (GdkEventKey* ev) { @@ -431,7 +498,7 @@ TemplateManager::update_progress_gui (float p) void SessionTemplateManager::init () { vector templates; - find_session_templates (templates); + find_session_templates (templates, /* read_xml = */ true); setup_model (templates); _progress_bar.hide (); @@ -521,13 +588,21 @@ SessionTemplateManager::delete_selected_template () row_selection_changed (); } - string SessionTemplateManager::templates_dir () const { return user_template_directory (); } + +string +SessionTemplateManager::template_file (const TreeModel::const_iterator& item) const +{ + const string path = item->get_value (_template_columns.path); + const string name = item->get_value (_template_columns.name); + return Glib::build_filename (path, name+".template"); +} + bool SessionTemplateManager::adjust_xml_tree (XMLTree& tree, const std::string& old_name, const std::string& new_name) const { @@ -627,6 +702,13 @@ RouteTemplateManager::templates_dir () const return user_route_template_directory (); } + +string +RouteTemplateManager::template_file (const TreeModel::const_iterator& item) const +{ + return item->get_value (_template_columns.path); +} + bool RouteTemplateManager::adjust_xml_tree (XMLTree& tree, const std::string& old_name, const std::string& new_name) const { diff --git a/gtk2_ardour/template_dialog.h b/gtk2_ardour/template_dialog.h index 0d1ba29e8c..d80ff366d9 100644 --- a/gtk2_ardour/template_dialog.h +++ b/gtk2_ardour/template_dialog.h @@ -25,6 +25,7 @@ #include #include +#include #include #include "ardour_dialog.h" @@ -64,15 +65,20 @@ protected: void validate_edit (const Glib::ustring& path_string, const Glib::ustring& new_name); void start_edit (); + void set_desc_dirty (); + bool key_event (GdkEventKey* ev); virtual void rename_template (Gtk::TreeModel::iterator& item, const Glib::ustring& new_name) = 0; virtual void delete_selected_template () = 0; + virtual void save_template_desc (); + void export_all_templates (); void import_template_set (); virtual std::string templates_dir () const = 0; + virtual std::string template_file (const Gtk::TreeModel::const_iterator& item) const = 0; virtual bool adjust_xml_tree (XMLTree& tree, const std::string& old_name, const std::string& new_name) const = 0; @@ -82,10 +88,12 @@ protected: SessionTemplateColumns () { add (name); add (path); + add (description); } Gtk::TreeModelColumn name; Gtk::TreeModelColumn path; + Gtk::TreeModelColumn description; }; SessionTemplateColumns _template_columns; @@ -95,6 +103,10 @@ protected: Gtk::CellRendererText _validating_cellrenderer; Gtk::TreeView::Column _validated_column; + Gtk::TextView _description_editor; + Gtk::Button _save_desc; + bool _desc_dirty; + Gtk::Button _remove_button; Gtk::Button _rename_button; @@ -120,6 +132,7 @@ private: void delete_selected_template (); std::string templates_dir () const; + std::string template_file (const Gtk::TreeModel::const_iterator& item) const; bool adjust_xml_tree (XMLTree& tree, const std::string& old_name, const std::string& new_name) const; }; @@ -138,6 +151,7 @@ private: void delete_selected_template (); std::string templates_dir () const; + std::string template_file (const Gtk::TreeModel::const_iterator& item) const; bool adjust_xml_tree (XMLTree& tree, const std::string& old_name, const std::string& new_name) const; };