Skip to content

Commit d166b3b

Browse files
committed
rpcconsole:NetworkName:custom widget implementation
1 parent a87484c commit d166b3b

File tree

3 files changed

+92
-15
lines changed

3 files changed

+92
-15
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: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -717,24 +717,42 @@ void RPCConsole::setClientModel(ClientModel *model, int bestblock_height, int64_
717717
ui->blocksDir->setText(model->blocksDir());
718718
ui->startupTime->setText(model->formatClientStartupTime());
719719
ui->networkName->setText(QString::fromStdString(Params().GetChainTypeString()));
720+
ui->networkName->setWordWrap(true);
720721

721722
if (Params().GetChainTypeString() == "signet") {
722723
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);
724+
std::string challengeString = ChallengeToStdString(vChallenge);
725+
if (challengeString.length() > 16 ){ // a sane minimum
726+
std::string challenge_fingerprint = challengeString.substr(0, 8);
727+
std::string challenge_end = challengeString.substr(challengeString.length() - 8);
728+
const QString title = tr("Node window - [signet] (%1)").arg(
729+
QString::fromStdString(challenge_fingerprint)
730+
);
731+
// display fingerprint in Node window title
732+
this->setWindowTitle(title);
733+
} else {
734+
// A trivial challenge is supported. Example: signetchallenge=51
735+
std::string challenge_fingerprint = challengeString.substr(0, challengeString.length());
736+
std::string challenge_end = challengeString.substr(challengeString.length() - 1);
737+
const QString title = tr("Node window - [signet] (%1)").arg(
738+
QString::fromStdString(challenge_fingerprint)
739+
);
740+
// display fingerprint in Node window title
741+
this->setWindowTitle(title);
726742

743+
744+
}
745+
if (challengeString.length() > (size_t)ui->networkName->width()) {
746+
challengeString.insert(0, "\n"); // break after Signet:
747+
challengeString.insert(65, "\n"); // then split at (130/2)
748+
}
749+
750+
ui->networkName->setToolTip(
751+
tr("Signet challenge: %1").arg(QString::fromStdString(challengeString))
752+
);
727753
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);
754+
tr("%1 (%2)").arg("Signet:").arg(QString::fromStdString(challengeString))
755+
);
738756
}
739757

740758
//Setup autocomplete and attach it

src/qt/rpcconsole.h

Lines changed: 55 additions & 1 deletion
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>
@@ -84,7 +86,6 @@ class RPCConsole: public QWidget
8486
virtual bool eventFilter(QObject* obj, QEvent *event) override;
8587
void keyPressEvent(QKeyEvent *) override;
8688
void changeEvent(QEvent* e) override;
87-
std::string challengeToString(const std::vector<uint8_t>& v);
8889

8990
private Q_SLOTS:
9091
void on_lineEdit_returnPressed();
@@ -211,4 +212,57 @@ class PlainCopyTextEdit : public QTextEdit {
211212
}
212213
};
213214

215+
class NetworkName : public QLabel
216+
{
217+
Q_OBJECT
218+
219+
public:
220+
explicit NetworkNamw(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+
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;//forced ellision other wise once the un-elided challenge is displayed it will not break
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)