comparison src/gui/dialog/about.cc @ 104:27455104ea37

about: switch to using HTML it's still generated at runtime, but only once now
author Paper <mrpapersonic@gmail.com>
date Sun, 05 Nov 2023 02:35:27 -0500
parents 9b2b41f83a5e
children 6d8da6e64d61
comparison
equal deleted inserted replaced
103:621084cc542c 104:27455104ea37
1 #include "gui/dialog/about.h" 1 #include "gui/dialog/about.h"
2 #include "core/json.h" 2 #include "core/json.h"
3 #include "core/version.h" 3 #include "core/version.h"
4 #include "core/strings.h"
4 #include "gui/widgets/text.h" 5 #include "gui/widgets/text.h"
5 #include "pugixml.hpp" 6 #include "pugixml.hpp"
6 #include <QFont> 7 #include <QFont>
7 #include <QHBoxLayout> 8 #include <QHBoxLayout>
8 #include <QTextBrowser> 9 #include <QTextBrowser>
9 #include <QTextCharFormat> 10 #include <QTextCharFormat>
10 #include <QTextCursor> 11 #include <QTextCursor>
11 #include <curl/curl.h> 12 #include <curl/curl.h>
12 13
13 #define CONCAT_VERSION_NX(major, minor, patch) ("v" #major "." #minor "." #patch) 14 template <typename T, size_t N>
15 constexpr size_t array_size(T (&)[N]) {
16 return N;
17 }
14 18
19 #define CONCAT_VERSION_NX(major, minor, patch) "v" #major "." #minor "." #patch
15 #define CONCAT_VERSION(major, minor, patch) CONCAT_VERSION_NX(major, minor, patch) 20 #define CONCAT_VERSION(major, minor, patch) CONCAT_VERSION_NX(major, minor, patch)
16 21
17 #define SET_TITLE_FONT(font, format, cursor) \ 22 /* Ahhh, my dumb little hack to get this to be constexpr :) */
18 { \ 23 static constexpr const char pugixml_version[] = {
19 QFont fnt; \ 24 PUGIXML_VERSION / 1000 % 10 + '0', /* Major */
20 fnt.setPixelSize(16); \ 25 '.',
21 format.setFont(fnt); \ 26 PUGIXML_VERSION / 100 % 10 + '0', /* Minor */
22 cursor.setCharFormat(format); \ 27 PUGIXML_VERSION / 10 % 10 + '0',
23 } 28 '.',
29 PUGIXML_VERSION % 10 + '0', /* Patch */
30 '\0'
31 };
24 32
25 #define SET_PARAGRAPH_FONT(font, format, cursor) \ 33 const char* get_curl_version() {
26 { \ 34 const curl_version_info_data* data = curl_version_info(CURLVERSION_NOW);
27 QFont fnt; \ 35 return data->version;
28 fnt.setPixelSize(12); \ 36 }
29 format.setFont(fnt); \
30 cursor.setCharFormat(format); \
31 }
32 37
33 #define SET_FONT_BOLD(font, format, cursor) \ 38 /* I hate HTML so much... */
34 { \ 39 static const QString html = QString(
35 font = cursor.charFormat().font(); \ 40 "<body>"
36 font.setBold(true); \ 41 " <h2 style=\"font-weight: normal;\"><strong>Minori</strong> " MINORI_VERSION "</h2>"
37 format.setFont(font); \ 42 " <p>"
38 cursor.setCharFormat(format); \ 43 " <strong>Author:</strong><br>"
39 } 44 " Paper (@mrpapersonic)"
40 45 " </p>"
41 #define UNSET_FONT_BOLD(font, format, cursor) \ 46 " <p>"
42 { \ 47 " <strong>Third party components:</strong><br>"
43 font = cursor.charFormat().font(); \ 48 "<a href=\"https://curl.se/\">libcurl v") + get_curl_version() + "</a>"
44 font.setBold(false); \ 49 ", "
45 format.setFont(font); \ 50 "<a href=\"https://p.yusukekamiyamane.com/\">Fugue Icons v3.5.6</a>"
46 cursor.setCharFormat(format); \ 51 ", "
47 } 52 "<a href=\"https://github.com/erengy/anitomy\">Anitomy</a>"
48 53 ", "
49 #define SET_FORMAT_HYPERLINK(format, cursor, link) \ 54 "<a href=\"https://github.com/nlohmann/json\">JSON for Modern C++ " CONCAT_VERSION(NLOHMANN_JSON_VERSION_MAJOR,
50 { \ 55 NLOHMANN_JSON_VERSION_MINOR,
51 font = cursor.charFormat().font(); \ 56 NLOHMANN_JSON_VERSION_PATCH) "</a>"
52 font.setUnderline(true); \ 57 ", "
53 format.setFont(font); \ 58 "<a href=\"https://pugixml.org/\">pugixml v" + pugixml_version + "</a>"
54 format.setAnchor(true); \ 59 ", "
55 format.setAnchorHref(link); \ 60 "<a href=\"https://github.com/pulzed/mINI\">mINI v0.9.14</a>"
56 cursor.setCharFormat(format); \ 61 " </p>"
57 } 62 "<span>"
58 #define UNSET_FORMAT_HYPERLINK(format, cursor) \ 63 "<strong>Special thanks:</strong>"
59 { \ 64 "</span>"
60 font = cursor.charFormat().font(); \ 65 " <ul style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 15px; margin-right: 0px; -qt-list-indent:0;\">"
61 font.setUnderline(false); \ 66 " <li><strong>Eren Okka</strong> for creating Taiga</li>"
62 format.setFont(font); \ 67 " <li><strong>Alex Huszagh</strong> and <strong>Colin Duquesnoy</strong> for "
63 format.setAnchor(false); \ 68 "creating BreezeStyleSheets, on which the dark theme in this program is "
64 format.setAnchorHref(""); \ 69 "based off of</li>"
65 cursor.setCharFormat(format); \ 70 " </ul>"
66 } 71 "</body>";
67 72
68 AboutWindow::AboutWindow(QWidget* parent) : QDialog(parent) { 73 AboutWindow::AboutWindow(QWidget* parent) : QDialog(parent) {
74 setMinimumSize(641, 325);
69 setWindowTitle(tr("About Minori")); 75 setWindowTitle(tr("About Minori"));
70 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); 76 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
71 QHBoxLayout* layout = new QHBoxLayout(this); 77 QHBoxLayout* layout = new QHBoxLayout(this);
72 78
73 QPalette pal = QPalette(); 79 QPalette pal = QPalette();
74 pal.setColor(QPalette::Window, pal.color(QPalette::Base)); 80 pal.setColor(QPalette::Window, pal.color(QPalette::Base));
75 setPalette(pal); 81 setPalette(pal);
76 setAutoFillBackground(true); 82 setAutoFillBackground(true);
77 83
78 QFont font;
79 QTextCharFormat format;
80 QTextBrowser* paragraph = new QTextBrowser(this); 84 QTextBrowser* paragraph = new QTextBrowser(this);
81 paragraph->setOpenExternalLinks(true); 85 paragraph->setOpenExternalLinks(true);
82 paragraph->setFrameShape(QFrame::NoFrame); 86 paragraph->setFrameShape(QFrame::NoFrame);
83 paragraph->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 87 paragraph->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
84 paragraph->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 88 paragraph->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
85 QTextCursor cursor = paragraph->textCursor(); 89 paragraph->setHtml(html);
86 SET_TITLE_FONT(font, format, cursor); 90
87 SET_FONT_BOLD(font, format, cursor);
88 cursor.insertText("Minori");
89 UNSET_FONT_BOLD(font, format, cursor);
90 cursor.insertText(" " MINORI_VERSION);
91 SET_PARAGRAPH_FONT(font, format, cursor);
92 cursor.insertBlock();
93 cursor.insertBlock();
94 SET_FONT_BOLD(font, format, cursor);
95 cursor.insertText(tr("Author:"));
96 UNSET_FONT_BOLD(font, format, cursor);
97 cursor.insertBlock();
98 cursor.insertText(tr("Paper"));
99 cursor.insertBlock();
100 cursor.insertBlock();
101 SET_FONT_BOLD(font, format, cursor);
102 cursor.insertText(tr("Third party components:"));
103 UNSET_FONT_BOLD(font, format, cursor);
104 cursor.insertBlock();
105 SET_FORMAT_HYPERLINK(format, cursor, "https://github.com/nlohmann/json");
106 cursor.insertText(tr("JSON for Modern C++ ") + CONCAT_VERSION(NLOHMANN_JSON_VERSION_MAJOR,
107 NLOHMANN_JSON_VERSION_MINOR,
108 NLOHMANN_JSON_VERSION_PATCH));
109 UNSET_FORMAT_HYPERLINK(format, cursor);
110 cursor.insertText(", ");
111 {
112 curl_version_info_data* data = curl_version_info(CURLVERSION_NOW);
113 SET_FORMAT_HYPERLINK(format, cursor, "https://curl.se/");
114 cursor.insertText(tr("libcurl v") + data->version);
115 UNSET_FORMAT_HYPERLINK(format, cursor);
116 cursor.insertText(", ");
117 }
118 SET_FORMAT_HYPERLINK(format, cursor, "https://p.yusukekamiyamane.com/");
119 cursor.insertText(tr("Fugue Icons ") + CONCAT_VERSION(3, 5, 6));
120 UNSET_FORMAT_HYPERLINK(format, cursor);
121 cursor.insertText(", ");
122 SET_FORMAT_HYPERLINK(format, cursor, "https://pugixml.org/");
123 cursor.insertText(tr("pugixml v") + QString::number(PUGIXML_VERSION / 1000) + "." +
124 QString::number(PUGIXML_VERSION / 10 % 100) + "." + QString::number(PUGIXML_VERSION % 10));
125 UNSET_FORMAT_HYPERLINK(format, cursor);
126 cursor.insertText(", ");
127 SET_FORMAT_HYPERLINK(format, cursor, "https://github.com/erengy/anitomy");
128 cursor.insertText(tr("Anitomy"));
129 UNSET_FORMAT_HYPERLINK(format, cursor);
130 cursor.insertBlock();
131 cursor.insertBlock();
132 SET_FONT_BOLD(font, format, cursor);
133 cursor.insertText(tr("Links:"));
134 UNSET_FONT_BOLD(font, format, cursor);
135 cursor.insertBlock();
136 layout->addWidget(paragraph); 91 layout->addWidget(paragraph);
137 } 92 }