Vuo  2.0.2
VuoEditorAboutBox.cc
Go to the documentation of this file.
1 
10 #include "VuoStringUtilities.hh"
11 #include "VuoEditorAboutBox.hh"
12 #include "ui_VuoEditorAboutBox.h"
13 
14 const QString VuoEditorAboutBox::htmlHead = "<head><style>a { color: #0099a9; }</style></head>";
15 
21  ui(new Ui::VuoEditorAboutBox)
22 {
23  ui->setupUi(this);
24 
25  // Introductory text
26  QString buildDate = __DATE__;
27  QString versionNumber = VUO_VERSION_STRING;
28  QString revisionNumber = VUO_REVISION;
29 
30  QString missionMarkdown = tr(
31  "**Create memorable interactive experiences — without coding.**\n"
32  "\n"
33  "Drag, drop, and connect Vuo's simple building blocks to support your creative work: \n"
34  "VJ gigs, exhibits, installations, stage productions, dome graphics, visual signage, \n"
35  "video effects, maker projects, trade show booths, and more. \n"
36  "\n"
37  "Learn more at %1.")
38  .arg("[vuo.org](https://vuo.org)");
39 
40  QString missionHTML = QString::fromStdString(VuoStringUtilities::generateHtmlFromMarkdown(missionMarkdown.toStdString()));
41 
42  QString descriptiveText = \
43  QString("<html>%4<body>"
44  "<p><span style=\"font-size:28pt;\">Vuo</span>"
45  "<span style=\"font-size:20pt;\"> %1</span><br>"
46  "<span style=\"font-size:12pt; color:rgba(0,0,0,.5)\">" + tr("Built on %2 (%3)") + "<br>"
47  "Copyright © 2012–2020 Kosada Incorporated</span></p>%5"
48  "</body></html>").
49  arg(
50  versionNumber,
51  buildDate,
52  revisionNumber,
53  htmlHead,
54  missionHTML);
55 
56  // Text style
57  contributorFont = ui->textEdit->font();
58 
59  licenseFont.setFamily("Monaco");
60  licenseFont.setStyleHint(QFont::Monospace);
61  licenseFont.setFixedPitch(true);
62  licenseFont.setPointSize(11);
63 
64  const int tabStop = 8; // 8 characters/tab
65  QFontMetrics licenseFontMetrics(licenseFont);
66  ui->textEdit->setTabStopWidth(tabStop * licenseFontMetrics.width(' '));
67 
68  // Set the introductory text.
69  ui->textLabel->setText(descriptiveText);
70 
71  // Populate the "Details" pane.
72  contributors = new QTreeWidgetItem(ui->treeWidget);
73  contributors->setText(0, tr("Contributors"));
74  dependencyLicenses = new QTreeWidgetItem(ui->treeWidget);
75  dependencyLicenses->setText(0, tr("Dependency Licenses"));
76 
77  // Populate the text file content pane.
78  populateContributorsList();
79  populateLicenseTexts();
80 
81  ui->textEdit->setReadOnly(true);
82 
83  // Update the text content in response to selection changes within the "Details" pane.
84  connect(ui->treeWidget, &QTreeWidget::currentItemChanged, this, &VuoEditorAboutBox::updateDisplayedTextContent);
85 
86  // Select the contributors list by default.
87  ui->treeWidget->setCurrentItem(contributors);
88 
89  setFixedSize(size());
90  setAttribute(Qt::WA_DeleteOnClose, false);
91 }
92 
97 void VuoEditorAboutBox::populateContributorsList()
98 {
99  QFile contributorsList(QApplication::applicationDirPath().append("/../Resources/CONTRIBUTORS.md"));
100 
101  if (!contributorsList.open(QIODevice::ReadOnly))
102  contributorText = "Please see our list of contributors at <a href=\"https://vuo.org/contributors\">https://vuo.org/contributors</a>. ";
103 
104  else
105  {
106  // Display the contents of the contributors list.
107  QTextStream textStream(&contributorsList);
108  contributorText = VuoStringUtilities::generateHtmlFromMarkdown(textStream.readAll().toUtf8().constData()).c_str();
109  }
110 }
111 
115 void VuoEditorAboutBox::populateLicenseTexts()
116 {
117  QDir licenseTextDir(QApplication::applicationDirPath().append("/../Frameworks/Vuo.framework/Documentation/Licenses"));
118  if (!licenseTextDir.exists())
119  return;
120 
121  QStringList licenseFileList(licenseTextDir.entryList(QDir::Files|QDir::Readable));
122  foreach (QString licenseFileName, licenseFileList)
123  {
124  QFile licenseFile(licenseTextDir.filePath(licenseFileName));
125  if (licenseFile.open(QIODevice::ReadOnly))
126  {
127  QFileInfo licenseFileInfo(licenseFile);
128  QString dependencyIdentifier = licenseFileInfo.completeBaseName();
129  QTreeWidgetItem *dependencyLicenseItem = new QTreeWidgetItem();
130  dependencyLicenseItem->setText(0, dependencyIdentifier);
131  dependencyLicenses->addChild(dependencyLicenseItem);
132 
133  QTextStream textStream(&licenseFile);
134  licenseTextForDependency[dependencyIdentifier] = textStream.readAll();
135  }
136  }
137 }
138 
143 void VuoEditorAboutBox::updateDisplayedTextContent()
144 {
145  QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
146  if (currentItem == contributors)
147  {
148  ui->textEdit->setFont(contributorFont);
149  ui->textEdit->setText(htmlHead + contributorText);
150  }
151  else if (currentItem == dependencyLicenses)
152  ui->textEdit->setText("");
153  else
154  {
155  ui->textEdit->setFont(licenseFont);
156 
157  // Use ui->textEdit->document()->setHtml(...) and ui->textEdit->document()->setPlainText(...)
158  // rather than ui->textEdit->setText(...) to avoid bug where viewing a license text after
159  // clicking on any link within the contributor text caused the full license text to
160  // be displayed as a link.
161  QString licenseText = licenseTextForDependency[currentItem->text(0)];
162  if (Qt::mightBeRichText(licenseText))
163  ui->textEdit->document()->setHtml(htmlHead + licenseText);
164  else
165  ui->textEdit->document()->setPlainText(licenseText);
166  }
167 }
168 
169 VuoEditorAboutBox::~VuoEditorAboutBox()
170 {
171  delete ui;
172 }