diff options
Diffstat (limited to 'src/gui_htmlattrtext.cc')
| -rw-r--r-- | src/gui_htmlattrtext.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/gui_htmlattrtext.cc b/src/gui_htmlattrtext.cc index ceaeba8..453d550 100644 --- a/src/gui_htmlattrtext.cc +++ b/src/gui_htmlattrtext.cc @@ -8,6 +8,7 @@ #include <vector> #include "gui_htmlattrtext.hh" +#include "observers.hh" namespace { @@ -73,6 +74,7 @@ public: auto offset = text_.size(); text_.append(str + start, length); if (attr != EMPTY) ranges_.emplace_back(attr, offset, offset + length); + notify_changed(); } void add(Attribute const& attr, size_t start, size_t length) override { @@ -83,9 +85,11 @@ public: auto it = std::lower_bound(ranges_.begin(), ranges_.end(), r); if (it != ranges_.end() && it->start_ == r.start_ && it->end_ == r.end_) { it->attr_.add(r.attr_); + notify_changed(); return; } ranges_.insert(it, r); + notify_changed(); } void set(Attribute const& attr, size_t start, size_t length) override { clear(start, length); @@ -117,6 +121,7 @@ public: } ++it; } + notify_changed(); } std::string html() const override { @@ -163,6 +168,15 @@ public: void reset() override { text_.clear(); ranges_.clear(); + notify_changed(); + } + + void add_listener(Listener* listener) override { + observers_.insert(listener); + } + + void remove_listener(Listener* listener) override { + observers_.erase(listener); } private: @@ -188,6 +202,13 @@ private: return start + length; } + void notify_changed() { + auto it = observers_.notify(); + while (it.has_next()) { + it.next()->changed(this); + } + } + static void start_tag(std::string* out, Attribute const& attr) { out->append("<span style=\""); if (attr.bold()) out->append("font-weight: bold; "); @@ -213,6 +234,7 @@ private: std::string text_; std::vector<Range> ranges_; + Observers<Listener*> observers_; }; } // namespace |
