bool UIGChooserHandlerMouse::handleMousePress(QGraphicsSceneMouseEvent *pEvent) const { /* Get item under mouse cursor: */ QPointF scenePos = pEvent->scenePos(); if (QGraphicsItem *pItemUnderMouse = model()->itemAt(scenePos)) { /* Which button it was? */ switch (pEvent->button()) { /* Left one? */ case Qt::LeftButton: { /* Which item we just clicked? */ UIGChooserItem *pClickedItem = 0; /* Was that a group item? */ if (UIGChooserItemGroup *pGroupItem = qgraphicsitem_cast<UIGChooserItemGroup*>(pItemUnderMouse)) pClickedItem = pGroupItem; /* Or a machine one? */ else if (UIGChooserItemMachine *pMachineItem = qgraphicsitem_cast<UIGChooserItemMachine*>(pItemUnderMouse)) pClickedItem = pMachineItem; /* If we had clicked one of required item types: */ if (pClickedItem && !pClickedItem->isRoot()) { /* Was 'shift' modifier pressed? */ if (pEvent->modifiers() == Qt::ShiftModifier) { /* Calculate positions: */ UIGChooserItem *pFirstItem = model()->currentItem(); int iFirstPosition = model()->navigationList().indexOf(pFirstItem); int iClickedPosition = model()->navigationList().indexOf(pClickedItem); /* Populate list of items from 'first' to 'clicked': */ QList<UIGChooserItem*> items; if (iFirstPosition <= iClickedPosition) for (int i = iFirstPosition; i <= iClickedPosition; ++i) items << model()->navigationList().at(i); else for (int i = iFirstPosition; i >= iClickedPosition; --i) items << model()->navigationList().at(i); /* Set that list as current: */ model()->setCurrentItems(items); /* Move focus to clicked item: */ model()->setFocusItem(pClickedItem); } /* Was 'control' modifier pressed? */ else if (pEvent->modifiers() == Qt::ControlModifier) { /* Invert selection state for clicked item: */ if (model()->currentItems().contains(pClickedItem)) model()->removeFromCurrentItems(pClickedItem); else model()->addToCurrentItems(pClickedItem); /* Move focus to clicked item: */ model()->setFocusItem(pClickedItem); } /* Was no modifiers pressed? */ else if (pEvent->modifiers() == Qt::NoModifier) { /* Make clicked item the current one: */ model()->setCurrentItem(pClickedItem); } } break; } /* Right one? */ case Qt::RightButton: { /* Which item we just clicked? */ UIGChooserItem *pClickedItem = 0; /* Was that a group item? */ if (UIGChooserItemGroup *pGroupItem = qgraphicsitem_cast<UIGChooserItemGroup*>(pItemUnderMouse)) pClickedItem = pGroupItem; /* Or a machine one? */ else if (UIGChooserItemMachine *pMachineItem = qgraphicsitem_cast<UIGChooserItemMachine*>(pItemUnderMouse)) pClickedItem = pMachineItem; /* If we had clicked one of required item types: */ if (pClickedItem && !pClickedItem->isRoot()) { /* Select clicked item if not selected yet: */ if (!model()->currentItems().contains(pClickedItem)) model()->setCurrentItem(pClickedItem); } break; } default: break; } } /* Pass all other events: */ return false; }
bool UIGChooserHandlerMouse::handleMousePress(QGraphicsSceneMouseEvent *pEvent) const { /* Get item under mouse cursor: */ QPointF scenePos = pEvent->scenePos(); if (QGraphicsItem *pItemUnderMouse = model()->itemAt(scenePos)) { /* Which button it was? */ switch (pEvent->button()) { /* Left one? */ case Qt::LeftButton: { /* Which item we just clicked? */ UIGChooserItem *pClickedItem = 0; /* Was that a group item? */ if (UIGChooserItemGroup *pGroupItem = qgraphicsitem_cast<UIGChooserItemGroup*>(pItemUnderMouse)) pClickedItem = pGroupItem; /* Or a machine one? */ else if (UIGChooserItemMachine *pMachineItem = qgraphicsitem_cast<UIGChooserItemMachine*>(pItemUnderMouse)) pClickedItem = pMachineItem; /* If we had clicked one of the required item types: */ if (pClickedItem && !pClickedItem->isRoot()) { /* Old selection list: */ QList<UIGChooserItem*> oldSelectionList = model()->selectionList(); /* Move focus to clicked item: */ model()->setFocusItem(pClickedItem); /* Was 'shift' modifier pressed? */ if (pEvent->modifiers() == Qt::ShiftModifier) { /* Calculate positions: */ UIGChooserItem *pFirstItem = model()->selectionList().first(); int iFirstPosition = model()->navigationList().indexOf(pFirstItem); int iClickedPosition = model()->navigationList().indexOf(pClickedItem); /* Clear selection: */ model()->clearSelectionList(); /* Select all the items from 'first' to 'clicked': */ if (iFirstPosition <= iClickedPosition) for (int i = iFirstPosition; i <= iClickedPosition; ++i) model()->addToSelectionList(model()->navigationList().at(i)); else for (int i = iFirstPosition; i >= iClickedPosition; --i) model()->addToSelectionList(model()->navigationList().at(i)); } /* Was 'control' modifier pressed? */ else if (pEvent->modifiers() == Qt::ControlModifier) { /* Select clicked item, inverting if necessary: */ if (model()->selectionList().contains(pClickedItem)) model()->removeFromSelectionList(pClickedItem); else model()->addToSelectionList(pClickedItem); } /* Was no modifiers pressed? */ else if (pEvent->modifiers() == Qt::NoModifier) { /* Move selection to clicked item: */ model()->clearSelectionList(); model()->addToSelectionList(pClickedItem); } /* Selection list changed?: */ if (oldSelectionList != model()->selectionList()) model()->notifySelectionChanged(); } break; } /* Right one? */ case Qt::RightButton: { /* Which item we just clicked? */ UIGChooserItem *pClickedItem = 0; /* Was that a group item? */ if (UIGChooserItemGroup *pGroupItem = qgraphicsitem_cast<UIGChooserItemGroup*>(pItemUnderMouse)) pClickedItem = pGroupItem; /* Or a machine one? */ else if (UIGChooserItemMachine *pMachineItem = qgraphicsitem_cast<UIGChooserItemMachine*>(pItemUnderMouse)) pClickedItem = pMachineItem; /* If we had clicked one of the required item types: */ if (pClickedItem) { /* For non-root items: */ if (!pClickedItem->isRoot()) { /* Is clicked item in selection list: */ bool fIsClickedItemInSelectionList = contains(model()->selectionList(), pClickedItem); /* Move focus to clicked item (with selection if not selected yet): */ model()->setFocusItem(pClickedItem, !fIsClickedItemInSelectionList); } } break; } default: break; } } /* Pass all other events: */ return false; }