void ColorPickerLabel::mousePressEvent(QMouseEvent*) { if (!_knob) { return; } _pickingEnabled = !_pickingEnabled; Q_EMIT pickingEnabled(_pickingEnabled); setColor(_currentColor); //< refresh the icon }
bool PickingContainer::performMousePick(MouseEvent* e) { if (!pickingEnabled() || e->button() == MouseEvent::MOUSE_BUTTON_NONE) return false; if (touchPickingOn_) return true; if (e->state() == MouseEvent::MOUSE_STATE_RELEASE){ mouseIsDown_ = false; mousePickingOngoing_ = false; return false; } else if (!mouseIsDown_ || e->state() == MouseEvent::MOUSE_STATE_PRESS){ mouseIsDown_ = true; uvec2 coord = mousePosToPixelCoordinates(e->pos(), e->canvasSize()); prevMouseCoord_ = coord; mousePickObj_ = findPickingObject(coord); if (mousePickObj_) { mousePickingOngoing_ = true; mousePickObj_->setPickingPosition(normalizedCoordinates(coord)); mousePickObj_->setPickingDepth(e->depth()); mousePickObj_->setPickingMouseEvent(*e); mousePickObj_->setPickingMove(vec2(0.f, 0.f)); mousePickObj_->picked(); return true; } else{ mousePickingOngoing_ = false; return false; } } else if (e->state() == MouseEvent::MOUSE_STATE_MOVE){ if (mousePickingOngoing_){ uvec2 coord = mousePosToPixelCoordinates(e->pos(), e->canvasSize()); mousePickObj_->setPickingMove(pixelMoveVector(prevMouseCoord_, coord)); mousePickObj_->setPickingMouseEvent(*e); prevMouseCoord_ = coord; mousePickObj_->picked(); return true; } else return false; } return false; }
void ColorPickerLabel::mousePressEvent(QMouseEvent*) { if (_layout == KnobGui::eKnobLayoutTypeTableItemWidget) { _knob->showColorDialog(); return; } if (_simplified) { return; } _pickingEnabled = !_pickingEnabled; Q_EMIT pickingEnabled(_pickingEnabled); setColor(_currentColor); //< refresh the icon }
PickingObject* PickingContainer::findPickingObject(const uvec2& coord){ if (pickingEnabled() && src_) { const Layer* pickingLayer = src_->getPickingLayer(); if (pickingLayer) { const LayerRAM* pickingLayerRAM = pickingLayer->getRepresentation<LayerRAM>(); dvec4 value = pickingLayerRAM->getValueAsVec4Double(coord); dvec3 pickedColor = (value.a > 0.0 ? value.rgb() : dvec3(0.0)); uvec3 color(pickedColor*255.0); return PickingManager::getPtr()->getPickingObjectFromColor(color); } } return nullptr; }
bool PickingContainer::performTouchPick(TouchEvent* e) { if (!pickingEnabled()) return false; std::vector<TouchPoint>& touchPoints = e->getTouchPoints(); // Clear the picked touch point map pickedTouchPoints_.clear(); if (touchPoints.size() > 1 || touchPoints[0].state() != TouchPoint::TOUCH_STATE_ENDED) touchPickingOn_ = true; else touchPickingOn_ = false; std::unordered_map<int, PickingObject*>::iterator touchPickObjs_it; std::unordered_map<PickingObject*, std::vector<TouchPoint>>::iterator pickedTouchPoints_it; auto touchPoint = touchPoints.begin(); while (touchPoint != touchPoints.end()) { bool isAssociated = false; if (touchPoint->state() == TouchPoint::TOUCH_STATE_STARTED) { // Find out if new touch point is touching inside a picking object uvec2 coord = mousePosToPixelCoordinates(touchPoint->getPos(), e->canvasSize()); PickingObject* pickObj = findPickingObject(coord); // If it is, put it in the TouchIDPickingMap if (pickObj) { touchPickObjs_.insert(std::pair<int, PickingObject*>(touchPoint->getId(), pickObj)); // Associate touch point with picking object // which can already have other associated touch points. pickedTouchPoints_it = pickedTouchPoints_.find(pickObj); if (pickedTouchPoints_it != pickedTouchPoints_.end()){ pickedTouchPoints_it->second.push_back(*touchPoint); } else{ pickedTouchPoints_.insert(std::pair<PickingObject*, std::vector<TouchPoint>>(pickObj, std::vector<TouchPoint>{*touchPoint})); } isAssociated = true; } } else if (touchPoint->state() == TouchPoint::TOUCH_STATE_ENDED) { // Erase touch point from TouchIDPickingMap size_t numberOfErasedElements = touchPickObjs_.erase(touchPoint->getId()); isAssociated = (numberOfErasedElements > 0); } else { // Find out if touch point is in the TouchIDPickingMap // If it exists, associate touch point with picking object touchPickObjs_it = touchPickObjs_.find(touchPoint->getId()); if (touchPickObjs_it != touchPickObjs_.end()){ // Associate touch point with picking object // which can already have other associated touch points. pickedTouchPoints_it = pickedTouchPoints_.find(touchPickObjs_it->second); if (pickedTouchPoints_it != pickedTouchPoints_.end()){ pickedTouchPoints_it->second.push_back(*touchPoint); } else{ pickedTouchPoints_.insert(std::pair<PickingObject*, std::vector<TouchPoint>>(touchPickObjs_it->second, std::vector<TouchPoint>{*touchPoint})); } isAssociated = true; } } // Removed touch point from the actual event if it was associated with a picking object if (isAssociated) touchPoint = touchPoints.erase(touchPoint); else ++touchPoint; } // Build touch event for all picking objects with associated touch points for (pickedTouchPoints_it = pickedTouchPoints_.begin(); pickedTouchPoints_it != pickedTouchPoints_.end(); ++pickedTouchPoints_it){ // Treat one touch point the same as mouse event, for now if (pickedTouchPoints_it->second.size() == 1){ uvec2 coord = mousePosToPixelCoordinates(pickedTouchPoints_it->second[0].getPos(), e->canvasSize()); if (pickedTouchPoints_it->second[0].state() & TouchPoint::TOUCH_STATE_STARTED){ pickedTouchPoints_it->first->setPickingPosition(normalizedCoordinates(coord)); pickedTouchPoints_it->first->setPickingDepth(pickedTouchPoints_it->second[0].getDepth()); pickedTouchPoints_it->first->setPickingMove(vec2(0.f, 0.f)); } else{ uvec2 prevCoord = mousePosToPixelCoordinates(pickedTouchPoints_it->second[0].getPrevPos(), e->canvasSize()); pickedTouchPoints_it->first->setPickingMove(pixelMoveVector(prevCoord, coord)); } // One touch point is currently treated as mouse event as well... // So prepare for that prevMouseCoord_ = coord; mousePickObj_ = pickedTouchPoints_it->first; mousePickingOngoing_ = true; } pickedTouchPoints_it->first->setPickingTouchEvent(TouchEvent(pickedTouchPoints_it->second, e->canvasSize())); } // One touch point is currently treated as mouse event as well... // So prepare for that if (touchPoints.size() == 1){ prevMouseCoord_ = mousePosToPixelCoordinates(touchPoints[0].getPos(), e->canvasSize()); touchPickingOn_ = false; } // Mark all picking objects in TouchIDPickingMap as picked. for (touchPickObjs_it = touchPickObjs_.begin(); touchPickObjs_it != touchPickObjs_.end(); ++touchPickObjs_it) touchPickObjs_it->second->picked(); return !touchPickObjs_.empty(); }