mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
121 lines
4.1 KiB
Ruby
121 lines
4.1 KiB
Ruby
|
# -*- coding: euc-jp -*-
|
|||
|
#
|
|||
|
# tree.rb --
|
|||
|
#
|
|||
|
# This demonstration script creates a toplevel window containing a Ttk
|
|||
|
# tree widget.
|
|||
|
#
|
|||
|
# based on "Id: tree.tcl,v 1.4 2007/12/13 15:27:07 dgp Exp"
|
|||
|
|
|||
|
if defined?($tree_demo) && $tree_demo
|
|||
|
$tree_demo.destroy
|
|||
|
$tree_demo = nil
|
|||
|
end
|
|||
|
|
|||
|
$tree_demo = TkToplevel.new {|w|
|
|||
|
title("Directory Browser")
|
|||
|
iconname("tree")
|
|||
|
positionWindow(w)
|
|||
|
}
|
|||
|
|
|||
|
base_frame = TkFrame.new($tree_demo).pack(:fill=>:both, :expand=>true)
|
|||
|
|
|||
|
## Explanatory text
|
|||
|
Ttk::Label.new(base_frame, :font=>$font, :wraplength=>'4i',
|
|||
|
:justify=>:left, :anchor=>'n', :padding=>[10, 2, 10, 6],
|
|||
|
:text=><<EOL).pack(:fill=>:x)
|
|||
|
Ttk<EFBFBD>Ȥϡ<EFBFBD><EFBFBD>ơ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD>ʿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åȽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǥ<EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>Υ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ץ<EFBFBD><EFBFBD>ϡ<EFBFBD><EFBFBD>ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>륷<EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>Τ褦<EFBFBD>ʳ<EFBFBD><EFBFBD><EFBFBD>Ū<EFBFBD>ʥǡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ȤǤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>褦<EFBFBD>ˤ<EFBFBD><EFBFBD><EFBFBD>Ttk::Treeview<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åȤ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD>Ǥ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
Ttk::Treeview<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åȤϡ<EFBFBD><EFBFBD>ڹ<EFBFBD>¤<EFBFBD><EFBFBD><EFBFBD>Τ<EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD>ˤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǥʤ<EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
<EFBFBD>ɲþ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>Υ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ץ<EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϥե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>륵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD>ɽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뤿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
Ǥ<EFBFBD>դθĿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲå<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⰷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȥ<EFBFBD><EFBFBD>Ǥ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>\
|
|||
|
<EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Υ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>֤ζ<EFBFBD><EFBFBD>ڤ<EFBFBD><EFBFBD><EFBFBD>ʬ<EFBFBD><EFBFBD><EFBFBD>ɥ<EFBFBD><EFBFBD>å<EFBFBD><EFBFBD><EFBFBD><EFBFBD>뤳<EFBFBD>Ȥǡ<EFBFBD>\
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>뤳<EFBFBD>Ȥ<EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD>Ǥ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
EOL
|
|||
|
|
|||
|
## See Code / Dismiss
|
|||
|
Ttk::Frame.new(base_frame) {|frame|
|
|||
|
sep = Ttk::Separator.new(frame)
|
|||
|
Tk.grid(sep, :columnspan=>4, :row=>0, :sticky=>'ew', :pady=>2)
|
|||
|
TkGrid('x',
|
|||
|
Ttk::Button.new(frame, :text=>'<27><><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD>',
|
|||
|
:image=>$image['view'], :compound=>:left,
|
|||
|
:command=>proc{showCode 'tree'}),
|
|||
|
Ttk::Button.new(frame, :text=>'<27>Ĥ<EFBFBD><C4A4><EFBFBD>',
|
|||
|
:image=>$image['delete'], :compound=>:left,
|
|||
|
:command=>proc{
|
|||
|
$tree_demo.destroy
|
|||
|
$tree_demo = nil
|
|||
|
}),
|
|||
|
:padx=>4, :pady=>4)
|
|||
|
grid_columnconfigure(0, :weight=>1)
|
|||
|
pack(:side=>:bottom, :fill=>:x)
|
|||
|
}
|
|||
|
|
|||
|
## Code to populate the roots of the tree (can be more than one on Windows)
|
|||
|
def populate_roots(tree)
|
|||
|
TkComm.simplelist(Tk.tk_call('file', 'volumes')).sort.each{|dir|
|
|||
|
populate_tree(tree, tree.insert(nil, :end, :text=>dir,
|
|||
|
:values=>[dir, 'directory']))
|
|||
|
}
|
|||
|
end
|
|||
|
|
|||
|
## Code to populate a node of the tree
|
|||
|
def populate_tree(tree, node)
|
|||
|
return if tree.get(node, :type) != 'directory'
|
|||
|
|
|||
|
path = tree.get(node, :fullpath)
|
|||
|
tree.delete(tree.children(node))
|
|||
|
Dir.glob("#{path}/*").sort.each{|f|
|
|||
|
type = File.ftype(f)
|
|||
|
id = tree.insert(node, :end,
|
|||
|
:text=>File.basename(f), :values=>[f, type]).id
|
|||
|
if type == 'directory'
|
|||
|
## Make it so that this node is openable
|
|||
|
tree.insert(id, 0, :text=>'dummy')
|
|||
|
tree.itemconfigure(id, :text=>File.basename(f))
|
|||
|
elsif type == 'file'
|
|||
|
size = File.size(f)
|
|||
|
if size >= 1024*1024*1024
|
|||
|
size = '%.1f GB' % (size.to_f/1024/1024/1024)
|
|||
|
elsif size >= 1024*1024
|
|||
|
size = '%.1f MB' % (size.to_f/1024/1024)
|
|||
|
elsif size >= 1024
|
|||
|
size = '%.1f KB' % (size.to_f/1024)
|
|||
|
else
|
|||
|
size = '%.1f bytes' % (size.to_f/1024)
|
|||
|
end
|
|||
|
tree.set(id, :size, size)
|
|||
|
end
|
|||
|
}
|
|||
|
|
|||
|
# Stop this code from rerunning on the current node
|
|||
|
tree.set(node, :type, 'processed_directory')
|
|||
|
end
|
|||
|
|
|||
|
## Create the tree and set it up
|
|||
|
tree = Ttk::Treeview.new(base_frame, :columns=>%w(fullpath type size),
|
|||
|
:displaycolumns=>['size'])
|
|||
|
if Tk.windowingsystem != 'aqua'
|
|||
|
vsb = tree.yscrollbar(Ttk::Scrollbar.new(base_frame))
|
|||
|
hsb = tree.xscrollbar(Ttk::Scrollbar.new(base_frame))
|
|||
|
else
|
|||
|
vsb = tree.yscrollbar(Tk::Scrollbar.new(base_frame))
|
|||
|
hsb = tree.xscrollbar(Tk::Scrollbar.new(base_frame))
|
|||
|
end
|
|||
|
|
|||
|
tree.heading_configure('#0', :text=>'Directory Structure')
|
|||
|
tree.heading_configure('size', :text=>'File Size')
|
|||
|
tree.column_configure('size', :stretch=>0, :width=>70)
|
|||
|
populate_roots(tree)
|
|||
|
tree.bind('<TreeviewOpen>', '%W'){|w| populate_tree(w, w.focus_item)}
|
|||
|
|
|||
|
## Arrange the tree and its scrollbars in the toplevel
|
|||
|
container = Ttk::Frame.new(base_frame).pack(:fill=>:both, :expand=>true)
|
|||
|
container.lower
|
|||
|
Tk.grid(tree, vsb, :in=>container, :sticky=>'nsew')
|
|||
|
Tk.grid(hsb, :in=>container, :sticky=>'nsew')
|
|||
|
container.grid_columnconfigure(0, :weight=>1)
|
|||
|
container.grid_rowconfigure(0, :weight=>1)
|