Krita Source Code Documentation
Loading...
Searching...
No Matches
NodeView Class Reference

#include <NodeView.h>

+ Inheritance diagram for NodeView:

Classes

class  PropertyAction
 

Public Types

enum  ColumnIndex { DEFAULT_COL = 0 , VISIBILITY_COL = 1 , SELECTED_COL = 2 }
 

Public Slots

void slotConfigurationChanged ()
 
void slotScrollerStateChanged (QScroller::State state)
 
void slotUpdateIcons ()
 called with a theme change to refresh icon colors
 

Signals

void contextMenuRequested (const QPoint &globalPos, const QModelIndex &index)
 
void selectionChanged (const QModelIndexList &)
 

Public Member Functions

void addPropertyActions (QMenu *menu, const QModelIndex &index)
 
void dragEnterEvent (QDragEnterEvent *e) override
 
void dragLeaveEvent (QDragLeaveEvent *e) override
 
void dragMoveEvent (QDragMoveEvent *ev) override
 
void drawBranches (QPainter *painter, const QRect &rect, const QModelIndex &index) const override
 
void dropEvent (QDropEvent *ev) override
 
 NodeView (QWidget *parent=0)
 
void paintEvent (QPaintEvent *event) override
 
 Private (NodeView *_q)
 
void resizeEvent (QResizeEvent *event) override
 
void setModel (QAbstractItemModel *model) override
 
void toggleSolo (const QModelIndex &index)
 
void updateNode (const QModelIndex &index)
 
 ~NodeView () override
 

Public Attributes

NodeDelegate delegate
 
QPersistentModelIndex hovered
 
QPoint lastPos
 

Protected Slots

void currentChanged (const QModelIndex &current, const QModelIndex &previous) override
 
void dataChanged (const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles=QVector< int >()) override
 
void selectionChanged (const QItemSelection &selected, const QItemSelection &deselected) override
 

Protected Member Functions

void contextMenuEvent (QContextMenuEvent *event) override
 
QPixmap createDragPixmap () const
 
int cursorPageIndex () const
 
QModelIndex indexAt (const QPoint &point) const override
 
QItemSelectionModel::SelectionFlags selectionCommand (const QModelIndex &index, const QEvent *event) const override
 
virtual void showContextMenu (const QPoint &globalPos, const QModelIndex &index)
 
void startDrag (Qt::DropActions supportedActions) override
 
bool viewportEvent (QEvent *event) override
 

Private Types

typedef KisNodeModel Model
 

Private Slots

void slotActionToggled (bool on, const QPersistentModelIndex &index, int property)
 

Private Member Functions

bool isDragging () const
 
QStyleOptionViewItem optionForIndex (const QModelIndex &index) const
 
void setDraggingFlag (bool flag=true)
 
void updateSelectedCheckboxColumn ()
 
- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Attributes

Private *const d
 
bool m_draggingFlag
 
- Private Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

A widget displaying the Krita nodes (layers, masks, local selections, etc.)

This class is designed as a Qt model-view widget.

The Qt documentation explains the design and terminology for these classes: https://doc.qt.io/qt-5/model-view-programming.html

This widget should work correctly in your Qt designer .ui file.

Definition at line 50 of file NodeView.cpp.

Member Typedef Documentation

◆ Model

typedef KisNodeModel NodeView::Model
private

Definition at line 149 of file NodeView.h.

Member Enumeration Documentation

◆ ColumnIndex

Enumerator
DEFAULT_COL 
VISIBILITY_COL 
SELECTED_COL 

Definition at line 41 of file NodeView.h.

41 {
42 DEFAULT_COL = 0,
44 SELECTED_COL = 2,
45 };
@ SELECTED_COL
Definition NodeView.h:44
@ VISIBILITY_COL
Definition NodeView.h:43
@ DEFAULT_COL
Definition NodeView.h:42

Constructor & Destructor Documentation

◆ NodeView()

NodeView::NodeView ( QWidget * parent = 0)
explicit

