[add] (render) add RenderManager

This commit is contained in:
2020-03-03 22:18:17 +03:00
parent d622247868
commit 7ed368b984
16 changed files with 128 additions and 36 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "puzzlez",
"version": "0.3.6",
"version": "0.3.7",
"private": true,
"devDependencies": {
"dateformat": "^3.0.3",

View File

@@ -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");

View File

@@ -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);

View File

@@ -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),

View File

@@ -7,5 +7,7 @@ import ru.m.puzzlez.core.GameEvent;
interface IRender extends IView<Dynamic> {
public var signal(default, null):Signal<GameEvent>;
public var scale(get, set):Float;
public var manager(default, null):RenderManager;
public function onGameEvent(event:GameEvent):Void;
}

View File

@@ -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<GameEvent>;
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<Int, PartView>;
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);

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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()

View File

@@ -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;
}

View File

@@ -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<Background> {
@:singleton @:template class BackgroundPopup extends PopupView<Background> {
private static var colorsList:Array<Color> = [
'#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<Background> {
var result = new BackgroundPopup();
result.selected = current;
return result.show();
public function choise(current:Background):Promise<Background> {
selected = current;
return show();
}
}

View File

@@ -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<Dynamic> {
@:singleton @:template class PreviewPopup extends PopupView<Dynamic> {
@: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<Dynamic> {
var result = new PreviewPopup();
result.previewView.state = state;
return result.show();
public function showPreview(state:GameState):Promise<Dynamic> {
previewView.state = state;
return show();
}
}

View File

@@ -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);

View File

@@ -0,0 +1,6 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lock-alt" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" class="svg-inline--fa fa-lock-alt fa-w-14 fa-2x">
<path fill="currentColor"
d="M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zM264 392c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48zm32-168H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z"
class=""></path>
</svg>

After

Width:  |  Height:  |  Size: 582 B

View File

@@ -0,0 +1,6 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="window-restore" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-window-restore fa-w-16 fa-2x">
<path fill="currentColor"
d="M512 48v288c0 26.5-21.5 48-48 48h-48V176c0-44.1-35.9-80-80-80H128V48c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zM384 176v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V176c0-26.5 21.5-48 48-48h288c26.5 0 48 21.5 48 48zm-68 28c0-6.6-5.4-12-12-12H76c-6.6 0-12 5.4-12 12v52h252v-52z"
class=""></path>
</svg>

After

Width:  |  Height:  |  Size: 580 B

View File

@@ -2,4 +2,4 @@
* navigation
* render: table scale/move
* images paginator
* image preview
* render: complete image with PresetView