Skip to content

Commit 5f06fbb

Browse files
committed
rpcconsole:NetworkName custom widget
1 parent b53a753 commit 5f06fbb

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;
@@ -717,24 +720,39 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_
717720
ui->blocksDir->setText(model->blocksDir());
718721
ui->startupTime->setText(model->formatClientStartupTime());
719722
ui->networkName->setText(QString::fromStdString(Params().GetChainTypeString()));
723+
ui->networkName->setWordWrap(true);
720724

721725
if (Params().GetChainTypeString() == "signet") {
722726
std::vector<uint8_t> vChallenge = Params().GetConsensus().signet_challenge;
723-
std::string challengeString = challengeToString(vChallenge);
724-
std::string challenge_start = challengeString.substr(0, 8);
725-
std::string challenge_end = challengeString.substr(challengeString.length() - 8);
726-
727-
ui->networkName->setText(
728-
tr("Signet: (%1...%2)").arg(
729-
QString::fromStdString(challenge_start),
730-
QString::fromStdString(challenge_end)
731-
)
732-
);
733-
734-
const QString title = tr("Node window - [signet] (%1)").arg(
735-
QString::fromStdString(challenge_start)
736-
);
737-
this->setWindowTitle(title);
727+
std::string challengeString = ChallengeToStdString(vChallenge);
728+
729+
if (challengeString != DEFAULT_CHALLENGE_STRING) {
730+
if (challengeString.length() > 16) { // a sane minimum
731+
std::string challenge_fingerprint = challengeString.substr(0, 8);
732+
const QString title = tr("Node window - [signet] (%1)").arg(QString::fromStdString(challenge_fingerprint));
733+
// display fingerprint in Node window title
734+
this->setWindowTitle(title);
735+
} else {
736+
// A trivial challenge is supported. Example: signetchallenge=51
737+
std::string challenge_fingerprint = challengeString.substr(0, challengeString.length());
738+
const QString title = tr("Node window - [signet] (%1)").arg(QString::fromStdString(challenge_fingerprint));
739+
// display fingerprint in Node window title
740+
this->setWindowTitle(title);
741+
}
742+
if (challengeString.length() > (size_t)ui->networkName->width()) {
743+
challengeString.insert(0, "\n"); // break after Signet:
744+
challengeString.insert(65, "\n"); // then split at (130/2)
745+
}
746+
ui->networkName->setToolTip(
747+
tr("%1").arg(QString::fromStdString(challengeString)));
748+
ui->networkName->setText(
749+
tr("%1\nChallenge: %2").arg("Signet").arg(QString::fromStdString(challengeString)));
750+
751+
} else {
752+
ui->networkName->setText(tr("Signet: Default"));
753+
ui->networkName->setToolTip(QString());
754+
this->setWindowTitle(tr("[signet] Default"));
755+
}
738756
}
739757

740758
//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>
@@ -210,4 +212,56 @@ class PlainCopyTextEdit : public QTextEdit {
210212
}
211213
};
212214

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

0 commit comments

Comments
 (0)