6 #include <unordered_map>
37 using std::unique_ptr;
38 using std::unordered_map;
67 FileDialogScreenController::FileDialogScreenController(
PopUps* popUps)
70 this->
cwd = FileSystem::getStandardFileSystem()->getCurrentWorkingPathName();
84 screenNode = GUIParser::parse(
"resources/engine/gui",
"popup_filedialog.xml");
99 Console::println(
"FileDialogScreenController::initialize(): An error occurred: " +
string(exception.what()));
113 bool accept(
const string& pathName,
const string& fileName)
override {
114 if (FileSystem::getStandardFileSystem()->isPath(pathName +
"/" + fileName) ==
true)
return true;
115 if (extension.empty() ==
false) {
116 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
"." + extension) ==
true)
return true;
118 for (
const auto& extension : fileDialogScreenController->extensions) {
119 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
"." + extension) ==
true)
return true;
129 ExtensionFilter(
FileDialogScreenController* fileDialogScreenController,
const string& extension): fileDialogScreenController(fileDialogScreenController), extension(extension) {
145 auto directory =
cwd;
147 FileSystem::getStandardFileSystem()->list(directory,
fileList, &extensionsFilter);
149 Console::println(
"FileDialogScreenController::setupFileDialogListBox(): An error occurred: " +
string(exception.what()));
165 string filesInnerNodeSubNodesXML;
166 filesInnerNodeSubNodesXML+=
167 "<scrollarea width=\"100%\" height=\"100%\" background-color=\"{$color.element_midground}\">\n";
168 for (
const auto& fileName : fileNameList) {
171 if (FileSystem::getStandardFileSystem()->isPath(
cwd +
"/" + fileName) ==
true) fileImageName =
"folder";
173 Console::println(
"FileDialogScreenController::setupFileDialogListBox(): An error occurred: " +
string(exception.what()));
175 filesInnerNodeSubNodesXML+=
176 "<selectbox-option text=\"" +
177 GUIParser::escape(fileName) +
179 GUIParser::escape(fileName) +
181 (selectedFileName == fileName?
" selected=\"true\"":
"") +
" " +
182 "image=\"{$icon.type_" + fileImageName +
"}\" " +
185 filesInnerNodeSubNodesXML+=
"</scrollarea>\n";
187 filesInnerNode->replaceSubNodes(filesInnerNodeSubNodesXML,
false);
189 Console::println(
"FileDialogScreenController::setupFileDialogListBox(): An error occurred: " +
string(exception.what()));
196 string favoritesInnerNodeSubNodesXML;
197 favoritesInnerNodeSubNodesXML+=
198 "<scrollarea width=\"100%\" height=\"100%\" background-color=\"{$color.element_midground}\">\n";
200 auto fileImageName =
"folder";
201 favoritesInnerNodeSubNodesXML+=
202 "<selectbox-option text=\"" +
203 GUIParser::escape(FileSystem::getStandardFileSystem()->
getFileName(StringTools::endsWith(favorite,
"/") ==
true?StringTools::substring(favorite, 0, favorite.size() - 1):favorite)) +
205 GUIParser::escape(favorite) +
207 "image=\"{$icon.type_folder}\" " +
210 favoritesInnerNodeSubNodesXML+=
"</scrollarea>\n";
212 favoritesInnerNode->replaceSubNodes(favoritesInnerNodeSubNodesXML,
false);
214 Console::println(
"FileDialogScreenController::setupFavorites(): An error occurred: " +
string(exception.what()));
221 string recentsInnerNodeSubNodesXML;
222 recentsInnerNodeSubNodesXML+=
223 "<scrollarea width=\"100%\" height=\"100%\" background-color=\"{$color.element_midground}\">\n";
224 auto recentsReversed =
recents;
225 reverse(recentsReversed.begin(), recentsReversed.end());
226 for (
const auto& recent: recentsReversed) {
227 auto fileImageName =
"folder";
228 recentsInnerNodeSubNodesXML+=
229 "<selectbox-option text=\"" +
230 GUIParser::escape(FileSystem::getStandardFileSystem()->
getFileName(StringTools::endsWith(recent,
"/") ==
true?StringTools::substring(recent, 0, recent.size() - 1):recent)) +
232 GUIParser::escape(recent) +
234 "image=\"{$icon.type_folder}\" " +
237 recentsInnerNodeSubNodesXML+=
"</scrollarea>\n";
239 recentsInnerNode->replaceSubNodes(recentsInnerNodeSubNodesXML,
false);
241 Console::println(
"FileDialogScreenController::setupRecents(): An error occurred: " +
string(exception.what()));
246 vector<string> drives;
248 for (
char drive =
'A'; drive <=
'Z'; drive++) {
253 if (FileSystem::getStandardFileSystem()->exists(fileName +
"/") ==
true) drives.push_back(fileName);
255 Console::println(
"FileDialogScreenController::setupDrives(): " +
string(exception.what()));
259 drives.push_back(
"/");
263 string drivesInnerNodeSubNodesXML;
264 drivesInnerNodeSubNodesXML+=
265 "<scrollarea width=\"100%\" height=\"100%\" background-color=\"{$color.element_midground}\">\n";
266 for (
const auto& drive: drives) {
267 drivesInnerNodeSubNodesXML+=
268 "<selectbox-option text=\"" +
269 GUIParser::escape(drive) +
271 GUIParser::escape(drive) +
273 "image=\"{$icon.type_drive}\" " +
276 drivesInnerNodeSubNodesXML+=
"</scrollarea>\n";
278 drivesInnerNode->replaceSubNodes(drivesInnerNodeSubNodesXML,
false);
280 Console::println(
"FileDialogScreenController::setupDrives(): An error occurred: " +
string(exception.what()));
284 void FileDialogScreenController::show(
const string& cwd,
const string& captionText,
const vector<string>& extensions,
const string& fileName,
bool enableFilter,
Action* applyAction,
Action* cancelAction,
const string& settingsFileName,
const string& settingsPathName)
294 if (
cwd.empty() ==
true) {
297 _cwd = defaultCwdByExtensionsIt->second;
303 this->cwd = FileSystem::getStandardFileSystem()->getCanonicalURI(_cwd,
"");
304 if (this->cwd.empty() ==
true || FileSystem::getStandardFileSystem()->isPath(this->cwd) ==
false) {
305 this->cwd = FileSystem::getStandardFileSystem()->getCurrentWorkingPathName();
308 Console::println(
"FileDialogScreenController::show(): An error occurred: " +
string(exception.what()));
309 this->cwd = FileSystem::getStandardFileSystem()->getCurrentWorkingPathName();
312 this->applyAction = unique_ptr<Action>(
applyAction);
315 string extensionsDropDownOptionsXML =
"<dropdown-option text=\"All supported extensions\" value=\"\" selected=\"true\"/>\n";
317 extensionsDropDownOptionsXML+=
"<dropdown-option text=\"" + StringTools::toUpperCase(extension) +
" Files\" value=\"" + StringTools::toLowerCase(extension) +
"\" selected=\"false\" />\n";
326 Engine::getInstance()->getGUI()->setFoccussedNode(
fileNameNode);
345 if (FileSystem::getStandardFileSystem()->exists(
cwd +
"/" + filterString) ==
true) {
349 if (filterString.empty() ==
true) {
352 vector<string> fileListFiltered;
354 if (filterString.empty() ==
true || StringTools::toLowerCase(file).find(filterString) != -1) fileListFiltered.push_back(file);
361 Console::println(
"FileDialogScreenController::onChange(): An error occurred: " +
string(exception.what()));
373 if (FileSystem::getStandardFileSystem()->isDrive(selectedFile) ==
true) {
381 if (FileSystem::getStandardFileSystem()->isPath(
cwd +
"/" + selectedFile) ==
true) {
384 cwd = FileSystem::getStandardFileSystem()->getCanonicalURI(
cwd, selectedFile);
386 Console::println(
"FileDialogScreenController::onAction(): An error occurred: " +
string(exception.what()));
400 Console::println(
"FileDialogScreenController::onAction(): An error occurred: " +
string(exception.what()));
405 if (StringTools::endsWith(
cwd,
"/") ==
true)
cwd = StringTools::substring(
cwd, 0,
cwd.size() - 1);
418 if (node->
getId() ==
"filedialog_apply") {
419 if (StringTools::endsWith(
cwd,
"/") ==
true)
cwd = StringTools::substring(
cwd, 0,
cwd.size() - 1);
430 if (node->
getId() ==
"filedialog_abort" ||
431 StringTools::startsWith(node->
getId(),
"filedialog_caption_close_") ==
true) {
442 if (node->
getId() ==
"filedialog_favorites_add") {
443 if (StringTools::endsWith(
cwd,
"/") ==
true)
cwd = StringTools::substring(
cwd, 0,
cwd.size() - 1);
448 if (node->
getId() ==
"filedialog_favorites_remove") {
453 if (node->
getId() ==
"filedialog_recent_delete") {
460 if (_cwd.empty() ==
false) {
467 if (_cwd.empty() ==
false) {
474 if (_cwd.empty() ==
false) {
484 if (node->
getId() ==
"filedialog_filename") {
504 while ((favorite = settings.
get(
"favorite_" + to_string(i++),
"")).empty() ==
false) {
511 while ((recent = settings.
get(
"recent_" + to_string(i++),
"")).empty() ==
false) {
517 string defaultCwdString;
518 while ((defaultCwdString = settings.
get(
"default_cwd_" + to_string(i++),
"")).empty() ==
false) {
519 auto defaultCwdComponents = StringTools::tokenize(defaultCwdString,
":");
520 if (defaultCwdComponents.size() == 2) {
526 Console::println(
"FileDialogScreenController::setDefaultCWD(): An error occurred: " +
string(exception.what()));
538 settings.
put(
"favorite_" + to_string(i++), favorite);
543 for (
const auto& recent:
recents) {
544 settings.
put(
"recent_" + to_string(i++), recent);
550 settings.
put(
"default_cwd_" + to_string(i++), extension +
":" +
defaultCwd);
555 Console::println(
"FileDialogScreenController::setDefaultCWD(): An error occurred: " +
string(exception.what()));
560 auto fileNameLowerCase = StringTools::toLowerCase(fileName);
561 if (StringTools::endsWith(fileNameLowerCase,
".ogg") ==
true) {
565 if (StringTools::endsWith(fileNameLowerCase,
".md") ==
true) {
569 if (fileNameLowerCase ==
"license") {
573 if (StringTools::endsWith(fileNameLowerCase,
".h") ==
true) {
576 if (StringTools::endsWith(fileNameLowerCase,
".cpp") ==
true) {
579 if (StringTools::endsWith(fileNameLowerCase,
".c") ==
true) {
582 if (StringTools::endsWith(fileNameLowerCase,
".tscript") ==
true) {
585 if (StringTools::endsWith(fileNameLowerCase,
".ttf") ==
true) {
589 if (StringTools::endsWith(fileNameLowerCase,
".icns") ==
true) {
592 if (StringTools::endsWith(fileNameLowerCase,
".ico") ==
true) {
595 if (StringTools::endsWith(fileNameLowerCase,
".png") ==
true) {
599 if (StringTools::endsWith(fileNameLowerCase,
".mpg") ==
true) {
603 if (StringTools::endsWith(fileNameLowerCase,
".dae") ==
true) {
606 if (StringTools::endsWith(fileNameLowerCase,
".fbx") ==
true) {
609 if (StringTools::endsWith(fileNameLowerCase,
".glb") ==
true) {
612 if (StringTools::endsWith(fileNameLowerCase,
".gltf") ==
true) {
615 if (StringTools::endsWith(fileNameLowerCase,
".tm") ==
true) {
619 if (StringTools::endsWith(fileNameLowerCase,
".properties") ==
true) {
623 if (StringTools::endsWith(fileNameLowerCase,
".cl") ==
true) {
626 if (StringTools::endsWith(fileNameLowerCase,
".frag") ==
true) {
629 if (StringTools::endsWith(fileNameLowerCase,
".glsl") ==
true) {
632 if (StringTools::endsWith(fileNameLowerCase,
".vert") ==
true) {
636 if (StringTools::endsWith(fileNameLowerCase,
".tempty") ==
true) {
640 if (StringTools::endsWith(fileNameLowerCase,
".ttrigger") ==
true) {
644 if (StringTools::endsWith(fileNameLowerCase,
".tenvmap") ==
true) {
648 if (StringTools::endsWith(fileNameLowerCase,
".tmodel") ==
true) {
652 if (StringTools::endsWith(fileNameLowerCase,
".tscene") ==
true) {
656 if (StringTools::endsWith(fileNameLowerCase,
".tparticle") ==
true) {
660 if (StringTools::endsWith(fileNameLowerCase,
".tdecal") ==
true) {
664 if (StringTools::endsWith(fileNameLowerCase,
".tterrain") ==
true) {
668 if (StringTools::endsWith(fileNameLowerCase,
".tscript") ==
true) {
672 if (StringTools::endsWith(fileNameLowerCase,
".xml") ==
true) {
676 if (StringTools::endsWith(fileNameLowerCase,
".nmake") ==
true) {
679 if (StringTools::endsWith(fileNameLowerCase,
".nmake.main") ==
true) {
683 if (StringTools::endsWith(fileNameLowerCase,
".bat") ==
true) {
687 if (StringTools::endsWith(fileNameLowerCase,
".sh") ==
true) {
690 if (StringTools::endsWith(fileNameLowerCase,
".bash") ==
true) {
694 if (fileName.rfind(
".") == string::npos ||
695 (fileName.rfind(
"/") != string::npos &&
696 fileName.rfind(
".") < fileName.rfind(
"/"))) {
GUI node controller base class.
virtual void setValue(const MutableString &value)=0
Set value.
virtual const MutableString & getValue()=0
const string & getToolTip()
GUINodeController * getController()
GUIScreenNode * getScreenNode()
GUI parent node base class thats supporting child nodes.
GUI screen node that represents a screen that can be rendered via GUI system.
void setEnabled(bool enabled)
Set enabled.
void addChangeListener(GUIChangeListener *listener)
Add change listener.
void addTooltipRequestListener(GUITooltipRequestListener *listener)
Add tooltip request listener.
void addActionListener(GUIActionListener *listener)
Add action listener.
void addFocusListener(GUIFocusListener *listener)
Add focus listener.
GUINode * getInnerNodeById(const string &nodeId)
Get inner GUI node by id.
GUINode * getNodeById(const string &nodeId)
Get GUI node by id.
File system singleton class.
Mutable utf8 aware string class.
const string & getString() const
Properties class, which helps out with storeing or loading key value pairs from/to property files.
void put(const string &key, const string &value)
Add property.
const string & get(const string &key, const string &defaultValue) const
Get property value by key.
void load(const string &pathName, const string &fileName, FileSystemInterface *fileSystem=nullptr)
Load property file.
void store(const string &pathName, const string &fileName, FileSystemInterface *fileSystem=nullptr) const
Store property file.
std::exception Exception
Exception base class.
GUI action listener interface.
File system file name filter interface.