102 lines
1.9 KiB
Ruby
102 lines
1.9 KiB
Ruby
|
#!/usr/bin/env ruby
|
||
|
|
||
|
$VERBOSE=true
|
||
|
|
||
|
$: << "../lib"
|
||
|
|
||
|
require 'Qt'
|
||
|
system('rbuic -o zipdialogui.rb zipdialogui.ui')
|
||
|
require 'zipdialogui.rb'
|
||
|
require 'zip/zip'
|
||
|
|
||
|
|
||
|
|
||
|
a = Qt::Application.new(ARGV)
|
||
|
|
||
|
class ZipDialog < ZipDialogUI
|
||
|
|
||
|
|
||
|
def initialize()
|
||
|
super()
|
||
|
connect(child('add_button'), SIGNAL('clicked()'),
|
||
|
self, SLOT('add_files()'))
|
||
|
connect(child('extract_button'), SIGNAL('clicked()'),
|
||
|
self, SLOT('extract_files()'))
|
||
|
end
|
||
|
|
||
|
def zipfile(&proc)
|
||
|
Zip::ZipFile.open(@zip_filename, &proc)
|
||
|
end
|
||
|
|
||
|
def each(&proc)
|
||
|
Zip::ZipFile.foreach(@zip_filename, &proc)
|
||
|
end
|
||
|
|
||
|
def refresh()
|
||
|
lv = child("entry_list_view")
|
||
|
lv.clear
|
||
|
each {
|
||
|
|e|
|
||
|
lv.insert_item(Qt::ListViewItem.new(lv, e.name, e.size.to_s))
|
||
|
}
|
||
|
end
|
||
|
|
||
|
|
||
|
def load(zipfile)
|
||
|
@zip_filename = zipfile
|
||
|
refresh
|
||
|
end
|
||
|
|
||
|
def add_files
|
||
|
l = Qt::FileDialog.getOpenFileNames(nil, nil, self)
|
||
|
zipfile {
|
||
|
|zf|
|
||
|
l.each {
|
||
|
|path|
|
||
|
zf.add(File.basename(path), path)
|
||
|
}
|
||
|
}
|
||
|
refresh
|
||
|
end
|
||
|
|
||
|
def extract_files
|
||
|
selected_items = []
|
||
|
unselected_items = []
|
||
|
lv_item = entry_list_view.first_child
|
||
|
while (lv_item)
|
||
|
if entry_list_view.is_selected(lv_item)
|
||
|
selected_items << lv_item.text(0)
|
||
|
else
|
||
|
unselected_items << lv_item.text(0)
|
||
|
end
|
||
|
lv_item = lv_item.next_sibling
|
||
|
end
|
||
|
puts "selected_items.size = #{selected_items.size}"
|
||
|
puts "unselected_items.size = #{unselected_items.size}"
|
||
|
items = selected_items.size > 0 ? selected_items : unselected_items
|
||
|
puts "items.size = #{items.size}"
|
||
|
|
||
|
d = Qt::FileDialog.get_existing_directory(nil, self)
|
||
|
if (!d)
|
||
|
puts "No directory chosen"
|
||
|
else
|
||
|
zipfile { |zf| items.each { |e| zf.extract(e, File.join(d, e)) } }
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
slots 'add_files()', 'extract_files()'
|
||
|
end
|
||
|
|
||
|
if !ARGV[0]
|
||
|
puts "usage: #{$0} zipname"
|
||
|
exit
|
||
|
end
|
||
|
|
||
|
zd = ZipDialog.new
|
||
|
zd.load(ARGV[0])
|
||
|
|
||
|
a.mainWidget = zd
|
||
|
zd.show()
|
||
|
a.exec()
|