From a6275f5e6c9f247d238db6249826ab06ac09afa8 Mon Sep 17 00:00:00 2001 From: apoorv569 Date: Thu, 17 Jun 2021 10:38:24 +0530 Subject: [PATCH] Add collection tab child item popup menu, find file in library or open system file manager. --- src/ControlID_Enums.hpp | 2 + src/MainFrame.cpp | 211 +++++++++++++++++++++++++++++++++++----- 2 files changed, 189 insertions(+), 24 deletions(-) diff --git a/src/ControlID_Enums.hpp b/src/ControlID_Enums.hpp index 59d594b..27949de 100644 --- a/src/ControlID_Enums.hpp +++ b/src/ControlID_Enums.hpp @@ -46,6 +46,7 @@ enum ControlIDs MN_DeleteSample, MN_TrashSample, MN_EditTagSample, + MN_OpenFile, // ------------------------------------------------------------------- // CollectionView Menu items @@ -53,6 +54,7 @@ enum ControlIDs MN_RemoveFolder, MN_RemoveSample, MN_FilterSampleView, + MN_ShowInLibrary, // ------------------------------------------------------------------- // Edit tags dialog controls diff --git a/src/MainFrame.cpp b/src/MainFrame.cpp index e0be7e1..5261f17 100644 --- a/src/MainFrame.cpp +++ b/src/MainFrame.cpp @@ -881,12 +881,12 @@ void MainFrame::OnClickSampleView(wxDataViewEvent& event) if (column->GetTitle() != "Favorite") { - wxLogDebug("Playing sample.."); - m_MediaCtrl->Load(sample_path); if (bAutoplay) { + wxLogDebug("Playing %s", filename); + m_MediaCtrl->Play(); m_Timer->Start(100, wxTIMER_CONTINUOUS); } @@ -959,44 +959,127 @@ void MainFrame::OnShowCollectionViewContextMenu(wxDataViewEvent& event) Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath); Database db(*m_InfoBar); - wxDataViewItem item = event.GetItem(); + wxDataViewItem selected_item = event.GetItem(); - wxString selection = m_CollectionView->GetItemText(item); + wxString item_name = m_CollectionView->GetItemText(selected_item); wxMenu menu; - menu.Append(MN_CreateFolder, "Create new folder"); - menu.Append(MN_RemoveFolder, "Remove folder"); - menu.Append(MN_RemoveFolder, "Remove sample"); - - if (!bFiltered) - menu.Append(MN_FilterSampleView, "Filter sample view"); - else - menu.Append(MN_FilterSampleView, "Clear filter"); - - if (item.IsOk() && m_CollectionView->IsContainer(item)) + if (m_CollectionView->IsContainer(selected_item)) { + // Container menu items + // container_menu.Append(MN_CreateFolder, "Create new folder"); + menu.Append(MN_RemoveFolder, "Remove folder"); + + if (!bFiltered) + menu.Append(MN_FilterSampleView, "Filter sample view"); + else + menu.Append(MN_FilterSampleView, "Clear filter"); + } + else + { + // Child menu items + menu.Append(MN_RemoveSample, "Remove sample"); + menu.Append(MN_ShowInLibrary, "Show sample in library"); + } + + if (selected_item.IsOk() && m_CollectionView->IsContainer(selected_item)) + { + wxLogDebug("Container menu"); + switch (m_CollectionView->GetPopupMenuSelectionFromUser(menu, event.GetPosition())) { - case MN_CreateFolder: - break; + // case MN_CreateFolder: + // break; case MN_RemoveFolder: - break; - case MN_RemoveSample: + { + // wxDataViewItem selected = m_CollectionView->GetSelection(); + // wxString folder_name = m_CollectionView->GetItemText(selected); + + wxString msg; + + wxMessageDialog deleteEmptyFolderDialog(this, wxString::Format( + "Are you sure you want to delete " + "%s from collections?", + item_name), + wxMessageBoxCaptionStr, + wxYES_NO | wxNO_DEFAULT | + wxICON_QUESTION | wxSTAY_ON_TOP); + + wxMessageDialog deleteFilledFolderDialog(this, wxString::Format( + "Are you sure you want to delete " + "%s and all sample inside %s from collections?", + item_name, item_name), + wxMessageBoxCaptionStr, + wxYES_NO | wxNO_DEFAULT | + wxICON_QUESTION | wxSTAY_ON_TOP); + + if(m_CollectionView->GetChildCount(selected_item) <= 0) + { + switch (deleteEmptyFolderDialog.ShowModal()) + { + case wxID_YES: + if (selected_item.IsOk() && m_CollectionView->IsContainer(selected_item) && item_name != "Favourites") + { + m_CollectionView->DeleteItem(selected_item); + + db.RemoveFolderFromCollections(item_name.ToStdString()); + msg = wxString::Format("%s deleted from collections successfully.", item_name); + } + else + if(item_name == "Favourites") + msg = wxString::Format("Error! Default folder %s cannot be deleted.", item_name); + else + msg = wxString::Format("Error! %s is not a folder, cannot delete from collections.", item_name); + break; + case wxID_NO: + break; + default: + return; + } + } + else + { + switch (deleteFilledFolderDialog.ShowModal()) + { + case wxID_YES: + if (selected_item.IsOk() && m_CollectionView->IsContainer(selected_item) && item_name != "Favourites") + { + m_CollectionView->DeleteChildren(selected_item); + m_CollectionView->DeleteItem(selected_item); + + db.RemoveFolderFromCollections(item_name.ToStdString()); + msg = wxString::Format("%s and all samples inside %s have been deleted from collections successfully.", + item_name, item_name); + } + else + if(item_name == "Favourites") + msg = wxString::Format("Error! Default folder %s cannot be deleted.", item_name); + else + msg = wxString::Format("Error! %s is not a folder, cannot delete from collections.", item_name); + break; + case wxID_NO: + break; + default: + return; + } + } + + m_InfoBar->ShowMessage(msg, wxICON_INFORMATION); + } break; case MN_FilterSampleView: { if (!bFiltered) { - wxDataViewItem selected = event.GetItem(); - - wxString folder_name = m_CollectionView->GetItemText(selected); + // wxDataViewItem selected_item = event.GetItem(); + // wxString folder_name = m_CollectionView->GetItemText(selected_item); try { wxVector> dataset; - if (db.FilterDatabaseByFolderName(dataset, folder_name.ToStdString()).empty()) + if (db.FilterDatabaseByFolderName(dataset, item_name.ToStdString()).empty()) { wxLogDebug("Error! Database is empty."); } @@ -1004,7 +1087,7 @@ void MainFrame::OnShowCollectionViewContextMenu(wxDataViewEvent& event) { m_SampleListView->DeleteAllItems(); - std::cout << folder_name << std::endl; + std::cout << item_name << std::endl; for (auto data : dataset) { @@ -1021,7 +1104,29 @@ void MainFrame::OnShowCollectionViewContextMenu(wxDataViewEvent& event) } else { - // TODO: clear the filter + try + { + wxVector> dataset; + + if (db.FilterDatabaseBySampleName(dataset, "").empty()) + { + wxLogDebug("Error! Database is empty."); + } + else + { + m_SampleListView->DeleteAllItems(); + + for (auto data : dataset) + { + m_SampleListView->AppendItem(data); + } + } + } + catch (...) + { + std::cerr << "Error loading data." << std::endl; + } + bFiltered = false; } } @@ -1030,6 +1135,55 @@ void MainFrame::OnShowCollectionViewContextMenu(wxDataViewEvent& event) return; } } + else if (selected_item.IsOk() && !m_CollectionView->IsContainer(selected_item)) + { + wxLogDebug("Child menu"); + + switch (m_CollectionView->GetPopupMenuSelectionFromUser(menu, event.GetPosition())) + { + case MN_RemoveSample: + for(int i = 0; i < m_SampleListView->GetItemCount(); i++) + { + wxString matched_sample = settings.IsShowFileExtension() ? + m_SampleListView->GetTextValue(i, 1).BeforeLast('.') : m_SampleListView->GetTextValue(i, 1); + + if(item_name == matched_sample) + { + wxLogDebug("Found match"); + + m_SampleListView->SetValue(wxVariant(wxDataViewIconText(wxEmptyString, wxIcon(ICON_GREYSCALE))), i, 0); + + db.UpdateFavoriteColumn(matched_sample.ToStdString(), 0); + db.UpdateFavoriteFolder(matched_sample.ToStdString(), ""); + + wxLogDebug("Item name: %s", matched_sample); + + m_CollectionView->DeleteItem(selected_item); + } + } + break; + case MN_ShowInLibrary: + for(int i = 0; i < m_SampleListView->GetItemCount(); i++) + { + wxString matched_sample = settings.IsShowFileExtension() ? + m_SampleListView->GetTextValue(i, 1).BeforeLast('.') : m_SampleListView->GetTextValue(i, 1); + + if(item_name == matched_sample) + { + wxLogDebug("Found match"); + + wxDataViewItem matched_item = m_SampleListView->RowToItem(i); + + m_SampleListView->UnselectAll(); + m_SampleListView->SelectRow(i); + m_SampleListView->EnsureVisible(matched_item); + } + } + break; + default: + return; + } + } } void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) @@ -1076,9 +1230,15 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) menu.Append(MN_TrashSample, "Trash"); if (m_SampleListView->GetSelectedItemsCount() <= 1) + { menu.Append(MN_EditTagSample, "Edit tags")->Enable(true); + menu.Append(MN_OpenFile, "Open file in file manager")->Enable(true); + } else + { menu.Append(MN_EditTagSample, "Edit tags")->Enable(false); + menu.Append(MN_OpenFile, "Open file in file manager")->Enable(false); + } switch (m_SampleListView->GetPopupMenuSelectionFromUser(menu, event.GetPosition())) { @@ -1404,6 +1564,9 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event) } } break; + case MN_OpenFile: + wxExecute(wxString::Format("xdg-open '%s'", sample_path.BeforeLast('/'))); + break; case wxID_NONE: return; default: