From 54183b8eef601a0bed3b3680de5468a9521db7c7 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Mon, 10 Jun 2024 20:35:45 -0400 Subject: [PATCH] UI/AppKit: Display query results on the find-in-page panel --- Ladybird/AppKit/UI/LadybirdWebView.h | 3 +++ Ladybird/AppKit/UI/LadybirdWebView.mm | 5 +++++ Ladybird/AppKit/UI/SearchPanel.h | 4 ++++ Ladybird/AppKit/UI/SearchPanel.mm | 27 +++++++++++++++++++++++++++ Ladybird/AppKit/UI/Tab.mm | 7 +++++++ 5 files changed, 46 insertions(+) diff --git a/Ladybird/AppKit/UI/LadybirdWebView.h b/Ladybird/AppKit/UI/LadybirdWebView.h index 491acdf7e80..dfa5b10f70a 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.h +++ b/Ladybird/AppKit/UI/LadybirdWebView.h @@ -37,6 +37,9 @@ - (void)onFaviconChange:(Gfx::Bitmap const&)bitmap; - (void)onAudioPlayStateChange:(Web::HTML::AudioPlayState)play_state; +- (void)onFindInPageResult:(size_t)current_match_index + totalMatchCount:(Optional const&)total_match_count; + @end @interface LadybirdWebView : NSClipView diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index ec20a01583c..c3e797a2ad1 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -858,6 +858,11 @@ static void copy_data_to_clipboard(StringView data, NSPasteboardType pasteboard_ self.backgroundColor = Ladybird::gfx_color_to_ns_color(color); }; + m_web_view_bridge->on_find_in_page = [self](auto current_match_index, auto const& total_match_count) { + [self.observer onFindInPageResult:current_match_index + 1 + totalMatchCount:total_match_count]; + }; + m_web_view_bridge->on_insert_clipboard_entry = [](auto const& data, auto const&, auto const& mime_type) { NSPasteboardType pasteboard_type = nil; diff --git a/Ladybird/AppKit/UI/SearchPanel.h b/Ladybird/AppKit/UI/SearchPanel.h index 5f93fe1db5d..28bf0c798aa 100644 --- a/Ladybird/AppKit/UI/SearchPanel.h +++ b/Ladybird/AppKit/UI/SearchPanel.h @@ -6,6 +6,8 @@ #pragma once +#include + #import @interface SearchPanel : NSStackView @@ -14,5 +16,7 @@ - (void)findNextMatch:(id)selector; - (void)findPreviousMatch:(id)selector; - (void)useSelectionForFind:(id)selector; +- (void)onFindInPageResult:(size_t)current_match_index + totalMatchCount:(Optional const&)total_match_count; @end diff --git a/Ladybird/AppKit/UI/SearchPanel.mm b/Ladybird/AppKit/UI/SearchPanel.mm index 1c408fea7d9..bbe46eae3a0 100644 --- a/Ladybird/AppKit/UI/SearchPanel.mm +++ b/Ladybird/AppKit/UI/SearchPanel.mm @@ -25,6 +25,7 @@ static constexpr CGFloat const SEARCH_FIELD_WIDTH = 300; @property (nonatomic, strong) NSSearchField* search_field; @property (nonatomic, strong) NSButton* search_match_case; +@property (nonatomic, strong) NSTextField* result_label; @end @@ -55,6 +56,9 @@ static constexpr CGFloat const SEARCH_FIELD_WIDTH = 300; [self.search_match_case setState:NSControlStateValueOff]; m_case_sensitivity = CaseSensitivity::CaseInsensitive; + self.result_label = [NSTextField labelWithString:@""]; + [self.result_label setHidden:YES]; + auto* search_done = [NSButton buttonWithTitle:@"Done" target:self action:@selector(cancelSearch:)]; @@ -65,6 +69,7 @@ static constexpr CGFloat const SEARCH_FIELD_WIDTH = 300; [self addView:search_previous inGravity:NSStackViewGravityLeading]; [self addView:search_next inGravity:NSStackViewGravityLeading]; [self addView:self.search_match_case inGravity:NSStackViewGravityLeading]; + [self addView:self.result_label inGravity:NSStackViewGravityLeading]; [self addView:search_done inGravity:NSStackViewGravityTrailing]; [self setOrientation:NSUserInterfaceLayoutOrientationHorizontal]; @@ -120,6 +125,28 @@ static constexpr CGFloat const SEARCH_FIELD_WIDTH = 300; } } +- (void)onFindInPageResult:(size_t)current_match_index + totalMatchCount:(Optional const&)total_match_count +{ + if (total_match_count.has_value()) { + auto* label_text = *total_match_count > 0 + ? [NSString stringWithFormat:@"%zu of %zu matches", current_match_index, *total_match_count] + : @"Phrase not found"; + + auto* label_attributes = @{ + NSFontAttributeName : [NSFont boldSystemFontOfSize:12.0f], + }; + + auto* label_attribute = [[NSAttributedString alloc] initWithString:label_text + attributes:label_attributes]; + + [self.result_label setAttributedStringValue:label_attribute]; + [self.result_label setHidden:NO]; + } else { + [self.result_label setHidden:YES]; + } +} + #pragma mark - Private methods - (Tab*)tab diff --git a/Ladybird/AppKit/UI/Tab.mm b/Ladybird/AppKit/UI/Tab.mm index e4043775052..19a18d2c915 100644 --- a/Ladybird/AppKit/UI/Tab.mm +++ b/Ladybird/AppKit/UI/Tab.mm @@ -385,6 +385,13 @@ static constexpr CGFloat const WINDOW_HEIGHT = 800; } } +- (void)onFindInPageResult:(size_t)current_match_index + totalMatchCount:(Optional const&)total_match_count +{ + [self.search_panel onFindInPageResult:current_match_index + totalMatchCount:total_match_count]; +} + #pragma mark - NSWindow - (void)setIsVisible:(BOOL)flag