236 lines
5.9 KiB
Ruby
236 lines
5.9 KiB
Ruby
|
# 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
|