highlight operation on multiple items

This commit is contained in:
Miodrag Milanovic 2018-07-26 11:42:05 +02:00
parent f78a74b9cf
commit c9b9d9b227
2 changed files with 52 additions and 55 deletions

View File

@ -775,54 +775,55 @@ std::vector<DecalXY> DesignWidget::getDecals(ElementType type, IdString value)
return decals; return decals;
} }
void DesignWidget::updateHighlightGroup(QTreeWidgetItem *item, int group) void DesignWidget::updateHighlightGroup(QList<QTreeWidgetItem*> items, int group)
{ {
if (highlightSelected.contains(item)) { const bool shouldClear = items.size() == 1;
if (highlightSelected[item] == group) { for (auto item : items) {
highlightSelected.remove(item); if (highlightSelected.contains(item)) {
} else if (shouldClear && highlightSelected[item] == group) {
highlightSelected[item] = group; highlightSelected.remove(item);
} else }
highlightSelected.insert(item, group); else
highlightSelected[item] = group;
std::vector<DecalXY> decals; }
else
highlightSelected.insert(item, group);
}
std::vector<DecalXY> decals[8];
for (auto it : highlightSelected.toStdMap()) { for (auto it : highlightSelected.toStdMap()) {
if (it.second == group) { ElementType type = static_cast<ElementTreeItem *>(it.first)->getType();
ElementType type = static_cast<ElementTreeItem *>(it.first)->getType(); IdString value = static_cast<IdStringTreeItem *>(it.first)->getData();
IdString value = static_cast<IdStringTreeItem *>(it.first)->getData(); std::vector<DecalXY> d = getDecals(type, value);
std::vector<DecalXY> d = getDecals(type, value); std::move(d.begin(), d.end(), std::back_inserter(decals[it.second]));
std::move(d.begin(), d.end(), std::back_inserter(decals));
}
} }
for (int i=0;i<8;i++)
Q_EMIT highlight(decals, group); Q_EMIT highlight(decals[i], i);
} }
void DesignWidget::prepareMenuProperty(const QPoint &pos) void DesignWidget::prepareMenuProperty(const QPoint &pos)
{ {
QTreeWidget *tree = propertyEditor->treeWidget(); QTreeWidget *tree = propertyEditor->treeWidget();
QList<QTreeWidgetItem*> items;
itemContextMenu = tree->itemAt(pos); for (auto itemContextMenu : tree->selectedItems()) {
if (itemContextMenu->parent() == nullptr) QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu);
return; if (!browserItem)
continue;
QtBrowserItem *browserItem = propertyEditor->itemToBrowserItem(itemContextMenu); QtProperty *selectedProperty = browserItem->property();
if (!browserItem) ElementType type = getElementTypeByName(selectedProperty->propertyId());
return; if (type == ElementType::NONE)
QtProperty *selectedProperty = browserItem->property(); continue;
ElementType type = getElementTypeByName(selectedProperty->propertyId()); IdString value = ctx->id(selectedProperty->valueText().toStdString());
if (type == ElementType::NONE) items.append(nameToItem[getElementIndex(type)].value(value.c_str(ctx)));
return; }
IdString value = ctx->id(selectedProperty->valueText().toStdString()); int selectedIndex = -1;
if (items.size() == 1) {
QTreeWidgetItem *item = nameToItem[getElementIndex(type)].value(value.c_str(ctx)); QTreeWidgetItem *item = items.at(0);
if (highlightSelected.contains(item))
selectedIndex = highlightSelected[item];
}
QMenu menu(this); QMenu menu(this);
QAction *selectAction = new QAction("&Select", this);
connect(selectAction, &QAction::triggered, this, [this, type, value] { Q_EMIT selected(getDecals(type, value)); });
menu.addAction(selectAction);
QMenu *subMenu = menu.addMenu("Highlight"); QMenu *subMenu = menu.addMenu("Highlight");
QActionGroup *group = new QActionGroup(this); QActionGroup *group = new QActionGroup(this);
group->setExclusive(true); group->setExclusive(true);
@ -833,27 +834,24 @@ void DesignWidget::prepareMenuProperty(const QPoint &pos)
action->setCheckable(true); action->setCheckable(true);
subMenu->addAction(action); subMenu->addAction(action);
group->addAction(action); group->addAction(action);
if (highlightSelected.contains(item) && highlightSelected[item] == i) if (selectedIndex == i)
action->setChecked(true); action->setChecked(true);
connect(action, &QAction::triggered, this, [this, i, item] { updateHighlightGroup(item, i); }); connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); });
} }
menu.exec(tree->mapToGlobal(pos)); menu.exec(tree->mapToGlobal(pos));
} }
void DesignWidget::prepareMenuTree(const QPoint &pos) void DesignWidget::prepareMenuTree(const QPoint &pos)
{ {
QTreeWidget *tree = treeWidget; if (treeWidget->selectedItems().size() == 0)
itemContextMenu = tree->itemAt(pos);
ElementType type = static_cast<ElementTreeItem *>(itemContextMenu)->getType();
IdString value = static_cast<IdStringTreeItem *>(itemContextMenu)->getData();
if (type == ElementType::NONE)
return; return;
int selectedIndex = -1;
QTreeWidgetItem *item = nameToItem[getElementIndex(type)].value(value.c_str(ctx)); QList<QTreeWidgetItem*> items = treeWidget->selectedItems();
if (treeWidget->selectedItems().size() == 1) {
QTreeWidgetItem *item = treeWidget->selectedItems().at(0);
if (highlightSelected.contains(item))
selectedIndex = highlightSelected[item];
}
QMenu menu(this); QMenu menu(this);
QMenu *subMenu = menu.addMenu("Highlight"); QMenu *subMenu = menu.addMenu("Highlight");
QActionGroup *group = new QActionGroup(this); QActionGroup *group = new QActionGroup(this);
@ -865,11 +863,11 @@ void DesignWidget::prepareMenuTree(const QPoint &pos)
action->setCheckable(true); action->setCheckable(true);
subMenu->addAction(action); subMenu->addAction(action);
group->addAction(action); group->addAction(action);
if (highlightSelected.contains(item) && highlightSelected[item] == i) if (selectedIndex == i)
action->setChecked(true); action->setChecked(true);
connect(action, &QAction::triggered, this, [this, i, item] { updateHighlightGroup(item, i); }); connect(action, &QAction::triggered, this, [this, i, items] { updateHighlightGroup(items, i); });
} }
menu.exec(tree->mapToGlobal(pos)); menu.exec(treeWidget->mapToGlobal(pos));
} }
void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column) void DesignWidget::onItemDoubleClicked(QTreeWidgetItem *item, int column)

