From 9bc1599d90003d311fccb5a9bb31080261e4841d Mon Sep 17 00:00:00 2001 From: apoorv569 Date: Tue, 6 Jul 2021 01:12:31 +0530 Subject: [PATCH] New trash page and add context menu and drag and drop feature for moving samples to trash. --- src/ControlID_Enums.hpp | 9 +- src/Database.cpp | 86 +++++++++ src/Database.hpp | 3 + src/MainFrame.cpp | 389 ++++++++++++++++++++++++++++------------ src/MainFrame.hpp | 14 +- 5 files changed, 375 insertions(+), 126 deletions(-) diff --git a/src/ControlID_Enums.hpp b/src/ControlID_Enums.hpp index 5035f66..c7a8e35 100644 --- a/src/ControlID_Enums.hpp +++ b/src/ControlID_Enums.hpp @@ -24,8 +24,8 @@ enum ControlIDs BC_SampleListView, BC_Search, BC_MediaCtrl, - BC_TrashPane, - BC_RestoreTrashedItemButton, + BC_Trash, + BC_RestoreTrashedItem, BC_HiveAdd, BC_HiveRemove, @@ -56,6 +56,11 @@ enum ControlIDs MN_FilterSampleView, MN_ShowInLibrary, + // ------------------------------------------------------------------- + // Trash Menu items + MN_DeleteTrash, + MN_RestoreTrashedItem, + // ------------------------------------------------------------------- // Edit tags dialog controls ET_TitleCheck, diff --git a/src/Database.cpp b/src/Database.cpp index 3deb36a..2f51dd4 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -1346,3 +1346,89 @@ void Database::UpdateTrashColumn(const std::string& filename, int value) wxLogDebug(exception.what()); } } + +wxVector> +Database::RestoreFromTrashByFilename(const std::string& filename, wxVector>& vecSet, + bool show_extension) +{ + try + { + if (sqlite3_open("sample.hive", &m_Database) != SQLITE_OK) + { + wxLogDebug("Error opening DB"); + throw sqlite3_errmsg(m_Database); + } + + std::string restore = "SELECT FAVORITE, FILENAME, EXTENSION, SAMPLEPACK, \ + TYPE, CHANNELS, LENGTH, SAMPLERATE, BITRATE, PATH, \ + TRASHED, HIVE FROM SAMPLES WHERE FILENAME = ?;"; + + rc = sqlite3_prepare_v2(m_Database, restore.c_str(), restore.size(), &m_Stmt, NULL); + + rc = sqlite3_bind_text(m_Stmt, 1, filename.c_str(), filename.size(), SQLITE_STATIC); + + if (rc == SQLITE_OK) + { + while (SQLITE_ROW == sqlite3_step(m_Stmt)) + { + int favorite = sqlite3_column_int(m_Stmt, 0); + wxString filename = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 1))); + wxString file_extension = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 2))); + wxString sample_pack = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 3))); + wxString sample_type = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 4))); + int channels = sqlite3_column_int(m_Stmt, 5); + int length = sqlite3_column_int(m_Stmt, 6); + int sample_rate = sqlite3_column_int(m_Stmt, 7); + int bitrate = sqlite3_column_int(m_Stmt, 8); + wxString path = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 9))); + int trashed = sqlite3_column_int(m_Stmt, 10); + wxString hive_name = std::string(reinterpret_cast(sqlite3_column_text(m_Stmt, 11))); + + wxVector vec; + + wxVariant icon_c, icon_gs; + icon_c = wxVariant(wxBitmap("../assets/icons/icon-hive_16x16.png")); + icon_gs = wxVariant(wxBitmap("../assets/icons/icon-hive_16x16-gs.png")); + + if (trashed == 0) + { + if (favorite == 1) + vec.push_back(icon_c); + else + vec.push_back(icon_gs); + + if (show_extension) + vec.push_back(path.AfterLast('/')); + else + vec.push_back(path.AfterLast('/').BeforeLast('.')); + + vec.push_back(sample_pack); + vec.push_back(sample_type); + vec.push_back(wxString::Format("%d", channels)); + vec.push_back(wxString::Format("%d", length)); + vec.push_back(wxString::Format("%d", sample_rate)); + vec.push_back(wxString::Format("%d", bitrate)); + + vecSet.push_back(vec); + } + } + } + else + { + wxMessageDialog msgDialog(NULL, "Error! Cannot load data from table.", + "Error", wxOK | wxICON_ERROR); + msgDialog.ShowModal(); + sqlite3_free(m_ErrMsg); + } + + rc = sqlite3_finalize(m_Stmt); + + sqlite3_close(m_Database); + } + catch (const std::exception &exception) + { + wxLogDebug(exception.what()); + } + + return vecSet; +} diff --git a/src/Database.hpp b/src/Database.hpp index d552fbb..94c02be 100644 --- a/src/Database.hpp +++ b/src/Database.hpp @@ -77,6 +77,9 @@ class Database wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension); void LoadHivesDatabase(wxDataViewTreeCtrl& favorite_tree); wxVector> + RestoreFromTrashByFilename(const std::string& filename, wxVector>& vecSet, + bool show_extension); + wxVector> FilterDatabaseBySampleName(wxVector>& sampleVec, const std::string& sampleName, bool show_extension); wxVector> diff --git a/src/MainFrame.cpp b/src/MainFrame.cpp index d53225e..1c27162 100644 --- a/src/MainFrame.cpp +++ b/src/MainFrame.cpp @@ -67,9 +67,11 @@ MainFrame::MainFrame() m_HivesMainSizer = new wxBoxSizer(wxVERTICAL); m_HivesFavoritesSizer = new wxBoxSizer(wxVERTICAL); - m_HivesViewTrashSizer = new wxBoxSizer(wxVERTICAL); m_HivesButtonSizer = new wxBoxSizer(wxHORIZONTAL); + + m_TrashMainSizer = new wxBoxSizer(wxVERTICAL); m_TrashItemSizer = new wxBoxSizer(wxVERTICAL); + m_TrashButtonSizer = new wxBoxSizer(wxHORIZONTAL); // Main panel of the app m_MainPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); @@ -105,39 +107,42 @@ MainFrame::MainFrame() m_DirCtrl->SetPath(path); // This panel will hold page 2nd page of wxNotebook - m_HivesPanel = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); + m_HivesPanel = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); m_AddHiveButton = new wxButton(m_HivesPanel, BC_HiveAdd, "+", wxDefaultPosition, wxDefaultSize, 0); m_AddHiveButton->SetToolTip("Create new hive"); m_RemoveHiveButton = new wxButton(m_HivesPanel, BC_HiveRemove, "-", wxDefaultPosition, wxDefaultSize, 0); m_RemoveHiveButton->SetToolTip("Delete selected hive"); - // m_TrashButton = new wxButton(m_HivesPanel, BC_TrashButton, "Trash", wxDefaultPosition, wxDefaultSize, 0); // Initializing wxTreeCtrl as another page of wxNotebook m_Hives = new wxDataViewTreeCtrl(m_HivesPanel, BC_Hives, wxDefaultPosition, wxDefaultSize, wxDV_NO_HEADER | wxDV_SINGLE); - m_Hives->DragAcceptFiles(true); - - m_TrashPane = new wxCollapsiblePane(m_HivesPanel, BC_TrashPane, "Trash", - wxDefaultPosition, wxDefaultSize, wxCP_DEFAULT_STYLE); - - m_TrashPaneWindow = m_TrashPane->GetPane(); - - m_TrashedItems = new wxTreeCtrl(m_TrashPaneWindow, BC_Hives, wxDefaultPosition, wxDefaultSize, - wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE); - - m_RestoreTrashedItemButton = new wxButton(m_TrashPaneWindow, BC_RestoreTrashedItemButton, "Restore item"); - // Adding default hive favorites_hive = m_Hives->AppendContainer(wxDataViewItem(wxNullPtr), "Favorites"); + // Setting m_Hives to accept files to be dragged and dropped on it + m_Hives->DragAcceptFiles(true); + + m_TrashPanel = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + + m_Trash = new wxTreeCtrl(m_TrashPanel, BC_Trash, wxDefaultPosition, wxDefaultSize, + wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_MULTIPLE); + + // Setting m_Trash to accept files to be dragged and dropped on it + m_Trash->DragAcceptFiles(true); + + m_RestoreTrashedItemButton = new wxButton(m_TrashPanel, BC_RestoreTrashedItem, "Restore sample", + wxDefaultPosition, wxDefaultSize, 0); + m_RestoreTrashedItemButton->SetToolTip("Restore selected sample"); + // Addubg root to TrashedItems - trash_root_node = m_TrashedItems->AddRoot("ROOT"); + trash_root = m_Trash->AddRoot("Trash"); // Adding the pages to wxNotebook m_Notebook->AddPage(m_DirCtrl, "Browse", false); m_Notebook->AddPage(m_HivesPanel, "Hives", false); + m_Notebook->AddPage(m_TrashPanel, "Trash", false); // Right half of BottomSlitter window m_BottomRightPanel = new wxPanel(m_BottomSplitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); @@ -273,8 +278,9 @@ MainFrame::MainFrame() Bind(wxEVT_TIMER, &MainFrame::UpdateElapsedTime, this); - Bind(wxEVT_BUTTON, &MainFrame::OnClickRestoreTrashItem, this, BC_RestoreTrashedItemButton); - Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, &MainFrame::OnExpandTrash, this, BC_TrashPane); + m_Trash->Connect(wxEVT_DROP_FILES, wxDropFilesEventHandler(MainFrame::OnDragAndDropToTrash), NULL, this); + Bind(wxEVT_TREE_ITEM_RIGHT_CLICK, &MainFrame::OnShowTrashContextMenu, this, BC_Trash); + Bind(wxEVT_BUTTON, &MainFrame::OnClickRestoreTrashItem, this, BC_RestoreTrashedItem); Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MainFrame::OnClickSampleView, this, BC_SampleListView); Bind(wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, &MainFrame::OnDragFromSampleView, this); @@ -316,18 +322,17 @@ MainFrame::MainFrame() m_HivesFavoritesSizer->Add(m_Hives, 1, wxALL | wxEXPAND, 2); - m_HivesViewTrashSizer->Add(m_TrashPane, 1, wxALL | wxEXPAND, 2); - m_HivesButtonSizer->Add(m_AddHiveButton, 1, wxALL | wxEXPAND, 2); m_HivesButtonSizer->Add(m_RemoveHiveButton, 1, wxALL | wxEXPAND, 2); - // m_HivesButtonSizer->Add(m_TrashButton, 1, wxALL | wxEXPAND, 2); m_HivesMainSizer->Add(m_HivesFavoritesSizer, 1, wxALL | wxEXPAND, 2); - m_HivesViewTrashSizerItem = m_HivesMainSizer->Add(m_HivesViewTrashSizer, 0, wxALL | wxEXPAND, 2); m_HivesMainSizer->Add(m_HivesButtonSizer, 0, wxALL | wxEXPAND, 2); - m_TrashItemSizer->Add(m_TrashedItems, 1, wxALL | wxEXPAND, 2); - m_TrashItemSizer->Add(m_RestoreTrashedItemButton, 0, wxALL | wxEXPAND, 2); + m_TrashItemSizer->Add(m_Trash, 1, wxALL | wxEXPAND, 2); + m_TrashButtonSizer->Add(m_RestoreTrashedItemButton, 1, wxALL | wxEXPAND, 2); + + m_TrashMainSizer->Add(m_TrashItemSizer, 1, wxALL | wxEXPAND, 2); + m_TrashMainSizer->Add(m_TrashButtonSizer, 0, wxALL | wxEXPAND, 2); m_BottomRightPanelMainSizer->Add(m_SearchBox, 1, wxALL | wxEXPAND, 2); m_BottomRightPanelMainSizer->Add(m_InfoBar, 0, wxALL | wxEXPAND, 2); @@ -363,10 +368,10 @@ MainFrame::MainFrame() m_HivesMainSizer->Layout(); // Sizer for trash pane - m_TrashPaneWindow->SetSizer(m_TrashItemSizer); - m_TrashItemSizer->Fit(m_TrashPaneWindow); - m_TrashItemSizer->SetSizeHints(m_TrashPaneWindow); - m_TrashItemSizer->Layout(); + m_TrashPanel->SetSizer(m_TrashMainSizer); + m_TrashMainSizer->Fit(m_TrashPanel); + m_TrashMainSizer->SetSizeHints(m_TrashPanel); + m_TrashMainSizer->Layout(); // Sizer for bottom right panel m_BottomRightPanel->SetSizer(m_BottomRightPanelMainSizer); @@ -1693,27 +1698,38 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) case MN_TrashSample: { wxDataViewItem root = wxDataViewItem(wxNullPtr); - wxDataViewItem container; - wxDataViewItem child; + wxDataViewItem container, child; if (db.IsTrashed(filename)) wxLogDebug("Already trashed.."); else { - if (m_SampleListView->GetSelectedItemsCount() <= 1) + wxDataViewItemArray items; + int rows = m_SampleListView->GetSelections(items); + + wxString name; + wxFileDataObject file_data; + wxArrayString files; + + for (int i = 0; i < rows; i++) { - wxString name = m_SampleListView->GetTextValue(selected_row, 1); + int item_row = m_SampleListView->ItemToRow(items[i]); - filename = settings.IsShowFileExtension() ? - name.BeforeLast('.').ToStdString() : name.ToStdString(); + wxString text_value = m_SampleListView->GetTextValue(item_row, 1); - wxLogDebug("Trashing.."); + std::string multi_selection = settings.IsShowFileExtension() ? + m_SampleListView->GetTextValue(item_row, 1).BeforeLast('.').ToStdString() : + m_SampleListView->GetTextValue(item_row, 1).ToStdString() ; - if (db.GetFavoriteColumnValueByFilename(filename)) + file_data.AddFile(multi_selection); + + files = file_data.GetFilenames(); + + if (db.GetFavoriteColumnValueByFilename(files[i].ToStdString())) { - m_SampleListView->SetValue(wxVariant(wxBitmap(ICON_GREYSCALE)), selected_row, 0); + m_SampleListView->SetValue(wxVariant(wxBitmap(ICON_GREYSCALE)), item_row, 0); - db.UpdateFavoriteColumn(filename, 0); + db.UpdateFavoriteColumn(files[i].ToStdString(), 0); for (int j = 0; j < m_Hives->GetChildCount(root); j++) { @@ -1727,7 +1743,7 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) m_Hives->GetItemText(child).BeforeLast('.') : m_Hives->GetItemText(child); - if (child_text == filename) + if (child_text == files[i]) { m_Hives->DeleteItem(child); break; @@ -1736,68 +1752,14 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) } } - db.UpdateTrashColumn(filename, 1); - m_TrashedItems->AppendItem(trash_root_node, name); - m_SampleListView->DeleteItem(selected_row); + db.UpdateTrashColumn(files[i].ToStdString(), 1); + db.UpdateHiveName(files[i].ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); - msg = wxString::Format("%s sent to trash", name); - } - else - { - wxDataViewItemArray items; - int rows = m_SampleListView->GetSelections(items); + m_Trash->AppendItem(trash_root, text_value); - wxString name; - wxFileDataObject file_data; - wxArrayString files; + m_SampleListView->DeleteItem(item_row); - for (int i = 0; i < rows; i++) - { - int item_row = m_SampleListView->ItemToRow(items[i]); - - wxString text_value = m_SampleListView->GetTextValue(item_row, 1); - - std::string multi_selection = settings.IsShowFileExtension() ? - m_SampleListView->GetTextValue(item_row, 1).BeforeLast('.').ToStdString() : - m_SampleListView->GetTextValue(item_row, 1).ToStdString() ; - - file_data.AddFile(multi_selection); - - files = file_data.GetFilenames(); - - if (db.GetFavoriteColumnValueByFilename(files[i].ToStdString())) - { - m_SampleListView->SetValue(wxVariant(wxBitmap(ICON_GREYSCALE)), item_row, 0); - - db.UpdateFavoriteColumn(files[i].ToStdString(), 0); - - for (int j = 0; j < m_Hives->GetChildCount(root); j++) - { - container = m_Hives->GetNthChild(root, j); - - for (int k = 0; k < m_Hives->GetChildCount(container); k++) - { - child = m_Hives->GetNthChild(container, k); - - wxString child_text = settings.IsShowFileExtension() ? - m_Hives->GetItemText(child).BeforeLast('.') : - m_Hives->GetItemText(child); - - if (child_text == files[i]) - { - m_Hives->DeleteItem(child); - break; - } - } - } - } - - db.UpdateTrashColumn(files[i].ToStdString(), 1); - m_TrashedItems->AppendItem(trash_root_node, text_value); - m_SampleListView->DeleteItem(item_row); - - msg = wxString::Format("%s sent to trash", text_value); - } + msg = wxString::Format("%s sent to trash", text_value); } } } @@ -1847,8 +1809,7 @@ void MainFrame::LoadDatabase() wxVector> dataset; if (db.LoadSamplesDatabase(dataset, *m_Hives, favorites_hive, - *m_TrashedItems, trash_root_node, - settings.IsShowFileExtension()).empty()) + *m_Trash, trash_root, settings.IsShowFileExtension()).empty()) { wxLogInfo("Error! Database is empty."); } @@ -1866,16 +1827,168 @@ void MainFrame::LoadDatabase() } } -void MainFrame::OnExpandTrash(wxCollapsiblePaneEvent& event) +void MainFrame::OnShowTrashContextMenu(wxTreeEvent& event) { - if(m_TrashPane->IsExpanded()) + Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); + Database db(*m_InfoBar); + + wxTreeItemId selected_trashed_item = event.GetItem(); + + wxMenu menu; + + menu.Append(MN_DeleteTrash, "Delete from database"); + menu.Append(MN_RestoreTrashedItem, "Restore sample"); + + if (selected_trashed_item.IsOk()) { - m_HivesViewTrashSizerItem->SetProportion(1); - m_HivesPanel->Layout(); + switch (m_Trash->GetPopupMenuSelectionFromUser(menu, event.GetPoint())) + { + case MN_DeleteTrash: + { + wxLogDebug("Delete permanently"); + + wxString trashed_item_name = settings.IsShowFileExtension() ? + m_Trash->GetItemText(selected_trashed_item).BeforeLast('.') : + m_Trash->GetItemText(selected_trashed_item); + + db.RemoveSampleFromDatabase(trashed_item_name.ToStdString()); + + m_Trash->Delete(selected_trashed_item); + } + break; + case MN_RestoreTrashedItem: + { + wxLogDebug("Restore sample"); + + Database db(*m_InfoBar); + + wxArrayTreeItemIds selected_item_ids; + m_Trash->GetSelections(selected_item_ids); + + wxFileDataObject file_data; + wxArrayString files; + + wxString selected_item_text; + std::string filename; + + for (size_t i = 0; i < selected_item_ids.GetCount(); i++) + { + selected_item_text = m_Trash->GetItemText(selected_item_ids[i]); + + wxLogDebug("Count: %d :: Selected item text: %s", + (int)selected_item_ids.GetCount(), selected_item_text); + + filename = GetFilenamePathAndExtension(selected_item_text).Filename; + + file_data.AddFile(filename); + + files = file_data.GetFilenames(); + + db.UpdateTrashColumn(files[i].ToStdString(), 0); + + try + { + wxVector> dataset; + + if (db.RestoreFromTrashByFilename(files[i].ToStdString(), dataset, + settings.IsShowFileExtension()).empty()) + { + wxLogDebug("Error! Database is empty."); + } + else + { + for (auto data : dataset) + { + m_SampleListView->AppendItem(data); + } + } + } + catch (...) + { + std::cerr << "Error loading data." << std::endl; + } + + m_Trash->Delete(selected_item_ids[i]); + } + } + break; + default: + break; + } } - else - { m_HivesViewTrashSizerItem->SetProportion(0) ; - m_HivesPanel->Layout(); +} + +void MainFrame::OnDragAndDropToTrash(wxDropFilesEvent& event) +{ + Database db(*m_InfoBar); + Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); + + if (event.GetNumberOfFiles() > 0) + { + wxFileDataObject file_data; + wxArrayString files; + + wxDataViewItemArray items; + int rows = m_SampleListView->GetSelections(items); + + wxString msg; + + wxDataViewItem root = wxDataViewItem(wxNullPtr); + wxDataViewItem container, child; + + for (int i = 0; i < rows; i++) + { + int item_row = m_SampleListView->ItemToRow(items[i]); + + wxString text_value = m_SampleListView->GetTextValue(item_row, 1); + + std::string multi_selection = settings.IsShowFileExtension() ? + m_SampleListView->GetTextValue(item_row, 1).BeforeLast('.').ToStdString() : + m_SampleListView->GetTextValue(item_row, 1).ToStdString() ; + + file_data.AddFile(multi_selection); + + files = file_data.GetFilenames(); + + if (db.GetFavoriteColumnValueByFilename(files[i].ToStdString())) + { + m_SampleListView->SetValue(wxVariant(wxBitmap(ICON_GREYSCALE)), item_row, 0); + + db.UpdateFavoriteColumn(files[i].ToStdString(), 0); + + for (int j = 0; j < m_Hives->GetChildCount(root); j++) + { + container = m_Hives->GetNthChild(root, j); + + for (int k = 0; k < m_Hives->GetChildCount(container); k++) + { + child = m_Hives->GetNthChild(container, k); + + wxString child_text = settings.IsShowFileExtension() ? + m_Hives->GetItemText(child).BeforeLast('.') : + m_Hives->GetItemText(child); + + if (child_text == files[i]) + { + m_Hives->DeleteItem(child); + break; + } + } + } + } + + db.UpdateTrashColumn(files[i].ToStdString(), 1); + db.UpdateHiveName(files[i].ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString()); + + m_Trash->AppendItem(trash_root, text_value); + + m_SampleListView->DeleteItem(item_row); + + msg = wxString::Format("%s sent to trash", text_value); + } + + if (!msg.IsEmpty()) + m_InfoBar->ShowMessage(msg, wxICON_ERROR); } } @@ -2088,20 +2201,62 @@ void MainFrame::OnClickRemoveHive(wxCommandEvent& event) void MainFrame::OnClickRestoreTrashItem(wxCommandEvent& event) { Database db(*m_InfoBar); + Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); - wxTreeItemId selection_id = m_TrashedItems->GetSelection(); - wxString selection_text = m_TrashedItems->GetItemText(selection_id); + wxArrayTreeItemIds selected_item_ids; + m_Trash->GetSelections(selected_item_ids); - wxString path = GetFilenamePathAndExtension(selection_text).Path; - std::string extension = GetFilenamePathAndExtension(selection_text).Extension; - std::string filename = GetFilenamePathAndExtension(selection_text).Filename; + wxFileDataObject file_data; + wxArrayString files; - db.UpdateTrashColumn(filename, 0); + wxString selected_item_text; + std::string filename; - // RefreshDatabase(); + if (m_Trash->GetChildrenCount(trash_root) == 0) + { + wxMessageBox("Trash is empty, nothing to restore!", wxMessageBoxCaptionStr, wxOK | wxCENTRE, this); + return; + } - // TODO: Don't let other trashed items re-added again - m_TrashedItems->Delete(selection_id); + for (size_t i = 0; i < selected_item_ids.GetCount(); i++) + { + selected_item_text = m_Trash->GetItemText(selected_item_ids[i]); + + wxLogDebug("Count: %d :: Selected item text: %s", + (int)selected_item_ids.GetCount(), selected_item_text); + + filename = GetFilenamePathAndExtension(selected_item_text).Filename; + + file_data.AddFile(filename); + + files = file_data.GetFilenames(); + + db.UpdateTrashColumn(files[i].ToStdString(), 0); + + try + { + wxVector> dataset; + + if (db.RestoreFromTrashByFilename(files[i].ToStdString(), dataset, + settings.IsShowFileExtension()).empty()) + { + wxLogDebug("Error! Database is empty."); + } + else + { + for (auto data : dataset) + { + m_SampleListView->AppendItem(data); + } + } + } + catch (...) + { + std::cerr << "Error loading data." << std::endl; + } + + m_Trash->Delete(selected_item_ids[i]); + } } void MainFrame::OnDoSearch(wxCommandEvent& event) @@ -2180,7 +2335,7 @@ void MainFrame::RefreshDatabase() else m_Hives->DeleteAllItems(); - m_TrashedItems->DeleteAllItems(); + m_Trash->DeleteAllItems(); LoadDatabase(); } diff --git a/src/MainFrame.hpp b/src/MainFrame.hpp index 5fb87d3..26eb306 100644 --- a/src/MainFrame.hpp +++ b/src/MainFrame.hpp @@ -83,21 +83,20 @@ class MainFrame : public wxFrame // Left panel controls wxPanel* m_BottomLeftPanel; wxPanel* m_HivesPanel; - wxWindow* m_TrashPaneWindow; + wxPanel* m_TrashPanel; wxNotebook* m_Notebook; wxBoxSizer* m_BottomLeftPanelMainSizer; wxBoxSizer* m_HivesMainSizer; wxBoxSizer* m_HivesFavoritesSizer; - wxBoxSizer* m_HivesViewTrashSizer; wxBoxSizer* m_HivesButtonSizer; + wxBoxSizer* m_TrashMainSizer; wxBoxSizer* m_TrashItemSizer; - wxSizerItem* m_HivesViewTrashSizerItem; + wxBoxSizer* m_TrashButtonSizer; wxDirCtrl* m_DirCtrl; wxDataViewTreeCtrl* m_Hives; wxDataViewItem favorites_hive; - wxTreeItemId trash_root_node; - wxCollapsiblePane* m_TrashPane; - wxTreeCtrl* m_TrashedItems; + wxTreeItemId trash_root; + wxTreeCtrl* m_Trash; wxButton* m_AddHiveButton; wxButton* m_RemoveHiveButton; wxButton* m_RestoreTrashedItemButton; @@ -153,8 +152,9 @@ class MainFrame : public wxFrame // ------------------------------------------------------------------- // TrashPane event handlers - void OnExpandTrash(wxCollapsiblePaneEvent& event); + void OnShowTrashContextMenu(wxTreeEvent& event); void OnClickRestoreTrashItem(wxCommandEvent& event); + void OnDragAndDropToTrash(wxDropFilesEvent& event); // ------------------------------------------------------------------- // Hives panel button event handlers