diff --git a/src/libs/qmleditorwidgets/gradientline.cpp b/src/libs/qmleditorwidgets/gradientline.cpp
index 2c6b9f8c937cd4ab679e63d7f8b3952a9e7c6250..66b1821718481cfe9207d71492da713aadb3f194 100644
--- a/src/libs/qmleditorwidgets/gradientline.cpp
+++ b/src/libs/qmleditorwidgets/gradientline.cpp
@@ -193,6 +193,8 @@ void GradientLine::paintEvent(QPaintEvent *event)
             int pos = qreal((width() - 16)) * m_stops.at(i) + 9;
             p.setBrush(arrowColor);
             QVector<QPointF> points;
+            if (localYOffset < -8)
+                p.setOpacity(0.5);
             points.append(QPointF(pos + 0.5, 28.5 + localYOffset)); //triangle
             points.append(QPointF(pos - 3.5, 22.5 + localYOffset));
             points.append(QPointF(pos + 4.5, 22.5 + localYOffset));
@@ -210,6 +212,7 @@ void GradientLine::paintEvent(QPaintEvent *event)
             p.setBrush(Qt::NoBrush);
             p.setPen(QColor(255, 255, 255, 30));
             p.drawRect(pos - 4, 9 + localYOffset, 8, 9);
+            p.setOpacity(1);
         }
     }
 }
@@ -220,6 +223,7 @@ void GradientLine::mousePressEvent(QMouseEvent *event)
         event->accept();
         int xPos = event->pos().x();
         int yPos = event->pos().y();
+        m_dragStart = event->pos();
 
         int draggedIndex = -1;
         m_create = false;
@@ -227,10 +231,9 @@ void GradientLine::mousePressEvent(QMouseEvent *event)
         if ((yPos > 10) && (yPos < 30))
             for (int i =0; i < m_stops.size(); i++) {
             int pos = qreal((width() - 16)) * m_stops.at(i) + 9;
-            if (((xPos + 5) > pos) && ((xPos - 5) < pos)) {
+            if (((xPos + 8) > pos) && ((xPos - 8) < pos)) {
                 draggedIndex = i;
                 m_dragActive = true;
-                m_dragStart = event->pos();
                 setCurrentIndex(draggedIndex);
                 update();
             }
@@ -253,6 +256,22 @@ void GradientLine::mouseReleaseEvent(QMouseEvent *event)
 {
     if (event->button() == Qt::LeftButton) {
         event->accept();
+
+        if (m_dragActive) {
+            m_yOffset += event->pos().y() - 14;
+            if (m_yOffset > 0) {
+                m_yOffset = 0;
+            } else if ((m_yOffset < - 8) && (currentColorIndex()) != 0 && (currentColorIndex() < m_stops.size() - 1)) {
+                m_yOffset = 0;
+                m_dragActive = false;
+                m_stops.removeAt(currentColorIndex());
+                m_colorList.removeAt(currentColorIndex());
+                updateGradient();
+                setCurrentIndex(0);
+                //delete item
+            }
+        }
+
         if (m_dragActive == false && m_create) {
             qreal stopPos = qreal(event->pos().x() - 9) / qreal((width() - 15));
             int index = -1;
@@ -260,7 +279,7 @@ void GradientLine::mouseReleaseEvent(QMouseEvent *event)
                 if ((stopPos > m_stops.at(i)) && (index == -1))
                     index = i +1;
             }
-            if (index != -1 && (m_useGradient)) { //creating of items only in base state
+            if (index != -1 && (m_useGradient) && abs(m_dragStart.x() - event->pos().x()) < 10) { //creating of items only in base state
                 m_stops.insert(index, stopPos);
                 m_colorList.insert(index, QColor(Qt::white));
                 setCurrentIndex(index);
@@ -278,32 +297,24 @@ void GradientLine::mouseMoveEvent(QMouseEvent *event)
 {
     if (m_dragActive) {
         event->accept();
-        int xPos = event->pos().x();
         int pos = qreal((width() - 20)) * m_stops.at(currentColorIndex()) + 8;
-        int offset = m_dragOff ? 2 : 20;
-        if (xPos < pos + offset && xPos > pos - offset) {
-            m_dragOff = false;
-            int xDistance = event->pos().x() - m_dragStart.x();
-            qreal distance = qreal(xDistance) / qreal((width() - 20));
-            qreal newStop  = m_stops.at(currentColorIndex()) + distance;
-            if ((newStop >=0) && (newStop <= 1))
-                m_stops[currentColorIndex()] = newStop;
-            m_yOffset += event->pos().y() - m_dragStart.y();
-            if (m_yOffset > 0) { //deleting only in base state
-                m_yOffset = 0;
-            } else if ((m_yOffset < - 12) && (currentColorIndex()) != 0 && (currentColorIndex() < m_stops.size() - 1)) {
-                m_yOffset = 0;
-                m_dragActive = false;
-                m_stops.removeAt(currentColorIndex());
-                m_colorList.removeAt(currentColorIndex());
-                updateGradient();
-                setCurrentIndex(0);
-                //delete item
-            }
-        } else {
-            m_dragOff = true;
-        }
-        m_dragStart = event->pos();
+
+        m_dragOff = false;
+        int xDistance = event->pos().x() - pos;
+        qreal distance = qreal(xDistance) / qreal((width() - 20));
+        qreal newStopPosition  = m_stops.at(currentColorIndex()) + distance;
+        if (newStopPosition > 0.98) //snap to 1
+            newStopPosition = 1;
+        if (newStopPosition < 0.02) //snap to 0
+            newStopPosition = 0;
+        if ((newStopPosition >=0) && (newStopPosition <= 1))
+            m_stops[currentColorIndex()] = newStopPosition;
+        m_yOffset += event->pos().y() - 14;
+        if (m_yOffset > 0)
+            m_yOffset = 0;
+        else if ((m_yOffset < - 10))
+            m_yOffset = -10;
+
         update();
     }
 }