[Bug][UI] Fix scrolling UIs not resetting properly and add Scrollbars (#4312)
* [bug] fix scrollable elements not resetting properly * [ui] add wrap around and scrolling bar to the achievements menu * [ui] add scrollbar to the settings
This commit is contained in:
parent
605ae9e1c3
commit
51bb80cb66
|
@ -344,6 +344,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
|
||||||
super.clear();
|
super.clear();
|
||||||
this.config = null;
|
this.config = null;
|
||||||
this.optionSelectContainer.setVisible(false);
|
this.optionSelectContainer.setVisible(false);
|
||||||
|
this.scrollCursor = 0;
|
||||||
this.eraseCursor();
|
this.eraseCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
import BattleScene from "../battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import { Button } from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { Achv, achvs, getAchievementDescription } from "../system/achv";
|
import { Achv, achvs, getAchievementDescription } from "#app/system/achv";
|
||||||
import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "../system/voucher";
|
import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "#app/system/voucher";
|
||||||
import MessageUiHandler from "./message-ui-handler";
|
import MessageUiHandler from "#app/ui/message-ui-handler";
|
||||||
import { addTextObject, TextStyle } from "./text";
|
import { addTextObject, TextStyle } from "#app/ui/text";
|
||||||
import { Mode } from "./ui";
|
import { Mode } from "#app/ui/ui";
|
||||||
import { addWindow } from "./ui-theme";
|
import { addWindow } from "#app/ui/ui-theme";
|
||||||
|
import { ScrollBar } from "#app/ui/scroll-bar";
|
||||||
import { PlayerGender } from "#enums/player-gender";
|
import { PlayerGender } from "#enums/player-gender";
|
||||||
|
|
||||||
enum Page {
|
enum Page {
|
||||||
|
@ -49,6 +50,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
private vouchersTotal: number;
|
private vouchersTotal: number;
|
||||||
private currentTotal: number;
|
private currentTotal: number;
|
||||||
|
|
||||||
|
private scrollBar: ScrollBar;
|
||||||
private scrollCursor: number;
|
private scrollCursor: number;
|
||||||
private cursorObj: Phaser.GameObjects.NineSlice | null;
|
private cursorObj: Phaser.GameObjects.NineSlice | null;
|
||||||
private currentPage: Page;
|
private currentPage: Page;
|
||||||
|
@ -91,7 +93,10 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
this.iconsBg = addWindow(this.scene, 0, this.headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - this.headerBg.height - 68);
|
this.iconsBg = addWindow(this.scene, 0, this.headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - this.headerBg.height - 68);
|
||||||
this.iconsBg.setOrigin(0, 0);
|
this.iconsBg.setOrigin(0, 0);
|
||||||
|
|
||||||
this.iconsContainer = this.scene.add.container(6, this.headerBg.height + 6);
|
const yOffset = 6;
|
||||||
|
this.scrollBar = new ScrollBar(this.scene, this.iconsBg.width - 9, this.iconsBg.y + yOffset, 4, this.iconsBg.height - yOffset * 2, this.ROWS);
|
||||||
|
|
||||||
|
this.iconsContainer = this.scene.add.container(5, this.headerBg.height + 8);
|
||||||
|
|
||||||
this.icons = [];
|
this.icons = [];
|
||||||
|
|
||||||
|
@ -148,6 +153,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
this.mainContainer.add(this.headerText);
|
this.mainContainer.add(this.headerText);
|
||||||
this.mainContainer.add(this.headerActionText);
|
this.mainContainer.add(this.headerActionText);
|
||||||
this.mainContainer.add(this.iconsBg);
|
this.mainContainer.add(this.iconsBg);
|
||||||
|
this.mainContainer.add(this.scrollBar);
|
||||||
this.mainContainer.add(this.iconsContainer);
|
this.mainContainer.add(this.iconsContainer);
|
||||||
this.mainContainer.add(titleBg);
|
this.mainContainer.add(titleBg);
|
||||||
this.mainContainer.add(this.titleText);
|
this.mainContainer.add(this.titleText);
|
||||||
|
@ -162,6 +168,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
|
|
||||||
this.currentPage = Page.ACHIEVEMENTS;
|
this.currentPage = Page.ACHIEVEMENTS;
|
||||||
this.setCursor(0);
|
this.setCursor(0);
|
||||||
|
this.setScrollCursor(0);
|
||||||
|
|
||||||
this.mainContainer.setVisible(false);
|
this.mainContainer.setVisible(false);
|
||||||
}
|
}
|
||||||
|
@ -175,6 +182,8 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
this.mainContainer.setVisible(true);
|
this.mainContainer.setVisible(true);
|
||||||
this.setCursor(0);
|
this.setCursor(0);
|
||||||
this.setScrollCursor(0);
|
this.setScrollCursor(0);
|
||||||
|
this.scrollBar.setTotalRows(Math.ceil(this.currentTotal / this.COLS));
|
||||||
|
this.scrollBar.setScrollCursor(0);
|
||||||
|
|
||||||
this.getUi().moveTo(this.mainContainer, this.getUi().length - 1);
|
this.getUi().moveTo(this.mainContainer, this.getUi().length - 1);
|
||||||
|
|
||||||
|
@ -224,6 +233,8 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
this.updateAchvIcons();
|
this.updateAchvIcons();
|
||||||
}
|
}
|
||||||
this.setCursor(0, true);
|
this.setCursor(0, true);
|
||||||
|
this.scrollBar.setTotalRows(Math.ceil(this.currentTotal / this.COLS));
|
||||||
|
this.scrollBar.setScrollCursor(0);
|
||||||
this.mainContainer.update();
|
this.mainContainer.update();
|
||||||
}
|
}
|
||||||
if (button === Button.CANCEL) {
|
if (button === Button.CANCEL) {
|
||||||
|
@ -237,32 +248,44 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
if (this.cursor < this.COLS) {
|
if (this.cursor < this.COLS) {
|
||||||
if (this.scrollCursor) {
|
if (this.scrollCursor) {
|
||||||
success = this.setScrollCursor(this.scrollCursor - 1);
|
success = this.setScrollCursor(this.scrollCursor - 1);
|
||||||
|
} else {
|
||||||
|
// Wrap around to the last row
|
||||||
|
success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS);
|
||||||
|
let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS;
|
||||||
|
if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS -1) {
|
||||||
|
newCursorIndex -= this.COLS;
|
||||||
|
}
|
||||||
|
success = success && this.setCursor(newCursorIndex);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
success = this.setCursor(this.cursor - this.COLS);
|
success = this.setCursor(this.cursor - this.COLS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Button.DOWN:
|
case Button.DOWN:
|
||||||
const canMoveDown = (this.cursor + itemOffset) + this.COLS < this.currentTotal;
|
const canMoveDown = itemOffset + 1 < this.currentTotal;
|
||||||
if (rowIndex >= this.ROWS - 1) {
|
if (rowIndex >= this.ROWS - 1) {
|
||||||
if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) {
|
if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) {
|
||||||
|
// scroll down one row
|
||||||
success = this.setScrollCursor(this.scrollCursor + 1);
|
success = this.setScrollCursor(this.scrollCursor + 1);
|
||||||
|
} else {
|
||||||
|
// wrap back to the first row
|
||||||
|
success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS);
|
||||||
}
|
}
|
||||||
} else if (canMoveDown) {
|
} else if (canMoveDown) {
|
||||||
success = this.setCursor(this.cursor + this.COLS);
|
success = this.setCursor(Math.min(this.cursor + this.COLS, this.currentTotal - itemOffset - 1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Button.LEFT:
|
case Button.LEFT:
|
||||||
if (!this.cursor && this.scrollCursor) {
|
if (this.cursor % this.COLS === 0) {
|
||||||
success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (this.COLS - 1));
|
success = this.setCursor(Math.min(this.cursor + this.COLS - 1, this.currentTotal - itemOffset - 1));
|
||||||
} else if (this.cursor) {
|
} else {
|
||||||
success = this.setCursor(this.cursor - 1);
|
success = this.setCursor(this.cursor - 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Button.RIGHT:
|
case Button.RIGHT:
|
||||||
if (this.cursor + 1 === this.ROWS * this.COLS && this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS) {
|
if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) {
|
||||||
success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (this.COLS - 1));
|
success = this.setCursor(this.cursor - this.cursor % this.COLS);
|
||||||
} else if (this.cursor + itemOffset < this.currentTotal - 1) {
|
} else {
|
||||||
success = this.setCursor(this.cursor + 1);
|
success = this.setCursor(this.cursor + 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -315,15 +338,22 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scrollCursor = scrollCursor;
|
this.scrollCursor = scrollCursor;
|
||||||
|
this.scrollBar.setScrollCursor(this.scrollCursor);
|
||||||
|
|
||||||
|
// Cursor cannot go farther than the last element in the list
|
||||||
|
const maxCursor = Math.min(this.cursor, this.currentTotal - this.scrollCursor * this.COLS - 1);
|
||||||
|
if (maxCursor !== this.cursor) {
|
||||||
|
this.setCursor(maxCursor);
|
||||||
|
}
|
||||||
|
|
||||||
switch (this.currentPage) {
|
switch (this.currentPage) {
|
||||||
case Page.ACHIEVEMENTS:
|
case Page.ACHIEVEMENTS:
|
||||||
this.updateAchvIcons();
|
this.updateAchvIcons();
|
||||||
this.showAchv(achvs[Object.keys(achvs)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(achvs).length - 1)]]);
|
this.showAchv(achvs[Object.keys(achvs)[this.cursor + this.scrollCursor * this.COLS]]);
|
||||||
break;
|
break;
|
||||||
case Page.VOUCHERS:
|
case Page.VOUCHERS:
|
||||||
this.updateVoucherIcons();
|
this.updateVoucherIcons();
|
||||||
this.showVoucher(vouchers[Object.keys(vouchers)[Math.min(this.cursor + this.scrollCursor * this.COLS, Object.values(vouchers).length - 1)]]);
|
this.showVoucher(vouchers[Object.keys(vouchers)[this.cursor + this.scrollCursor * this.COLS]]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -411,6 +441,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
|
||||||
super.clear();
|
super.clear();
|
||||||
this.currentPage = Page.ACHIEVEMENTS;
|
this.currentPage = Page.ACHIEVEMENTS;
|
||||||
this.mainContainer.setVisible(false);
|
this.mainContainer.setVisible(false);
|
||||||
|
this.setScrollCursor(0);
|
||||||
this.eraseCursor();
|
this.eraseCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,65 @@
|
||||||
|
/**
|
||||||
|
* A vertical scrollbar element that resizes dynamically based on the current scrolling
|
||||||
|
* and number of elements that can be shown on screen
|
||||||
|
*/
|
||||||
export class ScrollBar extends Phaser.GameObjects.Container {
|
export class ScrollBar extends Phaser.GameObjects.Container {
|
||||||
private bg: Phaser.GameObjects.Image;
|
private bg: Phaser.GameObjects.NineSlice;
|
||||||
private handleBody: Phaser.GameObjects.Rectangle;
|
private handleBody: Phaser.GameObjects.Rectangle;
|
||||||
private handleBottom: Phaser.GameObjects.Image;
|
private handleBottom: Phaser.GameObjects.NineSlice;
|
||||||
private pages: number;
|
private currentRow: number;
|
||||||
private page: number;
|
private totalRows: number;
|
||||||
|
private maxRows: number;
|
||||||
|
|
||||||
constructor(scene: Phaser.Scene, x: number, y: number, pages: number) {
|
/**
|
||||||
|
* @param scene the current scene
|
||||||
|
* @param x the scrollbar's x position (origin: top left)
|
||||||
|
* @param y the scrollbar's y position (origin: top left)
|
||||||
|
* @param width the scrollbar's width
|
||||||
|
* @param height the scrollbar's height
|
||||||
|
* @param maxRows the maximum number of rows that can be shown at once
|
||||||
|
*/
|
||||||
|
constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number, maxRows: number) {
|
||||||
super(scene, x, y);
|
super(scene, x, y);
|
||||||
|
|
||||||
this.bg = scene.add.image(0, 0, "scroll_bar");
|
this.maxRows = maxRows;
|
||||||
|
|
||||||
|
const borderSize = 2;
|
||||||
|
width = Math.max(width, 4);
|
||||||
|
|
||||||
|
this.bg = scene.add.nineslice(0, 0, "scroll_bar", undefined, width, height, borderSize, borderSize, borderSize, borderSize);
|
||||||
this.bg.setOrigin(0, 0);
|
this.bg.setOrigin(0, 0);
|
||||||
this.add(this.bg);
|
this.add(this.bg);
|
||||||
|
|
||||||
this.handleBody = scene.add.rectangle(1, 1, 3, 4, 0xaaaaaa);
|
this.handleBody = scene.add.rectangle(1, 1, width - 2, 4, 0xaaaaaa);
|
||||||
this.handleBody.setOrigin(0, 0);
|
this.handleBody.setOrigin(0, 0);
|
||||||
this.add(this.handleBody);
|
this.add(this.handleBody);
|
||||||
|
|
||||||
this.handleBottom = scene.add.image(1, 1, "scroll_bar_handle");
|
this.handleBottom = scene.add.nineslice(1, 1, "scroll_bar_handle", undefined, width - 2, 2, 2, 0, 0, 0);
|
||||||
this.handleBottom.setOrigin(0, 0);
|
this.handleBottom.setOrigin(0, 0);
|
||||||
this.add(this.handleBottom);
|
this.add(this.handleBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
setPage(page: number): void {
|
/**
|
||||||
this.page = page;
|
* Set the current row that is displayed
|
||||||
this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.pages * page;
|
* Moves the bar handle up or down accordingly
|
||||||
|
* @param scrollCursor how many times the view was scrolled down
|
||||||
|
*/
|
||||||
|
setScrollCursor(scrollCursor: number): void {
|
||||||
|
this.currentRow = scrollCursor;
|
||||||
|
this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows * this.currentRow;
|
||||||
this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight;
|
this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPages(pages: number): void {
|
/**
|
||||||
this.pages = pages;
|
* Set the total number of rows to display
|
||||||
this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * 9 / this.pages;
|
* If it's smaller than the maximum number of rows on screen the bar will get hidden
|
||||||
|
* Otherwise the scrollbar handle gets resized based on the ratio to the maximum number of rows
|
||||||
|
* @param rows how many rows of data there are in total
|
||||||
|
*/
|
||||||
|
setTotalRows(rows: number): void {
|
||||||
|
this.totalRows = rows;
|
||||||
|
this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows / this.totalRows;
|
||||||
|
|
||||||
this.setVisible(this.pages > 9);
|
this.setVisible(this.totalRows > this.maxRows);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import UiHandler from "../ui-handler";
|
import UiHandler from "#app/ui/ui-handler";
|
||||||
import BattleScene from "../../battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import {Mode} from "../ui";
|
import { Mode } from "#app/ui/ui";
|
||||||
import {InterfaceConfig} from "../../inputs-controller";
|
import { InterfaceConfig } from "#app/inputs-controller";
|
||||||
import {addWindow} from "../ui-theme";
|
import { addWindow } from "#app/ui/ui-theme";
|
||||||
import {addTextObject, TextStyle} from "../text";
|
import { addTextObject, TextStyle } from "#app/ui/text";
|
||||||
|
import { ScrollBar } from "#app/ui/scroll-bar";
|
||||||
import { getIconWithSettingName } from "#app/configs/inputs/configHandler";
|
import { getIconWithSettingName } from "#app/configs/inputs/configHandler";
|
||||||
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
|
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
|
||||||
import { Device } from "#enums/devices";
|
import { Device } from "#enums/devices";
|
||||||
|
@ -19,7 +20,7 @@ export interface LayoutConfig {
|
||||||
inputsIcons: InputsIcons;
|
inputsIcons: InputsIcons;
|
||||||
settingLabels: Phaser.GameObjects.Text[];
|
settingLabels: Phaser.GameObjects.Text[];
|
||||||
optionValueLabels: Phaser.GameObjects.Text[][];
|
optionValueLabels: Phaser.GameObjects.Text[][];
|
||||||
optionCursors: integer[];
|
optionCursors: number[];
|
||||||
keys: string[];
|
keys: string[];
|
||||||
bindingSettings: Array<String>;
|
bindingSettings: Array<String>;
|
||||||
}
|
}
|
||||||
|
@ -31,8 +32,9 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
protected optionsContainer: Phaser.GameObjects.Container;
|
protected optionsContainer: Phaser.GameObjects.Container;
|
||||||
protected navigationContainer: NavigationMenu;
|
protected navigationContainer: NavigationMenu;
|
||||||
|
|
||||||
protected scrollCursor: integer;
|
protected scrollBar: ScrollBar;
|
||||||
protected optionCursors: integer[];
|
protected scrollCursor: number;
|
||||||
|
protected optionCursors: number[];
|
||||||
protected cursorObj: Phaser.GameObjects.NineSlice | null;
|
protected cursorObj: Phaser.GameObjects.NineSlice | null;
|
||||||
|
|
||||||
protected optionsBg: Phaser.GameObjects.NineSlice;
|
protected optionsBg: Phaser.GameObjects.NineSlice;
|
||||||
|
@ -65,7 +67,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
protected device: Device;
|
protected device: Device;
|
||||||
|
|
||||||
abstract saveSettingToLocalStorage(setting, cursor): void;
|
abstract saveSettingToLocalStorage(setting, cursor): void;
|
||||||
abstract setSetting(scene: BattleScene, setting, value: integer): boolean;
|
abstract setSetting(scene: BattleScene, setting, value: number): boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for the AbstractSettingsUiHandler.
|
* Constructor for the AbstractSettingsUiHandler.
|
||||||
|
@ -241,7 +243,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
|
|
||||||
// Calculate the total available space for placing option labels next to their setting label
|
// Calculate the total available space for placing option labels next to their setting label
|
||||||
// We reserve space for the setting label and then distribute the remaining space evenly
|
// We reserve space for the setting label and then distribute the remaining space evenly
|
||||||
const totalSpace = (300 - labelWidth) - totalWidth / 6;
|
const totalSpace = (297 - labelWidth) - totalWidth / 6;
|
||||||
// Calculate the spacing between options based on the available space divided by the number of gaps between labels
|
// Calculate the spacing between options based on the available space divided by the number of gaps between labels
|
||||||
const optionSpacing = Math.floor(totalSpace / (optionValueLabels[s].length - 1));
|
const optionSpacing = Math.floor(totalSpace / (optionValueLabels[s].length - 1));
|
||||||
|
|
||||||
|
@ -269,6 +271,11 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
// Add the options container to the overall settings container to be displayed in the UI.
|
// Add the options container to the overall settings container to be displayed in the UI.
|
||||||
this.settingsContainer.add(optionsContainer);
|
this.settingsContainer.add(optionsContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add vertical scrollbar
|
||||||
|
this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay);
|
||||||
|
this.settingsContainer.add(this.scrollBar);
|
||||||
|
|
||||||
// Add the settings container to the UI.
|
// Add the settings container to the UI.
|
||||||
ui.add(this.settingsContainer);
|
ui.add(this.settingsContainer);
|
||||||
|
|
||||||
|
@ -413,6 +420,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
this.optionCursors = layout.optionCursors;
|
this.optionCursors = layout.optionCursors;
|
||||||
this.inputsIcons = layout.inputsIcons;
|
this.inputsIcons = layout.inputsIcons;
|
||||||
this.bindingSettings = layout.bindingSettings;
|
this.bindingSettings = layout.bindingSettings;
|
||||||
|
this.scrollBar.setTotalRows(layout.settingLabels.length);
|
||||||
|
this.scrollBar.setScrollCursor(0);
|
||||||
|
|
||||||
// Return true indicating the layout was successfully applied.
|
// Return true indicating the layout was successfully applied.
|
||||||
return true;
|
return true;
|
||||||
|
@ -538,7 +547,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
* @param cursor - The cursor position to set.
|
* @param cursor - The cursor position to set.
|
||||||
* @returns `true` if the cursor was set successfully.
|
* @returns `true` if the cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setCursor(cursor: integer): boolean {
|
setCursor(cursor: number): boolean {
|
||||||
const ret = super.setCursor(cursor);
|
const ret = super.setCursor(cursor);
|
||||||
// If the optionsContainer is not initialized, return the result from the parent class directly.
|
// If the optionsContainer is not initialized, return the result from the parent class directly.
|
||||||
if (!this.optionsContainer) {
|
if (!this.optionsContainer) {
|
||||||
|
@ -547,7 +556,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
|
|
||||||
// Check if the cursor object exists, if not, create it.
|
// Check if the cursor object exists, if not, create it.
|
||||||
if (!this.cursorObj) {
|
if (!this.cursorObj) {
|
||||||
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1);
|
const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible? 16 : 10);
|
||||||
|
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1);
|
||||||
this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner.
|
this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner.
|
||||||
this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container.
|
this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container.
|
||||||
}
|
}
|
||||||
|
@ -564,7 +574,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
* @param scrollCursor - The scroll cursor position to set.
|
* @param scrollCursor - The scroll cursor position to set.
|
||||||
* @returns `true` if the scroll cursor was set successfully.
|
* @returns `true` if the scroll cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setScrollCursor(scrollCursor: integer): boolean {
|
setScrollCursor(scrollCursor: number): boolean {
|
||||||
// Check if the new scroll position is the same as the current one; if so, do not update.
|
// Check if the new scroll position is the same as the current one; if so, do not update.
|
||||||
if (scrollCursor === this.scrollCursor) {
|
if (scrollCursor === this.scrollCursor) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -572,6 +582,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
|
|
||||||
// Update the internal scroll cursor state
|
// Update the internal scroll cursor state
|
||||||
this.scrollCursor = scrollCursor;
|
this.scrollCursor = scrollCursor;
|
||||||
|
this.scrollBar.setScrollCursor(this.scrollCursor);
|
||||||
|
|
||||||
// Apply the new scroll position to the settings UI.
|
// Apply the new scroll position to the settings UI.
|
||||||
this.updateSettingsScroll();
|
this.updateSettingsScroll();
|
||||||
|
@ -590,7 +601,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler
|
||||||
* @param save - Whether to save the setting to local storage.
|
* @param save - Whether to save the setting to local storage.
|
||||||
* @returns `true` if the option cursor was set successfully.
|
* @returns `true` if the option cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean {
|
setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean {
|
||||||
// Retrieve the specific setting using the settingIndex from the settingDevice enumeration.
|
// Retrieve the specific setting using the settingIndex from the settingDevice enumeration.
|
||||||
const setting = this.setting[Object.keys(this.setting)[settingIndex]];
|
const setting = this.setting[Object.keys(this.setting)[settingIndex]];
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import BattleScene from "../../battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
import { hasTouchscreen, isMobile } from "../../touch-controls";
|
import { hasTouchscreen, isMobile } from "#app/touch-controls";
|
||||||
import { TextStyle, addTextObject } from "../text";
|
import { TextStyle, addTextObject } from "#app/ui/text";
|
||||||
import { Mode } from "../ui";
|
import { Mode } from "#app/ui/ui";
|
||||||
import UiHandler from "../ui-handler";
|
import UiHandler from "#app/ui/ui-handler";
|
||||||
import { addWindow } from "../ui-theme";
|
import { addWindow } from "#app/ui/ui-theme";
|
||||||
|
import { ScrollBar } from "#app/ui/scroll-bar";
|
||||||
import { Button } from "#enums/buttons";
|
import { Button } from "#enums/buttons";
|
||||||
import { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler";
|
import { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler";
|
||||||
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
|
import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu";
|
||||||
|
@ -19,11 +20,12 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
private optionsContainer: Phaser.GameObjects.Container;
|
private optionsContainer: Phaser.GameObjects.Container;
|
||||||
private navigationContainer: NavigationMenu;
|
private navigationContainer: NavigationMenu;
|
||||||
|
|
||||||
private scrollCursor: integer;
|
private scrollCursor: number;
|
||||||
|
private scrollBar: ScrollBar;
|
||||||
|
|
||||||
private optionsBg: Phaser.GameObjects.NineSlice;
|
private optionsBg: Phaser.GameObjects.NineSlice;
|
||||||
|
|
||||||
private optionCursors: integer[];
|
private optionCursors: number[];
|
||||||
|
|
||||||
private settingLabels: Phaser.GameObjects.Text[];
|
private settingLabels: Phaser.GameObjects.Text[];
|
||||||
private optionValueLabels: Phaser.GameObjects.Text[][];
|
private optionValueLabels: Phaser.GameObjects.Text[][];
|
||||||
|
@ -117,7 +119,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
|
|
||||||
const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8);
|
const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8);
|
||||||
|
|
||||||
const totalSpace = (300 - labelWidth) - totalWidth / 6;
|
const totalSpace = (297 - labelWidth) - totalWidth / 6;
|
||||||
const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1));
|
const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1));
|
||||||
|
|
||||||
let xOffset = 0;
|
let xOffset = 0;
|
||||||
|
@ -130,7 +132,11 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
|
|
||||||
this.optionCursors = this.settings.map(setting => setting.default);
|
this.optionCursors = this.settings.map(setting => setting.default);
|
||||||
|
|
||||||
|
this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay);
|
||||||
|
this.scrollBar.setTotalRows(this.settings.length);
|
||||||
|
|
||||||
this.settingsContainer.add(this.optionsBg);
|
this.settingsContainer.add(this.optionsBg);
|
||||||
|
this.settingsContainer.add(this.scrollBar);
|
||||||
this.settingsContainer.add(this.navigationContainer);
|
this.settingsContainer.add(this.navigationContainer);
|
||||||
this.settingsContainer.add(actionsBg);
|
this.settingsContainer.add(actionsBg);
|
||||||
this.settingsContainer.add(this.optionsContainer);
|
this.settingsContainer.add(this.optionsContainer);
|
||||||
|
@ -186,6 +192,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
|
|
||||||
this.settingsContainer.setVisible(true);
|
this.settingsContainer.setVisible(true);
|
||||||
this.setCursor(0);
|
this.setCursor(0);
|
||||||
|
this.setScrollCursor(0);
|
||||||
|
|
||||||
this.getUi().moveTo(this.settingsContainer, this.getUi().length - 1);
|
this.getUi().moveTo(this.settingsContainer, this.getUi().length - 1);
|
||||||
|
|
||||||
|
@ -301,11 +308,12 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
* @param cursor - The cursor position to set.
|
* @param cursor - The cursor position to set.
|
||||||
* @returns `true` if the cursor was set successfully.
|
* @returns `true` if the cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setCursor(cursor: integer): boolean {
|
setCursor(cursor: number): boolean {
|
||||||
const ret = super.setCursor(cursor);
|
const ret = super.setCursor(cursor);
|
||||||
|
|
||||||
if (!this.cursorObj) {
|
if (!this.cursorObj) {
|
||||||
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1);
|
const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible? 16 : 10);
|
||||||
|
this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1);
|
||||||
this.cursorObj.setOrigin(0, 0);
|
this.cursorObj.setOrigin(0, 0);
|
||||||
this.optionsContainer.add(this.cursorObj);
|
this.optionsContainer.add(this.cursorObj);
|
||||||
}
|
}
|
||||||
|
@ -323,7 +331,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
* @param save - Whether to save the setting to local storage.
|
* @param save - Whether to save the setting to local storage.
|
||||||
* @returns `true` if the option cursor was set successfully.
|
* @returns `true` if the option cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean {
|
setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean {
|
||||||
const setting = this.settings[settingIndex];
|
const setting = this.settings[settingIndex];
|
||||||
|
|
||||||
if (setting.key === SettingKeys.Touch_Controls && cursor && hasTouchscreen() && isMobile()) {
|
if (setting.key === SettingKeys.Touch_Controls && cursor && hasTouchscreen() && isMobile()) {
|
||||||
|
@ -359,12 +367,13 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
* @param scrollCursor - The scroll cursor position to set.
|
* @param scrollCursor - The scroll cursor position to set.
|
||||||
* @returns `true` if the scroll cursor was set successfully.
|
* @returns `true` if the scroll cursor was set successfully.
|
||||||
*/
|
*/
|
||||||
setScrollCursor(scrollCursor: integer): boolean {
|
setScrollCursor(scrollCursor: number): boolean {
|
||||||
if (scrollCursor === this.scrollCursor) {
|
if (scrollCursor === this.scrollCursor) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scrollCursor = scrollCursor;
|
this.scrollCursor = scrollCursor;
|
||||||
|
this.scrollBar.setScrollCursor(this.scrollCursor);
|
||||||
|
|
||||||
this.updateSettingsScroll();
|
this.updateSettingsScroll();
|
||||||
|
|
||||||
|
@ -394,6 +403,7 @@ export default class AbstractSettingsUiHandler extends UiHandler {
|
||||||
clear() {
|
clear() {
|
||||||
super.clear();
|
super.clear();
|
||||||
this.settingsContainer.setVisible(false);
|
this.settingsContainer.setVisible(false);
|
||||||
|
this.setScrollCursor(0);
|
||||||
this.eraseCursor();
|
this.eraseCursor();
|
||||||
this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar);
|
this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar);
|
||||||
if (this.reloadRequired) {
|
if (this.reloadRequired) {
|
||||||
|
|
|
@ -627,7 +627,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||||
|
|
||||||
const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115
|
const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115
|
||||||
|
|
||||||
this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 0);
|
this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 5, starterContainerWindow.height - 6, 9);
|
||||||
|
|
||||||
starterBoxContainer.add(this.starterSelectScrollBar);
|
starterBoxContainer.add(this.starterSelectScrollBar);
|
||||||
|
|
||||||
|
@ -2540,8 +2540,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.starterSelectScrollBar.setPages(Math.max(Math.ceil(this.filteredStarterContainers.length / 9), 1));
|
this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredStarterContainers.length / 9), 1));
|
||||||
this.starterSelectScrollBar.setPage(0);
|
this.starterSelectScrollBar.setScrollCursor(0);
|
||||||
|
|
||||||
// sort
|
// sort
|
||||||
const sort = this.filterBar.getVals(DropDownColumn.SORT)[0];
|
const sort = this.filterBar.getVals(DropDownColumn.SORT)[0];
|
||||||
|
@ -2576,7 +2576,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||||
const onScreenFirstIndex = this.scrollCursor * maxColumns;
|
const onScreenFirstIndex = this.scrollCursor * maxColumns;
|
||||||
const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns -1);
|
const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns -1);
|
||||||
|
|
||||||
this.starterSelectScrollBar.setPage(this.scrollCursor);
|
this.starterSelectScrollBar.setScrollCursor(this.scrollCursor);
|
||||||
|
|
||||||
let pokerusCursorIndex = 0;
|
let pokerusCursorIndex = 0;
|
||||||
this.filteredStarterContainers.forEach((container, i) => {
|
this.filteredStarterContainers.forEach((container, i) => {
|
||||||
|
|
Loading…
Reference in New Issue