X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fview%2Fcursorheader.cpp;h=c324410a75cb873aaed571cea402f23981ad36ec;hp=d1660276417d65a79e42a628aeee87cfd92bc716;hb=650e2e5fd465119615b9b969d15cc9fb11f18aa4;hpb=84a0d458a4b04141dd45af6dec44d36782ee163e diff --git a/pv/view/cursorheader.cpp b/pv/view/cursorheader.cpp index d1660276..c324410a 100644 --- a/pv/view/cursorheader.cpp +++ b/pv/view/cursorheader.cpp @@ -18,39 +18,50 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "cursorheader.h" +#include "cursorheader.hpp" -#include "view.h" +#include "ruler.hpp" +#include "view.hpp" #include +#include #include -#include +#include using std::shared_ptr; +using std::vector; namespace pv { namespace view { -const int CursorHeader::CursorHeaderHeight = 26; +const int CursorHeader::Padding = 20; +const int CursorHeader::BaselineOffset = 5; + +int CursorHeader::calculateTextHeight() +{ + QFontMetrics fm(font()); + return fm.boundingRect(0, 0, INT_MAX, INT_MAX, + Qt::AlignLeft | Qt::AlignTop, "8").height(); +} CursorHeader::CursorHeader(View &parent) : MarginWidget(parent), - _dragging(false) + textHeight_(calculateTextHeight()) { setMouseTracking(true); } QSize CursorHeader::sizeHint() const { - return QSize(0, CursorHeaderHeight); + return QSize(0, textHeight_ + Padding + BaselineOffset); } void CursorHeader::clear_selection() { - CursorPair &cursors = _view.cursors(); - cursors.first()->select(false); - cursors.second()->select(false); + const vector< shared_ptr > items(view_.time_items()); + for (auto &i : items) + i->select(false); update(); } @@ -59,49 +70,60 @@ void CursorHeader::paintEvent(QPaintEvent*) QPainter p(this); p.setRenderHint(QPainter::Antialiasing); - // Draw the cursors - if (_view.cursors_shown()) { - _view.cursors().draw_markers(p, rect(), 0); //prefix); - } + // The cursor labels are not drawn with the arrows exactly on the + // bottom line of the widget, because then the selection shadow + // would be clipped away. + const QRect r = rect().adjusted(0, 0, 0, -BaselineOffset); + + // Draw the items + const vector< shared_ptr > items(view_.time_items()); + for (auto &m : items) + m->paint_label(p, r); } void CursorHeader::mouseMoveEvent(QMouseEvent *e) { + mouse_point_ = e->pos(); + if (!(e->buttons() & Qt::LeftButton)) return; - if ((e->pos() - _mouse_down_point).manhattanLength() < + if ((e->pos() - mouse_down_point_).manhattanLength() < QApplication::startDragDistance()) return; - _dragging = true; + // Do the drag + dragging_ = true; - if (shared_ptr m = _grabbed_marker.lock()) - m->set_time(_view.offset() + - ((double)e->x() + 0.5) * _view.scale()); + const int delta = e->pos().x() - mouse_down_point_.x(); + const vector< shared_ptr > items(view_.time_items()); + for (auto &i : items) + if (i->dragging()) + i->set_time(view_.offset() + + (i->drag_point().x() + delta - 0.5) * + view_.scale()); } void CursorHeader::mousePressEvent(QMouseEvent *e) { if (e->buttons() & Qt::LeftButton) { - _mouse_down_point = e->pos(); + mouse_down_point_ = e->pos(); - _grabbed_marker.reset(); + mouse_down_item_.reset(); clear_selection(); - if (_view.cursors_shown()) { - CursorPair &cursors = _view.cursors(); - if (cursors.first()->get_label_rect( - rect()).contains(e->pos())) - _grabbed_marker = cursors.first(); - else if (cursors.second()->get_label_rect( - rect()).contains(e->pos())) - _grabbed_marker = cursors.second(); - } + const vector< shared_ptr > items(view_.time_items()); + for (auto &i : items) + if (i && i->label_rect(rect()).contains(e->pos())) { + mouse_down_item_ = i; + break; + } - if (shared_ptr m = _grabbed_marker.lock()) - m->select(); + if (mouse_down_item_) { + mouse_down_item_->select(); + mouse_down_item_->drag(); + } selection_changed(); } @@ -111,16 +133,28 @@ void CursorHeader::mouseReleaseEvent(QMouseEvent *) { using pv::widgets::Popup; - if (!_dragging) - if (shared_ptr m = _grabbed_marker.lock()) { - Popup *const p = m->create_popup(&_view); - p->set_position(mapToGlobal(QPoint(m->get_x(), - height())), Popup::Bottom); + if (!dragging_ && mouse_down_item_) { + Popup *const p = mouse_down_item_->create_popup(&view_); + if (p) { + const QPoint arrpos(mouse_down_item_->get_x(), + height() - BaselineOffset); + p->set_position(mapToGlobal(arrpos), Popup::Bottom); p->show(); } + } - _dragging = false; - _grabbed_marker.reset(); + dragging_ = false; + mouse_down_item_.reset(); + + const vector< shared_ptr > items(view_.time_items()); + for (auto &i : items) + i->drag_release(); +} + +void CursorHeader::leaveEvent(QEvent*) +{ + mouse_point_ = QPoint(-1, -1); + update(); } } // namespace view