(Source List) Region Tags (gtk2 part)
authorBen Loftis <ben@harrisonconsoles.com>
Thu, 15 Nov 2018 15:27:04 +0000 (09:27 -0600)
committerBen Loftis <ben@harrisonconsoles.com>
Thu, 1 Aug 2019 17:11:31 +0000 (12:11 -0500)
gtk2_ardour/ardour.menus.in
gtk2_ardour/editor.h
gtk2_ardour/editor_actions.cc
gtk2_ardour/editor_canvas_events.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_regions.cc
gtk2_ardour/editor_regions.h

index 3e46b5600837c2eb2ec3484b3b1e0a1c3041a978..c083d58427b80fcfa3744f2b0ecda1205d35c960 100644 (file)
         <menuitem action='toggle-region-fade-out'/>
       </menu>
       <separator/>
+      <menuitem action='tag-last-capture'/>
       <menuitem action='remove-last-capture'/>
       <separator/>
       <menu action="EditPointMenu">
     <menu name='RegionMenu' action='RegionMenu'>
       <menuitem action='insert-region-from-region-list'/>
       <menuitem action='play-selected-regions'/>
+      <menuitem action='tag-selected-regions'/>
       <menuitem action='loop-region'/>
       <menuitem action='rename-region'/>
       <menuitem action='show-region-properties'/>
 
   <popup name='PopupRegionMenu' action='PopupRegionMenu' accelerators='true'>
     <menuitem action='play-selected-regions'/>
+    <menuitem action='tag-selected-regions'/>
     <menuitem action='loop-region'/>
     <menuitem action='rename-region'/>
     <menuitem action='show-region-properties'/>
index 71f9968867b38f40c31445ccdf185005a6813cd3..753e718fa9f920b9bf33bcb9e21eb0faff6ba552 100644 (file)
@@ -1439,6 +1439,11 @@ private:
        void toggle_skip_playback ();
 
        void remove_last_capture ();
+
+       void tag_last_capture ();
+       void tag_selected_region ();
+       void tag_regions (ARDOUR::RegionList);
+
        void select_all_selectables_using_time_selection ();
        void select_all_selectables_using_loop();
        void select_all_selectables_using_punch();
index a96c39f4a49f1ef9f50e15e1642762b1797214c1..f984ee7c2689ae09320a72af949296102da0ea42 100644 (file)
@@ -330,6 +330,8 @@ Editor::register_actions ()
 
        /* this is a duplicated action so that the main menu can use a different label */
        reg_sens (editor_actions, "main-menu-play-selected-regions", _("Play Selected Regions"), sigc::mem_fun (*this, &Editor::play_selected_region));
+       reg_sens (editor_actions, "main-menu-tag-selected-regions", _("Tag Selected Regions"), sigc::mem_fun (*this, &Editor::tag_selected_region));
+
        reg_sens (editor_actions, "play-from-edit-point", _("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point));
        reg_sens (editor_actions, "play-from-edit-point-and-return", _("Play from Edit Point and Return"), sigc::mem_fun(*this, &Editor::play_from_edit_point_and_return));
 
@@ -422,6 +424,7 @@ Editor::register_actions ()
 
        toggle_reg_sens (editor_actions, "toggle-follow-playhead", _("Follow Playhead"), (sigc::mem_fun(*this, &Editor::toggle_follow_playhead)));
        act = reg_sens (editor_actions, "remove-last-capture", _("Remove Last Capture"), (sigc::mem_fun(*this, &Editor::remove_last_capture)));
+       act = reg_sens (editor_actions, "tag-last-capture", _("Tag Last Capture"), (sigc::mem_fun(*this, &Editor::tag_last_capture)));
 
        ActionManager::register_toggle_action (editor_actions, "toggle-stationary-playhead", _("Stationary Playhead"), (mem_fun(*this, &Editor::toggle_stationary_playhead)));
 
@@ -1512,6 +1515,7 @@ Editor::register_region_actions ()
        register_region_action (_region_actions, RegionActionTarget (SelectedRegions), "show-region-properties", _("Properties..."), sigc::mem_fun (*this, &Editor::show_region_properties));
 
        register_region_action (_region_actions, RegionActionTarget (SelectedRegions|EnteredRegions), "play-selected-regions", _("Play selected Regions"), sigc::mem_fun(*this, &Editor::play_selected_region));
+       register_region_action (_region_actions, RegionActionTarget (SelectedRegions|EnteredRegions), "tag-selected-regions", _("Tag selected Regions"), sigc::mem_fun(*this, &Editor::tag_selected_region));
 
        register_region_action (_region_actions, RegionActionTarget (SelectedRegions), "bounce-regions-processed", _("Bounce (with processing)"), (sigc::bind (sigc::mem_fun (*this, &Editor::bounce_region_selection), true)));
        register_region_action (_region_actions, RegionActionTarget (SelectedRegions), "bounce-regions-unprocessed", _("Bounce (without processing)"), (sigc::bind (sigc::mem_fun (*this, &Editor::bounce_region_selection), false)));
index 911028ee9d6f3bc954fc7ecffd4a7a1c20012ced..dc23d699573305f2fc067b318ed95cad22537549 100644 (file)
@@ -1169,7 +1169,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context,
                return false;
        }
 
-printf("DRAGGING:  track_canvas_drag_motion\n");
+printf("Paul:  DRAGGING:  track_canvas_drag_motion\n");
 
        event.type = GDK_MOTION_NOTIFY;
        event.button.x = x;
index 1c9df29d3d7aa5e4818b0a9244dc4bffc4bcb9c4..aa5c7dfa3e1aee79fe40b352cc9de51d7b127388 100644 (file)
@@ -5139,6 +5139,95 @@ Editor::remove_last_capture ()
        }
 }
 
