OBSAbout.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "OBSAbout.hpp"
  2. #include <widgets/OBSBasic.hpp>
  3. #include <utility/RemoteTextThread.hpp>
  4. #include <qt-wrappers.hpp>
  5. #include <json11.hpp>
  6. #include "moc_OBSAbout.cpp"
  7. using namespace json11;
  8. extern bool steam;
  9. OBSAbout::OBSAbout(QWidget *parent) : QDialog(parent), ui(new Ui::OBSAbout)
  10. {
  11. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  12. ui->setupUi(this);
  13. QString bitness;
  14. QString ver;
  15. if (sizeof(void *) == 4)
  16. bitness = " (32 bit)";
  17. else if (sizeof(void *) == 8)
  18. bitness = " (64 bit)";
  19. #ifdef HAVE_OBSCONFIG_H
  20. ver += obs_get_version_string();
  21. #else
  22. ver += LIBOBS_API_MAJOR_VER + "." + LIBOBS_API_MINOR_VER + "." + LIBOBS_API_PATCH_VER;
  23. #endif
  24. ui->version->setText(ver + bitness);
  25. ui->contribute->setText(QTStr("About.Contribute"));
  26. if (steam) {
  27. delete ui->donate;
  28. } else {
  29. ui->donate->setText("&nbsp;&nbsp;<a href='https://obsproject.com/contribute'>" + QTStr("About.Donate") +
  30. "</a>");
  31. ui->donate->setTextInteractionFlags(Qt::TextBrowserInteraction);
  32. ui->donate->setOpenExternalLinks(true);
  33. }
  34. ui->getInvolved->setText(
  35. "&nbsp;&nbsp;<a href='https://github.com/obsproject/obs-studio/blob/master/CONTRIBUTING.rst'>" +
  36. QTStr("About.GetInvolved") + "</a>");
  37. ui->getInvolved->setTextInteractionFlags(Qt::TextBrowserInteraction);
  38. ui->getInvolved->setOpenExternalLinks(true);
  39. ui->about->setText("<a href='#'>" + QTStr("About") + "</a>");
  40. ui->authors->setText("<a href='#'>" + QTStr("About.Authors") + "</a>");
  41. ui->license->setText("<a href='#'>" + QTStr("About.License") + "</a>");
  42. ui->name->setProperty("class", "text-heading");
  43. ui->version->setProperty("class", "text-large");
  44. ui->about->setProperty("class", "bg-base");
  45. ui->authors->setProperty("class", "bg-base");
  46. ui->license->setProperty("class", "bg-base");
  47. ui->info->setProperty("class", "");
  48. connect(ui->about, &ClickableLabel::clicked, this, &OBSAbout::ShowAbout);
  49. connect(ui->authors, &ClickableLabel::clicked, this, &OBSAbout::ShowAuthors);
  50. connect(ui->license, &ClickableLabel::clicked, this, &OBSAbout::ShowLicense);
  51. QPointer<OBSAbout> about(this);
  52. OBSBasic *main = OBSBasic::Get();
  53. if (main->patronJson.empty() && !main->patronJsonThread) {
  54. RemoteTextThread *thread =
  55. new RemoteTextThread("https://obsproject.com/patreon/about-box.json", "application/json");
  56. QObject::connect(thread, &RemoteTextThread::Result, main, &OBSBasic::UpdatePatronJson);
  57. QObject::connect(thread, &RemoteTextThread::Result, this, &OBSAbout::ShowAbout);
  58. main->patronJsonThread.reset(thread);
  59. thread->start();
  60. } else {
  61. ShowAbout();
  62. }
  63. }
  64. void OBSAbout::ShowAbout()
  65. {
  66. OBSBasic *main = OBSBasic::Get();
  67. if (main->patronJson.empty())
  68. return;
  69. std::string error;
  70. Json json = Json::parse(main->patronJson, error);
  71. const Json::array &patrons = json.array_items();
  72. QString text;
  73. text += "<h1>Top Patreon contributors:</h1>";
  74. text += "<p style=\"font-size:16px;\">";
  75. bool first = true;
  76. bool top = true;
  77. for (const Json &patron : patrons) {
  78. std::string name = patron["name"].string_value();
  79. std::string link = patron["link"].string_value();
  80. int amount = patron["amount"].int_value();
  81. if (top && amount < 5000) {
  82. text += "</p>";
  83. top = false;
  84. } else if (!first) {
  85. text += "<br/>";
  86. }
  87. if (!link.empty()) {
  88. text += "<a href=\"";
  89. text += QT_UTF8(link.c_str()).toHtmlEscaped();
  90. text += "\">";
  91. }
  92. text += QT_UTF8(name.c_str()).toHtmlEscaped();
  93. if (!link.empty())
  94. text += "</a>";
  95. if (first)
  96. first = false;
  97. }
  98. ui->textBrowser->setHtml(text);
  99. }
  100. void OBSAbout::ShowAuthors()
  101. {
  102. std::string path;
  103. QString error = QTStr("About.Error").arg("https://github.com/obsproject/obs-studio/blob/master/AUTHORS");
  104. #ifdef __APPLE__
  105. if (!GetDataFilePath("AUTHORS", path)) {
  106. #else
  107. if (!GetDataFilePath("authors/AUTHORS", path)) {
  108. #endif
  109. ui->textBrowser->setPlainText(error);
  110. return;
  111. }
  112. ui->textBrowser->setPlainText(QString::fromStdString(path));
  113. BPtr<char> text = os_quick_read_utf8_file(path.c_str());
  114. if (!text || !*text) {
  115. ui->textBrowser->setPlainText(error);
  116. return;
  117. }
  118. ui->textBrowser->setPlainText(QT_UTF8(text));
  119. }
  120. void OBSAbout::ShowLicense()
  121. {
  122. std::string path;
  123. QString error = QTStr("About.Error").arg("https://github.com/obsproject/obs-studio/blob/master/COPYING");
  124. if (!GetDataFilePath("license/gplv2.txt", path)) {
  125. ui->textBrowser->setPlainText(error);
  126. return;
  127. }
  128. BPtr<char> text = os_quick_read_utf8_file(path.c_str());
  129. if (!text || !*text) {
  130. ui->textBrowser->setPlainText(error);
  131. return;
  132. }
  133. ui->textBrowser->setPlainText(QT_UTF8(text));
  134. }