From a09f4908040c5bea6fa5c49193e21f73e58f2d6d Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Mon, 28 Jun 2021 23:13:37 +0300 Subject: [PATCH 1/7] Implemented QTextEdit and, QTextBrowser sink --- include/spdlog/sinks/qtextedit_sink.h | 70 +++++++++++++++++++++++++ include/spdlog/sinks/qtextedit_sink_p.h | 35 +++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 include/spdlog/sinks/qtextedit_sink.h create mode 100644 include/spdlog/sinks/qtextedit_sink_p.h diff --git a/include/spdlog/sinks/qtextedit_sink.h b/include/spdlog/sinks/qtextedit_sink.h new file mode 100644 index 00000000..859d1aaa --- /dev/null +++ b/include/spdlog/sinks/qtextedit_sink.h @@ -0,0 +1,70 @@ +// 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 QTextEdit 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 "qtextedit_sink_p.h" + +namespace spdlog { +namespace sinks { +template +class qtextedit_sink : public base_sink { +public: + qtextedit_sink(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_p = std::make_shared<_spdlog_p::_sinks_p::qtextedit_sink_p>(textedit); + } else { + throw spdlog_ex("Error opening QTextEdit"); + } + } + + ~qtextedit_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::qtextedit_sink_p> textedit_p = nullptr; +}; + +#include "spdlog/details/null_mutex.h" +#include +using qtextedit_sink_mt = qtextedit_sink; +using qtextedit_sink_st = qtextedit_sink; + +} // namespace sinks + +template +inline std::shared_ptr +qtextedit_logger_mt(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); +} + +template +inline std::shared_ptr +qtextedit_logger_st(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); +} + +} // namespace spdlog diff --git a/include/spdlog/sinks/qtextedit_sink_p.h b/include/spdlog/sinks/qtextedit_sink_p.h new file mode 100644 index 00000000..30c6bc09 --- /dev/null +++ b/include/spdlog/sinks/qtextedit_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 qtextedit_sink_p : public QObject { + Q_OBJECT +public: + qtextedit_sink_p(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_ = textedit; + connect(this, &qtextedit_sink_p::append_text, textedit_, + &QTextEdit::append); + } + } + + ~qtextedit_sink_p() {} + + void append(const std::string &str) { + emit append_text(QString::fromStdString(str)); + } + +signals: + void append_text(const QString &); + +private: + QTextEdit *textedit_ = nullptr; +}; +} // namespace _sinks_p +} // namespace _spdlog_p From 5ba2f77230077c0b3a435b6899d86113447c10ba Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Mon, 28 Jun 2021 23:16:23 +0300 Subject: [PATCH 2/7] Added QPlainTextEdit sink QPlainTextEdit performs better than QTextEdit and its derivatives and also it has rich features --- include/spdlog/sinks/qplaintextedit_sink.h | 71 ++++++++++++++++++++ include/spdlog/sinks/qplaintextedit_sink_p.h | 35 ++++++++++ 2 files changed, 106 insertions(+) create mode 100644 include/spdlog/sinks/qplaintextedit_sink.h create mode 100644 include/spdlog/sinks/qplaintextedit_sink_p.h 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 From c24b957e1725c1df8a1c3610bf3b58cc1f9eae83 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Tue, 29 Jun 2021 01:01:18 +0300 Subject: [PATCH 3/7] Delete qplaintextedit_sink.h --- include/spdlog/sinks/qplaintextedit_sink.h | 71 ---------------------- 1 file changed, 71 deletions(-) delete mode 100644 include/spdlog/sinks/qplaintextedit_sink.h diff --git a/include/spdlog/sinks/qplaintextedit_sink.h b/include/spdlog/sinks/qplaintextedit_sink.h deleted file mode 100644 index e2a56932..00000000 --- a/include/spdlog/sinks/qplaintextedit_sink.h +++ /dev/null @@ -1,71 +0,0 @@ -// 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 From a19f4bba0cc79b649c6b7cd74939c5fe595166ba Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Tue, 29 Jun 2021 01:01:40 +0300 Subject: [PATCH 4/7] Delete qplaintextedit_sink_p.h --- include/spdlog/sinks/qplaintextedit_sink_p.h | 35 -------------------- 1 file changed, 35 deletions(-) delete mode 100644 include/spdlog/sinks/qplaintextedit_sink_p.h diff --git a/include/spdlog/sinks/qplaintextedit_sink_p.h b/include/spdlog/sinks/qplaintextedit_sink_p.h deleted file mode 100644 index 3dfd068f..00000000 --- a/include/spdlog/sinks/qplaintextedit_sink_p.h +++ /dev/null @@ -1,35 +0,0 @@ -// 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 From 96ebef093fe4980aa999be2ebe965dc26fc560ed Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Tue, 29 Jun 2021 01:01:48 +0300 Subject: [PATCH 5/7] Delete qtextedit_sink_p.h --- include/spdlog/sinks/qtextedit_sink_p.h | 35 ------------------------- 1 file changed, 35 deletions(-) delete mode 100644 include/spdlog/sinks/qtextedit_sink_p.h diff --git a/include/spdlog/sinks/qtextedit_sink_p.h b/include/spdlog/sinks/qtextedit_sink_p.h deleted file mode 100644 index 30c6bc09..00000000 --- a/include/spdlog/sinks/qtextedit_sink_p.h +++ /dev/null @@ -1,35 +0,0 @@ -// 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 qtextedit_sink_p : public QObject { - Q_OBJECT -public: - qtextedit_sink_p(QTextEdit *textedit = nullptr) { - if (textedit != nullptr) { - textedit_ = textedit; - connect(this, &qtextedit_sink_p::append_text, textedit_, - &QTextEdit::append); - } - } - - ~qtextedit_sink_p() {} - - void append(const std::string &str) { - emit append_text(QString::fromStdString(str)); - } - -signals: - void append_text(const QString &); - -private: - QTextEdit *textedit_ = nullptr; -}; -} // namespace _sinks_p -} // namespace _spdlog_p From 7f74012a0d8ac9a01ad184fe0f16c73f39032a19 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Tue, 29 Jun 2021 01:02:16 +0300 Subject: [PATCH 6/7] Delete qtextedit_sink.h --- include/spdlog/sinks/qtextedit_sink.h | 70 --------------------------- 1 file changed, 70 deletions(-) delete mode 100644 include/spdlog/sinks/qtextedit_sink.h diff --git a/include/spdlog/sinks/qtextedit_sink.h b/include/spdlog/sinks/qtextedit_sink.h deleted file mode 100644 index 859d1aaa..00000000 --- a/include/spdlog/sinks/qtextedit_sink.h +++ /dev/null @@ -1,70 +0,0 @@ -// 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 QTextEdit 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 "qtextedit_sink_p.h" - -namespace spdlog { -namespace sinks { -template -class qtextedit_sink : public base_sink { -public: - qtextedit_sink(QTextEdit *textedit = nullptr) { - if (textedit != nullptr) { - textedit_p = std::make_shared<_spdlog_p::_sinks_p::qtextedit_sink_p>(textedit); - } else { - throw spdlog_ex("Error opening QTextEdit"); - } - } - - ~qtextedit_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::qtextedit_sink_p> textedit_p = nullptr; -}; - -#include "spdlog/details/null_mutex.h" -#include -using qtextedit_sink_mt = qtextedit_sink; -using qtextedit_sink_st = qtextedit_sink; - -} // namespace sinks - -template -inline std::shared_ptr -qtextedit_logger_mt(const std::string &logger_name, - QTextEdit *qtextedit = nullptr) { - return Factory::template create(logger_name, - qtextedit); -} - -template -inline std::shared_ptr -qtextedit_logger_st(const std::string &logger_name, - QTextEdit *qtextedit = nullptr) { - return Factory::template create(logger_name, - qtextedit); -} - -} // namespace spdlog From 9aa26fb96992d4ae05a0bd8de68d15361b8daf41 Mon Sep 17 00:00:00 2001 From: Muhammed Galib Uludag Date: Tue, 29 Jun 2021 01:04:25 +0300 Subject: [PATCH 7/7] Added Qt sinks --- include/spdlog/sinks/qt_sinks.h | 187 ++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 include/spdlog/sinks/qt_sinks.h diff --git a/include/spdlog/sinks/qt_sinks.h b/include/spdlog/sinks/qt_sinks.h new file mode 100644 index 00000000..18fbecc5 --- /dev/null +++ b/include/spdlog/sinks/qt_sinks.h @@ -0,0 +1,187 @@ +// 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 or QTextEdit 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 +#include +#include + +namespace _spdlog_p { +namespace _sinks_p { +// +// Private class for QTextEdit and its derivatives +// +class qtextedit_sink_p : public QObject { + Q_OBJECT +public: + qtextedit_sink_p(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_ = textedit; + connect(this, &qtextedit_sink_p::append_text, textedit_, + &QTextEdit::append); + } + } + + ~qtextedit_sink_p() {} + + void append(const spdlog::string_view_t &str) { + emit append_text( + QString::fromUtf8(str.data(), static_cast(str.size() - 2))); + } + +signals: + void append_text(const QString &); + +private: + QTextEdit *textedit_ = nullptr; +}; + +// +// Private class for QPlainTextEdit +// +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 spdlog::string_view_t &str) { + emit append_text( + QString::fromUtf8(str.data(), static_cast(str.size() - 2))); + } + +signals: + void append_text(const QString &); + +private: + QPlainTextEdit *textedit_ = nullptr; +}; +} // namespace _sinks_p +} // namespace _spdlog_p + +// +// qtextedit_sink class +// +namespace spdlog { +namespace sinks { +template class qtextedit_sink : public base_sink { +public: + qtextedit_sink(QTextEdit *textedit = nullptr) { + if (textedit != nullptr) { + textedit_p = + std::make_shared<_spdlog_p::_sinks_p::qtextedit_sink_p>(textedit); + } else { + throw spdlog_ex("Error opening QTextEdit"); + } + } + + ~qtextedit_sink() { flush_(); } + +protected: + void sink_it_(const details::log_msg &msg) override { + memory_buf_t formatted; + base_sink::formatter_->format(msg, formatted); + string_view_t str_v = string_view_t(formatted.data(), formatted.size()); + textedit_p->append(str_v); + } + + void flush_() override {} + +private: + std::shared_ptr<_spdlog_p::_sinks_p::qtextedit_sink_p> textedit_p = nullptr; +}; + +// +// qplaintextedit_sink class +// +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); + string_view_t str_v = string_view_t(formatted.data(), formatted.size()); + textedit_p->append(str_v); + } + + 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 qtextedit_sink_mt = qtextedit_sink; +using qtextedit_sink_st = qtextedit_sink; + +using qplaintextedit_sink_mt = qplaintextedit_sink; +using qplaintextedit_sink_st = qplaintextedit_sink; + +} // namespace sinks + +// +// Factory functions +// +template +inline std::shared_ptr +qtextedit_logger_mt(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); +} + +template +inline std::shared_ptr +qtextedit_logger_st(const std::string &logger_name, + QTextEdit *qtextedit = nullptr) { + return Factory::template create(logger_name, + qtextedit); +} + +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