Index: src/traverso/songcanvas/CurveView.cpp =================================================================== RCS file: /sources/traverso/traverso/src/traverso/songcanvas/CurveView.cpp,v retrieving revision 1.34 diff -u -r1.34 CurveView.cpp --- src/traverso/songcanvas/CurveView.cpp 21 Apr 2007 01:07:04 -0000 1.34 +++ src/traverso/songcanvas/CurveView.cpp 21 Apr 2007 06:51:20 -0000 @@ -23,6 +23,9 @@ #include "SongView.h" #include "CurveNodeView.h" #include "ClipsViewPort.h" +#include "AudioClip.h" +#include "AudioClipView.h" +#include "MoveClip.h" #include #include @@ -42,7 +45,7 @@ Q_CLASSINFO("move_down", tr("Move Down")); public: - DragNode(CurveNode* node, CurveView* curveview, int scalefactor, const QString& des); + DragNode(CurveNode* node, CurveView* curveview, int scalefactor, long min, long max, const QString& des); int prepare_actions(); int do_action(); @@ -58,6 +61,8 @@ int m_scalefactor; QPointF m_origPos; QPointF m_newPos; + long m_min; + long m_max; QPoint m_mousepos; public slots: @@ -69,10 +74,12 @@ #include "CurveView.moc" -DragNode::DragNode(CurveNode* node, CurveView* curveview, int scalefactor, const QString& des) +DragNode::DragNode(CurveNode* node, CurveView* curveview, int scalefactor, long min, long max, const QString& des) : Command(curveview->get_context(), des) { m_node = node; + m_min = min; + m_max = max; m_curveView = curveview; m_scalefactor = scalefactor; } @@ -105,6 +112,12 @@ int DragNode::do_action() { + if (m_newPos.x() < m_min) { + m_newPos.setX(m_min); + } else if (m_newPos.x() > m_max) { + m_newPos.setX(m_max); + } + m_node->set_when_and_value(m_newPos.x(), m_newPos.y()); return 1; } @@ -158,15 +171,16 @@ } -CurveView::CurveView(SongView* sv, ViewItem* parentViewItem, Curve* curve) - : ViewItem(parentViewItem, curve) +CurveView::CurveView(SongView* sv, AudioClipView* parent, Curve* curve) + : ViewItem(parent, curve) , m_curve(curve) { - setZValue(parentViewItem->zValue() + 1); + setZValue(parent->zValue() + 1); m_sv = sv; m_sv->scene()->addItem(this); - + m_acv = parent; + load_theme_data(); m_blinkColorDirection = 1; @@ -369,9 +383,9 @@ } -void CurveView::update_softselected_node( QPoint pos ) +void CurveView::update_softselected_node( QPoint pos , bool force) { - if (ie().is_holding()) { + if (ie().is_holding() && !force) { return; } @@ -393,12 +407,18 @@ m_blinkingNode = nodeView; } } + + if ((pos - QPoint(4, 4) - QPoint((int)m_blinkingNode->x(), (int)m_blinkingNode->y())).manhattanLength() > 10) { + m_blinkingNode = 0; + } if (prevNode && (prevNode != m_blinkingNode) ) { prevNode->set_color(themer()->get_color("CurveNode:default")); prevNode->update(); prevNode->decrease_size(); - m_blinkingNode->increase_size(); + if (m_blinkingNode) { + m_blinkingNode->increase_size(); + } } if (!prevNode && m_blinkingNode) { m_blinkingNode->increase_size(); @@ -459,11 +479,28 @@ Command* CurveView::drag_node() { PENTER; -/* QPoint pos(cpointer().on_first_input_event_scene_x(), cpointer().on_first_input_event_scene_y()); - update_softselected_node(pos);*/ + + // FIXME: How should this point be calculated? (breaks if not scroled to 0,0) + QPoint origPos(cpointer().on_first_input_event_x() - x() - parentItem()->x(), cpointer().on_first_input_event_y() - y() - parentItem()->y() - parentItem()->parentItem()->y()); + + update_softselected_node(origPos, true); if (m_blinkingNode) { - return new DragNode(m_blinkingNode->get_curve_node(), this, m_sv->scalefactor, tr("Drag Node")); + long min = 0; + long max = m_acv->get_clip()->get_length(); + QList* nodeList = m_curve->get_nodes(); + CurveNode* node = m_blinkingNode->get_curve_node(); + int index = nodeList->indexOf(node); + + if (index > 0) { + min = nodeList->at(index-1)->get_when() + 1; + } + if (nodeList->size() > index + 1) { + max = nodeList->at(index+1)->get_when() - 1; + } + return new DragNode(m_blinkingNode->get_curve_node(), this, m_sv->scalefactor, min, max, tr("Drag Node")); + } else { + return new MoveClip(m_acv, "move"); } return 0; } Index: src/traverso/songcanvas/CurveView.h =================================================================== RCS file: /sources/traverso/traverso/src/traverso/songcanvas/CurveView.h,v retrieving revision 1.7 diff -u -r1.7 CurveView.h --- src/traverso/songcanvas/CurveView.h 23 Feb 2007 13:54:33 -0000 1.7 +++ src/traverso/songcanvas/CurveView.h 21 Apr 2007 06:51:20 -0000 @@ -30,6 +30,7 @@ class Curve; class CurveNode; class CurveNodeView; +class AudioClipView; class QPoint; class CurveView : public ViewItem @@ -40,7 +41,7 @@ Q_CLASSINFO("drag_node", tr("Move node")) public: - CurveView(SongView* sv, ViewItem* parentViewItem, Curve* curve); + CurveView(SongView* sv, AudioClipView* parent, Curve* curve); ~CurveView(); enum {Type = UserType + 8}; @@ -58,6 +59,7 @@ void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); private: + AudioClipView* m_acv; Curve* m_curve; Curve* m_guicurve; QTimer m_blinkTimer; @@ -66,7 +68,7 @@ int m_blinkColorDirection; QList m_nodeViews; - void update_softselected_node(QPoint pos); + void update_softselected_node(QPoint pos, bool force = false); public slots: Command* add_node();