Peoplemon  0.1.0
Peoplemon 3 game source documentation
Scripts.cpp
Go to the documentation of this file.
2 
3 #include <Core/Properties.hpp>
4 
5 namespace editor
6 {
7 namespace page
8 {
9 using namespace bl::gui;
10 
12 : Page(s)
13 , started(false) {
14  content = Box::create(LinePacker::create(LinePacker::Vertical));
15 
16  Button::Ptr rbut = Button::create("Refresh");
17  rbut->getSignal(Event::LeftClicked).willAlwaysCall(std::bind(&Scripts::refresh, this));
18  content->pack(rbut);
19 
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);
24 
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);
28  window->remove();
29  });
30  file = Label::create("");
31  file->setColor(sf::Color(20, 230, 245), sf::Color::Transparent);
32  window->pack(file);
33  error = Label::create("");
34  window->pack(error);
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("");
43  padded->pack(source);
44  sourceScroll->pack(padded);
45  window->pack(sourceScroll, true, true);
46 }
47 
48 void Scripts::update(float) {
49  if (!started) {
50  started = true;
51  refresh();
52  }
53 }
54 
55 void Scripts::refresh() {
56  scripts.clear();
57  scriptArea->clearChildren(true);
58 
59  const std::vector<std::string> files =
60  bl::util::FileUtil::listDirectory(core::Properties::ScriptPath(), "", true);
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");
67  }
68  else {
69  bl::script::Script test(file);
70  if (!test.valid()) { scripts.back().error.emplace(test.errorMessage()); }
71  }
72  }
73 
74  std::sort(scripts.begin(), scripts.end());
75 
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);
80  }
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);
86  }
87 }
88 
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); }
95  parent->pack(window);
96  window->setForceFocus(true);
97 }
98 
99 bool Scripts::Script::operator<(const Script& rhs) const {
100  if (error.has_value()) {
101  if (rhs.error.has_value()) { return file < rhs.file; }
102  return true;
103  }
104  else if (rhs.error.has_value()) { return false; }
105  return file < rhs.file;
106 }
107 
108 } // namespace page
109 } // namespace editor
All classes and functionality used for implementing the game editor.
Definition: Tile.hpp:11
static const std::string & ScriptPath()
Definition: Properties.cpp:618
Owns all primary systems and a reference to the engine.
Definition: Systems.hpp:47
Base class for all editor pages.
Definition: Page.hpp:32
bl::gui::Box::Ptr content
Definition: Page.hpp:69
bl::gui::GUI * parent
Definition: Page.hpp:70
Scripts(core::system::Systems &systems)
Creates a new scripting validation tab.
Definition: Scripts.cpp:11
virtual void update(float dt) override
Refreshes if called for first time.
Definition: Scripts.cpp:48