OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
AuxiliaryModel Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/AuxiliaryDataViewModel.hpp>

Inheritance diagram for AuxiliaryModel:
Collaboration diagram for AuxiliaryModel:

Public Member Functions

 AuxiliaryModel ()
 ~AuxiliaryModel ()
wxDataViewItem CreateFolder (wxString name=wxEmptyString)
wxDataViewItemArray ImportFile (AuxiliaryModelNode *sel, wxArrayString file_paths)
void Delete (const wxDataViewItem &item)
void MoveItem (const wxDataViewItem &dropped_item, const wxDataViewItem &dragged_item)
bool IsOrphan (const wxDataViewItem &item)
bool Rename (const wxDataViewItem &item, const wxString &name)
AuxiliaryModelNode * GetParent (AuxiliaryModelNode *node) const
void Reparent (AuxiliaryModelNode *node, AuxiliaryModelNode *new_parent)
void Init (wxString aux_path)
void Reload (wxString aux_path)
int Compare (const wxDataViewItem &item1, const wxDataViewItem &item2, unsigned int column, bool ascending) const wxOVERRIDE
virtual unsigned int GetColumnCount () const wxOVERRIDE
virtual wxString GetColumnType (unsigned int col) const wxOVERRIDE
virtual void GetValue (wxVariant &variant, const wxDataViewItem &item, unsigned int col) const wxOVERRIDE
virtual bool SetValue (const wxVariant &variant, const wxDataViewItem &item, unsigned int col) wxOVERRIDE
virtual bool IsEnabled (const wxDataViewItem &item, unsigned int col) const wxOVERRIDE
virtual wxDataViewItem GetParent (const wxDataViewItem &item) const wxOVERRIDE
virtual bool IsContainer (const wxDataViewItem &item) const wxOVERRIDE
virtual unsigned int GetChildren (const wxDataViewItem &parent, wxDataViewItemArray &array) const wxOVERRIDE

Private Attributes

AuxiliaryModelNode * m_root
wxString m_root_dir

Detailed Description

Constructor & Destructor Documentation

◆ AuxiliaryModel()

AuxiliaryModel::AuxiliaryModel ( )
35{
36 m_root = nullptr;
37}
AuxiliaryModelNode * m_root
Definition AuxiliaryDataViewModel.hpp:153

References m_root.

◆ ~AuxiliaryModel()

AuxiliaryModel::~AuxiliaryModel ( )
62{
63 if (wxDirExists(m_root_dir)) {
64 fs::path path_to_del(m_root_dir.ToStdWstring());
65 try {
66 fs::remove_all(path_to_del);
67 }
68 catch (...) {
69 BOOST_LOG_TRIVIAL(error) << "Failed removing the auxiliary directory " << m_root_dir.c_str();
70 }
71 m_root_dir = "";
72 }
73 delete m_root;
74 m_root = nullptr;
75}
wxString m_root_dir
Definition AuxiliaryDataViewModel.hpp:154

References m_root, and m_root_dir.

Member Function Documentation

◆ Compare()

int AuxiliaryModel::Compare ( const wxDataViewItem & item1,
const wxDataViewItem & item2,
unsigned int column,
bool ascending ) const
162{
163 wxASSERT(item1.IsOk() && item2.IsOk());
164 // should never happen
165
166 if (IsContainer(item1) && IsContainer(item2))
167 {
168 wxVariant value1, value2;
169 GetValue(value1, item1, 0);
170 GetValue(value2, item2, 0);
171
172 wxString str1 = value1.GetString();
173 wxString str2 = value2.GetString();
174 int res = str1.Cmp(str2);
175 if (res) return res;
176
177 // items must be different
178 wxUIntPtr litem1 = (wxUIntPtr)item1.GetID();
179 wxUIntPtr litem2 = (wxUIntPtr)item2.GetID();
180
181 return litem1 - litem2;
182 }
183
184 return wxDataViewModel::Compare(item1, item2, column, ascending);
185}
virtual bool IsContainer(const wxDataViewItem &item) const wxOVERRIDE
Definition AuxiliaryDataViewModel.cpp:235
virtual void GetValue(wxVariant &variant, const wxDataViewItem &item, unsigned int col) const wxOVERRIDE
Definition AuxiliaryDataViewModel.cpp:187

References GetValue(), and IsContainer().

Here is the call graph for this function:

◆ CreateFolder()

