@@ -669,7 +669,6 @@ private void UpdateClockPanelVisibility()
669669 if ( QueryTextBox == null || ContextMenu == null || History == null || ClockPanel == null )
670670 return ;
671671
672- // ✅ `WindowAnimator`와 동일한 애니메이션 속도 설정 참조
673672 var animationLength = _settings . AnimationSpeed switch
674673 {
675674 AnimationSpeeds . Slow => 560 ,
@@ -678,48 +677,64 @@ private void UpdateClockPanelVisibility()
678677 _ => _settings . CustomAnimationLength
679678 } ;
680679
681- var animationDuration = TimeSpan . FromMilliseconds ( animationLength * 2 / 3 ) ; // ✅ 같은 비율 적용
680+ var animationDuration = TimeSpan . FromMilliseconds ( animationLength * 2 / 3 ) ;
682681
683- // ✅ 글자 수가 1 이상이면 애니메이션 추가 실행 방지
684- if ( QueryTextBox . Text . Length > 0 ||
685- ContextMenu . Visibility != Visibility . Collapsed ||
686- History . Visibility != Visibility . Collapsed )
682+ // ✅ ClockPanel이 표시될 조건 (쿼리 입력 없음 & ContextMenu, History가 닫혀 있음)
683+ bool shouldShowClock = QueryTextBox . Text . Length == 0 &&
684+ ContextMenu . Visibility == Visibility . Collapsed &&
685+ History . Visibility == Visibility . Collapsed ;
686+
687+ // ✅ ClockPanel이 숨겨질 조건 (쿼리에 글자가 있거나, ContextMenu 또는 History가 열려 있음)
688+ bool shouldHideClock = QueryTextBox . Text . Length > 0 ||
689+ ContextMenu . Visibility == Visibility . Visible ||
690+ History . Visibility != Visibility . Collapsed ;
691+
692+ // ✅ 1. ContextMenu가 열리면 즉시 Visibility.Hidden으로 설정 (애니메이션 없이 강제 숨김)
693+ if ( ContextMenu . Visibility == Visibility . Visible )
687694 {
688- if ( ClockPanel . Visibility == Visibility . Hidden || _isClockPanelAnimating )
689- return ; // ✅ 이미 숨겨져 있거나 애니메이션 실행 중이면 다시 실행하지 않음
695+ ClockPanel . Visibility = Visibility . Hidden ;
696+ ClockPanel . Opacity = 0.0 ; // 혹시라도 Opacity 애니메이션이 영향을 줄 경우 0으로 설정
697+ return ;
698+ }
690699
700+ // ✅ 2. ContextMenu가 닫혔을 때, 쿼리에 글자가 남아 있다면 Hidden 상태 유지 (이전 상태 기억)
701+ if ( ContextMenu . Visibility == Visibility . Collapsed && QueryTextBox . Text . Length > 0 )
702+ {
703+ ClockPanel . Visibility = Visibility . Hidden ;
704+ ClockPanel . Opacity = 0.0 ;
705+ return ;
706+ }
707+
708+ // ✅ 3. ClockPanel을 숨기는 경우 (페이드아웃 애니메이션 적용)
709+ if ( shouldHideClock && ClockPanel . Visibility == Visibility . Visible && ! _isClockPanelAnimating )
710+ {
691711 _isClockPanelAnimating = true ;
692712
693- // Opacity 애니메이션 적용 후 Visibility.Hidden 처리
694713 var fadeOut = new DoubleAnimation
695714 {
696715 From = 1.0 ,
697716 To = 0.0 ,
698717 Duration = animationDuration ,
699- FillBehavior = FillBehavior . Stop
718+ FillBehavior = FillBehavior . HoldEnd
700719 } ;
701720
702721 fadeOut . Completed += ( s , e ) =>
703722 {
704- ClockPanel . Visibility = Visibility . Hidden ;
723+ ClockPanel . Visibility = Visibility . Hidden ; // ✅ 애니메이션 후 완전히 숨김
705724 _isClockPanelAnimating = false ;
706725 } ;
707726
708727 ClockPanel . BeginAnimation ( UIElement . OpacityProperty , fadeOut ) ;
709728 }
710- else
729+ // ✅ 4. ClockPanel을 표시하는 경우 (페이드인 애니메이션 적용)
730+ else if ( shouldShowClock && ClockPanel . Visibility != Visibility . Visible && ! _isClockPanelAnimating )
711731 {
712- if ( ClockPanel . Visibility == Visibility . Visible || _isClockPanelAnimating )
713- return ; // ✅ 이미 표시 중이거나 애니메이션 실행 중이면 다시 실행하지 않음
714-
715732 _isClockPanelAnimating = true ;
716733
717- // ✅ Dispatcher를 사용하여 UI 업데이트 후 `ClockPanel` 표시
718734 System . Windows . Application . Current . Dispatcher . Invoke ( ( ) =>
719735 {
720- ClockPanel . Visibility = Visibility . Visible ;
736+ ClockPanel . Visibility = Visibility . Visible ; // ✅ Visibility를 먼저 Visible로 설정
721737
722- // Opacity 애니메이션 적용
723738 var fadeIn = new DoubleAnimation
724739 {
725740 From = 0.0 ,
@@ -739,6 +754,8 @@ private void UpdateClockPanelVisibility()
739754
740755
741756
757+
758+
742759 private void InitSoundEffects ( )
743760 {
744761 if ( _settings . WMPInstalled )
0 commit comments