summary refs log tree commit diff stats
path: root/code/bars.rb
diff options
context:
space:
mode:
Diffstat (limited to 'code/bars.rb')
-rw-r--r--code/bars.rb134
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
+