Open source Star Ruler 2 source code!

This commit is contained in:
Lucas de Vries
2018-07-17 14:15:37 +02:00
commit cc307720ff
4342 changed files with 2365070 additions and 0 deletions
@@ -0,0 +1,135 @@
#section disable menu
import dialogs.Dialog;
import elements.GuiFileChooser;
import elements.GuiButton;
import elements.GuiText;
import elements.GuiDropdown;
import dialogs.MessageDialog;
import util.design_export;
class DesignImportDialog : Dialog {
GuiFileChooser@ chooser;
GuiText@ label;
GuiDropdown@ classList;
GuiButton@ confirm;
DesignImportDialog(IGuiElement@ bind) {
super(bind);
addTitle(locale::IMPORT_DESIGNS);
@chooser = GuiFileChooser(window, Alignment(Left+12, Top+38, Right-12, Bottom-38),
modProfile["designs"], "", CFM_Multiple);
chooser.list.autoMultiple = true;
@label = GuiText(window, Alignment(Left+16, Bottom-34, Left+0.35f, Bottom-12), locale::IMPORT_INTO_CLASS);
@classList = GuiDropdown(window, Alignment(Left+0.35f+4, Bottom-34, Left+0.8f, Bottom-12));
classList.addItem(locale::SAVED_CLASS);
uint cnt = playerEmpire.designClassCount;
for(uint i = 0; i < cnt; ++i)
classList.addItem(playerEmpire.getDesignClass(i).name);
@confirm = GuiButton(window, Alignment(Left+0.8f+4, Bottom-34, Right-12, Bottom-12), locale::IMPORT);
height = 500;
}
//Event callbacks
bool showDesign(const Design@ dsg) {
return false;
}
void clickConfirm() {
const DesignClass@ inClass;
if(classList.selected > 0)
@inClass = playerEmpire.getDesignClass(classList.selected - 1);
string errors;
bool hasErrors = false;
const Design@ errDesign;
array<string> selected;
chooser.getSelectedFiles(selected, true);
for(uint i = 0, cnt = selected.length; i < cnt; ++i) {
DesignDescriptor desc;
string fname = getBasename(selected[i]);
if(!read_design(selected[i], desc)) {
errors += "\n"+fname+":\n - ";
errors += locale::ERROR_INVALID_FILE+"\n";
hasErrors = true;
continue;
}
//Report design renames
const Design@ prevDesign = playerEmpire.getDesign(desc.name);
if(prevDesign !is null && !prevDesign.obsolete) {
errors += "\n"+fname+":\n - ";
desc.name = uniqueDesignName(desc.name, playerEmpire);
errors += format(locale::ERROR_DUPLICATE_DESIGN, desc.name);
errors += "\n";
hasErrors = true;
@prevDesign = null;
}
//Report all design errors
@desc.hull = getBestHull(desc, getHullTypeTag(desc.hull));
const Design@ dsg = makeDesign(desc);
if(dsg.hasFatalErrors()) {
uint errCnt = dsg.errorCount;
errors += "\n"+fname+":\n";
for(uint j = 0; j < errCnt; ++j)
errors += " - "+dsg.errors[j].text+"\n";
hasErrors = true;
@errDesign = dsg;
continue;
}
if(desc.settings !is null)
dsg.setSettings(desc.settings);
const DesignClass@ cls = inClass;
if(cls is null && desc.className.length != 0)
@cls = playerEmpire.getDesignClass(desc.className);
if(cls is null)
@cls = playerEmpire.getDesignClass(locale::DOWNLOAD_DESIGN_CLASS, true);
if(prevDesign !is null)
playerEmpire.changeDesign(prevDesign, dsg, cls);
else
playerEmpire.addDesign(cls, dsg);
}
//Report errors
if(hasErrors) {
if(selected.length == 1 && errDesign !is null) {
if(showDesign(errDesign))
return;
}
message(locale::IMPORT_ERRORS + "\n" + errors, null, elem);
}
}
void confirmDialog() {
clickConfirm();
close();
}
bool onGuiEvent(const GuiEvent& event) {
if(event.caller is chooser && event.type == GUI_Confirmed) {
clickConfirm();
close();
return true;
}
if(event.caller is confirm && event.type == GUI_Clicked) {
clickConfirm();
close();
return true;
}
return Dialog::onGuiEvent(event);
}
};
DesignImportDialog@ importDesigns(IGuiElement@ bind = null) {
DesignImportDialog dlg(bind);
addDialog(dlg);
return dlg;
}