wxDataViewItem AuxiliaryModel::CreateFolder ( wxString name = wxEmptyString)
271{
272 wxString folder_name = name;
273 if (folder_name == wxEmptyString) {
274 folder_name = _L("New Folder");
275 for (int i = 1; i <= 1000; i++) {
276 bool exist = false;
277 for (AuxiliaryModelNode* node : m_root->GetChildren()) {
278 if (!node->IsContainer())
279 continue;
280
281 if (node->name == folder_name) {
282 exist = true;
283 break;
284 }
285 }
286
287 if (!exist)
288 break;
289
290 folder_name = _L("New Folder");
291 folder_name << "(" << i << ")";
292 }
293 }
294 else {
295 for (AuxiliaryModelNode* node : m_root->GetChildren()) {
296 if (!node->IsContainer())
297 continue;
298
299 if (node->name == folder_name) {
300 return wxDataViewItem(nullptr);
301 }
302 }
303 }
304
305 // Create folder in file system
306 fs::path bfs_path((m_root_dir + "\\" + folder_name).ToStdWstring());
307 if (fs::exists(bfs_path)) {
308 try {
309 bool is_done = fs::remove_all(bfs_path);
310 if (!is_done)
311 return wxDataViewItem(nullptr);
312 }
313 catch (...) {
314 BOOST_LOG_TRIVIAL(error) << "Failed removing the auxiliary directory " << m_root_dir.c_str();
315 }
316 }
317 fs::create_directory(bfs_path);
318
319 // Create model node
320 AuxiliaryModelNode* folder = new AuxiliaryModelNode(m_root, bfs_path.generic_wstring(), true);
321
322 // Notify wxDataViewCtrl to update ui
323 wxDataViewItem folder_item(folder);
324 ItemAdded(wxDataViewItem(NULL), folder_item);
325 return folder_item;
326}
#define _L(s)
Definition OBJ.cpp:34

References _L, m_root, and m_root_dir.

Referenced by Init().

Here is the caller graph for this function:

◆ Delete()

void AuxiliaryModel::Delete ( const wxDataViewItem & item)
379{
380 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
381 if (!node) // happens if item.IsOk()==false
382 return;
383
384 bool is_done = false;
385 if (node->IsContainer()) {
386 fs::path bfs_path((m_root_dir + "\\" + node->name).ToStdWstring());
387 try {
388 is_done = fs::remove_all(bfs_path);
389 }
390 catch (...) {
391 BOOST_LOG_TRIVIAL(error) << "Failed removing the auxiliary directory " << m_root_dir.c_str();
392 }
393 }
394 else {
395 fs::path bfs_path(node->path.ToStdWstring());
396 is_done = fs::remove(bfs_path);
397 }
398
399 if (!is_done)
400 return;
401
402 node->GetParent()->GetChildren().Remove(node);
403
405 wxDataViewItem parent_item = GetParent(item);
406 ItemDeleted(parent_item, item);
407 delete node;
408}
bool IsContainer() const
Definition AuxiliaryDataViewModel.hpp:55
wxString name
Definition AuxiliaryDataViewModel.hpp:92
AuxiliaryModelNode * GetParent()
Definition AuxiliaryDataViewModel.hpp:60
wxString path
Definition AuxiliaryDataViewModel.hpp:93
AuxiliaryModelNodePtrArray & GetChildren()
Definition AuxiliaryDataViewModel.hpp:70
AuxiliaryModelNode * GetParent(AuxiliaryModelNode *node) const
Definition AuxiliaryDataViewModel.cpp:497
void put_other_changes()
Definition bbs_3mf.cpp:9838

References AuxiliaryModelNode::GetChildren(), GetParent(), AuxiliaryModelNode::GetParent(), AuxiliaryModelNode::IsContainer(), m_root_dir, AuxiliaryModelNode::name, AuxiliaryModelNode::path, and Slic3r::put_other_changes().

Here is the call graph for this function:

◆ GetChildren()

unsigned int AuxiliaryModel::GetChildren ( const wxDataViewItem & parent,
wxDataViewItemArray & array ) const
virtual
250{
251 if (m_root == nullptr)
252 return 0;
253
254 AuxiliaryModelNode* node = (AuxiliaryModelNode*)parent.GetID();
255 if (!node)
256 {
257 node = m_root;
258 }
259
260 count = node->GetChildren().GetCount();
261 for (unsigned int pos = 0; pos < count; pos++)
262 {
263 AuxiliaryModelNode* child = node->GetChildren().Item(pos);
264 array.Add(wxDataViewItem((void*)child));
265 }
266
267 return count;
268}
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16

References count, AuxiliaryModelNode::GetChildren(), and m_root.

Here is the call graph for this function:

◆ GetColumnCount()

virtual unsigned int AuxiliaryModel::GetColumnCount ( ) const
inlinevirtual
130 {
131 return 1;
132 }