Create a new NodeView.

Definition at line 70 of file NodeView.cpp.

71 : QTreeView(parent)
72 , m_draggingFlag(false)
73 , d(new Private(this))
74{
75 setItemDelegate(&d->delegate);
76
77 setMouseTracking(true);
78 setSelectionBehavior(SelectRows);
79 setDefaultDropAction(Qt::MoveAction);
80 setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
81 setSelectionMode(QAbstractItemView::ExtendedSelection);
82 setRootIsDecorated(false);
83
84 header()->hide();
85 setDragEnabled(true);
86 setDragDropMode(QAbstractItemView::DragDrop);
87 setAcceptDrops(true);
88 setDropIndicatorShown(true);
89
90 {
91 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(this);
92 if (scroller) {
93 connect(scroller, SIGNAL(stateChanged(QScroller::State)),
94 this, SLOT(slotScrollerStateChanged(QScroller::State)));
95 }
96 }
97}
Private *const d
Definition NodeView.h:152
void slotScrollerStateChanged(QScroller::State state)
Definition NodeView.cpp:487
bool m_draggingFlag
Definition NodeView.h:146
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)

References KisKineticScroller::createPreconfiguredScroller(), d, and slotScrollerStateChanged().

◆ ~NodeView()

NodeView::~NodeView ( )
override

Definition at line 99 of file NodeView.cpp.

100{
101 delete d;
102}

References d.

Member Function Documentation

◆ addPropertyActions()

void NodeView::addPropertyActions ( QMenu * menu,
const QModelIndex & index )

Add toggle actions for all the properties associated with the current document section associated with the model index to the specified menu.

For instance, if a document section can be locked and visible, the menu will be expanded with locked and visible toggle actions.

For instance

NodeView * nodeView;
QModelIndex index = getCurrentNode();
QMenu menu;
if (index.isValid()) {
sectionView->addPropertyActions(&menu, index);
} else {
menu.addAction(...); // Something to create a new document section, for example.
}
Parameters
menuA pointer to the menu that will be expanded with the toggle actions
indexThe model index associated with the document section that may or may not provide a number of toggle actions.

Definition at line 129 of file NodeView.cpp.

130{
132 for (int i = 0, n = list.count(); i < n; ++i) {
133 if (list.at(i).isMutable) {
134 PropertyAction *a = new PropertyAction(i, list.at(i), index, menu);
135 connect(a, SIGNAL(toggled(bool,QPersistentModelIndex,int)),
136 this, SLOT(slotActionToggled(bool,QPersistentModelIndex,int)));
137 menu->addAction(a);
138 }
139 }
140}
@ PropertiesRole
A list of properties the part has.
void slotActionToggled(bool on, const QPersistentModelIndex &index, int property)
Definition NodeView.cpp:299

References KisNodeModel::PropertiesRole, and slotActionToggled().

◆ contextMenuEvent()

void NodeView::contextMenuEvent ( QContextMenuEvent * event)
overrideprotected

Definition at line 250 of file NodeView.cpp.

251{
252 QTreeView::contextMenuEvent(e);
253 QModelIndex i = indexAt(e->pos());
254 if (model())
255 i = model()->buddy(i);
256 showContextMenu(e->globalPos(), i);
257}
virtual void showContextMenu(const QPoint &globalPos, const QModelIndex &index)
Definition NodeView.cpp:259
QModelIndex indexAt(const QPoint &point) const override
Definition NodeView.cpp:165

References indexAt(), and showContextMenu().

◆ contextMenuRequested

void NodeView::contextMenuRequested ( const QPoint & globalPos,
const QModelIndex & index )
signal

Emitted whenever the user clicks with the secondary mouse button on an item. It is up to the application to design the contents of the context menu and show it.

◆ createDragPixmap()

QPixmap NodeView::createDragPixmap ( ) const
protected

Definition at line 326 of file NodeView.cpp.

