HAL  v4.5.0-133-g64838ea8d
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
code_editor_minimap.cpp
Go to the documentation of this file.
2 
6 
7 #include <QPainter>
8 #include <QStyleOption>
9 #include <QTextBlock>
10 
11 #include <cmath>
12 #include <math.h>
13 
14 #include <QDebug>
15 namespace hal
16 {
18  : QWidget(editor), mEditor(editor), mDocument(new QTextDocument()), mScrollbar(new MinimapScrollbar(this)), mDocumentHeight(0), mOffset(0)
19  {
22 
23  mDocument->setDocumentMargin(0);
24  mScrollbar->show();
25 
26  repolish();
27  }
28 
30  {
31  return mScrollbar;
32  }
33 
35  {
36  return mDocument;
37  }
38 
39  void CodeEditorMinimap::adjustSliderHeight(int viewport_height)
40  {
41  Q_UNUSED(viewport_height);
42 
43  qDebug() << "editor " << mEditor->document()->documentLayout()->documentSize().height();
44  qDebug() << "mini " << mDocument->documentLayout()->documentSize().height();
45 
46  qreal ratio = mEditor->document()->documentLayout()->documentSize().height() / mDocument->documentLayout()->documentSize().height(); // UNEXPECTED RESULT, MAKES NO SENSE
47 
48  mScrollbar->setSliderHeight(std::round(mEditor->viewport()->contentsRect().height() * ratio));
49  }
50 
52  {
53  mScrollbar->setSliderHeight(std::round(ratio * mDocument->documentLayout()->blockBoundingRect(mDocument->firstBlock()).height()));
54  resizeScrollbar();
55  }
56 
57  void CodeEditorMinimap::adjustSliderHeight(int first_visible_block, int last_visible_block)
58  {
59  qDebug() << "first block: " + QString::number(first_visible_block);
60  qDebug() << "last block: " + QString::number(last_visible_block);
61 
62  qreal top = mDocument->documentLayout()->blockBoundingRect(mDocument->findBlockByNumber(first_visible_block)).top();
63  qreal bottom = mDocument->documentLayout()->blockBoundingRect(mDocument->findBlockByNumber(last_visible_block)).bottom();
64 
65  qDebug() << "top: " + QString::number(top);
66  qDebug() << "bottom: " + QString::number(bottom);
67 
68  mScrollbar->setSliderHeight(std::round(bottom - top));
69  }
70 
72  {
73  mDocumentHeight = std::ceil(new_size.height());
74  resizeScrollbar();
75  }
76 
77  void CodeEditorMinimap::handleContentsChange(int position, int chars_removed, int chars_added)
78  {
79  QTextCursor cursor = QTextCursor(mDocument);
80  cursor.setPosition(position);
81 
82  if (chars_removed)
83  {
84  cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, chars_removed);
85  cursor.removeSelectedText();
86  }
87 
88  if (chars_added)
89  cursor.insertText(mEditor->document()->toPlainText().mid(position, chars_added));
90  }
91 
93  {
94  Q_UNUSED(event)
95 
96  QStyleOption opt;
97  QtCompat::styleOptionInit(opt,this);
98  QPainter painter(this);
99  style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
100 
101  painter.setClipping(true);
102  painter.setClipRect(rect());
103 
105  ctx.palette.setColor(QPalette::Text, palette().text().color());
106 
107  if (mDocumentHeight > height())
108  {
109  int block_number = mEditor->first_visible_block();
110  int sliderPosition = mScrollbar->sliderPosition();
111  mOffset = mDocument->documentLayout()->blockBoundingRect(mDocument->findBlockByNumber(block_number)).top() - sliderPosition;
112  painter.translate(0, -mOffset);
113 
114  ctx.clip = QRectF(0, mOffset, width(), height());
115  }
116 
117  mDocument->documentLayout()->draw(&painter, ctx);
118  }
119 
121  {
122  Q_UNUSED(event)
123 
124  resizeScrollbar();
125  }
126 
128  {
129  int position = mDocument->documentLayout()->hitTest(QPointF(event->pos().x(), event->pos().y() + mOffset), Qt::FuzzyHit);
130  QTextCursor cursor(mDocument);
131  cursor.setPosition(position);
132  mEditor->centerOnLine(cursor.blockNumber());
133  }
134 
136  {
137  mEditor->handleWheelEvent(event);
138  }
139 
140  void CodeEditorMinimap::resizeScrollbar()
141  {
142  if (mDocumentHeight < height())
143  mScrollbar->resize(width(), std::max(mScrollbar->sliderHeight(), mDocumentHeight));
144  else
145  mScrollbar->resize(width(), height());
146  }
147 
149  {
150  QStyle* s = style();
151 
152  s->unpolish(this);
153  s->polish(this);
154 
155  mDocument->setDefaultFont(font());
156  }
157 }
A plain text edit widget that is intended for editing code.
Definition: code_editor.h:52
void centerOnLine(const int number)
int first_visible_block()
void handleWheelEvent(QWheelEvent *event)
void mousePressEvent(QMouseEvent *event) override
void handleContentsChange(int position, int chars_removed, int chars_added)
void adjustSliderHeight(int viewport_height)
void wheelEvent(QWheelEvent *event) override
void handleDocumentSizeChanged(const QSizeF &new_size)
void paintEvent(QPaintEvent *event) override
MinimapScrollbar * scrollbar()
CodeEditorMinimap(CodeEditor *editor)
void resizeEvent(QResizeEvent *event) override
The scrollbar of the CodeEditorMinimap.
void setSliderHeight(const int height)
void styleOptionInit(QStyleOption &opt, QWidget *widget)
Definition: defines.h:45
QWidget * viewport() const const
virtual QRectF blockBoundingRect(const QTextBlock &block) const const=0
virtual QSizeF documentSize() const const=0
void documentSizeChanged(const QSizeF &newSize)
virtual void draw(QPainter *painter, const QAbstractTextDocumentLayout::PaintContext &context)=0
virtual int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const const=0
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
void setClipping(bool enable)
void translate(const QPointF &offset)
QTextDocument * document() const const
int height() const const
qreal bottom() const const
qreal height() const const
qreal top() const const
qreal height() const const
QString mid(int position, int n) const const
QString number(int n, int base)
virtual void drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const const=0
virtual void polish(QWidget *widget)
virtual void unpolish(QWidget *widget)
FuzzyHit
void contentsChange(int position, int charsRemoved, int charsAdded)
QAbstractTextDocumentLayout * documentLayout() const const
void setDocumentMargin(qreal margin)
QTextBlock findBlockByNumber(int blockNumber) const const
QTextBlock firstBlock() const const
void setDefaultFont(const QFont &font)
QString toPlainText() const const
QRect contentsRect() const const
virtual bool event(QEvent *event) override
void resize(int w, int h)
void show()
QStyle * style() const const