X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fview%2Fviewwidget.cpp;h=9c4c56ff6f0e50d20f1ec3839ee9b4b8ebbc6f30;hb=1dffa582704bb6acb144a3e89bd6eb0e2ccf4f25;hp=357b6fea5648d3f3dba4908b9d04c22624a6d266;hpb=40aca27ed83559f7f79873e353f64d2c36a18fce;p=pulseview.git diff --git a/pv/view/viewwidget.cpp b/pv/view/viewwidget.cpp index 357b6fe..9c4c56f 100644 --- a/pv/view/viewwidget.cpp +++ b/pv/view/viewwidget.cpp @@ -18,9 +18,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + +#include "rowitem.hpp" +#include "timeitem.hpp" #include "view.hpp" #include "viewwidget.hpp" +using std::any_of; +using std::shared_ptr; +using std::vector; + namespace pv { namespace view { @@ -30,5 +38,63 @@ ViewWidget::ViewWidget(View &parent) : { } +bool ViewWidget::accept_drag() const +{ + const vector< shared_ptr > items(view_.time_items()); + + const bool any_row_items_selected = any_of(view_.begin(), view_.end(), + [](const shared_ptr &r) { return r->selected(); }); + + const bool any_time_items_selected = any_of(items.begin(), items.end(), + [](const shared_ptr &i) { return i->selected(); }); + + if (any_row_items_selected && !any_time_items_selected) + { + // Check all the drag items share a common owner + RowItemOwner *item_owner = nullptr; + for (shared_ptr r : view_) + if (r->dragging()) { + if (!item_owner) + item_owner = r->owner(); + else if(item_owner != r->owner()) + return false; + } + + return true; + } + else if (any_time_items_selected && !any_row_items_selected) + { + return true; + } + + return false; +} + +void ViewWidget::drag_items(const QPoint &delta) +{ + // Drag the row items + RowItemOwner *item_owner = nullptr; + for (std::shared_ptr r : view_) + if (r->dragging()) { + item_owner = r->owner(); + r->drag_by(delta); + + // Ensure the trace is selected + r->select(); + } + + if (item_owner) { + item_owner->restack_items(); + for (const auto &r : *item_owner) + r->animate_to_layout_v_offset(); + } + + // Drag the time items + const vector< shared_ptr > items(view_.time_items()); + for (auto &i : items) + if (i->dragging()) + i->drag_by(delta); +} + } // namespace view } // namespace pv