327{
328 const QModelIndexList selectedIndexes = selectionModel()->selectedIndexes();
329 Q_ASSERT(!selectedIndexes.isEmpty());
330
331 const int itemCount = selectedIndexes.count();
332
333 // If more than one item is dragged, align the items inside a
334 // rectangular grid. The maximum grid size is limited to 4 x 4 items.
335 int xCount = 2;
336 int size = 96;
337 if (itemCount > 9) {
338 xCount = 4;
340 }
341 else if (itemCount > 4) {
342 xCount = 3;
344 }
345 else if (itemCount < xCount) {
346 xCount = itemCount;
347 }
348
349 int yCount = itemCount / xCount;
350 if (itemCount % xCount != 0) {
351 ++yCount;
352 }
353
354 if (yCount > xCount) {
355 yCount = xCount;
356 }
357
358 // Draw the selected items into the grid cells
359 QPixmap dragPixmap(xCount * size + xCount - 1, yCount * size + yCount - 1);
360 dragPixmap.fill(Qt::transparent);
361
362 QPainter painter(&dragPixmap);
363 int x = 0;
364 int y = 0;
365 Q_FOREACH (const QModelIndex &selectedIndex, selectedIndexes) {
366 const QImage img = selectedIndex.data(int(KisNodeModel::BeginThumbnailRole) + size).value<QImage>();
367 painter.drawPixmap(x, y, QPixmap::fromImage(img.scaled(QSize(size, size), Qt::KeepAspectRatio, Qt::SmoothTransformation)));
368
369 x += size + 1;
370 if (x >= dragPixmap.width()) {
371 x = 0;
372 y += size + 1;
373 }
374 if (y >= dragPixmap.height()) {
375 break;
376 }
377 }
378
379 return dragPixmap;
380}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisNodeModel::BeginThumbnailRole, KisIconUtils::SizeHuge, and KisIconUtils::SizeLarge.

◆ currentChanged

void NodeView::currentChanged ( const QModelIndex & current,
const QModelIndex & previous )
overrideprotectedslot

Definition at line 264 of file NodeView.cpp.

265{
266 QTreeView::currentChanged(current, previous);
267 if (current != previous) {
268 Q_ASSERT(!current.isValid() || current.model() == model());
269 KisSignalsBlocker blocker(this);
270 model()->setData(current, true, KisNodeModel::ActiveRole);
271 }
272}
@ ActiveRole
Whether the section is the active one.

References KisNodeModel::ActiveRole.

◆ cursorPageIndex()

int NodeView::cursorPageIndex ( ) const
protected

Calculates the index of the nearest item to the cursor position

Definition at line 427 of file NodeView.cpp.

428{
429 QSize size(visualRect(model()->index(0, 0, QModelIndex())).width(), visualRect(model()->index(0, 0, QModelIndex())).height());
430 int scrollBarValue = verticalScrollBar()->value();
431
432 QPoint cursorPosition = QWidget::mapFromGlobal(QCursor::pos());
433
434 int numberRow = (cursorPosition.y() + scrollBarValue) / size.height();
435
436 //If cursor is at the half button of the page then the move action is performed after the slide, otherwise it is
437 //performed before the page
438 if (abs((cursorPosition.y() + scrollBarValue) - size.height()*numberRow) > (size.height()/2)) {
439 numberRow++;
440 }
441
442 if (numberRow > model()->rowCount(QModelIndex())) {
443 numberRow = model()->rowCount(QModelIndex());
444 }
445
446 return numberRow;
447}
Point abs(const Point &pt)

◆ dataChanged

void NodeView::dataChanged ( const QModelIndex & topLeft,
const QModelIndex & bottomRight,
const QVector< int > & roles = QVector<int>() )
overrideprotectedslot

Definition at line 274 of file NodeView.cpp.

