From c476ca2bd64b468108facf4084aa046a43518805 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Mon, 28 Nov 2022 18:09:46 -0500 Subject: [PATCH] LibGUI: Setup IncrementalSearchBanners for TextEditors Multi-line TextEditors now share a common search widget which can be opened with Ctrl+F --- Userland/Libraries/LibGUI/TextEditor.cpp | 11 +++++++++++ Userland/Libraries/LibGUI/TextEditor.h | 1 + 2 files changed, 12 insertions(+) diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp index 897f02e532..a1c537de89 100644 --- a/Userland/Libraries/LibGUI/TextEditor.cpp +++ b/Userland/Libraries/LibGUI/TextEditor.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,8 @@ TextEditor::TextEditor(Type type) if (is_multi_line()) { set_font(Gfx::FontDatabase::default_fixed_width_font()); set_wrapping_mode(WrappingMode::WrapAtWords); + m_search_banner = GUI::IncrementalSearchBanner::construct(*this); + set_banner_widget(m_search_banner); } vertical_scrollbar().set_step(line_height()); m_cursor = { 0, 0 }; @@ -208,6 +211,7 @@ TextPosition TextEditor::text_position_at(Gfx::IntPoint const& widget_position) content_position.translate_by(horizontal_scrollbar().value(), vertical_scrollbar().value()); content_position.translate_by(-(m_horizontal_content_padding + ruler_width() + gutter_width()), 0); content_position.translate_by(-frame_thickness(), -frame_thickness()); + content_position.translate_by(0, -height_occupied_by_banner_widget()); return text_position_at_content_position(content_position); } @@ -442,6 +446,7 @@ void TextEditor::paint_event(PaintEvent& event) } painter.translate(frame_thickness(), frame_thickness()); + painter.translate(0, height_occupied_by_banner_widget()); if (!is_multi_line() && m_icon) { Gfx::IntRect icon_rect { icon_padding(), 1, icon_size(), icon_size() }; @@ -893,6 +898,11 @@ void TextEditor::keydown_event(KeyEvent& event) } } + if (is_multi_line() && !event.shift() && !event.alt() && event.ctrl() && event.key() == KeyCode::Key_F) { + m_search_banner->show(); + return; + } + if (m_editing_engine->on_key(event)) return; @@ -1308,6 +1318,7 @@ Gfx::IntRect TextEditor::line_widget_rect(size_t line_index) const rect.set_width(frame_inner_rect().width()); rect.translate_by(0, -(vertical_scrollbar().value())); rect.translate_by(0, frame_thickness()); + rect.translate_by(0, height_occupied_by_banner_widget()); rect.intersect(frame_inner_rect()); return rect; } diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index e6f4d13f31..024d87b2d1 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/Userland/Libraries/LibGUI/TextEditor.h @@ -440,6 +440,7 @@ private: Optional m_search_result_index; Vector m_search_results; + RefPtr m_search_banner; }; }