log-viewer.cpp 3.0 KB

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