15 #include "spdlog/common.h" 16 #include "spdlog/details/log_msg.h" 17 #include "spdlog/details/synchronous_factory.h" 18 #include "spdlog/sinks/base_sink.h" 21 #include <QPlainTextEdit> 29 template <
typename Mutex>
32 qt_sink(QObject *qt_object, std::string meta_method)
33 : qt_object_(qt_object),
34 meta_method_(std::move(meta_method)) {
36 throw_spdlog_ex(
"qt_sink: qt_object is null");
44 memory_buf_t formatted;
46 const string_view_t str = string_view_t(formatted.data(), formatted.size());
47 QMetaObject::invokeMethod(
48 qt_object_, meta_method_.c_str(), Qt::AutoConnection,
49 Q_ARG(QString, QString::fromUtf8(str.data(),
static_cast<int>(str.size())).trimmed()));
52 void flush_()
override {}
55 QObject *qt_object_ =
nullptr;
56 std::string meta_method_;
65 template <
typename Mutex>
70 bool dark_colors =
false,
72 : qt_text_edit_(qt_text_edit),
73 max_lines_(max_lines),
76 throw_spdlog_ex(
"qt_color_text_sink: text_edit is null");
79 default_color_ = qt_text_edit_->currentCharFormat();
81 QTextCharFormat format;
83 format.setForeground(dark_colors ? Qt::darkGray : Qt::gray);
84 colors_.at(level::trace) = format;
86 format.setForeground(dark_colors ? Qt::darkCyan : Qt::cyan);
87 colors_.at(level::debug) = format;
89 format.setForeground(dark_colors ? Qt::darkGreen : Qt::green);
90 colors_.at(level::info) = format;
92 format.setForeground(dark_colors ? Qt::darkYellow : Qt::yellow);
93 colors_.at(level::warn) = format;
95 format.setForeground(Qt::red);
96 colors_.at(level::err) = format;
98 format.setForeground(Qt::white);
99 format.setBackground(Qt::red);
100 colors_.at(level::critical) = format;
105 void set_default_color(QTextCharFormat format) {
107 default_color_ = format;
110 void set_level_color(level::level_enum color_level, QTextCharFormat format) {
112 colors_.at(static_cast<size_t>(color_level)) = format;
115 QTextCharFormat &get_level_color(level::level_enum color_level) {
117 return colors_.at(static_cast<size_t>(color_level));
120 QTextCharFormat &get_default_color() {
122 return default_color_;
128 QTextEdit *q_text_edit,
130 QTextCharFormat default_color,
131 QTextCharFormat level_color,
132 int color_range_start,
134 : max_lines(max_lines),
135 q_text_edit(q_text_edit),
136 payload(std::move(payload)),
137 default_color(default_color),
138 level_color(level_color),
139 color_range_start(color_range_start),
140 color_range_end(color_range_end) {}
142 QTextEdit *q_text_edit;
144 QTextCharFormat default_color;
145 QTextCharFormat level_color;
146 int color_range_start;
151 memory_buf_t formatted;
154 const string_view_t str = string_view_t(formatted.data(), formatted.size());
157 int color_range_start =
static_cast<int>(msg.color_range_start);
158 int color_range_end =
static_cast<int>(msg.color_range_end);
160 payload = QString::fromUtf8(str.data(),
static_cast<int>(str.size()));
162 if (msg.color_range_start < msg.color_range_end) {
163 color_range_start = QString::fromUtf8(str.data(), msg.color_range_start).size();
164 color_range_end = QString::fromUtf8(str.data(), msg.color_range_end).size();
167 payload = QString::fromLatin1(str.data(),
static_cast<int>(str.size()));
174 colors_.at(msg.level),
178 QMetaObject::invokeMethod(
179 qt_text_edit_, [params]() { invoke_method_(params); }, Qt::AutoConnection);
182 void flush_()
override {}
189 auto *document = params.q_text_edit->document();
190 QTextCursor cursor(document);
193 while (document->blockCount() > params.max_lines) {
194 cursor.select(QTextCursor::BlockUnderCursor);
195 cursor.removeSelectedText();
199 cursor.movePosition(QTextCursor::End);
200 cursor.setCharFormat(params.default_color);
203 if (params.color_range_end <= params.color_range_start) {
204 cursor.insertText(params.payload);
209 cursor.insertText(params.payload.left(params.color_range_start));
212 cursor.setCharFormat(params.level_color);
213 cursor.insertText(params.payload.mid(params.color_range_start,
214 params.color_range_end - params.color_range_start));
217 cursor.setCharFormat(params.default_color);
218 cursor.insertText(params.payload.mid(params.color_range_end));
221 QTextEdit *qt_text_edit_;
224 QTextCharFormat default_color_;
225 std::array<QTextCharFormat, level::n_levels> colors_;
228 #include "spdlog/details/null_mutex.h" 242 template <
typename Factory = spdlog::synchronous_factory>
243 inline std::shared_ptr<logger> qt_logger_mt(
const std::string &logger_name,
244 QTextEdit *qt_object,
245 const std::string &meta_method =
"append") {
246 return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
249 template <
typename Factory = spdlog::synchronous_factory>
250 inline std::shared_ptr<logger> qt_logger_st(
const std::string &logger_name,
251 QTextEdit *qt_object,
252 const std::string &meta_method =
"append") {
253 return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
257 template <
typename Factory = spdlog::synchronous_factory>
258 inline std::shared_ptr<logger> qt_logger_mt(
const std::string &logger_name,
259 QPlainTextEdit *qt_object,
260 const std::string &meta_method =
"appendPlainText") {
261 return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
264 template <
typename Factory = spdlog::synchronous_factory>
265 inline std::shared_ptr<logger> qt_logger_st(
const std::string &logger_name,
266 QPlainTextEdit *qt_object,
267 const std::string &meta_method =
"appendPlainText") {
268 return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
271 template <
typename Factory = spdlog::synchronous_factory>
272 inline std::shared_ptr<logger> qt_logger_mt(
const std::string &logger_name,
274 const std::string &meta_method) {
275 return Factory::template create<sinks::qt_sink_mt>(logger_name, qt_object, meta_method);
278 template <
typename Factory = spdlog::synchronous_factory>
279 inline std::shared_ptr<logger> qt_logger_st(
const std::string &logger_name,
281 const std::string &meta_method) {
282 return Factory::template create<sinks::qt_sink_st>(logger_name, qt_object, meta_method);
286 template <
typename Factory = spdlog::synchronous_factory>
287 inline std::shared_ptr<logger> qt_color_logger_mt(
const std::string &logger_name,
288 QTextEdit *qt_text_edit,
290 bool is_utf8 =
false) {
291 return Factory::template create<sinks::qt_color_sink_mt>(logger_name, qt_text_edit, max_lines,
295 template <
typename Factory = spdlog::synchronous_factory>
296 inline std::shared_ptr<logger> qt_color_logger_st(
const std::string &logger_name,
297 QTextEdit *qt_text_edit,
299 bool is_utf8 =
false) {
300 return Factory::template create<sinks::qt_color_sink_st>(logger_name, qt_text_edit, max_lines,
Definition: qt_sinks.h:126
Definition: qt_sinks.h:30
Definition: qt_sinks.h:66
Definition: base_sink.h:19