diff options
Diffstat (limited to 'code/bars.rb')
-rw-r--r-- | code/bars.rb | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/code/bars.rb b/code/bars.rb new file mode 100644 index 00000000..61d14572 --- /dev/null +++ b/code/bars.rb @@ -0,0 +1,134 @@ +class Bar + def initialize( text = '' ) + @text = text + @text_prefix = nil + @max = 0 + @done = 0 + @counter = 0 + @thread = nil + @update_proc = nil + Fm.bar_add(self) + end + + def kill(evil = true) + Fm.bar_del(self) + Fm.force_update + + @thread.kill + end + + def update(&block) + if block + @update_proc = block + elsif @update_proc + @update_proc.call(self) + end + end + + def set_text_prefix(text) + @text_prefix = text + end + def set_text(text) + @text_prefix = nil + @text = text + end + alias text= set_text + + attr_accessor :thread, :counter, :max +end + +class CopyBar < Bar + def initialize( text = '' ) + super + + @update_proc = proc do |b| + begin + b.done = File.size(fname).to_f / finished + rescue + b.done = 0 + end + end + end +end + +class Bar2 + def kill(evil = true) + Fm.bar_del(self) + Fm.force_update + + @thread.kill + end + + def set_text_prefix(text) + @text_prefix = text + end + def set_text(text) + @text_prefix = nil + @text = text + end + alias text= set_text + + attr_accessor :thread, :counter, :max + def done + if @counter.is_a? MutableNumber + @counter.value.to_f / @max + else + 0 + end + end + + def update() end + + def text + if @text_prefix + "#{@text_prefix} #{(@counter.value.to_f * 10000/ @max).round.to_f/100}%" + elsif @text + @text + else + "" + end + end +end + +class CopyOrMoveBar < Bar2 + def initialize(files, path) + path = path.path unless path.is_a? String + Fm.bar_add(self) + log([files, path]) + + + @thread = Thread.new do + begin + for file in files + file = file.path unless file.is_a? String + if File.exists?(file) + run_operation(file, path) + end + end + rescue + log $! + log $!.backtrace + ensure + kill(false) + end + end + @thread.priority = Fm::COPY_PRIORITY + end +end + +class CopyBar2 < CopyOrMoveBar + def run_operation(file, path) + if File.directory?(file) + FileUtils.cp_r_in_bar(self, file, path) + else + FileUtils.cp_in_bar(self, file, path) + end + end +end + +class MoveBar2 < CopyOrMoveBar + def run_operation(file, path) + FileUtils.mv_in_bar(self, file, path) + end +end + |