mfc_editor_scene_data_edit_access_bits.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "../mfc_editor_app_i.h"
  2. void mfc_editor_scene_data_edit_access_bits_dialog_ex_callback(
  3. DialogExResult result,
  4. void* context) {
  5. MfcEditorApp* instance = context;
  6. view_dispatcher_send_custom_event(instance->view_dispatcher, result);
  7. }
  8. void mfc_editor_scene_data_edit_access_bits_update_display(MfcEditorApp* instance) {
  9. DialogEx* dialog_ex = instance->dialog_ex;
  10. uint8_t sector_trailer_num =
  11. mf_classic_get_sector_trailer_num_by_sector(instance->current_sector);
  12. furi_string_printf(
  13. instance->data_view_text,
  14. "C1: %i, C2: %i, C3: %i\n",
  15. FURI_BIT(instance->access_bits_edit.bits, 0),
  16. FURI_BIT(instance->access_bits_edit.bits, 1),
  17. FURI_BIT(instance->access_bits_edit.bits, 2));
  18. if(instance->current_block == sector_trailer_num) {
  19. furi_string_cat(
  20. instance->data_view_text,
  21. access_sector_trailer_labels[instance->access_bits_edit.bits]);
  22. } else {
  23. furi_string_cat(
  24. instance->data_view_text, access_data_block_labels[instance->access_bits_edit.bits]);
  25. }
  26. dialog_ex_set_text(
  27. dialog_ex,
  28. furi_string_get_cstr(instance->data_view_text),
  29. 63,
  30. 31,
  31. AlignCenter,
  32. AlignCenter);
  33. }
  34. void mfc_editor_scene_data_edit_access_bits_on_enter(void* context) {
  35. MfcEditorApp* instance = context;
  36. DialogEx* dialog_ex = instance->dialog_ex;
  37. dialog_ex_set_context(instance->dialog_ex, instance);
  38. furi_string_printf(
  39. instance->data_view_header, "Edit Block %u Access", instance->current_block);
  40. dialog_ex_set_header(
  41. dialog_ex, furi_string_get_cstr(instance->data_view_header), 63, 3, AlignCenter, AlignTop);
  42. instance->access_bits_edit =
  43. mfc_editor_get_block_access_bits(instance->mf_classic_data, instance->current_block);
  44. if(instance->access_bits_edit.bits != instance->access_bits_edit.check_bits) {
  45. // If access check bits don't match, make them match now
  46. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  47. }
  48. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  49. dialog_ex_set_center_button_text(dialog_ex, "Save");
  50. dialog_ex_set_left_button_text(dialog_ex, "Prev");
  51. dialog_ex_set_right_button_text(dialog_ex, "Next");
  52. dialog_ex_set_result_callback(
  53. dialog_ex, mfc_editor_scene_data_edit_access_bits_dialog_ex_callback);
  54. view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewDialogEx);
  55. }
  56. bool mfc_editor_scene_data_edit_access_bits_on_event(void* context, SceneManagerEvent event) {
  57. MfcEditorApp* instance = context;
  58. bool consumed = false;
  59. if(event.type == SceneManagerEventTypeCustom) {
  60. if(event.event == DialogExResultLeft) {
  61. instance->access_bits_edit.bits--;
  62. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  63. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  64. consumed = true;
  65. } else if(event.event == DialogExResultRight) {
  66. instance->access_bits_edit.bits++;
  67. instance->access_bits_edit.check_bits = instance->access_bits_edit.bits;
  68. mfc_editor_scene_data_edit_access_bits_update_display(instance);
  69. consumed = true;
  70. } else if(event.event == DialogExResultCenter) {
  71. mfc_editor_set_block_access_bits(
  72. instance->mf_classic_data, instance->current_block, &instance->access_bits_edit);
  73. instance->is_unsaved_changes = true;
  74. scene_manager_previous_scene(instance->scene_manager);
  75. consumed = true;
  76. }
  77. }
  78. return consumed;
  79. }
  80. void mfc_editor_scene_data_edit_access_bits_on_exit(void* context) {
  81. MfcEditorApp* instance = context;
  82. dialog_ex_reset(instance->dialog_ex);
  83. }