275{
276 QTreeView::dataChanged(topLeft, bottomRight);
277
278 for (int x = topLeft.row(); x <= bottomRight.row(); ++x) {
279 for (int y = topLeft.column(); y <= bottomRight.column(); ++y) {
280 QModelIndex index = topLeft.sibling(x, y);
281 if (index.data(KisNodeModel::ActiveRole).toBool()) {
282 if (currentIndex() != index) {
283 setCurrentIndex(index);
284 }
285
286 return;
287 }
288 }
289 }
290}

References KisNodeModel::ActiveRole.

◆ dragEnterEvent()

void NodeView::dragEnterEvent ( QDragEnterEvent * e)
override

Definition at line 449 of file NodeView.cpp.

450{
452
453 QVariant data = QVariant::fromValue(
454 static_cast<void*>(const_cast<QMimeData*>(ev->mimeData())));
455 model()->setData(QModelIndex(), data, KisNodeModel::DropEnabled);
456
457 QTreeView::dragEnterEvent(ev);
458}
#define DRAG_WHILE_DRAG_WORKAROUND_START()
Definition NodeView.cpp:45

References DRAG_WHILE_DRAG_WORKAROUND_START, and KisNodeModel::DropEnabled.

◆ dragLeaveEvent()

void NodeView::dragLeaveEvent ( QDragLeaveEvent * e)
override

Definition at line 466 of file NodeView.cpp.

467{
468 QTreeView::dragLeaveEvent(e);
470}
#define DRAG_WHILE_DRAG_WORKAROUND_STOP()
Definition NodeView.cpp:46

References DRAG_WHILE_DRAG_WORKAROUND_STOP.

◆ dragMoveEvent()

void NodeView::dragMoveEvent ( QDragMoveEvent * ev)
override

Definition at line 460 of file NodeView.cpp.

461{
463 QTreeView::dragMoveEvent(ev);
464}

References DRAG_WHILE_DRAG_WORKAROUND_START.

◆ drawBranches()

void NodeView::drawBranches ( QPainter * painter,
const QRect & rect,
const QModelIndex & index ) const
override

Definition at line 407 of file NodeView.cpp.

409{
410#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
411 QStyleOptionViewItem option = viewOptions();
412#else
413 QStyleOptionViewItem option;
414 initViewItemOption(&option);
415#endif
416 option.rect = rect;
417 // This is not really a job for an item delegate, but the logic was already there
418 d->delegate.drawBranches(painter, option, index);
419}

References d.

◆ dropEvent()

void NodeView::dropEvent ( QDropEvent * ev)
override

Definition at line 421 of file NodeView.cpp.

422{
423 QTreeView::dropEvent(ev);
425}

References DRAG_WHILE_DRAG_WORKAROUND_STOP.

◆ indexAt()

QModelIndex NodeView::indexAt ( const QPoint & point) const
overrideprotected

Definition at line 165 of file NodeView.cpp.

166{
168
169 QModelIndex index = QTreeView::indexAt(point);
170 if (!index.isValid()) {
171 // Middle is a good position for both LTR and RTL layouts
172 // First reset x, then get the x in the middle
173 index = QTreeView::indexAt(point - QPoint(point.x(), 0) + QPoint(width() / 2, 0));
174 }
175
176 return index;
177}

◆ isDragging()

bool NodeView::isDragging ( ) const
private

Permit to know if a slide is dragging

Returns
boolean

Definition at line 472 of file NodeView.cpp.

473{
474 return m_draggingFlag;
475}

References m_draggingFlag.

◆ optionForIndex()

QStyleOptionViewItem NodeView::optionForIndex ( const QModelIndex & index) const
private

Definition at line 306 of file NodeView.cpp.

307{
308#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
309 QStyleOptionViewItem option = viewOptions();
310#else
311 QStyleOptionViewItem option;
312 initViewItemOption(&option);
313#endif
314 option.rect = visualRect(index);
315 if (index == currentIndex())
316 option.state |= QStyle::State_HasFocus;
317 return option;
318}

◆ paintEvent()

void NodeView::paintEvent ( QPaintEvent * event)
override

