1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
|
# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
# $Id: stock_browser.rb,v 1.5 2005/02/12 23:02:43 kzys Exp $
=begin
= Stock Item and Icon Browser
This source code for this demo doesn't demonstrate anything
particularly useful in applications. The purpose of the 'demo' is
just to provide a handy place to browse the available stock icons
and stock items.
=end
require 'common'
module Demo
class StockBrowser < BasicWindow
Item =
Struct.new('Item',
:stock_id, :label, :modifier, :keyval, :translation_domain)
ItemInfo =
Struct.new('ItemInfo', :id, :item, :small_icon, :const, :accel_str)
ItemDisplay =
Struct.new('ItemDisplay',
:type_label, :const_label, :id_label, :label_accel_label,
:icon_image)
def initialize
super('Stock Icons and Items')
set_default_size(-1, 500)
self.border_width = 8
hbox = Gtk::HBox.new(false, 8)
add(hbox)
sw = Gtk::ScrolledWindow.new
sw.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC)
hbox.pack_start(sw, false, false, 0)
model = create_model
treeview = Gtk::TreeView.new(model)
sw.add(treeview)
column = Gtk::TreeViewColumn.new
column.title = 'Const'
cell_renderer = Gtk::CellRendererPixbuf.new
column.pack_start(cell_renderer, false)
column.set_attributes(cell_renderer, "stock_id" => 1)
cell_renderer = Gtk::CellRendererText.new
column.pack_start(cell_renderer, true)
column.set_cell_data_func(cell_renderer) do |column, cell, model, iter|
cell.text = iter[0].const
end
treeview.append_column(column)
cell_renderer = Gtk::CellRendererText.new
treeview.insert_column(-1, 'Label', cell_renderer) do |col, cell, model, iter|
info = iter[0]
cell.text = info.item.label if info
end
cell_renderer = Gtk::CellRendererText.new
treeview.insert_column(-1, 'Accel', cell_renderer) do |col, cell, model, iter|
info = iter[0]
cell.text = info.accel_str if info
end
cell_renderer = Gtk::CellRendererText.new
treeview.insert_column(-1, 'ID', cell_renderer) do |col, cell, model, iter|
info = iter[0]
cell.text = info.id if info
end
align = Gtk::Alignment.new(0.5, 0.0, 0.0, 0.0)
hbox.pack_end(align, false, false, 0)
frame = Gtk::Frame.new('Selected Item')
align.add(frame)
vbox = Gtk::VBox.new(false, 8)
vbox.border_width = 4
frame.add(vbox)
display = ItemDisplay.new
class << treeview
@display = nil
attr_accessor :display
end
treeview.display = display
display.type_label = Gtk::Label.new
display.const_label = Gtk::Label.new
display.id_label = Gtk::Label.new
display.label_accel_label = Gtk::Label.new
display.icon_image = Gtk::Image.new # empty image
vbox.pack_start(display.type_label, false, false, 0)
vbox.pack_start(display.icon_image, false, false, 0)
vbox.pack_start(display.label_accel_label, false, false, 0)
vbox.pack_start(display.const_label, false, false, 0)
vbox.pack_start(display.id_label, false, false, 0)
selection = treeview.selection
selection.mode = Gtk::SELECTION_SINGLE
selection.signal_connect('changed') do |s|
selection_changed(s)
end
end
def create_model
store = Gtk::ListStore.new(ItemInfo, String, String, String)
list_ids = Gtk::Stock.ids
list_ids.sort! do |a, b|
a.to_s <=> b.to_s
end
list_ids.each do |stock_id|
info = ItemInfo.new
info.id = stock_id
begin
info.item = Item.new(*Gtk::Stock.lookup(stock_id))
rescue ArgumentError
info.item = Item.new
end
# only show icons for stock IDs that have default icons
icon_set = Gtk::IconFactory.lookup_default(info.id.to_s)
if icon_set
# See what sizes this stock icon really exists at
sizes = icon_set.sizes
# Use menu size if it exists, otherwise first size found
size = sizes.find do |s| s == Gtk::IconSize::MENU end || sizes.first
info.small_icon = render_icon(info.id, size, '')
unless size == Gtk::IconSize::MENU
# Make the result the proper size for our thumbnail
w, h = Gtk::IconSize.lookup(size)
scaled = info.small_icon.scale(w, h, Gdk::Pixbuf::INTERP_BILINEAR)
info.small_icon = scaled
end
else
info.small_icon = nil
end
if info.item.keyval
info.accel_str = Gtk::Accelerator.to_name(info.item.keyval,
info.item.modifier)
else
info.accel_str = ''
end
info.const = id_to_const(info.id)
iter = store.append
iter[0] = info
iter[1] = info.id
end
return store
end
def selection_changed(selection)
treeview = selection.tree_view
display = treeview.display
iter = selection.selected
info = iter[0]
display.type_label.label = if info.small_icon and info.item.label
'Icon and Item'
elsif info.small_icon
'Icon Only'
elsif info.item.label
'Item Only'
else
'???????'
end
display.const_label.label = info.const
display.id_label.label = info.id
if info.item.label
str = "%s %s" % [info.item.label, info.accel_str]
display.label_accel_label.set_text(str, true)
else
display.label_accel_label.set_text('')
end
if info.small_icon
display.icon_image.set(info.id, get_largest_size(info.id))
else
display.icon_image.pixbuf = nil
end
end
def get_largest_size(symbol)
set = Gtk::IconFactory.lookup_default(symbol.id2name)
best_size = Gtk::IconSize::INVALID
best_pixels = 0
sizes = set.sizes
sizes.collect! do |i|
width, height = Gtk::IconSize.lookup(i)
[i, width * height]
end
return (sizes.max do |a, b| a[1] <=> b[1] end)[0]
end
def id_to_const(id)
const = ''
s = id.id2name
if s =~ /^gtk-/
const += 'Gtk::Stock::'
s[0,4] = ''
end
const += s.upcase.gsub(/-/, '_')
const
end
end
end
|