From e62bc0c51f720a3a08bc180221d9dc6e1bdb1f5d Mon Sep 17 00:00:00 2001 From: Christian Colglazier Date: Sat, 30 Oct 2021 18:38:53 -0400 Subject: [PATCH] New menu system --- src/main.cpp | 3 +- src/menu.cpp | 93 +++++++++++++++++++++++++++-------------------- src/menu.h | 18 ++------- src/menu_item.cpp | 40 ++++++++++++++++++-- src/menu_item.h | 17 +++++++-- 5 files changed, 110 insertions(+), 61 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 470a862..558c3eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,8 +5,9 @@ using namespace daisy; int main(void) { patch.Init(); sample_rate = patch.AudioSampleRate(); - droplet_left = GetDroplet(DropletState::kFull); selected_menu = left_menu; + droplet_left = GetDroplet(DropletState::kFull); + patch.StartAdc(); patch.StartAudio(AudioThrough); diff --git a/src/menu.cpp b/src/menu.cpp index cb4a855..61524b1 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -6,6 +6,14 @@ Menu::Menu(DaisyPatch* m_patch, patch = m_patch; state = m_state; manager = m_manager; + + head = new MenuItem(MenuState::kSplit, "Split"); + head->AddItemEnd(new MenuItem(MenuState::kChange, "Right")); + head->AddItemEnd(new MenuItem(MenuState::kVCO, "VCO")); + head->AddItemEnd(new MenuItem(MenuState::kNoise, "Noise")); + selected = head; + buffer = selected; + highlighted = selected; } const std::string MENU_ITEMS[] = {"Split", "Change", @@ -15,7 +23,6 @@ const int MENU_SIZE = sizeof(MENU_ITEMS)/sizeof(*MENU_ITEMS); const int MAX_CHAR_LENGTH = 15; const int MENU_X[] = {0, 5, 10, 5, 0}; const int MENU_Y[] = {0, 11, 22, 41, 52}; -int selectedMenuItem = 0; bool Menu::InMenu() { return this->inMenu; @@ -25,32 +32,6 @@ void Menu::SetInMenu(bool menuState) { inMenu = menuState; } -void Menu::FilterMenuSelection() { - if (selectedMenuItem >= MENU_SIZE) { - selectedMenuItem = MENU_SIZE - 1; - } else if (selectedMenuItem < 0) { - selectedMenuItem = 0; - } -} - -std::string Menu::FilterMenuText(int position) { - //return std::to_string(position); - if (position >= MENU_SIZE || position < 0) { - return ""; - } else { - if (ConvertState(position) == MenuState::kSplit) { - if (manager->GetSplitMode()) { - return "Merge"; - } else { - return "Split"; - } - } else if (ConvertState(position) == MenuState::kChange) { - return manager->OtherStateName(state); - } - return MENU_ITEMS[position]; - } -} - void Menu::CreateMenuItem(std::string text, int position, bool highlighted) { @@ -67,26 +48,60 @@ void Menu::CreateMenuItem(std::string text, } void Menu::ProcessMenuOled() { - CreateMenuItem(FilterMenuText(selectedMenuItem-2), 1, false); - CreateMenuItem(FilterMenuText(selectedMenuItem-1), 2, false); - CreateMenuItem(FilterMenuText(selectedMenuItem), 3, true); - CreateMenuItem(FilterMenuText(selectedMenuItem+1), 4, false); - CreateMenuItem(FilterMenuText(selectedMenuItem+2), 5, false); + MenuItem* ptr; + // Item 3 Highlighted + CreateMenuItem(highlighted->GetTitle(), 3, true); + + // Item 2 + ptr = highlighted->GetPrevious(); + if (ptr == NULL) { + CreateMenuItem("", 2, false); + } else { + CreateMenuItem(ptr->GetTitle(), 2, false); + ptr = ptr->GetPrevious(); + } + // Item 1 + if (ptr == NULL) { + CreateMenuItem("", 1, false); + } else { + CreateMenuItem(ptr->GetTitle(), 1, false); + } + + // Item 4 + ptr = highlighted->GetNext(); + if (ptr == NULL) { + CreateMenuItem("", 4, false); + } else { + CreateMenuItem(ptr->GetTitle(), 4, false); + ptr = ptr->GetNext(); + } + + // Item 5 + if (ptr == NULL) { + CreateMenuItem("", 5, false); + } else { + CreateMenuItem(ptr->GetTitle(), 5, false); + } } void Menu::UpdateMenuPosition() { - selectedMenuItem -= patch->encoder.Increment(); - FilterMenuSelection(); + int move = patch->encoder.Increment(); + if (move < 0) { + if (highlighted->GetNextVisible() != NULL) { + highlighted = highlighted->GetNextVisible(); + } + } else if (move > 0) { + if (highlighted->GetPreviousVisible() != NULL) { + highlighted = highlighted->GetPreviousVisible(); + } + } } std::string Menu::SelectedName() { - return MENU_ITEMS[selectedMenuItem]; + return highlighted->GetTitle(); } MenuState Menu::GetState() { - return ConvertState(selectedMenuItem); + return highlighted->GetState(); } -MenuState Menu::ConvertState(int menu_state) { - return static_cast(menu_state); -} diff --git a/src/menu.h b/src/menu.h index 23a5a2a..19ca54e 100644 --- a/src/menu.h +++ b/src/menu.h @@ -17,6 +17,10 @@ class Menu { DaisyPatch* patch; DropletManager* manager; DropletState state; + MenuItem* selected; + MenuItem* buffer; + MenuItem* highlighted; + MenuItem* head; bool inMenu = false; /* @@ -50,20 +54,6 @@ class Menu { */ void SetInMenu(bool); - /* - * Keeps menu selection within the bounds of the menu's size. - */ - void FilterMenuSelection(); - - /* - * Returns item name based on given position and if out of the menu - * returns a blank string. - * - * @param position place in the menu - * @return menu item name - */ - std::string FilterMenuText(int position); - /* * Draws a menu item on screen. * diff --git a/src/menu_item.cpp b/src/menu_item.cpp index b2c6cd9..0f8b522 100644 --- a/src/menu_item.cpp +++ b/src/menu_item.cpp @@ -1,6 +1,6 @@ #include "menu_item.h" -MenuItem::MenuItem(MenuState m_state, char* m_title) { +MenuItem::MenuItem(MenuState m_state, std::string m_title) { state = m_state; this->SetTitle(m_title); visible = true; @@ -8,11 +8,11 @@ MenuItem::MenuItem(MenuState m_state, char* m_title) { next = NULL; } -char* MenuItem::GetTitle() { +std::string MenuItem::GetTitle() { return title; } -void MenuItem::SetTitle(char* m_title) { +void MenuItem::SetTitle(std::string m_title) { title = m_title; } @@ -61,3 +61,37 @@ void MenuItem::SetVisibility(bool m_visible) { void MenuItem::ToggleVisibility() { visible = !visible; } + +MenuState MenuItem::GetState() { + return state; +} + +void MenuItem::AddItemBefore(MenuItem* item) { + item->SetNext(this); + item->SetPrevious(this->GetPrevious()); + this->SetPrevious(item); +} + +void MenuItem::AddItemAfter(MenuItem* item) { + item->SetPrevious(this); + item->SetNext(this->GetNext()); + this->SetNext(item); +} + +void MenuItem::AddItemStart(MenuItem* item) { + if (this->GetPrevious() == NULL) { + item->SetNext(this); + this->SetPrevious(item); + } else { + this->GetPrevious()->AddItemStart(item); + } +} + +void MenuItem::AddItemEnd(MenuItem* item) { + if (this->GetNext() == NULL) { + item->SetPrevious(this); + this->SetNext(item); + } else { + this->GetNext()->AddItemEnd(item); + } +} diff --git a/src/menu_item.h b/src/menu_item.h index 3bac605..e6ac39e 100644 --- a/src/menu_item.h +++ b/src/menu_item.h @@ -3,31 +3,33 @@ #ifndef CASCADE_MENU_ITEM_H_ #define CASCADE_MENU_ITEM_H_ +#include + enum class MenuState {kSplit, kChange, kVCO, kNoise}; class MenuItem { private: MenuState state; - char* title; + std::string title; bool visible; MenuItem* previous; MenuItem* next; public: - MenuItem(MenuState m_state, char* m_title); + MenuItem(MenuState m_state, std::string m_title); /* * Returns the title of the menu item. * * @return menu item title */ - char* GetTitle(); + std::string GetTitle(); /* * Sets the title for a munu item. * * @param menu title */ - void SetTitle(char* m_title); + void SetTitle(std::string m_title); /* * Returns the previous menu item. @@ -88,6 +90,13 @@ class MenuItem { * Toggles visibility of menu item. */ void ToggleVisibility(); + + MenuState GetState(); + + void AddItemBefore(MenuItem* item); + void AddItemAfter(MenuItem* item); + void AddItemStart(MenuItem* item); + void AddItemEnd(MenuItem* item); }; #endif // CASCADE_MENU_ITEM_H_