SuggestionDisplay.h 2.4 KB

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