diff --git a/src/haxe/ru/m/data/IDataSource.hx b/src/haxe/ru/m/data/IDataSource.hx new file mode 100644 index 0000000..205e3ff --- /dev/null +++ b/src/haxe/ru/m/data/IDataSource.hx @@ -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 = { + var page:Page; + var total:Int; + var data:Array; +} + +interface IDataSource { + public function getPage(page:Page):Promise>; +} diff --git a/src/haxe/ru/m/puzzlez/storage/GameStorage.hx b/src/haxe/ru/m/puzzlez/storage/GameStorage.hx index b436429..e929524 100644 --- a/src/haxe/ru/m/puzzlez/storage/GameStorage.hx +++ b/src/haxe/ru/m/puzzlez/storage/GameStorage.hx @@ -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 { 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> { + 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(); diff --git a/src/haxe/ru/m/puzzlez/view/GameListFrame.hx b/src/haxe/ru/m/puzzlez/view/GameListFrame.hx index 5d6630c..5c9fc8d 100644 --- a/src/haxe/ru/m/puzzlez/view/GameListFrame.hx +++ b/src/haxe/ru/m/puzzlez/view/GameListFrame.hx @@ -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 _: