OBSLogViewer.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "OBSLogViewer.hpp"
  2. #include <OBSApp.hpp>
  3. #include <qt-wrappers.hpp>
  4. #include <QDesktopServices>
  5. #include <QFile>
  6. #include <QScrollBar>
  7. #include "moc_OBSLogViewer.cpp"
  8. OBSLogViewer::OBSLogViewer(QWidget *parent) : QDialog(parent), ui(new Ui::OBSLogViewer)
  9. {
  10. setWindowFlags(windowFlags() & Qt::WindowMaximizeButtonHint & ~Qt::WindowContextHelpButtonHint);
  11. setAttribute(Qt::WA_DeleteOnClose);
  12. ui->setupUi(this);
  13. bool showLogViewerOnStartup = config_get_bool(App()->GetUserConfig(), "LogViewer", "ShowLogStartup");
  14. ui->showStartup->setChecked(showLogViewerOnStartup);
  15. const char *geom = config_get_string(App()->GetUserConfig(), "LogViewer", "geometry");
  16. if (geom != nullptr) {
  17. QByteArray ba = QByteArray::fromBase64(QByteArray(geom));
  18. restoreGeometry(ba);
  19. }
  20. InitLog();
  21. connect(App(), &OBSApp::logLineAdded, this, &OBSLogViewer::AddLine);
  22. }
  23. OBSLogViewer::~OBSLogViewer()
  24. {
  25. config_set_string(App()->GetUserConfig(), "LogViewer", "geometry", saveGeometry().toBase64().constData());
  26. }
  27. void OBSLogViewer::on_showStartup_clicked(bool checked)
  28. {
  29. config_set_bool(App()->GetUserConfig(), "LogViewer", "ShowLogStartup", checked);
  30. }
  31. void OBSLogViewer::InitLog()
  32. {
  33. char logDir[512];
  34. std::string path;
  35. if (GetAppConfigPath(logDir, sizeof(logDir), "obs-studio/logs")) {
  36. path += logDir;
  37. path += "/";
  38. path += App()->GetCurrentLog();
  39. }
  40. QFile file(QT_UTF8(path.c_str()));
  41. if (file.open(QIODevice::ReadOnly)) {
  42. QTextStream in(&file);
  43. QTextDocument *doc = ui->textArea->document();
  44. QTextCursor cursor(doc);
  45. cursor.movePosition(QTextCursor::End);
  46. cursor.beginEditBlock();
  47. while (!in.atEnd()) {
  48. QString line = in.readLine();
  49. cursor.insertText(line);
  50. cursor.insertBlock();
  51. }
  52. cursor.endEditBlock();
  53. file.close();
  54. }
  55. QScrollBar *scroll = ui->textArea->verticalScrollBar();
  56. scroll->setValue(scroll->maximum());
  57. }
  58. void OBSLogViewer::AddLine(int type, const QString &str)
  59. {
  60. QString msg = str.toHtmlEscaped();
  61. switch (type) {
  62. case LOG_WARNING:
  63. msg = QString("<font color=\"#c08000\">%1</font>").arg(msg);
  64. break;
  65. case LOG_ERROR:
  66. msg = QString("<font color=\"#c00000\">%1</font>").arg(msg);
  67. break;
  68. default:
  69. msg = QString("<font>%1</font>").arg(msg);
  70. break;
  71. }
  72. QScrollBar *scroll = ui->textArea->verticalScrollBar();
  73. bool bottomScrolled = scroll->value() >= scroll->maximum() - 10;
  74. if (bottomScrolled)
  75. scroll->setValue(scroll->maximum());
  76. QTextDocument *doc = ui->textArea->document();
  77. QTextCursor cursor(doc);
  78. cursor.movePosition(QTextCursor::End);
  79. cursor.beginEditBlock();
  80. cursor.insertHtml(msg);
  81. cursor.insertBlock();
  82. cursor.endEditBlock();
  83. if (bottomScrolled)
  84. scroll->setValue(scroll->maximum());
  85. }
  86. void OBSLogViewer::on_openButton_clicked()
  87. {
  88. char logDir[512];
  89. if (GetAppConfigPath(logDir, sizeof(logDir), "obs-studio/logs") <= 0)
  90. return;
  91. const char *log = App()->GetCurrentLog();
  92. std::string path = logDir;
  93. path += "/";
  94. path += log;
  95. QUrl url = QUrl::fromLocalFile(QT_UTF8(path.c_str()));
  96. QDesktopServices::openUrl(url);
  97. }