# HG changeset patch # User David Bryant # Date 1248842495 -34200 # Node ID f3d91579bb28509d9498f682f14b1bc24d45f684 # Parent 06c30d250c0a7db523b6a7dba07116c98f1a9f7a Checkpoint diff -r 06c30d250c0a -r f3d91579bb28 build.sh --- a/build.sh Thu Jul 16 00:12:02 2009 +0930 +++ b/build.sh Wed Jul 29 14:11:35 2009 +0930 @@ -6,8 +6,8 @@ doodle.d \ cairo/routines.d \ dia/grid_layer.d dia/icanvas.d dia/page_layer.d dia/standard_tools.d dia/tool.d dia/tool_layer.d \ - fig/layer.d \ - gtk/canvas.d gtk/conversions.d \ + fig/fig_layer.d fig/selection_layer.d \ + gtk/canvas.d gtk/conversions.d gtk/tool_bar.d \ tk/events.d tk/geometry.d tk/misc.d tk/types.d \ -I"${DMD_BASE}/include/d" \ -L-lgtkd -L-ldl diff -r 06c30d250c0a -r f3d91579bb28 dia/grid_layer.d --- a/dia/grid_layer.d Thu Jul 16 00:12:02 2009 +0930 +++ b/dia/grid_layer.d Wed Jul 29 14:11:35 2009 +0930 @@ -25,7 +25,7 @@ override void draw(in Viewport viewport, in Rectangle pixel_damage, scope Context pixel_cr, in Rectangle model_damage, scope Context model_cr) const { - double zoom = viewport.zoom; + //double zoom = viewport.zoom; //double start_x = modf(damage.min_corner.x, zoom); } diff -r 06c30d250c0a -r f3d91579bb28 dia/icanvas.d --- a/dia/icanvas.d Thu Jul 16 00:12:02 2009 +0930 +++ b/dia/icanvas.d Wed Jul 29 14:11:35 2009 +0930 @@ -6,12 +6,21 @@ import cairo.Context; } +private { + import std.typecons; +} + +mixin(defineEnum!("Cursor", + "DEFAULT", "HAND", "CROSSHAIR")); + interface Viewport { void zoom_relative(in Point pixel_datum, in double factor); void pan_relative(in Vector pixel_displacement); + void set_cursor(in Cursor cursor); void damage_model(in Rectangle area); // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only void damage_pixel(in Rectangle area); // FIXME as above + /* // FIXME not sure about these: double zoom() const; Point model_to_pixel(in Point model) const; @@ -22,6 +31,7 @@ Rectangle pixel_to_model(in Rectangle model) const; double model_to_pixel(in double model) const; double pixel_to_model(in double pixel) const; + */ } interface EventHandler { diff -r 06c30d250c0a -r f3d91579bb28 dia/standard_tools.d --- a/dia/standard_tools.d Thu Jul 16 00:12:02 2009 +0930 +++ b/dia/standard_tools.d Wed Jul 29 14:11:35 2009 +0930 @@ -94,6 +94,7 @@ if (event.button_name == ButtonName.LEFT) { mActive = true; mAnchorPoint = mCurrentPoint = event.pixel_point; + viewport.set_cursor(Cursor.HAND); return true; } else { @@ -105,6 +106,7 @@ if (event.button_name == ButtonName.LEFT && mActive) { mActive = false; viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0)); + viewport.set_cursor(Cursor.DEFAULT); return true; } else { diff -r 06c30d250c0a -r f3d91579bb28 doodle.d --- a/doodle.d Thu Jul 16 00:12:02 2009 +0930 +++ b/doodle.d Wed Jul 29 14:11:35 2009 +0930 @@ -1,13 +1,16 @@ module doodle; private { - import gtk.canvas; import dia.tool_layer; import dia.standard_tools; import dia.page_layer; + import gtk.canvas; + import gtk.toolbar; + import gtk.Main; import gtk.MainWindow; + import gtk.VBox; import std.stdio; } @@ -15,6 +18,9 @@ void main(string[] args) { Main.init(args); auto window = new MainWindow("Doodle"); + auto vbox = new VBox(false, 0); + auto tool_bar = new ToolBar; + vbox.packStart(tool_bar, false, false, 0); Tool[] tools; tools ~= new PanTool; tools ~= new ZoomTool; @@ -24,7 +30,8 @@ layers ~= new PageLayer("Page"); layers ~= tool_layer; auto canvas = new Canvas(layers, tool_layer, 120.0); - window.add(canvas); + vbox.packStart(canvas, true, true, 0); + window.add(vbox); window.setDefaultSize(380, 380); window.showAll(); Main.run(); diff -r 06c30d250c0a -r f3d91579bb28 fig/fig.d --- a/fig/fig.d Thu Jul 16 00:12:02 2009 +0930 +++ b/fig/fig.d Wed Jul 29 14:11:35 2009 +0930 @@ -1,5 +1,27 @@ module fig.fig; abstract class Fig { - abstract void draw(); + Rectangle bounds() const; + void draw(in Rectangle damage, scope Context cr) const; + + private { + } +} + +abstract class FigElement : Fig { +} + +class Connector { } + +class FigNode : FigElement { +} + +class FigEdge : FigElement { + private { + FigElement + } +} + +abstract class FigLeaf : Fig { +} diff -r 06c30d250c0a -r f3d91579bb28 fig/fig_layer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fig/fig_layer.d Wed Jul 29 14:11:35 2009 +0930 @@ -0,0 +1,24 @@ +module fig.fig_layer; + +public { + import dia.icanvas; +} + +class FigLayer : Layer { + this(in string name) { + super(name); + } + + override Rectangle bounds() const { + return Rectangle.DEFAULT; + } + + override void draw(in Viewport viewport, + in Rectangle pixel_damage, scope Context pixel_cr, + in Rectangle model_damage, scope Context model_cr) const { + } + + private { + //Fig[] mFigs; + } +} diff -r 06c30d250c0a -r f3d91579bb28 fig/layer.d --- a/fig/layer.d Thu Jul 16 00:12:02 2009 +0930 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -module fig.layer; - -public { - import dia.icanvas; -} - -class Layer : dia.icanvas.Layer { - this(in string name) { - super(name); - } - - override Rectangle bounds() const { - return Rectangle.DEFAULT; - } - - void draw(in Viewport viewport, - in Rectangle pixel_damage, scope Context pixel_cr, - in Rectangle model_damage, scope Context model_cr) const { - } - - private { - } -} diff -r 06c30d250c0a -r f3d91579bb28 fig/selection_layer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fig/selection_layer.d Wed Jul 29 14:11:35 2009 +0930 @@ -0,0 +1,22 @@ +module fig.selection_layer; + +/* +public { + import dia.icanvas; +} + +class SelectionLayer : Layer { + this(in string name) { + super(name); + } + + private { + // Selector[] mSelectors; + } +} + +abstract class Selector { + private { + } +} +*/ diff -r 06c30d250c0a -r f3d91579bb28 gtk/canvas.d --- a/gtk/canvas.d Thu Jul 16 00:12:02 2009 +0930 +++ b/gtk/canvas.d Wed Jul 29 14:11:35 2009 +0930 @@ -68,17 +68,17 @@ mVRuler.setMetric(MetricType.PIXELS); mDrawingArea = new DrawingArea; - mDrawingArea.addOnRealize(&onRealize); - mDrawingArea.addOnConfigure(&onConfigure); - mDrawingArea.addOnExpose(&onExpose); - mDrawingArea.addOnButtonPress(&onButtonPress); - mDrawingArea.addOnButtonRelease(&onButtonRelease); - mDrawingArea.addOnKeyPress(&onKeyEvent); - mDrawingArea.addOnKeyRelease(&onKeyEvent); - mDrawingArea.addOnMotionNotify(&onMotionNotify); - mDrawingArea.addOnScroll(&onScroll); - mDrawingArea.addOnEnterNotify(&onEnterNotify); - mDrawingArea.addOnLeaveNotify(&onLeaveNotify); + mDrawingArea.addOnRealize(&on_realize); + mDrawingArea.addOnConfigure(&on_configure); + mDrawingArea.addOnExpose(&on_expose); + mDrawingArea.addOnButtonPress(&on_button_press); + mDrawingArea.addOnButtonRelease(&on_button_release); + mDrawingArea.addOnKeyPress(&on_key_event); + mDrawingArea.addOnKeyRelease(&on_key_event); + mDrawingArea.addOnMotionNotify(&on_motion_notify); + mDrawingArea.addOnScroll(&on_scroll); + mDrawingArea.addOnEnterNotify(&on_enter_notify); + mDrawingArea.addOnLeaveNotify(&on_leave_notify); mDrawingArea.setEvents(EventMask.EXPOSURE_MASK | EventMask.POINTER_MOTION_MASK | EventMask.POINTER_MOTION_HINT_MASK | @@ -145,6 +145,24 @@ queueDraw; } + override void set_cursor(in Cursor cursor) { + CursorType cursor_type; + + switch (cursor) { + case Cursor.DEFAULT: + cursor_type = CursorType.ARROW; + break; + case Cursor.HAND: + cursor_type = CursorType.HAND1; + break; + case Cursor.CROSSHAIR: + cursor_type = CursorType.CROSSHAIR; + break; + } + + mDrawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type)); + } + override void damage_model(in Rectangle area) { mDamage = mDamage | model_to_pixel(area); } @@ -153,50 +171,9 @@ mDamage = mDamage | area; } - override double zoom() const { - return mZoom; - } - - override Point model_to_pixel(in Point model) const { - return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre); - } - - override Point pixel_to_model(in Point pixel) const { - return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom; - } - - override Vector model_to_pixel(in Vector model) const { - return mZoom * model; - } - - override Vector pixel_to_model(in Vector pixel) const { - return pixel / mZoom; - } - - override double model_to_pixel(in double model) const { - return mZoom * model; - } - - override double pixel_to_model(in double pixel) const { - return pixel / mZoom; - } - - override Rectangle model_to_pixel(in Rectangle model) const { - return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size)); - } - - override Rectangle pixel_to_model(in Rectangle model) const { - return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size)); - } - private { - void onRealize(Widget widget) { - assert(widget is mDrawingArea); - //writefln("Got realize\n"); - } - - bool onConfigure(GdkEventConfigure * event, Widget widget) { + bool on_configure(GdkEventConfigure * event, Widget widget) { assert(widget is mDrawingArea); if (!mHadConfigure) { @@ -230,7 +207,7 @@ return true; } - bool onExpose(GdkEventExpose * event, Widget widget) { + bool on_expose(GdkEventExpose * event, Widget widget) { assert(widget is mDrawingArea); Drawable dr = mDrawingArea.getWindow; @@ -294,7 +271,7 @@ return true; } - bool onButtonPress(GdkEventButton * event, Widget widget) { + bool on_button_press(GdkEventButton * event, Widget widget) { assert(widget is mDrawingArea); //writefln("Got button event\n"); @@ -314,7 +291,7 @@ return true; } - bool onButtonRelease(GdkEventButton * event, Widget widget) { + bool on_button_release(GdkEventButton * event, Widget widget) { assert(widget is mDrawingArea); //writefln("Got button event\n"); @@ -334,7 +311,7 @@ return true; } - bool onKeyEvent(GdkEventKey * event, Widget widget) { + bool on_key_event(GdkEventKey * event, Widget widget) { assert(widget is mDrawingArea); //writefln("Got key event\n"); @@ -346,7 +323,7 @@ return true; } - bool onMotionNotify(GdkEventMotion * event, Widget widget) { + bool on_motion_notify(GdkEventMotion * event, Widget widget) { assert(widget is mDrawingArea); //writefln("Got motion notify\n"); gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event); @@ -366,7 +343,7 @@ return true; } - bool onScroll(GdkEventScroll * event, Widget widget) { + bool on_scroll(GdkEventScroll * event, Widget widget) { assert(widget is mDrawingArea); //writefln("Got scroll\n"); @@ -412,15 +389,17 @@ } */ - bool onEnterNotify(GdkEventCrossing * event, Widget widget) { + bool on_enter_notify(GdkEventCrossing * event, Widget widget) { assert(widget is mDrawingArea); - writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); + //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); + // TODO return true; } - bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { + bool on_leave_notify(GdkEventCrossing * event, Widget widget) { assert(widget is mDrawingArea); - writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); + //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); + // TODO return true; } @@ -505,11 +484,7 @@ //writefln("Damage: %s", mDamage); int x, y, w, h; mDamage.get_quantised(x, y, w, h); - //writefln("Quantised damage: %d %d %d %d", x, y, w, h); - y = cast(int)mViewSize.y - (y + h); // Flip vertical axis - //writefln("Flipped Quantised damage: %d %d %d %d", x, y, w, h); - mDrawingArea.queueDrawArea(x, y, w, h); - //mDrawingArea.queueDraw(); + mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - (y + h), w, h); mDamage = Rectangle.DEFAULT; } else { @@ -519,6 +494,35 @@ double clamp_zoom(in double zoom) { return clamp(zoom, 0.2, 10.0); } + Point model_to_pixel(in Point model) const { + return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre); + } + + Point pixel_to_model(in Point pixel) const { + return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom; + } + + Vector model_to_pixel(in Vector model) const { + return mZoom * model; + } + + Vector pixel_to_model(in Vector pixel) const { + return pixel / mZoom; + } + + Rectangle model_to_pixel(in Rectangle model) const { + return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size)); + } + + Rectangle pixel_to_model(in Rectangle model) const { + return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size)); + } + + void on_realize(Widget widget) { + assert(widget is mDrawingArea); + //writefln("Got realize\n"); + } + bool mHadConfigure; Rectangle mDamage; // pixels diff -r 06c30d250c0a -r f3d91579bb28 gtk/tool_bar.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/tool_bar.d Wed Jul 29 14:11:35 2009 +0930 @@ -0,0 +1,63 @@ +module gtk.toolbar; + +public { + import gtk.Toolbar; +} + +private { + import gtk.ToolButton; + import gtk.SeparatorToolItem; + import gtk.RadioToolButton; + import gtk.Image; + + import glib.ListSG; + + import std.stdio; +} + +class ToolBar : Toolbar { + this() { + // INVALID, MENU, SMALL_TOOLBAR, LARGE_TOOLBAR, + // BUTTON, DND, DIALOG + setIconSize(GtkIconSize.LARGE_TOOLBAR); + // ICONS, TEXT, BOTH, BOTH_HORIZ + setStyle(GtkToolbarStyle.ICONS); + // HORIZONTAL, VERTICAL + setOrientation(GtkOrientation.HORIZONTAL); + setTooltips(true); + + Image image; + ListSG group; + + image = new Image("icons/select.svg"); + button1 = new RadioToolButton(group); + button1.setLabelWidget(image); + insert(button1); + + image = new Image("icons/select.png"); + button2 = new RadioToolButton(group); + button2.setGroup(button1.getGroup); + button2.setLabelWidget(image); + button2.addOnClicked(&on_clicked); + insert(button2); + + insert(new SeparatorToolItem); + + image = new Image("icons/select.png"); + button3 = new RadioToolButton(group); + button3.setGroup(button1.getGroup); + button3.setLabelWidget(image); + insert(button3); + } + + private { + + void on_clicked(ToolButton tool_button) { + writefln("Clicked!"); + } + + RadioToolButton button1; + RadioToolButton button2; + RadioToolButton button3; + } +} diff -r 06c30d250c0a -r f3d91579bb28 gtk/zoom_controls.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/zoom_controls.d Wed Jul 29 14:11:35 2009 +0930 @@ -0,0 +1,20 @@ +module gtk.zoom_controls; + +public { + import gtk.HBox; +} + +private { +} + +// Useful actions +// Zoom to fit contents, Zoom 1:1, zoom in/out (coarse/fine) +// Manually specified zoom? + +class ZoomControls : HBox { + this() { + } + + private { + } +} diff -r 06c30d250c0a -r f3d91579bb28 icons/select.png Binary file icons/select.png has changed diff -r 06c30d250c0a -r f3d91579bb28 icons/select.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/icons/select.svg Wed Jul 29 14:11:35 2009 +0930 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + +