From 7f9244c51271033c8792217f04d5cd00d8ef2c8d Mon Sep 17 00:00:00 2001 From: Vlad Gerasimov Date: Sat, 26 Jul 2025 16:47:06 +0400 Subject: [PATCH] feat(tray): add transcribing state and update icons --- src-tauri/resources/tray_idle.png | Bin 1124 -> 1048 bytes src-tauri/resources/tray_recording.png | Bin 1539 -> 1461 bytes src-tauri/resources/tray_transcribing.png | Bin 0 -> 1559 bytes src-tauri/src/actions.rs | 14 +++++++++++--- src-tauri/src/utils.rs | 2 ++ 5 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 src-tauri/resources/tray_transcribing.png diff --git a/src-tauri/resources/tray_idle.png b/src-tauri/resources/tray_idle.png index 49bc7150334c1187c29388a2c7600ad177515004..3892aa829962431e94bae2d58e291b2308b7176f 100644 GIT binary patch delta 976 zcmV;>126pK2$%?vR)4KYL_t(|0qvTLaoaEqK;d2o&<5oQ9>F7|6GYiSoxtt{b|+9e zLDC824U`S!OyG0^lswUm3W5@?fRcRWyVL0?f?t6k_yI^H5{X12@xQWyg@K5fekuK! z_seRvdV^cRR9-)YexCHx*r(D@9*}lzWhqTa`q|NyRJO7{_J2KT?{SzCmP$b5y^XMG zL)pO+F%7$-5gU@WVq|L1_cJUJbpQSV+cCXn;_6PiHPgtV6K}NROybwDB(ODn-oJ#r zif?ROLB3Z^{uP&2icj!yG7|o0+S1e5Nxz_<%b^{(6R{v#br->E}+mW3B?j zjM;(692l+0NSczwm$u;zx|nYT%z;N$H$)~U@ihsbnS2`}Q{gaoFb7QKDiS~B@zqz# z`!HG+JRGEKfZ;m{8&y@8fSnHeR(7v6Jq%-}*PkR`(|`CJ0uk!~-N2)M9m!`pCi~|3 zBMA?AeBX4LU-grNJI!t&HrS4PV|{n{Zi(|gb;Q(UbL!`#j%7>zuye>l~^OW_-j7&Rtso(J3U852i2 zKunkhDyC9gCy1*hx`r>F>URqDYCuPZs;+qDa7x2R3f_@IeHNU`)gTDEwn#MpzJfD! z|85;1C%Q^Q*O$m)Dv+NE_Ke)cfaM?zQ@(;J!GHGThq8eQKzAp3`mJ*GI3PH|t_%wM z{i9Zcc3bL!d{+9|LVOen|Ar4RdO2*DzjP0vm|!S4`-Ctj%utBB6h(Iim}d*DQz343 z7^PCkJ3tENhWRV!7!^a;{f)cv5eo8$n6>1rfc!yf4od-f2dR(fX^U|@e*|>go-N|huAF<$&;Zj%Rke%#Oi<(#N`!)h}8kHue!uL z_>chk<+2n{a0}r0LzF%$obx8gwb)J=I!QDM!T1C7-2RZjc0_?;H#{yh_NmR)6_PL_t(|0qvTLaoaEqhLK(e=myaSaVID{LEH`83E~Z+PSA7$ zB@?6@$eAG7fbIl#CqRi4eNm{NqGXYZ?#l0ur$mDI07(FZMU=^8GMP-~f8~NA!_1$| zr7%UV$BT=Lmyz#oOu4dk2=e}uspmH>8PoZVDK%p%Q;NX*H-Dxa*pD`4MN30wt!Low z018hXw>%t0OTy0XP&7Boy#4-)$8m7$csFD=cs!+3N9`G8#r~DGr6s_4_A9Fxnc1yp zaG&h^1$h3*tr@m5u5GAj34j@@flLVoxv|eS;Moe)p&glM9^nI}=MLQaVz2ICeQwj; z^9PE=R0SNJ|9?BPX9grP?x5E8dga{j4Bl=BR{?)05>pl6c0^pF0&-74uAtXo=fq#| zt^)T42Uj7cDgf=pHMoa5tf;F1BzKMK<0k&NwRT8s#4}q1OmhM(bjMFKw)Qo+w*~cU zM@9x3iW+~?TrjrsC4~oqP|iCjNILK^=1~GSOR>{QAb)p1pwlbooh?s8h5A3)4O%Pz z;M^9axV9i@xPS}1rZCd}y{G;)%>m<(xOQZUz-*x)Dum|N0gJoatPb`4Bb|X=T2d~l zafN$oW}v-Q4SK*S-0FN7$_i51@?@U!`6vUr;w*hzp0UugjhDzVGm)L0g-V zbyp#osegm7cs$4@ZuzYeHG@1sKmnTH9++-Das|bJ$0aOW6sS+^f#RNJ&izO2bxZEX zBU4hO!H0}jh_jEbjDw}J_1u?Cd8SyH%I-h|HMeGuaWHgZ(#egREhFt!+zpg8Xix4H z6btUog7(PuDIt0?ld+A^V+TJZ5IPQ!5jR(w%YQG=FkjQfBL^L)P+ zv4214nI#S7Xc;)3%IBww_Qlk=Wk{jDP)b;q*yeLFc8k3z|r51*FZ(cNvtd=_9rR zCU{00000NkvXXu0mjf6J7lk diff --git a/src-tauri/resources/tray_recording.png b/src-tauri/resources/tray_recording.png index 4d12930c909163c5b90ef98ad85c966c93b997d3..8839e844fea9cf30b70a0e8be6ef414d3e43e8dd 100644 GIT binary patch delta 1427 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 IM6N<$f}HH$1ONa4 diff --git a/src-tauri/resources/tray_transcribing.png b/src-tauri/resources/tray_transcribing.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6fb25a38fa9926a74256a2f934e4d6fda036e0 GIT binary patch literal 1559 zcmV+y2I%>TP)N1vyucQw2Fy5T$~gE3i5sU4iHdC|4k*f@3P6T*0ve(iJ>o4bXzY1+cgy zDSGTTgW(7E?Jm9-I2_SWjtQL@0H)@nG3hUp_t3Y()($1t$COvVQOeP!p(O?SQ zm^3qKjqzX|cP3SI$>5eYsWqv?>A;oI(xt&T_0FU%&WHXYDgw5v_joz<>;s(}u-*L* zmjm`?N&`^53cyZA9Uac%FO7{!*QKk*ZzaO8-EB>mS9nHc(i(+BLR|qy@xNqSeo$9C z6WF)T`Kp3y2snlJR0a-cHtu^x3H=HAAsQM3 zXH>hs-xlbdpMWoceXnQ;V3)dHX{0Vx&-!b}9m~(5$B-ow`gOjJ@VNpjBnk&RyvFi1 zxTC_tYZcE0E<62z!`4|s(H%?q&<}@(w1BSb_n||`cT47^TC|uC+f!6Sfs}=Bp~EuZ zRnX5FQ^D?FzWKd?4*7`|`emjGcuVLp7wit^LqBB2${*7Dz+o$t9DekI?ZJH5VW36p zb0?t_WRI+J*qJEnb-+a^W6}rr`Hq79gW*q3%#UGZsMiPo!j3@=I>@teh}z3L=%Od! z?^h2E8mR&_6Um$eK_t>~<58*g}w# zaFfv;w(@O|-yn{qFW5zdwt~^#%YV!`811%#tY{yZtukznNckHbHk`jd6RaZop8{n~ zAp1MT9pm6->>1+zj4u_#|KZCE6}F>_E;cit|9eXRG^wTIogA~y zJ6EB6#<%kF{wDk2)dyFA-*BI0wbs8^G#>Lr9uJY7Gq!&!tO0XY?vpt;PRGop;{tJn zTi)Dq>El+g)9lA=#D@+-n2NGZS`%=i6MSe~!a7i<-gQyB!W+$hLB1C1U8*nC7bv`k z4hQi@~lf0LqOj%tB|M}cRbcwr6Z}BL7G?kgnUzAQ!_Vx>mC06fd3RWxD}QV zw#X6L7%Js|8eLxjJF7pCF529O?$4*fu9iE}JCE;=`>*jk#S0~!DsL(7{KlmB z*@Y*QCdX zXb$ub8X3|N)Lg-vC+rX6LmxQhACSU^uUa$(h2V<4RoE}$qim?#qS7f8Djr+|9r8Vi#1y>{a zdx#q^AK9CtD31^?3D?qY(MR^Kuv74semuO*6}|{4TW?<)Eu8`wb`*9_uy0LCnSQ-6 zL4|Mzt|+ysI6v5ztFymjh@bVPsSqf?$3GUTjn&!VDx&mEzXYALQM`9JD_~>w1&;UX zEN_t;Iswk{@^nSdVJwHV+>()); let tm = Arc::clone(&app.state::>()); - change_tray_icon(app, TrayIconState::Idle); + change_tray_icon(app, TrayIconState::Transcribing); // Play audio feedback for recording stop play_recording_stop_sound(app); @@ -112,23 +112,31 @@ impl ShortcutAction for TranscribeAction { let ah_clone = ah.clone(); let paste_time = Instant::now(); ah.run_on_main_thread(move || { - match utils::paste(transcription_clone, ah_clone) { + match utils::paste(transcription_clone, ah_clone.clone()) { Ok(()) => debug!( "Text pasted successfully in {:?}", paste_time.elapsed() ), Err(e) => eprintln!("Failed to paste transcription: {}", e), } + change_tray_icon(&ah_clone, TrayIconState::Idle); }) .unwrap_or_else(|e| { eprintln!("Failed to run paste on main thread: {:?}", e); + change_tray_icon(&ah, TrayIconState::Idle); }); + } else { + change_tray_icon(&ah, TrayIconState::Idle); } } - Err(err) => debug!("Global Shortcut Transcription error: {}", err), + Err(err) => { + debug!("Global Shortcut Transcription error: {}", err); + change_tray_icon(&ah, TrayIconState::Idle); + }, } } else { debug!("No samples retrieved from recording stop"); + change_tray_icon(&ah, TrayIconState::Idle); } }); diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index fc7b20c..be67035 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -73,6 +73,7 @@ pub fn paste(text: String, app_handle: AppHandle) -> Result<(), String> { pub enum TrayIconState { Idle, Recording, + Transcribing, } pub fn change_tray_icon(app: &AppHandle, icon: TrayIconState) { @@ -81,6 +82,7 @@ pub fn change_tray_icon(app: &AppHandle, icon: TrayIconState) { let icon_path = match icon { TrayIconState::Idle => "resources/tray_idle.png", TrayIconState::Recording => "resources/tray_recording.png", + TrayIconState::Transcribing => "resources/tray_transcribing.png", }; let _ = tray.set_icon(Some(