◆ GetColumnType()

virtual wxString AuxiliaryModel::GetColumnType ( unsigned int col) const
inlinevirtual
135 {
136 return "string";
137 }

◆ GetParent() [1/2]

AuxiliaryModelNode * AuxiliaryModel::GetParent ( AuxiliaryModelNode * node) const
498{
499 if (node == m_root || node->GetParent() == m_root)
500 return nullptr;
501
502 return node->GetParent();
503}

References AuxiliaryModelNode::GetParent(), and m_root.

Referenced by Delete(), GetParent(), and MoveItem().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetParent() [2/2]

wxDataViewItem AuxiliaryModel::GetParent ( const wxDataViewItem & item) const
virtual
229{
230 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
231
232 return wxDataViewItem(GetParent(node));
233}

References GetParent().

Here is the call graph for this function:

◆ GetValue()

void AuxiliaryModel::GetValue ( wxVariant & variant,
const wxDataViewItem & item,
unsigned int col ) const
virtual
189{
190 wxASSERT(item.IsOk());
191
192 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
193 switch (col)
194 {
195 case 0:
196 variant = node->name;
197 break;
198
199 default:
200 wxLogError("AuxiliaryModel::GetValue: wrong column %d", col);
201 }
202}

References AuxiliaryModelNode::name.

Referenced by Compare().

Here is the caller graph for this function:

◆ ImportFile()

wxDataViewItemArray AuxiliaryModel::ImportFile ( AuxiliaryModelNode * sel,
wxArrayString file_paths )
329{
330 if (sel == nullptr) {
331 sel = m_root;
332 }
333
334 wxDataViewItemArray added_items;
335 AuxiliaryModelNode* parent = sel->IsContainer() ? sel : sel->GetParent();
336 for (wxString file_path : file_paths) {
337 bool exists = false;
338 for (AuxiliaryModelNode* node : parent->GetChildren()) {
339 if (node->path == file_path) {
340 exists = true;
341 break;
342 }
343 }
344
345 if (exists)
346 continue;
347
348 // Copy imported file to project temp directory
349 fs::path src_bfs_path(file_path.ToStdWstring());
350 wxString dir_path = m_root_dir;
351 if (sel != m_root) {
352 dir_path += "\\";
353 dir_path += sel->name;
354 }
355 dir_path += "\\";
356 dir_path += src_bfs_path.filename().generic_wstring();
357
358 boost::system::error_code ec;
359 if (!fs::copy_file(src_bfs_path, fs::path(dir_path.ToStdWstring()), fs::copy_options::overwrite_existing, ec))
360 continue;
361
362 // Update model data
363 AuxiliaryModelNode* file = new AuxiliaryModelNode(parent, dir_path, false);
364
365 // Notify wxDataViewCtrl to update ui
366 wxDataViewItem file_item(file);
367 if (parent == m_root)
368 parent = nullptr;
370 wxDataViewItem parent_item(parent);
371 ItemAdded(parent_item, file_item);
372 added_items.push_back(file_item);
373 }
374
375 return added_items;
376}

References AuxiliaryModelNode::GetChildren(), AuxiliaryModelNode::GetParent(), AuxiliaryModelNode::IsContainer(), m_root, m_root_dir, AuxiliaryModelNode::name, and Slic3r::put_other_changes().

Here is the call graph for this function:

◆ Init()

void AuxiliaryModel::Init ( wxString aux_path)
40{
41 m_root = new AuxiliaryModelNode();
42 m_root_dir = aux_path;
43
44 if (wxDirExists(m_root_dir)) {
45 fs::path path_to_del(m_root_dir.ToStdWstring());
46 try {
47 fs::remove_all(path_to_del);
48 }
49 catch (...) {
50 BOOST_LOG_TRIVIAL(error) << "Failed removing the auxiliary directory " << m_root_dir.c_str();
51 }
52 }
53
54 fs::path top_dir_path(m_root_dir.ToStdWstring());
55 fs::create_directory(top_dir_path);
56
57 for (auto folder : s_default_folders)
58 CreateFolder(folder);
59}
static const std::array< wxString, 5 > s_default_folders
Definition Auxiliary.hpp:84
wxDataViewItem CreateFolder(wxString name=wxEmptyString)
Definition AuxiliaryDataViewModel.cpp:270

References CreateFolder(), m_root, m_root_dir, and s_default_folders.

Here is the call graph for this function:

◆ IsContainer()

bool AuxiliaryModel::IsContainer ( const wxDataViewItem & item) const
virtual
236{
237 // the invisible root node can have children
238 // (in our model always "MyMusic")
239 if (!item.IsOk())
240 return true;
241
242 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
243 return node->IsContainer();
244}

