class Demo::StockBrowser

Constants

Item
ItemDisplay
ItemInfo

Public Class Methods

new() click to toggle source
Calls superclass method Demo::BasicWindow.new
# File gtk2/sample/gtk-demo/stock_browser.rb, line 27
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

Public Instance Methods

create_model() click to toggle source
# File gtk2/sample/gtk-demo/stock_browser.rb, line 117
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, GdkPixbuf::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
get_largest_size(symbol) click to toggle source
# File gtk2/sample/gtk-demo/stock_browser.rb, line 208
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
id_to_const(id) click to toggle source
# File gtk2/sample/gtk-demo/stock_browser.rb, line 221
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
selection_changed(selection) click to toggle source
# File gtk2/sample/gtk-demo/stock_browser.rb, line 175
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