1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-16 18:55:07 +00:00

IRCClient: Switch to using an HtmlView for the IRC window contents :^)

This seemed like a perfect fit for LibHTML. We can now style the IRC
channels and queries however we like with the power of HTML and CSS.

This patch doesn't do much in the way of styling, it just gets the
basic mechanism into place.
This commit is contained in:
Andreas Kling 2019-10-28 20:53:19 +01:00
parent 98ff8ef0cf
commit fa69b9fbb7
8 changed files with 64 additions and 146 deletions

View file

@ -1,5 +1,10 @@
#include "IRCLogBuffer.h"
#include "IRCLogBufferModel.h"
#include <LibHTML/DOM/DocumentType.h>
#include <LibHTML/DOM/ElementFactory.h>
#include <LibHTML/DOM/HTMLBodyElement.h>
#include <LibHTML/DOM/Text.h>
#include <LibHTML/Dump.h>
#include <LibHTML/Parser/HTMLParser.h>
#include <stdio.h>
#include <time.h>
@ -9,8 +14,19 @@ NonnullRefPtr<IRCLogBuffer> IRCLogBuffer::create()
}
IRCLogBuffer::IRCLogBuffer()
: m_model(IRCLogBufferModel::create(*this))
{
m_document = adopt(*new Document);
m_document->append_child(adopt(*new DocumentType(document())));
auto html_element = create_element(document(), "html");
m_document->append_child(html_element);
auto head_element = create_element(document(), "head");
html_element->append_child(head_element);
auto style_element = create_element(document(), "style");
style_element->append_child(adopt(*new Text(document(), "div { font-family: Csilla; font-weight: lighter; }")));
head_element->append_child(style_element);
auto body_element = create_element(document(), "body");
html_element->append_child(body_element);
m_container_element = body_element;
}
IRCLogBuffer::~IRCLogBuffer()
@ -19,19 +35,44 @@ IRCLogBuffer::~IRCLogBuffer()
void IRCLogBuffer::add_message(char prefix, const String& name, const String& text, Color color)
{
m_messages.enqueue({ time(nullptr), prefix, name, text, color });
m_model->update();
auto message_element = create_element(document(), "div");
message_element->set_attribute("style", String::format("color: %s;", color.to_string().characters()));
auto timestamp_element = create_element(document(), "span");
auto now = time(nullptr);
auto* tm = localtime(&now);
auto timestamp_string = String::format("%02u:%02u:%02u ", tm->tm_hour, tm->tm_min, tm->tm_sec);
timestamp_element->append_child(adopt(*new Text(document(), timestamp_string)));
auto nick_element = create_element(document(), "b");
nick_element->append_child(*new Text(document(), String::format("<%c%s> ", prefix ? prefix : ' ', name.characters())));
auto text_element = create_element(document(), "span");
text_element->append_child(*new Text(document(), text));
message_element->append_child(timestamp_element);
message_element->append_child(nick_element);
message_element->append_child(text_element);
m_container_element->append_child(message_element);
m_document->force_layout();
}
void IRCLogBuffer::add_message(const String& text, Color color)
{
m_messages.enqueue({ time(nullptr), '\0', String(), text, color });
m_model->update();
auto message_element = create_element(document(), "div");
message_element->set_attribute("style", String::format("color: %s;", color.to_string().characters()));
auto timestamp_element = create_element(document(), "span");
auto now = time(nullptr);
auto* tm = localtime(&now);
auto timestamp_string = String::format("%02u:%02u:%02u ", tm->tm_hour, tm->tm_min, tm->tm_sec);
timestamp_element->append_child(adopt(*new Text(document(), timestamp_string)));
auto text_element = create_element(document(), "span");
text_element->append_child(*new Text(document(), text));
message_element->append_child(timestamp_element);
message_element->append_child(text_element);
m_container_element->append_child(message_element);
m_document->force_layout();
}
void IRCLogBuffer::dump() const
{
for (auto& message : m_messages) {
printf("%u <%c%8s> %s\n", message.timestamp, message.prefix, message.sender.characters(), message.text.characters());
}
// FIXME: Remove me?
}