[add] (render) add RenderManager
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "puzzlez",
|
||||
"version": "0.3.6",
|
||||
"version": "0.3.7",
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"dateformat": "^3.0.3",
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
52
src/haxe/ru/m/puzzlez/render/RenderManager.hx
Normal file
52
src/haxe/ru/m/puzzlez/render/RenderManager.hx
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
6
src/resources/icon/lock-alt-solid.svg
Normal file
6
src/resources/icon/lock-alt-solid.svg
Normal 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 |
6
src/resources/icon/window-restore-solid.svg
Normal file
6
src/resources/icon/window-restore-solid.svg
Normal 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 |
Reference in New Issue
Block a user