+void
+Editor::tag_regions (RegionList regions)
+{
+       ArdourDialog d (_("Tag Last Capture"), true, false);
+       Entry entry;
+       Label label (_("Tag:"));
+       HBox hbox;
+
+       hbox.set_spacing (6);
+       hbox.pack_start (label, false, false);
+       hbox.pack_start (entry, true, true);
+
+       d.get_vbox()->set_border_width (12);
+       d.get_vbox()->pack_start (hbox, false, false);
+
+       d.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+       d.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
+
+       d.set_size_request (300, -1);
+
+       entry.set_text (_("Good"));
+       entry.select_region (0, -1);
+
+       entry.signal_activate().connect (sigc::bind (sigc::mem_fun (d, &Dialog::response), RESPONSE_OK));
+
+       d.show_all ();
+
+       entry.grab_focus();
+
+       int const ret = d.run();
+
+       d.hide ();
+
+       if (ret != RESPONSE_OK) {
+               return;
+       }
+
+       std::string tagstr = entry.get_text();
+       strip_whitespace_edges (tagstr);
+       
+       if (!tagstr.empty()) {
+               for (RegionList::iterator r = regions.begin(); r != regions.end(); r++) {
+                       (*r)->set_tags(tagstr);
+               }
+                       
+               _regions->redisplay ();
+       }
+}
+
+void
+Editor::tag_selected_region ()
+{
+       std::list<boost::shared_ptr<Region> > rlist;
+
+       RegionSelection rs = get_regions_from_selection_and_entered ();
+       for (RegionSelection::iterator r = rs.begin(); r != rs.end(); r++) {
+               rlist.push_back((*r)->region());
+       }
+
+       tag_regions(rlist);
+}
+
+void
+Editor::tag_last_capture ()
+{
+       if (!_session) {
+               return;
+       }
+
+       std::list<boost::shared_ptr<Region> > rlist;
+
+       std::list<boost::shared_ptr<Source> > srcs;
+       _session->get_last_capture_sources (srcs);
+       for (std::list<boost::shared_ptr<Source> >::iterator i = srcs.begin(); i != srcs.end(); ++i) {
+               boost::shared_ptr<ARDOUR::Source> source = (*i);
+               if (source) {
+
+                       set<boost::shared_ptr<Region> > regions;
+                       RegionFactory::get_regions_using_source (source, regions);
+                       for (set<boost::shared_ptr<Region> >::iterator r = regions.begin(); r != regions.end(); r++) {
+                               rlist.push_back(*r);
+                       }
+
+               }
+       }
+       
+       tag_regions(rlist);
+}
+
 void
 Editor::normalize_region ()
 {
index 32e7a67b8ca0bf17a9d7ff050124bbebb01788ca..eaa83bc3390f231cb298ef57d9a1ff3614aa6458 100644 (file)
@@ -79,6 +79,7 @@ EditorRegions::EditorRegions (Editor* e)
        : EditorComponent (e)
        , old_focus (0)
        , name_editable (0)
+       , tags_editable (0)
        , _menu (0)
        , _no_redisplay (false)
 {
@@ -110,9 +111,9 @@ EditorRegions::EditorRegions (Editor* e)
        TreeViewColumn* col_name = manage (new TreeViewColumn ("", _columns.name));
        col_name->set_fixed_width (120);
        col_name->set_sizing (TREE_VIEW_COLUMN_FIXED);
-       TreeViewColumn* col_take = manage (new TreeViewColumn ("", _columns.take_id));
-       col_take->set_fixed_width (date_width);
-       col_take->set_sizing (TREE_VIEW_COLUMN_FIXED);
+       TreeViewColumn* col_tags = manage (new TreeViewColumn ("", _columns.tags));
+       col_tags->set_fixed_width (date_width);
+       col_tags->set_sizing (TREE_VIEW_COLUMN_FIXED);
        TreeViewColumn* col_start = manage (new TreeViewColumn ("", _columns.start));
        col_start->set_fixed_width (bbt_width);
        col_start->set_sizing (TREE_VIEW_COLUMN_FIXED);
@@ -145,7 +146,7 @@ EditorRegions::EditorRegions (Editor* e)
        col_opaque->set_sizing (TREE_VIEW_COLUMN_FIXED);
 
        _display.append_column (*col_name);
-       _display.append_column (*col_take);
+       _display.append_column (*col_tags);
        _display.append_column (*col_start);
        _display.append_column (*col_locked);
        _display.append_column (*col_glued);
@@ -162,7 +163,7 @@ EditorRegions::EditorRegions (Editor* e)
 
        ColumnInfo ci[] = {
                { 0,  0,  ALIGN_LEFT,    _("Region"),    _("Region name, with number of channels in []'s") },
-               { 1,  1,  ALIGN_LEFT,    _("Take"),      _("Take ID (or file creation time)") },
+               { 1,  1,  ALIGN_LEFT,    _("Tags"),      _("Tags") },
                { 2, 15,  ALIGN_RIGHT,   _("Start"),     _("Position of start of region") },
                { 3, -1,  ALIGN_CENTER, S_("Lock|L"),    _("Region position locked?") },
                { 4, -1,  ALIGN_CENTER, S_("Gain|G"),    _("Region position glued to Bars|Beats time?") },
@@ -212,18 +213,25 @@ EditorRegions::EditorRegions (Editor* e)
        }
        _display.get_selection()->set_select_function (sigc::mem_fun (*this, &EditorRegions::selection_filter));
 
-       //Region Name:  editable;  and color turns red if source is missing.
+       //Name cell: make  editable
        CellRendererText* region_name_cell = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (0));
        region_name_cell->property_editable() = true;
        region_name_cell->signal_edited().connect (sigc::mem_fun (*this, &EditorRegions::name_edit));
        region_name_cell->signal_editing_started().connect (sigc::mem_fun (*this, &EditorRegions::name_editing_started));
 
+       //Region Name:  color turns red if source is missing.
        TreeViewColumn* tv_col = _display.get_column(0);
        CellRendererText* renderer = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (0));
        tv_col->add_attribute(renderer->property_text(), _columns.name);
        tv_col->add_attribute(renderer->property_foreground_gdk(), _columns.color_);
        tv_col->set_expand (true);
 
