Elevate Engine 1
Loading...
Searching...
No Matches
WebFileDialog.cpp
Go to the documentation of this file.
1#include "WebFileDialog.h"
2
3#ifdef EE_PLATFORM_WEB
4
5#include <ImGuiFileDialog/ImGuiFileDialog.h>
6
7namespace Elevate
8{
9 std::string WebFileDialog::ConvertFilters(const std::vector<std::string>& filters) const
10 {
11 size_t totalSize = 0;
12 for (const auto& f : filters)
13 {
14 totalSize += f.length();
15 }
16
17 std::string filterString;
18 filterString.reserve(totalSize);
19
20 for (size_t i = 0; i < filters.size(); ++i)
21 {
22 filterString += filters[i].substr(1, filters[i].length() - 1); // Remove the leading "*""
23 if (i < filters.size() - 1)
24 {
25 filterString += ",";
26 }
27 }
28
29 return filterString;
30 }
31
32
33 void WebFileDialog::OpenFile(const std::string& title, const std::string& defaultPathOrFile, const std::vector<std::string>& filters, const std::string& filterDescription, bool allowMultiple)
34 {
35 IGFD::FileDialogConfig config;
36 config.path = defaultPathOrFile;
37 config.flags = ImGuiFileDialogFlags_Modal;
38 m_titleCache = title;
39 ImGuiFileDialog::Instance()->OpenDialog(title, title, ConvertFilters(filters).c_str(), config);
40 SetWaitingForFilePath();
41 }
42
43 void WebFileDialog::SaveFile(const std::string& title, const std::string& defaultPathOrFile, const std::vector<std::string>& filters, const std::string& filterDescription)
44 {
45 IGFD::FileDialogConfig config;
46 config.path = defaultPathOrFile;
47 config.flags = ImGuiFileDialogFlags_Modal;
48 m_titleCache = title;
49 ImGuiFileDialog::Instance()->OpenDialog(title, title, ConvertFilters(filters).c_str(), config);
50 SetWaitingForFilePath();
51 }
52
53 void WebFileDialog::SelectFolder(const std::string& title, const std::string& defaultPath)
54 {
55 IGFD::FileDialogConfig config;
56 config.path = defaultPath;
57 config.flags = ImGuiFileDialogFlags_Modal;
58 m_titleCache = title;
59 ImGuiFileDialog::Instance()->OpenDialog(title, title, "", config);
60 SetWaitingForDirPath();
61 }
62
63 bool WebFileDialog::DisplayAndGetResult(std::string& outPath)
64 {
65 // Display
66 if (ImGuiFileDialog::Instance()->Display(m_titleCache, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_Modal, ImVec2(600, 400))) {
67 if (ImGuiFileDialog::Instance()->IsOk()) { // action if OK
68 if (m_waitiingForFilePath)
69 {
70 SetResult(ImGuiFileDialog::Instance()->GetFilePathName());
71 }
72 else if (m_waitingForDirPath)
73 {
74 SetResult(ImGuiFileDialog::Instance()->GetCurrentPath());
75 }
76 }
77 // close
78 ImGuiFileDialog::Instance()->Close();
79 }
80
81 // Return result if possible
82 if (HasResult())
83 {
84 m_isActive = false;
85 outPath = ConsumeResult();
86 return true;
87 }
88 return false;
89 }
90
91 void WebFileDialog::SetWaitingForDirPath()
92 {
93 m_isActive = true;
94 m_waitingForDirPath = true;
95 m_waitiingForFilePath = false;
96 }
97
98 void WebFileDialog::SetWaitingForFilePath()
99 {
100 m_isActive = true;
101 m_waitingForDirPath = false;
102 m_waitiingForFilePath = true;
103 }
104}
105
106#endif