Definition at line 401 of file NodeView.cpp.

402{
403 event->accept();
404 QTreeView::paintEvent(event);
405}

◆ Private()

NodeView::Private ( NodeView * _q)
inline

Definition at line 53 of file NodeView.cpp.

54 : delegate(_q, _q)
55#ifdef DRAG_WHILE_DRAG_WORKAROUND
56 , isDragging(false)
57#endif
58 {
59 }
NodeDelegate delegate
Definition NodeView.cpp:60
bool isDragging() const
Definition NodeView.cpp:472

◆ resizeEvent()

void NodeView::resizeEvent ( QResizeEvent * event)
override

Definition at line 382 of file NodeView.cpp.

383{
385 header()->setStretchLastSection(false);
386
387 int otherColumnsWidth = scm.visibilityColumnWidth();
388
389 // if layer box is enabled subtract its width from the "Default col".
390 if (KisConfig(false).useLayerSelectionCheckbox()) {
391 otherColumnsWidth += scm.selectedButtonColumnWidth();
392 }
393 header()->resizeSection(DEFAULT_COL, event->size().width() - otherColumnsWidth);
394 header()->resizeSection(SELECTED_COL, scm.selectedButtonColumnWidth());
395 header()->resizeSection(VISIBILITY_COL, scm.visibilityColumnWidth());
396
397 setIndentation(scm.indentation());
398 QTreeView::resizeEvent(event);
399}

References DEFAULT_COL, KisNodeViewColorScheme::indentation(), SELECTED_COL, KisNodeViewColorScheme::selectedButtonColumnWidth(), VISIBILITY_COL, and KisNodeViewColorScheme::visibilityColumnWidth().

◆ selectionChanged [1/2]

void NodeView::selectionChanged ( const QItemSelection & selected,
const QItemSelection & deselected )
overrideprotectedslot

Definition at line 292 of file NodeView.cpp.

293{
294 QTreeView::selectionChanged(selected, deselected);
295 // XXX: selectedIndexes() does not include hidden (collapsed) items, is this really intended?
296 Q_EMIT selectionChanged(selectedIndexes());
297}
void selectionChanged(const QModelIndexList &)

References selectionChanged().

◆ selectionChanged [2/2]

void NodeView::selectionChanged ( const QModelIndexList & )
signal

◆ selectionCommand()

QItemSelectionModel::SelectionFlags NodeView::selectionCommand ( const QModelIndex & index,
const QEvent * event ) const
overrideprotected

Definition at line 151 of file NodeView.cpp.

152{
153 //Block selection on press if ctrl is held
154 //This is to allow for a more consistent behaviour with ctrl+dnd
155 if (event &&
156 event->type() == QEvent::MouseButtonPress ) {
157 const QMouseEvent *mevent = static_cast<const QMouseEvent*>(event);
158 if (mevent->modifiers() & Qt::ControlModifier)
159 return QItemSelectionModel::NoUpdate;
160 }
161
162 return QTreeView::selectionCommand(index, event);
163}

◆ setDraggingFlag()

void NodeView::setDraggingFlag ( bool flag = true)
private

Setter for the dragging flag

Parameters
flagboolean

Definition at line 477 of file NodeView.cpp.

478{
479 m_draggingFlag = flag;
480}

References m_draggingFlag.

◆ setModel()

void NodeView::setModel ( QAbstractItemModel * model)
override

Definition at line 104 of file NodeView.cpp.

