From 715d577a38d04a98405a015fd18d49c0fed40c21 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 30 Dec 2009 15:48:50 +0000 Subject: Fix renaming (fix ticket #458). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2324 a436a847-0d15-0410-975c-d299462d15a1 --- src/gui/RenameWindow.cpp | 69 ++++++++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 26 deletions(-) (limited to 'src/gui/RenameWindow.cpp') diff --git a/src/gui/RenameWindow.cpp b/src/gui/RenameWindow.cpp index b6c41e68..32210466 100644 --- a/src/gui/RenameWindow.cpp +++ b/src/gui/RenameWindow.cpp @@ -33,12 +33,14 @@ namespace GUI { RenameWindow::RenameWindow(BaseObjectType* cobject, const Glib::RefPtr& glade_xml) : Window(cobject) { - glade_xml->get_widget("rename_name_entry", _name_entry); + glade_xml->get_widget("rename_symbol_entry", _symbol_entry); + glade_xml->get_widget("rename_label_entry", _label_entry); glade_xml->get_widget("rename_message_label", _message_label); glade_xml->get_widget("rename_cancel_button", _cancel_button); glade_xml->get_widget("rename_ok_button", _ok_button); - _name_entry->signal_changed().connect(sigc::mem_fun(this, &RenameWindow::name_changed)); + _symbol_entry->signal_changed().connect(sigc::mem_fun(this, &RenameWindow::symbol_changed)); + _label_entry->signal_changed().connect(sigc::mem_fun(this, &RenameWindow::label_changed)); _cancel_button->signal_clicked().connect(sigc::mem_fun(this, &RenameWindow::cancel_clicked)); _ok_button->signal_clicked().connect(sigc::mem_fun(this, &RenameWindow::ok_clicked)); @@ -53,7 +55,10 @@ void RenameWindow::set_object(SharedPtr object) { _object = object; - _name_entry->set_text(object->path().name()); + _symbol_entry->set_text(object->path().name()); + const Atom& name_atom = object->get_property("lv2:name"); + _label_entry->set_text( + (name_atom.type() == Atom::STRING) ? name_atom.get_string() : ""); } @@ -61,7 +66,7 @@ void RenameWindow::present(SharedPtr object) { set_object(object); - _name_entry->grab_focus(); + _symbol_entry->grab_focus(); Gtk::Window::present(); } @@ -70,28 +75,31 @@ RenameWindow::present(SharedPtr object) * Used to display warning messages, and enable/disable the rename button. */ void -RenameWindow::name_changed() +RenameWindow::symbol_changed() { - assert(_name_entry); - assert(_message_label); - assert(_object); - assert(_object->parent()); - - string name = _name_entry->get_text(); - if (name.find("/") != string::npos) { - _message_label->set_text("Name may not contain '/'"); + const string& symbol = _symbol_entry->get_text(); + if (symbol.length() == 0) { + _message_label->set_text("Symbol must be at least 1 character"); _ok_button->property_sensitive() = false; - } else if (!Path::is_valid_name(name)) { - _message_label->set_text("Name contains invalid characters"); + } else if (!Path::is_valid_name(symbol)) { + _message_label->set_text("Symbol contains invalid characters"); _ok_button->property_sensitive() = false; - } else if (name == _object->path().name()) { - _message_label->set_text(""); - _ok_button->property_sensitive() = false; - } else if ((App::instance().store()->object(_object->parent()->path().base() + name))) { - _message_label->set_text("An object already exists with that name."); + } else if (App::instance().store()->object(_object->parent()->path().base() + symbol)) { + _message_label->set_text("An object already exists with that path"); _ok_button->property_sensitive() = false; - } else if (name.length() == 0) { + } else { _message_label->set_text(""); + _ok_button->property_sensitive() = true; + } +} + + +void +RenameWindow::label_changed() +{ + const string& label = _label_entry->get_text(); + if (label == "") { + _message_label->set_text("Label must be at least 1 character"); _ok_button->property_sensitive() = false; } else { _message_label->set_text(""); @@ -103,7 +111,7 @@ RenameWindow::name_changed() void RenameWindow::cancel_clicked() { - _name_entry->set_text(""); + _symbol_entry->set_text(""); hide(); } @@ -117,11 +125,20 @@ RenameWindow::cancel_clicked() void RenameWindow::ok_clicked() { - string name = _name_entry->get_text(); - assert(name.length() > 0); - assert(name.find("/") == string::npos); + const string& symbol = _symbol_entry->get_text(); + const string& label = _label_entry->get_text(); + Path path = _object->path(); + const Atom& name_atom = _object->get_property("lv2:name"); + + if (Path::is_valid_name(symbol) && symbol != _object->path().name()) { + path = _object->path().parent().base() + symbol; + App::instance().engine()->move(_object->path(), path); + } - App::instance().engine()->move(_object->path(), _object->path().parent().base() + name); + if (label != "" && (!name_atom.is_valid() || label != name_atom.get_string())) { + App::instance().engine()->set_property(path, + "lv2:name", Atom(Atom::STRING, label)); + } hide(); } -- cgit v1.2.1