summaryrefslogtreecommitdiff
path: root/Libraries/LibGUI
diff options
context:
space:
mode:
authorPeter Elliott <pelliott@ualberta.ca>2020-09-20 12:20:24 -0700
committerAndreas Kling <kling@serenityos.org>2020-09-21 20:15:10 +0200
commitfa96e57c156193566dafe00116933dd8a8d80c7f (patch)
treeef59f0e765334b728f8a0e58f8153a43b156631b /Libraries/LibGUI
parent5b6ccbb9184026578b1fc4110e72cd12b1144840 (diff)
downloadserenity-fa96e57c156193566dafe00116933dd8a8d80c7f.zip
LibGUI: Add optional placeholder to TextEditor
This lets you show some disabled text when no text is entered, and the editor is not focused.
Diffstat (limited to 'Libraries/LibGUI')
-rw-r--r--Libraries/LibGUI/TextDocument.cpp5
-rw-r--r--Libraries/LibGUI/TextDocument.h3
-rw-r--r--Libraries/LibGUI/TextEditor.cpp7
-rw-r--r--Libraries/LibGUI/TextEditor.h5
4 files changed, 19 insertions, 1 deletions
diff --git a/Libraries/LibGUI/TextDocument.cpp b/Libraries/LibGUI/TextDocument.cpp
index c16e757c41..10a5ffe497 100644
--- a/Libraries/LibGUI/TextDocument.cpp
+++ b/Libraries/LibGUI/TextDocument.cpp
@@ -675,6 +675,11 @@ void TextDocument::remove(const TextRange& unnormalized_range)
notify_did_change();
}
+bool TextDocument::is_empty() const
+{
+ return line_count() == 1 && line(0).is_empty();
+}
+
TextRange TextDocument::range_for_entire_line(size_t line_index) const
{
if (line_index >= line_count())
diff --git a/Libraries/LibGUI/TextDocument.h b/Libraries/LibGUI/TextDocument.h
index 759e8edf9f..85fad0e97a 100644
--- a/Libraries/LibGUI/TextDocument.h
+++ b/Libraries/LibGUI/TextDocument.h
@@ -139,6 +139,8 @@ public:
virtual bool is_code_document() const { return false; }
+ bool is_empty() const;
+
protected:
explicit TextDocument(Client* client);
@@ -179,6 +181,7 @@ public:
size_t first_non_whitespace_column() const;
Optional<size_t> last_non_whitespace_column() const;
bool ends_in_whitespace() const;
+ bool is_empty() const { return length() == 0; }
private:
// NOTE: This vector is null terminated.
diff --git a/Libraries/LibGUI/TextEditor.cpp b/Libraries/LibGUI/TextEditor.cpp
index cf36a82708..d885b71183 100644
--- a/Libraries/LibGUI/TextEditor.cpp
+++ b/Libraries/LibGUI/TextEditor.cpp
@@ -461,7 +461,12 @@ void TextEditor::paint_event(PaintEvent& event)
#ifdef DEBUG_TEXTEDITOR
painter.draw_rect(visual_line_rect, Color::Cyan);
#endif
- if (!document().has_spans()) {
+
+ if (!placeholder().is_empty() && document().is_empty() && !is_focused() && line_index == 0) {
+ auto line_rect = visual_line_rect;
+ line_rect.set_width(font().width(placeholder()));
+ painter.draw_text(line_rect, placeholder(), m_text_alignment, palette().color(Gfx::ColorRole::DisabledText));
+ } else if (!document().has_spans()) {
// Fast-path for plain text
auto color = palette().color(is_enabled() ? foreground_role() : Gfx::ColorRole::DisabledText);
if (is_displayonly() && (is_focused() || has_visible_list()))
diff --git a/Libraries/LibGUI/TextEditor.h b/Libraries/LibGUI/TextEditor.h
index 56dd2377c4..0bdb68258a 100644
--- a/Libraries/LibGUI/TextEditor.h
+++ b/Libraries/LibGUI/TextEditor.h
@@ -60,6 +60,9 @@ public:
virtual void set_document(TextDocument&);
+ const String& placeholder() const { return m_placeholder; }
+ void set_placeholder(const StringView& placeholder) { m_placeholder = placeholder; }
+
void set_visualize_trailing_whitespace(bool);
bool visualize_trailing_whitespace() const { return m_visualize_trailing_whitespace; }
@@ -301,6 +304,8 @@ private:
RefPtr<TextDocument> m_document;
+ String m_placeholder { "" };
+
template<typename Callback>
void for_each_visual_line(size_t line_index, Callback) const;