forked from qt-creator/qt-creator
QmlDesigner: Fix navigator selection issue
* Fix navigator selection issue caused by clicking on icon columns of a locked item * Fix visibility icon in icon font * Remove redundant selection behavior call Change-Id: I03c97b22d92bcf0760b2b9ec627609624a0b3695 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
committed by
Henning Gründl
parent
fceaff1a6f
commit
f66e2f508f
Binary file not shown.
@@ -96,26 +96,75 @@ void IconCheckboxItemDelegate::paint(QPainter *painter,
|
|||||||
if (!(styleOption.state & QStyle::State_MouseOver) && !checked)
|
if (!(styleOption.state & QStyle::State_MouseOver) && !checked)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (rowIsPropertyRole(modelIndex.model(), modelIndex))
|
if (rowIsPropertyRole(modelIndex.model(), modelIndex) || getModelNode(modelIndex).isRootNode())
|
||||||
return; // Do not paint icons for property rows
|
return; // Do not paint icons for property rows or root node
|
||||||
|
|
||||||
if (!getModelNode(modelIndex).isRootNode()) {
|
|
||||||
QWindow *window = dynamic_cast<QWidget*>(painter->device())->window()->windowHandle();
|
QWindow *window = dynamic_cast<QWidget*>(painter->device())->window()->windowHandle();
|
||||||
QTC_ASSERT(window, return);
|
QTC_ASSERT(window, return);
|
||||||
|
|
||||||
const QRect iconRect(styleOption.rect.left() + 2, styleOption.rect.top() + 2, 16, 16);
|
const QSize iconSize(16, 16);
|
||||||
|
const QPoint iconPosition(styleOption.rect.left() + (styleOption.rect.width() - iconSize.width()) / 2,
|
||||||
|
styleOption.rect.top() + 2 + delegateMargin);
|
||||||
|
|
||||||
const QIcon &icon = isChecked(modelIndex) ? m_checkedIcon : m_uncheckedIcon;
|
const QIcon &icon = isChecked(modelIndex) ? m_checkedIcon : m_uncheckedIcon;
|
||||||
const QPixmap iconPixmap = icon.pixmap(window, iconRect.size());
|
const QPixmap iconPixmap = icon.pixmap(window, iconSize);
|
||||||
|
|
||||||
painter->save();
|
painter->save();
|
||||||
|
|
||||||
if (isThisOrAncestorLocked(modelIndex))
|
if (isThisOrAncestorLocked(modelIndex))
|
||||||
painter->setOpacity(0.5);
|
painter->setOpacity(0.5);
|
||||||
|
|
||||||
painter->drawPixmap(iconRect.topLeft() + QPoint(0, delegateMargin), iconPixmap);
|
painter->drawPixmap(iconPosition, iconPixmap);
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IconCheckboxItemDelegate::editorEvent(QEvent *event,
|
||||||
|
QAbstractItemModel *model,
|
||||||
|
const QStyleOptionViewItem &option,
|
||||||
|
const QModelIndex &index)
|
||||||
|
{
|
||||||
|
Q_ASSERT(event);
|
||||||
|
Q_ASSERT(model);
|
||||||
|
|
||||||
|
// make sure that the item is checkable
|
||||||
|
Qt::ItemFlags flags = model->flags(index);
|
||||||
|
if (!(flags & Qt::ItemIsUserCheckable) || !(option.state & QStyle::State_Enabled)
|
||||||
|
|| !(flags & Qt::ItemIsEnabled))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// make sure that we have a check state
|
||||||
|
QVariant value = index.data(Qt::CheckStateRole);
|
||||||
|
if (!value.isValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// make sure that we have the right event type
|
||||||
|
if ((event->type() == QEvent::MouseButtonRelease)
|
||||||
|
|| (event->type() == QEvent::MouseButtonDblClick)
|
||||||
|
|| (event->type() == QEvent::MouseButtonPress)) {
|
||||||
|
QMouseEvent *me = static_cast<QMouseEvent*>(event);
|
||||||
|
if (me->button() != Qt::LeftButton || !option.rect.contains(me->pos()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((event->type() == QEvent::MouseButtonPress)
|
||||||
|
|| (event->type() == QEvent::MouseButtonDblClick))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
} else if (event->type() == QEvent::KeyPress) {
|
||||||
|
if (static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space
|
||||||
|
&& static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select)
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::CheckState state = static_cast<Qt::CheckState>(value.toInt());
|
||||||
|
if (flags & Qt::ItemIsUserTristate)
|
||||||
|
state = ((Qt::CheckState)((state + 1) % 3));
|
||||||
|
else
|
||||||
|
state = (state == Qt::Checked) ? Qt::Unchecked : Qt::Checked;
|
||||||
|
return model->setData(index, state, Qt::CheckStateRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ public:
|
|||||||
const QStyleOptionViewItem &option,
|
const QStyleOptionViewItem &option,
|
||||||
const QModelIndex &index) const override;
|
const QModelIndex &index) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool editorEvent(QEvent *event,
|
||||||
|
QAbstractItemModel *model,
|
||||||
|
const QStyleOptionViewItem &option,
|
||||||
|
const QModelIndex &index) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QIcon m_checkedIcon;
|
const QIcon m_checkedIcon;
|
||||||
const QIcon m_uncheckedIcon;
|
const QIcon m_uncheckedIcon;
|
||||||
|
|||||||
@@ -278,19 +278,24 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ModelNode modelNode = modelNodeForIndex(index);
|
||||||
|
|
||||||
if (index.column() == ColumnType::Alias
|
if (index.column() == ColumnType::Alias
|
||||||
|| index.column() == ColumnType::Visibility
|
|| index.column() == ColumnType::Visibility
|
||||||
|| index.column() == ColumnType::Lock)
|
|| index.column() == ColumnType::Lock) {
|
||||||
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren;
|
if (ModelNode::isThisOrAncestorLocked(modelNode))
|
||||||
|
return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
|
||||||
|
else
|
||||||
|
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
|
||||||
|
}
|
||||||
|
|
||||||
const ModelNode modelNode = modelNodeForIndex(index);
|
|
||||||
if (ModelNode::isThisOrAncestorLocked(modelNode))
|
if (ModelNode::isThisOrAncestorLocked(modelNode))
|
||||||
return Qt::NoItemFlags;
|
return Qt::NoItemFlags;
|
||||||
|
|
||||||
if (index.column() == ColumnType::Name)
|
if (index.column() == ColumnType::Name)
|
||||||
return Qt::ItemIsEditable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled;
|
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled;
|
||||||
|
|
||||||
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren;
|
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
|
||||||
}
|
}
|
||||||
|
|
||||||
void static appendForcedNodes(const NodeListProperty &property, QList<ModelNode> &list)
|
void static appendForcedNodes(const NodeListProperty &property, QList<ModelNode> &list)
|
||||||
|
|||||||
@@ -145,7 +145,6 @@ void NavigatorView::modelAttached(Model *model)
|
|||||||
treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Visibility, 26);
|
treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Visibility, 26);
|
||||||
treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Lock, 26);
|
treeView->header()->resizeSection(NavigatorTreeModel::ColumnType::Lock, 26);
|
||||||
treeView->setIndentation(20);
|
treeView->setIndentation(20);
|
||||||
treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
||||||
|
|
||||||
m_currentModelInterface->setFilter(false);
|
m_currentModelInterface->setFilter(false);
|
||||||
|
|
||||||
|
|||||||
@@ -46,8 +46,8 @@
|
|||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
|
|
||||||
NavigatorWidget::NavigatorWidget(NavigatorView *view)
|
NavigatorWidget::NavigatorWidget(NavigatorView *view)
|
||||||
: m_treeView(new NavigatorTreeView),
|
: m_treeView(new NavigatorTreeView)
|
||||||
m_navigatorView(view)
|
, m_navigatorView(view)
|
||||||
{
|
{
|
||||||
m_treeView->setDragEnabled(true);
|
m_treeView->setDragEnabled(true);
|
||||||
m_treeView->setAcceptDrops(true);
|
m_treeView->setAcceptDrops(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user