Files
starruler-linux/scripts/gui/overlays/TimeDisplay.as
T
2018-07-17 14:15:37 +02:00

183 lines
4.7 KiB
ActionScript

#priority init -100
import elements.BaseGuiElement;
import elements.GuiButton;
import elements.GuiText;
import elements.GuiSprite;
import elements.GuiMarkupText;
import elements.MarkupTooltip;
import tabs.Tab;
import util.formatting;
import timing;
from tabs.tabbar import TAB_HEIGHT, GLOBAL_BAR_HEIGHT, ActiveTab;
class TimeDisplay : BaseGuiElement {
GuiSprite@ icon;
GuiMarkupText@ text;
bool showGameTime = true;
bool clicking = false;
bool wasAutoPause = false;
string prevText;
GuiButton@ pauseButton;
GuiButton@ slowButton;
GuiButton@ fastButton;
TimeDisplay() {
super(null, recti_area(-4,TAB_HEIGHT+GLOBAL_BAR_HEIGHT, 210, 30));
@icon = GuiSprite(this, recti_area(9,3, 24,24));
@text = GuiMarkupText(this, recti_area(35,6, 120,24));
setMarkupTooltip(icon, locale::TT_GAMETIME);
setMarkupTooltip(text, locale::TT_GAMETIME);
if(mpClient) {
size = vec2i(128, 30);
}
else {
@slowButton = GuiButton(this, Alignment(Right-69, Top+7, Width=18, Height=18));
setMarkupTooltip(slowButton, locale::TT_SLOWER);
slowButton.allowOtherButtons = true;
slowButton.spriteStyle = Sprite(spritesheet::TimeSlow, 0);
@pauseButton = GuiButton(this, Alignment(Right-48, Top+7, Width=18, Height=18));
setMarkupTooltip(pauseButton, locale::TT_PAUSE);
pauseButton.allowOtherButtons = true;
pauseButton.spriteStyle = Sprite(spritesheet::TimeStop, 0);
@fastButton = GuiButton(this, Alignment(Right-26, Top+7, Width=18, Height=18));
setMarkupTooltip(fastButton, locale::TT_FASTER);
fastButton.allowOtherButtons = true;
fastButton.spriteStyle = Sprite(spritesheet::TimeHaste, 0);
}
updateAbsolutePosition();
}
void tick(double time) {
visible = (ActiveTab.category == TC_Galaxy) && ShowTimeDisplay;
if(!mpClient && !mpServer && settings::bAutoPause) {
bool shouldAutoPause = ActiveTab.category != TC_Galaxy && ActiveTab.category != TC_Diplomacy;
if(gameSpeed != 0 && shouldAutoPause) {
pause();
wasAutoPause = true;
}
else if(!shouldAutoPause && wasAutoPause && gameSpeed == 0) {
pause();
wasAutoPause = false;
}
}
string str;
if(showGameTime) {
double time = floor(gameTime / 60.0);
int hrs = floor(time / 60.0);
int mins = floor(time - (hrs * 60.0));
str = format(locale::TIME_HM, toString(hrs), toString(mins));
icon.desc = Sprite(spritesheet::MenuIcons, 0);
}
else {
icon.desc = Sprite(material::TimeReal);
str = strftime("%H:%M", getSystemTime());
}
if(abs(gameSpeed - 1.0) > 0.05) {
if(mpIsSerializing)
str += format(" [color=#fff900]$1[/color]", locale::WAITING);
else if(gameSpeed == 0.0)
str += format(" [color=#f00]$1[/color]", locale::PAUSED);
else if(gameSpeed > 1.0)
str += format(" [color=#0f0]x$1[/color]", toString(gameSpeed, 1));
else
str += format(" [color=#f00]x$1[/color]", toString(gameSpeed, 1));
}
if(str != prevText) {
text.text = str;
text.updateAbsolutePosition();
prevText = str;
}
if(pauseButton !is null) {
if(gameSpeed == 0.0)
pauseButton.spriteStyle = Sprite(spritesheet::TimeResume, 0);
else
pauseButton.spriteStyle = Sprite(spritesheet::TimeStop, 0);
}
}
bool onGuiEvent(const GuiEvent& evt) {
switch(evt.type) {
case GUI_Mouse_Left:
if(evt.caller is this)
clicking = false;
break;
case GUI_Clicked:
if(evt.caller is pauseButton) {
if(evt.value == 1)
speed_default();
else
pause();
return true;
}
else if(evt.caller is slowButton) {
if(evt.value == 1)
speed_slowest();
else
speed_slower();
return true;
}
else if(evt.caller is fastButton) {
if(evt.value == 1)
speed_fastest();
else
speed_faster();
return true;
}
break;
}
return BaseGuiElement::onGuiEvent(evt);
}
bool onMouseEvent(const MouseEvent& event, IGuiElement@ source) {
if(source is this || source is icon || source is text) {
switch(event.type) {
case MET_Button_Down:
if(event.button == 0) {
clicking = true;
return true;
}
break;
case MET_Button_Up:
if(event.button == 0) {
if(clicking) {
showGameTime = !showGameTime;
if(showGameTime) {
setMarkupTooltip(icon, locale::TT_GAMETIME);
setMarkupTooltip(text, locale::TT_GAMETIME);
}
else {
setMarkupTooltip(icon, locale::TT_REALTIME);
setMarkupTooltip(text, locale::TT_REALTIME);
}
}
return true;
}
break;
}
}
return BaseGuiElement::onMouseEvent(event, source);
}
void draw() override {
skin.draw(SS_TimeDisplay, SF_Normal, AbsolutePosition);
BaseGuiElement::draw();
}
};
TimeDisplay@ disp;
bool ShowTimeDisplay = true;
void init() {
@disp = TimeDisplay();
}
void tick(double time) {
disp.tick(time);
}