bool UIGChooserItemMachine::isDropAllowed(QGraphicsSceneDragDropEvent *pEvent, DragToken where) const { /* No drops while saving groups: */ if (model()->isGroupSavingInProgress()) return false; /* No drops for immutable item: */ if (isLockedMachine()) return false; /* Get mime: */ const QMimeData *pMimeData = pEvent->mimeData(); /* If drag token is shown, its up to parent to decide: */ if (where != DragToken_Off) return parentItem()->isDropAllowed(pEvent); /* Else we should make sure machine is accessible: */ if (!accessible()) return false; /* Else we should try to cast mime to known classes: */ if (pMimeData->hasFormat(UIGChooserItemMachine::className())) { /* Make sure passed item id is not ours: */ const UIGChooserItemMimeData *pCastedMimeData = qobject_cast<const UIGChooserItemMimeData*>(pMimeData); AssertMsg(pCastedMimeData, ("Can't cast passed mime-data to UIGChooserItemMimeData!")); UIGChooserItem *pItem = pCastedMimeData->item(); UIGChooserItemMachine *pMachineItem = pItem->toMachineItem(); /* Make sure passed machine is mutable: */ if (pMachineItem->isLockedMachine()) return false; return pMachineItem->id() != id(); } /* That was invalid mime: */ return false; }
void UIGChooserItemMachine::processDrop(QGraphicsSceneDragDropEvent *pEvent, UIGChooserItem *pFromWho, DragToken where) { /* Get mime: */ const QMimeData *pMime = pEvent->mimeData(); /* Make sure this handler called by this item (not by children): */ AssertMsg(!pFromWho && where == DragToken_Off, ("Machine graphics item do NOT support children!")); Q_UNUSED(pFromWho); Q_UNUSED(where); if (pMime->hasFormat(UIGChooserItemMachine::className())) { switch (pEvent->proposedAction()) { case Qt::MoveAction: case Qt::CopyAction: { /* Remember scene: */ UIGChooserModel *pModel = model(); /* Get passed item: */ const UIGChooserItemMimeData *pCastedMime = qobject_cast<const UIGChooserItemMimeData*>(pMime); AssertMsg(pCastedMime, ("Can't cast passed mime-data to UIGChooserItemMimeData!")); UIGChooserItem *pItem = pCastedMime->item(); /* Group passed item with current item into the new group: */ UIGChooserItemGroup *pNewGroupItem = new UIGChooserItemGroup(parentItem(), model()->uniqueGroupName(parentItem()), true); new UIGChooserItemMachine(pNewGroupItem, this); new UIGChooserItemMachine(pNewGroupItem, pItem->toMachineItem()); /* If proposed action is 'move': */ if (pEvent->proposedAction() == Qt::MoveAction) { /* Delete passed item: */ delete pItem; } /* Delete this item: */ delete this; /* Update model: */ pModel->updateGroupTree(); pModel->updateNavigation(); pModel->updateLayout(); pModel->setCurrentItem(pNewGroupItem); pModel->saveGroupSettings(); break; } default: break; } } }