2014-12-17 02:47:57 +01:00
|
|
|
// Copyright (c) 2011-2014 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)
|
|
|
|
#include "config/bitcoin-config.h"
|
|
|
|
#endif
|
|
|
|
|
2014-01-16 16:05:44 +01:00
|
|
|
#include "utilitydialog.h"
|
|
|
|
|
|
|
|
#include "ui_helpmessagedialog.h"
|
|
|
|
|
|
|
|
#include "bitcoingui.h"
|
|
|
|
#include "clientmodel.h"
|
|
|
|
#include "guiutil.h"
|
|
|
|
|
2014-10-29 02:33:23 +01:00
|
|
|
#include "clientversion.h"
|
2014-01-16 16:05:44 +01:00
|
|
|
#include "init.h"
|
2015-01-10 14:48:55 +01:00
|
|
|
#include "util.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>
|
2014-06-10 16:02:46 +02:00
|
|
|
#include <QRegExp>
|
2014-12-29 00:25:18 +01:00
|
|
|
#include <QTextTable>
|
|
|
|
#include <QTextCursor>
|
2014-01-16 16:05:44 +01:00
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
2014-06-11 21:44:47 +02:00
|
|
|
/** "Help message" or "About" dialog box */
|
|
|
|
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);
|
|
|
|
|
2015-12-09 11:53:12 +01:00
|
|
|
QString version = tr(PACKAGE_NAME) + " " + tr("version") + " " + QString::fromStdString(FormatFullVersion());
|
2014-06-11 21:44:47 +02:00
|
|
|
/* On x86 add a bit specifier to the version so that users can distinguish between
|
|
|
|
* 32 and 64 bit builds. On other architectures, 32/64 bit may be more ambigious.
|
|
|
|
*/
|
2014-01-20 13:38:50 +01:00
|
|
|
#if defined(__x86_64__)
|
2014-06-11 21:44:47 +02:00
|
|
|
version += " " + tr("(%1-bit)").arg(64);
|
2014-01-20 13:38:50 +01:00
|
|
|
#elif defined(__i386__ )
|
2014-06-11 21:44:47 +02:00
|
|
|
version += " " + tr("(%1-bit)").arg(32);
|
2014-01-20 13:38:50 +01:00
|
|
|
#endif
|
2014-06-10 16:02:46 +02:00
|
|
|
|
2014-06-11 21:44:47 +02:00
|
|
|
if (about)
|
|
|
|
{
|
2015-12-09 11:53:12 +01:00
|
|
|
setWindowTitle(tr("About %1").arg(tr(PACKAGE_NAME)));
|
2014-06-11 21:44:47 +02:00
|
|
|
|
2014-06-10 16:02:46 +02:00
|
|
|
/// HTML-format the license message from the core
|
|
|
|
QString licenseInfo = QString::fromStdString(LicenseInfo());
|
2014-06-11 21:44:47 +02:00
|
|
|
QString licenseInfoHTML = 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
|
2014-06-11 21:44:47 +02:00
|
|
|
licenseInfoHTML.replace("\n\n", "<br><br>");
|
|
|
|
|
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);
|
|
|
|
text = version + "\n" + 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"));
|
2015-03-09 08:29:59 +01:00
|
|
|
QString header = tr("Usage:") + "\n" +
|
|
|
|
" bitcoin-qt [" + tr("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
|
|
|
|
|
|
|
QString coreOptions = QString::fromStdString(HelpMessage(HMM_BITCOIN_QT));
|
|
|
|
text = version + "\n" + header + "\n" + coreOptions;
|
|
|
|
|
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
|
|
|
|
2015-07-14 13:59:05 +02:00
|
|
|
Q_FOREACH (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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
HelpMessageDialog::~HelpMessageDialog()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
|
|
|
void HelpMessageDialog::printToConsole()
|
|
|
|
{
|
|
|
|
// On other operating systems, the expected action is to print the message to the console.
|
2014-06-11 21:44:47 +02:00
|
|
|
fprintf(stdout, "%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(
|
2015-12-09 11:53:12 +01:00
|
|
|
tr("%1 is shutting down...").arg(tr(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);
|
|
|
|
}
|
|
|
|
|
2014-01-16 16:05:44 +01:00
|
|
|
void ShutdownWindow::showShutdownWindow(BitcoinGUI *window)
|
|
|
|
{
|
|
|
|
if (!window)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Show a simple window indicating shutdown status
|
2014-09-22 10:08:47 +02:00
|
|
|
QWidget *shutdownWindow = new ShutdownWindow();
|
|
|
|
// We don't hold a direct pointer to the shutdown window after creation, so use
|
|
|
|
// Qt::WA_DeleteOnClose to make sure that the window will be deleted eventually.
|
|
|
|
shutdownWindow->setAttribute(Qt::WA_DeleteOnClose);
|
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();
|
|
|
|
}
|
2014-09-22 10:08:47 +02:00
|
|
|
|
|
|
|
void ShutdownWindow::closeEvent(QCloseEvent *event)
|
|
|
|
{
|
|
|
|
event->ignore();
|
|
|
|
}
|