#include "UpdateDialog.h" #include "ui_UpdateDialog.h" #include "gui/Platform.h" #include #include "logger/QsLog.h" UpdateDialog::UpdateDialog(QWidget *parent) : QDialog(parent), ui(new Ui::UpdateDialog) { MultiMCPlatform::fixWM_CLASS(this); ui->setupUi(this); loadChangelog(); } UpdateDialog::~UpdateDialog() { } void UpdateDialog::loadChangelog() { dljob.reset(new NetJob("Changelog")); auto url = QString("https://raw.githubusercontent.com/MultiMC/MultiMC5/%1/changelog.md").arg(BuildConfig.VERSION_CHANNEL); changelogDownload = ByteArrayDownload::make(QUrl(url)); dljob->addNetAction(changelogDownload); connect(dljob.get(), &NetJob::succeeded, this, &UpdateDialog::changelogLoaded); connect(dljob.get(), &NetJob::failed, this, &UpdateDialog::changelogFailed); dljob->start(); } // TODO: this will be replaced. QString reprocessMarkdown(QString markdown) { QString htmlData; QTextStream html(&htmlData); auto lines = markdown.split(QRegExp("[\r]?[\n]"),QString::KeepEmptyParts); enum { BASE, LIST1, LIST2 }state = BASE; html << ""; int i = 0; auto procLine = [&](QString line) -> QString { // [GitHub issues](https://github.com/MultiMC/MultiMC5/issues) line.replace(QRegExp("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"), "\\1"); return line; }; for(auto line: lines) { if(line.isEmpty()) { // html << "
\n"; } else switch (state) { case BASE: if(line.startsWith("##")) { html << "

" << procLine(line.mid(2)) << "

\n"; } else if(line.startsWith("#")) { html << "

" << procLine(line.mid(1)) << "

\n"; } else if(line.startsWith("- ")) { state = LIST1; html << "\n"; html << "

" << procLine(line.mid(2)) << "

\n"; } else if(line.startsWith("#")) { state = BASE; html << "\n"; html << "

" << procLine(line.mid(1)) << "

\n"; } else if(line.startsWith("- ")) { html << "
  • " << procLine(line.mid(2)) << "
  • \n"; } else if(line.startsWith(" - ")) { state = LIST2; html << "\n"; html << "\n"; html << "

    " << procLine(line.mid(2)) << "

    \n"; } else if(line.startsWith("#")) { state = BASE; html << "\n"; html << "\n"; html << "

    " << procLine(line.mid(1)) << "

    \n"; } else if(line.startsWith("- ")) { state = LIST1; html << "\n"; html << "
  • " << procLine(line.mid(2)) << "
  • \n"; } else if(line.startsWith(" - ")) { html << "
  • " << procLine(line.mid(4)) << "
  • \n"; } else QLOG_ERROR() << "Invalid input on line " << i << ": " << line; break; } i++; } if(state == LIST2) { html << "\n"; state = LIST1; } if(state == LIST1) { html << "\n"; state = BASE; } if (state != BASE) { QLOG_ERROR() << "Reprocessing markdown didn't end in a final state!"; } html << "\n"; QLOG_DEBUG() << htmlData; return htmlData; } void UpdateDialog::changelogLoaded() { auto rawMarkdown = QString::fromUtf8(changelogDownload->m_data); auto html = reprocessMarkdown(rawMarkdown); ui->changelogBrowser->setHtml(html); } void UpdateDialog::changelogFailed() { ui->changelogBrowser->setHtml(tr("

    Failed to fetch changelog...

    ")); } void UpdateDialog::on_btnUpdateLater_clicked() { reject(); } void UpdateDialog::on_btnUpdateNow_clicked() { done(UPDATE_NOW); } void UpdateDialog::on_btnUpdateOnExit_clicked() { done(UPDATE_ONEXIT); }