]> sigrok.org Git - pulseview.git/blobdiff - pv/view/header.cpp
View: Removed normalize_layout
[pulseview.git] / pv / view / header.cpp
index 9ba4cf8f8814088749cf20b1909dee6cfec50e7e..514a3e49694e348dc08123749da90ff0290d1f67 100644 (file)
@@ -123,12 +123,11 @@ void Header::paintEvent(QPaintEvent*)
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
 
-       const bool dragging = !_drag_row_items.empty();
        for (const shared_ptr<RowItem> r : row_items)
        {
                assert(r);
 
-               const bool highlight = !dragging &&
+               const bool highlight = !_dragging &&
                        r->label_rect(w).contains(_mouse_point);
                r->paint_label(painter, w, highlight);
        }
@@ -138,30 +137,29 @@ void Header::paintEvent(QPaintEvent*)
 
 void Header::mouseLeftPressEvent(QMouseEvent *event)
 {
+       (void)event;
+
        const bool ctrl_pressed =
                QApplication::keyboardModifiers() & Qt::ControlModifier;
 
        // Clear selection if control is not pressed and this item is unselected
-       const shared_ptr<RowItem> mouse_over =
-               get_mouse_over_row_item(event->pos());
-       if (!ctrl_pressed && (!mouse_over || !mouse_over->selected()))
+       if ((!_mouse_down_item || !_mouse_down_item->selected()) &&
+               !ctrl_pressed)
                for (shared_ptr<RowItem> r : _view)
                        r->select(false);
 
        // Set the signal selection state if the item has been clicked
-       if (mouse_over) {
+       if (_mouse_down_item) {
                if (ctrl_pressed)
-                       mouse_over->select(!mouse_over->selected());
+                       _mouse_down_item->select(!_mouse_down_item->selected());
                else
-                       mouse_over->select(true);
+                       _mouse_down_item->select(true);
        }
 
        // Save the offsets of any signals which will be dragged
-       _mouse_down_point = event->pos();
        for (const shared_ptr<RowItem> r : _view)
                if (r->selected())
-                       _drag_row_items.push_back(
-                               make_pair(r, r->v_offset()));
+                       r->drag();
 
        selection_changed();
        update();
@@ -170,6 +168,10 @@ void Header::mouseLeftPressEvent(QMouseEvent *event)
 void Header::mousePressEvent(QMouseEvent *event)
 {
        assert(event);
+
+       _mouse_down_point = event->pos();
+       _mouse_down_item = get_mouse_over_row_item(event->pos());
+
        if (event->button() & Qt::LeftButton)
                mouseLeftPressEvent(event);
 }
@@ -185,22 +187,22 @@ void Header::mouseLeftReleaseEvent(QMouseEvent *event)
        const shared_ptr<RowItem> mouse_over =
                get_mouse_over_row_item(event->pos());
 
-       if (_dragging)
-               _view.normalize_layout();
-       else
+       for (auto &r : _view)
+               r->drag_release();
+
+       if (!_dragging)
        {
                if (!ctrl_pressed) {
                        for (shared_ptr<RowItem> r : _view)
-                               if (mouse_over != r)
+                               if (_mouse_down_item != r)
                                        r->select(false);
 
-                       if (mouse_over)
-                               show_popup(mouse_over);
+                       if (_mouse_down_item)
+                               show_popup(_mouse_down_item);
                }
        }
 
        _dragging = false;
-       _drag_row_items.clear();
 }
 
 void Header::mouseReleaseEvent(QMouseEvent *event)
@@ -208,6 +210,8 @@ void Header::mouseReleaseEvent(QMouseEvent *event)
        assert(event);
        if (event->button() & Qt::LeftButton)
                mouseLeftReleaseEvent(event);
+
+       _mouse_down_item = nullptr;
 }
 
 void Header::mouseMoveEvent(QMouseEvent *event)
@@ -222,37 +226,31 @@ void Header::mouseMoveEvent(QMouseEvent *event)
                QApplication::startDragDistance())
                return;
 
-       // Check the list of dragging items is not empty
-       if (_drag_row_items.empty())
-               return;
-
        // Check all the drag items share a common owner
-       const shared_ptr<RowItem> first_row_item(
-               _drag_row_items.front().first);
-       for (const auto &r : _drag_row_items) {
-               const shared_ptr<RowItem> row_item(r.first);
-               assert(row_item);
-
-               if (row_item->owner() != first_row_item->owner())
-                       return;
-       }
+       RowItemOwner *item_owner = nullptr;
+       for (shared_ptr<RowItem> r : _view)
+               if (r->dragging()) {
+                       if (!item_owner)
+                               item_owner = r->owner();
+                       else if(item_owner != r->owner())
+                               return;
+               }
+
+       if (!item_owner)
+               return;
 
        // Do the drag
        _dragging = true;
 
        const int delta = event->pos().y() - _mouse_down_point.y();
 
-       for (auto i = _drag_row_items.begin();
-               i != _drag_row_items.end(); i++) {
-               const std::shared_ptr<RowItem> row_item((*i).first);
-               if (row_item) {
-                       const int y = (*i).second + delta;
-                       row_item->set_v_offset(y);
+       for (std::shared_ptr<RowItem> r : _view)
+               if (r->dragging()) {
+                       r->set_v_offset(r->drag_point().y() + delta);
 
                        // Ensure the trace is selected
-                       row_item->select();
+                       r->select();
                }
-       }
 
        signals_moved();