2020-04-16 19:14:08 +02:00
|
|
|
// Copyright (c) 2011-2020 The Bitcoin Core developers
|
2014-12-13 05:09:33 +01:00
|
|
|
// Distributed under the MIT software license, see the accompanying
|
2014-01-16 16:05:44 +01:00
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
2015-12-09 11:53:12 +01:00
|
|
|
#if defined(HAVE_CONFIG_H)
|
2017-11-10 01:57:53 +01:00
|
|
|
#include <config/bitcoin-config.h>
|
2015-12-09 11:53:12 +01:00
|
|
|
#endif
|
|
|
|
|
2017-11-10 01:57:53 +01:00
|
|
|
#include <qt/utilitydialog.h>
|
2014-01-16 16:05:44 +01:00
|
|
|
|
2017-08-15 17:31:26 +02:00
|
|
|
#include <qt/forms/ui_helpmessagedialog.h>
|
2014-01-16 16:05:44 +01:00
|
|
|
|
2019-04-07 21:33:35 +02:00
|
|
|
#include <qt/guiutil.h>
|
|
|
|
|
2017-11-10 01:57:53 +01:00
|
|
|
#include <clientversion.h>
|
|
|
|
#include <init.h>
|
2018-10-23 00:51:11 +02:00
|
|
|
#include <util/system.h>
|
2018-10-04 13:39:08 +02:00
|
|
|
#include <util/strencodings.h>
|
2014-01-16 16:05:44 +01:00
|
|
|
|
Split up util.cpp/h
Split up util.cpp/h into:
- string utilities (hex, base32, base64): no internal dependencies, no dependency on boost (apart from foreach)
- money utilities (parsesmoney, formatmoney)
- time utilities (gettime*, sleep, format date):
- and the rest (logging, argument parsing, config file parsing)
The latter is basically the environment and OS handling,
and is stripped of all utility functions, so we may want to
rename it to something else than util.cpp/h for clarity (Matt suggested
osinterface).
Breaks dependency of sha256.cpp on all the things pulled in by util.
2014-08-21 16:11:09 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2014-09-22 10:08:47 +02:00
|
|
|
#include <QCloseEvent>
|
2014-01-16 16:05:44 +01:00
|
|
|
#include <QLabel>
|
2020-01-31 01:50:23 +01:00
|
|
|
#include <QMainWindow>
|
2014-06-10 16:02:46 +02:00
|
|
|
#include <QRegExp>
|
2014-12-29 00:25:18 +01:00
|
|
|
#include <QTextCursor>
|
2020-01-31 01:50:23 +01:00
|
|
|
#include <QTextTable>
|
2014-01-16 16:05:44 +01:00
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
2014-06-11 21:44:47 +02:00
|
|
|
/** "Help message" or "About" dialog box */
|
2018-08-23 19:42:31 +02:00
|
|
|
HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
|
2014-01-16 16:05:44 +01:00
|
|
|
QDialog(parent),
|
2014-06-11 21:44:47 +02:00
|
|
|
ui(new Ui::HelpMessageDialog)
|
2014-01-16 16:05:44 +01:00
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
2019-06-26 16:24:48 +02:00
|
|
|
QString version = QString{PACKAGE_NAME} + " " + tr("version") + " " + QString::fromStdString(FormatFullVersion());
|
2014-06-10 16:02:46 +02:00
|
|
|
|
2014-06-11 21:44:47 +02:00
|
|
|
if (about)
|
|
|
|
{
|
2019-06-26 16:28:13 +02:00
|
|
|
setWindowTitle(tr("About %1").arg(PACKAGE_NAME));
|
2014-06-11 21:44:47 +02:00
|
|
|
|
2018-10-04 13:39:08 +02:00
|
|
|
std::string licenseInfo = LicenseInfo();
|
2014-06-10 16:02:46 +02:00
|
|
|
/// HTML-format the license message from the core
|
2018-10-04 13:39:08 +02:00
|
|
|
QString licenseInfoHTML = QString::fromStdString(LicenseInfo());
|
2014-06-10 16:02:46 +02:00
|
|
|
// Make URLs clickable
|
|
|
|
QRegExp uri("<(.*)>", Qt::CaseSensitive, QRegExp::RegExp2);
|
|
|
|
uri.setMinimal(true); // use non-greedy matching
|
2014-06-11 21:44:47 +02:00
|
|
|
licenseInfoHTML.replace(uri, "<a href=\"\\1\">\\1</a>");
|
2014-06-10 16:02:46 +02:00
|
|
|
// Replace newlines with HTML breaks
|
2016-02-03 06:38:27 +01:00
|
|
|
licenseInfoHTML.replace("\n", "<br>");
|
2014-06-11 21:44:47 +02:00
|
|
|
|
2014-12-29 00:25:18 +01:00
|
|
|
ui->aboutMessage->setTextFormat(Qt::RichText);
|
2014-06-11 21:44:47 +02:00
|
|
|
ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
2018-10-04 13:39:08 +02:00
|
|
|
text = version + "\n" + QString::fromStdString(FormatParagraph(licenseInfo));
|
2014-12-29 00:25:18 +01:00
|
|
|
ui->aboutMessage->setText(version + "<br><br>" + licenseInfoHTML);
|
|
|
|
ui->aboutMessage->setWordWrap(true);
|
|
|
|
ui->helpMessage->setVisible(false);
|
2014-06-11 21:44:47 +02:00
|
|
|
} else {
|
|
|
|
setWindowTitle(tr("Command-line options"));
|
2018-05-08 17:31:21 +02:00
|
|
|
QString header = "Usage: bitcoin-qt [command-line options] \n";
|
2014-12-29 00:25:18 +01:00
|
|
|
QTextCursor cursor(ui->helpMessage->document());
|
|
|
|
cursor.insertText(version);
|
|
|
|
cursor.insertBlock();
|
2015-03-09 08:29:59 +01:00
|
|
|
cursor.insertText(header);
|
2014-12-29 00:25:18 +01:00
|
|
|
cursor.insertBlock();
|
2015-03-09 08:29:59 +01:00
|
|
|
|
2018-04-28 22:54:58 +02:00
|
|
|
std::string strUsage = gArgs.GetHelpMessage();
|
2015-11-09 19:23:46 +01:00
|
|
|
QString coreOptions = QString::fromStdString(strUsage);
|
2018-05-08 17:31:21 +02:00
|
|
|
text = version + "\n\n" + header + "\n" + coreOptions;
|
2015-03-09 08:29:59 +01:00
|
|
|
|
2014-12-29 00:25:18 +01:00
|
|
|
QTextTableFormat tf;
|
|
|
|
tf.setBorderStyle(QTextFrameFormat::BorderStyle_None);
|
|
|
|
tf.setCellPadding(2);
|
|
|
|
QVector<QTextLength> widths;
|
2015-01-09 20:57:17 +01:00
|
|
|
widths << QTextLength(QTextLength::PercentageLength, 35);
|
|
|
|
widths << QTextLength(QTextLength::PercentageLength, 65);
|
2014-12-29 00:25:18 +01:00
|
|
|
tf.setColumnWidthConstraints(widths);
|
2014-06-11 21:44:47 +02:00
|
|
|
|
2014-12-29 00:25:18 +01:00
|
|
|
QTextCharFormat bold;
|
|
|
|
bold.setFontWeight(QFont::Bold);
|
2015-03-09 08:29:59 +01:00
|
|
|
|
2017-06-02 03:25:02 +02:00
|
|
|
for (const QString &line : coreOptions.split("\n")) {
|
2015-03-09 08:29:59 +01:00
|
|
|
if (line.startsWith(" -"))
|
|
|
|
{
|
|
|
|
cursor.currentTable()->appendRows(1);
|
|
|
|
cursor.movePosition(QTextCursor::PreviousCell);
|
2014-12-29 00:25:18 +01:00
|
|
|
cursor.movePosition(QTextCursor::NextRow);
|
2015-03-09 08:29:59 +01:00
|
|
|
cursor.insertText(line.trimmed());
|
|
|
|
cursor.movePosition(QTextCursor::NextCell);
|
|
|
|
} else if (line.startsWith(" ")) {
|
|
|
|
cursor.insertText(line.trimmed()+' ');
|
|
|
|
} else if (line.size() > 0) {
|
|
|
|
//Title of a group
|
|
|
|
if (cursor.currentTable())
|
|
|
|
cursor.currentTable()->appendRows(1);
|
|
|
|
cursor.movePosition(QTextCursor::Down);
|
|
|
|
cursor.insertText(line.trimmed(), bold);
|
|
|
|
cursor.insertTable(1, 2, tf);
|
2014-12-29 00:25:18 +01:00
|
|
|
}
|
2015-01-10 14:48:55 +01:00
|
|
|
}
|
2014-12-29 00:25:18 +01:00
|
|
|
|
|
|
|
ui->helpMessage->moveCursor(QTextCursor::Start);
|
|
|
|
ui->scrollArea->setVisible(false);
|
2015-02-04 15:15:52 +01:00
|
|
|
ui->aboutLogo->setVisible(false);
|
2014-01-16 16:05:44 +01:00
|
|
|
}
|
2019-04-07 21:33:35 +02:00
|
|
|
|
|
|
|
GUIUtil::handleCloseWindowShortcut(this);
|
2014-01-16 16:05:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
HelpMessageDialog::~HelpMessageDialog()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
|
|
|
void HelpMessageDialog::printToConsole()
|
|
|
|
{
|
|
|
|
// On other operating systems, the expected action is to print the message to the console.
|
2019-06-13 15:16:10 +02:00
|
|
|
tfm::format(std::cout, "%s\n", qPrintable(text));
|
2014-01-16 16:05:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void HelpMessageDialog::showOrPrint()
|
|
|
|
{
|
|
|
|
#if defined(WIN32)
|
2014-06-11 21:44:47 +02:00
|
|
|
// On Windows, show a message box, as there is no stderr/stdout in windowed applications
|
|
|
|
exec();
|
2014-01-16 16:05:44 +01:00
|
|
|
#else
|
2014-06-11 21:44:47 +02:00
|
|
|
// On other operating systems, print help text to console
|
|
|
|
printToConsole();
|
2014-01-16 16:05:44 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void HelpMessageDialog::on_okButton_accepted()
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** "Shutdown" window */
|
2014-09-22 10:08:47 +02:00
|
|
|
ShutdownWindow::ShutdownWindow(QWidget *parent, Qt::WindowFlags f):
|
|
|
|
QWidget(parent, f)
|
|
|
|
{
|
|
|
|
QVBoxLayout *layout = new QVBoxLayout();
|
|
|
|
layout->addWidget(new QLabel(
|
2019-06-26 16:28:13 +02:00
|
|
|
tr("%1 is shutting down...").arg(PACKAGE_NAME) + "<br /><br />" +
|
2014-09-22 10:08:47 +02:00
|
|
|
tr("Do not shut down the computer until this window disappears.")));
|
|
|
|
setLayout(layout);
|
2019-04-07 21:33:35 +02:00
|
|
|
|
|
|
|
GUIUtil::handleCloseWindowShortcut(this);
|
2014-09-22 10:08:47 +02:00
|
|
|
}
|
|
|
|
|
2020-01-31 01:50:23 +01:00
|
|
|
QWidget* ShutdownWindow::showShutdownWindow(QMainWindow* window)
|
2014-01-16 16:05:44 +01:00
|
|
|
{
|
2020-01-31 01:50:23 +01:00
|
|
|
assert(window != nullptr);
|
2014-01-16 16:05:44 +01:00
|
|
|
|
|
|
|
// Show a simple window indicating shutdown status
|
2014-09-22 10:08:47 +02:00
|
|
|
QWidget *shutdownWindow = new ShutdownWindow();
|
2014-06-27 15:09:41 +02:00
|
|
|
shutdownWindow->setWindowTitle(window->windowTitle());
|
2014-01-16 16:05:44 +01:00
|
|
|
|
|
|
|
// Center shutdown window at where main window was
|
|
|
|
const QPoint global = window->mapToGlobal(window->rect().center());
|
|
|
|
shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2);
|
|
|
|
shutdownWindow->show();
|
2016-11-19 14:28:55 +01:00
|
|
|
return shutdownWindow;
|
2014-01-16 16:05:44 +01:00
|
|
|
}
|
2014-09-22 10:08:47 +02:00
|
|
|
|
|
|
|
void ShutdownWindow::closeEvent(QCloseEvent *event)
|
|
|
|
{
|
|
|
|
event->ignore();
|
|
|
|
}
|