From 685640a605024f3e7467a96b46cde50b53a7fa7c Mon Sep 17 00:00:00 2001 From: synzr Date: Sun, 12 Oct 2025 01:03:49 +0500 Subject: [PATCH] feat(layers): clock layer --- package.json | 12 ++++- resources/clock_font_big.ttf | Bin 0 -> 6927 bytes resources/clock_font_small.ttf | Bin 0 -> 4618 bytes src/c/clock_layer.c | 84 +++++++++++++++++++++++++++++++++ src/c/clock_layer.h | 10 ++++ src/c/main_window.c | 11 ++++- 6 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 resources/clock_font_big.ttf create mode 100644 resources/clock_font_small.ttf create mode 100644 src/c/clock_layer.c create mode 100644 src/c/clock_layer.h diff --git a/package.json b/package.json index 5fac3cb..2d182a5 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,17 @@ "dummy" ], "resources": { - "media": [] + "media": [{ + "type": "font", + "name": "CLOCK_FONT_38", + "file": "clock_font_big.ttf", + "characterRange": "[0-9]" + }, { + "type": "font", + "name": "CLOCK_FONT_26", + "file": "clock_font_small.ttf", + "characterRange": "[0-9]" + }] } } } diff --git a/resources/clock_font_big.ttf b/resources/clock_font_big.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d40ff81a827e56f376424326d45386abf6a3bd65 GIT binary patch literal 6927 zcmeHL+iMh882`=eCdNymuo@*5oKnT25;t*8HniA_qVxj6MA9UPanVg8B)eg=LIfWM z=^xNXDL(YE4|(Wg3xd8DS}2HbLW{4ZZwfvX*Wb5u&SdxOoJ@8TFOi&O&iU@=H{W;8 z?971!U?+SekUls1)dg~tbbrjTV|esr|MhALzn5CfYj@w208Lz{$^W`Pa=Ui~^lF!T)ujPPA+Ph`) z+4LT)~P=JCD#Kx&*ezbq6N%ea9I@pXt^kjj<4*fTb@`_tz@k^#RyTF^=x4#MO#$bY0*10c}XS3=35J zU?hDCk{yL5v=51iFTU-?=kPETU`Pa$*COx&WP+~d5}dVs1I;M}N`lv3_7d?5VSLT8 zgFn%A%Dff1b)nLgO66JQY2{G>fzs95#zktF#d$*5tZDLBp#3)Co&dH}w(}=o*FQkl zU$VZikB-c9LRRZGuG-y5VLv{=A$)|RIF6Id{UAQUXE=)s_y)rmWwBpF6C6@=_L1XD zC1(lh^sUO{=CSFSDM6`GG>%k7>NiTxxvTMQ@mBPmat|@JZK;;F+*GSqQ^WQ0)?AzS zzJ5N%5OKMx-3Kk@&9-f1?$y@5nMb|mZFLCsF>ymXu9K+wt@#hE3ENofChuGHYqc}| zH7`%&=IS-P@lP#55S2Aum1e8fto>W7-bxjspLA>0zY}}zZU3K`Rk!XrE;rihHMcT0 zD`$*q9Gjm_&sRpeytB{9a5w18_|d!5%y;N#v5(VR>t*J#`Fuy$+l;GubKDfq$S}Jx zRnvC1-Kw9t=BWKlx#nM6^>j60*|lrc%a>mKo@@DSM4~tIA7<_ze)iP)H|YI({hIR~ zL?t{Uf6emptr?%c`tO_XHvU~fzxfH8)$*;^Ypd(LRX?JN#MN}Yf+)OAqi$NRN1NUz zkMq;|_vU-nRuOZD=@nzMkJG=g3a_`a^v6C&PF$op=m`k+F1kW4K}t^Aq$P0-Uj`&k zmAWyf=yuX~6rJLi#9eh(Jr*llv#Oa(X7dNl^x;iDeL33|%Ug zir)ERq3mUr21fETH|KJtI$0g#DT}duY4Jv};Pv&UMKAtzPxtko%A6h;%npU~Z-NZ4 dazUGBW@N=SwkTPn)s|!{16vu`%E0E#z$@INKdb-% literal 0 HcmV?d00001 diff --git a/resources/clock_font_small.ttf b/resources/clock_font_small.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4055d07ec39ddb80e69fe669da90395eb177c4dc GIT binary patch literal 4618 zcmeHKOKTHR6#gcYrmb!5qV<6f98qYg(56irTX5lvilPWriUm=Frmc`iNh3sXF_eNE z5trgpT)61Mt>D7F4+Q^#dqJdv;9~slYcw}blKP;Ez2VMz-Fwb=&OMpjzyZ(!A1;!| z&z(F$iJHwHNZZby8ydMVmHkN7IOQu>^O*&_b&gSfN%`?y?&j>nGq-mGu@#`bJfF>6 zn>pEcfwpIy>3J&ROU_;LtDO7i^X1A8GTeWkkI`K5Y6cit=KeC}@qDJTfSpLwzMZmH z$mFw!UOeamIz6s=vQS(s<2pu(?~Skvq;mF8zrNgk=o1j90=PBv{IaAM_kI!7@uj{E zF}YgqaS_lG6K3D>wO&YSbV*GYV=+31T&PU?8Kbj%XhA$Cje)Ny7p5Spqp?)&k;2T8 z(}Orn^b-n$tAdMM%4rQf3h)ZC1AZ5UcR6y?jT>R_WI&`+9#u)&y2fBI^($F!|OZ zGoB@_!A}PgcNFbta7K~HespjQB2m~?HF|R@wmsBG?61j6MWI_OJEJ$WvHh>epD-oj zunvB89sgkd?RCz-xwALeEzBkt`x|MWy~#by(VUsA2nCM1-#p*y0rC4-|Gm>(Ub?{< zUPXw=FUoH8rVe)AVZO?{iNbAGK5MtH!+V#Y70!q%HR^(2u7;@+fmC&i(YHqQMBQGX zGqvB!%IF!%_^+Z(XG2HU+nM*52EUmpuK0;zFx!1-`m@mqHM_21?xs>EcOx5W>uvel zx^?LDMpYtMiO*EauJ&)MPIOhaIO66gh68nd7kmtxL&+uAFO(c{4B)6@c{|>UoaPhc zmo(qQ`{{jp6T{(6bVc(q-s+xe-lhJz=Hu9cSDJ6(+xVU46Xf4(z6YD|S=@T#?bPfb zX2lbyvrF^D=?rL|IGy8~Cr+oJdE#`IHBX$*1Dr<@B~A~Md=^k9mqG<&m_inFxWODV zToJu4+TvM0rs=VSMgGeXkvt4z5XsQ9iLat3X&oVwQ6fp>AjUCqzE~=Hlf^>WOI60E zvU4|bnNpRmO7QfG>1=87da>XQ4kJRDdU^#w;r%x~q2l QNLRaRL$gtV|EdCC0f|t9?EnA( literal 0 HcmV?d00001 diff --git a/src/c/clock_layer.c b/src/c/clock_layer.c new file mode 100644 index 0000000..cd9568f --- /dev/null +++ b/src/c/clock_layer.c @@ -0,0 +1,84 @@ +#include "clock_layer.h" + +#define CLOCK_COMMON_SPACE 2 +#define CLOCK_BETWEEN_HM_SPACE 8 + +static GFont s_clock_font_big; +static GFont s_clock_font_small; +static Layer *s_clock_layer; +static char s_clock_measure_buffer[4]; + +static void clock_layer_update_proc(Layer *layer, GContext *ctx) { + // Fill a whole layer with the black color. + GRect layer_bounds = layer_get_unobstructed_bounds(layer); + layer_bounds.origin = GPoint(0, 0); + graphics_context_set_fill_color(ctx, GColorBlack); + graphics_fill_rect(ctx, layer_bounds, 0, GCornerNone); + + // Get the current time. + time_t tmp = time(NULL); + struct tm *time = localtime(&tmp); + + // Drawing the measures. + graphics_context_set_text_color(ctx, GColorWhite); + + GSize big_text_size = graphics_text_layout_get_content_size( + "00", s_clock_font_big, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); + GSize small_text_size = graphics_text_layout_get_content_size( + "00", s_clock_font_small, layer_bounds, GTextOverflowModeFill, GTextAlignmentLeft); + + int clock_w = + (big_text_size.w * 2) + small_text_size.w + CLOCK_COMMON_SPACE + CLOCK_BETWEEN_HM_SPACE; + int clock_w_pad = (layer_bounds.size.w - clock_w) / 2; + + strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), + clock_is_24h_style() ? "%H" : "%I", time); + graphics_draw_text(ctx, s_clock_measure_buffer, s_clock_font_big, + GRect(clock_w_pad, 1, big_text_size.w, big_text_size.h), + GTextOverflowModeFill, GTextAlignmentLeft, NULL); + + strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), "%M", time); + graphics_draw_text(ctx, s_clock_measure_buffer, s_clock_font_big, + GRect(clock_w_pad + big_text_size.w + CLOCK_BETWEEN_HM_SPACE, 1, + big_text_size.w, big_text_size.h), + GTextOverflowModeFill, GTextAlignmentLeft, NULL); + + strftime(s_clock_measure_buffer, sizeof(s_clock_measure_buffer), "%S", time); + graphics_draw_text( + ctx, s_clock_measure_buffer, s_clock_font_small, + GRect(clock_w_pad + (big_text_size.w * 2) + CLOCK_BETWEEN_HM_SPACE + CLOCK_COMMON_SPACE, + small_text_size.h - 12, small_text_size.w, small_text_size.h), + GTextOverflowModeFill, GTextAlignmentLeft, NULL); + + // Draw the colon between hours and minutes; + graphics_context_set_fill_color(ctx, GColorWhite); + + int colon_x = clock_w_pad + big_text_size.w - 2; + graphics_fill_rect(ctx, GRect(colon_x, (big_text_size.h / 4) + 3, 6, 6), 0, GCornerNone); + graphics_fill_rect(ctx, GRect(colon_x, (big_text_size.h / 4) + (big_text_size.h / 2) - 3, 6, 6), + 0, GCornerNone); +} + +void clock_layer_init(Window *window, GPoint position) { + s_clock_font_big = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_CLOCK_FONT_38)); + s_clock_font_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_CLOCK_FONT_26)); + + Layer *window_root_layer = window_get_root_layer(window); + GRect window_bounds = layer_get_unobstructed_bounds(window_root_layer); + + s_clock_layer = + layer_create(GRect(position.x, position.y, window_bounds.size.w - position.x, 40)); + layer_set_update_proc(s_clock_layer, clock_layer_update_proc); + + layer_add_child(window_root_layer, s_clock_layer); +} + +void clock_layer_update(void) { + layer_mark_dirty(s_clock_layer); +} + +void clock_layer_deinit(void) { + layer_destroy(s_clock_layer); + fonts_unload_custom_font(s_clock_font_big); + fonts_unload_custom_font(s_clock_font_small); +} diff --git a/src/c/clock_layer.h b/src/c/clock_layer.h new file mode 100644 index 0000000..315b9e0 --- /dev/null +++ b/src/c/clock_layer.h @@ -0,0 +1,10 @@ +#ifndef CLOCK_LAYER_H_ +#define CLOCK_LAYER_H_ + +#include + +void clock_layer_init(Window *window, GPoint position); +void clock_layer_update(void); +void clock_layer_deinit(void); + +#endif diff --git a/src/c/main_window.c b/src/c/main_window.c index a9d6572..e1d0b03 100644 --- a/src/c/main_window.c +++ b/src/c/main_window.c @@ -1,13 +1,20 @@ #include "main_window.h" +#include "clock_layer.h" static Window *s_main_window; -static void main_window_load(Window *window) { +static void main_window_tick(struct tm *time, TimeUnits units) { + clock_layer_update(); +} +static void main_window_load(Window *window) { + clock_layer_init(s_main_window, GPoint(0, 60)); + tick_timer_service_subscribe(SECOND_UNIT, main_window_tick); } static void main_window_unload(Window *window) { - + tick_timer_service_unsubscribe(); + clock_layer_deinit(); } void main_window_init(void) {