SuggestionDisplay.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2020-2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Forward.h>
  8. #include <LibLine/StringMetrics.h>
  9. #include <LibLine/SuggestionManager.h>
  10. namespace Line {
  11. class Editor;
  12. class SuggestionDisplay {
  13. public:
  14. virtual ~SuggestionDisplay() = default;
  15. virtual ErrorOr<void> display(SuggestionManager const&) = 0;
  16. virtual ErrorOr<bool> cleanup() = 0;
  17. virtual void finish() = 0;
  18. virtual void set_initial_prompt_lines(size_t) = 0;
  19. ErrorOr<void> redisplay(SuggestionManager const& manager, size_t lines, size_t columns)
  20. {
  21. if (m_is_showing_suggestions) {
  22. TRY(cleanup());
  23. set_vt_size(lines, columns);
  24. TRY(display(manager));
  25. } else {
  26. set_vt_size(lines, columns);
  27. }
  28. return {};
  29. }
  30. virtual void set_vt_size(size_t lines, size_t columns) = 0;
  31. size_t origin_row() const { return m_origin_row; }
  32. size_t origin_col() const { return m_origin_column; }
  33. void set_origin(int row, int col, Badge<Editor>)
  34. {
  35. m_origin_row = row;
  36. m_origin_column = col;
  37. }
  38. protected:
  39. void did_display() { m_is_showing_suggestions = true; }
  40. void did_cleanup() { m_is_showing_suggestions = false; }
  41. int m_origin_row { 0 };
  42. int m_origin_column { 0 };
  43. bool m_is_showing_suggestions { false };
  44. };
  45. class XtermSuggestionDisplay : public SuggestionDisplay {
  46. public:
  47. XtermSuggestionDisplay(size_t lines, size_t columns)
  48. : m_num_lines(lines)
  49. , m_num_columns(columns)
  50. {
  51. }
  52. virtual ~XtermSuggestionDisplay() override = default;
  53. virtual ErrorOr<void> display(SuggestionManager const&) override;
  54. virtual ErrorOr<bool> cleanup() override;
  55. virtual void finish() override
  56. {
  57. m_pages.clear();
  58. }
  59. virtual void set_initial_prompt_lines(size_t lines) override
  60. {
  61. m_prompt_lines_at_suggestion_initiation = lines;
  62. }
  63. virtual void set_vt_size(size_t lines, size_t columns) override
  64. {
  65. m_num_lines = lines;
  66. m_num_columns = columns;
  67. m_pages.clear();
  68. }
  69. private:
  70. size_t fit_to_page_boundary(size_t selection_index);
  71. size_t m_lines_used_for_last_suggestions { 0 };
  72. size_t m_num_lines { 0 };
  73. size_t m_num_columns { 0 };
  74. size_t m_prompt_lines_at_suggestion_initiation { 0 };
  75. struct PageRange {
  76. size_t start;
  77. size_t end;
  78. };
  79. Vector<PageRange> m_pages;
  80. };
  81. }