/* 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(); }