Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
import tabs.Tab;
|
||||
import elements.GuiButton;
|
||||
import elements.GuiText;
|
||||
import elements.GuiMarkupText;
|
||||
import elements.GuiSkinElement;
|
||||
import elements.GuiBackgroundPanel;
|
||||
import influence;
|
||||
import util.formatting;
|
||||
|
||||
from tabs.tabbar import popTab, browseTab, get_ActiveTab;
|
||||
from tabs.InfluenceVoteTab import createInfluenceVoteTab;
|
||||
|
||||
const double UPDATE_TIMER = 1.0;
|
||||
|
||||
class InfluenceHistoryTab : Tab {
|
||||
uint limit = 10;
|
||||
int beforeId = -1;
|
||||
bool reverse = true;
|
||||
|
||||
GuiBackgroundPanel@ bg;
|
||||
|
||||
GuiButton@ backButton;
|
||||
GuiButton@ olderButton;
|
||||
GuiButton@ newerButton;
|
||||
|
||||
InfluenceVote[] votes;
|
||||
VoteBox@[] boxes;
|
||||
|
||||
double updateTime = 0.0;
|
||||
|
||||
InfluenceHistoryTab() {
|
||||
super();
|
||||
title = locale::VOTE_HISTORY;
|
||||
|
||||
@bg = GuiBackgroundPanel(this, Alignment(Left+8, Top+8, Right-8, Bottom-8));
|
||||
bg.title = locale::VOTE_HISTORY;
|
||||
bg.titleColor = Color(0x00bffeff);
|
||||
bg.picture = Sprite(material::Propositions);
|
||||
|
||||
@backButton = GuiButton(this, recti(14, 40, 212, 70), locale::DIPLOMACY_BACK);
|
||||
|
||||
@newerButton = GuiButton(this, Alignment(Left+0.5f-222, Top+40, Left+0.5f-2, Top+70), locale::NEWER);
|
||||
|
||||
@olderButton = GuiButton(this, Alignment(Left+0.5f+2, Top+40, Left+0.5f+222, Top+70), locale::OLDER);
|
||||
|
||||
update();
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
void tick(double time) {
|
||||
updateTime -= time;
|
||||
if(updateTime <= 0) {
|
||||
update();
|
||||
updateTime += UPDATE_TIMER;
|
||||
}
|
||||
}
|
||||
|
||||
void update() {
|
||||
if(reverse) {
|
||||
votes.syncFrom(getInfluenceVoteHistory(limit+1, beforeId, true));
|
||||
}
|
||||
else {
|
||||
votes.syncFrom(getInfluenceVoteHistory(limit+1, beforeId, false));
|
||||
if(votes.length <= limit) {
|
||||
beforeId = -1;
|
||||
}
|
||||
else {
|
||||
beforeId = votes[limit].id;
|
||||
votes.removeAt(limit);
|
||||
}
|
||||
votes.reverse();
|
||||
}
|
||||
|
||||
uint oldCnt = boxes.length;
|
||||
uint newCnt = min(votes.length, limit);
|
||||
for(uint i = newCnt; i < oldCnt; ++i)
|
||||
boxes[i].remove();
|
||||
boxes.length = newCnt;
|
||||
|
||||
for(uint i = 0; i < newCnt; ++i) {
|
||||
if(boxes[i] is null)
|
||||
@boxes[i] = VoteBox(this);
|
||||
boxes[i].set(votes[i]);
|
||||
boxes[i].position = vec2i(16, 78 + i * 32);
|
||||
}
|
||||
|
||||
olderButton.disabled = reverse && votes.length <= limit;
|
||||
newerButton.disabled = votes.length == 0 || beforeId == -1;
|
||||
reverse = true;
|
||||
}
|
||||
|
||||
void hide() {
|
||||
Tab::hide();
|
||||
}
|
||||
|
||||
void updateAbsolutePosition() {
|
||||
//Update box list size
|
||||
uint show = max((size.height - 80) / 32, 2);
|
||||
if(show != limit) {
|
||||
limit = show;
|
||||
update();
|
||||
}
|
||||
|
||||
Tab::updateAbsolutePosition();
|
||||
}
|
||||
|
||||
bool onGuiEvent(const GuiEvent& event) {
|
||||
if(event.type == GUI_Clicked) {
|
||||
if(event.caller is backButton) {
|
||||
popTab(this);
|
||||
return true;
|
||||
}
|
||||
else if(event.caller is olderButton) {
|
||||
if(votes.length < limit)
|
||||
return true;
|
||||
beforeId = votes[limit-1].id;
|
||||
update();
|
||||
return true;
|
||||
}
|
||||
else if(event.caller is newerButton) {
|
||||
if(votes.length == 0)
|
||||
return true;
|
||||
reverse = false;
|
||||
beforeId = votes[0].id;
|
||||
update();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onGuiEvent(event);
|
||||
}
|
||||
|
||||
Color get_activeColor() {
|
||||
return Color(0x74fc4eff);
|
||||
}
|
||||
|
||||
Color get_inactiveColor() {
|
||||
return Color(0x37ff00ff);
|
||||
}
|
||||
|
||||
Color get_seperatorColor() {
|
||||
return Color(0x408c2bff);
|
||||
}
|
||||
|
||||
TabCategory get_category() {
|
||||
return TC_Diplomacy;
|
||||
}
|
||||
|
||||
Sprite get_icon() {
|
||||
return Sprite(material::TabDiplomacy);
|
||||
}
|
||||
|
||||
void draw() {
|
||||
skin.draw(SS_DiplomacyBG, SF_Normal, AbsolutePosition);
|
||||
Tab::draw();
|
||||
}
|
||||
};
|
||||
|
||||
class VoteBox : BaseGuiElement {
|
||||
uint prevId = uint(-1);
|
||||
InfluenceVote@ vote;
|
||||
|
||||
GuiText@ timeBox;
|
||||
GuiMarkupText@ titleBox;
|
||||
GuiText@ statusBox;
|
||||
|
||||
GuiButton@ detailsButton;
|
||||
|
||||
VoteBox(IGuiElement@ parent) {
|
||||
super(parent, recti(0, 0, parent.size.width - 48, 32));
|
||||
|
||||
@timeBox = GuiText(this, recti(4, 6, 120, 26));
|
||||
timeBox.font = FT_Small;
|
||||
timeBox.color = Color(0x888888ff);
|
||||
timeBox.horizAlign = 0.5;
|
||||
|
||||
@titleBox = GuiMarkupText(this, Alignment(Left+124, Top+6, Right-208, Top+26));
|
||||
|
||||
@statusBox = GuiText(this, Alignment(Right-204, Top+6, Right-4, Top+26));
|
||||
|
||||
@detailsButton = GuiButton(this, Alignment(Right-84, Top+4, Right-4, Top+28), locale::VIEW);
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
void set(InfluenceVote@ newVote) {
|
||||
//Only update data when set to a different vote
|
||||
if(vote !is null && newVote.id == prevId) {
|
||||
@vote = newVote;
|
||||
return;
|
||||
}
|
||||
|
||||
@vote = newVote;
|
||||
prevId = vote.id;
|
||||
|
||||
//Set the data fields
|
||||
titleBox.text = formatEmpireName(vote.startedBy)+": "+vote.formatTitle();
|
||||
timeBox.text = formatGameTime(vote.startedAt)+" - "+formatGameTime(vote.endedAt);
|
||||
|
||||
if(vote.succeeded) {
|
||||
statusBox.text = locale::PASSED;
|
||||
statusBox.color = Color(0x00ff00ff);
|
||||
}
|
||||
else {
|
||||
statusBox.text = locale::FAILED;
|
||||
statusBox.color = Color(0xff0000ff);
|
||||
}
|
||||
}
|
||||
|
||||
void remove() {
|
||||
@vote = null;
|
||||
BaseGuiElement::remove();
|
||||
}
|
||||
|
||||
void updateAbsolutePosition() {
|
||||
BaseGuiElement::updateAbsolutePosition();
|
||||
|
||||
int w = parent.size.width - 24;
|
||||
if(size.width != w)
|
||||
size = vec2i(w, size.height);
|
||||
}
|
||||
|
||||
void draw() {
|
||||
skin.draw(SS_InfluenceVoteBox, SF_Normal, AbsolutePosition);
|
||||
BaseGuiElement::draw();
|
||||
}
|
||||
|
||||
bool onGuiEvent(const GuiEvent& evt) {
|
||||
switch(evt.type) {
|
||||
case GUI_Clicked:
|
||||
if(evt.caller is detailsButton) {
|
||||
browseTab(ActiveTab, createInfluenceVoteTab(vote.id), true);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return BaseGuiElement::onGuiEvent(evt);
|
||||
}
|
||||
};
|
||||
|
||||
Tab@ createInfluenceHistoryTab() {
|
||||
return InfluenceHistoryTab();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user