1 /* Copyright 2009 Yorba Foundation
3 * This software is licensed under the GNU Lesser General Public License
4 * (version 2.1 or later). See the COPYING file in this distribution.
8 public abstract class Command {
9 public abstract void apply();
10 public abstract void undo();
11 public abstract bool merge(Command command);
12 public abstract string description();
15 public enum Parameter { PAN, VOLUME }
17 public class ParameterCommand : Command {
22 public ParameterCommand(AudioTrack target, Parameter parameter,
23 double new_value, double old_value) {
25 this.parameter = parameter;
26 this.delta = new_value - old_value;
29 void change_parameter(double amount) {
32 target._set_pan(target.get_pan() + amount);
34 case Parameter.VOLUME:
35 target._set_volume(target.get_volume() + amount);
40 public override void apply() {
41 change_parameter(delta);
44 public override void undo() {
45 change_parameter(-delta);
48 public override bool merge(Command command) {
49 ParameterCommand parameter_command = command as ParameterCommand;
50 if (parameter_command != null && parameter_command.parameter == parameter) {
51 delta = delta + parameter_command.delta;
57 public override string description() {
61 case Parameter.VOLUME:
62 return "Adjust Level";
70 public class ClipCommand : Command {
71 public enum Action { APPEND, DELETE }
79 public ClipCommand(Action action, Track track, Clip clip, int64 time, bool select) {
85 this.index = track.get_clip_index(clip);
88 public override void apply() {
91 track._append_at_time(clip, time, select);
94 track._delete_clip(clip);
102 public override void undo() {
105 track._delete_clip(clip);
108 track.add(clip, time, false);
116 public override bool merge(Command command) {
120 public override string description() {
123 return "Create Clip";
125 return "Delete Clip";
133 public class ClipAddCommand : Command {
138 public ClipAddCommand(Track track, Clip clip, int64 original_time,
142 this.delta = new_start - original_time;
145 public override void apply() {
146 track._move(clip, clip.start);
149 public override void undo() {
150 track.remove_clip_from_array(clip);
151 track._move(clip, clip.start - delta);
154 public override bool merge(Command command) {
158 public override string description() {
163 public class ClipSplitCommand : Command {
168 public enum Action { SPLIT, JOIN }
170 public ClipSplitCommand(Action action, Track track, int64 time) {
173 do_split = action == Action.SPLIT;
176 public override void apply() {
178 track._split_at(time);
184 public override void undo() {
188 track._split_at(time);
192 public override bool merge(Command command) {
196 public override string description() {
205 public class ClipFileDeleteCommand : Command {
209 public ClipFileDeleteCommand(Project p, ClipFile cf) {
214 public override void apply() {
215 project._remove_clipfile(clipfile);
218 public override void undo() {
220 project._add_clipfile(clipfile);
222 project.error_occurred("Could not add clipfile.", e.message);
226 public override bool merge(Command command) {
230 public override string description() {
231 return "Delete from Library";
235 public class ClipTrimCommand : Command {
241 public ClipTrimCommand(Track track, Clip clip, int64 delta, Gdk.WindowEdge edge) {
248 public override void apply() {
249 track._trim(clip, delta, edge);
252 public override void undo() {
253 track._trim(clip, -delta, edge);
256 public override bool merge(Command command) {
260 public override string description() {
261 return "Trim To Playhead";
265 public class ClipRevertCommand : Command {
271 public ClipRevertCommand(Track track, Clip clip) {
276 public override void apply() {
277 right_delta = clip.end;
278 left_delta = clip.media_start;
279 track._revert_to_original(clip);
280 left_delta -= clip.media_start;
281 right_delta = clip.end - right_delta - left_delta;
284 public override void undo() {
285 track._trim(clip, -left_delta, Gdk.WindowEdge.WEST);
286 track._trim(clip, -right_delta, Gdk.WindowEdge.EAST);
289 public override bool merge(Command command) {
293 public override string description() {
294 return "Revert To Original";
298 public class TimeSignatureCommand : Command {
299 Fraction new_time_signature;
300 Fraction old_time_signature;
303 public TimeSignatureCommand(Project project, Fraction new_time_signature) {
304 this.project = project;
305 this.new_time_signature = new_time_signature;
306 this.old_time_signature = project.get_time_signature();
309 public override void apply() {
310 project._set_time_signature(new_time_signature);
313 public override void undo() {
314 project._set_time_signature(old_time_signature);
317 public override bool merge(Command command) {
321 public override string description() {
322 return "Set Time Signature";
326 public class BpmCommand : Command {
330 public BpmCommand(Project project, int new_bpm) {
331 delta = new_bpm - project.get_bpm();
332 this.project = project;
335 public override void apply() {
336 project._set_bpm(project.get_bpm() + delta);
339 public override void undo() {
340 project._set_bpm(project.get_bpm() - delta);
343 public override bool merge(Command command) {
347 public override string description() {
352 public class AddClipCommand : Command {
356 public AddClipCommand(Project project, ClipFile clip_file) {
357 this.project = project;
358 this.clip_file = clip_file;
361 public override void apply() {
363 project._add_clipfile(clip_file);
364 } catch (GLib.Error error) {
365 project.error_occurred("Error importing", "An error occurred importing this file.");
369 public override void undo() {
370 project._remove_clipfile(clip_file);
373 public override bool merge(Command command) {
377 public override string description() {
378 return "Add Clip To Library";
382 public class TransactionCommand : Command {
384 string transaction_description;
386 public TransactionCommand(bool open, string transaction_description) {
388 this.transaction_description = transaction_description;
391 public bool in_transaction() {
395 public override void apply() {
398 public override void undo() {
401 public override bool merge(Command command) {
405 public override string description() {
406 return transaction_description;