예제 #1
0
void
ColorPickerLabel::mousePressEvent(QMouseEvent*)
{
    if (!_knob) {
        return;
    }
    _pickingEnabled = !_pickingEnabled;
    Q_EMIT pickingEnabled(_pickingEnabled);
    setColor(_currentColor); //< refresh the icon
}
예제 #2
0
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;
}
예제 #3
0
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
}
예제 #4
0
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;
}
예제 #5
0
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();
}