FindInPageWidget.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (c) 2024, Tim Ledbetter <timledbetter@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "FindInPageWidget.h"
  7. #include "Icon.h"
  8. #include "StringUtils.h"
  9. #include <Ladybird/Qt/Tab.h>
  10. #include <QKeyEvent>
  11. namespace Ladybird {
  12. FindInPageWidget::FindInPageWidget(Tab* tab, WebContentView* content_view)
  13. : QWidget(static_cast<QWidget*>(tab), Qt::Widget)
  14. , m_tab(tab)
  15. , m_content_view(content_view)
  16. {
  17. setFocusPolicy(Qt::FocusPolicy::StrongFocus);
  18. auto* layout = new QHBoxLayout(this);
  19. setLayout(layout);
  20. layout->setContentsMargins(5, 5, 5, 5);
  21. layout->setAlignment(Qt::AlignmentFlag::AlignLeft);
  22. m_find_text = new QLineEdit(this);
  23. m_find_text->setFocusPolicy(Qt::FocusPolicy::StrongFocus);
  24. m_find_text->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Fixed);
  25. m_find_text->setMinimumWidth(50);
  26. m_find_text->setMaximumWidth(250);
  27. connect(m_find_text, &QLineEdit::textChanged, this, &FindInPageWidget::find_text_changed);
  28. m_previous_button = new QPushButton(this);
  29. m_previous_button->setFixedWidth(30);
  30. m_previous_button->setIcon(create_tvg_icon_with_theme_colors("up", palette()));
  31. connect(m_previous_button, &QPushButton::clicked, this, [this] {
  32. m_content_view->find_in_page_previous_match();
  33. });
  34. m_next_button = new QPushButton(this);
  35. m_next_button->setFixedWidth(30);
  36. m_next_button->setIcon(create_tvg_icon_with_theme_colors("down", palette()));
  37. connect(m_next_button, &QPushButton::clicked, this, [this] {
  38. m_content_view->find_in_page_next_match();
  39. });
  40. m_exit_button = new QPushButton(this);
  41. m_exit_button->setFixedWidth(30);
  42. m_exit_button->setIcon(create_tvg_icon_with_theme_colors("close", palette()));
  43. connect(m_exit_button, &QPushButton::clicked, this, [this] {
  44. setVisible(false);
  45. });
  46. layout->addWidget(m_find_text, 1);
  47. layout->addWidget(m_previous_button);
  48. layout->addWidget(m_next_button);
  49. layout->addStretch(1);
  50. layout->addWidget(m_exit_button);
  51. }
  52. FindInPageWidget::~FindInPageWidget() = default;
  53. void FindInPageWidget::find_text_changed()
  54. {
  55. auto converted_text = ak_string_from_qstring(m_find_text->text());
  56. m_content_view->find_in_page(converted_text);
  57. }
  58. void FindInPageWidget::keyPressEvent(QKeyEvent* event)
  59. {
  60. switch (event->key()) {
  61. case Qt::Key_Escape:
  62. setVisible(false);
  63. break;
  64. case Qt::Key_Return:
  65. m_next_button->click();
  66. break;
  67. default:
  68. event->ignore();
  69. break;
  70. }
  71. }
  72. void FindInPageWidget::focusInEvent(QFocusEvent* event)
  73. {
  74. QWidget::focusInEvent(event);
  75. m_find_text->setFocus();
  76. m_find_text->selectAll();
  77. }
  78. void FindInPageWidget::showEvent(QShowEvent*)
  79. {
  80. if (m_tab && m_tab->isVisible())
  81. m_tab->update_hover_label();
  82. }
  83. void FindInPageWidget::hideEvent(QHideEvent*)
  84. {
  85. if (m_tab && m_tab->isVisible())
  86. m_tab->update_hover_label();
  87. }
  88. }