irda-app-scene-remote.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "../irda-app.hpp"
  2. #include "gui/modules/button_menu.h"
  3. typedef enum {
  4. ButtonIndexPlus = -2,
  5. ButtonIndexEdit = -1,
  6. ButtonIndexNA = 0,
  7. } ButtonIndex;
  8. static void button_menu_callback(void* context, int32_t index) {
  9. IrdaApp* app = static_cast<IrdaApp*>(context);
  10. IrdaAppEvent event;
  11. event.type = IrdaAppEvent::Type::MenuSelected;
  12. event.payload.menu_index = index;
  13. app->get_view_manager()->send_event(&event);
  14. }
  15. void IrdaAppSceneRemote::on_enter(IrdaApp* app) {
  16. IrdaAppViewManager* view_manager = app->get_view_manager();
  17. ButtonMenu* button_menu = view_manager->get_button_menu();
  18. auto remote_manager = app->get_remote_manager();
  19. int i = 0;
  20. buttons_names = remote_manager->get_button_list();
  21. i = 0;
  22. for(auto& name : buttons_names) {
  23. button_menu_add_item(
  24. button_menu, name.c_str(), i++, button_menu_callback, ButtonMenuItemTypeCommon, app);
  25. }
  26. button_menu_add_item(
  27. button_menu, "+", ButtonIndexPlus, button_menu_callback, ButtonMenuItemTypeControl, app);
  28. button_menu_add_item(
  29. button_menu, "Edit", ButtonIndexEdit, button_menu_callback, ButtonMenuItemTypeControl, app);
  30. app->set_text_store(0, "%s", remote_manager->get_remote_name().c_str());
  31. button_menu_set_header(button_menu, app->get_text_store(0));
  32. if(buttonmenu_item_selected != ButtonIndexNA) {
  33. button_menu_set_selected_item(button_menu, buttonmenu_item_selected);
  34. buttonmenu_item_selected = ButtonIndexNA;
  35. }
  36. view_manager->switch_to(IrdaAppViewManager::ViewType::ButtonMenu);
  37. }
  38. bool IrdaAppSceneRemote::on_event(IrdaApp* app, IrdaAppEvent* event) {
  39. bool consumed = true;
  40. if(event->type == IrdaAppEvent::Type::MenuSelected) {
  41. switch(event->payload.menu_index) {
  42. case ButtonIndexPlus:
  43. app->notify_click();
  44. buttonmenu_item_selected = event->payload.menu_index;
  45. app->set_learn_new_remote(false);
  46. app->switch_to_next_scene(IrdaApp::Scene::Learn);
  47. break;
  48. case ButtonIndexEdit:
  49. app->notify_click();
  50. buttonmenu_item_selected = event->payload.menu_index;
  51. app->switch_to_next_scene(IrdaApp::Scene::Edit);
  52. break;
  53. default:
  54. app->notify_click_and_blink();
  55. auto remote_manager = app->get_remote_manager();
  56. auto signal = remote_manager->get_button_data(event->payload.menu_index);
  57. signal.transmit();
  58. break;
  59. }
  60. } else if(event->type == IrdaAppEvent::Type::Back) {
  61. app->search_and_switch_to_previous_scene(
  62. {IrdaApp::Scene::Start, IrdaApp::Scene::RemoteList});
  63. } else {
  64. consumed = false;
  65. }
  66. return consumed;
  67. }
  68. void IrdaAppSceneRemote::on_exit(IrdaApp* app) {
  69. IrdaAppViewManager* view_manager = app->get_view_manager();
  70. ButtonMenu* button_menu = view_manager->get_button_menu();
  71. button_menu_clean(button_menu);
  72. }