+       //Tags cell: make editable
+       CellRendererText* region_tags_cell = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (1));
+       region_tags_cell->property_editable() = true;
+       region_tags_cell->signal_edited().connect (sigc::mem_fun (*this, &EditorRegions::tag_edit));
+       region_tags_cell->signal_editing_started().connect (sigc::mem_fun (*this, &EditorRegions::tag_editing_started));
+
        CellRendererToggle* locked_cell = dynamic_cast<CellRendererToggle*> (_display.get_column_cell_renderer (3));
        locked_cell->property_activatable() = true;
        locked_cell->signal_toggled().connect (sigc::mem_fun (*this, &EditorRegions::locked_changed));
@@ -286,6 +294,7 @@ EditorRegions::focus_in (GdkEventFocus*)
        }
 
        name_editable = 0;
+       tags_editable = 0;
 
        /* try to do nothing on focus in (doesn't work, hence selection_count nonsense) */
        return true;
@@ -300,6 +309,7 @@ EditorRegions::focus_out (GdkEventFocus*)
        }
 
        name_editable = 0;
+       tags_editable = 0;
 
        return false;
 }
@@ -307,7 +317,7 @@ EditorRegions::focus_out (GdkEventFocus*)
 bool
 EditorRegions::enter_notify (GdkEventCrossing*)
 {
-       if (name_editable) {
+       if (name_editable || tags_editable) {
                return true;
        }
 
@@ -639,15 +649,17 @@ EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row co
                _editor->mark_region_boundary_cache_dirty();
        }
 
-       Gdk::Color c;
-       bool missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source()) != NULL;
-       if (missing_source) {
-               set_color_from_rgba (c, UIConfiguration::instance().color ("region list missing source"));
-       } else {
-               set_color_from_rgba (c, UIConfiguration::instance().color ("region list whole file"));
+       {
+               Gdk::Color c;
+               bool missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source()) != NULL;
+               if (missing_source) {
+                       set_color_from_rgba (c, UIConfiguration::instance().color ("region list missing source"));
+               } else {
+                       set_color_from_rgba (c, UIConfiguration::instance().color ("region list whole file"));
+               }
+               row[_columns.color_] = c;
        }
