X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fviews%2Ftrace%2Fview.hpp;h=c6a7c55743caf64e9496e4c4fc0d054940cc4ab8;hp=5be959579eb7eba521f454df21b4f16d1f2f1b4c;hb=a47b5a3fb9912f1d6e3fcc63d59ee6cc1b5338e2;hpb=ad908057e13224eee9f983685e0ccc7db1ded0e9 diff --git a/pv/views/trace/view.hpp b/pv/views/trace/view.hpp index 5be95957..c6a7c557 100644 --- a/pv/views/trace/view.hpp +++ b/pv/views/trace/view.hpp @@ -31,12 +31,14 @@ #include #include -#include +#include #include +#include #include #include "cursorpair.hpp" #include "flag.hpp" +#include "trace.hpp" #include "tracetreeitemowner.hpp" using std::list; @@ -62,12 +64,10 @@ namespace views { namespace trace { -class CursorHeader; class DecodeTrace; class Header; class Ruler; class Signal; -class Trace; class Viewport; class TriggerMarker; @@ -80,7 +80,7 @@ public: bool viewportEvent(QEvent *event); }; -class View : public ViewBase, public TraceTreeItemOwner +class View : public ViewBase, public TraceTreeItemOwner, public GlobalSettingsInterface { Q_OBJECT @@ -101,6 +101,14 @@ private: public: explicit View(Session &session, bool is_main_view=false, QWidget *parent = nullptr); + ~View(); + + /** + * Resets the view to its default state after construction. It does however + * not reset the signal bases or any other connections with the session. + */ + virtual void reset_view_state(); + Session& session(); const Session& session() const; @@ -121,6 +129,8 @@ public: virtual void remove_decode_signal(shared_ptr signal); #endif + shared_ptr get_signal_under_mouse_cursor() const; + /** * Returns the view of the owner. */ @@ -135,6 +145,8 @@ public: const Viewport* viewport() const; + const Ruler* ruler() const; + virtual void save_settings(QSettings &settings) const; virtual void restore_settings(QSettings &settings); @@ -150,11 +162,21 @@ public: double scale() const; /** - * Returns the time offset of the left edge of the view in - * seconds. + * Returns the internal view version of the time offset of the left edge + * of the view in seconds. */ const pv::util::Timestamp& offset() const; + /** + * Returns the ruler version of the time offset of the left edge + * of the view in seconds. + */ + const pv::util::Timestamp& ruler_offset() const; + + void set_zero_position(const pv::util::Timestamp& position); + + void reset_zero_position(); + /** * Returns the vertical scroll offset. */ @@ -180,6 +202,11 @@ public: */ const pv::util::Timestamp& tick_period() const; + /** + * Returns number of minor division ticks per time marking. + */ + unsigned int minor_tick_count() const; + /** * Returns the unit of time currently used. */ @@ -190,13 +217,25 @@ public: */ unsigned int depth() const; + /** + * Returns the currently displayed segment, starting at 0. + */ + uint32_t current_segment() const; + + /** + * Returns whether the currently shown segment can be influenced + * (selected) or not. + */ + bool segment_is_selectable() const; + + Trace::SegmentDisplayMode segment_display_mode() const; + void set_segment_display_mode(Trace::SegmentDisplayMode mode); + void zoom(double steps); void zoom(double steps, int offset); void zoom_fit(bool gui_state); - void zoom_one_to_one(); - /** * Sets the scale and offset. * @param scale The new view scale in seconds per pixel. @@ -209,15 +248,15 @@ public: pair get_time_extents() const; /** - * Enables or disables coloured trace backgrounds. If they're not - * coloured then they will use alternating colors. + * Enables or disables colored trace backgrounds. If they're not + * colored then they will use alternating colors. */ - void enable_coloured_bg(bool state); + void enable_colored_bg(bool state); /** - * Returns true if the trace background should be drawn with a coloured background. + * Returns true if the trace background should be drawn with a colored background. */ - bool coloured_bg() const; + bool colored_bg() const; /** * Enable or disable showing sampling points. @@ -239,6 +278,11 @@ public: */ void show_cursors(bool show = true); + /** + * Sets the cursors to the given offsets. You will still have to call show_cursors separately. + */ + void set_cursors(pv::util::Timestamp& first, pv::util::Timestamp& second); + /** * Moves the cursors to a convenient position in the view. */ @@ -265,11 +309,25 @@ public: vector< shared_ptr > flags() const; const QPoint& hover_point() const; + const QWidget* hover_widget() const; + + /** + * Determines the closest level change (i.e. edge) to a given point, which + * is useful for e.g. the "snap to edge" functionality. + * + * @param p The current position of the mouse cursor + * @return The sample number of the nearest level change or -1 if none + */ + int64_t get_nearest_level_change(const QPoint &p); void restack_all_trace_tree_items(); + int header_width() const; + + void on_setting_changed(const QString &key, const QVariant &value); + Q_SIGNALS: - void hover_point_changed(); + void hover_point_changed(const QWidget* widget, const QPoint &hp); void selection_changed(); @@ -295,8 +353,18 @@ Q_SIGNALS: /// Emitted when the time_unit changed. void time_unit_changed(); + /// Emitted when the currently selected segment changed + void segment_changed(int segment_id); + + /// Emitted when the multi-segment display mode changed + /// @param mode is a value of Trace::SegmentDisplayMode + void segment_display_mode_changed(int mode, bool segment_selectable); + + /// Emitted when the cursors are shown/hidden + void cursor_state_changed(bool show); + public Q_SLOTS: - void trigger_event(util::Timestamp location); + void trigger_event(int segment_id, util::Timestamp location); private: void get_scroll_layout(double &length, pv::util::Timestamp &offset) const; @@ -323,9 +391,9 @@ private: void set_scroll_default(); - bool header_was_shrunk() const; + void determine_if_header_was_shrunk(); - void expand_header_to_fit(); + void resize_header_to_fit(); void update_layout(); @@ -345,8 +413,12 @@ private: bool eventFilter(QObject *object, QEvent *event); + virtual void contextMenuEvent(QContextMenuEvent *event); + void resizeEvent(QResizeEvent *event); + void update_hover_point(); + public: void row_item_appearance_changed(bool label, bool content); void time_item_appearance_changed(bool label, bool content); @@ -355,6 +427,7 @@ public: private Q_SLOTS: + void on_signal_name_changed(); void on_splitter_moved(); void h_scroll_value_changed(int value); @@ -363,17 +436,21 @@ private Q_SLOTS: void signals_changed(); void capture_state_updated(int state); + void on_new_segment(int new_segment_id); + void on_segment_completed(int new_segment_id); + void on_segment_changed(int segment); + + void on_settingViewTriggerIsZeroTime_changed(const QVariant new_value); + virtual void perform_delayed_view_update(); void process_sticky_events(); - void on_hover_point_changed(); - /** - * Sets the 'offset_' member and emits the 'offset_changed' + * Sets the 'offset_' and ruler_offset_ members and emits the 'offset_changed' * signal if needed. */ - void set_offset(const pv::util::Timestamp& offset); + void set_offset(const pv::util::Timestamp& offset, bool force_update = false); /** * Sets the 'scale_' member and emits the 'scale_changed' @@ -405,6 +482,11 @@ private Q_SLOTS: */ void set_time_unit(pv::util::TimeUnit time_unit); + /** + * Sets the current segment with the first segment starting at 0. + */ + void set_current_segment(uint32_t segment_id); + private: CustomScrollArea *scrollarea_; Viewport *viewport_; @@ -418,21 +500,32 @@ private: vector< shared_ptr > decode_traces_; #endif + Trace::SegmentDisplayMode segment_display_mode_; + + /// Signals whether the user can change the currently shown segment. + bool segment_selectable_; + /// The view time scale in seconds per pixel. double scale_; - /// The view time offset in seconds. + /// The internal view version of the time offset in seconds. pv::util::Timestamp offset_; + /// The ruler version of the time offset in seconds. + pv::util::Timestamp ruler_offset_; + /// The offset of the zero point in seconds. + pv::util::Timestamp zero_offset_; bool updating_scroll_; bool settings_restored_; + bool header_was_shrunk_; bool sticky_scrolling_; - bool coloured_bg_; + bool colored_bg_; bool always_zoom_to_fit_; pv::util::Timestamp tick_period_; pv::util::SIPrefix tick_prefix_; + unsigned int minor_tick_count_; unsigned int tick_precision_; util::TimeUnit time_unit_; @@ -444,7 +537,10 @@ private: vector< shared_ptr > trigger_markers_; + QWidget* hover_widget_; QPoint hover_point_; + shared_ptr signal_under_mouse_cursor_; + uint16_t snap_distance_; unsigned int sticky_events_; QTimer lazy_event_handler_; @@ -454,6 +550,16 @@ private: // A nonzero value indicates the v offset to restore. See View::resizeEvent() int saved_v_offset_; + + // These are used to determine whether the view was altered after acq started + double scale_at_acq_start_; + pv::util::Timestamp offset_at_acq_start_; + + // Used to suppress performing a "zoom to fit" when the session stops. This + // is needed when the view's settings are restored before acquisition ends. + // In that case we want to keep the restored settings, not have a "zoom to fit" + // mess them up. + bool suppress_zoom_to_fit_after_acq_; }; } // namespace trace