diff --git a/include/spdlog/sinks/qplaintextedit_sink.h b/include/spdlog/sinks/qplaintextedit_sink.h new file mode 100644 index 00000000..e2a56932 --- /dev/null +++ b/include/spdlog/sinks/qplaintextedit_sink.h @@ -0,0 +1,71 @@ +// Copyright(c) 2015-present, Gabi Melman, mguludag and spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// +// Custom sink for QPlainTextEdit and its childs(QTextBrowser... etc) +// Building and using requires Qt library. +// + +#include "spdlog/common.h" +#include "spdlog/details/log_msg.h" +#include "spdlog/details/synchronous_factory.h" +#include "spdlog/sinks/base_sink.h" + +#include "qplaintextedit_sink_p.h" + +namespace spdlog { +namespace sinks { +template +class qplaintextedit_sink : public base_sink { +public: + qplaintextedit_sink(QPlainTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_p = std::make_shared<_spdlog_p::_sinks_p::qplaintextedit_sink_p>(textedit); + } else { + throw spdlog_ex("Error opening QPlainTextEdit"); + } + } + + ~qplaintextedit_sink() { flush_(); } + +protected: + void sink_it_(const details::log_msg &msg) override { + memory_buf_t formatted; + base_sink::formatter_->format(msg, formatted); + auto str = std::string(formatted.begin(), formatted.end() - 2); + textedit_p->append(str); + } + + void flush_() override {} + +private: + std::shared_ptr<_spdlog_p::_sinks_p::qplaintextedit_sink_p> textedit_p = nullptr; +}; + +#include "spdlog/details/null_mutex.h" +#include + +using qplaintextedit_sink_mt = qplaintextedit_sink; +using qplaintextedit_sink_st = qplaintextedit_sink; + +} // namespace sinks + +template +inline std::shared_ptr +qplaintextedit_logger_mt(const std::string &logger_name, + QPlainTextEdit *qplaintextedit = nullptr) { + return Factory::template create(logger_name, + qplaintextedit); +} + +template +inline std::shared_ptr +qplaintextedit_logger_st(const std::string &logger_name, + QPlainTextEdit *qplaintextedit = nullptr) { + return Factory::template create(logger_name, + qplaintextedit); +} + +} // namespace spdlog diff --git a/include/spdlog/sinks/qplaintextedit_sink_p.h b/include/spdlog/sinks/qplaintextedit_sink_p.h new file mode 100644 index 00000000..3dfd068f --- /dev/null +++ b/include/spdlog/sinks/qplaintextedit_sink_p.h @@ -0,0 +1,35 @@ +// Copyright(c) 2015-present, Gabi Melman, mguludag and spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +namespace _spdlog_p { +namespace _sinks_p { +class qplaintextedit_sink_p : public QObject { + Q_OBJECT +public: + qplaintextedit_sink_p(QPlainTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_ = textedit; + connect(this, &qplaintextedit_sink_p::append_text, textedit_, + &QPlainTextEdit::appendPlainText); + } + } + + ~qplaintextedit_sink_p() {} + + void append(const std::string &str) { + emit append_text(QString::fromStdString(str)); + } + +signals: + void append_text(const QString &); + +private: + QPlainTextEdit *textedit_ = nullptr; +}; +} // namespace _sinks_p +} // namespace _spdlog_p