1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:37:46 +00:00

LibLine: Add a display trivia field to suggestions

These strings will be shown next to the completions as an optional hint
or description.
This commit is contained in:
Ali Mohammad Pur 2022-03-23 17:56:48 +04:30 committed by Ali Mohammad Pur
parent 9453e0e6d2
commit d995be428a
3 changed files with 21 additions and 7 deletions

View file

@ -9,13 +9,15 @@
namespace Line {
CompletionSuggestion::CompletionSuggestion(StringView completion, StringView trailing_trivia, Style style)
CompletionSuggestion::CompletionSuggestion(StringView completion, StringView trailing_trivia, StringView display_trivia, Style style)
: style(style)
, text_string(completion)
, display_trivia_string(display_trivia)
, is_valid(true)
{
Utf8View text_u8 { completion };
Utf8View trivia_u8 { trailing_trivia };
Utf8View display_u8 { display_trivia };
for (auto cp : text_u8)
text.append(cp);
@ -23,8 +25,12 @@ CompletionSuggestion::CompletionSuggestion(StringView completion, StringView tra
for (auto cp : trivia_u8)
this->trailing_trivia.append(cp);
for (auto cp : display_u8)
this->display_trivia.append(cp);
text_view = Utf32View { text.data(), text.size() };
trivia_view = Utf32View { this->trailing_trivia.data(), this->trailing_trivia.size() };
display_trivia_view = Utf32View { this->display_trivia.data(), this->display_trivia.size() };
}
void SuggestionManager::set_suggestions(Vector<CompletionSuggestion>&& suggestions)
@ -36,6 +42,7 @@ void SuggestionManager::set_suggestions(Vector<CompletionSuggestion>&& suggestio
VERIFY(suggestion.is_valid);
suggestion.text_view = { suggestion.text.data(), suggestion.text.size() };
suggestion.trivia_view = { suggestion.trailing_trivia.data(), suggestion.trailing_trivia.size() };
suggestion.display_trivia_view = { suggestion.display_trivia.data(), suggestion.display_trivia.size() };
}
size_t common_suggestion_prefix { 0 };

View file

@ -36,12 +36,12 @@ public:
{
}
CompletionSuggestion(StringView completion, StringView trailing_trivia)
: CompletionSuggestion(completion, trailing_trivia, {})
CompletionSuggestion(StringView completion, StringView trailing_trivia, StringView display_trivia = "")
: CompletionSuggestion(completion, trailing_trivia, display_trivia, {})
{
}
CompletionSuggestion(StringView completion, StringView trailing_trivia, Style style);
CompletionSuggestion(StringView completion, StringView trailing_trivia, StringView display_trivia, Style style);
bool operator==(CompletionSuggestion const& suggestion) const
{
@ -50,6 +50,7 @@ public:
Vector<u32> text;
Vector<u32> trailing_trivia;
Vector<u32> display_trivia;
Style style;
size_t start_index { 0 };
size_t input_offset { 0 };
@ -58,7 +59,9 @@ public:
Utf32View text_view;
Utf32View trivia_view;
Utf32View display_trivia_view;
String text_string;
String display_trivia_string;
bool is_valid { false };
};

View file

@ -22,11 +22,13 @@ void XtermSuggestionDisplay::display(SuggestionManager const& manager)
size_t longest_suggestion_length = 0;
size_t longest_suggestion_byte_length = 0;
size_t longest_suggestion_byte_length_without_trivia = 0;
manager.set_start_index(0);
manager.for_each_suggestion([&](auto& suggestion, auto) {
longest_suggestion_length = max(longest_suggestion_length, suggestion.text_view.length());
longest_suggestion_byte_length = max(longest_suggestion_byte_length, suggestion.text_string.length());
longest_suggestion_length = max(longest_suggestion_length, suggestion.text_view.length() + suggestion.display_trivia_view.length());
longest_suggestion_byte_length = max(longest_suggestion_byte_length, suggestion.text_string.length() + suggestion.display_trivia_string.length());
longest_suggestion_byte_length_without_trivia = max(longest_suggestion_byte_length_without_trivia, suggestion.text_string.length());
return IterationDecision::Continue;
});
@ -114,8 +116,10 @@ void XtermSuggestionDisplay::display(SuggestionManager const& manager)
if (spans_entire_line) {
num_printed += m_num_columns;
stderr_stream.write(suggestion.text_string.bytes());
stderr_stream.write(suggestion.display_trivia_string.bytes());
} else {
stderr_stream.write(String::formatted("{: <{}}", suggestion.text_string, longest_suggestion_byte_length + 2).bytes());
auto field = String::formatted("{: <{}} {}", suggestion.text_string, longest_suggestion_byte_length_without_trivia, suggestion.display_trivia_string);
stderr_stream.write(String::formatted("{: <{}}", field, longest_suggestion_byte_length + 2).bytes());
num_printed += longest_suggestion_length + 2;
}