Просмотр исходного кода

Add the goddamn view dispatcher

LTVA1 3 лет назад
Родитель
Сommit
efd163a3e4
4 измененных файлов с 57 добавлено и 66 удалено
  1. 0 31
      event.c
  2. 0 12
      event.h
  3. 42 22
      flizzer_tracker.c
  4. 15 1
      flizzer_tracker.h

+ 0 - 31
event.c

@@ -1,31 +0,0 @@
-#include "event.h"
-
-void set_note(TrackerSongPatternStep* step, uint8_t note)
-{
-	step->note &= 0x80;
-	step->note |= (note & 0x7f);
-}
-
-void set_instrument(TrackerSongPatternStep* step, uint8_t inst)
-{
-	step->note &= 0x7f;
-	step->inst_vol &= 0x0f;
-
-	step->note |= ((inst & 0x10) << 3);
-	step->inst_vol |= ((inst & 0xf) << 4);
-}
-
-void set_volume(TrackerSongPatternStep* step, uint8_t vol)
-{
-	step->command &= 0x7fff;
-	step->inst_vol &= 0xf0;
-
-	step->command |= ((vol & 0x10) << 11);
-	step->inst_vol |= (vol & 0xf);
-}
-
-void set_command(TrackerSongPatternStep* step, uint16_t command)
-{
-	step->command &= 0x8000;
-	step->command |= command & (0x7fff);
-}

+ 0 - 12
event.h

@@ -1,12 +0,0 @@
-#pragma once
-
-#include <stdio.h>
-#include <stdbool.h>
-
-#include "sound_engine/sound_engine_defs.h"
-#include "tracker_engine/tracker_engine_defs.h"
-
-void set_note(TrackerSongPatternStep* step, uint8_t note);
-void set_instrument(TrackerSongPatternStep* step, uint8_t inst);
-void set_volume(TrackerSongPatternStep* step, uint8_t vol);
-void set_command(TrackerSongPatternStep* step, uint16_t command);

+ 42 - 22
flizzer_tracker.c

@@ -41,7 +41,8 @@ const uint8_t u8g2_font_tom_thumb_4x6_tr[725] U8G2_FONT_SECTION("u8g2_font_tom_t
 
 
 static void draw_callback(Canvas* canvas, void* ctx) 
 static void draw_callback(Canvas* canvas, void* ctx) 
 {
 {
-	FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)ctx;
+	TrackerViewModel* model = (TrackerViewModel*)ctx;
+	FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)(model->tracker);
 
 
 	canvas_set_color(canvas, ColorXOR);
 	canvas_set_color(canvas, ColorXOR);
 
 
@@ -61,11 +62,14 @@ static void draw_callback(Canvas* canvas, void* ctx)
 	}
 	}
 }
 }
 
 
