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

308 lines
7.4 KiB
ActionScript

import tabs.tabbar;
import elements.GuiBlueprint;
import community.DesignElement;
import elements.GuiMarkupText;
import elements.GuiSkinElement;
import elements.GuiDropdown;
import elements.GuiText;
import elements.GuiTextbox;
import elements.GuiButton;
import elements.GuiSprite;
import elements.GuiPanel;
import elements.GuiBackgroundPanel;
import elements.MarkupTooltip;
import dialogs.Dialog;
import util.formatting;
from tabs.WikiTab import LinkableMarkupText;
from community.DesignList import createCommunityDesignList;
from community.DesignPage import createCommunityDesignPage;
import icons;
class CommunityHome : Tab {
WebData query;
WebData wiki;
string listSpec;
BaseGuiElement@ container;
GuiBackgroundPanel@ designBG;
GuiPanel@ panel;
array<DesignElement@> elements;
GuiBackgroundPanel@ wikiBG;
GuiPanel@ wikiPanel;
LinkableMarkupText@ wikiText;
GuiButton@ uploadButton;
GuiButton@ recentDesigns;
GuiButton@ topratedDesigns;
GuiTextbox@ searchDesigns;
GuiButton@ internetButton;
bool loaded = true;
bool loading = false;
CommunityHome() {
title = locale::COMMUNITY_HOME_TITLE;
@container = BaseGuiElement(this, Alignment().fill());
@internetButton = GuiButton(this, Alignment(Left+0.5f-200, Top+0.5f-30, Left+0.5f+200, Top+0.5f+30), locale::ENABLE_INTERNET);
internetButton.visible = false;
@designBG = GuiBackgroundPanel(container, Alignment(Left+29, Top+35, Left+35+600+48, Bottom-80));
designBG.title = locale::FEATURED_DESIGNS;
designBG.titleColor = colors::FTL;
designBG.titleHeight = 42;
designBG.titleFont = FT_Big;
@panel = GuiPanel(designBG, Alignment(Left+4, Top+42, Right-4, Bottom-8));
@uploadButton = GuiButton(container, Alignment(Left+34+600+48-200, Bottom-72, Width=200, Height=52), locale::UPLOAD_DESIGN);
uploadButton.font = FT_Bold;
uploadButton.setIcon(icons::Export);
@recentDesigns = GuiButton(container, Alignment(Left+30+600+48-424, Bottom-75, Width=200, Height=30), locale::RECENT_DESIGNS);
@topratedDesigns = GuiButton(container, Alignment(Left+30+600+48-424, Bottom-75+32, Width=200, Height=30), locale::TOPRATED_DESIGNS);
@searchDesigns = GuiTextbox(container, Alignment(Left+30, Bottom-69, Width=200, Height=46));
searchDesigns.emptyText = locale::SEARCH_DESIGNS_PROMPT;
@wikiBG = GuiBackgroundPanel(container, Alignment(Left+30+600+48+30, Top+30, Right-30, Bottom-30));
wikiBG.title = locale::COMMUNITY_WIKI;
wikiBG.titleColor = colors::Research;
wikiBG.titleHeight = 42;
wikiBG.titleFont = FT_Big;
@wikiPanel = GuiPanel(wikiBG, Alignment(Left+4, Top+42, Right-4, Bottom-12));
@wikiText = LinkableMarkupText(wikiPanel, recti_area(12,12, 100,100), true);
if(cloud::isActive)
settings::bEnableInternet = true;
updateAbsolutePosition();
listSpec = "designs/featured";
}
void updateAbsolutePosition() {
Tab::updateAbsolutePosition();
if(wikiText.size.width != wikiPanel.size.width-44) {
wikiText.size = vec2i(wikiPanel.size.width-44, wikiText.size.height);
wikiText.updateAbsolutePosition();
}
}
void reload() {
if(settings::bEnableInternet) {
container.visible = true;
internetButton.visible = false;
load(listSpec);
}
else {
container.visible = false;
internetButton.visible = true;
}
}
void load(const string& spec) {
listSpec = spec;
webAPICall(spec, query);
getWikiPage("Main Page", wiki);
loading = true;
loaded = false;
}
void show() {
if(!loading)
reload();
Tab::show();
}
void tick(double time) {
if(loading && !loaded && query.completed && wiki.completed)
finish();
}
void finish() {
loaded = true;
loading = false;
wikiText.text = wiki.result;
for(uint i = 0, cnt = elements.length; i < cnt; ++i)
elements[i].remove();
elements.length = 0;
JSONTree tree;
tree.parse(query.result);
if(!tree.root.isArray())
return;
int y = 12;
for(uint i = 0, cnt = min(tree.root.size(), panel.size.height / 138); i < cnt; ++i) {
auto@ mem = tree.root[i];
if(mem !is null && mem.isObject()) {
DesignElement elem(panel, recti_area(20,y, 600,130));
elem.finishLoad(mem);
elements.insertLast(elem);
y += 138;
}
}
updateAbsolutePosition();
}
Color get_activeColor() {
return Color(0xff83bcff);
}
Color get_inactiveColor() {
return Color(0xff0077ff);
}
Color get_seperatorColor() {
return Color(0x8d4969ff);
}
TabCategory get_category() {
return TC_Wiki;
}
Sprite get_icon() {
return Sprite(material::TabWiki);
}
bool onGuiEvent(const GuiEvent& evt) {
if(evt.type == GUI_Clicked) {
if(evt.caller is recentDesigns) {
browseTab(this, createCommunityDesignList("designs/recent"), true);
return true;
}
else if(evt.caller is topratedDesigns) {
browseTab(this, createCommunityDesignList("designs/toprated"), true);
return true;
}
else if(evt.caller is uploadButton) {
UploadDialog(this);
return true;
}
else if(evt.caller is internetButton) {
settings::bEnableInternet = true;
saveSettings();
reload();
return true;
}
}
else if(evt.type == GUI_Confirmed) {
if(evt.caller is searchDesigns) {
browseTab(this, createCommunityDesignList("designs/search/"+searchDesigns.text), true);
searchDesigns.text = "";
return true;
}
}
return Tab::onGuiEvent(evt);
}
void draw() {
skin.draw(SS_WikiBG, SF_Normal, AbsolutePosition);
Tab::draw();
}
};
class UploadDialog : Dialog {
GuiDropdown@ design;
GuiTextbox@ description;
GuiButton@ accept;
GuiButton@ cancel;
array<const Design@> designs;
UploadDialog(IGuiElement@ bind) {
super(bind, bindInside=true);
width = 600;
height = 200;
@accept = GuiButton(bg, recti());
accept.text = locale::UPLOAD;
accept.tabIndex = 100;
accept.disabled = true;
@accept.callback = this;
accept.color = colors::Green;
@cancel = GuiButton(bg, recti());
cancel.text = locale::CANCEL;
cancel.tabIndex = 101;
@cancel.callback = this;
cancel.color = colors::Red;
@design = GuiDropdown(bg, Alignment(Left+12, Top+40, Right-12, Top+76));
ReadLock lck(playerEmpire.designMutex);
uint cnt = playerEmpire.designCount;
designs.reserve(cnt);
designs.length = 0;
design.addItem(locale::DESIGN_CHOOSE_PROMPT);
for(uint i = 0; i < cnt; ++i) {
const Design@ other = playerEmpire.designs[i];
if(other.obsolete || other.newest() !is other)
continue;
design.addItem(formatShipName(other));
designs.insertLast(other);
}
@description = GuiTextbox(bg, Alignment(Left+12, Top+80, Right-12, Bottom-46));
description.multiLine = true;
description.emptyText = locale::DESIGN_DESCRIPTION_PROMPT;
addTitle(locale::UPLOAD_DESIGN, color=colors::FTL);
alignAcceptButtons(accept, cancel);
updatePosition();
}
void update() {
accept.disabled = design.selected < 1;
}
void close() {
close(false);
}
void close(bool accepted) {
if(accepted && design.selected >= 1) {
int id = upload_design(designs[design.selected-1], description.text, waitId=true);
if(id > 0)
browseTab(ActiveTab, createCommunityDesignPage(id), true);
}
Dialog::close();
}
void confirmDialog() {
close(true);
}
bool onGuiEvent(const GuiEvent& event) {
if(Closed)
return false;
if(event.type == GUI_Clicked && (event.caller is accept || event.caller is cancel)) {
close(event.caller is accept);
return true;
}
else if(event.type == GUI_Changed) {
update();
return true;
}
return Dialog::onGuiEvent(event);
}
};
Tab@ createCommunityHome() {
return CommunityHome();
}