Skip to content

Commit f358239

Browse files
committed
rpcconsole:NetworkName custom widget
1 parent 7f53a99 commit f358239

File tree

3 files changed

+93
-16
lines changed

3 files changed

+93
-16
lines changed

src/qt/forms/debugwindow.ui

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
</widget>
211211
</item>
212212
<item row="7" column="1" colspan="2">
213-
<widget class="QLabel" name="networkName">
213+
<widget class="NetworkName" name="networkName">
214214
<property name="cursor">
215215
<cursorShape>IBeamCursor</cursorShape>
216216
</property>
@@ -1872,6 +1872,11 @@
18721872
<class>PlainCopyTextEdit</class>
18731873
<extends>QTextEdit</extends>
18741874
</customwidget>
1875+
<customwidget>
1876+
<class>NetworkName</class>
1877+
<extends>QLabel</extends>
1878+
<header>qt/rpcconsole.h</header>
1879+
</customwidget>
18751880
</customwidgets>
18761881
<resources>
18771882
<include location="../bitcoin.qrc"/>

src/qt/rpcconsole.cpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ const int INITIAL_TRAFFIC_GRAPH_MINS = 30;
5757
const QSize FONT_RANGE(4, 40);
5858
const char fontSizeSettingsKey[] = "consoleFontSize";
5959

60+
const std::string DEFAULT_CHALLENGE_STRING =
61+
"512103AD5E0EDAD18CB1F0FC0D28A3D4F1F3E445640337489ABB10404F2D1E086BE430210359EF5021964FE22D6F8E05B2463C9540CE96883FE3B278760F048F5189F2E6C452AE";
62+
6063
const struct {
6164
const char *url;
6265
const char *source;
@@ -733,24 +736,39 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_
733736
ui->blocksDir->setText(model->blocksDir());
734737
ui->startupTime->setText(model->formatClientStartupTime());
735738
ui->networkName->setText(QString::fromStdString(Params().GetChainTypeString()));
739+
ui->networkName->setWordWrap(true);
736740

737741
if (Params().GetChainTypeString() == "signet") {
738742
std::vector<uint8_t> vChallenge = Params().GetConsensus().signet_challenge;
739-
std::string challengeString = challengeToString(vChallenge);
740-
std::string challenge_start = challengeString.substr(0, 8);
741-
std::string challenge_end = challengeString.substr(challengeString.length() - 8);
742-
743-
ui->networkName->setText(
744-
tr("Signet: (%1...%2)").arg(
745-
QString::fromStdString(challenge_start),
746-
QString::fromStdString(challenge_end)
747-
)
748-
);
749-
750-
const QString title = tr("Node window - [signet] (%1)").arg(
751-
QString::fromStdString(challenge_start)
752-
);
753-
this->setWindowTitle(title);
743+
std::string challengeString = ChallengeToStdString(vChallenge);
744+
745+
if (challengeString != DEFAULT_CHALLENGE_STRING) {
746+
if (challengeString.length() > 16) { // a sane minimum
747+
std::string challenge_fingerprint = challengeString.substr(0, 8);
748+
const QString title = tr("Node window - [signet] (%1)").arg(QString::fromStdString(challenge_fingerprint));
749+
// display fingerprint in Node window title
750+
this->setWindowTitle(title);
751+
} else {
752+
// A trivial challenge is supported. Example: signetchallenge=51
753+
std::string challenge_fingerprint = challengeString.substr(0, challengeString.length());
754+
const QString title = tr("Node window - [signet] (%1)").arg(QString::fromStdString(challenge_fingerprint));
755+
// display fingerprint in Node window title
756+
this->setWindowTitle(title);
757+
}
758+
if (challengeString.length() > (size_t)ui->networkName->width()) {
759+
challengeString.insert(0, "\n"); // break after Signet:
760+
challengeString.insert(65, "\n"); // then split at (130/2)
761+
}
762+
ui->networkName->setToolTip(
763+
tr("%1").arg(QString::fromStdString(challengeString)));
764+
ui->networkName->setText(
765+
tr("%1\nChallenge: %2").arg("Signet").arg(QString::fromStdString(challengeString)));
766+
767+
} else {
768+
ui->networkName->setText(tr("Signet: Default"));
769+
ui->networkName->setToolTip(QString());
770+
this->setWindowTitle(tr("[signet] Default"));
771+
}
754772
}
755773

756774
//Setup autocomplete and attach it

src/qt/rpcconsole.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
#include <QByteArray>
1717
#include <QCompleter>
18+
#include <QFontMetrics>
19+
#include <QLabel>
1820
#include <QMimeData>
1921
#include <QTextDocumentFragment>
2022
#include <QTextEdit>
@@ -211,4 +213,56 @@ class PlainCopyTextEdit : public QTextEdit {
211213
}
212214
};
213215

216+
class NetworkName : public QLabel
217+
{
218+
Q_OBJECT
219+
220+
public:
221+
explicit NetworkName(QWidget *parent = nullptr) : QLabel(parent) {}
222+
223+
void setText(const QString& text) {
224+
m_fullText = text;
225+
recalculateElidedText();
226+
}
227+
228+
const QString& fullText() const { return m_fullText; }
229+
QString selectedText() const {
230+
return m_fullText;
231+
}
232+
233+
protected:
234+
void resizeEvent(QResizeEvent *event) override {
235+
QLabel::resizeEvent(event);
236+
recalculateElidedText();
237+
}
238+
239+
// Provide the full challenge when Copy&Paste
240+
QMimeData* createMimeDataFromSelection() const {
241+
auto md = new QMimeData();
242+
md->setText(m_fullText);
243+
return md;
244+
}
245+
246+
private:
247+
QString m_fullText;
248+
249+
void recalculateElidedText() {
250+
if (m_fullText.isEmpty()) {
251+
QLabel::setText(QString());
252+
return;
253+
}
254+
255+
QFontMetrics fm(font());
256+
int availableWidth = width()-1;
257+
//int availableWidth = contentsRect().width()-1;
258+
259+
QString elidedText = fm.elidedText(m_fullText, Qt::ElideMiddle, availableWidth);
260+
261+
if (QLabel::text() != elidedText) {
262+
QLabel::setText(elidedText);
263+
//QLabel::setText(m_fullText);
264+
}
265+
}
266+
};
267+
214268
#endif // BITCOIN_QT_RPCCONSOLE_H

0 commit comments

Comments
 (0)