mirror of
https://github.com/php/php-gtk-src.git
synced 2026-04-26 18:28:02 +02:00
277 lines
7.3 KiB
PHP
277 lines
7.3 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This really is not a recommended way to load the PHP-GTK, but it will suffice
|
|
* for the demo purposes.
|
|
*/
|
|
if( !class_exists('gtk')) {
|
|
die('Please load the php-gtk2 module in your php.ini' . "\r\n");
|
|
}
|
|
|
|
class StockItemInfo {
|
|
public $stock_id = '';
|
|
public $stock_item = null;
|
|
public $small_icon = null;
|
|
public $constant = '';
|
|
public $accel_str = '';
|
|
|
|
function __construct($stock_id = null) {
|
|
$this->stock_id = $stock_id;
|
|
if ($stock_id) {
|
|
$this->constant = id_to_constant($stock_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
class StockItemDisplay {
|
|
public $type_label;
|
|
public $constant_label;
|
|
public $id_label;
|
|
public $accel_label;
|
|
public $icon_image;
|
|
}
|
|
|
|
class StockItemBrowserDemo extends GtkWindow {
|
|
function __construct($parent = null)
|
|
{
|
|
parent::__construct();
|
|
|
|
if (@$GLOBALS['framework']) {
|
|
return;
|
|
}
|
|
|
|
if ($parent)
|
|
$this->set_screen($parent->get_screen());
|
|
else
|
|
$this->connect_simple('destroy', array('gtk', 'main_quit'));
|
|
|
|
$this->set_title(__CLASS__);
|
|
$this->set_position(Gtk::WIN_POS_CENTER);
|
|
$this->set_default_size(-1, 500);
|
|
$this->set_border_width(8);
|
|
|
|
$this->add($this->__create_box());
|
|
$this->show_all();
|
|
}
|
|
|
|
function __create_box()
|
|
{
|
|
$hbox = new GtkHBox(false, 8);
|
|
|
|
$scrolled = new GtkScrolledWindow();
|
|
$scrolled->set_shadow_type(Gtk::SHADOW_ETCHED_IN);
|
|
$scrolled->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
|
|
$hbox->pack_start($scrolled, false, false, 0);
|
|
|
|
$model = $this->create_model();
|
|
$treeview = new GtkTreeView($model);
|
|
$scrolled->add($treeview);
|
|
|
|
$column = new GtkTreeViewColumn();
|
|
$column->set_title('Icon and Constant');
|
|
|
|
$cell_renderer = new GtkCellRendererPixbuf();
|
|
$column->pack_start($cell_renderer, false);
|
|
$column->set_attributes($cell_renderer, 'stock-id', 1);
|
|
|
|
$cell_renderer = new GtkCellRendererText();
|
|
$column->pack_start($cell_renderer, true);
|
|
$column->set_cell_data_func($cell_renderer, 'constant_setter');
|
|
|
|
$treeview->append_column($column);
|
|
|
|
$cell_renderer = new GtkCellRendererText();
|
|
$treeview->insert_column_with_data_func(-1, 'Label', $cell_renderer, 'label_setter');
|
|
|
|
$cell_renderer = new GtkCellRendererText();
|
|
$treeview->insert_column_with_data_func(-1, 'Accelerator', $cell_renderer, 'accel_setter');
|
|
|
|
$cell_renderer = new GtkCellRendererText();
|
|
$treeview->insert_column_with_data_func(-1, 'ID', $cell_renderer, 'id_setter');
|
|
|
|
$align = new GtkAlignment(0.5, 0, 0, 0);
|
|
$hbox->pack_end($align, true, true, 0);
|
|
|
|
$frame = new GtkFrame('Selection Info');
|
|
$align->add($frame);
|
|
|
|
$vbox = new GtkVBox(false, 8);
|
|
$vbox->set_border_width(4);
|
|
$frame->add($vbox);
|
|
|
|
$display = new StockItemDisplay();
|
|
$treeview->set_data('stock-display', $display);
|
|
|
|
$display->type_label = new GtkLabel();
|
|
$display->constant_label = new GtkLabel();
|
|
$display->id_label = new GtkLabel();
|
|
$display->accel_label = new GtkLabel();
|
|
$display->icon_image = new GtkImage();
|
|
|
|
$vbox->pack_start($display->type_label, false, false, 0);
|
|
$vbox->pack_start($display->icon_image, false, false, 0);
|
|
$vbox->pack_start($display->accel_label, false, false, 0);
|
|
$vbox->pack_start($display->constant_label, false, false, 0);
|
|
$vbox->pack_start($display->id_label, false, false, 0);
|
|
|
|
$selection = $treeview->get_selection();
|
|
$selection->set_mode(Gtk::SELECTION_SINGLE);
|
|
|
|
$selection->connect('changed', array($this, 'on_selection_changed'));
|
|
|
|
|
|
return $hbox;
|
|
}
|
|
|
|
private function create_model()
|
|
{
|
|
$store = new GtkListStore(GObject::TYPE_PHP_VALUE, GObject::TYPE_STRING);
|
|
|
|
$ids = Gtk::stock_list_ids();
|
|
sort($ids);
|
|
|
|
foreach ($ids as $id) {
|
|
$info = new StockItemInfo($id);
|
|
$stock_item = Gtk::stock_lookup($id);
|
|
if ($stock_item)
|
|
$info->stock_item = $stock_item;
|
|
else
|
|
$info->stock_item = array('', '', 0, 0, '');
|
|
|
|
$icon_set = GtkIconFactory::lookup_default($id);
|
|
if ($icon_set) {
|
|
$sizes = $icon_set->get_sizes();
|
|
$size = $sizes[0];
|
|
for ($i = 0; $i < count($sizes); $i++) {
|
|
if ($sizes[$i] == Gtk::ICON_SIZE_MENU) {
|
|
$size = Gtk::ICON_SIZE_MENU;
|
|
break;
|
|
}
|
|
}
|
|
$info->small_icon = $this->render_icon($info->stock_id, $size);
|
|
if ($size != Gtk::ICON_SIZE_MENU) {
|
|
list($width, $height) = Gtk::icon_size_lookup(Gtk::ICON_SIZE_MENU);
|
|
|
|
$info->small_icon = $info->small_icon->scale_simple($width, $height, 'bilinear');
|
|
}
|
|
|
|
} else {
|
|
$info->small_icon = null;
|
|
}
|
|
|
|
if ($info->stock_item[3] == 0) {
|
|
$info->accel_str = '';
|
|
} else {
|
|
$info->accel_str = '<'.Gtk::accelerator_get_label($info->stock_item[3], $info->stock_item[2]).'>';
|
|
}
|
|
|
|
$iter = $store->append();
|
|
$store->set($iter, 0, $info, 1, $id);
|
|
}
|
|
|
|
return $store;
|
|
}
|
|
|
|
function on_selection_changed($selection)
|
|
{
|
|
$treeview = $selection->get_tree_view();
|
|
$display = $treeview->get_data('stock-display');
|
|
|
|
list($model, $iter) = $selection->get_selected();
|
|
if ($iter) {
|
|
$info = $model->get_value($iter, 0);
|
|
|
|
if ($info->small_icon && $info->stock_item[1])
|
|
$display->type_label->set_text('Item and Icon');
|
|
else if ($info->small_icon)
|
|
$display->type_label->set_text('Icon Only');
|
|
else if ($info->stock_item[1])
|
|
$display->type_label->set_text('Item Only');
|
|
else
|
|
$display->type_label->set_text('<unknown>');
|
|
|
|
$display->constant_label->set_text($info->constant);
|
|
$display->id_label->set_text($info->stock_id);
|
|
|
|
if ($info->stock_item[1])
|
|
$display->accel_label->set_text_with_mnemonic($info->stock_item[1].' '.$info->accel_str);
|
|
else
|
|
$display->accel_label->set_text('');
|
|
|
|
if ($info->small_icon)
|
|
$display->icon_image->set_from_stock($info->stock_id, get_largest_size($info->stock_id));
|
|
else
|
|
$display->icon_image->set_from_pixbuf(null);
|
|
} else {
|
|
$display->type_label->set_text('No Selected Item');
|
|
$display->icon_image->set_from_pixbuf(null);
|
|
$display->constant_label->set_text('');
|
|
$display->id_label->set_text('');
|
|
$display->accel_label->set_text('');
|
|
}
|
|
}
|
|
}
|
|
|
|
function id_to_constant($id)
|
|
{
|
|
if (substr($id, 0, 3) == 'gtk') {
|
|
$constant = 'Gtk::STOCK' . preg_replace('!-([^-]+)!e', '"_".strtoupper("$1")', substr($id, 3));
|
|
} else {
|
|
$constant = substr(preg_replace('!([^-]+)-?!e', 'strtoupper($1)', $id), 1);
|
|
}
|
|
|
|
return $constant;
|
|
}
|
|
|
|
function get_largest_size($id)
|
|
{
|
|
$icon_set = GtkIconFactory::lookup_default($id);
|
|
$best_size = Gtk::ICON_SIZE_INVALID;
|
|
$best_pixels = 0;
|
|
|
|
$sizes = $icon_set->get_sizes();
|
|
foreach ($sizes as $size) {
|
|
list($w, $h) = Gtk::icon_size_lookup($size);
|
|
if ($w * $h > $best_pixels) {
|
|
$best_size = $size;
|
|
$best_pixels = $w * $h;
|
|
}
|
|
}
|
|
|
|
return $best_size;
|
|
}
|
|
|
|
function constant_setter($column, $cell, $model, $iter)
|
|
{
|
|
$info = $model->get_value($iter, 0);
|
|
$cell->set_property('text', $info->constant);
|
|
}
|
|
|
|
function label_setter($column, $cell, $model, $iter)
|
|
{
|
|
$info = $model->get_value($iter, 0);
|
|
$cell->set_property('text', $info->stock_item[1]);
|
|
}
|
|
|
|
function accel_setter($column, $cell, $model, $iter)
|
|
{
|
|
$info = $model->get_value($iter, 0);
|
|
$cell->set_property('text', $info->accel_str);
|
|
}
|
|
|
|
function id_setter($column, $cell, $model, $iter)
|
|
{
|
|
$info = $model->get_value($iter, 0);
|
|
$cell->set_property('text', $info->stock_id);
|
|
}
|
|
|
|
|
|
$GLOBALS['class'] = 'StockItemBrowserDemo';
|
|
$GLOBALS['description'] = '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.';
|
|
|
|
if (!@$GLOBALS['framework']) {
|
|
new StockItemBrowserDemo();
|
|
Gtk::main();
|
|
}
|
|
?>
|