Add generic "Create marker here" context menu entry
authorSoeren Apel <soeren@apelpie.net>
Tue, 16 Oct 2018 22:39:54 +0000 (00:39 +0200)
committerSoeren Apel <soeren@apelpie.net>
Tue, 16 Oct 2018 22:51:01 +0000 (00:51 +0200)
manual/analysis.txt
pv/views/trace/decodetrace.cpp
pv/views/trace/ruler.cpp
pv/views/trace/ruler.hpp
pv/views/trace/trace.cpp
pv/views/trace/trace.hpp
pv/views/trace/view.cpp
pv/views/trace/view.hpp

index 034f969a81029c48fffd954531dee77a584965c6..7aa487b488b4416d839fdf8337a07ff901711aa1 100644 (file)
@@ -43,7 +43,8 @@ image::pv_cursors_markers.png[]
 
 Markers are movable indicators that you can create wherever you like on the
 time scale - just double-click on it and it'll create one for you where your
 
 Markers are movable indicators that you can create wherever you like on the
 time scale - just double-click on it and it'll create one for you where your
-mouse cursor is at the time, or use the context menu when right-clicking.
+mouse cursor is at the time, or use the context menu when right-clicking on
+the ruler or a signal trace.
 You can click on its label and you'll have the option to change its name, or
 drag it to reposition it.
 
 You can click on its label and you'll have the option to change its name, or
 drag it to reposition it.
 
index 2797891138ffcd691b4c65ce241bb720547f2583..1f9e4c4e1b9bd7e0e2af3dad77817b33fec7f1bc 100644 (file)
@@ -328,6 +328,23 @@ QMenu* DecodeTrace::create_header_context_menu(QWidget *parent)
 
 QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
 {
 
 QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
 {
+       // Get entries from default menu before adding our own
+       QMenu *const menu = new QMenu(parent);
+
+       QMenu* default_menu = Trace::create_view_context_menu(parent, click_pos);
+       if (default_menu) {
+               for (QAction *action : default_menu->actions()) {
+                       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();
+       }
+
        try {
                selected_row_ = &visible_rows_[get_row_at_point(click_pos)];
        } catch (out_of_range&) {
        try {
                selected_row_ = &visible_rows_[get_row_at_point(click_pos)];
        } catch (out_of_range&) {
@@ -339,8 +356,6 @@ QMenu* DecodeTrace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
                get_view_sample_range(click_pos.x(), click_pos.x() + 1);
        selected_sample_range_ = make_pair(sample_range.first, numeric_limits<uint64_t>::max());
 
                get_view_sample_range(click_pos.x(), click_pos.x() + 1);
        selected_sample_range_ = make_pair(sample_range.first, numeric_limits<uint64_t>::max());
 
-       QMenu *const menu = new QMenu(parent);
-
        if (decode_signal_->is_paused()) {
                QAction *const resume =
                        new QAction(tr("Resume decoding"), this);
        if (decode_signal_->is_paused()) {
                QAction *const resume =
                        new QAction(tr("Resume decoding"), this);
index a085de29123cba27181414134c5e0673f2d642f7..675a39f9bd1b6ece887af2c9bd927e496e84a109 100644 (file)
@@ -114,7 +114,7 @@ QString Ruler::format_time_with_distance(
                return pv::util::format_time_minutes(t, precision, sign);
 }
 
                return pv::util::format_time_minutes(t, precision, sign);
 }
 
-pv::util::Timestamp Ruler::get_time_from_x_pos(uint32_t x)
+pv::util::Timestamp Ruler::get_time_from_x_pos(uint32_t x) const
 {
        return view_.ruler_offset() + ((double)x + 0.5) * view_.scale();
 }
 {
        return view_.ruler_offset() + ((double)x + 0.5) * view_.scale();
 }
@@ -318,7 +318,7 @@ void Ruler::invalidate_tick_position_cache()
 
 void Ruler::on_createMarker()
 {
 
 void Ruler::on_createMarker()
 {
-       view_.add_flag(get_time_from_x_pos(context_menu_x_pos_));
+       view_.add_flag(get_time_from_x_pos(mouse_down_point_.x()));
 }
 
 void Ruler::on_toggleHoverMarker()
 }
 
 void Ruler::on_toggleHoverMarker()
index 8c1876cced37f5e2598f655a51e309eff0c4fbd7..40aa31bfefb4a9f42887b41d3035464a21994b33 100644 (file)
@@ -117,7 +117,7 @@ public:
                unsigned precision = 0,
                bool sign = true);
 
                unsigned precision = 0,
                bool sign = true);
 
-       pv::util::Timestamp get_time_from_x_pos(uint32_t x);
+       pv::util::Timestamp get_time_from_x_pos(uint32_t x) const;
 
 protected:
        virtual void contextMenuEvent(QContextMenuEvent *event) override;
 
 protected:
        virtual void contextMenuEvent(QContextMenuEvent *event) override;
index bbd0115fb65af00512508c7129d3e6399b12a3a2..0a1fdf30684fc7bd800fc061f5fc7425a385c401 100644 (file)
@@ -26,7 +26,9 @@
 #include <QFormLayout>
 #include <QKeyEvent>
 #include <QLineEdit>
 #include <QFormLayout>
 #include <QKeyEvent>
 #include <QLineEdit>
+#include <QMenu>
 
 
+#include "ruler.hpp"
 #include "trace.hpp"
 #include "tracepalette.hpp"
 #include "view.hpp"
 #include "trace.hpp"
 #include "tracepalette.hpp"
 #include "view.hpp"
@@ -180,6 +182,34 @@ QMenu* Trace::create_header_context_menu(QWidget *parent)
        return menu;
 }
 
        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()) {
+                       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;
 pv::widgets::Popup* Trace::create_popup(QWidget *parent)
 {
        using pv::widgets::Popup;
@@ -373,6 +403,17 @@ void Trace::on_coloredit_changed(const QColor &color)
        base_->set_color(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_time_from_x_pos(p.x()));
+}
+
 } // namespace trace
 } // namespace views
 } // namespace pv
 } // namespace trace
 } // namespace views
 } // namespace pv
