summaryrefslogtreecommitdiff
path: root/src/c/app.c
blob: 2ce999635274db5b8ecf3926dfc1e0004231fee3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* Copyright (C) 2026 Reiner Herrmann
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

#include <pebble.h>
#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();
}