|
|
|
//=============================================================================
|
|
|
|
// SaltedFish Plugins - Window Scroll Command
|
|
|
|
// SF_WindowScrollCommand.js
|
|
|
|
// License: MIT
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
var Imported = Imported || {};
|
|
|
|
Imported.SF_WindowScrollCommand = true;
|
|
|
|
|
|
|
|
var SF_Plugins = SF_Plugins || {};
|
|
|
|
SF_Plugins.SF_WindowScrollCommand = SF_Plugins.SF_WindowScrollCommand || {};
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.version = 1.0;
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
/*:
|
|
|
|
* @plugindesc v1.0 Allows you to scroll text in selected commands.
|
|
|
|
* @author SaltedFish
|
|
|
|
*
|
|
|
|
* @help
|
|
|
|
* ============================================================================
|
|
|
|
* Introduction
|
|
|
|
* ============================================================================
|
|
|
|
*
|
|
|
|
* This plugin allows you to scroll text in selected commands.
|
|
|
|
* As a dependent library.
|
|
|
|
*/
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
// Window for Arrow
|
|
|
|
//=============================================================================
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window_initialize = Window.prototype.initialize;
|
|
|
|
Window.prototype.initialize = function () {
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window_initialize.call(this);
|
|
|
|
|
|
|
|
this.leftArrowVisible = false;
|
|
|
|
this.rightArrowVisible = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__createAllParts = Window.prototype._createAllParts;
|
|
|
|
Window.prototype._createAllParts = function () {
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__createAllParts.call(this);
|
|
|
|
|
|
|
|
var index = this.getChildIndex(this._downArrowSprite);
|
|
|
|
this._leftArrowSprite = new Sprite();
|
|
|
|
this._rightArrowSprite = new Sprite();
|
|
|
|
this.addChildAt(this._leftArrowSprite, index);
|
|
|
|
this.addChildAt(this._rightArrowSprite, index);
|
|
|
|
};
|
|
|
|
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__refreshArrows = Window.prototype._refreshArrows;
|
|
|
|
Window.prototype._refreshArrows = function () {
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__refreshArrows.call(this);
|
|
|
|
var w = this._width;
|
|
|
|
var h = this._height;
|
|
|
|
var p = 24;
|
|
|
|
var q = p / 2;
|
|
|
|
var sx = 96 + p;
|
|
|
|
var sy = 0 + p;
|
|
|
|
|
|
|
|
this._leftArrowSprite.bitmap = this._windowskin;
|
|
|
|
this._leftArrowSprite.anchor.x = 0.5;
|
|
|
|
this._leftArrowSprite.anchor.y = 0.5;
|
|
|
|
this._leftArrowSprite.setFrame(sx, sy + q, q, p);
|
|
|
|
this._leftArrowSprite.move(q, h / 2);
|
|
|
|
|
|
|
|
this._rightArrowSprite.bitmap = this._windowskin;
|
|
|
|
this._rightArrowSprite.anchor.x = 0.5;
|
|
|
|
this._rightArrowSprite.anchor.y = 0.5;
|
|
|
|
this._rightArrowSprite.setFrame(sx + p + q, sy + q, q, p);
|
|
|
|
this._rightArrowSprite.move(w - q, h / 2);
|
|
|
|
};
|
|
|
|
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__updateArrows = Window.prototype._updateArrows;
|
|
|
|
Window.prototype._updateArrows = function () {
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window__updateArrows.call(this);
|
|
|
|
this._leftArrowSprite.visible = this.isOpen() && this.leftArrowVisible;
|
|
|
|
this._rightArrowSprite.visible = this.isOpen() && this.rightArrowVisible;
|
|
|
|
};
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
Window_Command.prototype.commandExt = function (index) {
|
|
|
|
return this._list[index].ext;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Base.prototype.isMouseInsideFrame = function () {
|
|
|
|
var x = this.canvasToLocalX(TouchInput._mouseOverX);
|
|
|
|
var y = this.canvasToLocalY(TouchInput._mouseOverY);
|
|
|
|
return x >= 0 && y >= 0 && x < this.width && y < this.height;
|
|
|
|
};
|
|
|
|
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window_Selectable_processWheel = Window_Selectable.prototype.processWheel;
|
|
|
|
Window_Selectable.prototype.processWheel = function () {
|
|
|
|
if (this.isOpenAndActive() && this.isMouseInsideFrame()) {
|
|
|
|
SF_Plugins.SF_WindowScrollCommand.Window_Selectable_processWheel.call(this);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Base.prototype.measureTextHeight = function (text) {
|
|
|
|
var textState = { index: 0 };
|
|
|
|
textState.text = this.convertEscapeCharacters(text);
|
|
|
|
this.resetFontSettings();
|
|
|
|
return this.calcTextHeight(textState, true);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Base.prototype.isOpenAndActive = function () {
|
|
|
|
return this.isOpen() && this.active;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Base.prototype.isTouchedInsideFrame = function () {
|
|
|
|
var x = this.canvasToLocalX(TouchInput.x);
|
|
|
|
var y = this.canvasToLocalY(TouchInput.y);
|
|
|
|
return x >= 0 && y >= 0 && x < this.width && y < this.height;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* Each Command Bitmap need Scroll
|
|
|
|
* -------------------------------------------------------------------------------------
|
|
|
|
* Empty Bitmap(this.contentsWidth()) | Text Bitmap | Empty Bitmap(this.contentsWidth())
|
|
|
|
* -------------------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
function Window_ScrollCommand() {
|
|
|
|
this.initialize.apply(this, arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype = Object.create(Window_Command.prototype);
|
|
|
|
Window_ScrollCommand.prototype.constructor = Window_ScrollCommand;
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.initialize = function () {
|
|
|
|
this._need_scroll = false;
|
|
|
|
this._commands_bitmap = [];
|
|
|
|
this._commands_bitmap_offset = [];
|
|
|
|
this._commands_need_scroll = [];
|
|
|
|
this._offset_threshold = [];
|
|
|
|
Window_Command.prototype.initialize.call(this, 0, 0);
|
|
|
|
};
|
|
|
|
|
|
|
|
// return width of text
|
|
|
|
Window_ScrollCommand.prototype.drawItemContent = function (index) {
|
|
|
|
this.resetTextColor();
|
|
|
|
this.changePaintOpacity(this.isCommandEnabled(index));
|
|
|
|
return this.drawTextEx(this.commandName(index), this.contentsWidth(), 0);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.drawItem = function (index) {
|
|
|
|
if (this._commands_bitmap[index] == undefined) {
|
|
|
|
this._commands_bitmap[index] = new Bitmap(this.itemTextRectWidth(index), this.lineHeight());
|
|
|
|
var bitmap = this._commands_bitmap[index];
|
|
|
|
this._commands_bitmap_offset[index] = 0;
|
|
|
|
|
|
|
|
var tmp_content = this.contents;
|
|
|
|
this.contents = bitmap;
|
|
|
|
var text_width = this.drawItemContent(index);
|
|
|
|
if (text_width > bitmap.width) {
|
|
|
|
this._commands_need_scroll[index] = true;
|
|
|
|
this._commands_bitmap_offset[index] = this.contentsWidth();
|
|
|
|
} else {
|
|
|
|
this._commands_need_scroll[index] = false;
|
|
|
|
this._commands_bitmap_offset[index] = this.contentsWidth();
|
|
|
|
}
|
|
|
|
this.contents.clear();
|
|
|
|
this.contents.resize(text_width + this.contentsWidth() * 2, this.lineHeight());
|
|
|
|
this._offset_threshold[index] = text_width + this.contentsWidth();
|
|
|
|
this.drawItemContent(index);
|
|
|
|
this.contents = tmp_content;
|
|
|
|
}
|
|
|
|
|
|
|
|
var rect = this.itemRectForText(index);
|
|
|
|
var offset_x = this._commands_bitmap_offset[index];
|
|
|
|
this.contents.blt(
|
|
|
|
this._commands_bitmap[index],
|
|
|
|
offset_x,
|
|
|
|
0,
|
|
|
|
this.itemTextRectWidth(index),
|
|
|
|
rect.height,
|
|
|
|
rect.x,
|
|
|
|
rect.y
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.itemTextRectWidth = function (index) {
|
|
|
|
return this.itemRectForText(index).width;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.select = function (index) {
|
|
|
|
//var old_index = this.index();
|
|
|
|
Window_Command.prototype.select.call(this, index);
|
|
|
|
if (index >= 0 && index < this.maxItems()) {
|
|
|
|
this._need_scroll = this._commands_need_scroll[index];
|
|
|
|
//this._commands_bitmap_offset[old_index] = this.contentsWidth();
|
|
|
|
//this.redrawItem(old_index);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.updateSelected = function () {
|
|
|
|
var index = this.index();
|
|
|
|
if (index >= 0 && index < this.maxItems()) {
|
|
|
|
this._commands_bitmap_offset[index] += 1;
|
|
|
|
if (this._commands_bitmap_offset[index] > this._offset_threshold[index]) {
|
|
|
|
this._commands_bitmap_offset[index] = 0;
|
|
|
|
}
|
|
|
|
this.redrawItem(index);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.update = function () {
|
|
|
|
Window_Command.prototype.update.call(this);
|
|
|
|
if (this.isOpenAndActive() && this._need_scroll) {
|
|
|
|
this.updateSelected();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollCommand.prototype.refresh = function () {
|
|
|
|
this._commands_bitmap = [];
|
|
|
|
this._commands_bitmap_offset = [];
|
|
|
|
this._commands_need_scroll = [];
|
|
|
|
this._offset_threshold = [];
|
|
|
|
this._need_scroll = false;
|
|
|
|
Window_Command.prototype.refresh.call(this);
|
|
|
|
};
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
//=============================================================================
|
|
|
|
// Window_ScrollHelp
|
|
|
|
//=============================================================================
|
|
|
|
function Window_ScrollHelp() {
|
|
|
|
this.initialize.apply(this, arguments);
|
|
|
|
}
|
|
|
|
window.Window_ScrollHelp = Window_ScrollHelp;
|
|
|
|
|
|
|
|
Window_ScrollHelp.prototype = Object.create(Window_Base.prototype);
|
|
|
|
Window_ScrollHelp.prototype.constructor = Window_ScrollHelp;
|
|
|
|
Window_ScrollHelp.prototype.initialize = function (x, y, width, height) {
|
|
|
|
Window_Base.prototype.initialize.call(this, x, y, width, height);
|
|
|
|
this._text = "";
|
|
|
|
this._offset_Y = 0;
|
|
|
|
this._wheel_multiplier = 1;
|
|
|
|
this._need_scroll = false;
|
|
|
|
this.refresh();
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.clear = function () {
|
|
|
|
this._text = "";
|
|
|
|
this._wheel_multiplier = 1;
|
|
|
|
this._touching = false;
|
|
|
|
this._need_scroll_X = false;
|
|
|
|
this._need_scroll_Y = false;
|
|
|
|
this.refresh();
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.setText = function (text) {
|
|
|
|
this._text = text;
|
|
|
|
this.refresh();
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.measureContentHeight = function () {
|
|
|
|
return this.measureTextHeight(this._text);
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.measureContentWidth = function () {
|
|
|
|
return this.contentsWidth();
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.drawContent = function () {
|
|
|
|
this.drawTextEx(this._text, 1, 0);
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.isHaveContent = function () {
|
|
|
|
return !!this._text;
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.refresh = function () {
|
|
|
|
this.contents.clear();
|
|
|
|
this._offset_Y = 0;
|
|
|
|
this._offset_X = 0;
|
|
|
|
this._need_scroll_X = false;
|
|
|
|
this._need_scroll_Y = false;
|
|
|
|
if (this.isHaveContent()) {
|
|
|
|
this._bitmap_height = this.measureContentHeight();
|
|
|
|
this._bitmap_width = this.measureContentWidth();
|
|
|
|
this.contents.resize(this._bitmap_width, this._bitmap_height);
|
|
|
|
this._need_scroll_Y = this._bitmap_height > this.contentsHeight();
|
|
|
|
this._need_scroll_X = this._bitmap_width > this.contentsWidth();
|
|
|
|
this.drawContent();
|
|
|
|
this._windowContentsSprite.setFrame(0, 0, this.contentsWidth(), this.contentsHeight());
|
|
|
|
this._windowContentsSprite._refresh();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.update = function () {
|
|
|
|
Window_Base.prototype.update.call(this);
|
|
|
|
if (this.isOpenAndActive() && (this._need_scroll_X || this._need_scroll_Y)) {
|
|
|
|
this.updateScroll();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.updateScroll = function () {
|
|
|
|
this.updateWheel();
|
|
|
|
this.updateTouch();
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.setWheelMultiplier = function (multiplier) {
|
|
|
|
this._wheel_multiplier = multiplier;
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.setOriginY = function (y) {
|
|
|
|
this.origin.y = y;
|
|
|
|
if (this.origin.y < 0) {
|
|
|
|
this.origin.y = 0;
|
|
|
|
} else if (this.origin.y > this._bitmap_height - this.contentsHeight()) {
|
|
|
|
this.origin.y = this._bitmap_height - this.contentsHeight();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.setOriginX = function (x) {
|
|
|
|
this.origin.x = x;
|
|
|
|
if (this.origin.x < 0) {
|
|
|
|
this.origin.x = 0;
|
|
|
|
} else if (this.origin.x > this._bitmap_width - this.contentsWidth()) {
|
|
|
|
this.origin.x = this._bitmap_width - this.contentsWidth();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Window_ScrollHelp.prototype.updateWheel = function () {
|
|
|
|
if (Input.isPressed("shift")) {
|
|
|
|
// wheel Y as scroll X
|
|
|
|
if (this._need_scroll_X && Math.abs(TouchInput.wheelY) > 0) {
|
|
|
|
if (this.isMouseInsideFrame()) {
|
|
|
|
var offset = this._wheel_multiplier * TouchInput.wheelY;
|
|
|
|
this.setOriginX(this.origin.x + offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (this._need_scroll_Y && Math.abs(TouchInput.wheelY) > 0) {
|
|
|
|
if (this.isMouseInsideFrame()) {
|
|
|
|
var offset = this._wheel_multiplier * TouchInput.wheelY;
|
|
|
|
this.setOriginY(this.origin.y + offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this._need_scroll_X && Math.abs(TouchInput.wheelX) > 0) {
|
|
|
|
if (this.isMouseInsideFrame()) {
|
|
|
|
var offset = this._wheel_multiplier * TouchInput.wheelX;
|
|
|
|
this.setOriginX(this.origin.x + offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_ScrollHelp.prototype.updateTouch = function () {
|
|
|
|
var inFrame = this.isTouchedInsideFrame();
|
|
|
|
if (TouchInput.isTriggered() && inFrame) {
|
|
|
|
this._touching = true;
|
|
|
|
this._last_touch_y = TouchInput.y;
|
|
|
|
this._last_touch_x = TouchInput.x;
|
|
|
|
} else if (TouchInput.isReleased()) {
|
|
|
|
this._touching = false;
|
|
|
|
}
|
|
|
|
if (this._touching) {
|
|
|
|
if (this._need_scroll_Y) {
|
|
|
|
var offset = this._last_touch_y - TouchInput.y;
|
|
|
|
this._last_touch_y = TouchInput.y;
|
|
|
|
this.setOriginY(this.origin.y + offset);
|
|
|
|
}
|
|
|
|
if (this._need_scroll_X) {
|
|
|
|
var offset = this._last_touch_x - TouchInput.x;
|
|
|
|
this._last_touch_x = TouchInput.x;
|
|
|
|
this.setOriginX(this.origin.x + offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
// Window_SFSelectable
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
function Window_SFSelectable() {
|
|
|
|
this.initialize.apply(this, arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype = Object.create(Window_Base.prototype);
|
|
|
|
Window_SFSelectable.prototype.constructor = Window_SFSelectable;
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.initialize = function (x, y, width, height) {
|
|
|
|
Window_Base.prototype.initialize.call(this, x, y, width, height);
|
|
|
|
this._index = -1;
|
|
|
|
this._handlers = {};
|
|
|
|
|
|
|
|
this._helpWindow = null;
|
|
|
|
|
|
|
|
this._cursorFixed = false;
|
|
|
|
this._cursorAll = false;
|
|
|
|
|
|
|
|
this._touching = false;
|
|
|
|
this._last_touch_x = 0;
|
|
|
|
this._last_touch_y = 0;
|
|
|
|
|
|
|
|
this._need_scroll_X = false;
|
|
|
|
this._need_scroll_Y = false;
|
|
|
|
this._wheel_multiplier = 1;
|
|
|
|
|
|
|
|
this._scrollX = 0;
|
|
|
|
this._scrollY = 0;
|
|
|
|
this._scrolled = false;
|
|
|
|
|
|
|
|
this._origin_x = 0;
|
|
|
|
this._origin_y = 0;
|
|
|
|
this._origin_width = 0;
|
|
|
|
this._origin_height = 0;
|
|
|
|
|
|
|
|
this.deactivate();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.index = function () {
|
|
|
|
return this._index;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorFixed = function () {
|
|
|
|
return this._cursorFixed;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setCursorFixed = function (cursorFixed) {
|
|
|
|
this._cursorFixed = cursorFixed;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorAll = function () {
|
|
|
|
return this._cursorAll;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setCursorAll = function (cursorAll) {
|
|
|
|
this._cursorAll = cursorAll;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxCols = function () {
|
|
|
|
return 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxItems = function () {
|
|
|
|
return 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxRows = function () {
|
|
|
|
return Math.max(Math.ceil(this.maxItems() / this.maxCols()), 1);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.spacing = function () {
|
|
|
|
return 12;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.itemWidth = function () {
|
|
|
|
throw new Error("This method needs to be overwritten.");
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.itemHeight = function () {
|
|
|
|
throw new Error("This method needs to be overwritten.");
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.activate = function () {
|
|
|
|
Window_Base.prototype.activate.call(this);
|
|
|
|
this.reselect();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.deactivate = function () {
|
|
|
|
Window_Base.prototype.deactivate.call(this);
|
|
|
|
this.reselect();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.select = function (index) {
|
|
|
|
this._index = index;
|
|
|
|
this.ensureCursorVisible();
|
|
|
|
this.updateCursor();
|
|
|
|
this.callUpdateHelp();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.deselect = function () {
|
|
|
|
this.select(-1);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.reselect = function () {
|
|
|
|
this.select(this._index);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.row = function () {
|
|
|
|
return Math.floor(this.index() / this.maxCols());
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.topRow = function () {
|
|
|
|
return Math.max(0, this._scrollY);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setTopRow = function (row) {
|
|
|
|
var scrollY = row.clamp(0, this.maxTopRow());
|
|
|
|
if (this._scrollY !== scrollY) {
|
|
|
|
this._scrollY = scrollY;
|
|
|
|
this.refresh();
|
|
|
|
this.updateCursor();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.bottomRow = function () {
|
|
|
|
return Math.max(0, this.topRow() + this.maxPageRows() - 1);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setBottomRow = function (row) {
|
|
|
|
this.setTopRow(row - (this.maxPageRows() - 1));
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxPageRows = function () {
|
|
|
|
var pageHeight = this.height - this.padding * 2;
|
|
|
|
return Math.min(Math.floor(pageHeight / this.itemHeight()) || 1, this.maxRows());
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxTopRow = function () {
|
|
|
|
return Math.max(0, this.maxRows() - this.maxPageRows());
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.col = function () {
|
|
|
|
return this.index() % this.maxCols();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.leftCol = function () {
|
|
|
|
return Math.max(0, this._scrollX);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setLeftCol = function (col) {
|
|
|
|
var scrollX = col.clamp(0, this.maxLeftCol());
|
|
|
|
if (this._scrollX !== scrollX) {
|
|
|
|
this._scrollX = scrollX;
|
|
|
|
this.refresh();
|
|
|
|
this.updateCursor();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.rightCol = function () {
|
|
|
|
return Math.max(0, this.leftCol() + this.maxPageCols() - 1);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setRightCol = function (col) {
|
|
|
|
this.setLeftCol(col - (this.maxPageCols() - 1));
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxPageCols = function () {
|
|
|
|
var pageWidth = this.width - this.padding * 2;
|
|
|
|
return Math.min(Math.floor(pageWidth / this.itemWidth()) || 1, this.maxCols());
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxLeftCol = function () {
|
|
|
|
return Math.max(0, this.maxCols() - this.maxPageCols());
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.resetScroll = function () {
|
|
|
|
this.setTopRow(0);
|
|
|
|
this.setLeftCol(0);
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.maxPageItems = function () {
|
|
|
|
return this.maxPageRows() * this.maxPageCols();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.topIndex = function () {
|
|
|
|
return this.topRow() * this.maxCols() + this.leftCol();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.itemRect = function (index) {
|
|
|
|
var rect = new Rectangle();
|
|
|
|
var maxCols = this.maxCols();
|
|
|
|
rect.width = this.itemWidth();
|
|
|
|
rect.height = this.itemHeight();
|
|
|
|
rect.x = ((index % maxCols) - this.leftCol()) * (rect.width + this.spacing());
|
|
|
|
rect.y = Math.floor(index / maxCols - this.topRow()) * rect.height;
|
|
|
|
return rect;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.itemRectForText = function (index) {
|
|
|
|
var rect = this.itemRect(index);
|
|
|
|
rect.x += this.textPadding();
|
|
|
|
rect.width -= this.textPadding() * 2;
|
|
|
|
return rect;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setHelpWindow = function (helpWindow) {
|
|
|
|
this._helpWindow = helpWindow;
|
|
|
|
this.callUpdateHelp();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.showHelpWindow = function () {
|
|
|
|
if (this._helpWindow) {
|
|
|
|
this._helpWindow.show();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.hideHelpWindow = function () {
|
|
|
|
if (this._helpWindow) {
|
|
|
|
this._helpWindow.hide();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.setHandler = function (symbol, method) {
|
|
|
|
this._handlers[symbol] = method;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.isHandled = function (symbol) {
|
|
|
|
return !!this._handlers[symbol];
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.callHandler = function (symbol) {
|
|
|
|
if (this.isHandled(symbol)) {
|
|
|
|
this._handlers[symbol]();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.isOpenAndActive = function () {
|
|
|
|
return this.isOpen() && this.active;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.isCursorMovable = function () {
|
|
|
|
return this.isOpenAndActive() && !this._cursorFixed && !this._cursorAll && this.maxItems() > 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorUp = function (wrap) {
|
|
|
|
var index = this.index();
|
|
|
|
var maxItems = this.maxItems();
|
|
|
|
var maxCols = this.maxCols();
|
|
|
|
if (index >= maxCols || (wrap && maxCols === 1)) {
|
|
|
|
this.select((index - maxCols + maxItems) % maxItems);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorDown = function (wrap) {
|
|
|
|
var index = this.index();
|
|
|
|
var maxItems = this.maxItems();
|
|
|
|
var maxCols = this.maxCols();
|
|
|
|
if (index < maxItems - maxCols || (wrap && maxCols === 1)) {
|
|
|
|
this.select((index + maxCols) % maxItems);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Selectable.prototype.isHorizontal = function () {
|
|
|
|
return this.maxPageRows() === 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorRight = function (wrap) {
|
|
|
|
var index = this.index();
|
|
|
|
var maxItems = this.maxItems();
|
|
|
|
var maxCols = this.maxCols();
|
|
|
|
if (maxCols >= 2 && (index < maxItems - 1 || (wrap && this.isHorizontal()))) {
|
|
|
|
this.select((index + 1) % maxItems);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.cursorLeft = function (wrap) {
|
|
|
|
var index = this.index();
|
|
|
|
var maxItems = this.maxItems();
|
|
|
|
var maxCols = this.maxCols();
|
|
|
|
if (maxCols >= 2 && (index > 0 || (wrap && this.isHorizontal()))) {
|
|
|
|
this.select((index - 1 + maxItems) % maxItems);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Selectable.prototype.scrollUp = function () {
|
|
|
|
if (this.topRow() > 0) {
|
|
|
|
this.setTopRow(this.topRow() - 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Selectable.prototype.scrollDown = function () {
|
|
|
|
if (this.topRow() + 1 < this.maxRows()) {
|
|
|
|
this.setTopRow(this.topRow() + 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_Selectable.prototype.scrollLeft = function () {
|
|
|
|
if (this.leftCol() > 0) {
|
|
|
|
this.setLeftCol(this.leftCol() - 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.scrollRight = function () {
|
|
|
|
if (this.rightCol() < this.maxCols()) {
|
|
|
|
this.setRightCol(this.rightCol() + 1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.update = function () {
|
|
|
|
Window_Base.prototype.update.call(this);
|
|
|
|
this.updateArrows();
|
|
|
|
this.processCursorMove();
|
|
|
|
this.processHandling();
|
|
|
|
this.processWheel();
|
|
|
|
this.processTouch();
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.updateArrows = function () {
|
|
|
|
var topRow = this.topRow();
|
|
|
|
var maxTopRow = this.maxTopRow();
|
|
|
|
this.downArrowVisible = maxTopRow > 0 && topRow < maxTopRow;
|
|
|
|
this.upArrowVisible = topRow > 0;
|
|
|
|
|
|
|
|
var leftCol = this.leftCol();
|
|
|
|
var maxLeftCol = this.maxLeftCol();
|
|
|
|
this.rightArrowVisible = maxLeftCol > 0 && leftCol < maxLeftCol;
|
|
|
|
this.leftArrowVisible = leftCol > 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.processCursorMove = function () {
|
|
|
|
if (this.isCursorMovable()) {
|
|
|
|
var lastIndex = this.index();
|
|
|
|
if (Input.isRepeated("down")) {
|
|
|
|
this.cursorDown(Input.isTriggered("down"));
|
|
|
|
}
|
|
|
|
if (Input.isRepeated("up")) {
|
|
|
|
this.cursorUp(Input.isTriggered("up"));
|
|
|
|
}
|
|
|
|
if (Input.isRepeated("right")) {
|
|
|
|
this.cursorRight(Input.isTriggered("right"));
|
|
|
|
}
|
|
|
|
if (Input.isRepeated("left")) {
|
|
|
|
this.cursorLeft(Input.isTriggered("left"));
|
|
|
|
}
|
|
|
|
if (this.index() !== lastIndex) {
|
|
|
|
SoundManager.playCursor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.processHandling = function () {
|
|
|
|
if (this.isOpenAndActive()) {
|
|
|
|
if (this.isOkEnabled() && this.isOkTriggered()) {
|
|
|
|
this.processOk();
|
|
|
|
} else if (this.isCancelEnabled() && this.isCancelTriggered()) {
|
|
|
|
this.processCancel();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.processWheel = function () {
|
|
|
|
var inFrame = this.isMouseInsideFrame();
|
|
|
|
if (inFrame && this.isOpen()) {
|
|
|
|
var threshold = 20;
|
|
|
|
var hasShift = Input.isPressed("shift");
|
|
|
|
if (TouchInput.wheelY >= threshold) {
|
|
|
|
if (!hasShift) {
|
|
|
|
this.scrollDown();
|
|
|
|
} else {
|
|
|
|
this.scrollRight();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (TouchInput.wheelY <= threshold) {
|
|
|
|
if (!hasShift) {
|
|
|
|
this.scrollUp();
|
|
|
|
} else {
|
|
|
|
this.scrollLeft();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.processTouch = function () {
|
|
|
|
var inFrame = this.isTouchedInsideFrame();
|
|
|
|
if (this.isOpenAndActive()) {
|
|
|
|
if (TouchInput.isTriggered() && inFrame) {
|
|
|
|
this._touching = true;
|
|
|
|
this._last_touch_x = TouchInput.x;
|
|
|
|
this._last_touch_y = TouchInput.y;
|
|
|
|
this._scrolled = false;
|
|
|
|
this.onTouch(true);
|
|
|
|
} else if (TouchInput.isReleased() || !inFrame) {
|
|
|
|
this._touching = false;
|
|
|
|
this.onTouch(false);
|
|
|
|
} else if (TouchInput.isCancelled()) {
|
|
|
|
if (this.isCancelEnabled()) {
|
|
|
|
this.processCancel();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (this._touching) {
|
|
|
|
var x = TouchInput.x;
|
|
|
|
var y = TouchInput.y;
|
|
|
|
var offset_x = x - this._last_touch_x;
|
|
|
|
var offset_y = y - this._last_touch_y;
|
|
|
|
var iw = this.itemWidth();
|
|
|
|
var ih = this.itemHeight();
|
|
|
|
if (offset_x >= iw) {
|
|
|
|
this._last_touch_x = this._last_touch_x + iw;
|
|
|
|
this._scrolled = true;
|
|
|
|
this.scrollRight();
|
|
|
|
}
|
|
|
|
if (offset_x <= -iw) {
|
|
|
|
this._last_touch_x = this._last_touch_x - iw;
|
|
|
|
this._scrolled = true;
|
|
|
|
this.scrollLeft();
|
|
|
|
}
|
|
|
|
if (offset_y >= ih) {
|
|
|
|
this._last_touch_y = this._last_touch_y + ih;
|
|
|
|
this._scrolled = true;
|
|
|
|
this.scrollDown();
|
|
|
|
}
|
|
|
|
if (offset_y <= -ih) {
|
|
|
|
this._last_touch_y = this._last_touch_y - ih;
|
|
|
|
this._scrolled = true;
|
|
|
|
this.scrollUp();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Window_SFSelectable.prototype.hitTest = function (x, y) {
|
|
|
|
var x2 = this.canvasToLocalX(x);
|
|
|
|
var y2 = this.canvasToLocalY(y);
|
|
|
|
if (this.isContentArea(x2, y2)) {
|
|
|
|
var cx = x2 - this.padding;
|
|
|
|
var cy = y2 - this.padding;
|
|
|
|
var topIndex = this.topIndex();
|
|
|
|
var maxPageItems = this.maxPageItems();
|
|
|
|
var maxItems = this.maxItems();
|
|
|
|
for (var i = 0; i < maxPageItems; i++) {
|
|
|
|
var index = topIndex + i;
|
|
|
|
if (index < maxItems) {
|
|
|
|
var rect = this.itemRect(index);
|
|
|
|
var right = rect.x + rect.width;
|
|
|
|
var bottom = rect.y + rect.height;
|
|
|
|
if (cx >= rect.x && cy >= rect.y && cx < right && cy < bottom) {
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
};
|