Mercurial > projects > doodle
changeset 58:c63719604adb
Beginnings of creating a rectangle...
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Mon, 09 Aug 2010 21:43:24 +0930 |
parents | 9960c4fbd0dd |
children | 860e18c87255 |
files | doodle/core/logging.d doodle/dia/grid_layer.d doodle/dia/icanvas.d doodle/dia/page_layer.d doodle/dia/standard_tools.d doodle/dia/tool.d doodle/dia/tool_layer.d doodle/fig/diagram_elements.d doodle/fig/diagram_layer.d doodle/fig/tools.d doodle/gtk/canvas.d doodle/main/prog/doodler.d doodle/tk/events.d |
diffstat | 13 files changed, 200 insertions(+), 104 deletions(-) [+] |
line wrap: on
line diff
--- a/doodle/core/logging.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/core/logging.d Mon Aug 09 21:43:24 2010 +0930 @@ -3,26 +3,50 @@ private { import std.stdio; import std.typecons; + import std.traits; } public { - void trace(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.TRACE, std.string.format("%s(%d): TRACE: %s", right(file, 20), line, message)); + void trace(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.TRACE, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); } - void info(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.INFO, std.string.format("%s(%d): INFO: %s", right(file, 20), line, message)); + + void info(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.INFO, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); } - void message(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.MESSAGE, std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, message)); + + void message(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.MESSAGE, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); } - void warning(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.WARNING, std.string.format("%s(%d): WARNING: %s", right(file, 20), line, message)); + + void warning(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.WARNING, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); } - void error(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.ERROR, std.string.format("%s(%d): ERROR: %s", right(file, 20), line, message)); + + void error(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.ERROR, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); } - void fatal(string file = __FILE__, int line = __LINE__)(in string message) { - log(Severity.FATAL, std.string.format("%s(%d): FATAL: %s", right(file, 20), line, message)); + + void fatal(string file = __FILE__, int line = __LINE__, S...)(S args) { + static assert(S.length > 0); + static assert(isSomeString!(S[0])); + log(Severity.FATAL, + std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args))); assert(0); } } @@ -52,9 +76,7 @@ } void log(in Severity severity, in string message) { - write(severityString(severity)); - write(message); - writeln(modifierString(Modifier.RESET)); + writeln(severityString(severity), message, modifierString(Modifier.RESET)); } enum Modifier {
--- a/doodle/dia/grid_layer.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/grid_layer.d Mon Aug 09 21:43:24 2010 +0930 @@ -18,9 +18,9 @@ } class GridLayer : Layer, IGrid { - static const double MIN_SPACING = 5.0; // pixels + immutable double MIN_SPACING = 5.0; // pixels - this(in string name) { + this(in string name = "Grid") { super(name); _zoomValid = false; }
--- a/doodle/dia/icanvas.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/icanvas.d Mon Aug 09 21:43:24 2010 +0930 @@ -62,10 +62,10 @@ abstract class Layer { this(in string name) { - mName = name; + _name = name; } - string name() const { return mName; } + string name() const { return _name; } Rectangle bounds() const; @@ -74,6 +74,6 @@ in Rectangle modelDamage, scope Context modelCr) const; private { - invariant string mName; + immutable string _name; } }
--- a/doodle/dia/page_layer.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/page_layer.d Mon Aug 09 21:43:24 2010 +0930 @@ -9,7 +9,7 @@ } class PageLayer : Layer, IPage { - this(in string name) { + this(in string name = "Page") { super(name); _pageGeometry = Rectangle(Point.DEFAULT, Vector(210.0, 297.0)); //_pageGeometry = Rectangle(Point.DEFAULT, Vector(100.0, 100.0));
--- a/doodle/dia/standard_tools.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/standard_tools.d Mon Aug 09 21:43:24 2010 +0930 @@ -11,8 +11,12 @@ } final class PanTool : Tool { + this() { + super("Pan"); + } + override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { - if (event.button_name == ButtonName.MIDDLE) { + if (event.buttonName == ButtonName.MIDDLE) { mLastPosition = event.pixelPoint; return true; } @@ -62,11 +66,15 @@ private { Point mLastPosition; - static invariant double AMOUNT = 60.0; + static immutable double AMOUNT = 60.0; } } final class ZoomTool : Tool { + this() { + super("Zoom"); + } + override bool handleScroll(scope IViewport viewport, in ScrollEvent event) { if (event.mask.isSet(Modifier.CONTROL)) { if (event.scrollDirection == ScrollDirection.DOWN) { @@ -87,13 +95,17 @@ } private { - static invariant double ZOOM = sqrt(2.0); + static immutable double ZOOM = sqrt(2.0); } } final class SelectTool : Tool { + this() { + super("Select"); + } + override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { - if (event.button_name == ButtonName.LEFT) { + if (event.buttonName == ButtonName.LEFT) { _active = true; _anchorPoint = _currentPoint = event.pixelPoint; viewport.setCursor(Cursor.HAND); @@ -105,7 +117,7 @@ } override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { - if (event.button_name == ButtonName.LEFT && _active) { + if (event.buttonName == ButtonName.LEFT && _active) { _active = false; viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0)); viewport.setCursor(Cursor.DEFAULT); @@ -152,6 +164,6 @@ bool _active; Point _currentPoint; Point _anchorPoint; // Pixel - static invariant double LINE_WIDTH = 1.0; + static immutable double LINE_WIDTH = 1.0; } }
--- a/doodle/dia/tool.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/tool.d Mon Aug 09 21:43:24 2010 +0930 @@ -6,31 +6,12 @@ import doodle.tk.events; } -/* -interface IToolStack { - void push(Tool tool); - void pop(); - void replace(Tool tool); -} -*/ - abstract class Tool { - /* - enum Response { - START, CONTINUE, FINISH + this (in string name) { + _name = name; + } - } - */ - - /* - abstract bool isSticky(); - abstract bool isReplaceable(); - */ - - /* - abstract void start(IToolStack tool_stack); - abstract void stop(IToolStack tool_stack); - */ + string name() const { return _name; } bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { return false; } bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { return false; } @@ -45,4 +26,8 @@ void draw(in IViewport viewport, in Rectangle pixelDamage, scope Context pixelCr) const { } + + private { + immutable string _name; + } }
--- a/doodle/dia/tool_layer.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/dia/tool_layer.d Mon Aug 09 21:43:24 2010 +0930 @@ -5,17 +5,33 @@ } private { - import std.stdio; import doodle.cairo.routines; + import doodle.core.logging; +} + +// This interface is used by the palette +interface IToolStack { + void use(Tool tool); +} + +interface IToolStackObserver { + void toolChanged(int index); } -interface IToolStack { -} - -class ToolLayer : Layer, IEventHandler, IToolStack { - this(in Tool[] tools, in string name) { +final class ToolLayer : Layer, IEventHandler, IToolStack { + this(in Tool[] tools, IToolStackObserver observer, in string name = "Tool") { super(name); _tools = tools.dup; + _observer = observer; + } + + // IToolStack overrides: + + void use(Tool tool) { + assert(_grabbedTool is null); + message("using new tool: %s", tool.name); + _tools ~= tool; + //_observer.toolChanged(_tools.length - 1); } // Layer overrides: @@ -34,14 +50,14 @@ // EventHandler overrides: - override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { + bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { // writefln("%s", event); if (_grabbedTool is null) { foreach_reverse(ref tool; _tools) { if (tool.handleButtonPress(viewport, event)) { _grabbedTool = &tool; - _grabbedButton = event.button_name; + _grabbedButton = event.buttonName; break; } } @@ -53,13 +69,13 @@ return true; } - override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { + bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { // writefln("%s", event); if (_grabbedTool !is null) { _grabbedTool.handleButtonRelease(viewport, event); - if (_grabbedButton == event.button_name) { + if (_grabbedButton == event.buttonName) { _grabbedTool = null; } } @@ -67,19 +83,19 @@ return true; } - override bool handleKeyPress(scope IViewport viewport, in KeyEvent event) { + bool handleKeyPress(scope IViewport viewport, in KeyEvent event) { // writefln("%s", event); return true; } - override bool handleKeyRelease(scope IViewport viewport, in KeyEvent event) { + bool handleKeyRelease(scope IViewport viewport, in KeyEvent event) { // writefln("%s", event); return true; } - override bool handleMotion(scope IViewport viewport, in MotionEvent event) { + bool handleMotion(scope IViewport viewport, in MotionEvent event) { //writefln("%s", event); if (_grabbedTool is null) { @@ -96,7 +112,7 @@ return true; } - override bool handleScroll(scope IViewport viewport, in ScrollEvent event) { + bool handleScroll(scope IViewport viewport, in ScrollEvent event) { // writefln("%s", event); if (_grabbedTool is null) { @@ -113,19 +129,10 @@ return true; } - /* - override void push(Tool tool) { - } - - override void pop() { - } - - override void replace(Tool tool) { - } - */ - private { Tool[] _tools; + IToolStackObserver _observer; + Tool * _grabbedTool; ButtonName _grabbedButton; }
--- a/doodle/fig/diagram_elements.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/fig/diagram_elements.d Mon Aug 09 21:43:24 2010 +0930 @@ -5,16 +5,21 @@ import doodle.cairo.routines; } +interface IDiagram { + void add(DiagramElement element); +} + abstract class DiagramElement { Rectangle bounds() const; void draw(in Rectangle damage, scope Context cr) const; private { - GraphElement _container; + //GraphElement _container; // FIXME use an interface to the container } } +/* abstract class SemanticModelBridge { }; @@ -26,35 +31,46 @@ } } -final class GraphConnector { +class GraphConnector { } -final class GraphNode : GraphElement { +class GraphNode : GraphElement { } -final class GraphEdge : GraphElement { +class GraphEdge : GraphElement { private { GraphConnector[2] _anchors; } } +*/ abstract class LeafElement : DiagramElement { } -final class TextElement : LeafElement { +/* +class TextElement : LeafElement { } +*/ abstract class GraphicPrimitive : LeafElement { } -final class PolylinePrimitive : GraphicPrimitive { +/* +class PolylinePrimitive : GraphicPrimitive { private { Point[] _waypoints; } } +*/ -final class RectanglePrimitive : GraphicPrimitive { +class RectanglePrimitive : GraphicPrimitive { override void draw(in Rectangle damage, scope Context cr) const { rectangle(cr, bounds); } + + override Rectangle bounds() const { return _bounds; } + + private { + Rectangle _bounds; + } }
--- a/doodle/fig/diagram_layer.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/fig/diagram_layer.d Mon Aug 09 21:43:24 2010 +0930 @@ -6,11 +6,13 @@ import std.array; } -class DiagramLayer : Layer { - this(in string name) { +class DiagramLayer : Layer, IDiagram { + this(in string name = "Diagram") { super(name); } + // IDiagram overrides + void add(DiagramElement element) { _elements ~= element; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/fig/tools.d Mon Aug 09 21:43:24 2010 +0930 @@ -0,0 +1,36 @@ +module doodle.fig.tools; + +private { + import doodle.dia.tool; + import doodle.fig.diagram_layer; +} + +final class CreateRectangleTool : Tool { + this(IDiagram diagram) { + super("Create Rectangle"); + _diagram = diagram; + } + + // Tool overrides: + + override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { + if (event.buttonName == ButtonName.LEFT) { + return true; + } + else { + return false; + } + } + + override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { + return true; + } + + override bool handleMotion(scope IViewport viewport, in MotionEvent event) { + return true; + } + + private { + IDiagram _diagram; + } +}
--- a/doodle/gtk/canvas.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/gtk/canvas.d Mon Aug 09 21:43:24 2010 +0930 @@ -453,10 +453,10 @@ } void updateRulers() { - invariant Vector modelSize = pixelToModel(_viewSize); + immutable Vector modelSize = pixelToModel(_viewSize); - invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0; - invariant Point viewRightTop = _viewCentre + modelSize / 2.0; + immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; + immutable Point viewRightTop = _viewCentre + modelSize / 2.0; // Define these just to obtain the position // below and we can preserve it @@ -476,10 +476,10 @@ } void updateAdjustments() { - invariant Vector modelSize = pixelToModel(_viewSize); + immutable Vector modelSize = pixelToModel(_viewSize); - invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0; - invariant Point viewRightTop = _viewCentre + modelSize / 2.0; + immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; + immutable Point viewRightTop = _viewCentre + modelSize / 2.0; // Adjust the canvas size if necessary _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom),
--- a/doodle/main/prog/doodler.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/main/prog/doodler.d Mon Aug 09 21:43:24 2010 +0930 @@ -3,10 +3,13 @@ import doodle.core.logging; import doodle.core.backtrace; + import doodle.dia.standard_tools; + import doodle.dia.page_layer; + import doodle.dia.grid_layer; + import doodle.fig.diagram_layer; import doodle.dia.tool_layer; - import doodle.dia.standard_tools; - import doodle.dia.grid_layer; - import doodle.dia.page_layer; + + import doodle.fig.tools; import doodle.gtk.canvas; import doodle.gtk.palette; @@ -18,33 +21,37 @@ import std.stdio; } -class TopLevel { +final class TopLevel : private IToolStackObserver { this(string[] args) { Main.init(args); auto window = new MainWindow("Doodle"); auto vbox = new VBox(false, 0); auto palette = new Palette; + _palette = palette; IPalette.Item[] items = [ { "select.svg", "Select", "Select and modify elements", &paletteCallback }, { "rectangle.svg", "Rectangle", "Create rectangle", &paletteCallback }, { "ellipse.svg", "Ellipse", "Create ellipse", &paletteCallback }, { "polyline.svg", "Polyline", "Create polyline", &paletteCallback } ]; - palette.configure(items); + _palette.configure(items); vbox.packStart(palette, false, false, 0); Tool[] tools; tools ~= new PanTool; tools ~= new ZoomTool; tools ~= new SelectTool; - auto toolLayer = new ToolLayer(tools, "Tools"); + auto toolLayer = new ToolLayer(tools, this); _toolStack = toolLayer; - auto gridLayer = new GridLayer("Grid"); + auto diagramLayer = new DiagramLayer; + _diagram = diagramLayer; + + auto gridLayer = new GridLayer; Layer[] layers; - layers ~= new PageLayer("Page"); + layers ~= new PageLayer; layers ~= gridLayer; layers ~= toolLayer; auto canvas = new Canvas(layers, toolLayer, gridLayer, 120.0); @@ -56,8 +63,15 @@ Main.run(); } + void toolChanged(int index) { // FIXME dmd bug? have to make this public + message("Tool changed %s", index); + _palette.activate(index); + } + private { IToolStack _toolStack; + IPalette _palette; + IDiagram _diagram; void paletteCallback(int index) { switch (index) { @@ -66,6 +80,7 @@ break; case 1: // Rectangle + _toolStack.use(new CreateRectangleTool(_diagram)); break; case 2: // Ellipse @@ -77,6 +92,7 @@ assert(0); } } + } }
--- a/doodle/tk/events.d Sun Aug 08 22:01:54 2010 +0930 +++ b/doodle/tk/events.d Mon Aug 09 21:43:24 2010 +0930 @@ -69,14 +69,14 @@ */ final class ButtonEvent : PointerEvent { - this(in ButtonAction button_action, - in ButtonName button_name, + this(in ButtonAction buttonAction, + in ButtonName buttonName, in Point pixelPoint, in Point modelPoint, in Mask mask) { super(pixelPoint, modelPoint, mask); - _buttonAction = button_action; - _buttonName = button_name; + _buttonAction = buttonAction; + _buttonName = buttonName; } override string toString() const { @@ -85,8 +85,8 @@ _pixelPoint, _modelPoint, _mask); } - ButtonAction button_action() const { return _buttonAction; } - ButtonName button_name() const { return _buttonName; } + ButtonAction buttonAction() const { return _buttonAction; } + ButtonName buttonName() const { return _buttonName; } private { ButtonAction _buttonAction;