Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
import elements.BaseGuiElement;
|
||||
import elements.MarkupTooltip;
|
||||
import elements.GuiMarkupText;
|
||||
import util.game_options;
|
||||
import elements.GuiText;
|
||||
|
||||
class SettingsPage {
|
||||
GameOption@[] options;
|
||||
BaseGuiElement@ cur;
|
||||
uint lineHeight = 34;
|
||||
uint linePadding = 4;
|
||||
uint line = 0;
|
||||
bool half = false;
|
||||
|
||||
void clear() {
|
||||
options.length = 0;
|
||||
@cur = null;
|
||||
lineHeight = 30;
|
||||
line = 0;
|
||||
}
|
||||
|
||||
void create(BaseGuiElement@ pane, SettingsContainer@ gs = null) {
|
||||
clear();
|
||||
@cur = pane;
|
||||
makeSettings();
|
||||
reset();
|
||||
|
||||
if(gs !is null)
|
||||
load(gs);
|
||||
}
|
||||
|
||||
Alignment@ nextAlignment(bool halfWidth = false) {
|
||||
if(!halfWidth && half) {
|
||||
half = false;
|
||||
++line;
|
||||
}
|
||||
Alignment align(Left+8, Top+linePadding+line*lineHeight, Right-24, Top+line*lineHeight + lineHeight);
|
||||
if(halfWidth) {
|
||||
if(half) {
|
||||
align.left.percent = 0.5f;
|
||||
++line;
|
||||
}
|
||||
else {
|
||||
align.right.percent = 0.5f;
|
||||
}
|
||||
half = !half;
|
||||
}
|
||||
else {
|
||||
++line;
|
||||
half = false;
|
||||
}
|
||||
return align;
|
||||
}
|
||||
|
||||
void emptyline() {
|
||||
line += 1;
|
||||
if(half) {
|
||||
half = false;
|
||||
line += 1;
|
||||
}
|
||||
}
|
||||
|
||||
GuiText@ Title(const string& title, FontType font = FT_Medium, Alignment@ align = null) {
|
||||
if(align is null)
|
||||
@align = nextAlignment();
|
||||
GuiText ele(cur, align, title);
|
||||
ele.font = font;
|
||||
ele.stroke = colors::Black;
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiMarkupText@ Description(const string& text, uint lines = 1) {
|
||||
auto@ align = nextAlignment();
|
||||
align.bottom.pixels += lineHeight * lines-1;
|
||||
line += lines-1;
|
||||
|
||||
GuiMarkupText ele(cur, align);
|
||||
ele.text = text;
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameToggle@ Toggle(const string& text, const string& configName, Alignment@ align = null, const string& tooltip = "", bool halfWidth=false) {
|
||||
return Toggle(text, config(configName), config::get(configName) != 0.0, align, tooltip, halfWidth);
|
||||
}
|
||||
|
||||
GuiGameToggle@ Toggle(const string& text, uint setting, bool value, Alignment@ align = null, const string& tooltip = "", bool halfWidth=false) {
|
||||
if(align is null)
|
||||
@align = nextAlignment(halfWidth);
|
||||
GuiGameToggle ele(cur, align, text, setting);
|
||||
if(tooltip.length != 0)
|
||||
setMarkupTooltip(ele, tooltip, width=300);
|
||||
ele.set(value);
|
||||
ele.defaultValue = value;
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameSlider@ Slider(const string& text, uint setting, double value, double min, double max, Alignment@ align = null) {
|
||||
if(align is null)
|
||||
@align = nextAlignment();
|
||||
GuiGameSlider ele(cur, align, text, setting);
|
||||
ele.defaultValue = value;
|
||||
ele.set(value);
|
||||
ele.setMin(min);
|
||||
ele.setMax(max);
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameNumber@ Number(const string& text, const string& configName, int decimals = 0, double step = 1.0, Alignment@ align = null, double min=0.0, double max=INFINITY, bool halfWidth=false, const string& tooltip = "") {
|
||||
return Number(text, config(configName), config::get(configName), decimals, step, align, min, max, halfWidth, tooltip);
|
||||
}
|
||||
|
||||
GuiGameNumber@ Number(const string& text, uint setting, double value, int decimals = 0, double step = 1.0, Alignment@ align = null, double min=0.0, double max=INFINITY, bool halfWidth=false, const string& tooltip = "") {
|
||||
if(align is null)
|
||||
@align = nextAlignment(halfWidth);
|
||||
GuiGameNumber ele(cur, align, text, setting);
|
||||
ele.decimals = decimals;
|
||||
ele.step = step;
|
||||
ele.defaultValue = value;
|
||||
ele.setMin(min);
|
||||
ele.setMax(max);
|
||||
ele.set(value);
|
||||
if(tooltip.length != 0)
|
||||
setMarkupTooltip(ele, tooltip, width=300);
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameOccurance@ Occurance(const string& text, const string& configName, double min = 0.0, double max = 2.0, Alignment@ align = null, const string& tooltip = "") {
|
||||
return Occurance(text, config(configName), config::get(configName), min, max, align, tooltip);
|
||||
}
|
||||
|
||||
GuiGameOccurance@ Occurance(const string& text, uint setting, double value, double min = 0.0, double max = 2.0, Alignment@ align = null, const string& tooltip = "") {
|
||||
if(align is null)
|
||||
@align = nextAlignment();
|
||||
GuiGameOccurance ele(cur, align, text, setting);
|
||||
ele.defaultValue = value;
|
||||
ele.set(value);
|
||||
ele.setMin(min);
|
||||
ele.setMax(max);
|
||||
if(tooltip.length != 0)
|
||||
setMarkupTooltip(ele, tooltip, width=300);
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameFrequency@ Frequency(const string& text, const string& configName, double min = 0.0, double max = 2.0, Alignment@ align = null) {
|
||||
return Frequency(text, config(configName), config::get(configName), min, max, align);
|
||||
}
|
||||
|
||||
GuiGameFrequency@ Frequency(const string& text, uint setting, double value, double min = 0.0, double max = 2.0, Alignment@ align = null) {
|
||||
if(align is null)
|
||||
@align = nextAlignment();
|
||||
GuiGameFrequency ele(cur, align, text, setting);
|
||||
ele.defaultValue = value;
|
||||
ele.set(value);
|
||||
ele.setMin(min);
|
||||
ele.setMax(max);
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
GuiGameDropdown@ Dropdown(const string& text, const string& configName, Alignment@ align = null) {
|
||||
return Dropdown(text, config(configName), config::get(configName), align);
|
||||
}
|
||||
|
||||
GuiGameDropdown@ Dropdown(const string& text, uint setting, double value, Alignment@ align = null) {
|
||||
if(align is null)
|
||||
@align = nextAlignment();
|
||||
GuiGameDropdown ele(cur, align, text, setting);
|
||||
ele.defaultValue = value;
|
||||
ele.set(value);
|
||||
options.insertLast(ele);
|
||||
return ele;
|
||||
}
|
||||
|
||||
void makeSettings() {
|
||||
throw("SettingsPage does not implement makeSettings().");
|
||||
}
|
||||
|
||||
void reset() {
|
||||
uint cnt = options.length;
|
||||
for(uint i = 0; i < cnt; ++i)
|
||||
options[i].reset();
|
||||
}
|
||||
|
||||
void load(SettingsContainer& gs) {
|
||||
uint cnt = options.length;
|
||||
for(uint i = 0; i < cnt; ++i)
|
||||
options[i].load(gs);
|
||||
}
|
||||
|
||||
void apply(SettingsContainer& gs) {
|
||||
uint cnt = options.length;
|
||||
for(uint i = 0; i < cnt; ++i)
|
||||
options[i].apply(gs);
|
||||
}
|
||||
};
|
||||
|
||||
class GameSettingsPage : SettingsPage {
|
||||
Color color;
|
||||
string header;
|
||||
Sprite icon;
|
||||
|
||||
GameSettingsPage() {
|
||||
GAME_SETTINGS_PAGES.insertLast(this);
|
||||
}
|
||||
};
|
||||
|
||||
array<GameSettingsPage@> GAME_SETTINGS_PAGES;
|
||||
Reference in New Issue
Block a user