From df2fbf4c9291cce340945a0a71de0200ccae7369 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Wed, 8 Jul 2026 00:23:22 +0200 Subject: initial commit --- src/c/app.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/c/app.c (limited to 'src/c/app.c') diff --git a/src/c/app.c b/src/c/app.c new file mode 100644 index 0000000..2ce9996 --- /dev/null +++ b/src/c/app.c @@ -0,0 +1,114 @@ +/* Copyright (C) 2026 Reiner Herrmann + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include +#include "metronome.h" + +static Window *app_window; +static ActionBarLayer *action_bar; + +static GBitmap *icon_left_arrows; +static GBitmap *icon_right_arrows; +static GBitmap *icon_plus; +static GBitmap *icon_minus; +static GBitmap *icon_three_dots; +static GBitmap *icon_pause; +static GBitmap *icon_play; + +static AppTimer *action_bar_timer; + +static const int action_bar_timeout = 2000; + +static void primary_action_bar(); +static void secondary_action_bar(); + +static void increase_bpm_handler(ClickRecognizerRef recognizer, void *context) { + increase_bpm(); +} + +static void decrease_bpm_handler(ClickRecognizerRef recognizer, void *context) { + decrease_bpm(); +} + +static void increase_beats_handler(ClickRecognizerRef recognizer, void *context) { + increase_beats(); + app_timer_reschedule(action_bar_timer, action_bar_timeout); +} + +static void decrease_beats_handler(ClickRecognizerRef recognizer, void *context) { + decrease_beats(); + app_timer_reschedule(action_bar_timer, action_bar_timeout); +} + +static void switch_to_secondary_handler(ClickRecognizerRef recognizer, void *context) { + secondary_action_bar(); + + /* switch back to primary after timeout */ + action_bar_timer = app_timer_register(action_bar_timeout, primary_action_bar, NULL); +} + +static void pause_play_handler(ClickRecognizerRef recognizer, void *context) { + if (is_paused()) { + start_metronome(); + action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_pause); + } else { + stop_metronome(); + action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_play); + } + app_timer_reschedule(action_bar_timer, action_bar_timeout); +} + +static void click_config_provider_primary(void *context) { + window_single_click_subscribe(BUTTON_ID_UP, increase_bpm_handler); + window_single_click_subscribe(BUTTON_ID_SELECT, switch_to_secondary_handler); + window_single_click_subscribe(BUTTON_ID_DOWN, decrease_bpm_handler); +} + +static void click_config_provider_secondary(void *context) { + window_single_click_subscribe(BUTTON_ID_UP, increase_beats_handler); + window_single_click_subscribe(BUTTON_ID_SELECT, pause_play_handler); + window_single_click_subscribe(BUTTON_ID_DOWN, decrease_beats_handler); +} + +static void secondary_action_bar() { + action_bar_layer_set_click_config_provider(action_bar, click_config_provider_secondary); + action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_plus); + action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_minus); + action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, is_paused() ? icon_play : icon_pause); +} + +static void primary_action_bar() { + action_bar_layer_set_click_config_provider(action_bar, click_config_provider_primary); + action_bar_layer_set_icon(action_bar, BUTTON_ID_UP, icon_right_arrows); + action_bar_layer_set_icon(action_bar, BUTTON_ID_DOWN, icon_left_arrows); + action_bar_layer_set_icon(action_bar, BUTTON_ID_SELECT, icon_three_dots); +} + +static void init() { + icon_left_arrows = gbitmap_create_with_resource(RESOURCE_ID_LEFT_ARROWS); + icon_right_arrows = gbitmap_create_with_resource(RESOURCE_ID_RIGHT_ARROWS); + icon_plus = gbitmap_create_with_resource(RESOURCE_ID_PLUS); + icon_minus = gbitmap_create_with_resource(RESOURCE_ID_MINUS); + icon_three_dots = gbitmap_create_with_resource(RESOURCE_ID_THREE_DOTS); + icon_pause = gbitmap_create_with_resource(RESOURCE_ID_PAUSE); + icon_play = gbitmap_create_with_resource(RESOURCE_ID_PLAY); + + app_window = create_metronome_window(); + + action_bar = action_bar_layer_create(); + action_bar_layer_add_to_window(action_bar, app_window); + primary_action_bar(); + + window_stack_push(app_window, true); +} + +static void deinit() { + window_destroy(app_window); +} + +int main(void) { + init(); + app_event_loop(); + deinit(); +} -- cgit v1.2.3