11 #include <SimoxUtility/algorithm/string/string_tools.h>
23 _latestDirectory = QString::fromStdString(
"/tmp/MemoryExport");
25 _loadFromDiskButton =
new QPushButton(
" Load Query from Disk into WM",
this);
26 _loadFromDiskButton->setIcon(QIcon(
":/icons/document-open.svg"));
27 _storeOnDiskButton =
new QPushButton(
" Store shown Data on Disk",
this);
28 _storeOnDiskButton->setIcon(QIcon(
":/icons/document-save.svg"));
31 std::vector<QPushButton*> buttons{_storeOnDiskButton, _loadFromDiskButton};
32 for (QPushButton* button : buttons)
34 button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
37 this->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
39 QHBoxLayout* layout =
new QHBoxLayout();
40 this->setLayout(layout);
43 layout->setContentsMargins(margin, margin, margin, margin);
45 layout->addWidget(_loadFromDiskButton);
46 layout->addWidget(_storeOnDiskButton);
51 connect(_loadFromDiskButton,
52 &QPushButton::pressed,
55 QString directory = chooseDirectoryDialog();
56 if (directory.size() > 0)
61 connect(_storeOnDiskButton,
62 &QPushButton::pressed,
65 QString directory = chooseDirectoryDialog();
66 if (directory.size() > 0)
73 static const std::string&
74 handleSingular(
int num,
const std::string& singular,
const std::string& plural)
76 return num == 1 ? singular : plural;
81 const std::vector<wm::Memory> memoryData,
82 std::string* outStatus)
84 std::filesystem::path path(directory.toUtf8().constData());
88 if (std::filesystem::is_regular_file(path))
90 status <<
"Could not export memories contents to " << path
91 <<
": Cannot overwrite existing file.";
96 for (
const auto&
data : memoryData)
98 std::string name =
data.id().memoryName;
99 if (std::filesystem::is_regular_file(path / name))
101 status <<
"Could not export memory '" << name <<
"' to " << path
102 <<
": Cannot overwrite existing file.\n";
112 status <<
"Exported " << numStored <<
" "
113 << handleSingular(numStored,
"memory",
"memories") <<
" to " << path <<
".";
118 *outStatus =
status.str();
122 std::map<std::filesystem::path, wm::Memory>
125 std::string* outStatus)
127 std::filesystem::path path(directory.toUtf8().constData());
129 std::map<std::filesystem::path, wm::Memory> memoryData;
131 auto setStatus = [&](
const std::string&
s)
139 if (not std::filesystem::is_directory(path))
141 setStatus(
"Could not import a memory from " + path.string() +
142 ". It is not a directory. Skipping import.");
148 bool isSingleMemory =
false;
149 for (
auto i = std::filesystem::recursive_directory_iterator(path);
150 i != std::filesystem::recursive_directory_iterator();
156 setStatus(
"Could not import a memory from " + path.string() +
157 ". Data files were not found until max-depth 7. Skipping import.");
164 if (std::filesystem::is_regular_file(dir.path()) &&
179 auto loadMemory = [&](
const std::filesystem::path& p)
181 if (std::filesystem::is_directory(p))
184 p.parent_path().parent_path(),
"MemoryExport", p.filename());
187 memoryData[p] = std::move(
memory);
200 for (
const auto& dir : std::filesystem::directory_iterator(path))
202 loadMemory(dir.path());
207 handleSingular(numLoaded,
"memory",
"memories") +
" from " + path.string() +
".");
212 ControlWidget::chooseDirectoryDialog()
214 _latestDirectory = QFileDialog::getExistingDirectory(
this,
217 QFileDialog::ShowDirsOnly |
218 QFileDialog::DontResolveSymlinks);
220 return _latestDirectory;