summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-05-01 18:50:01 +0200
committerAndreas Kling <kling@serenityos.org>2021-05-01 19:42:29 +0200
commit5b68a76c7792e58188f9834c67c7464c4052207b (patch)
tree7754909daeac0c8a6086813e8c29feea13af73ea
parent443775754f89230d2eead0e629b7af4346b724fc (diff)
downloadserenity-5b68a76c7792e58188f9834c67c7464c4052207b.zip
LibGUI: Track modified state in GUI::TextDocument
Until now, this has been hackishly tracked by the TextEditor app's main widget. Let's do it in GUI::TextDocument instead, so that anyone who uses this class can know whether it's modified or not.
-rw-r--r--Userland/Libraries/LibGUI/TextDocument.cpp11
-rw-r--r--Userland/Libraries/LibGUI/TextDocument.h3
2 files changed, 14 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/TextDocument.cpp b/Userland/Libraries/LibGUI/TextDocument.cpp
index 075265f2be..6e0d7728c4 100644
--- a/Userland/Libraries/LibGUI/TextDocument.cpp
+++ b/Userland/Libraries/LibGUI/TextDocument.cpp
@@ -26,6 +26,7 @@ TextDocument::TextDocument(Client* client)
if (client)
m_clients.set(client);
append_line(make<TextDocumentLine>(*this));
+ set_modified(false);
// TODO: Instead of a repating timer, this we should call a delayed 2 sec timer when the user types.
m_undo_timer = Core::Timer::construct(
@@ -91,6 +92,9 @@ bool TextDocument::set_text(const StringView& text)
client->document_did_set_text();
clear_text_guard.disarm();
+
+ // FIXME: Should the modified state be cleared on some of the earlier returns as well?
+ set_modified(false);
return true;
}
@@ -305,6 +309,8 @@ void TextDocument::update_views(Badge<TextDocumentLine>)
void TextDocument::notify_did_change()
{
+ set_modified(true);
+
if (m_client_notifications_enabled) {
for (auto* client : m_clients)
client->document_did_change();
@@ -878,4 +884,9 @@ const TextDocumentSpan* TextDocument::span_at(const TextPosition& position) cons
return nullptr;
}
+void TextDocument::set_modified(bool modified)
+{
+ m_modified = modified;
+}
+
}
diff --git a/Userland/Libraries/LibGUI/TextDocument.h b/Userland/Libraries/LibGUI/TextDocument.h
index bd711685d7..d73f505799 100644
--- a/Userland/Libraries/LibGUI/TextDocument.h
+++ b/Userland/Libraries/LibGUI/TextDocument.h
@@ -122,6 +122,8 @@ public:
virtual bool is_code_document() const { return false; }
bool is_empty() const;
+ bool is_modified() const { return m_modified; }
+ void set_modified(bool);
protected:
explicit TextDocument(Client* client);
@@ -134,6 +136,7 @@ private:
HashTable<Client*> m_clients;
bool m_client_notifications_enabled { true };
+ bool m_modified { false };
UndoStack m_undo_stack;
RefPtr<Core::Timer> m_undo_timer;