105{
106 QTreeView::setModel(model);
107
108 if (!this->model()->inherits("KisNodeModel") && !this->model()->inherits("KisNodeFilterProxyModel")) {
109 qWarning() << "NodeView may not work with" << model->metaObject()->className();
110 }
111 if (this->model()->columnCount() != 3) {
112 qWarning() << "NodeView: expected 2 model columns, got " << this->model()->columnCount();
113 }
114
115 if (header()->sectionPosition(VISIBILITY_COL) != 0 || header()->sectionPosition(SELECTED_COL) != 1) {
116 header()->moveSection(VISIBILITY_COL, 0);
117 header()->moveSection(SELECTED_COL, 1);
118 }
119
120 KisConfig cfg(true);
121 if (!cfg.useLayerSelectionCheckbox()) {
122 header()->hideSection(SELECTED_COL);
123 }
124
125 // the default may be too large for our visibility icon
126 header()->setMinimumSectionSize(KisNodeViewColorScheme::instance()->visibilityColumnWidth());
127}
static KisNodeViewColorScheme * instance()

References KisNodeViewColorScheme::instance(), SELECTED_COL, KisConfig::useLayerSelectionCheckbox(), and VISIBILITY_COL.

◆ showContextMenu()

void NodeView::showContextMenu ( const QPoint & globalPos,
const QModelIndex & index )
protectedvirtual

Definition at line 259 of file NodeView.cpp.

260{
261 Q_EMIT contextMenuRequested(globalPos, index);
262}
void contextMenuRequested(const QPoint &globalPos, const QModelIndex &index)

References contextMenuRequested().

◆ slotActionToggled

void NodeView::slotActionToggled ( bool on,
const QPersistentModelIndex & index,
int property )
privateslot

Definition at line 299 of file NodeView.cpp.

300{
302 list[num].state = on;
303 const_cast<QAbstractItemModel*>(index.model())->setData(index, QVariant::fromValue(list), KisNodeModel::PropertiesRole);
304}

References KisNodeModel::PropertiesRole.

◆ slotConfigurationChanged

void NodeView::slotConfigurationChanged ( )
slot

Definition at line 491 of file NodeView.cpp.

492{
493 setIndentation(KisNodeViewColorScheme::instance()->indentation());
495 d->delegate.slotConfigChanged();
496}
void updateSelectedCheckboxColumn()
Definition NodeView.cpp:498

References d, KisNodeViewColorScheme::instance(), and updateSelectedCheckboxColumn().

◆ slotScrollerStateChanged

void NodeView::slotScrollerStateChanged ( QScroller::State state)
slot

Definition at line 487 of file NodeView.cpp.

487 {
489}
KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)

References KisKineticScroller::updateCursor().

◆ slotUpdateIcons

void NodeView::slotUpdateIcons ( )
slot

called with a theme change to refresh icon colors

Definition at line 482 of file NodeView.cpp.

483{
484 d->delegate.slotUpdateIcon();
485}

References d.

◆ startDrag()

void NodeView::startDrag ( Qt::DropActions supportedActions)
overrideprotected

Definition at line 320 of file NodeView.cpp.

321{
323 QTreeView::startDrag(supportedActions);
324}

References DRAG_WHILE_DRAG_WORKAROUND_START.

◆ toggleSolo()

void NodeView::toggleSolo ( const QModelIndex & index)

Definition at line 147 of file NodeView.cpp.

147 {
148 d->delegate.toggleSolo(index);
149}

References d.

◆ updateNode()

void NodeView::updateNode ( const QModelIndex & index)

Definition at line 142 of file NodeView.cpp.

143{
144 dataChanged(index, index);
145}
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles=QVector< int >()) override
Definition NodeView.cpp:274

References dataChanged().

◆ updateSelectedCheckboxColumn()

void NodeView::updateSelectedCheckboxColumn ( )
private

Definition at line 498 of file NodeView.cpp.

499{
500 KisConfig cfg(false);
501 if (cfg.useLayerSelectionCheckbox() == !header()->isSectionHidden(SELECTED_COL)) {
502 return;
503 }
504 header()->setSectionHidden(SELECTED_COL, !cfg.useLayerSelectionCheckbox());
505 // add/subtract width based on SELECTED_COL section's visibility
506 header()->resizeSection(DEFAULT_COL,
507 size().width()
508 + (cfg.useLayerSelectionCheckbox() ? header()->sectionSize(SELECTED_COL)
509 : -header()->sectionSize(SELECTED_COL)));
510}

