diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-15 20:22:30 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-15 20:22:30 +0200 |
commit | 8075ba50640f8b4657be03e4e8ff53de90645c62 (patch) | |
tree | 106bbe6892f8b82d2e0fe3dbeeba73407a350ff1 /AK/LogStream.h | |
parent | 82d9410226fcc0dc0c4f3867734b2b25c3f96679 (diff) | |
download | serenity-8075ba50640f8b4657be03e4e8ff53de90645c62.zip |
LogStream: Add a simple-ish mechanism for colorizing and styling output.
Meet TStyle. It allows you to write things like this:
dbg() << TStyle(TStyle::Red, TStyle::Bold) << "Hello, friends!";
Any style used will be reset along with the newline emitted when the dbg()
temporary goes out of scope. :^)
This can definitely be improved, but I think it's a decent place to start.
Diffstat (limited to 'AK/LogStream.h')
-rw-r--r-- | AK/LogStream.h | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/AK/LogStream.h b/AK/LogStream.h index 44ee51df09..e5906a776f 100644 --- a/AK/LogStream.h +++ b/AK/LogStream.h @@ -7,12 +7,63 @@ namespace AK { class String; class StringView; +class TStyle { +public: + enum NoneTag { DummyValue }; + static NoneTag None; + + enum Color { + Black = 0, + Red, + Green, + Brown, + Blue, + Magenta, + Cyan, + LightGray, + DarkGray, + BrightRed, + BrightGreen, + Yellow, + BrightBlue, + BrightMagenta, + BrightCyan, + White, + NoColor = 255, + }; + enum Attribute { + NoAttribute = 0, + Bold = 1, + }; + + TStyle() {} + TStyle(NoneTag) {} + TStyle(Color color, unsigned attributes = NoAttribute) + : m_color(color) + , m_attributes(attributes) + { + } + + ~TStyle() {} + + Color color() const { return m_color; } + unsigned attributes() const { return m_attributes; } + +private: + Color m_color { NoColor }; + unsigned m_attributes { NoAttribute }; +}; + class LogStream { public: LogStream() {} virtual ~LogStream() {} virtual void write(const char*, int) const = 0; + +protected: + friend const LogStream& operator<<(const LogStream&, const TStyle&); + mutable bool m_needs_style_reset { false }; }; class DebugLogStream final : public LogStream { @@ -20,6 +71,8 @@ public: DebugLogStream() {} virtual ~DebugLogStream() override { + if (m_needs_style_reset) + write("\033[0m", 4); char newline = '\n'; write(&newline, 1); } @@ -51,6 +104,7 @@ const LogStream& operator<<(const LogStream&, const StringView&); const LogStream& operator<<(const LogStream&, int); const LogStream& operator<<(const LogStream&, unsigned); const LogStream& operator<<(const LogStream&, const void*); +const LogStream& operator<<(const LogStream& stream, const TStyle&); inline const LogStream& operator<<(const LogStream& stream, char value) { @@ -65,5 +119,6 @@ inline const LogStream& operator<<(const LogStream& stream, bool value) } -using AK::LogStream; using AK::dbg; +using AK::LogStream; +using AK::TStyle; |