void UIGSelectorItem::dragMoveEvent(QGraphicsSceneDragDropEvent *pEvent) { /* Make sure we are non-root: */ if (parentItem()) { /* Allow drag tokens only for the same item type as current: */ bool fAllowDragToken = false; if ((type() == UIGSelectorItemType_Group && pEvent->mimeData()->hasFormat(UIGSelectorItemGroup::className())) || (type() == UIGSelectorItemType_Machine && pEvent->mimeData()->hasFormat(UIGSelectorItemMachine::className()))) fAllowDragToken = true; /* Do we need a drag-token? */ if (fAllowDragToken) { QPoint p = pEvent->pos().toPoint(); if (p.y() < 10) setDragTokenPlace(DragToken_Up); else if (p.y() > minimumSizeHint().toSize().height() - 10) setDragTokenPlace(DragToken_Down); else setDragTokenPlace(DragToken_Off); } } /* Check if drop is allowed: */ pEvent->setAccepted(isDropAllowed(pEvent, dragTokenPlace())); }
void UIGSelectorItemMachine::resetDragToken() { /* Reset drag token for this item: */ if (dragTokenPlace() != DragToken_Off) { setDragTokenPlace(DragToken_Off); update(); } }
void UIGSelectorItem::dropEvent(QGraphicsSceneDragDropEvent *pEvent) { /* Do we have token active? */ switch (dragTokenPlace()) { case DragToken_Off: { /* Its our drop, processing: */ processDrop(pEvent); break; } default: { /* Its parent drop, passing: */ parentItem()->processDrop(pEvent, this, dragTokenPlace()); break; } } }
void UIGSelectorItemMachine::paint(QPainter *pPainter, const QStyleOptionGraphicsItem *pOption, QWidget * /* pWidget = 0 */) { /* Initialize some necessary variables: */ QRect fullRect = pOption->rect; int iMachineItemMargin = data(MachineItemData_MachineItemMargin).toInt(); int iMachineItemMajorSpacing = data(MachineItemData_MachineItemMajorSpacing).toInt(); int iMachineItemMinorSpacing = data(MachineItemData_MachineItemMinorSpacing).toInt(); int iMachineItemTextSpacing = data(MachineItemData_MachineItemTextSpacing).toInt(); QSize machinePixmapSize = data(MachineItemData_MachinePixmapSize).toSize(); QSize machineNameSize = data(MachineItemData_MachineNameSize).toSize(); QString strSnapshotName = data(MachineItemData_SnapshotName).toString(); QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize(); QSize machineStatePixmapSize = data(MachineItemData_MachineStatePixmapSize).toSize(); QSize machineStateTextSize = data(MachineItemData_MachineStateTextSize).toSize(); /* Paint background: */ paintBackground(/* Painter: */ pPainter, /* Rectangle to paint in: */ fullRect, /* Has parent? */ parentItem(), /* Is item selected? */ model()->selectionList().contains(this), /* Gradient darkness for animation: */ gradient(), /* Show drag where? */ dragTokenPlace()); /* Paint pixmap: */ paintPixmap(/* Painter: */ pPainter, /* Rectangle to paint in: */ QRect(fullRect.topLeft() + QPoint(iMachineItemMargin, iMachineItemMargin), machinePixmapSize), /* Pixmap to paint: */ data(MachineItemData_MachinePixmap).value<QIcon>().pixmap(machinePixmapSize)); /* Paint name: */ paintText(/* Painter: */ pPainter, /* Rectangle to paint in: */ QRect(fullRect.topLeft() + QPoint(iMachineItemMargin, iMachineItemMargin) + QPoint(machinePixmapSize.width() + iMachineItemMajorSpacing, 0), machineNameSize), /* Font to paint text: */ data(MachineItemData_MachineNameFont).value<QFont>(), /* Text to paint: */ data(MachineItemData_MachineName).toString()); /* Paint snapshot name (if necessary): */ if (!strSnapshotName.isEmpty()) paintText(/* Painter: */ pPainter, /* Rectangle to paint in: */ QRect(fullRect.topLeft() + QPoint(iMachineItemMargin, iMachineItemMargin) + QPoint(machinePixmapSize.width() + iMachineItemMajorSpacing, 0) + QPoint(machineNameSize.width() + iMachineItemMinorSpacing, 0), snapshotNameSize), /* Font to paint text: */ data(MachineItemData_SnapshotNameFont).value<QFont>(), /* Text to paint: */ QString("(%1)").arg(strSnapshotName)); /* Paint state pixmap: */ paintPixmap(/* Painter: */ pPainter, /* Rectangle to paint in: */ QRect(fullRect.topLeft() + QPoint(iMachineItemMargin, iMachineItemMargin) + QPoint(machinePixmapSize.width() + iMachineItemMajorSpacing, 0) + QPoint(0, machineNameSize.height() + iMachineItemTextSpacing), machineStatePixmapSize), /* Pixmap to paint: */ data(MachineItemData_MachineStatePixmap).value<QIcon>().pixmap(machineStatePixmapSize)); /* Paint state text: */ paintText(/* Painter: */ pPainter, /* Rectangle to paint in: */ QRect(fullRect.topLeft() + QPoint(iMachineItemMargin, iMachineItemMargin) + QPoint(machinePixmapSize.width() + iMachineItemMajorSpacing, 0) + QPoint(0, machineNameSize.height() + iMachineItemTextSpacing) + QPoint(machineStatePixmapSize.width() + iMachineItemMinorSpacing, 0), machineStateTextSize), /* Font to paint text: */ data(MachineItemData_MachineStateTextFont).value<QFont>(), /* Text to paint: */ data(MachineItemData_MachineStateText).toString()); /* Paint focus (if necessary): */ if (model()->focusItem() == this) paintFocus(/* Painter: */ pPainter, /* Rectangle to paint in: */ fullRect); }
void UIGChooserItemMachine::paintBackground(QPainter *pPainter, const QRect &rect) { /* Save painter: */ pPainter->save(); /* Prepare color: */ QPalette pal = palette(); /* Selection background: */ if (model()->selectionList().contains(this)) { /* Highlight color: */ QColor highlight = pal.color(QPalette::Highlight); /* Calculate top rectangle: */ QRect tRect = rect; tRect.setBottom(tRect.top() + tRect.height() / 3); /* Calculate bottom rectangle: */ QRect bRect = rect; bRect.setTop(bRect.bottom() - bRect.height() / 3); /* Calculate middle rectangle: */ QRect midRect = QRect(tRect.bottomLeft(), bRect.topRight()); /* Prepare top gradient: */ QLinearGradient tGradient(tRect.bottomLeft(), tRect.topLeft()); tGradient.setColorAt(1, highlight.darker(blackoutDarkness())); tGradient.setColorAt(0, highlight.darker(defaultDarkness())); /* Prepare bottom gradient: */ QLinearGradient bGradient(bRect.topLeft(), bRect.bottomLeft()); bGradient.setColorAt(0, highlight.darker(defaultDarkness())); bGradient.setColorAt(1, highlight.darker(blackoutDarkness())); /* Paint all the stuff: */ pPainter->fillRect(midRect, highlight.darker(defaultDarkness())); pPainter->fillRect(tRect, tGradient); pPainter->fillRect(bRect, bGradient); } /* Hovering background: */ if (isHovered()) { /* Choose color: */ QColor baseLight = model()->selectionList().contains(this) ? pal.color(QPalette::Active, QPalette::Highlight) : QColor(Qt::white); QColor blurBase = model()->selectionList().contains(this) ? pal.color(QPalette::Active, QPalette::Highlight) : QColor(Qt::white); if (!model()->selectionList().contains(this) && !parentItem()->isRoot()) blurBase = blurBase.darker(defaultDarkness()); blurBase.setAlpha(0); /* Draw background for blur: */ QImage background(rect.size(), QImage::Format_ARGB32); background.fill(blurBase.rgba()); /* Add blur itself: */ QPainter blurPainter(&background); blurPainter.setBrush(baseLight.darker(animationDarkness())); blurPainter.setPen(Qt::NoPen); blurPainter.drawRoundedRect(rect.adjusted(5, 5, -5, -5), 5, 5); blurPainter.end(); QImage bluredBackground(rect.size(), QImage::Format_ARGB32); blurImage(background, bluredBackground, 5); /* Paint highlight bar: */ pPainter->drawImage(QPoint(0, 0), bluredBackground); } /* Paint drag token UP? */ if (dragTokenPlace() != DragToken_Off) { /* Window color: */ QColor base = pal.color(QPalette::Active, model()->selectionList().contains(this) ? QPalette::Highlight : QPalette::Window); QLinearGradient dragTokenGradient; QRect dragTokenRect = rect; if (dragTokenPlace() == DragToken_Up) { dragTokenRect.setHeight(5); dragTokenGradient.setStart(dragTokenRect.bottomLeft()); dragTokenGradient.setFinalStop(dragTokenRect.topLeft()); } else if (dragTokenPlace() == DragToken_Down) { dragTokenRect.setTopLeft(dragTokenRect.bottomLeft() - QPoint(0, 5)); dragTokenGradient.setStart(dragTokenRect.topLeft()); dragTokenGradient.setFinalStop(dragTokenRect.bottomLeft()); } dragTokenGradient.setColorAt(0, base.darker(blackoutDarkness())); dragTokenGradient.setColorAt(1, base.darker(dragTokenDarkness())); pPainter->fillRect(dragTokenRect, dragTokenGradient); } /* Restore painter: */ pPainter->restore(); }