References DEFAULT_COL, SELECTED_COL, and KisConfig::useLayerSelectionCheckbox().

◆ viewportEvent()

bool NodeView::viewportEvent ( QEvent * event)
overrideprotected

Definition at line 179 of file NodeView.cpp.

180{
181 if (model()) {
182 switch(e->type()) {
183 case QEvent::MouseButtonPress: {
185
186 const QPoint pos = static_cast<QMouseEvent*>(e)->pos();
187 d->lastPos = pos;
188
189 if (!indexAt(pos).isValid()) {
190 return QTreeView::viewportEvent(e);
191 }
192 QModelIndex index = model()->buddy(indexAt(pos));
193 if (d->delegate.editorEvent(e, model(), optionForIndex(index), index)) {
194 return true;
195 }
196 } break;
197 case QEvent::Leave: {
198 QEvent e(QEvent::Leave);
199 d->delegate.editorEvent(&e, model(), optionForIndex(d->hovered), d->hovered);
200 d->hovered = QModelIndex();
201 } break;
202 case QEvent::MouseMove: {
203#ifdef DRAG_WHILE_DRAG_WORKAROUND
204 if (d->isDragging) {
205 return false;
206 }
207#endif
208
209 const QPoint pos = static_cast<QMouseEvent*>(e)->pos();
210 QModelIndex hovered = indexAt(pos);
211 if (hovered != d->hovered) {
212 if (d->hovered.isValid()) {
213 QEvent e(QEvent::Leave);
214 d->delegate.editorEvent(&e, model(), optionForIndex(d->hovered), d->hovered);
215 }
216 if (hovered.isValid()) {
217 QEvent e(QEvent::Enter);
218 d->delegate.editorEvent(&e, model(), optionForIndex(hovered), hovered);
219 }
220 d->hovered = hovered;
221 }
222 /* This is a workaround for a bug in QTreeView that immediately begins a dragging action
223 when the mouse lands on the decoration/icon of a different index and moves 1 pixel or more */
224 Qt::MouseButtons buttons = static_cast<QMouseEvent*>(e)->buttons();
225 if ((Qt::LeftButton | Qt::MiddleButton) & buttons) {
226 if ((pos - d->lastPos).manhattanLength() > qApp->startDragDistance()) {
227 return QTreeView::viewportEvent(e);
228 }
229 return true;
230 }
231 } break;
232 case QEvent::ToolTip: {
233 const QPoint pos = static_cast<QHelpEvent*>(e)->pos();
234 if (!indexAt(pos).isValid()) {
235 return QTreeView::viewportEvent(e);
236 }
237 QModelIndex index = model()->buddy(indexAt(pos));
238 return d->delegate.editorEvent(e, model(), optionForIndex(index), index);
239 } break;
240 case QEvent::Resize: {
241 scheduleDelayedItemsLayout();
242 break;
243 }
244 default: break;
245 }
246 }
247 return QTreeView::viewportEvent(e);
248}
QStyleOptionViewItem optionForIndex(const QModelIndex &index) const
Definition NodeView.cpp:306
QPersistentModelIndex hovered
Definition NodeView.cpp:61
QString buttons(const T &ev)

References buttons(), d, DRAG_WHILE_DRAG_WORKAROUND_STOP, hovered, indexAt(), and optionForIndex().

Member Data Documentation

◆ d

Private* const NodeView::d
private

Definition at line 152 of file NodeView.h.

◆ delegate

NodeDelegate NodeView::delegate

Definition at line 60 of file NodeView.cpp.

◆ hovered

QPersistentModelIndex NodeView::hovered

Definition at line 61 of file NodeView.cpp.

◆ lastPos

QPoint NodeView::lastPos

Definition at line 62 of file NodeView.cpp.

◆ m_draggingFlag

bool NodeView::m_draggingFlag
private

Definition at line 146 of file NodeView.h.


The documentation for this class was generated from the following files: