@@ -18,6 +18,7 @@ const els = {
1818 refreshBtn : document . querySelector ( "#refreshBtn" ) ,
1919 restartBtn : document . querySelector ( "#restartBtn" ) ,
2020 mainBtn : document . querySelector ( "#mainBtn" ) ,
21+ pinBtn : document . querySelector ( "#pinBtn" ) ,
2122 settingsBtn : document . querySelector ( "#settingsBtn" ) ,
2223 settingsPanel : document . querySelector ( "#settingsPanel" ) ,
2324 opacityRange : document . querySelector ( "#opacityRange" ) ,
@@ -231,6 +232,22 @@ function setSettingsOpen(open) {
231232 els . settingsBtn . setAttribute ( "aria-expanded" , String ( open ) ) ;
232233}
233234
235+ function applyPinState ( pinned ) {
236+ els . pinBtn . classList . toggle ( "active" , pinned ) ;
237+ els . pinBtn . setAttribute ( "aria-pressed" , String ( pinned ) ) ;
238+ els . pinBtn . title = pinned ? "取消固定" : "固定在最前" ;
239+ els . pinBtn . setAttribute ( "aria-label" , pinned ? "取消固定" : "固定在最前" ) ;
240+ }
241+
242+ async function loadPinState ( ) {
243+ try {
244+ const result = await api . getWidgetTopmost ?. ( ) ;
245+ applyPinState ( result ?. pinned === true ) ;
246+ } catch {
247+ applyPinState ( false ) ;
248+ }
249+ }
250+
234251function resetRestartConfirm ( ) {
235252 restartArmed = false ;
236253 window . clearTimeout ( restartConfirmTimer ) ;
@@ -555,6 +572,19 @@ async function reauthAccount(accountId, button) {
555572
556573function wireEvents ( ) {
557574 els . refreshBtn . addEventListener ( "click" , ( ) => refresh ( false ) ) ;
575+ els . pinBtn . addEventListener ( "click" , async ( event ) => {
576+ event . stopPropagation ( ) ;
577+ const nextPinned = els . pinBtn . getAttribute ( "aria-pressed" ) !== "true" ;
578+ applyPinState ( nextPinned ) ;
579+ try {
580+ const result = await api . setWidgetTopmost ?. ( nextPinned ) ;
581+ applyPinState ( result ?. pinned === true ) ;
582+ showToast ( result ?. pinned ? "浮窗已固定在最前" : "浮窗已取消固定" ) ;
583+ } catch ( error ) {
584+ applyPinState ( ! nextPinned ) ;
585+ showToast ( error instanceof Error ? error . message : String ( error ) ) ;
586+ }
587+ } ) ;
558588 els . settingsBtn . addEventListener ( "click" , ( event ) => {
559589 event . stopPropagation ( ) ;
560590 setSettingsOpen ( els . settingsPanel . hidden ) ;
@@ -657,6 +687,7 @@ function wireResizeHandles() {
657687wireEvents ( ) ;
658688wireResizeHandles ( ) ;
659689loadWidgetOpacity ( ) ;
690+ loadPinState ( ) ;
660691refresh ( true ) ;
661692window . setInterval ( ( ) => {
662693 refresh ( true ) ;
0 commit comments