X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Ftrace.cpp;h=65abaf0cec2e095032b0ed6ec74a3e45ce2686a2;hp=8c450a088604e543a2b1f41e421011e0e3d719db;hb=633e8ade5289eff00c7137f59269361aa547449a;hpb=9e773fecf2d4ab8f2fc6e1cc880b9102c22ec228 diff --git a/pv/views/trace/trace.cpp b/pv/views/trace/trace.cpp index 8c450a08..65abaf0c 100644 --- a/pv/views/trace/trace.cpp +++ b/pv/views/trace/trace.cpp @@ -26,7 +26,9 @@ #include #include #include +#include +#include "ruler.hpp" #include "trace.hpp" #include "tracepalette.hpp" #include "view.hpp" @@ -78,6 +80,26 @@ shared_ptr Trace::base() const return base_; } +bool Trace::is_selectable(QPoint pos) const +{ + // True if the header was clicked, false if the trace area was clicked + const View *view = owner_->view(); + assert(view); + + return (pos.x() <= view->header_width()); +} + +bool Trace::is_draggable(QPoint pos) const +{ + // While the header label that belongs to this trace is draggable, + // the trace itself shall not be. Hence we return true if the header + // was clicked and false if the trace area was clicked + const View *view = owner_->view(); + assert(view); + + return (pos.x() <= view->header_width()); +} + void Trace::set_segment_display_mode(SegmentDisplayMode mode) { segment_display_mode_ = mode; @@ -90,6 +112,10 @@ void Trace::on_setting_changed(const QString &key, const QVariant &value) { if (key == GlobalSettings::Key_View_ShowHoverMarker) show_hover_marker_ = value.toBool(); + + // Force a repaint since many options alter the way traces look + if (owner_) + owner_->row_item_appearance_changed(false, true); } void Trace::paint_label(QPainter &p, const QRect &rect, bool hover) @@ -156,6 +182,34 @@ QMenu* Trace::create_header_context_menu(QWidget *parent) return menu; } +QMenu* Trace::create_view_context_menu(QWidget *parent, QPoint &click_pos) +{ + context_menu_x_pos_ = click_pos.x(); + + // Get entries from default menu before adding our own + QMenu *const menu = new QMenu(parent); + + QMenu* default_menu = TraceTreeItem::create_view_context_menu(parent, click_pos); + if (default_menu) { + for (QAction *action : default_menu->actions()) { // clazy:exclude=range-loop + menu->addAction(action); + if (action->parent() == default_menu) + action->setParent(menu); + } + delete default_menu; + + // Add separator if needed + if (menu->actions().length() > 0) + menu->addSeparator(); + } + + QAction *const create_marker_here = new QAction(tr("Create marker here"), this); + connect(create_marker_here, SIGNAL(triggered()), this, SLOT(on_create_marker_here())); + menu->addAction(create_marker_here); + + return menu; +} + pv::widgets::Popup* Trace::create_popup(QWidget *parent) { using pv::widgets::Popup; @@ -189,10 +243,16 @@ QRectF Trace::label_rect(const QRectF &rect) const QRectF Trace::hit_box_rect(const ViewItemPaintParams &pp) const { + // This one is only for the trace itself, excluding the header area + const View *view = owner_->view(); + assert(view); + pair extents = v_extents(); const int top = pp.top() + get_visual_y() + extents.first; const int height = extents.second - extents.first; - return QRectF(pp.left(), top, pp.width(), height); + + return QRectF(pp.left() + view->header_width(), top, + pp.width() - view->header_width(), height); } void Trace::set_current_segment(const int segment) @@ -232,12 +292,13 @@ void Trace::paint_back(QPainter &p, ViewItemPaintParams &pp) void Trace::paint_axis(QPainter &p, ViewItemPaintParams &pp, int y) { + bool wasAntialiased = p.testRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::Antialiasing, false); p.setPen(axis_pen_); p.drawLine(QPointF(pp.left(), y), QPointF(pp.right(), y)); - p.setRenderHint(QPainter::Antialiasing, true); + p.setRenderHint(QPainter::Antialiasing, wasAntialiased); } void Trace::add_color_option(QWidget *parent, QFormLayout *form) @@ -268,10 +329,11 @@ void Trace::paint_hover_marker(QPainter &p) const pair extents = v_extents(); + bool wasAntialiased = p.testRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::Antialiasing, false); p.drawLine(x, get_visual_y() + extents.first, x, get_visual_y() + extents.second); - p.setRenderHint(QPainter::Antialiasing, true); + p.setRenderHint(QPainter::Antialiasing, wasAntialiased); } void Trace::create_popup_form() @@ -343,6 +405,17 @@ void Trace::on_coloredit_changed(const QColor &color) base_->set_color(color); } +void Trace::on_create_marker_here() const +{ + View *view = owner_->view(); + assert(view); + + const Ruler *ruler = view->ruler(); + QPoint p = ruler->mapFrom(view, QPoint(context_menu_x_pos_, 0)); + + view->add_flag(ruler->get_absolute_time_from_x_pos(p.x())); +} + } // namespace trace } // namespace views } // namespace pv