diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index bcc95bfd0..c44a4f8d2 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -48,7 +48,7 @@ ExifPanel::ExifPanel() : exifTree->set_rules_hint (false); exifTree->set_reorderable (false); exifTree->set_enable_search (false); - exifTree->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); + exifTree->get_selection()->set_mode(Gtk::SELECTION_SINGLE); scrolledWindow->set_shadow_type(Gtk::SHADOW_NONE); scrolledWindow->set_policy(Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS); scrolledWindow->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT); @@ -99,7 +99,7 @@ ExifPanel::ExifPanel() : Gtk::CellRendererText *render_txtv = Gtk::manage(new Gtk::CellRendererText()); render_txtv->property_ellipsize() = Pango::ELLIPSIZE_END; viewcolv->pack_start (*render_txtv, true); - viewcolv->add_attribute (*render_txtv, "markup", exifColumns.value); + // viewcolv->add_attribute (*render_txtv, "markup", exifColumns.value); viewcolv->set_expand (true); viewcolv->set_resizable (true); viewcol->set_fixed_width (35); @@ -107,6 +107,8 @@ ExifPanel::ExifPanel() : viewcolv->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); render_txtv->property_ypad() = 0; + viewcolv->set_cell_data_func(*render_txtv, sigc::mem_fun(this, &ExifPanel::setExifTagValue)); + render_txtv->signal_edited().connect(sigc::mem_fun(this, &ExifPanel::onEditExifTagValue)); exifTree->append_column(*viewcolv); @@ -138,7 +140,6 @@ ExifPanel::ExifPanel() : pack_end (*buttons1, Gtk::PACK_SHRINK); exifTree->get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ExifPanel::exifSelectionChanged)); - exifTree->signal_row_activated().connect(sigc::mem_fun(*this, &ExifPanel::onExifRowActivated)); reset->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::resetPressed) ); resetAll->signal_clicked().connect ( sigc::mem_fun (*this, &ExifPanel::resetAllPressed) ); @@ -401,20 +402,18 @@ void ExifPanel::refreshTags() void ExifPanel::exifSelectionChanged () { - Glib::RefPtr selection = exifTree->get_selection(); std::vector sel = selection->get_selected_rows(); - if (sel.size() > 1) { - reset->set_sensitive (1); - } else if (sel.size() == 1) { + if (sel.size() >= 1) { Gtk::TreeModel::iterator iter = exifTreeModel->get_iter (sel[0]); - - if (iter->get_value(exifColumns.icon) == editicon) { - reset->set_sensitive (1); + if (iter->get_value(exifColumns.editable)) { + reset->set_sensitive(true); + add->set_sensitive(true); } } else { - reset->set_sensitive (0); + reset->set_sensitive(false); + add->set_sensitive(false); } } @@ -432,107 +431,43 @@ void ExifPanel::resetPressed() { cur_active_keys_ = get_active_keys(); - std::vector sel = exifTree->get_selection()->get_selected_rows(); - + auto sel = exifTree->get_selection()->get_selected_rows(); for (size_t i = 0; i < sel.size(); i++) { resetIt(exifTreeModel->get_iter(sel[i])); } refreshTags(); + + if (!sel.empty()) { + exifTree->get_selection()->select(sel[0]); + } + notifyListener(); } -void ExifPanel::resetAllPressed () +void ExifPanel::resetAllPressed() { + auto sel = exifTree->get_selection()->get_selected_rows(); setImageData(idata); *changeList = *defChangeList; cur_active_keys_ = initial_active_keys_; refreshTags(); + if (!sel.empty()) { + exifTree->get_selection()->select(sel[0]); + } notifyListener(); } -void ExifPanel::addPressed () +void ExifPanel::addPressed() { + Gtk::TreeModel::Path path; + Gtk::TreeViewColumn *col; - Gtk::Dialog* dialog = new Gtk::Dialog (M ("EXIFPANEL_ADDTAGDLG_TITLE"), * ((Gtk::Window*)get_toplevel()), true); - dialog->add_button ("_OK", Gtk::RESPONSE_OK); - dialog->add_button ("_Cancel", Gtk::RESPONSE_CANCEL); - - Gtk::Box* hb1 = new Gtk::Box (); - Gtk::Box* hb2 = new Gtk::Box (); - - Gtk::Label* tlabel = new Gtk::Label (M ("EXIFPANEL_ADDTAGDLG_SELECTTAG") + ":"); - MyComboBoxText* tcombo = new MyComboBoxText (); - - for (const auto& p : editableTags) { - tcombo->append(p.second); + exifTree->get_cursor(path, col); + const auto it = exifTreeModel->get_iter(path); + if (it && it->get_value(exifColumns.editable)) { + exifTree->set_cursor(path, *col, true); } - - hb1->pack_start (*tlabel, Gtk::PACK_SHRINK, 4); - hb1->pack_start (*tcombo); - - Gtk::Label* vlabel = new Gtk::Label (M ("EXIFPANEL_ADDTAGDLG_ENTERVALUE") + ":"); - Gtk::Entry* ventry = new Gtk::Entry (); - hb2->pack_start (*vlabel, Gtk::PACK_SHRINK, 4); - hb2->pack_start (*ventry); - - Glib::ustring sel; - Glib::ustring val; - { - const Glib::RefPtr selection = exifTree->get_selection(); - const std::vector rows = selection->get_selected_rows(); - - if (rows.size() == 1) { - const Gtk::TreeModel::iterator iter = exifTreeModel->get_iter(rows[0]); - if (iter->get_value(exifColumns.editable)) { - sel = iter->get_value(exifColumns.key); - val = iter->get_value(exifColumns.value_nopango); - } - } - } - - if (sel.empty()) { - tcombo->set_active(0); - } else { - for (size_t i = 0; i < editableTags.size(); ++i) { - if (editableTags[i].first == sel) { - tcombo->set_active(i); - break; - } - } - } - - ventry->set_text(val); - ventry->set_activates_default (true); - dialog->set_default_response (Gtk::RESPONSE_OK); - dialog->get_content_area()->pack_start (*hb1, Gtk::PACK_SHRINK); - dialog->get_content_area()->pack_start (*hb2, Gtk::PACK_SHRINK, 4); - tlabel->show (); - tcombo->show (); - vlabel->show (); - ventry->show (); - hb1->show (); - hb2->show (); - - if (dialog->run () == Gtk::RESPONSE_OK) { - cur_active_keys_ = get_active_keys(); - auto key = editableTags[tcombo->get_active_row_number()].first; - const auto value = ventry->get_text(); - (*changeList)[key] = value; - if (!all_keys_active()) { - cur_active_keys_.insert(key); - } - refreshTags(); - notifyListener(); - } - - delete dialog; - delete tlabel; - delete tcombo; - delete vlabel; - delete ventry; - delete hb1; - delete hb2; } void ExifPanel::activateAllPressed() @@ -682,11 +617,28 @@ void ExifPanel::onExifRowCollapsed(const Gtk::TreeModel::iterator &it, const Gtk } -void ExifPanel::onExifRowActivated(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *column) +void ExifPanel::setExifTagValue(Gtk::CellRenderer *renderer, const Gtk::TreeModel::iterator &it) +{ + auto row = *it; + Gtk::CellRendererText *txt = static_cast(renderer); + txt->property_editable() = row[exifColumns.editable]; + txt->property_markup() = row[exifColumns.value]; +} + + +void ExifPanel::onEditExifTagValue(const Glib::ustring &path, const Glib::ustring &value) { auto it = exifTreeModel->get_iter(path); auto row = *it; - if (row[exifColumns.editable]) { - addPressed(); + std::string key = row[exifColumns.key]; + + changeList[key] = value; + if (!all_keys_active()) { + cur_active_keys_.insert(key); } + refreshTags(); + + it = exifTreeModel->get_iter(path); + exifTree->get_selection()->select(it); + notifyListener(); } diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index da4cc1e37..261561ea0 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -117,8 +117,10 @@ private: void onExifTreeClick(GdkEventButton *event); void onExifRowExpanded(const Gtk::TreeModel::iterator &it, const Gtk::TreeModel::Path &path); void onExifRowCollapsed(const Gtk::TreeModel::iterator &it, const Gtk::TreeModel::Path &path); - void onExifRowActivated(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *column); + void setExifTagValue(Gtk::CellRenderer *renderer, const Gtk::TreeModel::iterator &it); + void onEditExifTagValue(const Glib::ustring &path, const Glib::ustring &value); + public: ExifPanel (); ~ExifPanel() override;