summaryrefslogtreecommitdiff
path: root/gtk2_ardour/selection_memento.cc
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2014-12-15 00:13:38 +1100
committerPaul Davis <paul@linuxaudiosystems.com>2014-12-18 11:03:10 -0500
commit9af9e17adc96f7c27ce0e1651d6949393e787636 (patch)
tree395fb4ddffd3a66ba0e8021bd7ec1de137c315d2 /gtk2_ardour/selection_memento.cc
parent2c8a769aaef7465f170edf37982733fd19d89c0e (diff)
Add editor selection state to session history via a SelectionMemento, which
combines selection related editor properties with the current editor selection. The related editor properties are: mouse mode, zoom setting, left frame of the canvas, y origin of the canvas. Selection state now includes region views (storing the underlying region id) and time. This patch also fixes a region mute undo bug.
Diffstat (limited to 'gtk2_ardour/selection_memento.cc')
-rw-r--r--gtk2_ardour/selection_memento.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/gtk2_ardour/selection_memento.cc b/gtk2_ardour/selection_memento.cc
new file mode 100644
index 0000000000..67e527b07f
--- /dev/null
+++ b/gtk2_ardour/selection_memento.cc
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2014 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 "selection_memento.h"
+#include "editing.h"
+#include "public_editor.h"
+
+#include "i18n.h"
+
+SelectionMemento::SelectionMemento ()
+{
+}
+
+SelectionMemento::~SelectionMemento ()
+{
+}
+
+XMLNode&
+SelectionMemento::get_state () {
+
+ XMLNode* node = new XMLNode ("SelectionMemento");
+ char buf[32];
+ PublicEditor& editor = PublicEditor::instance();
+
+ node->add_property ("mouse-mode", enum2str(editor.current_mouse_mode()));
+ snprintf (buf, sizeof(buf), "%" PRId64, editor.get_current_zoom());
+ node->add_property ("zoom", buf);
+ snprintf (buf, sizeof (buf), "%" PRIi64, editor.leftmost_sample());
+ node->add_property ("left-frame", buf);
+ snprintf (buf, sizeof (buf), "%f", editor.get_y_origin());
+ node->add_property ("y-origin", buf);
+
+ node->add_child_nocopy (editor.get_selection().get_state());
+ return *node;
+}
+
+int
+SelectionMemento::set_state (const XMLNode& node, int /*version*/) {
+
+ const XMLProperty* prop;
+ PublicEditor& editor = PublicEditor::instance();
+ if (node.name() != X_("SelectionMemento")) {
+ return -1;
+ }
+
+ if ((prop = node.property ("mouse-mode"))) {
+ Editing::MouseMode m = Editing::str2mousemode(prop->value());
+ editor.set_mouse_mode (m, true);
+ } else {
+ editor.set_mouse_mode (Editing::MouseObject, true);
+ }
+
+ if ((prop = node.property ("zoom"))) {
+ /* older versions of ardour used floating point samples_per_pixel */
+ double f = PBD::atof (prop->value());
+ editor.reset_zoom (llrintf (f));
+ }
+
+ if ((prop = node.property ("left-frame")) != 0) {
+ framepos_t pos;
+ if (sscanf (prop->value().c_str(), "%" PRId64, &pos) == 1) {
+ if (pos < 0) {
+ pos = 0;
+ }
+ editor.reset_x_origin (pos);
+ }
+ }
+
+ if ((prop = node.property ("y-origin")) != 0) {
+ editor.reset_y_origin (atof (prop->value ().c_str()));
+ }
+
+ XMLNodeList children = node.children ();
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ editor.get_selection().set_state (**i, Stateful::current_state_version);
+ }
+
+ return 0;
+}