/src/gui/src/tabs/log-tab.cpp

https://github.com/Bionus/imgbrd-grabber · C++ · 110 lines · 86 code · 17 blank · 7 comment · 7 complexity · 6255044f757c0725afb19f105a52480f MD5 · raw file

  1. #include "tabs/log-tab.h"
  2. #include <QDesktopServices>
  3. #include <QDir>
  4. #include <QFile>
  5. #include <QRegularExpression>
  6. #include <QScrollBar>
  7. #include <ui_log-tab.h>
  8. #include "functions.h"
  9. #include "helpers.h"
  10. #include "logger.h"
  11. LogTab::LogTab(QWidget *parent)
  12. : QWidget(parent), ui(new Ui::LogTab)
  13. {
  14. ui->setupUi(this);
  15. // Load already written log
  16. QFile logFile(Logger::getInstance().logFile());
  17. if (logFile.open(QFile::ReadOnly | QFile::Text)) {
  18. while (!logFile.atEnd()) {
  19. write(logFile.readLine());
  20. }
  21. logFile.close();
  22. }
  23. connect(&Logger::getInstance(), &Logger::newLog, this, &LogTab::write);
  24. }
  25. LogTab::~LogTab()
  26. {
  27. close();
  28. delete ui;
  29. }
  30. void LogTab::write(const QString &msg)
  31. {
  32. // Find meta stop characters
  33. QString htmlMsg = msg;
  34. int timeEnd = msg.indexOf(']');
  35. int levelEnd = msg.indexOf(']', timeEnd + 1);
  36. QString level = msg.mid(timeEnd + 2, levelEnd - timeEnd - 2);
  37. // Level color
  38. static const QMap<QString, QString> colors
  39. {
  40. { "Debug", "#999" },
  41. { "Info", "" },
  42. { "Warning", "orange" },
  43. { "Error", "red" },
  44. };
  45. QString levelColor = colors[level];
  46. if (!levelColor.isEmpty()) {
  47. htmlMsg.insert(msg.size(), "</span>");
  48. htmlMsg.insert(timeEnd + 1, QString("<span style='color:%1'>").arg(colors[level]));
  49. }
  50. // Time color
  51. htmlMsg.insert(timeEnd + 1, "</span>");
  52. htmlMsg.insert(0, "<span style='color:darkgreen'>");
  53. // Links color
  54. static const QRegularExpression rxLinks("`(http[^`]+)`");
  55. htmlMsg.replace(rxLinks, R"(<a href="\1">\1</a>)");
  56. // File paths color
  57. #ifdef Q_OS_WIN
  58. static const QRegularExpression rxPaths(R"(`(\w:[\\/][^`]+)`)");
  59. #else
  60. static const QRegularExpression rxPaths("`(/[^`]+)`");
  61. #endif
  62. htmlMsg.replace(rxPaths, R"(<a href="file:///\1">\1</a>)");
  63. ui->labelLog->appendHtml(htmlMsg);
  64. ui->labelLog->verticalScrollBar()->setValue(ui->labelLog->verticalScrollBar()->maximum());
  65. }
  66. void LogTab::clear()
  67. {
  68. QFile logFile(Logger::getInstance().logFile());
  69. if (logFile.open(QFile::WriteOnly | QFile::Text)) {
  70. logFile.resize(0);
  71. logFile.close();
  72. }
  73. ui->labelLog->clear();
  74. }
  75. void LogTab::open()
  76. {
  77. QDesktopServices::openUrl("file:///" + Logger::getInstance().logFile());
  78. }
  79. void LogTab::openDir()
  80. {
  81. QDir dir(savePath());
  82. if (dir.exists()) {
  83. showInGraphicalShell(dir.absolutePath());
  84. }
  85. }
  86. void LogTab::changeEvent(QEvent *event)
  87. {
  88. // Automatically re-translate this tab on language change
  89. if (event->type() == QEvent::LanguageChange) {
  90. ui->retranslateUi(this);
  91. }
  92. QWidget::changeEvent(event);
  93. }