Files
php-gtk-src/demos/components/scribble.php

134 lines
3.6 KiB
PHP

<?php
/**
* Scribble demo - simple painting with your mouse
*/
class Scribble extends GtkWindow
{
protected $size_group = null;
protected $pixmap = null;
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, -1);
$this->set_border_width(8);
$this->add($this->__create_box());
$this->show_all();
}//function __construct($parent = null)
function __create_box()
{
$vbox = new GtkVBox();
$vbox->show();
$drawing_area = new GtkDrawingArea();
$drawing_area->set_size_request(300, 300);
$vbox->pack_start($drawing_area);
// $drawing_area->realize();
$drawing_area->connect('expose_event' , array($this, 'expose_event'));
$drawing_area->connect('configure_event' , array($this, 'configure_event'));
$drawing_area->connect('motion_notify_event', array($this, 'motion_notify_event'));
$drawing_area->connect('button_press_event' , array($this, 'button_press_event'));
$drawing_area->set_events(Gdk::EXPOSURE_MASK
| Gdk::LEAVE_NOTIFY_MASK
| Gdk::BUTTON_PRESS_MASK
| Gdk::POINTER_MOTION_MASK
| Gdk::POINTER_MOTION_HINT_MASK);
return $vbox;
}//function __create_box()
function configure_event($widget, $event)
{
$this->pixmap = new GdkPixmap($widget->window,
$widget->allocation->width,
$widget->allocation->height,
-1);
$this->pixmap->draw_rectangle($widget->style->white_gc,
true, 0, 0,
$widget->allocation->width,
$widget->allocation->height);
return true;
}
function expose_event($widget, $event)
{
$widget->window->draw_drawable($widget->style->fg_gc[$widget->state],
$this->pixmap,
$event->area->x, $event->area->y,
$event->area->x, $event->area->y,
$event->area->width, $event->area->height);
return false;
}
function button_press_event($widget, $event)
{
if ($event->button == 1 && $this->pixmap) {
$this->draw_brush($widget, (int)$event->x, (int)$event->y);
}
return true;
}
function motion_notify_event($widget, $event)
{
$window = $event->window;
$pointer = $window->get_pointer();
$x = $pointer[0];
$y = $pointer[1];
$state = $pointer[2];
if (($state & Gdk::BUTTON1_MASK) && $this->pixmap) {
$this->draw_brush($widget, $x, $y);
}
return true;
}
function draw_brush($widget, $x, $y)
{
$this->pixmap->draw_arc($widget->style->black_gc, true, $x - 4, $y - 4, 8, 8, 0, 64 * 360);
$widget->queue_draw_area($x - 4, $y - 4, 8, 8);
}
}//class Scribble extends GtkWindow
$GLOBALS['class'] = 'Scribble';
$GLOBALS['description'] = "Scribble lets you draw paintings with your mouse";
if (!@$GLOBALS['framework']) {
new Scribble();
Gtk::main();
}
?>