window-basic-about.cpp 4.5 KB

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