LMPX.COM |
Home | Linux | Mysql | PHP | XML | ||
|
|
|||
From: Elizabeth Marie Smith Date: Thu Jul 31 09:05:03 2008 Subject: cvs: php-gtk /demos/examples cairo_support.php
auroraeosrose Thu Jul 31 15:05:03 2008 UTC
Modified files:
/php-gtk/demos/examples cairo_support.php
Log:
Cairo example complete - ticking clock in PHP-GTK
http://cvs.php.net/viewvc.cgi/php-gtk/demos/examples/cairo_support.php?r1=1.1&r2=1.2&diff_format=u
Index: php-gtk/demos/examples/cairo_support.php
diff -u php-gtk/demos/examples/cairo_support.php:1.1 php-gtk/demos/examples/cairo_support.php:1.2
--- php-gtk/demos/examples/cairo_support.php:1.1 Thu Jul 31 01:52:19 2008
+++ php-gtk/demos/examples/cairo_support.php Thu Jul 31 15:05:03 2008
@@ -1,27 +1,186 @@
<?php
class Clock extends GtkDrawingArea {
- protected $context;
+ public $__gsignals = array(
+ 'time_changed' => array(
+ GObject::SIGNAL_RUN_FIRST, GObject::TYPE_NONE,
+ array(GObject::TYPE_LONG, GObject::TYPE_LONG)
+ ),
+ );
+
+ private $time;
+ private $minute_offset = 0;
+ private $dragging = false;
public function __construct() {
parent::__construct();
- $this->connect_simple('expose-event', array($this, 'expose'));
+ $this->connect('expose-event', array($this, 'expose'));
+ $this->connect('button-press-event', array($this, 'button_press'));
+ $this->connect('button-release-event', array($this, 'button_release'));
+ $this->connect('motion-notify-event', array($this, 'motion_notify'));
+
+ $this->add_events(Gdk::BUTTON_PRESS_MASK |
+ Gdk::BUTTON_RELEASE_MASK |
+ Gdk::POINTER_MOTION_MASK);
+
+ $this->update();
+ Gtk::timeout_add(1000, array($this, 'update'));
+ }
+
+ public function expose($widget, $event) {
+ $context = $this->window->cairo_create();
+ $context->rectangle($event->area->x, $event->area->y,
+ $event->area->width, $event->area->height);
+ $context->clip();
+ $this->draw($context);
+ }
+
+ public function update() {
+ $this->time = getdate();
+ $this->redraw_canvas();
+ return true;
+ }
+
+ protected function redraw_canvas() {
+ if($this->window) {
+ $alloc = $this->get_allocation();
+ $rect = new GdkRectangle($alloc->x, $alloc->y, $alloc->width, $alloc->height);
+ $this->window->invalidate_rect($rect, true);
+ $this->queue_draw_area($alloc->x, $alloc->y, $alloc->width, $alloc->height);
+ $this->window->process_updates(true);
+ }
+ }
+
+ public function motion_notify($widget, $event) {
+ if($this->dragging) {
+ $x =$event->x - ($this->get_allocation()->width / 2);
+ $y = $event->y - ($this->get_allocation()->height / 2);
+
+ $phi = atan2($x, -$y);
+ if($phi < 0) {
+ $phi += pi() * 2;
+ }
+
+ $hour = $this->time['hours'];
+ $minute = $phi * 30 / pi();
+
+ $this->minute_offset = $minute - $this->time['minutes'];
+ $this->redraw_canvas();
+ $this->emit('time_changed', $hour, $minute);
+ }
+ }
+
+ public function button_press($widget, $event) {
+ $minutes = $this->time['minutes'] + $this->minute_offset;
+
+ $px = $event->x - $widget->get_allocation()->width / 2;
+ $py = $widget->get_allocation()->height / 2 - $event->y;
+ $lx = sin(pi() / 30 * $minutes);
+ $ly = cos(pi() / 30 * $minutes);
+ $u = $lx * $px + $ly * $py;
+
+ if ($u < 0)
+ return;
+
+ $d2 = pow($px - $u * $lx, 2) + pow($py - $u * $ly, 2);
+
+ if(d2 < 25) {
+ $this->dragging = true;
+ echo "got minute hand\n";
+ }
}
- public function expose() {
- $this->realize();
- $this->context = $this->window->cairo_create();
- var_dump($this->context);
- //$this->context->rectangle(1,1,50,50);
- //$this->context->stroke();
+ public function button_release($widget, $event) {
+ if($this->dragging) {
+ $this->motion_notify($widget, $event);
+ $this->dragging = false;
+ }
}
+
+ public function draw($context) {
+ $rect = $this->get_allocation();
+
+ $x = $rect->x + $rect->width / 2.0;
+ $y = $rect->y + $rect->height / 2.0;
+ $radius = min($rect->width / 2.0, $rect->height / 2.0) - 5;
+
+ // clock background
+ $context->arc($x, $y, $radius, 0, 2.0 * pi());
+ $context->setSourceRgb(1, 1, 1);
+ $context->fillPreserve();
+ $context->setSourceRgb(0, 0, 0);
+ $context->stroke();
+
+ // clock ticks
+ foreach(range(1, 12) as $i) {
+ $context->save();
+
+ if($i % 3 == 0) {
+ $inset = 0.2 * $radius;
+ } else {
+ $inset = 0.1 * $radius;
+ $context->setLineWidth(0.5 * $context->getLineWidth());
+ }
+
+ $context->moveTo($x + ($radius - $inset) * cos($i * pi() / 6.0),
+ $y + ($radius - $inset) * sin($i * pi() / 6.0));
+ $context->lineTo($x + $radius * cos($i * pi() / 6.0),
+ $y + $radius * sin($i * pi() / 6.0));
+ $context->stroke();
+ $context->restore();
+ }
+
+ // clock hands
+ $hours = $this->time['hours'];
+ $minutes = $this->time['minutes'] + $this->minute_offset;
+ $seconds = $this->time['seconds'];
+
+ // hour hand
+ //the hour hand is rotated 30 degrees (pi/6 r) per hour + 1/2 a degree (pi/360) per minute
+ $context->save();
+ $context->setLineWidth(2.5 * $context->getLineWidth());
+ $context->moveTo($x, $y);
+ $context->lineTo($x + $radius / 2 * sin(
+ pi() / 6 * $hours + pi() / 360 * $minutes),
+ $y + $radius / 2 * - cos(
+ pi() / 6 * $hours + pi() / 360 * $minutes));
+ $context->stroke();
+ $context->restore();
+
+ // minute hand
+ // the minute hand is rotated 6 degrees (pi/30 r) per minute
+ $context->moveTo($x, $y);
+ $context->lineTo($x + $radius * 0.75 * sin(pi() / 30 * $minutes),
+ $y + $radius * 0.75 * - cos(pi() / 30 * $minutes));
+ $context->stroke();
+
+ // seconds hand
+ $context->save();
+ $context->setSourceRgb(1, 0, 0); // red
+ $context->moveTo($x, $y);
+ $context->lineTo($x + $radius * 0.7 * sin(pi() / 30 * $seconds),
+ $y + $radius * 0.7 * - cos(pi() / 30 * $seconds));
+ $context->stroke();
+ $context->restore();
+ }
+
+}
+Gobject::register_type('Clock');
+
+function time_changed_cb($widget, $hours, $minutes) {
+ echo "time-changed - $hours:$minutes\n";
}
$window = new GtkWindow();
$clock = new Clock();
$window->add($clock);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
+$clock->connect('time_changed', 'time_changed_cb');
$window->show_all();
Gtk::main();
-?>
\ No newline at end of file
+?>
+
+
+
+
| Navigate in group php.gtk.cvs at sever news.php.net | |
| Previous | Next |
| © No Copyright You are free to use Anything |
Site Maintained by PHP Developer
Powered By PHP Consultants |