monday2000
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Я смог подправить свою фичу "двигание всей синей линии за крайнюю красную точку" - убрал вариант с Caps Lock и сделал-таки через нажатый Ctrl. Мне помог Tulon - он мне практически всё объяснил, что и как делать. Вот исправления в исходном коде: Код: C:\build\scantailor-0.9.11.1\interaction\DraggableObject.h class DraggableObject { public: ......... virtual void dragContinuation(QPointF const& mouse_pos) { m_dragContinuationCallback(mouse_pos); } // добавляем перегруженную функцию - с маской нажатого Ctrl virtual void dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask) {} ......... } C:\build\scantailor-0.9.11.1\interaction\DraggablePoint.h class DraggablePoint : public DraggableObject { public: ........ typedef boost::function< //void (QPointF const&) void (QPointF const&, Qt::KeyboardModifiers mask) > MoveRequestCallback; ............ //virtual void dragContinuation(QPointF const& mouse_pos); virtual void dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask); ........... protected: ............ //virtual void pointMoveRequest(QPointF const& widget_pos) { virtual void pointMoveRequest(QPointF const& widget_pos, Qt::KeyboardModifiers mask) { //m_moveRequestCallback(widget_pos); m_moveRequestCallback(widget_pos, mask); } .......... } C:\build\scantailor-0.9.11.1\interaction\DraggablePoint.cpp void //DraggablePoint::dragContinuation(QPointF const& mouse_pos) DraggablePoint::dragContinuation(QPointF const& mouse_pos, Qt::KeyboardModifiers mask) { //pointMoveRequest(mouse_pos + m_pointRelativeToMouse); pointMoveRequest(mouse_pos + m_pointRelativeToMouse, mask); } C:\build\scantailor-0.9.11.1\interaction\ObjectDragHandler.cpp void ObjectDragHandler::onMouseMoveEvent( QMouseEvent* event, InteractionState& interaction) { if (interaction.capturedBy(m_interaction)) { //m_pObj->dragContinuation(QPointF(0.5, 0.5) + event->pos()); m_pObj->dragContinuation(QPointF(0.5, 0.5) + event->pos(), event->modifiers()); } } C:\build\scantailor-0.9.11.1\interaction\InteractiveXSpline.h class InteractiveXSpline : public InteractionHandler { ........... private: ........... //void controlPointMoveRequest(int idx, QPointF const& pos); void controlPointMoveRequest(int idx, QPointF const& pos, Qt::KeyboardModifiers mask); ........... } C:\build\scantailor-0.9.11.1\interaction\InteractiveXSpline.cpp void InteractiveXSpline::setSpline(XSpline const& spline) { .......... new_control_points[i].point.setMoveRequestCallback( //boost::bind(&InteractiveXSpline::controlPointMoveRequest, this, i, _1) boost::bind(&InteractiveXSpline::controlPointMoveRequest, this, i, _1, _2) // это самое сложное место - но мне его Tulon подсказал .......... } void //InteractiveXSpline::controlPointMoveRequest(int idx, QPointF const& pos) InteractiveXSpline::controlPointMoveRequest(int idx, QPointF const& pos, Qt::KeyboardModifiers mask) { ........ (mc(mat, 2, 2)*mc(pt, 2, 1)).write(pt); //m_spline.moveControlPoint(i, pt + origin); // original line - now commented //начало добавления if (mask != Qt::ControlModifier) // default behavior m_spline.moveControlPoint(i, pt + origin); else // Control key is currently pressed { Vec2d shift_y = storage_pt - old_pos; QPointF new_position = m_spline.controlPointPosition(i) + shift_y; new_position.setX(m_spline.controlPointPosition(i).x()); m_spline.moveControlPoint(i, new_position); } //конец добавления } } else { ......... } | А вот и собранный мною СТ с этой фичей: http://rghost.ru/42925385 (4,5 МБ) Работает это так: В окне dewarping, там, где синяя сетка, можно, нажав и удерживая Ctrl, двигать за крайнюю красную точку всю её горизонтальную синюю линию. Это даёт небольшое удобство при ручном dewarping. | Всего записей: 2841 | Зарегистр. 13-01-2005 | Отправлено: 22:40 11-01-2013 | Исправлено: monday2000, 16:50 13-01-2013 |
|