summaryrefslogtreecommitdiff
path: root/src/gui_htmlattrtext.cc
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@yahoo.com>2017-07-23 03:45:40 +0200
committerJoel Klinghed <the_jk@yahoo.com>2017-07-23 03:45:40 +0200
commitff8e353290c0b443c0ec68ee3fc4e137a7025f27 (patch)
treec19b6c228fe57be695863bef54e9d4f3b4893e95 /src/gui_htmlattrtext.cc
parenta66d21a1fd7b53997c27279f6269e9226f06fb6b (diff)
Add proxy log window
Both GTK and QT log windows will scroll down to the last row whenever a new row is appended.
Diffstat (limited to 'src/gui_htmlattrtext.cc')
-rw-r--r--src/gui_htmlattrtext.cc22
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