@@ -31,6 +31,7 @@ - (void)historySliderChanged:(id)sender;
3131- (void )resetHostID : (id )sender ;
3232- (void )honorPrivacyMarkersChanged : (id )sender ;
3333- (void )maskShortTextPreviewsChanged : (id )sender ;
34+ - (void )animateFlowFeedbackChanged : (id )sender ;
3435- (void )launchAtLoginChanged : (id )sender ;
3536@end
3637
@@ -80,6 +81,13 @@ - (void)maskShortTextPreviewsChanged:(id)sender {
8081 }
8182}
8283
84+ - (void )animateFlowFeedbackChanged : (id )sender {
85+ (void )sender;
86+ if (owner_ != nullptr ) {
87+ owner_->OnAnimateFlowFeedbackChanged ();
88+ }
89+ }
90+
8391- (void )launchAtLoginChanged : (id )sender {
8492 (void )sender;
8593 if (owner_ != nullptr ) {
@@ -368,6 +376,10 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
368376 ApplyPrivacySettingChange ();
369377}
370378
379+ void MacOSSettingsPage::OnAnimateFlowFeedbackChanged () {
380+ ApplyFeedbackSettingChange ();
381+ }
382+
371383void MacOSSettingsPage::OnLaunchAtLoginChanged () {
372384 ApplyLaunchAtLoginChange ();
373385}
@@ -505,6 +517,36 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
505517 [privacyHelp.bottomAnchor constraintEqualToAnchor: privacySection.bottomAnchor constant: -kSectionInsetY ],
506518 ]];
507519
520+ NSTextField * feedbackHeader = [NSTextField labelWithString: CLP_NS (CLP_UI_FEEDBACK )];
521+ feedbackHeader.translatesAutoresizingMaskIntoConstraints = NO ;
522+ feedbackHeader.font = [NSFont systemFontOfSize: 16 weight: NSFontWeightSemibold ];
523+ feedbackHeader.textColor = [NSColor labelColor ];
524+
525+ NSBox * feedbackSection = MacOSMakeGroupBox ();
526+
527+ animateFlowFeedbackCheckbox_ = [NSButton checkboxWithTitle: CLP_NS (CLP_UI_ANIMATE_FLOW_FEEDBACK )
528+ target: fieldDelegate_
529+ action: @selector (animateFlowFeedbackChanged: )];
530+ animateFlowFeedbackCheckbox_.translatesAutoresizingMaskIntoConstraints = NO ;
531+ [feedbackSection addSubview: animateFlowFeedbackCheckbox_];
532+
533+ NSTextField * animateHelp = MacOSMakeWrappingLabel (CLP_NS (CLP_UI_ANIMATE_FLOW_FEEDBACK_HELP ),
534+ 12.0 ,
535+ [NSColor secondaryLabelColor ]);
536+ [feedbackSection addSubview: animateHelp];
537+
538+ NSMutableArray <NSLayoutConstraint *>* feedbackConstraints = [NSMutableArray array ];
539+ [feedbackConstraints addObjectsFromArray: @[
540+ [animateFlowFeedbackCheckbox_.leadingAnchor constraintEqualToAnchor: feedbackSection.leadingAnchor constant: kSectionInsetX ],
541+ [animateFlowFeedbackCheckbox_.trailingAnchor constraintLessThanOrEqualToAnchor: feedbackSection.trailingAnchor constant: -kSectionInsetX ],
542+ [animateFlowFeedbackCheckbox_.topAnchor constraintEqualToAnchor: feedbackSection.topAnchor constant: kSectionInsetY ],
543+
544+ [animateHelp.leadingAnchor constraintEqualToAnchor: feedbackSection.leadingAnchor constant: kSectionInsetX ],
545+ [animateHelp.trailingAnchor constraintEqualToAnchor: feedbackSection.trailingAnchor constant: -kSectionInsetX ],
546+ [animateHelp.topAnchor constraintEqualToAnchor: animateFlowFeedbackCheckbox_.bottomAnchor constant: 6.0 ],
547+ [animateHelp.bottomAnchor constraintEqualToAnchor: feedbackSection.bottomAnchor constant: -kSectionInsetY ],
548+ ]];
549+
508550 NSTextField * hostIDHeader = [NSTextField labelWithString: CLP_NS (CLP_UI_HOST_ID )];
509551 hostIDHeader.translatesAutoresizingMaskIntoConstraints = NO ;
510552 hostIDHeader.font = [NSFont systemFontOfSize: 16 weight: NSFontWeightSemibold ];
@@ -534,6 +576,8 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
534576 [contentRoot addSubview: historySection];
535577 [contentRoot addSubview: privacyHeader];
536578 [contentRoot addSubview: privacySection];
579+ [contentRoot addSubview: feedbackHeader];
580+ [contentRoot addSubview: feedbackSection];
537581 [contentRoot addSubview: networkHeader];
538582 [contentRoot addSubview: section];
539583 [contentRoot addSubview: hostIDHeader];
@@ -587,9 +631,17 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
587631 [privacySection.trailingAnchor constraintEqualToAnchor: heading.trailingAnchor],
588632 [privacySection.topAnchor constraintEqualToAnchor: privacyHeader.bottomAnchor constant: 16.0 ],
589633
634+ [feedbackHeader.leadingAnchor constraintEqualToAnchor: heading.leadingAnchor],
635+ [feedbackHeader.trailingAnchor constraintEqualToAnchor: heading.trailingAnchor],
636+ [feedbackHeader.topAnchor constraintEqualToAnchor: privacySection.bottomAnchor constant: 18.0 ],
637+
638+ [feedbackSection.leadingAnchor constraintEqualToAnchor: heading.leadingAnchor],
639+ [feedbackSection.trailingAnchor constraintEqualToAnchor: heading.trailingAnchor],
640+ [feedbackSection.topAnchor constraintEqualToAnchor: feedbackHeader.bottomAnchor constant: 16.0 ],
641+
590642 [networkHeader.leadingAnchor constraintEqualToAnchor: heading.leadingAnchor],
591643 [networkHeader.trailingAnchor constraintEqualToAnchor: heading.trailingAnchor],
592- [networkHeader.topAnchor constraintEqualToAnchor: privacySection .bottomAnchor constant: 18.0 ],
644+ [networkHeader.topAnchor constraintEqualToAnchor: feedbackSection .bottomAnchor constant: 18.0 ],
593645
594646 [section.leadingAnchor constraintEqualToAnchor: heading.leadingAnchor],
595647 [section.trailingAnchor constraintEqualToAnchor: heading.trailingAnchor],
@@ -626,6 +678,7 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
626678 [NSLayoutConstraint activateConstraints: historyConstraints];
627679 [NSLayoutConstraint activateConstraints: rowConstraints];
628680 [NSLayoutConstraint activateConstraints: privacyConstraints];
681+ [NSLayoutConstraint activateConstraints: feedbackConstraints];
629682 [NSLayoutConstraint activateConstraints: hostIDConstraints];
630683}
631684
@@ -639,6 +692,7 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
639692 MacOSSetFieldText (listenerIpField_, g_settings.listenerIp ());
640693 RefreshClipboardHistoryControls ();
641694 RefreshPrivacyControls ();
695+ RefreshFeedbackControls ();
642696 RefreshLaunchAtLoginControls ();
643697 loadingSettings_ = false ;
644698
@@ -816,6 +870,33 @@ uint64_t SliderStopValue(NSSlider* slider, const LimitStop(&stops)[N]) {
816870 ShowStatusMessage ();
817871}
818872
873+ void MacOSSettingsPage::RefreshFeedbackControls () {
874+ if (animateFlowFeedbackCheckbox_ == nil ) {
875+ return ;
876+ }
877+
878+ animateFlowFeedbackCheckbox_.state = g_settings.animateFlowFeedback ()
879+ ? NSControlStateValueOn
880+ : NSControlStateValueOff ;
881+ }
882+
883+ void MacOSSettingsPage::ApplyFeedbackSettingChange () {
884+ if (loadingSettings_ || animateFlowFeedbackCheckbox_ == nil ) {
885+ return ;
886+ }
887+
888+ const bool desiredAnimate = animateFlowFeedbackCheckbox_.state == NSControlStateValueOn ;
889+ if (desiredAnimate == g_settings.animateFlowFeedback ()) {
890+ return ;
891+ }
892+ if (!g_settings.set_animateFlowFeedback (desiredAnimate)) {
893+ return ;
894+ }
895+
896+ MacOSSetFieldText (statusMessage_, CLP_NS (CLP_UI_FEEDBACK_SETTINGS_APPLIED ));
897+ ShowStatusMessage ();
898+ }
899+
819900void MacOSSettingsPage::RefreshLaunchAtLoginControls () {
820901 if (launchAtLoginCheckbox_ == nil ) {
821902 return ;
0 commit comments