Skip to content

Commit af15ffc

Browse files
committed
feat: 增强十六进制编辑区拓展插件;
1 parent 0ba470c commit af15ffc

14 files changed

Lines changed: 650 additions & 497 deletions

File tree

3rdparty/QHexView/document/qhexrenderer.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,19 @@ void QHexRenderer::renderFrame(QPainter *painter) {
111111
painter->drawLine(endx, rect.top(), endx, rect.bottom());
112112
}
113113

114+
void QHexRenderer::renderAdditonalFrame(QPainter *painter, bool top,
115+
bool left) {
116+
QRect rect = painter->window();
117+
int endx = this->getEndColumnX();
118+
painter->setPen(m_borderColor);
119+
if (top) {
120+
painter->drawLine(0, 0, endx, 0);
121+
}
122+
if (left) {
123+
painter->drawLine(0, 0, 0, rect.bottom());
124+
}
125+
}
126+
114127
// modified by wingsummer
115128
void QHexRenderer::render(QPainter *painter, qsizetype begin, qsizetype end,
116129
qsizetype firstline) {

3rdparty/QHexView/document/qhexrenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class QHexRenderer : public QObject {
4343
const QFontMetricsF &fontmetrics,
4444
QObject *parent = nullptr);
4545
void renderFrame(QPainter *painter);
46+
void renderAdditonalFrame(QPainter *painter, bool top, bool left);
4647
void render(QPainter *painter, qsizetype start, qsizetype end,
4748
qsizetype firstline); // begin included, end excluded
4849
void updateMetrics(const QFontMetricsF &fm);

3rdparty/QHexView/qhexview.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,17 @@ void QHexView::keyPressEvent(QKeyEvent *e) {
325325
QPoint QHexView::absolutePosition(const QPoint &pos) const {
326326
auto margins = viewport()->contentsMargins();
327327
QPoint shift(horizontalScrollBar()->value() - margins.left(),
328-
-margins.top() * m_renderer->lineHeight());
328+
-margins.top());
329329
return pos + shift;
330330
}
331331

332+
bool QHexView::disableInternalPaint() const { return m_disableInternalPaint; }
333+
334+
void QHexView::setDisableInternalPaint(bool newDisableInternalPaint) {
335+
m_disableInternalPaint = newDisableInternalPaint;
336+
update();
337+
}
338+
332339
QHexCursor *QHexView::cursor() const { return m_cursor; }
333340

334341
qsizetype QHexView::copyLimit() const { return m_copylimit; }
@@ -786,22 +793,25 @@ void QHexView::paintEvent(QPaintEvent *e) {
786793

787794
// these are lines from the point of view of the visible rect
788795
// where the first "headerCount" are taken by the header
789-
const int first = (r.top() / lineHeight); // included
796+
const int first = (r.top() - m.top()) / lineHeight; // included
790797
const int lastPlusOne =
791-
(r.bottom() / lineHeight) + 1 - m.top() - m.bottom(); // excluded
798+
((r.bottom() - m.top() - m.bottom()) / lineHeight) + 1; // excluded
792799

793800
// compute document lines, adding firstVisible and removing the header
794801
// the max is necessary if the rect covers the header
795802
const qsizetype begin = firstVisible + std::max(first - headerCount, 0);
796803
const qsizetype end = firstVisible + std::max(lastPlusOne - headerCount, 0);
797804

798805
Q_EMIT onPaintCustomEventBegin();
799-
painter.save();
800806
auto xOff = this->horizontalScrollBar()->value();
801-
painter.translate(-xOff + m.left(), m.top() * m_renderer->lineHeight());
802-
m_renderer->render(&painter, begin, end, firstVisible);
803-
m_renderer->renderFrame(&painter);
804-
painter.restore();
807+
if (Q_LIKELY(!m_disableInternalPaint)) {
808+
painter.save();
809+
painter.translate(-xOff + m.left(), m.top());
810+
m_renderer->render(&painter, begin, end, firstVisible);
811+
m_renderer->renderFrame(&painter);
812+
m_renderer->renderAdditonalFrame(&painter, m.top() > 0, m.left() > 0);
813+
painter.restore();
814+
}
805815
Q_EMIT onPaintCustomEvent(xOff, firstVisible, begin, end);
806816
}
807817

@@ -1184,7 +1194,6 @@ void QHexView::adjustScrollBars() {
11841194

11851195
auto docLines = m_renderer->documentLines();
11861196
auto visLines = this->visibleLines();
1187-
auto margins = viewport()->contentsMargins();
11881197

11891198
// modified by wingsummer,fix the scrollbar bug
11901199
if (docLines > visLines && !m_document->isEmpty()) {
@@ -1200,6 +1209,7 @@ void QHexView::adjustScrollBars() {
12001209
QScrollBar *hscrollbar = this->horizontalScrollBar();
12011210
int documentWidth = m_renderer->documentWidth();
12021211
int viewportWidth = viewport()->width();
1212+
auto margins = viewport()->contentsMargins();
12031213

12041214
if (documentWidth > viewportWidth) {
12051215
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
@@ -1231,9 +1241,10 @@ qsizetype QHexView::lastVisibleLine() const {
12311241

12321242
qsizetype QHexView::visibleLines() const {
12331243
auto margins = viewport()->contentsMargins();
1234-
auto visLines = qsizetype(std::ceil(
1235-
this->height() / m_renderer->lineHeight() -
1236-
m_renderer->headerLineCount() - margins.top() - margins.bottom()));
1244+
auto visLines = qsizetype(
1245+
std::ceil((this->height() - margins.top() - margins.bottom()) /
1246+
m_renderer->lineHeight() -
1247+
m_renderer->headerLineCount()));
12371248
return std::min(visLines, m_renderer->documentLines());
12381249
}
12391250

3rdparty/QHexView/qhexview.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class QHexView : public QAbstractScrollArea {
106106
qsizetype copyLimit() const;
107107
QHexCursor *cursor() const;
108108

109+
bool disableInternalPaint() const;
110+
void setDisableInternalPaint(bool newDisableInternalPaint);
111+
109112
public slots:
110113
void setDocument(const QSharedPointer<QHexDocument> &document,
111114
QHexCursor *cursor = nullptr);
@@ -228,6 +231,7 @@ private slots:
228231

229232
qreal m_fontSize;
230233
qreal m_scaleRate = 1.0;
234+
bool m_disableInternalPaint = false;
231235

232236
qsizetype m_copylimit = 1; // MB
233237
};

TestHexExt/testhexext.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ QMenu *TestHexExt::registeredHexContextMenu() const { return m_context; }
4848

4949
QList<WingHex::WingRibbonToolBoxInfo>
5050
TestHexExt::registeredRibbonTools() const {
51-
// TODO
5251
return {};
5352
}
5453

@@ -60,8 +59,10 @@ QMargins TestHexExt::contentMargins(WingHex::HexEditorContext *context) const {
6059
auto str = QString::number(lines);
6160
auto fm = context->fontMetrics();
6261
constexpr auto padding = 4;
63-
auto len = fm.horizontalAdvance(str) + padding;
64-
return {int(len), 0, 0, 1};
62+
auto header = QStringLiteral("Line");
63+
auto minLen = fm.horizontalAdvance(header) + padding;
64+
auto colLen = qMax(fm.horizontalAdvance(str) + padding, minLen);
65+
return {int(colLen) + 1, 0, 0, 0};
6566
}
6667

6768
void TestHexExt::onPaintEvent(QPainter *painter, const QWidget *w,
@@ -90,7 +91,6 @@ void TestHexExt::onPaintEvent(QPainter *painter, const QWidget *w,
9091
painter->restore();
9192
context->renderHexBackground(painter, {0, 0}, colLen);
9293
}
93-
painter->drawLine(colLen, 0, colLen, w->height());
9494

9595
// draw Line Numbers
9696
painter->setPen(context->addressColor());

0 commit comments

Comments
 (0)