index 0b4ecce49484af09e8b60938afc5c3069cb3d936..2b98811b32ea3506865fc8db5e9e4924644539c7 100644 (file)
@@ -129,6 +129,8 @@ public:
 
        virtual QMenu* create_header_context_menu(QWidget *parent);
 
 
        virtual QMenu* create_header_context_menu(QWidget *parent);
 
+       virtual QMenu* create_view_context_menu(QWidget *parent, QPoint &click_pos);
+
        pv::widgets::Popup* create_popup(QWidget *parent);
 
        /**
        pv::widgets::Popup* create_popup(QWidget *parent);
 
        /**
@@ -192,6 +194,8 @@ private Q_SLOTS:
 
        void on_coloredit_changed(const QColor &color);
 
 
        void on_coloredit_changed(const QColor &color);
 
+       void on_create_marker_here() const;
+
 protected:
        shared_ptr<data::SignalBase> base_;
        QPen axis_pen_;
 protected:
        shared_ptr<data::SignalBase> base_;
        QPen axis_pen_;
@@ -199,6 +203,8 @@ protected:
        SegmentDisplayMode segment_display_mode_;
        bool show_hover_marker_;
 
        SegmentDisplayMode segment_display_mode_;
        bool show_hover_marker_;
 
+       uint32_t context_menu_x_pos_;
+
        /// The ID of the currently displayed segment
        int current_segment_;
 
        /// The ID of the currently displayed segment
        int current_segment_;
 
index 375f5754c7750a5277e538044a8d6f122f27fb44..aee84a20be5c1e0fb1aea36c85eb1d5a2af02c18 100644 (file)
@@ -347,6 +347,11 @@ const Viewport* View::viewport() const
        return viewport_;
 }
 
        return viewport_;
 }
 
+const Ruler* View::ruler() const
+{
+       return ruler_;
+}
+
 void View::save_settings(QSettings &settings) const
 {
        settings.setValue("scale", scale_);
 void View::save_settings(QSettings &settings) const
 {
        settings.setValue("scale", scale_);
index 4bde31d6dd17e3f6a5dd417a3397ebb98a3ded77..7b63d064099c46b53d57ce666736a3384abb06e5 100644 (file)
@@ -145,6 +145,8 @@ public:
 
        const Viewport* viewport() const;
 
 
        const Viewport* viewport() const;
 
+       const Ruler* ruler() const;
+
        virtual void save_settings(QSettings &settings) const;
 
        virtual void restore_settings(QSettings &settings);
        virtual void save_settings(QSettings &settings) const;
 
        virtual void restore_settings(QSettings &settings);