Enable Apache caching (30min)
[booh] / lib / booh / UndoHandler.rb
1 #                         *  BOOH  *
2 #
3 # A.k.a `Best web-album Of the world, Or your money back, Humerus'.
4 #
5 # The acronyn sucks, however this is a tribute to Dragon Ball by
6 # Akira Toriyama, where the last enemy beaten by heroes of Dragon
7 # Ball is named "Boo". But there was already a free software project
8 # called Boo, so this one will be it "Booh". Or whatever.
9 #
10 #
11 # Copyright (c) 2004 Guillaume Cottenceau <gc3 at bluewin.ch>
12 #
13 # This software may be freely redistributed under the terms of the GNU
14 # public license version 2.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 require 'gettext'
21 require 'gtk2'
22 include GetText
23 bindtextdomain("booh")
24
25 module UndoHandler
26
27     @undo_actions = []
28     @redo_actions = []
29     @batch_mode = false
30
31     module_function
32
33     def save_undo(name, closure, params)
34         entry = { :name => name, :closure => closure, :params => params }
35         if @batch_mode
36             @batch << entry
37         else
38             @undo_actions << [ entry ]
39         end
40         @redo_actions = []
41     end
42
43     def undo(statusbar)
44         all_todos = @undo_actions.pop
45         redos = []
46         all_todos.reverse.each { |todo|
47             redo_closure = todo[:closure].call(*todo[:params])
48             statusbar.pop(0)
49             statusbar.push(0, utf8(_("Undo %s.") % todo[:name]))
50             redos << { :name => todo[:name], :redo => redo_closure, :undo => todo }
51         }
52         @redo_actions << redos
53         return !@undo_actions.empty?
54     end
55
56     def redo(statusbar)
57         all_redos = @redo_actions.pop
58         undos = []
59         all_redos.reverse.each { |redo_item|
60             redo_item[:redo].call
61             statusbar.pop(0)
62             statusbar.push(0, utf8(_("Redo %s.") % redo_item[:name]))
63             undos << redo_item[:undo]
64         }
65         @undo_actions << undos
66         return !@redo_actions.empty?
67     end
68
69     def begin_batch
70         @batch_mode = true
71         @batch = []
72     end
73
74     def end_batch
75         @batch_mode = false
76         @undo_actions << @batch
77     end
78
79     def cleanup
80         @undo_actions.clear
81         @redo_actions.clear
82     end
83
84 end