#!/usr/bin/env ruby $: << "../lib" $VERBOSE = true require 'gtk' require 'zip/zip' class MainApp < Gtk::Window def initialize super() set_usize(400, 256) set_title("rubyzip") signal_connect(Gtk::Window::SIGNAL_DESTROY) { Gtk.main_quit } box = Gtk::VBox.new(false, 0) add(box) @zipfile = nil @buttonPanel = ButtonPanel.new @buttonPanel.openButton.signal_connect(Gtk::Button::SIGNAL_CLICKED) { show_file_selector } @buttonPanel.extractButton.signal_connect(Gtk::Button::SIGNAL_CLICKED) { puts "Not implemented!" } box.pack_start(@buttonPanel, false, false, 0) sw = Gtk::ScrolledWindow.new sw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC) box.pack_start(sw, true, true, 0) @clist = Gtk::CList.new(["Name", "Size", "Compression"]) @clist.set_selection_mode(Gtk::SELECTION_BROWSE) @clist.set_column_width(0, 120) @clist.set_column_width(1, 120) @clist.signal_connect(Gtk::CList::SIGNAL_SELECT_ROW) { |w, row, column, event| @selected_row = row } sw.add(@clist) end class ButtonPanel < Gtk::HButtonBox attr_reader :openButton, :extractButton def initialize super set_layout(Gtk::BUTTONBOX_START) set_spacing(0) @openButton = Gtk::Button.new("Open archive") @extractButton = Gtk::Button.new("Extract entry") pack_start(@openButton) pack_start(@extractButton) end end def show_file_selector @fileSelector = Gtk::FileSelection.new("Open zip file") @fileSelector.show @fileSelector.ok_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) { open_zip(@fileSelector.filename) @fileSelector.destroy } @fileSelector.cancel_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) { @fileSelector.destroy } end def open_zip(filename) @zipfile = Zip::ZipFile.open(filename) @clist.clear @zipfile.each { |entry| @clist.append([ entry.name, entry.size.to_s, (100.0*entry.compressedSize/entry.size).to_s+"%" ]) } end end mainApp = MainApp.new() mainApp.show_all Gtk.main