9 using namespace bl::gui;
14 content = Box::create(LinePacker::create(LinePacker::Vertical));
16 Button::Ptr rbut = Button::create(
"Refresh");
17 rbut->getSignal(Event::LeftClicked).willAlwaysCall(std::bind(&Scripts::refresh,
this));
20 scriptArea = ScrollArea::create(LinePacker::create(LinePacker::Vertical, 4.f));
21 scriptArea->setColor(sf::Color::White, sf::Color::Black);
22 scriptArea->setOutlineThickness(2.f);
23 content->pack(scriptArea,
true,
true);
25 window = Window::create(LinePacker::create(LinePacker::Vertical, 6.f),
"Peoplemon Script");
26 window->getSignal(Event::Closed).willAlwaysCall([
this](
const Event&, Element*) {
27 window->setForceFocus(
false);
30 file = Label::create(
"");
31 file->setColor(sf::Color(20, 230, 245), sf::Color::Transparent);
33 error = Label::create(
"");
35 ScrollArea::Ptr sourceScroll = ScrollArea::create(LinePacker::create());
36 sourceScroll->setRequisition({300.f, 200.f});
37 sourceScroll->setMaxSize({700.f, 700.f});
38 sourceScroll->setColor(sf::Color::White, sf::Color::Black);
39 sourceScroll->setOutlineThickness(2.f);
40 Box::Ptr padded = Box::create(LinePacker::create());
41 padded->setColor(sf::Color::White, sf::Color::Black);
42 source = Label::create(
"");
44 sourceScroll->pack(padded);
45 window->pack(sourceScroll,
true,
true);
55 void Scripts::refresh() {
57 scriptArea->clearChildren(
true);
59 const std::vector<std::string> files =
61 scripts.reserve(files.size());
62 for (
const std::string& file : files) {
63 scripts.emplace_back();
64 scripts.back().file = file;
65 if (!bl::util::FileUtil::readFile(file, scripts.back().source)) {
66 scripts.back().error.emplace(
"Failed to read file");
69 bl::script::Script test(file);
70 if (!test.valid()) { scripts.back().error.emplace(test.errorMessage()); }
74 std::sort(scripts.begin(), scripts.end());
76 for (
unsigned int i = 0; i < scripts.size(); ++i) {
77 Label::Ptr label = Label::create(scripts[i].file);
78 if (scripts[i].error.has_value()) {
79 label->setColor(sf::Color::Red, sf::Color::Transparent);
81 else { label->setColor(sf::Color::Green, sf::Color::Transparent); }
82 label->getSignal(Event::LeftClicked)
83 .willAlwaysCall(std::bind(&Scripts::openWindow,
this, i));
84 label->setHorizontalAlignment(RenderSettings::Left);
85 scriptArea->pack(label,
true,
false);
89 void Scripts::openWindow(
unsigned int i) {
90 file->setText(scripts[i].file);
91 source->setText(scripts[i].source);
92 error->setText(
"Error: " + scripts[i].error.value_or(
"No errors detected"));
93 if (scripts[i].error.has_value()) { error->setColor(sf::Color::Red, sf::Color::Transparent); }
94 else { error->setColor(sf::Color::Green, sf::Color::Transparent); }
96 window->setForceFocus(
true);
99 bool Scripts::Script::operator<(
const Script& rhs)
const {
100 if (error.has_value()) {
101 if (rhs.error.has_value()) {
return file < rhs.file; }
104 else if (rhs.error.has_value()) {
return false; }
105 return file < rhs.file;
All classes and functionality used for implementing the game editor.
static const std::string & ScriptPath()
Owns all primary systems and a reference to the engine.
Base class for all editor pages.
bl::gui::Box::Ptr content
Scripts(core::system::Systems &systems)
Creates a new scripting validation tab.
virtual void update(float dt) override
Refreshes if called for first time.