-static void input_callback(InputEvent* input_event, void* ctx) 
+static bool input_callback(InputEvent* input_event, void* ctx) 
 {
 {
 	// Проверяем, что контекст не нулевой
 	// Проверяем, что контекст не нулевой
 	furi_assert(ctx);
 	furi_assert(ctx);
-	FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)ctx;
+	TrackerView* tracker_view = (TrackerView*)ctx;
+	FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)(tracker_view->context);
+
+	bool consumed = false;
 
 
 	if(input_event->key == InputKeyBack && input_event->type == InputTypeShort)
 	if(input_event->key == InputKeyBack && input_event->type == InputTypeShort)
 	{
 	{
@@ -85,34 +89,52 @@ static void input_callback(InputEvent* input_event, void* ctx)
 
 
 	FlizzerTrackerEvent event = {.type = EventTypeInput, .input = *input_event, .period = final_period};
 	FlizzerTrackerEvent event = {.type = EventTypeInput, .input = *input_event, .period = final_period};
 	furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
 	furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
+
+	consumed = true;
+	return consumed;
+}
+
+TrackerView* tracker_view_alloc(FlizzerTrackerApp* tracker)
+{
+    TrackerView* tracker_view = malloc(sizeof(TrackerView));
+    tracker_view->view = view_alloc();
+	tracker_view->context = tracker;
+    view_set_context(tracker_view->view, tracker_view);
+    view_allocate_model(tracker_view->view, ViewModelTypeLocking, sizeof(TrackerViewModel));
+    view_set_draw_callback(tracker_view->view, draw_callback);
+    view_set_input_callback(tracker_view->view, input_callback);
+
+    return tracker_view;
+}
+
+void tracker_view_free(TrackerView* tracker_view)
+{
+    furi_assert(tracker_view);
+    view_free(tracker_view->view);
+    free(tracker_view);
 }
 }
 
 
 int32_t flizzer_tracker_app(void* p) 
 int32_t flizzer_tracker_app(void* p) 
 {
 {
 	UNUSED(p);
 	UNUSED(p);
 
 
-	FlizzerTrackerApp* tracker = init_tracker(44100, 50, true, 1024);
+	FlizzerTrackerApp* tracker = init_tracker(44100, 50, false, 1024);
 
 
 	// Текущее событие типа кастомного типа FlizzerTrackerEvent
 	// Текущее событие типа кастомного типа FlizzerTrackerEvent
 	FlizzerTrackerEvent event;
 	FlizzerTrackerEvent event;
 	// Очередь событий на 8 элементов размера FlizzerTrackerEvent
 	// Очередь событий на 8 элементов размера FlizzerTrackerEvent
 	tracker->event_queue = furi_message_queue_alloc(8, sizeof(FlizzerTrackerEvent));
 	tracker->event_queue = furi_message_queue_alloc(8, sizeof(FlizzerTrackerEvent));
 
 
-	// Создаем новый view port
-	ViewPort* view_port = view_port_alloc();
-	// Создаем callback отрисовки, без контекста
-	view_port_draw_callback_set(view_port, draw_callback, tracker);
-	// Создаем callback нажатий на клавиши, в качестве контекста передаем
-	// нашу очередь сообщений, чтоб запихивать в неё эти события
-	view_port_input_callback_set(view_port, input_callback, tracker);
+	tracker->gui = furi_record_open(RECORD_GUI);
+    tracker->view_dispatcher = view_dispatcher_alloc();
+    tracker->tracker_view = tracker_view_alloc(tracker);
 
 
-	// Создаем GUI приложения
-	Gui* gui = furi_record_open(RECORD_GUI);
-	// Подключаем view port к GUI в полноэкранном режиме
-	gui_add_view_port(gui, view_port, GuiLayerFullscreen);
+    view_dispatcher_add_view(tracker->view_dispatcher, 0, tracker->tracker_view->view);
+    view_dispatcher_attach_to_gui(tracker->view_dispatcher, tracker->gui, ViewDispatcherTypeFullscreen);
 
 
-	tracker->view_dispatcher = view_dispatcher_alloc();
-	view_dispatcher_attach_to_gui(tracker->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
+	with_view_model(tracker->tracker_view->view, TrackerViewModel * model, { model->tracker = tracker; }, true);
+
+    view_dispatcher_switch_to_view(tracker->view_dispatcher, 0);
 
 
 	tracker->notification = furi_record_open(RECORD_NOTIFICATION);
 	tracker->notification = furi_record_open(RECORD_NOTIFICATION);
 	notification_message(tracker->notification, &sequence_display_backlight_enforce_on);
 	notification_message(tracker->notification, &sequence_display_backlight_enforce_on);
@@ -212,13 +234,11 @@ int32_t flizzer_tracker_app(void* p)
 	// Специальная очистка памяти, занимаемой очередью
 	// Специальная очистка памяти, занимаемой очередью
 	furi_message_queue_free(tracker->event_queue);
 	furi_message_queue_free(tracker->event_queue);
 
 
-	// Чистим созданные объекты, связанные с интерфейсом
-	gui_remove_view_port(gui, view_port);
-	view_port_free(view_port);
+	view_dispatcher_remove_view(tracker->view_dispatcher, 0);
+    view_dispatcher_free(tracker->view_dispatcher);
+    tracker_view_free(tracker->tracker_view);
 	furi_record_close(RECORD_GUI);
 	furi_record_close(RECORD_GUI);
 
 
-	view_dispatcher_free(tracker->view_dispatcher);
-
 	deinit_tracker(tracker);
 	deinit_tracker(tracker);
 
 
 	return 0;
 	return 0;

+ 15 - 1
flizzer_tracker.h

@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stdio.h>
 #include <furi.h>
 #include <furi.h>
 #include <gui/gui.h>
 #include <gui/gui.h>
+#include <cli/cli.h>
 #include <input/input.h>
 #include <input/input.h>
 #include <u8g2_glue.h>
 #include <u8g2_glue.h>
 
 
@@ -60,10 +61,18 @@ typedef enum
 	SI_PARAMS,
 	SI_PARAMS,
 } SongInfoParam;
 } SongInfoParam;
 
 
+typedef struct
+{
+    View* view;
+    void* context;
+} TrackerView;
+
 typedef struct 
 typedef struct 
 {
 {
 	NotificationApp* notification;
 	NotificationApp* notification;
 	FuriMessageQueue* event_queue;
 	FuriMessageQueue* event_queue;
+	Gui* gui;
+	TrackerView* tracker_view;
 	ViewDispatcher* view_dispatcher;
 	ViewDispatcher* view_dispatcher;
 	bool was_it_back_keypress;
 	bool was_it_back_keypress;
 	uint32_t current_time;
 	uint32_t current_time;
@@ -82,4 +91,9 @@ typedef struct
 	bool was_editing;
 	bool was_editing;
 
 
 	bool quit;
 	bool quit;
-} FlizzerTrackerApp;
+} FlizzerTrackerApp;
+
+typedef struct
+{
+	FlizzerTrackerApp* tracker;
+} TrackerViewModel;