New trash page and add context menu and drag and drop feature for moving samples to trash.
This commit is contained in:
parent
2b8b47d9a4
commit
9bc1599d90
|
|
@ -24,8 +24,8 @@ enum ControlIDs
|
||||||
BC_SampleListView,
|
BC_SampleListView,
|
||||||
BC_Search,
|
BC_Search,
|
||||||
BC_MediaCtrl,
|
BC_MediaCtrl,
|
||||||
BC_TrashPane,
|
BC_Trash,
|
||||||
BC_RestoreTrashedItemButton,
|
BC_RestoreTrashedItem,
|
||||||
BC_HiveAdd,
|
BC_HiveAdd,
|
||||||
BC_HiveRemove,
|
BC_HiveRemove,
|
||||||
|
|
||||||
|
|
@ -56,6 +56,11 @@ enum ControlIDs
|
||||||
MN_FilterSampleView,
|
MN_FilterSampleView,
|
||||||
MN_ShowInLibrary,
|
MN_ShowInLibrary,
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Trash Menu items
|
||||||
|
MN_DeleteTrash,
|
||||||
|
MN_RestoreTrashedItem,
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Edit tags dialog controls
|
// Edit tags dialog controls
|
||||||
ET_TitleCheck,
|
ET_TitleCheck,
|
||||||
|
|
|
||||||
|
|
@ -1346,3 +1346,89 @@ void Database::UpdateTrashColumn(const std::string& filename, int value)
|
||||||
wxLogDebug(exception.what());
|
wxLogDebug(exception.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxVector<wxVector<wxVariant>>
|
||||||
|
Database::RestoreFromTrashByFilename(const std::string& filename, wxVector<wxVector<wxVariant>>& 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<const char*>(sqlite3_column_text(m_Stmt, 1)));
|
||||||
|
wxString file_extension = std::string(reinterpret_cast<const char*>(sqlite3_column_text(m_Stmt, 2)));
|
||||||
|
wxString sample_pack = std::string(reinterpret_cast<const char*>(sqlite3_column_text(m_Stmt, 3)));
|
||||||
|
wxString sample_type = std::string(reinterpret_cast<const char *>(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<const char*>(sqlite3_column_text(m_Stmt, 9)));
|
||||||
|
int trashed = sqlite3_column_int(m_Stmt, 10);
|
||||||
|
wxString hive_name = std::string(reinterpret_cast<const char*>(sqlite3_column_text(m_Stmt, 11)));
|
||||||
|
|
||||||
|
wxVector<wxVariant> 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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,9 @@ class Database
|
||||||
wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension);
|
wxTreeCtrl& trash_tree, wxTreeItemId& trash_item, bool show_extension);
|
||||||
void LoadHivesDatabase(wxDataViewTreeCtrl& favorite_tree);
|
void LoadHivesDatabase(wxDataViewTreeCtrl& favorite_tree);
|
||||||
wxVector<wxVector<wxVariant>>
|
wxVector<wxVector<wxVariant>>
|
||||||
|
RestoreFromTrashByFilename(const std::string& filename, wxVector<wxVector<wxVariant>>& vecSet,
|
||||||
|
bool show_extension);
|
||||||
|
wxVector<wxVector<wxVariant>>
|
||||||
FilterDatabaseBySampleName(wxVector<wxVector<wxVariant>>& sampleVec,
|
FilterDatabaseBySampleName(wxVector<wxVector<wxVariant>>& sampleVec,
|
||||||
const std::string& sampleName, bool show_extension);
|
const std::string& sampleName, bool show_extension);
|
||||||
wxVector<wxVector<wxVariant>>
|
wxVector<wxVector<wxVariant>>
|
||||||
|
|
|
||||||
|
|
@ -67,9 +67,11 @@ MainFrame::MainFrame()
|
||||||
|
|
||||||
m_HivesMainSizer = new wxBoxSizer(wxVERTICAL);
|
m_HivesMainSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_HivesFavoritesSizer = new wxBoxSizer(wxVERTICAL);
|
m_HivesFavoritesSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_HivesViewTrashSizer = new wxBoxSizer(wxVERTICAL);
|
|
||||||
m_HivesButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
m_HivesButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
|
m_TrashMainSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
m_TrashItemSizer = new wxBoxSizer(wxVERTICAL);
|
m_TrashItemSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
m_TrashButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
// Main panel of the app
|
// Main panel of the app
|
||||||
m_MainPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
m_MainPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||||
|
|
@ -105,39 +107,42 @@ MainFrame::MainFrame()
|
||||||
m_DirCtrl->SetPath(path);
|
m_DirCtrl->SetPath(path);
|
||||||
|
|
||||||
// This panel will hold page 2nd page of wxNotebook
|
// 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 = new wxButton(m_HivesPanel, BC_HiveAdd, "+", wxDefaultPosition, wxDefaultSize, 0);
|
||||||
m_AddHiveButton->SetToolTip("Create new hive");
|
m_AddHiveButton->SetToolTip("Create new hive");
|
||||||
m_RemoveHiveButton = new wxButton(m_HivesPanel, BC_HiveRemove, "-", wxDefaultPosition, wxDefaultSize, 0);
|
m_RemoveHiveButton = new wxButton(m_HivesPanel, BC_HiveRemove, "-", wxDefaultPosition, wxDefaultSize, 0);
|
||||||
m_RemoveHiveButton->SetToolTip("Delete selected hive");
|
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
|
// Initializing wxTreeCtrl as another page of wxNotebook
|
||||||
m_Hives = new wxDataViewTreeCtrl(m_HivesPanel, BC_Hives, wxDefaultPosition, wxDefaultSize,
|
m_Hives = new wxDataViewTreeCtrl(m_HivesPanel, BC_Hives, wxDefaultPosition, wxDefaultSize,
|
||||||
wxDV_NO_HEADER | wxDV_SINGLE);
|
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
|
// Adding default hive
|
||||||
favorites_hive = m_Hives->AppendContainer(wxDataViewItem(wxNullPtr), "Favorites");
|
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
|
// Addubg root to TrashedItems
|
||||||
trash_root_node = m_TrashedItems->AddRoot("ROOT");
|
trash_root = m_Trash->AddRoot("Trash");
|
||||||
|
|
||||||
// Adding the pages to wxNotebook
|
// Adding the pages to wxNotebook
|
||||||
m_Notebook->AddPage(m_DirCtrl, "Browse", false);
|
m_Notebook->AddPage(m_DirCtrl, "Browse", false);
|
||||||
m_Notebook->AddPage(m_HivesPanel, "Hives", false);
|
m_Notebook->AddPage(m_HivesPanel, "Hives", false);
|
||||||
|
m_Notebook->AddPage(m_TrashPanel, "Trash", false);
|
||||||
|
|
||||||
// Right half of BottomSlitter window
|
// Right half of BottomSlitter window
|
||||||
m_BottomRightPanel = new wxPanel(m_BottomSplitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
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_TIMER, &MainFrame::UpdateElapsedTime, this);
|
||||||
|
|
||||||
Bind(wxEVT_BUTTON, &MainFrame::OnClickRestoreTrashItem, this, BC_RestoreTrashedItemButton);
|
m_Trash->Connect(wxEVT_DROP_FILES, wxDropFilesEventHandler(MainFrame::OnDragAndDropToTrash), NULL, this);
|
||||||
Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, &MainFrame::OnExpandTrash, this, BC_TrashPane);
|
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_SELECTION_CHANGED, &MainFrame::OnClickSampleView, this, BC_SampleListView);
|
||||||
Bind(wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, &MainFrame::OnDragFromSampleView, this);
|
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_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_AddHiveButton, 1, wxALL | wxEXPAND, 2);
|
||||||
m_HivesButtonSizer->Add(m_RemoveHiveButton, 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_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_HivesMainSizer->Add(m_HivesButtonSizer, 0, wxALL | wxEXPAND, 2);
|
||||||
|
|
||||||
m_TrashItemSizer->Add(m_TrashedItems, 1, wxALL | wxEXPAND, 2);
|
m_TrashItemSizer->Add(m_Trash, 1, wxALL | wxEXPAND, 2);
|
||||||
m_TrashItemSizer->Add(m_RestoreTrashedItemButton, 0, 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_SearchBox, 1, wxALL | wxEXPAND, 2);
|
||||||
m_BottomRightPanelMainSizer->Add(m_InfoBar, 0, wxALL | wxEXPAND, 2);
|
m_BottomRightPanelMainSizer->Add(m_InfoBar, 0, wxALL | wxEXPAND, 2);
|
||||||
|
|
@ -363,10 +368,10 @@ MainFrame::MainFrame()
|
||||||
m_HivesMainSizer->Layout();
|
m_HivesMainSizer->Layout();
|
||||||
|
|
||||||
// Sizer for trash pane
|
// Sizer for trash pane
|
||||||
m_TrashPaneWindow->SetSizer(m_TrashItemSizer);
|
m_TrashPanel->SetSizer(m_TrashMainSizer);
|
||||||
m_TrashItemSizer->Fit(m_TrashPaneWindow);
|
m_TrashMainSizer->Fit(m_TrashPanel);
|
||||||
m_TrashItemSizer->SetSizeHints(m_TrashPaneWindow);
|
m_TrashMainSizer->SetSizeHints(m_TrashPanel);
|
||||||
m_TrashItemSizer->Layout();
|
m_TrashMainSizer->Layout();
|
||||||
|
|
||||||
// Sizer for bottom right panel
|
// Sizer for bottom right panel
|
||||||
m_BottomRightPanel->SetSizer(m_BottomRightPanelMainSizer);
|
m_BottomRightPanel->SetSizer(m_BottomRightPanelMainSizer);
|
||||||
|
|
@ -1693,56 +1698,11 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event)
|
||||||
case MN_TrashSample:
|
case MN_TrashSample:
|
||||||
{
|
{
|
||||||
wxDataViewItem root = wxDataViewItem(wxNullPtr);
|
wxDataViewItem root = wxDataViewItem(wxNullPtr);
|
||||||
wxDataViewItem container;
|
wxDataViewItem container, child;
|
||||||
wxDataViewItem child;
|
|
||||||
|
|
||||||
if (db.IsTrashed(filename))
|
if (db.IsTrashed(filename))
|
||||||
wxLogDebug("Already trashed..");
|
wxLogDebug("Already trashed..");
|
||||||
else
|
else
|
||||||
{
|
|
||||||
if (m_SampleListView->GetSelectedItemsCount() <= 1)
|
|
||||||
{
|
|
||||||
wxString name = m_SampleListView->GetTextValue(selected_row, 1);
|
|
||||||
|
|
||||||
filename = settings.IsShowFileExtension() ?
|
|
||||||
name.BeforeLast('.').ToStdString() : name.ToStdString();
|
|
||||||
|
|
||||||
wxLogDebug("Trashing..");
|
|
||||||
|
|
||||||
if (db.GetFavoriteColumnValueByFilename(filename))
|
|
||||||
{
|
|
||||||
m_SampleListView->SetValue(wxVariant(wxBitmap(ICON_GREYSCALE)), selected_row, 0);
|
|
||||||
|
|
||||||
db.UpdateFavoriteColumn(filename, 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 == filename)
|
|
||||||
{
|
|
||||||
m_Hives->DeleteItem(child);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
db.UpdateTrashColumn(filename, 1);
|
|
||||||
m_TrashedItems->AppendItem(trash_root_node, name);
|
|
||||||
m_SampleListView->DeleteItem(selected_row);
|
|
||||||
|
|
||||||
msg = wxString::Format("%s sent to trash", name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
wxDataViewItemArray items;
|
wxDataViewItemArray items;
|
||||||
int rows = m_SampleListView->GetSelections(items);
|
int rows = m_SampleListView->GetSelections(items);
|
||||||
|
|
@ -1793,14 +1753,16 @@ void MainFrame::OnShowSampleListViewContextMenu(wxDataViewEvent& event)
|
||||||
}
|
}
|
||||||
|
|
||||||
db.UpdateTrashColumn(files[i].ToStdString(), 1);
|
db.UpdateTrashColumn(files[i].ToStdString(), 1);
|
||||||
m_TrashedItems->AppendItem(trash_root_node, text_value);
|
db.UpdateHiveName(files[i].ToStdString(), m_Hives->GetItemText(favorites_hive).ToStdString());
|
||||||
|
|
||||||
|
m_Trash->AppendItem(trash_root, text_value);
|
||||||
|
|
||||||
m_SampleListView->DeleteItem(item_row);
|
m_SampleListView->DeleteItem(item_row);
|
||||||
|
|
||||||
msg = wxString::Format("%s sent to trash", text_value);
|
msg = wxString::Format("%s sent to trash", text_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MN_EditTagSample:
|
case MN_EditTagSample:
|
||||||
{
|
{
|
||||||
|
|
@ -1847,8 +1809,7 @@ void MainFrame::LoadDatabase()
|
||||||
wxVector<wxVector<wxVariant>> dataset;
|
wxVector<wxVector<wxVariant>> dataset;
|
||||||
|
|
||||||
if (db.LoadSamplesDatabase(dataset, *m_Hives, favorites_hive,
|
if (db.LoadSamplesDatabase(dataset, *m_Hives, favorites_hive,
|
||||||
*m_TrashedItems, trash_root_node,
|
*m_Trash, trash_root, settings.IsShowFileExtension()).empty())
|
||||||
settings.IsShowFileExtension()).empty())
|
|
||||||
{
|
{
|
||||||
wxLogInfo("Error! Database is 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);
|
switch (m_Trash->GetPopupMenuSelectionFromUser(menu, event.GetPoint()))
|
||||||
m_HivesPanel->Layout();
|
{
|
||||||
|
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<wxVector<wxVariant>> dataset;
|
||||||
|
|
||||||
|
if (db.RestoreFromTrashByFilename(files[i].ToStdString(), dataset,
|
||||||
|
settings.IsShowFileExtension()).empty())
|
||||||
|
{
|
||||||
|
wxLogDebug("Error! Database is empty.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ m_HivesViewTrashSizerItem->SetProportion(0) ;
|
{
|
||||||
m_HivesPanel->Layout();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
void MainFrame::OnClickRestoreTrashItem(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
Database db(*m_InfoBar);
|
Database db(*m_InfoBar);
|
||||||
|
Settings settings(this, m_ConfigFilepath, m_DatabaseFilepath);
|
||||||
|
|
||||||
wxTreeItemId selection_id = m_TrashedItems->GetSelection();
|
wxArrayTreeItemIds selected_item_ids;
|
||||||
wxString selection_text = m_TrashedItems->GetItemText(selection_id);
|
m_Trash->GetSelections(selected_item_ids);
|
||||||
|
|
||||||
wxString path = GetFilenamePathAndExtension(selection_text).Path;
|
wxFileDataObject file_data;
|
||||||
std::string extension = GetFilenamePathAndExtension(selection_text).Extension;
|
wxArrayString files;
|
||||||
std::string filename = GetFilenamePathAndExtension(selection_text).Filename;
|
|
||||||
|
|
||||||
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
|
for (size_t i = 0; i < selected_item_ids.GetCount(); i++)
|
||||||
m_TrashedItems->Delete(selection_id);
|
{
|
||||||
|
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<wxVector<wxVariant>> 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)
|
void MainFrame::OnDoSearch(wxCommandEvent& event)
|
||||||
|
|
@ -2180,7 +2335,7 @@ void MainFrame::RefreshDatabase()
|
||||||
else
|
else
|
||||||
m_Hives->DeleteAllItems();
|
m_Hives->DeleteAllItems();
|
||||||
|
|
||||||
m_TrashedItems->DeleteAllItems();
|
m_Trash->DeleteAllItems();
|
||||||
|
|
||||||
LoadDatabase();
|
LoadDatabase();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,21 +83,20 @@ class MainFrame : public wxFrame
|
||||||
// Left panel controls
|
// Left panel controls
|
||||||
wxPanel* m_BottomLeftPanel;
|
wxPanel* m_BottomLeftPanel;
|
||||||
wxPanel* m_HivesPanel;
|
wxPanel* m_HivesPanel;
|
||||||
wxWindow* m_TrashPaneWindow;
|
wxPanel* m_TrashPanel;
|
||||||
wxNotebook* m_Notebook;
|
wxNotebook* m_Notebook;
|
||||||
wxBoxSizer* m_BottomLeftPanelMainSizer;
|
wxBoxSizer* m_BottomLeftPanelMainSizer;
|
||||||
wxBoxSizer* m_HivesMainSizer;
|
wxBoxSizer* m_HivesMainSizer;
|
||||||
wxBoxSizer* m_HivesFavoritesSizer;
|
wxBoxSizer* m_HivesFavoritesSizer;
|
||||||
wxBoxSizer* m_HivesViewTrashSizer;
|
|
||||||
wxBoxSizer* m_HivesButtonSizer;
|
wxBoxSizer* m_HivesButtonSizer;
|
||||||
|
wxBoxSizer* m_TrashMainSizer;
|
||||||
wxBoxSizer* m_TrashItemSizer;
|
wxBoxSizer* m_TrashItemSizer;
|
||||||
wxSizerItem* m_HivesViewTrashSizerItem;
|
wxBoxSizer* m_TrashButtonSizer;
|
||||||
wxDirCtrl* m_DirCtrl;
|
wxDirCtrl* m_DirCtrl;
|
||||||
wxDataViewTreeCtrl* m_Hives;
|
wxDataViewTreeCtrl* m_Hives;
|
||||||
wxDataViewItem favorites_hive;
|
wxDataViewItem favorites_hive;
|
||||||
wxTreeItemId trash_root_node;
|
wxTreeItemId trash_root;
|
||||||
wxCollapsiblePane* m_TrashPane;
|
wxTreeCtrl* m_Trash;
|
||||||
wxTreeCtrl* m_TrashedItems;
|
|
||||||
wxButton* m_AddHiveButton;
|
wxButton* m_AddHiveButton;
|
||||||
wxButton* m_RemoveHiveButton;
|
wxButton* m_RemoveHiveButton;
|
||||||
wxButton* m_RestoreTrashedItemButton;
|
wxButton* m_RestoreTrashedItemButton;
|
||||||
|
|
@ -153,8 +152,9 @@ class MainFrame : public wxFrame
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// TrashPane event handlers
|
// TrashPane event handlers
|
||||||
void OnExpandTrash(wxCollapsiblePaneEvent& event);
|
void OnShowTrashContextMenu(wxTreeEvent& event);
|
||||||
void OnClickRestoreTrashItem(wxCommandEvent& event);
|
void OnClickRestoreTrashItem(wxCommandEvent& event);
|
||||||
|
void OnDragAndDropToTrash(wxDropFilesEvent& event);
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Hives panel button event handlers
|
// Hives panel button event handlers
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue