[client] remake panel

This commit is contained in:
2019-07-22 17:45:38 +03:00
parent ba90b90cd3
commit 9eccb263c0
22 changed files with 433 additions and 395 deletions

View File

@@ -45,7 +45,7 @@ class AppTheme extends Theme {
"skin.background.alpha" => 0.1,
"skin.border.color" => colors.light,
"geometry.padding" => Box.fromArray([50, 8]),
"geometry.margin" => Box.fromArray([0, 0, 10, 30]),
"geometry.margin" => Box.fromArray([0, 0, 30, 30]),
], ["text"]));
register(new Style("button.menu", [
@@ -104,6 +104,7 @@ class AppTheme extends Theme {
registerButton("settings", "cog-solid.svg");
registerButton("close", "times-circle-solid.svg");
registerButton("next", "arrow-alt-circle-right-solid.svg");
registerButton("prev", "arrow-alt-circle-left-solid.svg");
registerButton("start", "play-circle-solid.svg");
registerButton("login", "sign-in-solid.svg");
registerButton("logout", "sign-out-solid.svg");

View File

@@ -3,20 +3,14 @@ package ru.m.tankz.view;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import haxework.resources.IResources;
import haxework.view.form.ButtonView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.form.LabelView;
import haxework.view.group.VGroupView;
import ru.m.tankz.game.IGame;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.view.popup.LoginPopup;
@:template class ClientView extends VGroupView {
@:view("switcher") var switcherView:FrameSwitcher;
@:view var username:LabelView;
@:view("login") var loginButton:ButtonView;
@:view("logout") var logoutButton:ButtonView;
@:provide var network:NetworkManager;
@:provide var resources:IResources;
@@ -27,8 +21,6 @@ import ru.m.tankz.view.popup.LoginPopup;
public function init():Void {
resources.text.put('version', '${Const.VERSION}');
switcher = switcherView;
network.stateSignal.connect(onConnectionState);
onConnectionState(network.state);
}
public function launch():Void {
@@ -36,7 +28,7 @@ import ru.m.tankz.view.popup.LoginPopup;
content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void {
switch event.keyCode {
case Keyboard.ESCAPE:
switcher.change(StartFrame.ID);
switcher.change(MenuFrame.ID);
case Keyboard.M:
soundManager.mute = !soundManager.mute;
case Keyboard.P:
@@ -45,41 +37,6 @@ import ru.m.tankz.view.popup.LoginPopup;
}
}
});
switcher.change(StartFrame.ID);
}
private function onConnectionState(state:ConnectionState):Void {
L.d("ClientView", 'onConnectionState: ${state}');
switch state {
case ONLINE(user):
username.text = user.name;
logoutButton.visible = true;
loginButton.visible = false;
case CONNECTED:
username.text = "";
logoutButton.visible = false;
loginButton.visible = true;
case ERROR(error):
//L.e("ClientView", 'onConnectionState: ERROR', error);
L.w("ClientView", 'onConnectionState: ERROR');
case _:
username.text = "";
logoutButton.visible = false;
loginButton.visible = false;
}
}
private function login():Void {
LoginPopup.instance.show().then(function(user:User):Void {
L.d("Login", 'user: $user');
});
}
private function logout():Void {
network.logout();
}
private function close():Void {
switcher.change(StartFrame.ID);
switcher.change(MenuFrame.ID);
}
}

View File

@@ -5,39 +5,12 @@ views:
geometry.stretch: true
style: dark
factory:
_start_: {$class: ru.m.tankz.view.StartFrame}
_menu_: {$class: ru.m.tankz.view.MenuFrame}
_level_: {$class: ru.m.tankz.view.LevelFrame}
_start_: {$class: ru.m.tankz.view.StartFrame}
_game_: {$class: ru.m.tankz.view.GameFrame}
_result_: {$class: ru.m.tankz.view.ResultFrame}
_settings_: {$class: ru.m.tankz.view.SettingsFrame}
_record_: {$class: ru.m.tankz.view.RecordFrame}
_room_list_: {$class: ru.m.tankz.view.network.RoomListFrame}
_room_: {$class: ru.m.tankz.view.network.RoomFrame}
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- id: settings
$type: haxework.view.form.ButtonView
style: button.settings
+onPress: ~switcher.change('settings')
- $type: haxework.view.SpriteView
geometry.width: 50%
- id: username
$type: haxework.view.form.LabelView
style: text
- id: login
$type: haxework.view.form.ButtonView
style: button.login
+onPress: ~login()
- id: logout
$type: haxework.view.form.ButtonView
style: button.logout
+onPress: ~logout()
visible: false
- $type: haxework.view.SpriteView
geometry.width: 50%
- id: close
$type: haxework.view.form.ButtonView
style: button.close
+onPress: ~close()

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.view;
import haxework.view.layout.DefaultLayout;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import ru.m.control.DeviceType;
@@ -36,7 +37,7 @@ import ru.m.tankz.view.GamepadView;
private var recorder:GameRecord;
public function new() {
super(id);
super(id, new DefaultLayout());
}
public function init():Void {
@@ -97,6 +98,6 @@ import ru.m.tankz.view.GamepadView;
}
public function close():Void {
switcher.change(StartFrame.ID);
switcher.change(MenuFrame.ID);
}
}

View File

@@ -1,15 +1,10 @@
---
geometry.stretch: true
layout:
$type: haxework.view.layout.VerticalLayout
style: container
overflow.x: crop
overflow.y: crop
views:
- $type: haxework.view.group.VGroupView
style: container
overflow.x: crop
overflow.y: crop
views:
- id: game
$type: ru.m.tankz.view.game.GameView
- id: game
$type: ru.m.tankz.view.game.GameView
- id: gamepad
$type: ru.m.tankz.view.GamepadView
geometry.position: absolute

View File

@@ -1,33 +1,29 @@
package ru.m.tankz.view;
import haxework.view.form.ButtonView;
import haxework.view.data.DataView;
import haxework.view.form.ButtonView;
import haxework.view.form.LabelView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import haxework.view.form.LabelView;
import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.config.Config;
import ru.m.tankz.control.Controller;
import ru.m.tankz.control.PlayerControl;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type.PlayerId;
import ru.m.tankz.Type;
import ru.m.tankz.view.popup.LevelPopup;
import ru.m.tankz.Type.PackId;
@:template class LevelFrame extends FrameView<LevelPack> {
@:template class LevelFrame extends FrameView<PackId> {
public static inline var ID = "level";
@:view var header:LabelView;
@:view var levels:DataView<LevelConfig, ButtonView>;
@:provide static var switcher:FrameSwitcher;
@:provide static var storage:GameStorage;
@:provide static var configBundle:IConfigBundle;
@:provide static var levelBundle:ILevelBundle;
@:view var header:LabelView;
@:view var levels:DataView<LevelConfig, ButtonView>;
private var pack:LevelPack;
private var levelPopup:LevelPopup;
private var config(get, never):Config;
public function new() {
@@ -38,19 +34,12 @@ import ru.m.tankz.view.popup.LevelPopup;
return configBundle.get(pack.id.type);
}
override public function onShow(data:LevelPack):Void {
header.text = data.id.type;
pack = data;
override public function onShow(data:PackId):Void {
header.text = data.type;
pack = levelBundle.get(data);
levels.data = pack.data;
}
private function start(level:LevelConfig, presetId:PresetId, controls:Array<PlayerControl>):Void {
switcher.change(GameFrame.ID, LOCAL({
state: new GameState(pack.id.type, presetId, controls),
level: level,
}));
}
private function levelViewFactory(index:Int, level:LevelConfig):ButtonView {
var progress = storage.get(pack.id);
var result = new ButtonView();
@@ -62,37 +51,11 @@ import ru.m.tankz.view.popup.LevelPopup;
}
private function onLevelSelect(index:Int, level:LevelConfig, view:ButtonView):Void {
if (!storage.get(pack.id).isLevelAvailable(level.id)) {
return;
if (storage.get(pack.id).isLevelAvailable(level.id)) {
switcher.change(StartFrame.ID, {
state: new GameState(pack.id.type),
level: level,
});
}
if (levelPopup == null) {
levelPopup = new LevelPopup();
}
var controls:Array<PlayerControl> = [];
var preset = config.getPreset(0);
for (team in preset.teams) {
if (team.id != "bot") { // ToDo:
for (player in team.players) {
var playerId = new PlayerId(team.id, player.index);
controls.push({
playerId: playerId,
color: config.getColor(playerId),
controller: NONE,
});
}
}
}
controls.sort(function(a, b) return a.playerId.compare(b.playerId));
if (controls.length > 0) {
controls[0].controller = HUMAN(0);
controls[0].name = ControllerParser.defaultName(controls[0].controller);
}
levelPopup.setData(
level,
config.presets,
controls,
storage.get(pack.id)
);
levelPopup.show().then(function(result) result != null ? start(level, result.presetId, result.controls) : {});
}
}

View File

@@ -1,21 +1,29 @@
---
views:
- $type: haxework.view.group.VGroupView
style: container
geometry.padding: 20
views:
- id: header
$type: haxework.view.form.LabelView
style: text.header
- id: levels
$type: haxework.view.data.DataView
geometry.width: 100%
geometry.height: 100%
overflow.y: scroll
layout:
$type: haxework.view.layout.TailLayout
rowSize: 10
margin: 5
factory: ~levelViewFactory
+onItemSelect: ~onLevelSelect
geometry.padding: 10
- $type: haxework.view.group.VGroupView
style: container
views:
- id: header
$type: haxework.view.form.LabelView
style: text.header
- id: levels
$type: haxework.view.data.DataView
geometry.width: 100%
geometry.height: 100%
overflow.y: scroll
layout:
$type: haxework.view.layout.TailLayout
rowSize: 10
margin: 5
factory: ~levelViewFactory
+onItemSelect: ~onLevelSelect
geometry.padding: 10
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 100%
- $type: haxework.view.form.ButtonView
style: button.prev
+onPress: ~switcher.change("menu")

View File

@@ -0,0 +1,96 @@
package ru.m.tankz.view;
import haxework.view.form.ButtonView;
import haxework.view.form.LabelView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.Type;
import ru.m.tankz.view.network.RoomFrame;
import ru.m.tankz.view.network.RoomListFrame;
import ru.m.tankz.view.popup.LoginPopup;
@:template class MenuFrame extends FrameView<Dynamic> {
public static var ID(default, never):String = "menu";
@:provide var gameInit:GameInit;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
@:view var username:LabelView;
@:view("login") var loginButton:ButtonView;
@:view("logout") var logoutButton:ButtonView;
public function new() {
super(ID);
}
override public function onShow(data:Dynamic):Void {
super.onShow(data);
network.stateSignal.connect(onConnectionState);
onConnectionState(network.state);
}
override public function onHide():Void {
super.onHide();
network.stateSignal.disconnect(onConnectionState);
}
private function startGame(type:GameType):Void {
gameInit = LOCAL({state: new GameState(type), level: null});
switcher.change(LevelFrame.ID, new PackId(type));
}
private function startNetwork():Void {
switch network.state {
case ONLINE(user):
if (network.room != null) {
switcher.change(RoomFrame.ID, network.room);
network.joinGame(network.room.game.id, true);
} else {
switcher.change(RoomListFrame.ID);
}
case CONNECTED:
LoginPopup.instance.show().then(function(user):Void {
if (user != null) {
switcher.change(RoomListFrame.ID);
}
});
case _:
}
}
private function onConnectionState(state:ConnectionState):Void {
L.d("ClientView", 'onConnectionState: ${state}');
switch state {
case ONLINE(user):
username.text = user.name;
logoutButton.visible = true;
loginButton.visible = false;
case CONNECTED:
username.text = "";
logoutButton.visible = false;
loginButton.visible = true;
case ERROR(error):
//L.e("ClientView", 'onConnectionState: ERROR', error);
L.w("ClientView", 'onConnectionState: ERROR');
case _:
username.text = "";
logoutButton.visible = false;
loginButton.visible = false;
}
}
private function login():Void {
LoginPopup.instance.show().then(function(user:User):Void {
L.d("Login", 'user: $user');
});
}
private function logout():Void {
network.logout();
}
}

View File

@@ -0,0 +1,65 @@
---
views:
- $type: haxework.view.group.VGroupView
style: container
layout.margin: 10
overflow.y: scroll
views:
- $type: haxework.view.form.LabelView
text: Tank'z
style: font
font.size: 100
geometry.margin.bottom: 30
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('classic')
text: Classic
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('dota')
text: DotA
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('death')
text: DeathMatch
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~switcher.change('record')
text: Records
- id: network
$type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startNetwork()
text: Network
- $type: haxework.view.form.LabelView
geometry.hAlign: right
geometry.vAlign: top
geometry.padding: [20, 5]
geometry.position: absolute
geometry.margin: [0, 20, 20, 0]
style: text.box
text: $r:text:version
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- id: settings
$type: haxework.view.form.ButtonView
style: button.settings
+onPress: ~switcher.change('settings')
- $type: haxework.view.SpriteView
geometry.width: 50%
- id: username
$type: haxework.view.form.LabelView
style: text
- id: login
$type: haxework.view.form.ButtonView
style: button.login
+onPress: ~login()
- id: logout
$type: haxework.view.form.ButtonView
style: button.logout
+onPress: ~logout()
visible: false
- $type: haxework.view.SpriteView
geometry.width: 50%

View File

@@ -7,12 +7,13 @@ import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.storage.RecordStorage;
@:template class RecordFrame extends FrameView<Dynamic> {
public static var ID(default, never):String = "record";
@:view var data:VListView<GameRecordInfo>;
@:provide static var switcher:FrameSwitcher;
@:provide static var recordStorage:RecordStorage;
@:provide var recordStorage:RecordStorage;
@:provide var switcher:FrameSwitcher;
@:view var data:VListView<GameRecordInfo>;
public function new() {
super(ID);

View File

@@ -2,7 +2,6 @@
views:
- $type: haxework.view.group.VGroupView
style: container
geometry.padding: 20
views:
- $type: haxework.view.form.LabelView
style: text.header
@@ -13,4 +12,13 @@ views:
geometry.margin.top: 20
geometry.stretch: true
scroll:
$type: haxework.view.list.VScrollBarView
$type: haxework.view.list.VScrollBarView
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 100%
- $type: haxework.view.form.ButtonView
style: button.prev
+onPress: ~switcher.change("menu")

View File

@@ -56,7 +56,7 @@ import ru.m.tankz.view.common.LifeView;
}
private function levels():Void {
frames.change(LevelFrame.ID, levelBundle.get(result.level.packId));
frames.change(LevelFrame.ID, result.level.packId);
}
private function restart():Void {
@@ -75,6 +75,6 @@ import ru.m.tankz.view.common.LifeView;
}
private function close():Void {
frames.change(StartFrame.ID);
frames.change(MenuFrame.ID);
}
}

View File

@@ -10,24 +10,30 @@ views:
- id: result
$type: haxework.view.data.DataView
factory: ~playerViewFactory
geometry.height: 100%
overflow.y: scroll
geometry.margin.top: 20
layout:
$type: haxework.view.layout.VerticalLayout
hAlign: right
margin: 10
- $type: haxework.view.group.HGroupView
layout.margin: 10
geometry.padding: 10
views:
- id: levels
$type: haxework.view.form.ButtonView
text: Levels
+onPress: ~levels()
- id: restart
$type: haxework.view.form.ButtonView
text: Restart
+onPress: ~restart()
- id: next
$type: haxework.view.form.ButtonView
text: Next
+onPress: ~next()
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 50%
- id: levels
$type: haxework.view.form.ButtonView
text: Levels
+onPress: ~levels()
- id: restart
$type: haxework.view.form.ButtonView
text: Restart
+onPress: ~restart()
- id: next
$type: haxework.view.form.ButtonView
text: Next
+onPress: ~next()
- $type: haxework.view.SpriteView
geometry.width: 50%

View File

@@ -1,10 +1,13 @@
package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
@:template class SettingsFrame extends FrameView<Dynamic> {
public static var ID(default, never):String = "settings";
@:provide static var switcher:FrameSwitcher;
public function new() {
super(ID);
}

View File

@@ -1,24 +1,32 @@
---
views:
- $type: haxework.view.group.VGroupView
style: container
geometry.padding: 20
- $type: haxework.view.group.VGroupView
style: container
views:
- $type: haxework.view.form.LabelView
style: text.header
text: Settings
- $type: haxework.view.group.GroupView
geometry.width: 100%
geometry.height: 100%
overflow.y: scroll
layout:
$type: haxework.view.layout.TailLayout
vAlign: top
margin: 20
views:
- $type: haxework.view.form.LabelView
style: text.header
text: Settings
- $type: haxework.view.group.GroupView
geometry.width: 100%
geometry.height: 100%
overflow.y: scroll
layout:
$type: haxework.view.layout.TailLayout
vAlign: top
margin: 20
views:
- id: settings0
$type: ru.m.tankz.view.settings.SettingsEditor
controlIndex: 0
- id: settings1
$type: ru.m.tankz.view.settings.SettingsEditor
controlIndex: 1
- id: settings0
$type: ru.m.tankz.view.settings.SettingsEditor
controlIndex: 0
- id: settings1
$type: ru.m.tankz.view.settings.SettingsEditor
controlIndex: 1
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 100%
- $type: haxework.view.form.ButtonView
style: button.prev
+onPress: ~switcher.change("menu")

View File

@@ -1,50 +1,113 @@
package ru.m.tankz.view;
import haxework.view.data.DataView;
import haxework.view.form.ButtonView;
import haxework.view.form.LabelView;
import haxework.view.frame.FrameSwitcher;
import haxework.view.frame.FrameView;
import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.config.Config;
import ru.m.tankz.control.Controller;
import ru.m.tankz.control.PlayerControl;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.game.PackProgress;
import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type;
import ru.m.tankz.view.network.RoomFrame;
import ru.m.tankz.view.network.RoomListFrame;
import ru.m.tankz.view.popup.LoginPopup;
import ru.m.tankz.view.common.SlotView;
@:template class StartFrame extends FrameView<Void> {
using haxe.EnumTools.EnumValueTools;
@:template class StartFrame extends FrameView<Start> {
public static var ID(default, never):String = "start";
@:provide var gameInit:GameInit;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;
@:provide var levelBundle:ILevelBundle;
@:provide static var switcher:FrameSwitcher;
@:provide static var storage:GameStorage;
private var progress:PackProgress;
@:view var header:LabelView;
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
private var humanIndex:Int = 0;
private var humanTotal:Int = 2;
private var start:Start;
public function new() {
super(ID);
}
private function startGame(type:GameType):Void {
gameInit = LOCAL({state: new GameState(type), level: null});
switcher.change(LevelFrame.ID, levelBundle.get(new PackId(type)));
override public function onShow(data:Start):Void {
super.onShow(data);
start = data;
this.progress = storage.get(start.level.packId);
header.text = '${start.state.type} - ${start.level.id}. ${start.level.name != null ? start.level.name : "#"}';
presetsView.data = start.state.config.presets;
slotsView.data = defaultControls(start.state.config);
}
private function startNetwork():Void {
switch network.state {
case ONLINE(user):
if (network.room != null) {
switcher.change(RoomFrame.ID, network.room);
network.joinGame(network.room.game.id, true);
} else {
switcher.change(RoomListFrame.ID);
private static function defaultControls(config:Config):Array<PlayerControl> {
var controls:Array<PlayerControl> = [];
var preset = config.getPreset(0);
for (team in preset.teams) {
if (team.id != "bot") { // ToDo:
for (player in team.players) {
var playerId = new PlayerId(team.id, player.index);
controls.push({
playerId: playerId,
color: config.getColor(playerId),
controller: NONE,
});
}
case CONNECTED:
LoginPopup.instance.show().then(function(user):Void {
if (user != null) {
switcher.change(RoomListFrame.ID);
}
});
}
}
controls.sort(function(a, b) return a.playerId.compare(b.playerId));
if (controls.length > 0) {
controls[0].controller = HUMAN(0);
controls[0].name = ControllerParser.defaultName(controls[0].controller);
}
return controls;
}
private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
var result = new SlotView();
result.select.onSelect.connect(function(controller:Controller) setController(value, controller));
result.control = value;
return result;
}
private function setController(value:PlayerControl, controller:Controller):Void {
switch controller {
case NONE:
case _:
for (view in slotsView.dataViews) {
if (view.control.controller.equals(controller)) {
view.control.controller = NONE;
view.select.selected = NONE;
view.control.name = null;
}
}
}
value.controller = controller;
value.name = ControllerParser.defaultName(controller);
}
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
var result = new ButtonView();
result.style = 'button${!progress.isPresetCompleted(start.level.id, value.id) ? ".active" : ""}';
result.text = value.name;
result.disabled = !progress.isPresetAvailable(start.level.id, value.id);
return result;
}
private function onPresetSelect(value:GamePreset):Void {
if (progress.isPresetAvailable(start.level.id, value.id)) {
start.state.presetId = value.id;
start.state.controls = slotsView.data;
switcher.change(GameFrame.ID, LOCAL(start));
}
}
}

View File

@@ -1,40 +1,39 @@
---
views:
- $type: haxework.view.group.VGroupView
style: container
layout.margin: 10
views:
- $type: haxework.view.form.LabelView
text: Tank'z
style: font
font.size: 100
geometry.margin.bottom: 30
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('classic')
text: Classic
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('dota')
text: DotA
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startGame('death')
text: DeathMatch
- $type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~switcher.change('record')
text: Records
- id: network
$type: haxework.view.form.ButtonView
style: button.menu
+onPress: ~startNetwork()
text: Network
- $type: haxework.view.form.LabelView
geometry.hAlign: right
geometry.vAlign: top
geometry.padding: [20, 5]
geometry.position: absolute
geometry.margin: [0, 20, 20, 0]
style: text.box
text: $r:text:version
- $type: haxework.view.group.VGroupView
style: container
views:
- id: header
$type: haxework.view.form.LabelView
style: text.header
- id: slots
$type: haxework.view.data.DataView
geometry.padding: 10
geometry.width: 100%
geometry.height: 100%
layout.hAlign: center
overflow.y: scroll
factory: ~slotViewFactory
layout:
$type: haxework.view.layout.VerticalLayout
# $type: haxework.view.layout.TailLayout
margin: 5
- $type: haxework.view.group.HGroupView
style: panel
layout.margin: 10
views:
- $type: haxework.view.SpriteView
geometry.width: 50%
- id: presets
$type: haxework.view.data.DataView
factory: ~presetViewFactory
+onDataSelect: ~onPresetSelect
layout:
$type: haxework.view.layout.HorizontalLayout
hAlign: center
margin: 5
- $type: haxework.view.SpriteView
geometry.width: 50%
- $type: haxework.view.form.ButtonView
style: button.prev
+onPress: ~switcher.change("level", start.level.packId)

View File

@@ -15,7 +15,7 @@ import ru.m.tankz.control.PlayerControl;
private function set_control(value:PlayerControl):PlayerControl {
control = value;
slotLabel.text = '${control.playerId.team}(${control.playerId.index})';
slotLabel.text = '${control.playerId.team} #${control.playerId.index}';
slotLabel.font.color = value.color;
select.selected = control.controller;
return control;

View File

@@ -50,4 +50,18 @@ import ru.m.tankz.Type;
case _: throw 'Unsupported position: ${position}';
}
}
override public function update():Void {
super.update();
if (parent != null) {
var s = Math.min(parent.width / width, parent.height / height);
if (s < 1) {
content.scaleX = content.scaleY = s;
content.x = (parent.width - width * s) / 2;
content.y = (parent.height - height * s) / 2;
} else {
content.scaleX = content.scaleY = 1;
}
}
}
}

View File

@@ -1,76 +0,0 @@
package ru.m.tankz.view.popup;
using haxe.EnumTools.EnumValueTools;
import haxework.view.form.ButtonView;
import haxework.view.data.DataView;
import haxework.view.form.LabelView;
import haxework.view.popup.PopupView;
import ru.m.tankz.config.Config;
import ru.m.tankz.control.Controller;
import ru.m.tankz.control.PlayerControl;
import ru.m.tankz.game.PackProgress;
import ru.m.tankz.Type;
import ru.m.tankz.view.common.SlotView;
private typedef Result = {
var presetId:PresetId;
var controls:Array<PlayerControl>;
}
@:template class LevelPopup extends PopupView<Result> {
private var level:LevelConfig;
private var progress:PackProgress;
@:view var name:LabelView;
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
private var humanIndex:Int = 0;
private var humanTotal:Int = 2;
public function setData(level:LevelConfig, presets:Array<GamePreset>, controls:Array<PlayerControl>, progress:PackProgress):Void {
this.level = level;
this.progress = progress;
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
presetsView.data = presets;
slotsView.data = controls;
}
private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
var result = new SlotView();
result.select.onSelect.connect(function(controller:Controller) setController(value, controller));
result.control = value;
return result;
}
private function setController(value:PlayerControl, controller:Controller):Void {
switch controller {
case NONE:
case _:
for (view in slotsView.dataViews) {
if (view.control.controller.equals(controller)) {
view.control.controller = NONE;
view.select.selected = NONE;
view.control.name = null;
}
}
}
value.controller = controller;
value.name = ControllerParser.defaultName(controller);
}
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
var result = new ButtonView();
result.style = 'button${!progress.isPresetCompleted(level.id, value.id) ? ".active" : ""}';
result.text = value.name;
result.disabled = !progress.isPresetAvailable(level.id, value.id);
return result;
}
private function onPresetSelect(value:GamePreset):Void {
if (progress.isPresetAvailable(level.id, value.id)) {
close({presetId: value.id, controls: slotsView.data});
}
}
}

View File

@@ -1,48 +0,0 @@
---
layout.hAlign: center
layout.vAlign: middle
view:
$type: haxework.view.group.VGroupView
layout.hAlign: center
geometry.width: 100%
geometry.height: 100%
# geometry.width: 400
# geometry.height: 400
geometry.margin: 10
style: window
views:
- $type: haxework.view.group.HGroupView
geometry.width: 100%
geometry.padding: 10
layout.vAlign: middle
views:
- id: name
$type: haxework.view.form.LabelView
geometry.width: 100%
geometry.margin.left: 10
layout.hAlign: left
style: text
- $type: haxework.view.form.ButtonView
style: window.close
+onPress: ~reject('close')
- id: slots
$type: haxework.view.data.DataView
geometry.padding: 10
geometry.width: 100%
geometry.height: 100%
layout.hAlign: center
overflow.y: scroll
factory: ~slotViewFactory
layout:
$type: haxework.view.layout.VerticalLayout
# $type: haxework.view.layout.TailLayout
margin: 5
- id: presets
$type: haxework.view.data.DataView
factory: ~presetViewFactory
+onDataSelect: ~onPresetSelect
layout:
$type: haxework.view.layout.HorizontalLayout
hAlign: center
margin: 5
style: panel

View File

@@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-alt-circle-left" class="svg-inline--fa fa-arrow-alt-circle-left fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 504C119 504 8 393 8 256S119 8 256 8s248 111 248 248-111 248-248 248zm116-292H256v-70.9c0-10.7-13-16.1-20.5-8.5L121.2 247.5c-4.7 4.7-4.7 12.2 0 16.9l114.3 114.9c7.6 7.6 20.5 2.2 20.5-8.5V300h116c6.6 0 12-5.4 12-12v-64c0-6.6-5.4-12-12-12z"></path></svg>

After

Width:  |  Height:  |  Size: 503 B