View File

@ -60,7 +60,7 @@ class DesignWidget : public QWidget
void updateButtons(); void updateButtons();
void addToHistory(QTreeWidgetItem *item); void addToHistory(QTreeWidgetItem *item);
std::vector<DecalXY> getDecals(ElementType type, IdString value); std::vector<DecalXY> getDecals(ElementType type, IdString value);
void updateHighlightGroup(QTreeWidgetItem *item, int group); void updateHighlightGroup(QList<QTreeWidgetItem*> item, int group);
Q_SIGNALS: Q_SIGNALS:
void info(std::string text); void info(std::string text);
void selected(std::vector<DecalXY> decal); void selected(std::vector<DecalXY> decal);
@ -85,7 +85,6 @@ class DesignWidget : public QWidget
QtGroupPropertyManager *groupManager; QtGroupPropertyManager *groupManager;
QtVariantEditorFactory *variantFactory; QtVariantEditorFactory *variantFactory;
QtTreePropertyBrowser *propertyEditor; QtTreePropertyBrowser *propertyEditor;
QTreeWidgetItem *itemContextMenu;
QMap<QtProperty *, QString> propertyToId; QMap<QtProperty *, QString> propertyToId;
QMap<QString, QtProperty *> idToProperty; QMap<QString, QtProperty *> idToProperty;