From 7a378ef1503a8da433bb245f42c9e9b2412176eb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 3 Jul 2009 23:54:57 +0000 Subject: Missing files. git-svn-id: svn://localhost/ardour2/branches/3.0@5314 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_snapshots.cc | 210 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/editor_snapshots.h | 62 ++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 gtk2_ardour/editor_snapshots.cc create mode 100644 gtk2_ardour/editor_snapshots.h (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_snapshots.cc b/gtk2_ardour/editor_snapshots.cc new file mode 100644 index 0000000000..673d5c22a1 --- /dev/null +++ b/gtk2_ardour/editor_snapshots.cc @@ -0,0 +1,210 @@ +/* + Copyright (C) 2000-2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include "gtkmm2ext/choice.h" +#include "ardour/session_state_utils.h" +#include "ardour/session_directory.h" +#include "editor_snapshots.h" +#include "ardour_ui.h" +#include "i18n.h" +#include "editor.h" +#include "utils.h" +#include "prompter.h" + +using namespace std; +using namespace sigc; +using namespace PBD; +using namespace Gtk; +using namespace ARDOUR; + +EditorSnapshots::EditorSnapshots (Editor* e) + : EditorComponent (e) +{ + _model = ListStore::create (_columns); + _display.set_model (_model); + _display.append_column (X_("snapshot"), _columns.visible_name); + _display.set_name ("SnapshotDisplay"); + _display.set_size_request (75, -1); + _display.set_headers_visible (false); + _display.set_reorderable (false); + _scroller.add (_display); + _scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + + _display.get_selection()->signal_changed().connect (mem_fun(*this, &EditorSnapshots::selection_changed)); + _display.signal_button_press_event().connect (mem_fun (*this, &EditorSnapshots::button_press), false); +} + +void +EditorSnapshots::connect_to_session (Session* s) +{ + EditorComponent::connect_to_session (s); + + redisplay (); +} + +/** A new snapshot has been selected. + */ +void +EditorSnapshots::selection_changed () +{ + if (_display.get_selection()->count_selected_rows() > 0) { + + TreeModel::iterator i = _display.get_selection()->get_selected(); + + Glib::ustring snap_name = (*i)[_columns.real_name]; + + if (snap_name.length() == 0) { + return; + } + + if (_session->snap_name() == snap_name) { + return; + } + + ARDOUR_UI::instance()->load_session (_session->path(), string (snap_name)); + } +} + +bool +EditorSnapshots::button_press (GdkEventButton* ev) +{ + if (ev->button == 3) { + /* Right-click on the snapshot list. Work out which snapshot it + was over. */ + Gtk::TreeModel::Path path; + Gtk::TreeViewColumn* col; + int cx; + int cy; + _display.get_path_at_pos ((int) ev->x, (int) ev->y, path, col, cx, cy); + Gtk::TreeModel::iterator iter = _model->get_iter (path); + if (iter) { + Gtk::TreeModel::Row row = *iter; + popup_context_menu (ev->button, ev->time, row[_columns.real_name]); + } + return true; + } + + return false; +} + + +/** Pop up the snapshot display context menu. + * @param button Button used to open the menu. + * @param time Menu open time. + * @snapshot_name Name of the snapshot that the menu click was over. + */ +void +EditorSnapshots::popup_context_menu (int button, int32_t time, Glib::ustring snapshot_name) +{ + using namespace Menu_Helpers; + + MenuList& items (_menu.items()); + items.clear (); + + const bool modification_allowed = (_session->snap_name() != snapshot_name && _session->name() != snapshot_name); + + add_item_with_sensitivity (items, MenuElem (_("Remove"), bind (mem_fun (*this, &EditorSnapshots::remove), snapshot_name)), modification_allowed); + + add_item_with_sensitivity (items, MenuElem (_("Rename"), bind (mem_fun (*this, &EditorSnapshots::rename), snapshot_name)), modification_allowed); + + _menu.popup (button, time); +} + +void +EditorSnapshots::rename (Glib::ustring old_name) +{ + ArdourPrompter prompter(true); + + string new_name; + + prompter.set_name ("Prompter"); + prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.set_prompt (_("New name of snapshot")); + prompter.set_initial_text (old_name); + + if (prompter.run() == RESPONSE_ACCEPT) { + prompter.get_result (new_name); + if (new_name.length()) { + _session->rename_state (old_name, new_name); + redisplay (); + } + } +} + + +void +EditorSnapshots::remove (Glib::ustring name) +{ + vector choices; + + std::string prompt = string_compose (_("Do you really want to remove snapshot \"%1\" ?\n(cannot be undone)"), name); + + choices.push_back (_("No, do nothing.")); + choices.push_back (_("Yes, remove it.")); + + Gtkmm2ext::Choice prompter (prompt, choices); + + if (prompter.run () == 1) { + _session->remove_state (name); + redisplay (); + } +} + +void +EditorSnapshots::redisplay () +{ + if (_session == 0) { + return; + } + + vector state_file_paths; + + get_state_files_in_directory (_session->session_directory().root_path(), + state_file_paths); + + if (state_file_paths.empty()) { + return; + } + + vector state_file_names (get_file_names_no_extension(state_file_paths)); + + _model->clear (); + + for (vector::iterator i = state_file_names.begin(); i != state_file_names.end(); ++i) + { + string statename = (*i); + TreeModel::Row row = *(_model->append()); + + /* this lingers on in case we ever want to change the visible + name of the snapshot. + */ + + string display_name; + display_name = statename; + + if (statename == _session->snap_name()) { + _display.get_selection()->select(row); + } + + row[_columns.visible_name] = display_name; + row[_columns.real_name] = statename; + } +} + diff --git a/gtk2_ardour/editor_snapshots.h b/gtk2_ardour/editor_snapshots.h new file mode 100644 index 0000000000..30cde55b28 --- /dev/null +++ b/gtk2_ardour/editor_snapshots.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2000-2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include +#include "editor_component.h" + +class EditorSnapshots : public EditorComponent +{ +public: + EditorSnapshots (Editor *); + + void connect_to_session (ARDOUR::Session *); + + Gtk::Widget& widget () { + return _scroller; + } + + void redisplay (); + +private: + + Gtk::ScrolledWindow _scroller; + + struct Columns : public Gtk::TreeModel::ColumnRecord { + Columns () { + add (visible_name); + add (real_name); + } + Gtk::TreeModelColumn visible_name; + Gtk::TreeModelColumn real_name; + }; + + Columns _columns; + Glib::RefPtr _model; + Gtk::TreeView _display; + Gtk::Menu _menu; + + bool button_press (GdkEventButton *); + void selection_changed (); + void popup_context_menu (int, int32_t, Glib::ustring); + void remove (Glib::ustring); + void rename (Glib::ustring); +}; -- cgit v1.2.3