diff --git a/package.json b/package.json index 8b398ac..983b7de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "puzzlez", - "version": "0.3.6", + "version": "0.3.7", "private": true, "devDependencies": { "dateformat": "^3.0.3", diff --git a/src/haxe/ru/m/puzzlez/Const.hx b/src/haxe/ru/m/puzzlez/Const.hx index 10646b2..c6bc771 100755 --- a/src/haxe/ru/m/puzzlez/Const.hx +++ b/src/haxe/ru/m/puzzlez/Const.hx @@ -3,14 +3,14 @@ package ru.m.puzzlez; import flash.Lib; import flash.system.Capabilities; -class Const { - public static var FPS:Int; - public static var BUILD:String; - public static var VERSION:String; - public static var NAME:String; - public static var DEBUG:Bool; +@:singleton class Const { + public var FPS(default, null):Int; + public var BUILD(default, null):String; + public var VERSION(default, null):String; + public var NAME(default, null):String; + public var DEBUG(default, null):Bool; - public static function init():Void { + public function new():Void { FPS = Std.parseInt(Lib.current.stage.application.meta.get("fps")); BUILD = CompilationOption.get("build"); VERSION = Lib.current.stage.application.meta.get("version"); diff --git a/src/haxe/ru/m/puzzlez/PuzzlezApp.hx b/src/haxe/ru/m/puzzlez/PuzzlezApp.hx index c12fa68..fb8b8ad 100644 --- a/src/haxe/ru/m/puzzlez/PuzzlezApp.hx +++ b/src/haxe/ru/m/puzzlez/PuzzlezApp.hx @@ -17,9 +17,8 @@ class PuzzlezApp extends App { GameStorage; ImageStorage; SettingsStorage; - Const.init(); L.push(new TraceLogger()); - updater = new Updater(Const.VERSION, "https://shmyga.ru/repo/puzzlez/packages.json"); + updater = new Updater(Const.instance.VERSION, "https://shmyga.ru/repo/puzzlez/packages.json"); var app = new PuzzlezApp(new PuzzlezTheme(), openfl.Assets.getBitmapData("resources/icon.png")); var view = new PuzzlezAppView(); app.start(view); diff --git a/src/haxe/ru/m/puzzlez/PuzzlezTheme.hx b/src/haxe/ru/m/puzzlez/PuzzlezTheme.hx index 1dcdeb6..09765c3 100644 --- a/src/haxe/ru/m/puzzlez/PuzzlezTheme.hx +++ b/src/haxe/ru/m/puzzlez/PuzzlezTheme.hx @@ -44,6 +44,12 @@ class PuzzlezTheme extends Theme { register(new Style("icon.image", [ "skin.svg" => Assets.getText("resources/icon/image-polaroid.svg"), ])); + register(new Style("icon.lock", [ + "skin.svg" => Assets.getText("resources/icon/lock-alt-solid.svg"), + ])); + register(new Style("icon.restore", [ + "skin.svg" => Assets.getText("resources/icon/window-restore-solid.svg"), + ])); register(new Style("icon.small", [ "geometry.width" => SizeValue.fromInt(smallSize), "geometry.height" => SizeValue.fromInt(smallSize), diff --git a/src/haxe/ru/m/puzzlez/render/IRender.hx b/src/haxe/ru/m/puzzlez/render/IRender.hx index 80de569..71fed24 100644 --- a/src/haxe/ru/m/puzzlez/render/IRender.hx +++ b/src/haxe/ru/m/puzzlez/render/IRender.hx @@ -7,5 +7,7 @@ import ru.m.puzzlez.core.GameEvent; interface IRender extends IView { public var signal(default, null):Signal; public var scale(get, set):Float; + public var manager(default, null):RenderManager; + public function onGameEvent(event:GameEvent):Void; } diff --git a/src/haxe/ru/m/puzzlez/render/Render.hx b/src/haxe/ru/m/puzzlez/render/Render.hx index 8d3cdc9..b0c45b8 100644 --- a/src/haxe/ru/m/puzzlez/render/Render.hx +++ b/src/haxe/ru/m/puzzlez/render/Render.hx @@ -1,6 +1,5 @@ package ru.m.puzzlez.render; -import ru.m.puzzlez.storage.SettingsStorage; import flash.display.BitmapData; import flash.display.PNGEncoderOptions; import flash.display.Sprite; @@ -18,11 +17,13 @@ import ru.m.puzzlez.core.GameState; import ru.m.puzzlez.core.PartLocation; import ru.m.puzzlez.render.ImagePartBuilder; import ru.m.puzzlez.storage.ImageStorage; +import ru.m.puzzlez.storage.SettingsStorage; class Render extends SpriteView implements IRender { public var signal(default, null):Signal; public var scale(get, set):Float; + public var manager(default, null):RenderManager; @:provide static var settings:SettingsStorage; @@ -42,23 +43,29 @@ class Render extends SpriteView implements IRender { private var image:BitmapData; private var progress:ProgressView; + private var container:Sprite; private var tableView:Sprite; private var imageView:Sprite; private var parts:Map; private var activePart:PartView; private var activePoint:Point; + private var movePoint:FlashPoint; + @:provide var imageStorage:ImageStorage; public function new() { super(); + container = new Sprite(); + content.addChild(container); + manager = new RenderManager(content, container); progress = new ProgressView(); signal = new Signal(); tableView = new Sprite(); tableView.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); imageView = new Sprite(); tableView.addChild(imageView); - content.addChild(tableView); + container.addChild(tableView); parts = new Map(); } @@ -171,6 +178,7 @@ class Render extends SpriteView implements IRender { } } if (pointPart != null) { + event.stopImmediatePropagation(); if (event.ctrlKey) { save(pointPart); return; @@ -212,7 +220,7 @@ class Render extends SpriteView implements IRender { file.save(data, "icon.png"); } - private function clean() { + public function clean() { for (partView in parts) { if (partView.parent != null) { partView.parent.removeChild(partView); diff --git a/src/haxe/ru/m/puzzlez/render/RenderManager.hx b/src/haxe/ru/m/puzzlez/render/RenderManager.hx new file mode 100644 index 0000000..8be4463 --- /dev/null +++ b/src/haxe/ru/m/puzzlez/render/RenderManager.hx @@ -0,0 +1,52 @@ +package ru.m.puzzlez.render; + +import flash.display.DisplayObject; +import flash.events.MouseEvent; +import flash.geom.Point; + +class RenderManager { + + public var locked(default, default):Bool; + + private var content:DisplayObject; + private var container:DisplayObject; + private var movePoint:Point; + + public function new(content:DisplayObject, container:DisplayObject) { + this.content = content; + this.container = container; + content.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); + } + + private function onMouseDown(event:MouseEvent):Void { + if (locked) { + return; + } + movePoint = new Point(event.stageX, event.stageY); + content.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); + content.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); + } + + private function onMouseMove(event:MouseEvent):Void { + var newPoint = new Point(event.stageX, event.stageY); + var diff = newPoint.subtract(movePoint); + container.x += diff.x; + container.y += diff.y; + movePoint = newPoint; + } + + private function onMouseUp(event:MouseEvent):Void { + content.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); + content.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); + movePoint = null; + } + + public function reset():Void { + container.x = 0; + container.y = 0; + } + + public function dispose():Void { + content.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); + } +} diff --git a/src/haxe/ru/m/puzzlez/view/GameFrame.hx b/src/haxe/ru/m/puzzlez/view/GameFrame.hx index 0662227..956e481 100644 --- a/src/haxe/ru/m/puzzlez/view/GameFrame.hx +++ b/src/haxe/ru/m/puzzlez/view/GameFrame.hx @@ -67,20 +67,18 @@ import ru.m.puzzlez.view.popup.PreviewPopup; private function onGameEvent(event:GameEvent):Void { switch event { - case START(state): - toSave(); - case ACTION(PART_PUT(_, _)): + case START(_) | ACTION(PART_PUT(_, _)): toSave(); case _: } } private function showPreview():Void { - PreviewPopup.showPreview(game.state); + PreviewPopup.instance.showPreview(game.state); } private function choiseBackground():Void { - BackgroundPopup.choise(settings.background).then(background -> { + BackgroundPopup.instance.choise(settings.background).then(background -> { if (background != null) { settings.background = background; render.toRedraw(); diff --git a/src/haxe/ru/m/puzzlez/view/GameFrame.yaml b/src/haxe/ru/m/puzzlez/view/GameFrame.yaml index 8856931..583d8b5 100644 --- a/src/haxe/ru/m/puzzlez/view/GameFrame.yaml +++ b/src/haxe/ru/m/puzzlez/view/GameFrame.yaml @@ -6,14 +6,27 @@ views: - $type: haxework.view.group.VGroupView geometry.height: 100% geometry.padding: 5 + layout.margin: 10 views: - $type: haxework.view.form.ButtonView style: icon.image +onPress: ~showPreview() - $type: haxework.view.SpriteView geometry.stretch: true + - $type: haxework.view.form.ToggleButtonView + style: icon.lock + on: true + +onPress: | + ~button -> { + render.manager.locked = !render.manager.locked; + cast(button, haxework.view.form.ToggleButtonView).on = !render.manager.locked; + } + - $type: haxework.view.form.ButtonView + style: icon.restore + +onPress: ~render.manager.reset() - $type: haxework.view.form.ButtonView style: icon.setting + geometry.margin.top: 30 +onPress: ~choiseBackground() - id: render $type: ru.m.puzzlez.render.Render @@ -24,5 +37,5 @@ views: geometry.position: absolute geometry.hAlign: right geometry.vAlign: top - geometry.margin: [0, 5, 5, 0] + geometry.margin: 5 +onPress: ~back() diff --git a/src/haxe/ru/m/puzzlez/view/PuzzlezAppView.hx b/src/haxe/ru/m/puzzlez/view/PuzzlezAppView.hx index 7f8a118..be0bbfa 100644 --- a/src/haxe/ru/m/puzzlez/view/PuzzlezAppView.hx +++ b/src/haxe/ru/m/puzzlez/view/PuzzlezAppView.hx @@ -14,9 +14,8 @@ import haxework.view.group.VGroupView; public function new() { super(); - Const.init(); - resources.text.put("version", Const.VERSION); - resources.text.put("name", Const.NAME); + resources.text.put("version", Const.instance.VERSION); + resources.text.put("name", Const.instance.NAME); switcher = switcherView; } diff --git a/src/haxe/ru/m/puzzlez/view/popup/BackgroundPopup.hx b/src/haxe/ru/m/puzzlez/view/popup/BackgroundPopup.hx index f0e54a1..c242b65 100644 --- a/src/haxe/ru/m/puzzlez/view/popup/BackgroundPopup.hx +++ b/src/haxe/ru/m/puzzlez/view/popup/BackgroundPopup.hx @@ -14,7 +14,7 @@ import ru.m.puzzlez.core.Id.ImageId; import ru.m.puzzlez.render.Background; import ru.m.puzzlez.storage.ImageStorage; -@:template class BackgroundPopup extends PopupView { +@:singleton @:template class BackgroundPopup extends PopupView { private static var colorsList:Array = [ '#FFFFFF', @@ -42,7 +42,7 @@ import ru.m.puzzlez.storage.ImageStorage; public var selected(default, set):Background; - @:provide var imageStorage:ImageStorage; + @:provide static var imageStorage:ImageStorage; public function new() { super(); @@ -87,9 +87,8 @@ import ru.m.puzzlez.storage.ImageStorage; return result; } - public static function choise(current:Background):Promise { - var result = new BackgroundPopup(); - result.selected = current; - return result.show(); + public function choise(current:Background):Promise { + selected = current; + return show(); } } diff --git a/src/haxe/ru/m/puzzlez/view/popup/PreviewPopup.hx b/src/haxe/ru/m/puzzlez/view/popup/PreviewPopup.hx index 29bc719..7ed4f4a 100644 --- a/src/haxe/ru/m/puzzlez/view/popup/PreviewPopup.hx +++ b/src/haxe/ru/m/puzzlez/view/popup/PreviewPopup.hx @@ -4,22 +4,19 @@ import flash.events.MouseEvent; import haxework.view.popup.PopupView; import promhx.Promise; import ru.m.puzzlez.core.GameState; -import ru.m.puzzlez.storage.ImageStorage; import ru.m.puzzlez.view.common.PresetView; -@:template class PreviewPopup extends PopupView { +@:singleton @:template class PreviewPopup extends PopupView { @:view("preview") var previewView:PresetView; - @:provide static var imageStorage:ImageStorage; public function new() { super(); content.addEventListener(MouseEvent.CLICK, _ -> close(null)); } - public static function showPreview(state:GameState):Promise { - var result = new PreviewPopup(); - result.previewView.state = state; - return result.show(); + public function showPreview(state:GameState):Promise { + previewView.state = state; + return show(); } } diff --git a/src/haxe/ru/m/skin/ButtonSVGSkin.hx b/src/haxe/ru/m/skin/ButtonSVGSkin.hx index 56d993d..d25443a 100644 --- a/src/haxe/ru/m/skin/ButtonSVGSkin.hx +++ b/src/haxe/ru/m/skin/ButtonSVGSkin.hx @@ -3,6 +3,7 @@ package ru.m.skin; import format.SVG; import haxework.color.Color; import haxework.view.form.ButtonView; +import haxework.view.form.ToggleButtonView; import haxework.view.skin.ISkin; using StringTools; @@ -47,6 +48,12 @@ using haxework.color.ColorUtil; update(); var svg = svgs.get(view.state); var graphics = view.content.graphics; + var color = this.color; + if (Std.is(view, ToggleButtonView)) { + if (!cast(view, ToggleButtonView).on) { + color = color.multiply(0.5); + } + } graphics.beginFill(0, 0); graphics.drawRect(0, 0, view.width, view.height); graphics.beginFill(color); diff --git a/src/resources/icon/lock-alt-solid.svg b/src/resources/icon/lock-alt-solid.svg new file mode 100644 index 0000000..5b2be98 --- /dev/null +++ b/src/resources/icon/lock-alt-solid.svg @@ -0,0 +1,6 @@ + diff --git a/src/resources/icon/window-restore-solid.svg b/src/resources/icon/window-restore-solid.svg new file mode 100644 index 0000000..4304e36 --- /dev/null +++ b/src/resources/icon/window-restore-solid.svg @@ -0,0 +1,6 @@ + diff --git a/work.md b/work.md index 6b68eaf..4637a1a 100644 --- a/work.md +++ b/work.md @@ -2,4 +2,4 @@ * navigation * render: table scale/move * images paginator -* image preview +* render: complete image with PresetView