Mercurial > projects > doodle
changeset 72:5cc2de64f6d0
Cautious Saturday night commits
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 15 Aug 2010 00:30:03 +0930 |
parents | 0f7cf6c6f206 |
children | 6f2525e170f2 |
files | doodle/gtk/canvas.d doodle/tk/events.d doodle/tk/pixel_model.d |
diffstat | 3 files changed, 28 insertions(+), 78 deletions(-) [+] |
line wrap: on
line diff
--- a/doodle/gtk/canvas.d Sat Aug 14 20:48:41 2010 +0930 +++ b/doodle/gtk/canvas.d Sun Aug 15 00:30:03 2010 +0930 @@ -2,7 +2,7 @@ public { import doodle.dia.icanvas; - import doodle.tk.events; + import doodle.gtk.events; } private { @@ -33,8 +33,6 @@ import std.math; import std.stdio; - - import core.stdc.string : strlen; } final class Canvas : Table, private IViewport { @@ -138,8 +136,8 @@ // IViewport overrides: - void zoomRelative(in Point pixelDatum, in double factor) { - _pixelModel.zoomRelative(factor, pixelDatum); + void zoomRelative(in Point screenDatum, in double factor) { + _pixelModel.zoomRelative(factor, screenDatum); consolidateBounds; @@ -149,8 +147,8 @@ queueDraw; } - void panRelative(in Vector pixelDisplacement) { - _pixelModel.panRelativePixel(pixelDisplacement); + void panRelative(in Vector screenDisplacement) { + _pixelModel.panRelativePixel(screenDisplacement); consolidateBounds; @@ -304,59 +302,22 @@ bool onButtonPress(GdkEventButton * event, Widget widget) { assert(widget is _drawingArea); - //trace("Got button event\n"); - Point pixelPoint = Point(event.x + 0.5, _pixelModel.viewBounds.h - (event.y + 0.5)); - Point modelPoint = _pixelModel.pixelToModel(pixelPoint); - - auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), - gtk2tkButtonName(event.button), - pixelPoint, - modelPoint, - gtk2tkMask(event.state)); - + auto buttonEvent = makeButtonEvent(event, _pixelModel); _eventHandler.handleButtonPress(this, buttonEvent); - fixDamage; - return true; } bool onButtonRelease(GdkEventButton * event, Widget widget) { assert(widget is _drawingArea); - Point pixelPoint = Point(event.x + 0.5, _pixelModel.viewBounds.h - (event.y + 0.5)); - Point modelPoint = _pixelModel.pixelToModel(pixelPoint); - - auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), - gtk2tkButtonName(event.button), - pixelPoint, - modelPoint, - gtk2tkMask(event.state)); - + auto buttonEvent = makeButtonEvent(event, _pixelModel); _eventHandler.handleButtonRelease(this, buttonEvent); - fixDamage; - return true; } - /* - public struct GdkEventKey { - GdkEventType type; - GdkWindow *window; - byte sendEvent; - uint time; - uint state; - uint keyval; - int length; - char *string; - ushort hardwareKeycode; - ubyte group; - uint bitfield0; - uint isModifier : 1; - } - */ bool onKeyPressEvent(GdkEventKey * event, Widget widget) { assert(widget is _drawingArea); @@ -387,18 +348,11 @@ bool onMotionNotify(GdkEventMotion * event, Widget widget) { assert(widget is _drawingArea); - //writefln("Got motion notify\n"); + // Pass the events on to the rulers gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event); gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event); - Point pixelPoint = Point(event.x + 0.5, _pixelModel.viewBounds.h - (event.y + 0.5)); - Point modelPoint = _pixelModel.pixelToModel(pixelPoint); - - auto motionEvent = new MotionEvent(pixelPoint, - modelPoint, - gtk2tkMask(event.state)); - - _eventHandler.handleMotion(this, motionEvent); + _eventHandler.handleMotion(this, makeMotionEvent(event, _pixelModel)); fixDamage;
--- a/doodle/tk/events.d Sat Aug 14 20:48:41 2010 +0930 +++ b/doodle/tk/events.d Sun Aug 15 00:30:03 2010 +0930 @@ -2,6 +2,8 @@ public { import doodle.tk.geometry; + import doodle.tk.pixel_model; + import gtkc.gdktypes; } private {
--- a/doodle/tk/pixel_model.d Sat Aug 14 20:48:41 2010 +0930 +++ b/doodle/tk/pixel_model.d Sun Aug 15 00:30:03 2010 +0930 @@ -18,20 +18,19 @@ class PixelModel { this(in double zoom, in Rectangle canvasBounds, in Rectangle viewBounds) { _zoom = zoom; - _viewBounds = viewBounds; - _canvasBounds = canvasBounds; + _viewBoundsScreen = viewBounds; + _canvasBoundsModel = canvasBounds; // Choose the centre of the canvas as the centre of the view - _viewCentre = _canvasBounds.centre; + _viewCentreModel = _canvasBoundsModel.centre; } void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { - Rectangle r = pixelToModel(_viewBounds); - _canvasBounds = r | requiredCanvasBounds; + _canvasBoundsModel = pixelToModel(_viewBoundsScreen) | requiredCanvasBounds; } void canvasAccommodate(in Rectangle bounds) { - _canvasBounds = _canvasBounds | bounds; + _canvasBoundsModel = _canvasBoundsModel | bounds; } void zoomRelative(in double factor, in Point pixelDatum) { @@ -40,28 +39,23 @@ // pixel distance the same Point oldModelDatum = pixelToModel(pixelDatum); - Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre); + Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentreModel); _zoom = clampZoom(zoom * factor); - _viewCentre = oldModelDatum - pixelToModel(pixelDistance); + _viewCentreModel = oldModelDatum - pixelToModel(pixelDistance); } - void panRelativePixel(in Vector pixelDisplacement) { - _viewCentre = _viewCentre + pixelToModel(pixelDisplacement); - } - - void panRelativeModel(in Vector modelDisplacement) { - _viewCentre = _viewCentre + modelDisplacement; - } + void panRelativePixel(in Vector pixelDisplacement) { _viewCentreModel = _viewCentreModel + pixelToModel(pixelDisplacement); } + void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } // For normalZoom 1.0 -> 100% means the presentation on the screen is // one-to-one with real-life double normalZoom(in double pixelsPerMillimetre) const { return _zoom / pixelsPerMillimetre; } double zoom() const { return _zoom; } - Rectangle viewBounds() const { return _viewBounds; } - Rectangle canvasBounds() const { return _canvasBounds; } + Rectangle viewBounds() const { return _viewBoundsScreen; } + Rectangle canvasBounds() const { return _canvasBoundsModel; } - Point modelToPixel(in Point model) const { return _viewBounds.centre + _zoom * (model - _viewCentre); } - Point pixelToModel(in Point pixel) const { return _viewCentre + (pixel - _viewBounds.centre) / _zoom; } + Point modelToPixel(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } + Point pixelToModel(in Point pixel) const { return _viewCentreModel + (pixel - _viewBoundsScreen.centre) / _zoom; } Vector modelToPixel(in Vector model) const { return _zoom * model; } Vector pixelToModel(in Vector pixel) const { return pixel / _zoom; } Rectangle modelToPixel(in Rectangle model) const { return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); } @@ -72,9 +66,9 @@ // Screen units are pixels // Model units are millimetres - double _zoom; // pixels-per-millimetre - Rectangle _viewBounds; // pixel: bounds of the viewport in pixels - Point _viewCentre; // model: where in the model is the centre of our view - Rectangle _canvasBounds; // model: the bounds of the canvas in millimetres + double _zoom; // pixels-per-millimetre + Rectangle _viewBoundsScreen; // bounds of the viewport in pixels + Point _viewCentreModel; // where in the model is the centre of our view + Rectangle _canvasBoundsModel; // the bounds of the canvas in millimetres } }