References AuxiliaryModelNode::IsContainer().

Referenced by Compare().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsEnabled()

bool AuxiliaryModel::IsEnabled ( const wxDataViewItem & item,
unsigned int col ) const
virtual
224{
225 return true;
226}

◆ IsOrphan()

bool AuxiliaryModel::IsOrphan ( const wxDataViewItem & item)
463{
464 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
465 return node->GetParent() != m_root;
466}

References AuxiliaryModelNode::GetParent(), and m_root.

Here is the call graph for this function:

◆ MoveItem()

void AuxiliaryModel::MoveItem ( const wxDataViewItem & dropped_item,
const wxDataViewItem & dragged_item )
411{
412 AuxiliaryModelNode* dropped = (AuxiliaryModelNode*)dropped_item.GetID();
413 AuxiliaryModelNode* dragged = (AuxiliaryModelNode*)dragged_item.GetID();
414
415 if (dragged == nullptr || dragged->IsContainer())
416 return;
417
418 AuxiliaryModelNode* target_folder = nullptr;
419 if (dropped == nullptr) {
420 target_folder = m_root;
421 }
422 else if (dropped->IsContainer()) {
423 target_folder = dropped;
424 }
425 else {
426 target_folder = dropped->GetParent();
427 }
428
429 if (dragged->GetParent() == target_folder)
430 return;
431
432 for (AuxiliaryModelNode* node : target_folder->GetChildren()) {
433 if (node->path == dragged->path)
434 return;
435 }
436
437 // Generate new path
438 wxString new_path = m_root_dir;
439 if (target_folder != m_root)
440 new_path += "\\" + target_folder->name;
441 new_path += "\\" + dragged->name;
442
443 // Perform file movement in file system
444 fs::path bfs_new_path(new_path.ToStdWstring());
445 fs::path bfs_old_path(dragged->path.ToStdWstring());
446 boost::system::error_code err;
447 fs::rename(bfs_old_path, bfs_new_path, err);
448 if (err.failed())
449 return;
450
451 // Reparent dragged node
452 wxDataViewItem old_parent_item = this->GetParent(dragged_item);
453 this->Reparent(dragged, target_folder);
454 dragged->path = new_path;
455
456 // Notify wxDataViewCtrl to update ui
458 ItemDeleted(old_parent_item, wxDataViewItem(dragged));
459 ItemAdded(wxDataViewItem(target_folder == m_root ? nullptr : target_folder), wxDataViewItem(dragged));
460}
void Reparent(AuxiliaryModelNode *node, AuxiliaryModelNode *new_parent)
Definition AuxiliaryDataViewModel.cpp:505

References AuxiliaryModelNode::GetChildren(), GetParent(), AuxiliaryModelNode::GetParent(), AuxiliaryModelNode::IsContainer(), m_root, m_root_dir, AuxiliaryModelNode::name, AuxiliaryModelNode::path, Slic3r::put_other_changes(), and Reparent().

Here is the call graph for this function:

◆ Reload()