-       row[_columns.color_] = c;
-       
+               
        boost::shared_ptr<AudioRegion> audioregion = boost::dynamic_pointer_cast<AudioRegion>(region);
 
        PropertyChange c;
@@ -684,7 +696,7 @@ EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row co
        if (all) {
                populate_row_source (region, row);
        }
-       if (all || what_changed.contains (Properties::name)) {
+       if (all || what_changed.contains (Properties::name) || what_changed.contains (Properties::tags)) {
                populate_row_name (region, row);
        }
 }
@@ -832,6 +844,8 @@ EditorRegions::populate_row_name (boost::shared_ptr<Region> region, TreeModel::R
        } else {
                row[_columns.name] = Gtkmm2ext::markup_escape_text (region->name());
        }
+
+       row[_columns.tags] = region->tags();
 }
 
 void
@@ -842,8 +856,6 @@ EditorRegions::populate_row_source (boost::shared_ptr<Region> region, TreeModel:
        } else {
                row[_columns.path] = Gtkmm2ext::markup_escape_text (region->source()->name());
        }
-
-       row[_columns.take_id] = region->source()->take_id();  //TODO:  what if there is no take-id?  anything else we can use?
 }
 
 void
@@ -876,6 +888,11 @@ EditorRegions::key_press (GdkEventKey* ev)
                        name_editable = 0;
                }
 
+               if (tags_editable) {
+                       tags_editable->editing_done ();
+                       tags_editable = 0;
+               }
+
                col = _display.get_column (0); // select&focus on name column
 
                if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
@@ -1043,17 +1060,53 @@ EditorRegions::name_edit (const std::string& path, const std::string& new_text)
                (*row_iter)[_columns.name] = new_text;
        }
 
-       /* now mapover everything */
-
        if (region) {
-               vector<RegionView*> equivalents;
-               _editor->get_regions_corresponding_to (region, equivalents, false);
 
-               for (vector<RegionView*>::iterator i = equivalents.begin(); i != equivalents.end(); ++i) {
-                       if (new_text != (*i)->region()->name()) {
-                               (*i)->region()->set_name (new_text);
+               region->set_name (new_text);
+
+               populate_row_name (region, (*row_iter));
+       }
+}
+
+
+void
+EditorRegions::tag_editing_started (CellEditable* ce, const Glib::ustring& path)
+{
+       tags_editable = ce;
+
+       /* give it a special name */
+
+       Gtk::Entry *e = dynamic_cast<Gtk::Entry*> (ce);
+
+       if (e) {
+               e->set_name (X_("RegionTagEditorEntry"));
+
+               TreeIter iter;
+               if ((iter = _model->get_iter (path))) {
+                       boost::shared_ptr<Region> region = (*iter)[_columns.region];
+
+                       if(region) {
+                               e->set_text(region->tags());
                        }
                }
+       }
+}
+
+void
+EditorRegions::tag_edit (const std::string& path, const std::string& new_text)
+{
+       tags_editable = 0;
+
+       boost::shared_ptr<Region> region;
+       TreeIter row_iter;
+
+       if ((row_iter = _model->get_iter (path))) {
+               region = (*row_iter)[_columns.region];
+               (*row_iter)[_columns.tags] = new_text;
+       }
+
+       if (region) {
+               region->set_tags (new_text);
 
                populate_row_name (region, (*row_iter));
        }
index 94124e98ad34eda0d032e26a71f8dfe080d8c203..3f9c756448a44ba5db72318db487575de0cd9fd1 100644 (file)
@@ -76,7 +76,7 @@ private:
        struct Columns : public Gtk::TreeModel::ColumnRecord {
                Columns () {
                        add (name);
-                       add (take_id);
+                       add (tags);
                        add (start);
                        add (end);
                        add (length);
@@ -94,7 +94,7 @@ private:
                }
 
                Gtk::TreeModelColumn<std::string> name;
-               Gtk::TreeModelColumn<std::string> take_id;
+               Gtk::TreeModelColumn<std::string> tags;
                Gtk::TreeModelColumn<samplepos_t> position;
                Gtk::TreeModelColumn<std::string> start;
                Gtk::TreeModelColumn<std::string> end;
@@ -125,10 +125,17 @@ private:
        bool selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
 
        Gtk::Widget* old_focus;
+
        Gtk::CellEditable* name_editable;
        void name_editing_started (Gtk::CellEditable*, const Glib::ustring&);
-
        void name_edit (const std::string&, const std::string&);
+
+
+       Gtk::CellEditable* tags_editable;
+       void tag_editing_started (Gtk::CellEditable*, const Glib::ustring&);
+       void tag_edit (const std::string&, const std::string&);
+
+
        void locked_changed (std::string const &);
        void glued_changed (std::string const &);
        void muted_changed (std::string const &);