void ConnectionTool::mouseDoubleClickEvent(KoPointerEvent *event)
{
    if (m_editMode == EditConnectionPoint) {
        repaintDecorations();

        //quit EditConnectionPoint mode when double click blank region on canvas
        if (!m_currentShape) {
            resetEditMode();
            return;
        }

        //add connection point when double click a shape
        //remove connection point when double click a existed connection point
        int handleId = handleAtPoint(m_currentShape, event->point);
        if (handleId < 0) {
            QPointF mousePos = canvas()->snapGuide()->snap(event->point, event->modifiers());
            QPointF point = m_currentShape->documentToShape(mousePos);
            canvas()->addCommand(new AddConnectionPointCommand(m_currentShape, point));
        } else {
            canvas()->addCommand(new RemoveConnectionPointCommand(m_currentShape, handleId));
        }
        setEditMode(m_editMode, m_currentShape, -1);
    } else {
        //deactivate connection tool when double click blank region on canvas
        KoShape *hitShape = findShapeAtPosition(event->point);
        if (!hitShape) {
            deactivate();
            emit done();
        } else if (dynamic_cast<KoConnectionShape*>(hitShape)) {
            repaintDecorations();
            setEditMode(EditConnection, m_currentShape, -1);
            //TODO: temporarily activate text tool to edit connection path
        }
    }
}
void ConnectionTool::deactivate()
{
    // Put everything to 0 to be able to begin a new shape properly
    delete m_currentStrategy;
    m_currentStrategy = 0;
    resetEditMode();
    m_resetPaint = true;
    repaintDecorations();
    // restore previously set snap strategies
    canvas()->snapGuide()->enableSnapStrategies(m_oldSnapStrategies);
    canvas()->snapGuide()->reset();
}
ConnectionTool::ConnectionTool(KoCanvasBase * canvas)
    : KoToolBase(canvas)
    , m_editMode(Idle)
    , m_connectionType(KoConnectionShape::Standard)
    , m_currentShape(0)
    , m_activeHandle(-1)
    , m_currentStrategy(0)
    , m_oldSnapStrategies(0)
    , m_resetPaint(true)
{
    QPixmap connectPixmap;
    connectPixmap.load(KStandardDirs::locate("data", "calligra/icons/cursor_connect.png"));
    m_connectCursor = QCursor(connectPixmap, 4, 1);

    m_editConnectionPoint = new KAction(i18n("Edit connection points"), this);
    m_editConnectionPoint->setCheckable(true);
    addAction("toggle-edit-mode", m_editConnectionPoint);

    m_alignPercent = new KAction(QString("%"), this);
    m_alignPercent->setCheckable(true);
    addAction("align-relative", m_alignPercent);
    m_alignLeft = new KAction(koIcon("align-horizontal-left"), i18n("Align to left edge"), this);
    m_alignLeft->setCheckable(true);
    addAction("align-left", m_alignLeft);
    m_alignCenterH = new KAction(koIcon("align-horizontal-center"), i18n("Align to horizontal center"), this);
    m_alignCenterH->setCheckable(true);
    addAction("align-centerh", m_alignCenterH);
    m_alignRight = new KAction(koIcon("align-horizontal-right"), i18n("Align to right edge"), this);
    m_alignRight->setCheckable(true);
    addAction("align-right", m_alignRight);
    m_alignTop = new KAction(koIcon("align-vertical-top"), i18n("Align to top edge"), this);
    m_alignTop->setCheckable(true);
    addAction("align-top", m_alignTop);
    m_alignCenterV = new KAction(koIcon("align-vertical-center"), i18n("Align to vertical center"), this);
    m_alignCenterV->setCheckable(true);
    addAction("align-centerv", m_alignCenterV);
    m_alignBottom = new KAction(koIcon("align-vertical-bottom"), i18n("Align to bottom edge"), this);
    m_alignBottom->setCheckable(true);
    addAction("align-bottom", m_alignBottom);

    m_escapeAll = new KAction(koIcon("escape-direction-all"), i18n("Escape in all directions"), this);
    m_escapeAll->setCheckable(true);
    addAction("escape-all", m_escapeAll);
    m_escapeHorizontal = new KAction(koIcon("escape-direction-horizontal"), i18n("Escape in horizontal directions"), this);
    m_escapeHorizontal->setCheckable(true);
    addAction("escape-horizontal", m_escapeHorizontal);
    m_escapeVertical = new KAction(koIcon("escape-direction-vertical"), i18n("Escape in vertical directions"), this);
    m_escapeVertical->setCheckable(true);
    addAction("escape-vertical", m_escapeVertical);
    m_escapeLeft = new KAction(koIcon("escape-direction-left"), i18n("Escape in left direction"), this);
    m_escapeLeft->setCheckable(true);
    addAction("escape-left", m_escapeLeft);
    m_escapeRight = new KAction(koIcon("escape-direction-right"), i18n("Escape in right direction"), this);
    m_escapeRight->setCheckable(true);
    addAction("escape-right", m_escapeRight);
    m_escapeUp = new KAction(koIcon("escape-direction-up"), i18n("Escape in up direction"), this);
    m_escapeUp->setCheckable(true);
    addAction("escape-up", m_escapeUp);
    m_escapeDown = new KAction(koIcon("escape-direction-down"), i18n("Escape in down direction"), this);
    m_escapeDown->setCheckable(true);
    addAction("escape-down", m_escapeDown);

    m_alignHorizontal = new QActionGroup(this);
    m_alignHorizontal->setExclusive(true);
    m_alignHorizontal->addAction(m_alignLeft);
    m_alignHorizontal->addAction(m_alignCenterH);
    m_alignHorizontal->addAction(m_alignRight);
    connect(m_alignHorizontal, SIGNAL(triggered(QAction*)), this, SLOT(horizontalAlignChanged()));

    m_alignVertical = new QActionGroup(this);
    m_alignVertical->setExclusive(true);
    m_alignVertical->addAction(m_alignTop);
    m_alignVertical->addAction(m_alignCenterV);
    m_alignVertical->addAction(m_alignBottom);
    connect(m_alignVertical, SIGNAL(triggered(QAction*)), this, SLOT(verticalAlignChanged()));

    m_alignRelative = new QActionGroup(this);
    m_alignRelative->setExclusive(true);
    m_alignRelative->addAction(m_alignPercent);
    connect(m_alignRelative, SIGNAL(triggered(QAction*)), this, SLOT(relativeAlignChanged()));

    m_escapeDirections = new QActionGroup(this);
    m_escapeDirections->setExclusive(true);
    m_escapeDirections->addAction(m_escapeAll);
    m_escapeDirections->addAction(m_escapeHorizontal);
    m_escapeDirections->addAction(m_escapeVertical);
    m_escapeDirections->addAction(m_escapeLeft);
    m_escapeDirections->addAction(m_escapeRight);
    m_escapeDirections->addAction(m_escapeUp);
    m_escapeDirections->addAction(m_escapeDown);
    connect(m_escapeDirections, SIGNAL(triggered(QAction*)), this, SLOT(escapeDirectionChanged()));

    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignHorizontal, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignVertical, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignRelative, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_escapeDirections, SLOT(setEnabled(bool)));

    resetEditMode();
}
void ConnectionTool::mousePressEvent(KoPointerEvent * event)
{

    if (!m_currentShape) {
        return;
    }

    KoShape * hitShape = findShapeAtPosition(event->point);
    int hitHandle = handleAtPoint(m_currentShape, event->point);

    if (m_editMode == EditConnection && hitHandle >= 0) {
        // create connection handle change strategy
        m_currentStrategy = new KoPathConnectionPointStrategy(this, dynamic_cast<KoConnectionShape*>(m_currentShape), hitHandle);
    } else if (m_editMode == EditConnectionPoint) {
        if (hitHandle >= KoConnectionPoint::FirstCustomConnectionPoint) {
            // start moving custom connection point
            m_currentStrategy = new MoveConnectionPointStrategy(m_currentShape, hitHandle, this);
        }
    } else if (m_editMode == CreateConnection) {
        // create new connection shape, connect it to the active connection point
        // and start editing the new connection
        // create the new connection shape
        KoShapeFactoryBase *factory = KoShapeRegistry::instance()->value("KoConnectionShape");
        KoShape *shape = factory->createDefaultShape(canvas()->shapeController()->resourceManager());
        KoConnectionShape * connectionShape = dynamic_cast<KoConnectionShape*>(shape);
        if (!connectionShape) {
            delete shape;
            resetEditMode();
            return;
        }
        //set connection type
        connectionShape->setType(m_connectionType);
        // get the position of the connection point we start our connection from
        QPointF cp = m_currentShape->shapeToDocument(m_currentShape->connectionPoint(m_activeHandle).position);
        // move both handles to that point
        connectionShape->moveHandle(0, cp);
        connectionShape->moveHandle(1, cp);
        // connect the first handle of the connection shape to our connection point
        if (!connectionShape->connectFirst(m_currentShape, m_activeHandle)) {
            delete shape;
            resetEditMode();
            return;
        }
        //add connector label
        connectionShape->createTextShape(canvas()->shapeController()->resourceManager());
        connectionShape->setPlainText("");
        // create the connection edit strategy from the path tool
        m_currentStrategy = new KoPathConnectionPointStrategy(this, connectionShape, 1);
        if (!m_currentStrategy) {
            delete shape;
            resetEditMode();
            return;
        }
        // update our handle data
        setEditMode(m_editMode, shape, 1);
        // add connection shape to the shape manager so it gets painted
        canvas()->shapeManager()->addShape(connectionShape);
    } else {
        // pressing on a shape in idle mode switches to corresponding edit mode
        if (hitShape) {
            if (dynamic_cast<KoConnectionShape*>(hitShape)) {
                int hitHandle = handleAtPoint(hitShape, event->point);
                setEditMode(EditConnection, hitShape, hitHandle);
                if (hitHandle >= 0) {
                    // start editing connection shape
                    m_currentStrategy = new KoPathConnectionPointStrategy(this, dynamic_cast<KoConnectionShape*>(m_currentShape), m_activeHandle);
                }
            }
        } else {
            resetEditMode();
        }
    }
}
Beispiel #5
0
ConnectionTool::ConnectionTool(KoCanvasBase * canvas)
    : KoToolBase(canvas)
    , m_editMode(Idle)
    , m_connectionType(KoConnectionShape::Standard)
    , m_currentShape(0)
    , m_activeHandle(-1)
    , m_currentStrategy(0)
    , m_oldSnapStrategies(0)
    , m_resetPaint(true)
{
    QPixmap connectPixmap;
    connectPixmap.load(":/cursor_connect.png");
    m_connectCursor = QCursor(connectPixmap, 4, 1);

    KisActionRegistry * actionRegistry = KisActionRegistry::instance();
    m_editConnectionPoint = actionRegistry->makeQAction("toggle-edit-mode", this);
    m_editConnectionPoint->setCheckable(true);
    addAction("toggle-edit-mode", m_editConnectionPoint);

    m_alignPercent = actionRegistry->makeQAction("align-relative", this);
    m_alignPercent->setCheckable(true);
    addAction("align-relative", m_alignPercent);
    m_alignLeft = actionRegistry->makeQAction("align-left", this);
    m_alignLeft->setCheckable(true);
    addAction("align-left", m_alignLeft);
    m_alignCenterH = actionRegistry->makeQAction("align-centerh", this);
    m_alignCenterH->setCheckable(true);
    addAction("align-centerh", m_alignCenterH);
    m_alignRight = actionRegistry->makeQAction("align-right", this);
    m_alignRight->setCheckable(true);
    addAction("align-right", m_alignRight);
    m_alignTop = actionRegistry->makeQAction("align-top", this);
    m_alignTop->setCheckable(true);
    addAction("align-top", m_alignTop);
    m_alignCenterV = actionRegistry->makeQAction("align-centerv", this);
    m_alignCenterV->setCheckable(true);
    addAction("align-centerv", m_alignCenterV);
    m_alignBottom = actionRegistry->makeQAction("align-bottom", this);
    m_alignBottom->setCheckable(true);
    addAction("align-bottom", m_alignBottom);

    m_escapeAll = actionRegistry->makeQAction("escape-all", this);
    m_escapeAll->setCheckable(true);
    addAction("escape-all", m_escapeAll);
    m_escapeHorizontal = actionRegistry->makeQAction("escape-horizontal", this);
    m_escapeHorizontal->setCheckable(true);
    addAction("escape-horizontal", m_escapeHorizontal);
    m_escapeVertical = actionRegistry->makeQAction("escape-vertical", this);
    m_escapeVertical->setCheckable(true);
    addAction("escape-vertical", m_escapeVertical);
    m_escapeLeft = actionRegistry->makeQAction("escape-left", this);
    m_escapeLeft->setCheckable(true);
    addAction("escape-left", m_escapeLeft);
    m_escapeRight = actionRegistry->makeQAction("escape-right", this);
    m_escapeRight->setCheckable(true);
    addAction("escape-right", m_escapeRight);
    m_escapeUp = actionRegistry->makeQAction("escape-up", this);
    m_escapeUp->setCheckable(true);
    addAction("escape-up", m_escapeUp);
    m_escapeDown = actionRegistry->makeQAction("escape-down", this);
    m_escapeDown->setCheckable(true);
    addAction("escape-down", m_escapeDown);

    m_alignHorizontal = new QActionGroup(this);
    m_alignHorizontal->setExclusive(true);
    m_alignHorizontal->addAction(m_alignLeft);
    m_alignHorizontal->addAction(m_alignCenterH);
    m_alignHorizontal->addAction(m_alignRight);
    connect(m_alignHorizontal, SIGNAL(triggered(QAction*)), this, SLOT(horizontalAlignChanged()));

    m_alignVertical = new QActionGroup(this);
    m_alignVertical->setExclusive(true);
    m_alignVertical->addAction(m_alignTop);
    m_alignVertical->addAction(m_alignCenterV);
    m_alignVertical->addAction(m_alignBottom);
    connect(m_alignVertical, SIGNAL(triggered(QAction*)), this, SLOT(verticalAlignChanged()));

    m_alignRelative = new QActionGroup(this);
    m_alignRelative->setExclusive(true);
    m_alignRelative->addAction(m_alignPercent);
    connect(m_alignRelative, SIGNAL(triggered(QAction*)), this, SLOT(relativeAlignChanged()));

    m_escapeDirections = new QActionGroup(this);
    m_escapeDirections->setExclusive(true);
    m_escapeDirections->addAction(m_escapeAll);
    m_escapeDirections->addAction(m_escapeHorizontal);
    m_escapeDirections->addAction(m_escapeVertical);
    m_escapeDirections->addAction(m_escapeLeft);
    m_escapeDirections->addAction(m_escapeRight);
    m_escapeDirections->addAction(m_escapeUp);
    m_escapeDirections->addAction(m_escapeDown);
    connect(m_escapeDirections, SIGNAL(triggered(QAction*)), this, SLOT(escapeDirectionChanged()));

    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignHorizontal, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignVertical, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_alignRelative, SLOT(setEnabled(bool)));
    connect(this, SIGNAL(connectionPointEnabled(bool)), m_escapeDirections, SLOT(setEnabled(bool)));

    resetEditMode();
}