void AuxiliaryModel::Reload ( wxString aux_path)
78{
79 fs::path new_aux_path(aux_path.ToStdWstring());
80
81 // Clean
82 try {
83 fs::remove_all(fs::path(m_root_dir.ToStdWstring()));
84 }
85 catch (...) {
86 BOOST_LOG_TRIVIAL(error) << "Failed removing the auxiliary directory " << m_root_dir.c_str();
87 }
88
89 if (m_root) {
90 delete m_root;
91 m_root = nullptr;
92 }
93 Cleared();
94
95 // Create new root.
96 m_root = new AuxiliaryModelNode();
97 m_root_dir = aux_path;
98
99 // Check new path. If not exist, create a new one.
100 if (!fs::exists(new_aux_path)) {
101 fs::create_directory(new_aux_path);
102 // Create default folders if they are not loaded
103 wxDataViewItemArray default_items;
104 for (auto folder : s_default_folders) {
105 wxString folder_path = aux_path + "\\" + folder;
106 if (fs::exists(folder_path.ToStdWstring())) continue;
107
108 fs::create_directory(folder_path.ToStdWstring());
109 AuxiliaryModelNode *node = new AuxiliaryModelNode(m_root,
110 folder_path,
111 true);
112 default_items.Add(wxDataViewItem(node));
113 }
114 ItemsAdded(wxDataViewItem(nullptr), default_items);
115 return;
116 }
117
118 // Load from new path
119 std::map<fs::path, AuxiliaryModelNode *> dir_cache;
120 fs::directory_iterator iter_end;
121 wxDataViewItemArray items;
122 for (fs::directory_iterator iter(new_aux_path); iter != iter_end; iter++) {
123 wxString path = iter->path().generic_wstring();
124 AuxiliaryModelNode* node = new AuxiliaryModelNode(m_root, path, fs::is_directory(iter->path()));
125 items.Add(wxDataViewItem(node));
126
127 if (node->IsContainer()) {
128 dir_cache.insert({ iter->path(), node });
129 }
130 }
131 ItemsAdded(wxDataViewItem(nullptr), items);
132
133 items.Clear();
134 for (auto dir : dir_cache) {
135 for (fs::directory_iterator iter(dir.first); iter != iter_end; iter++) {
136 if (fs::is_directory(iter->path()))
137 continue;
138
139 wxString file_path = iter->path().generic_wstring();
140 AuxiliaryModelNode* file = new AuxiliaryModelNode(dir.second, file_path, false);
141 items.Add(wxDataViewItem(file));
142 }
143 ItemsAdded(wxDataViewItem(dir.second), items);
144 }
145
146 // Create default folders if they are not loaded
147 wxDataViewItemArray default_items;
148 for (auto folder : s_default_folders) {
149 wxString folder_path = aux_path + "\\" + folder;
150 if (fs::exists(folder_path.ToStdWstring()))
151 continue;
152
153 fs::create_directory(folder_path.ToStdWstring());
154 AuxiliaryModelNode* node = new AuxiliaryModelNode(m_root, folder_path, true);
155 default_items.Add(wxDataViewItem(node));
156 }
157 ItemsAdded(wxDataViewItem(nullptr), default_items);
158}

References AuxiliaryModelNode::IsContainer(), m_root, m_root_dir, and s_default_folders.

Here is the call graph for this function:

◆ Rename()

bool AuxiliaryModel::Rename ( const wxDataViewItem & item,
const wxString & name )
469{
470 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
471 AuxiliaryModelNode* parent = node->GetParent();
472
473 if (node->IsContainer())
474 return false;
475
476 if (!parent->IsContainer())
477 return false;
478
479 for (AuxiliaryModelNode* cur_node : parent->GetChildren()) {
480 if (cur_node->name == name)
481 return false;
482 }
483
484 boost::system::error_code err;
485 fs::path old_path((m_root_dir + "\\" + parent->name + "\\" + node->name).ToStdWstring());
486 fs::path new_path((m_root_dir + "\\" + parent->name + "\\" + name).ToStdWstring());
487 fs::rename(old_path, new_path, err);
488 if (err.failed())
489 return false;
490
492 node->name = name;
493 node->path = m_root_dir + "\\" + parent->name + "\\" + name;
494 return true;
495}

References AuxiliaryModelNode::GetChildren(), AuxiliaryModelNode::GetParent(), AuxiliaryModelNode::IsContainer(), m_root_dir, AuxiliaryModelNode::name, AuxiliaryModelNode::path, and Slic3r::put_other_changes().

Here is the call graph for this function:

◆ Reparent()

void AuxiliaryModel::Reparent ( AuxiliaryModelNode * node,
AuxiliaryModelNode * new_parent )
506{
507 if (node->IsContainer())
508 return;
509
510 node->GetParent()->GetChildren().Remove(node);
511 node->SetParent(new_parent);
512 new_parent->Append(node);
513}
void Append(AuxiliaryModelNode *child)
Definition AuxiliaryDataViewModel.hpp:82
void SetParent(AuxiliaryModelNode *parent)
Definition AuxiliaryDataViewModel.hpp:65

References AuxiliaryModelNode::Append(), AuxiliaryModelNode::GetChildren(), AuxiliaryModelNode::GetParent(), AuxiliaryModelNode::IsContainer(), and AuxiliaryModelNode::SetParent().

Referenced by MoveItem().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetValue()

bool AuxiliaryModel::SetValue ( const wxVariant & variant,
const wxDataViewItem & item,
unsigned int col )
virtual
206{
207 wxASSERT(item.IsOk());
208
209 AuxiliaryModelNode* node = (AuxiliaryModelNode*)item.GetID();
210 switch (col)
211 {
212 case 0:
213 node->name = variant.GetString();
214 return true;
215
216 default:
217 wxLogError("AuxiliaryModel::SetValue: wrong column");
218 }
219 return false;
220}

References AuxiliaryModelNode::name.

Member Data Documentation

◆ m_root

◆ m_root_dir

wxString AuxiliaryModel::m_root_dir
private

The documentation for this class was generated from the following files: