add IDataSource

This commit is contained in:
2020-03-06 22:14:54 +03:00
parent d992e6b9a1
commit 46b971bfd4
3 changed files with 39 additions and 3 deletions

View File

@@ -0,0 +1,20 @@
package ru.m.data;
import promhx.Promise;
typedef Page = {
var index:Int;
var count:Int;
@:optional var order:String;
@:optional var filter:String;
}
typedef DataPage<T> = {
var page:Page;
var total:Int;
var data:Array<T>;
}
interface IDataSource<T> {
public function getPage(page:Page):Promise<DataPage<T>>;
}

View File

@@ -1,13 +1,15 @@
package ru.m.puzzlez.storage;
import promhx.Promise;
import flash.net.SharedObject;
import haxe.DynamicAccess;
import haxe.Serializer;
import haxe.Unserializer;
import ru.m.data.IDataSource;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.Id;
@:provide class GameStorage {
@:provide class GameStorage implements IDataSource<ImageId> {
private static var path = "game_1";
private var statusData:SharedObject;
@@ -16,6 +18,16 @@ import ru.m.puzzlez.core.Id;
statusData = SharedObject.getLocal('${path}/status');
}
public function getPage(page:Page):Promise<DataPage<ImageId>> {
var allData = list(page.filter);
allData.sort((a, b) -> Reflect.compare(a.toString().toLowerCase(), b.toString().toLowerCase()));
return Promise.promise({
page: page,
total: allData.length,
data: allData.slice(page.index * page.count, page.count),
});
}
public function save(state:GameState):Void {
statusData.setProperty(state.preset.imageId, Std.string(state.status));
statusData.flush();

View File

@@ -4,6 +4,7 @@ import haxework.view.data.DataView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.popup.ConfirmView;
import ru.m.data.IDataSource;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.Id.ImageId;
import ru.m.puzzlez.storage.GameStorage;
@@ -19,14 +20,17 @@ import ru.m.puzzlez.view.PuzzleImageView;
@:provide var storage:GameStorage;
private var status:GameStatus;
private var page:Page;
public function new() {
super(ID);
page = {index: 0, count: 10};
}
override public function onShow(data:GameStatus):Void {
status = data;
images.data = storage.list(status);
page.filter = status;
storage.getPage(page).then(page -> images.data = page.data);
}
private function start(id:ImageId):Void {
@@ -39,7 +43,7 @@ import ru.m.puzzlez.view.PuzzleImageView;
ConfirmView.confirm("Delete state?").then(result -> {
if (result) {
storage.delete(imageId);
images.data = storage.list(status);
storage.getPage(page).then(page -> images.data = page.data);
}
});
case _: