X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fflag.cpp;h=ea3cd609854c813783ffe6e406143b887915693a;hb=2bdc5796c866b9494b2c40051e973e4385d9c46f;hp=1db843e08193e5508d8298da841e82389be102fe;hpb=1573bf16ba50d1c023ad3a9ce596f0ab6eaeacff;p=pulseview.git diff --git a/pv/views/trace/flag.cpp b/pv/views/trace/flag.cpp index 1db843e0..ea3cd609 100644 --- a/pv/views/trace/flag.cpp +++ b/pv/views/trace/flag.cpp @@ -19,11 +19,13 @@ #include "timemarker.hpp" #include "view.hpp" +#include "ruler.hpp" #include #include #include #include +#include #include @@ -36,16 +38,16 @@ namespace pv { namespace views { namespace trace { -const QColor Flag::FillColour(0x73, 0xD2, 0x16); +const QColor Flag::FillColor(0x73, 0xD2, 0x16); Flag::Flag(View &view, const pv::util::Timestamp& time, const QString &text) : - TimeMarker(view, FillColour, time), + TimeMarker(view, FillColor, time), text_(text) { } Flag::Flag(const Flag &flag) : - TimeMarker(flag.view_, FillColour, flag.time_), + TimeMarker(flag.view_, FillColor, flag.time_), enable_shared_from_this(flag) { } @@ -57,7 +59,52 @@ bool Flag::enabled() const QString Flag::get_text() const { - return text_; + QString s; + + const shared_ptr ref_item = view_.ruler()->get_reference_item(); + + if (!ref_item || (ref_item.get() == this)) + s = text_; + else + s = Ruler::format_time_with_distance( + ref_item->time(), ref_item->delta(time_), + view_.tick_prefix(), view_.time_unit(), view_.tick_precision()); + + return s; +} + +QRectF Flag::label_rect(const QRectF &rect) const +{ + QRectF r; + + const shared_ptr ref_item = view_.ruler()->get_reference_item(); + + if (!ref_item || (ref_item.get() == this)) { + r = TimeMarker::label_rect(rect); + } else { + // TODO: Remove code duplication between here and cursor.cpp + const float x = get_x(); + + QFontMetrics m(QApplication::font()); + QSize text_size = m.boundingRect(get_text()).size(); + + const QSizeF label_size( + text_size.width() + LabelPadding.width() * 2, + text_size.height() + LabelPadding.height() * 2); + + const float height = label_size.height(); + const float top = + rect.height() - label_size.height() - TimeMarker::ArrowSize - 0.5f; + + const pv::util::Timestamp& delta = ref_item->delta(time_); + + if (delta >= 0) + r = QRectF(x, top, label_size.width(), height); + else + r = QRectF(x - label_size.width(), top, label_size.width(), height); + } + + return r; } pv::widgets::Popup* Flag::create_popup(QWidget *parent) @@ -66,7 +113,7 @@ pv::widgets::Popup* Flag::create_popup(QWidget *parent) Popup *const popup = TimeMarker::create_popup(parent); popup->set_position(parent->mapToGlobal( - point(parent->rect())), Popup::Bottom); + drag_point(parent->rect())), Popup::Bottom); QFormLayout *const form = (QFormLayout*)popup->layout(); @@ -81,7 +128,7 @@ pv::widgets::Popup* Flag::create_popup(QWidget *parent) return popup; } -QMenu* Flag::create_context_menu(QWidget *parent) +QMenu* Flag::create_header_context_menu(QWidget *parent) { QMenu *const menu = new QMenu(parent); @@ -90,6 +137,12 @@ QMenu* Flag::create_context_menu(QWidget *parent) connect(del, SIGNAL(triggered()), this, SLOT(on_delete())); menu->addAction(del); + QAction *const snap_disable = new QAction(tr("Disable snapping"), this); + snap_disable->setCheckable(true); + snap_disable->setChecked(snapping_disabled_); + connect(snap_disable, &QAction::toggled, this, [=](bool checked){snapping_disabled_ = checked;}); + menu->addAction(snap_disable); + return menu; }