Files
starruler-linux/scripts/toolkit/dialogs/Dialog.as
T
2018-07-17 14:15:37 +02:00

167 lines
3.9 KiB
ActionScript

import elements.BaseGuiElement;
import elements.GuiDraggable;
import elements.GuiSkinElement;
import elements.GuiText;
import elements.GuiButton;
import dialogs.IDialog;
from gui import navigateInto;
from dialog import addDialog, closeDialog, closeDialogs;
const int DIALOG_BUTTON_HEIGHT = 32;
const int DIALOG_PADDING = 7;
const int DIALOG_BUTTON_ROW = DIALOG_BUTTON_HEIGHT + DIALOG_PADDING;
const Color DIALOG_TITLE_COLOR(0x00bffeff);
class Dialog : IDialog, IGuiCallback {
bool Closed;
IGuiElement@ elem;
IGuiElement@ lastFocus;
GuiSkinElement@ bg;
BaseGuiElement@ window;
GuiSkinElement@ titleBox;
GuiText@ titleText;
GuiButton@ closeBtn;
int height;
int width;
Dialog(IGuiElement@ bind, bool bindInside = false) {
Closed = false;
@elem = bind;
width = 500;
height = 38+DIALOG_PADDING;
@lastFocus = getGuiFocus();
@window = GuiDraggable(bindInside ? bind : null, recti());
@window.callback = this;
@bg = GuiSkinElement(window, Alignment_Fill(), SS_Dialog);
updatePosition();
}
void addTitle(const string& title, FontType font = FT_Bold, bool closeButton = true, const Color& color = Color(0x00bffeff)) {
if(titleBox is null)
@titleBox = GuiSkinElement(window, recti_area(vec2i(1, 1), vec2i(width-3, 26)), SS_WindowTitle);
else
titleBox.size = vec2i(width-3, 26);
if(titleText is null) {
@titleText = GuiText(window, recti_area(vec2i(8, 4), vec2i(width-16, 22)));
titleText.font = font;
height += 26;
}
titleBox.color = color;
titleText.text = title;
if(closeButton && closeBtn is null) {
vec2i size = window.skin.getSize(SS_GameTabClose, SF_Normal);
int off = (26 - size.y) / 2 + 1;
@closeBtn = GuiButton(window, Alignment(Right-off-size.x, Top+off, Width=size.x, Height=size.y));
closeBtn.style = SS_GameTabClose;
}
}
void set_titleColor(const Color& color) {
if(titleBox !is null)
titleBox.color = color;
}
bool onMouseEvent(const MouseEvent& event, IGuiElement@ source) {
return false;
}
bool onKeyEvent(const KeyboardEvent& event, IGuiElement@ source) {
switch(event.type) {
case KET_Key_Down:
if(event.key == KEY_ESC) {
return true;
}
else if(event.key == KEY_ENTER) {
return true;
}
break;
case KET_Key_Up:
if(event.key == KEY_ESC) {
cancelDialog();
return true;
}
else if(event.key == KEY_ENTER) {
confirmDialog();
return true;
}
break;
}
return false;
}
bool onGuiEvent(const GuiEvent& event) {
if(event.caller is closeBtn && event.type == GUI_Clicked) {
cancelDialog();
return true;
}
return false;
}
void set_position(const vec2i& pos) {
window.position = pos;
}
void updatePosition() {
recti pos;
if(elem is null)
pos = recti(vec2i(), screenSize);
else
pos = elem.absolutePosition;
pos = recti_centered(pos, vec2i(width, height));
if(titleBox !is null)
titleBox.size = vec2i(width-3, 26);
window.position = pos.topLeft;
window.size = pos.size;
window.updateAbsolutePosition();
}
void focus() {
window.bringToFront();
navigateInto(window);
}
void cancelDialog() {
close();
}
void confirmDialog() {
window.emitConfirmed();
}
void close() {
Closed = true;
window.remove();
setGuiFocus(lastFocus);
}
bool get_closed() {
return Closed;
}
IGuiElement@ get_bound() {
return elem;
}
};
void alignAcceptButtons(BaseGuiElement@ accept, BaseGuiElement@ cancel) {
if(isWindows) {
//Legacy OS support
@accept.alignment = Alignment(Left+0.2f+12, Bottom-0.0f-DIALOG_BUTTON_ROW, Left+0.5f-6, Bottom-0.0f-DIALOG_PADDING);
@cancel.alignment = Alignment(Right-0.5f+6, Bottom-0.0f-DIALOG_BUTTON_ROW, Right-0.2f-12, Bottom-0.0f-DIALOG_PADDING);
}
else {
@accept.alignment = Alignment(Right-0.3f, Bottom-0.0f-DIALOG_BUTTON_ROW, Right-0.0f-DIALOG_PADDING, Bottom-0.0f-DIALOG_PADDING);
@cancel.alignment = Alignment(Right-0.6f, Bottom-0.0f-DIALOG_BUTTON_ROW, Right-0.3f-DIALOG_PADDING, Bottom-0.0f-DIALOG_PADDING);
}
}