From fab41f30be524feebc484677172420d6d78121df Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 6 Oct 2016 21:08:45 -0400 Subject: [PATCH] Add bookmark group context menu --- src/forms/Bookmark/BookmarkPanel.cpp | 2 + src/forms/Bookmark/BookmarkPanel.fbp | 2 +- src/forms/Bookmark/BookmarkPanel.h | 1 + src/forms/Bookmark/BookmarkView.cpp | 64 ++++++++++++++++++++++++++-- src/forms/Bookmark/BookmarkView.h | 23 +++++++--- 5 files changed, 81 insertions(+), 11 deletions(-) diff --git a/src/forms/Bookmark/BookmarkPanel.cpp b/src/forms/Bookmark/BookmarkPanel.cpp index 6d54fef..c60e4f7 100644 --- a/src/forms/Bookmark/BookmarkPanel.cpp +++ b/src/forms/Bookmark/BookmarkPanel.cpp @@ -81,6 +81,7 @@ BookmarkPanel::BookmarkPanel( wxWindow* parent, wxWindowID id, const wxPoint& po m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Connect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Connect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); @@ -100,6 +101,7 @@ BookmarkPanel::~BookmarkPanel() m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( BookmarkPanel::onTreeActivate ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxTreeEventHandler( BookmarkPanel::onTreeCollapse ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( BookmarkPanel::onTreeExpanded ), NULL, this ); + m_treeView->Disconnect( wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( BookmarkPanel::onTreeItemMenu ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( BookmarkPanel::onTreeSelect ), NULL, this ); m_treeView->Disconnect( wxEVT_COMMAND_TREE_SEL_CHANGING, wxTreeEventHandler( BookmarkPanel::onTreeSelectChanging ), NULL, this ); m_labelText->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BookmarkPanel::onLabelText ), NULL, this ); diff --git a/src/forms/Bookmark/BookmarkPanel.fbp b/src/forms/Bookmark/BookmarkPanel.fbp index f79f744..5352bc0 100644 --- a/src/forms/Bookmark/BookmarkPanel.fbp +++ b/src/forms/Bookmark/BookmarkPanel.fbp @@ -174,7 +174,7 @@ onTreeExpanded - + onTreeItemMenu diff --git a/src/forms/Bookmark/BookmarkPanel.h b/src/forms/Bookmark/BookmarkPanel.h index bb07915..adf25e8 100644 --- a/src/forms/Bookmark/BookmarkPanel.h +++ b/src/forms/Bookmark/BookmarkPanel.h @@ -55,6 +55,7 @@ class BookmarkPanel : public wxPanel virtual void onTreeActivate( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeCollapse( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } + virtual void onTreeItemMenu( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelect( wxTreeEvent& event ) { event.Skip(); } virtual void onTreeSelectChanging( wxTreeEvent& event ) { event.Skip(); } virtual void onLabelText( wxCommandEvent& event ) { event.Skip(); } diff --git a/src/forms/Bookmark/BookmarkView.cpp b/src/forms/Bookmark/BookmarkView.cpp index a6d2d00..dd1657b 100644 --- a/src/forms/Bookmark/BookmarkView.cpp +++ b/src/forms/Bookmark/BookmarkView.cpp @@ -1,6 +1,10 @@ #include "BookmarkView.h" #include "CubicSDR.h" +#include +#include +#define wxCONTEXT_ADD_GROUP_ID 1000 + BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : BookmarkPanel(parent, id, pos, size, style) { rootBranch = m_treeView->AddRoot("Root"); @@ -8,9 +12,10 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, bookmarkBranch = m_treeView->AppendItem(rootBranch, "Bookmarks"); recentBranch = m_treeView->AppendItem(rootBranch, "Recents"); - doUpdateActive = false; + doUpdateActive.store(true); activeSel = nullptr; recentSel = nullptr; + bookmarksInitialized = false; hideProps(); m_propPanel->Hide(); @@ -19,10 +24,10 @@ BookmarkView::BookmarkView( wxWindow* parent, wxWindowID id, const wxPoint& pos, } void BookmarkView::onUpdateTimer( wxTimerEvent& event ) { - if (doUpdateActive) { + if (doUpdateActive.load()) { doUpdateActiveList(); - doUpdateActive = false; + doUpdateActive.store(false); } } @@ -53,7 +58,35 @@ void BookmarkView::updateTheme() { void BookmarkView::updateActiveList() { - doUpdateActive = true; + doUpdateActive.store(true); +} + +void BookmarkView::refreshBookmarks() { +// if (!bookmarksInitialized) { + groupNames = wxGetApp().getBookmarkMgr().getGroups(); + if (!groupNames.size()) { + wxGetApp().getBookmarkMgr().getGroup("Uncategorized"); + groupNames = wxGetApp().getBookmarkMgr().getGroups(); + } + for (auto gn_i : groupNames) { + if (groups.find(gn_i) == groups.end()) { + groups[gn_i] = m_treeView->AppendItem(bookmarkBranch, gn_i); + } + + wxTreeItemId groupItem = groups[gn_i]; + m_treeView->DeleteChildren(groupItem); + + std::vector &groupEnts = groupEntries[groupItem]; + groupEnts.erase(groupEnts.begin(),groupEnts.end()); + + BookmarkGroup bmList = wxGetApp().getBookmarkMgr().getGroup(gn_i); + for (auto bmEnt : bmList) { + wxTreeItemId bmItem = m_treeView->AppendItem(groupItem, bmEnt->label); + groupEnts.push_back(bmItem); + } + } +// bookmarksInitialized = true; +// } } void BookmarkView::doUpdateActiveList() { @@ -81,6 +114,9 @@ void BookmarkView::doUpdateActiveList() { } } + // Bookmarks + refreshBookmarks(); + // Recents BookmarkList bmRecents = wxGetApp().getBookmarkMgr().getRecents(); recentItems.erase(recentItems.begin(),recentItems.end()); @@ -124,6 +160,26 @@ void BookmarkView::onTreeExpanded( wxTreeEvent& event ) { event.Skip(); } +void BookmarkView::onTreeItemMenu( wxTreeEvent& event ) { + if (m_treeView->GetSelection() == bookmarkBranch) { + wxMenu menu; + menu.Append(wxCONTEXT_ADD_GROUP_ID, "Add Group"); + menu.Connect(wxCONTEXT_ADD_GROUP_ID, wxEVT_MENU, (wxObjectEventFunction)&BookmarkView::onMenuItem); + PopupMenu(&menu); + } +} + +void BookmarkView::onMenuItem(wxCommandEvent& event) { + if (event.GetId() == wxCONTEXT_ADD_GROUP_ID) { + wxString stringVal = wxGetTextFromUser("Enter Group Name", "Add Group", ""); + if (stringVal.ToStdString() != "") { + wxGetApp().getBookmarkMgr().getGroup(stringVal.ToStdString()); + wxGetApp().getBookmarkMgr().updateActiveList(); + } + } +} + + void BookmarkView::hideProps() { m_frequencyLabel->Hide(); m_frequencyVal->Hide(); diff --git a/src/forms/Bookmark/BookmarkView.h b/src/forms/Bookmark/BookmarkView.h index a6cd5b0..fd81396 100644 --- a/src/forms/Bookmark/BookmarkView.h +++ b/src/forms/Bookmark/BookmarkView.h @@ -13,7 +13,9 @@ public: void bookmarkSelection(BookmarkEntry *bmSel); void activateBookmark(BookmarkEntry *bmEnt); void recentSelection(BookmarkEntry *bmSel); + void refreshBookmarks(); void updateTheme(); + void onMenuItem(wxCommandEvent& event); protected: @@ -27,6 +29,7 @@ protected: void onTreeActivate( wxTreeEvent& event ); void onTreeCollapse( wxTreeEvent& event ); void onTreeExpanded( wxTreeEvent& event ); + void onTreeItemMenu( wxTreeEvent& event ); void onTreeSelect( wxTreeEvent& event ); void onTreeSelectChanging( wxTreeEvent& event ); void onLabelText( wxCommandEvent& event ); @@ -36,14 +39,22 @@ protected: void onActivate( wxCommandEvent& event ); void onRemove( wxCommandEvent& event ); - bool doUpdateActive; + std::atomic_bool doUpdateActive; wxTreeItemId rootBranch, activeBranch, bookmarkBranch, recentBranch; - std::map groups; - std::map activeItems; - std::map recentItems; - DemodulatorInstance *activeSel; - BookmarkEntry *recentSel; + // Bookmarks + BookmarkNames groupNames; + std::map groups; + std::map > groupEntries; BookmarkEntry *bookmarkSel; + bool bookmarksInitialized; + + // Active + std::map activeItems; + DemodulatorInstance *activeSel; + + // Recent + std::map recentItems; + BookmarkEntry *recentSel; }; \ No newline at end of file