21 #include <libsigrokdecode/libsigrokdecode.h> 33 #include <QApplication> 36 #include <QFontMetrics> 38 #include <QMouseEvent> 40 #include <QVBoxLayout> 42 #include <libsigrokcxx/libsigrokcxx.hpp> 74 using std::back_inserter;
78 using std::lock_guard;
81 using std::make_shared;
83 using std::numeric_limits;
86 using std::set_difference;
87 using std::shared_ptr;
111 switch (event->type()) {
113 case QEvent::MouseButtonPress:
114 case QEvent::MouseButtonRelease:
115 case QEvent::MouseButtonDblClick:
116 case QEvent::MouseMove:
118 case QEvent::TouchBegin:
119 case QEvent::TouchUpdate:
120 case QEvent::TouchEnd:
123 return QAbstractScrollArea::viewportEvent(event);
128 ViewBase(session, is_main_view, parent),
131 splitter_(new QSplitter()),
132 header_was_shrunk_(false),
133 sticky_scrolling_(false),
134 scroll_needs_defaults_(true)
136 QVBoxLayout *root_layout =
new QVBoxLayout(
this);
137 root_layout->setContentsMargins(0, 0, 0, 0);
152 QWidget *header_container =
new QWidget();
153 header_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
154 QVBoxLayout *header_layout =
new QVBoxLayout(header_container);
155 header_layout->setContentsMargins(0,
ruler_->
sizeHint().height(), 0, 0);
156 header_layout->addWidget(
header_);
159 QWidget *trace_container =
new QWidget();
160 trace_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
161 QVBoxLayout *trace_layout =
new QVBoxLayout(trace_container);
162 trace_layout->setSpacing(0);
163 trace_layout->setContentsMargins(0, 0, 0, 0);
164 trace_layout->addWidget(
ruler_);
174 splitter_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
177 ruler_->installEventFilter(
this);
178 header_->installEventFilter(
this);
194 connect(
scrollarea_->horizontalScrollBar(), SIGNAL(valueChanged(
int)),
196 connect(
scrollarea_->verticalScrollBar(), SIGNAL(valueChanged(
int)),
200 ruler_, SLOT(clear_selection()));
202 header_, SLOT(clear_selection()));
209 connect(
splitter_, SIGNAL(splitterMoved(
int,
int)),
235 end_shortcut_ =
new QShortcut(QKeySequence(Qt::Key_End),
this,
240 nullptr,
nullptr, Qt::WidgetWithChildrenShortcut);
246 nullptr,
nullptr, Qt::WidgetWithChildrenShortcut);
252 nullptr,
nullptr, Qt::WidgetWithChildrenShortcut);
297 cursors_ = make_shared<CursorPair>(*this);
317 scrollarea_->verticalScrollBar()->setRange(-100000000, 100000000);
337 shared_ptr<Signal> ret_val;
339 for (
const shared_ptr<Signal>& s :
signals_)
340 if (s->base() == base) {
358 shared_ptr<Signal> signal;
360 switch (signalbase->type()) {
361 case SignalBase::LogicChannel:
365 case SignalBase::AnalogChannel:
369 case SignalBase::MathChannel:
374 qDebug() <<
"Unknown signalbase type:" << signalbase->type();
389 signal->restore_settings(main_signal->save_settings());
392 connect(signal->base().get(), SIGNAL(name_changed(
const QString&)),
407 void View::clear_decode_signals()
409 ViewBase::clear_decode_signals();
410 decode_traces_.clear();
413 void View::add_decode_signal(shared_ptr<data::DecodeSignal> signal)
415 ViewBase::add_decode_signal(signal);
417 shared_ptr<DecodeTrace> d(
419 decode_traces_.push_back(d);
424 connect(signal.get(), SIGNAL(name_changed(
const QString&)),
428 void View::remove_decode_signal(shared_ptr<data::DecodeSignal> signal)
430 for (
auto i = decode_traces_.begin(); i != decode_traces_.end(); i++)
431 if ((*i)->base() == signal) {
432 decode_traces_.erase(i);
436 ViewBase::remove_decode_signal(signal);
498 settings.setValue(
"scale",
scale_);
499 settings.setValue(
"v_offset",
500 scrollarea_->verticalScrollBar()->sliderPosition());
502 settings.setValue(
"splitter_state",
splitter_->saveState());
510 settings.remove(
"zero_offset");
512 for (
const shared_ptr<Signal>& signal :
signals_) {
513 settings.beginGroup(signal->base()->internal_name());
514 signal->save_settings(settings);
524 if (settings.contains(
"scale"))
525 set_scale(settings.value(
"scale").toDouble());
527 if (settings.contains(
"offset")) {
532 if (settings.contains(
"zero_offset"))
535 if (settings.contains(
"splitter_state"))
536 splitter_->restoreState(settings.value(
"splitter_state").toByteArray());
538 if (settings.contains(
"segment_display_mode"))
542 for (shared_ptr<Signal> signal :
signals_) {
543 settings.beginGroup(signal->base()->internal_name());
544 signal->restore_settings(settings);
548 if (settings.contains(
"v_offset")) {
562 const vector<shared_ptr<Flag>> f(
flags());
563 vector<shared_ptr<TimeItem>> items(f.begin(), f.end());
568 items.push_back(
cursors_->second());
572 items.push_back(trigger_marker);
595 if ((
offset_ != offset) || force_update) {
633 if (trigger_is_zero_time) {
636 if (triggers.size() > 0)
654 return -
scrollarea_->verticalScrollBar()->sliderPosition();
659 scrollarea_->verticalScrollBar()->setSliderPosition(offset);
666 scrollarea_->horizontalScrollBar()->setSliderPosition(offset);
673 return scrollarea_->horizontalScrollBar()->maximum();
747 for (
const shared_ptr<Signal>& signal :
signals_)
750 for (shared_ptr<DecodeTrace>& dt : decode_traces_)
782 for (
const shared_ptr<Signal>& signal :
signals_)
783 signal->set_segment_display_mode(mode);
795 if (last_segment > 0) {
797 uint32_t segment_id =
799 last_segment : last_segment - 1;
846 const Timestamp delta = extents.second - extents.first;
867 const double samples_per_pixel = samplerate *
scale_;
868 const uint64_t viewport_samples = w * samples_per_pixel;
870 const uint64_t sample_delta = (end_sample - start_sample);
873 const uint64_t ext_sample_delta = sample_delta * 1.25;
876 if (viewport_samples >= ext_sample_delta) {
878 const int64_t sample_offset = (start_sample + (sample_delta / 2) - (viewport_samples / 2));
882 const Timestamp offset = (start_sample - sample_delta * 0.20) / samplerate;
883 const Timestamp delta = ext_sample_delta / samplerate;
920 vector< shared_ptr<SignalData> > visible_data;
921 for (
const shared_ptr<Signal>& sig :
signals_)
923 visible_data.push_back(sig->base()->data());
930 boost::optional<Timestamp> left_time, right_time;
932 vector< shared_ptr<SignalData> >
data;
934 return make_pair(0, 0);
936 for (
const shared_ptr<Signal>& s :
signals_)
937 if (s->base()->data() && (s->base()->data()->segments().size() > 0))
938 data.push_back(s->base()->data());
940 for (
const shared_ptr<SignalData>& d : data) {
941 const vector< shared_ptr<Segment> > segments = d->segments();
942 for (
const shared_ptr<Segment>& s : segments) {
943 double samplerate = s->samplerate();
944 samplerate = (samplerate <= 0.0) ? 1.0 : samplerate;
946 const Timestamp start_time = s->start_time();
947 left_time = left_time ?
948 min(*left_time, start_time) :
950 right_time = right_time ?
951 max(*right_time, start_time + d->max_sample_count() / samplerate) :
952 start_time + d->max_sample_count() / samplerate;
956 if (!left_time || !right_time)
957 return make_pair(0, 0);
959 assert(*left_time <= *right_time);
960 return make_pair(*left_time, *right_time);
989 cursors_->second()->set_time(second);
1014 shared_ptr<Flag> flag =
1035 [](
const shared_ptr<Flag> &a,
const shared_ptr<Flag> &b) {
1036 return a->time() < b->time();
1059 entry_t(shared_ptr<Signal> s) :
1061 shared_ptr<Signal> signal;
1067 vector<entry_t> list;
1073 for (shared_ptr<Signal> s :
signals_) {
1077 list.emplace_back(s);
1081 for (entry_t &
e : list) {
1083 const double samples_per_pixel =
e.signal->base()->get_samplerate() *
scale();
1084 const int64_t x_offset =
offset().convert_to<
double>() /
scale();
1085 const int64_t sample_num =
max(((x_offset + p.x()) * samples_per_pixel), 0.0);
1087 vector<data::LogicSegment::EdgePair> edges =
1088 e.signal->get_nearest_level_changes(sample_num);
1094 const int64_t first_sample_delta = abs(sample_num - edges.front().first);
1095 const int64_t first_delta = first_sample_delta / samples_per_pixel;
1096 e.delta = first_delta;
1097 e.sample = edges.front().first;
1100 if (edges.size() == 2) {
1102 const int64_t second_sample_delta = abs(sample_num - edges.back().first - 1);
1103 const int64_t second_delta = second_sample_delta / samples_per_pixel;
1109 if (second_delta < first_delta) {
1110 e.delta = second_delta;
1111 e.sample = edges.back().first;
1117 entry_t *match =
nullptr;
1119 for (entry_t &
e : list) {
1124 if (
e.delta < match->delta)
1131 for (entry_t &
e : list) {
1136 if (
e.delta < match->delta)
1147 return match->sample;
1156 const vector<shared_ptr<TraceTreeItem>> items(
1157 list_by_type<TraceTreeItem>());
1158 set< TraceTreeItemOwner* > owners;
1159 for (
const auto &r : items)
1160 owners.insert(r->owner());
1161 vector< TraceTreeItemOwner* > sorted_owners(owners.begin(), owners.end());
1162 sort(sorted_owners.begin(), sorted_owners.end(),
1164 return a->
depth() > b->depth(); });
1167 for (
auto &o : sorted_owners)
1171 for (
const auto &i : items)
1172 i->animate_to_layout_v_offset();
1215 length = ((extents.second - extents.first) /
scale_).convert_to<
double>();
1233 const double SpacingIncrement = 10.0f;
1234 const double MinValueSpacing = 40.0f;
1237 const QSize areaSize =
viewport_->size();
1241 double min_width = SpacingIncrement;
1242 double label_width, tick_period_width;
1244 QFontMetrics
m(QApplication::font());
1254 const double min_period =
scale_ * min_width;
1256 const int order = (int)floorf(log10f(min_period));
1265 double tp_with_margin;
1266 unsigned int unit = 0;
1269 tp_with_margin = order_decimal.convert_to<
double>() *
1274 tick_period = order_decimal *
ScaleUnits[unit - 1];
1280 tick_precision =
max(ceil(log10(1 / tick_period)).convert_to<int>(), 0);
1282 tick_period_width = (tick_period /
scale_).convert_to<double>();
1285 tick_period, max_time, tick_prefix,
time_unit_, tick_precision);
1287 label_width = m.boundingRect(0, 0, INT_MAX, INT_MAX,
1288 Qt::AlignLeft | Qt::AlignTop, label_text).width() +
1291 min_width += SpacingIncrement;
1292 }
while (tick_period_width < label_width);
1303 const QSize areaSize =
viewport_->size();
1305 const pair<int, int> extents =
v_extents();
1310 if ((top_margin > 0) && (trace_bottom > areaSize.height())) {
1311 const int trace_height = extents.second - extents.first;
1314 if (areaSize.height() >= trace_height)
1316 ((areaSize.height() - trace_height) / 2));
1326 QScrollBar *hscrollbar =
scrollarea_->horizontalScrollBar();
1327 QScrollBar *vscrollbar =
scrollarea_->verticalScrollBar();
1329 const QSize areaSize =
viewport_->size();
1335 length =
max(length - areaSize.width(), 0.0);
1339 hscrollbar->setPageStep(areaSize.width() / 2);
1340 hscrollbar->setSingleStep(major_tick_distance);
1345 hscrollbar->setRange(0, length);
1346 hscrollbar->setSliderPosition(offset.convert_to<
double>());
1349 hscrollbar->setSliderPosition(
1356 vscrollbar->setPageStep(areaSize.height());
1357 vscrollbar->setSingleStep(areaSize.height() / 8);
1359 const pair<int, int> extents =
v_extents();
1362 if (extents.first != extents.second) {
1366 vscrollbar->setRange(extents.first - areaSize.height() + top_margin,
1367 extents.second - btm_margin);
1385 const QSize areaSize =
viewport_->size();
1387 const pair<int, int> extents =
v_extents();
1388 const int trace_height = extents.second - extents.first;
1391 if (areaSize.height() >= trace_height)
1394 ((areaSize.height() - trace_height) / 2));
1402 const int header_pane_width =
1421 int splitter_area_width = 0;
1423 splitter_area_width += w;
1426 QList<int> pane_sizes;
1440 const shared_ptr<sigrok::ChannelGroup> &group,
1441 const map<shared_ptr<data::SignalBase>, shared_ptr<Signal> > &signal_map)
1445 set<TraceTreeItemOwner*> owners;
1446 vector<TraceTreeItemOwner*> owner_list;
1449 for (
const auto& channel : group->channels()) {
1450 for (
auto& entry : signal_map) {
1451 if (entry.first->channel() == channel) {
1453 owner_list.push_back(o);
1460 size_t max_prevalence = 0;
1463 const size_t prevalence = count_if(
1464 owner_list.begin(), owner_list.end(),
1466 if (prevalence > max_prevalence) {
1467 max_prevalence = prevalence;
1468 prevalent_owner = owner;
1472 return prevalent_owner;
1476 const vector< shared_ptr<sigrok::Channel> > &channels,
1477 const map<shared_ptr<data::SignalBase>, shared_ptr<Signal> > &signal_map,
1478 set< shared_ptr<Trace> > &add_list)
1480 vector< shared_ptr<Trace> > filtered_traces;
1482 for (
const auto& channel : channels) {
1483 for (
auto& entry : signal_map) {
1484 if (entry.first->channel() == channel) {
1485 shared_ptr<Trace> trace = entry.second;
1486 const auto list_iter = add_list.find(trace);
1487 if (list_iter == add_list.end())
1490 filtered_traces.push_back(trace);
1491 add_list.erase(list_iter);
1496 return filtered_traces;
1504 for (
const shared_ptr<Signal>& signal :
signals_) {
1505 const shared_ptr<SignalData>
data = signal->base()->data();
1508 const vector< shared_ptr<Segment> > segments = data->segments();
1509 if (!segments.empty())
1510 if (segments[0]->samplerate()) {
1520 const QEvent::Type type =
event->type();
1522 if (type == QEvent::MouseMove) {
1527 const QMouseEvent *
const mouse_event = (QMouseEvent*)event;
1530 else if (
object ==
ruler_)
1533 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 1539 hover_point_ = QPoint(-1, -1);
1547 if (nearest == -1) {
1554 }
else if (type == QEvent::MouseButtonPress) {
1557 const QMouseEvent *
const mouse_event = (QMouseEvent*)event;
1558 if ((
object ==
viewport_) && (mouse_event->button() & Qt::LeftButton)) {
1560 const vector<shared_ptr<TraceTreeItem>> trace_tree_items(
1561 list_by_type<TraceTreeItem>());
1562 for (
const shared_ptr<TraceTreeItem>& r : trace_tree_items)
1563 r->mouse_left_press_event(mouse_event);
1565 }
else if (type == QEvent::Leave) {
1568 }
else if (type == QEvent::Show) {
1593 return QObject::eventFilter(
object, event);
1598 QPoint pos =
event->pos() - QPoint(0,
ruler_->
sizeHint().height());
1602 QMenu* menu =
nullptr;
1608 menu =
new QMenu(
this);
1610 QAction *
const create_marker_here =
new QAction(tr(
"Create marker here"),
this);
1612 menu->addAction(create_marker_here);
1614 menu = r->create_view_context_menu(
this, pos);
1618 menu->popup(event->globalPos());
1624 if (event->size().height() <
event->oldSize().height())
1637 const int64_t start_sample = (
offset_ * samplerate).convert_to<int64_t>();
1638 const int64_t end_sample = (
offset_ * samplerate).convert_to<int64_t>() +
1647 if (start_sample != old_start_sample)
1650 if (end_sample != old_end_sample)
1660 for (
const shared_ptr<Signal>& s :
signals_) {
1661 const pair<int, int> extents = s->v_extents();
1662 const int top = s->get_visual_y() + extents.first;
1663 const int btm = s->get_visual_y() + extents.second;
1665 && s->base()->enabled())
1671 const vector<shared_ptr<TraceTreeItem>> trace_tree_items(
1672 list_by_type<TraceTreeItem>());
1673 for (
const shared_ptr<TraceTreeItem>& r : trace_tree_items)
1769 const int range =
scrollarea_->horizontalScrollBar()->maximum();
1802 nullptr :
cursors_->second().get();
1811 using sigrok::Channel;
1815 vector< shared_ptr<Channel> > channels;
1816 shared_ptr<sigrok::Device> sr_dev;
1817 bool signals_added_or_removed =
false;
1821 bool reset_scrollbar =
1831 channels = sr_dev->channels();
1834 vector< shared_ptr<TraceTreeItem> > new_top_level_items;
1840 const vector<shared_ptr<Trace>> prev_trace_list = list_by_type<Trace>();
1841 const set<shared_ptr<Trace>> prev_traces(
1842 prev_trace_list.begin(), prev_trace_list.end());
1846 #ifdef ENABLE_DECODE 1847 traces.insert(decode_traces_.begin(), decode_traces_.end());
1849 set< shared_ptr<Trace> > add_traces;
1850 set_difference(traces.begin(), traces.end(),
1851 prev_traces.begin(), prev_traces.end(),
1852 inserter(add_traces, add_traces.begin()));
1854 set< shared_ptr<Trace> > remove_traces;
1855 set_difference(prev_traces.begin(), prev_traces.end(),
1856 traces.begin(), traces.end(),
1857 inserter(remove_traces, remove_traces.begin()));
1860 map<shared_ptr<data::SignalBase>, shared_ptr<Signal> > signal_map;
1861 for (
const shared_ptr<Signal>& sig :
signals_)
1862 signal_map[sig->base()] = sig;
1866 for (
auto& entry : sr_dev->channel_groups()) {
1867 const shared_ptr<sigrok::ChannelGroup> &group = entry.second;
1869 if (group->channels().size() <= 1)
1877 shared_ptr<TraceGroup> new_trace_group;
1880 owner = new_trace_group.get();
1885 const vector< shared_ptr<Trace> > new_traces_in_group =
1887 signal_map, add_traces);
1890 const pair<int, int> prev_v_extents = owner->
v_extents();
1891 int offset = prev_v_extents.second - prev_v_extents.first;
1892 for (
const shared_ptr<Trace>& trace : new_traces_in_group) {
1896 const pair<int, int> extents = trace->v_extents();
1897 if (trace->enabled())
1898 offset += -extents.first;
1899 trace->force_to_v_offset(offset);
1900 if (trace->enabled())
1901 offset += extents.second;
1904 if (new_trace_group) {
1906 new_trace_group->restack_items();
1910 if (!new_traces_in_group.empty())
1911 new_top_level_items.push_back(new_trace_group);
1916 vector< shared_ptr<Channel> > logic_channels;
1917 copy_if(channels.begin(), channels.end(), back_inserter(logic_channels),
1918 [](
const shared_ptr<Channel>& c) {
1919 return c->type() == sigrok::ChannelType::LOGIC; });
1921 const vector< shared_ptr<Trace> > non_grouped_logic_signals =
1924 if (non_grouped_logic_signals.size() > 0) {
1925 const shared_ptr<TraceGroup> non_grouped_trace_group(
1926 make_shared<TraceGroup>());
1927 for (
const shared_ptr<Trace>& trace : non_grouped_logic_signals)
1928 non_grouped_trace_group->add_child_item(trace);
1930 non_grouped_trace_group->restack_items();
1931 new_top_level_items.push_back(non_grouped_trace_group);
1935 const vector< shared_ptr<Trace> > new_top_level_signals =
1937 new_top_level_items.insert(new_top_level_items.end(),
1938 new_top_level_signals.begin(), new_top_level_signals.end());
1941 new_top_level_items.insert(new_top_level_items.end(),
1942 add_traces.begin(), add_traces.end());
1945 for (
const shared_ptr<Trace>& trace : remove_traces) {
1949 signals_added_or_removed =
true;
1953 for (shared_ptr<TraceGroup> group : list_by_type<TraceGroup>())
1954 if (group->child_items().size() == 0) {
1961 for (shared_ptr<TraceTreeItem> item : new_top_level_items) {
1969 const pair<int, int> extents = item->v_extents();
1971 if (item->enabled())
1972 offset += -extents.first;
1974 item->force_to_v_offset(offset);
1976 if (item->enabled())
1977 offset += extents.second;
1978 signals_added_or_removed =
true;
1990 if (reset_scrollbar)
2039 bool zoom_to_fit_after_acq =
2044 if (zoom_to_fit_after_acq &&
2111 const QSize areaSize =
viewport_->size();
2112 length =
max(length - areaSize.width(), 0.0);
manual pdf if(NOT EXISTS"${CMAKE_CURRENT_BINARY_DIR}/images") message(STATUS"creating symlink for manual's images/ subdirectory") execute_process(COMMAND $
void on_scroll_to_start_shortcut_triggered()
pv::util::Timestamp tick_period_
const Ruler * ruler() const
View(Session &session, bool is_main_view=false, QMainWindow *parent=nullptr)
pair< int, int > v_extents() const
util::TimeUnit time_unit() const
virtual void remove_signalbase(const shared_ptr< data::SignalBase > signalbase)
pair< pv::util::Timestamp, pv::util::Timestamp > get_time_extents() const
void h_scroll_value_changed(int value)
bool eventFilter(QObject *object, QEvent *event)
shared_ptr< CursorPair > cursors() const
TraceTreeItemOwner * find_prevalent_trace_group(const shared_ptr< sigrok::ChannelGroup > &group, const map< shared_ptr< data::SignalBase >, shared_ptr< Signal > > &signal_map)
void determine_time_unit()
QShortcut * zoom_out_shortcut_
pv::util::SIPrefix tick_prefix() const
vector< shared_ptr< Signal > > signals_
void hover_point_changed(const QWidget *widget, const QPoint &hp)
vector< shared_ptr< TriggerMarker > > trigger_markers_
shared_ptr< Signal > signal_under_mouse_cursor_
void set_v_offset(int offset)
static const QString Key_View_ShowAnalogMinorGrid
void set_time(const pv::util::Timestamp &time) override
QShortcut * zoom_in_shortcut_
virtual void perform_delayed_view_update()
const pv::util::Timestamp & offset() const
void on_setting_changed(const QString &key, const QVariant &value)
void set_zoom(double scale, int offset)
double scale_
The view time scale in seconds per pixel.
void tick_period_changed()
Emitted when the tick_period changed.
static const int ScaleUnits[3]
void remove_child_item(shared_ptr< TraceTreeItem > item)
void get_scroll_layout(double &length, pv::util::Timestamp &offset) const
void set_time_unit(pv::util::TimeUnit time_unit)
void set_tick_prefix(pv::util::SIPrefix tick_prefix)
bool segment_selectable_
Signals whether the user can change the currently shown segment.
void on_segment_completed(int new_segment_id)
static pv::util::Timestamp restore_timestamp(QSettings &settings, const char *name)
void row_item_appearance_changed(bool label, bool content)
T value(details::expression_node< T > *n)
QShortcut * home_shortcut_
QSize sizeHint() const override
QShortcut * zoom_in_shortcut_2_
shared_ptr< ViewItem > get_mouse_over_item(const QPoint &pt)
QShortcut * grab_ruler_right_shortcut_
void sticky_scrolling_changed(bool state)
QAbstractScrollArea * scrollarea() const
bool custom_zero_offset_set_
Shows whether the user set a custom zero offset that we should keep.
void set_segment_display_mode(Trace::SegmentDisplayMode mode)
void set_tick_period(const pv::util::Timestamp &tick_period)
static const QString Key_View_SnapDistance
void set_offset(const pv::util::Timestamp &offset, bool force_update=false)
static const QString Key_View_TriggerIsZeroTime
void set_current_segment(uint32_t segment_id)
uint32_t current_segment_
The ID of the currently displayed segment.
vector< shared_ptr< pv::data::SignalData > > get_visible_data() const
void set_tick_precision(unsigned tick_precision)
virtual void clear_signalbases()
virtual void add_signalbase(const shared_ptr< data::SignalBase > signalbase)
void scale_changed()
Emitted when the scale changed.
void reset_zero_position()
virtual void focus_on_range(uint64_t start_sample, uint64_t end_sample)
void time_item_appearance_changed(bool label, bool content)
int exponent(SIPrefix prefix)
Returns the exponent that corresponds to a given prefix.
QTimer lazy_event_handler_
unsigned int sticky_events_
MetadataObjManager * metadata_obj_manager()
void resize_header_to_fit()
unsigned int depth() const
void show_cursors(bool show=true)
TimeMarker * grabbed_widget_
bool is_main_view() const
void tick_precision_changed()
Emitted when the tick_precision changed.
const QWidget * hover_widget() const
void add_child_item(shared_ptr< TraceTreeItem > item)
virtual void reset_view_state()
void process_sticky_events()
virtual void contextMenuEvent(QContextMenuEvent *event)
T max(const T v0, const T v1)
void segment_changed(int segment_id)
Emitted when the currently selected segment changed.
uint32_t current_segment() const
shared_ptr< devices::Device > device() const
void time_unit_changed()
Emitted when the time_unit changed.
pv::util::Timestamp zero_offset_
The offset of the zero point in seconds.
vector< shared_ptr< TimeItem > > time_items() const
static const QString Key_View_StickyScrolling
static void remove_change_handler(GlobalSettingsInterface *cb)
pv::util::Timestamp zero_offset() const
uint32_t get_highest_segment_id() const
void update_hover_point()
void set_scale_offset(double scale, const pv::util::Timestamp &offset)
void v_scroll_value_changed()
void on_grab_ruler(int ruler_id)
double get_samplerate() const
list< shared_ptr< Flag > > flags_
void offset_changed()
Emitted when the offset changed.
static void store_timestamp(QSettings &settings, const char *name, const pv::util::Timestamp &ts)
static const int MaxScrollValue
virtual void add_signalbase(const shared_ptr< data::SignalBase > signalbase)
void update_view_range_metaobject() const
void remove_flag(shared_ptr< Flag > flag)
unsigned int minor_tick_count() const
QShortcut * zoom_out_shortcut_2_
virtual void remove_signalbase(const shared_ptr< data::SignalBase > signalbase)
CustomScrollArea * scrollarea_
vector< shared_ptr< Signal > > signals() const
static const int ViewScrollMargin
T min(const T v0, const T v1)
Trace::SegmentDisplayMode segment_display_mode_
void calculate_tick_spacing()
shared_ptr< views::ViewBase > main_view() const
capture_state get_capture_state() const
void cursor_state_changed(bool show)
Emitted when the cursors are shown/hidden.
pv::util::SIPrefix tick_prefix_
uint32_t context_menu_x_pos_
void on_zoom_out_shortcut_triggered()
shared_ptr< Signal > get_signal_by_signalbase(shared_ptr< data::SignalBase > base) const
unsigned int minor_tick_count_
pv::util::Timestamp ruler_offset_
The ruler version of the time offset in seconds.
void zoom_fit(bool gui_state)
virtual void reset_view_state()
virtual unsigned int depth() const =0
unsigned int tick_precision_
void restack_all_trace_tree_items()
bool cursors_shown() const
virtual void clear_signalbases()
vector< util::Timestamp > get_triggers(uint32_t segment_id) const
vector< shared_ptr< Flag > > flags() const
QShortcut * cancel_grab_shortcut_
Trace::SegmentDisplayMode segment_display_mode() const
static QString format_time_with_distance(const pv::util::Timestamp &distance, const pv::util::Timestamp &t, pv::util::SIPrefix prefix=pv::util::SIPrefix::unspecified, pv::util::TimeUnit unit=pv::util::TimeUnit::Time, unsigned precision=0, bool sign=true)
void on_zoom_in_shortcut_triggered()
const QPoint & hover_point() const
virtual void save_settings(QSettings &settings) const
int get_h_scrollbar_maximum() const
static const QString Key_View_ZoomToFitAfterAcq
void on_create_marker_here()
void on_new_segment(int new_segment_id)
static const QString Key_View_ShowSamplingPoints
virtual void restore_settings(QSettings &settings)
static const QString Key_View_ZoomToFitDuringAcq
x y t t *t x y t t t x y t t t x *y t *t t x *y t *t t x y t t t x y t t t x(y+z)
shared_ptr< Signal > get_signal_under_mouse_cursor() const
void tick_prefix_changed()
Emitted when the tick_prefix changed.
int owner_visual_v_offset() const
manual txt set(MANUAL_OUT_HTML"${CMAKE_CURRENT_BINARY_DIR}/manual.html") set(MANUAL_OUT_PDF"$
pv::util::Timestamp offset_at_acq_start_
void trigger_event(int segment_id, util::Timestamp location)
void on_segment_changed(int segment)
void on_scroll_to_end_shortcut_triggered()
pv::util::Timestamp get_absolute_time_from_x_pos(uint32_t x) const
bool scroll_needs_defaults_
static const int MaxViewAutoUpdateRate
const pv::util::Timestamp & tick_period() const
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 24 >, boost::multiprecision::et_off > Timestamp
Timestamp type providing yoctosecond resolution.
static const pv::util::Timestamp MaxScale
void always_zoom_to_fit_changed(bool state)
const pv::util::Timestamp & ruler_offset() const
void segment_display_mode_changed(int mode, bool segment_selectable)
void set_scale(double scale)
pv::util::Timestamp offset_
The internal view version of the time offset in seconds.
QShortcut * grab_ruler_left_shortcut_
T pow(const T v0, const T v1)
virtual ViewType get_type() const
void set_h_offset(int offset)
void on_signal_name_changed()
void set_cursors(pv::util::Timestamp &first, pv::util::Timestamp &second)
util::TimeUnit time_unit_
shared_ptr< CursorPair > cursors_
static vector< shared_ptr< Trace > > extract_new_traces_for_channels(const vector< shared_ptr< sigrok::Channel > > &channels, const map< shared_ptr< data::SignalBase >, shared_ptr< Signal > > &signal_map, set< shared_ptr< Trace > > &add_list)
void remove_trace(shared_ptr< Trace > trace)
void set_zero_position(const pv::util::Timestamp &position)
void set_scroll_default()
int64_t get_nearest_level_change(const QPoint &p)
void resizeEvent(QResizeEvent *event)
bool all_segments_complete(uint32_t segment_id) const
unsigned int tick_precision() const
double scale_at_acq_start_
QShortcut * end_shortcut_
bool segment_is_selectable() const
static void add_change_handler(GlobalSettingsInterface *cb)
static const QString Key_View_ColoredBG
static const pv::util::Timestamp MinScale
void determine_if_header_was_shrunk()
shared_ptr< Flag > add_flag(const pv::util::Timestamp &time)
void on_settingViewTriggerIsZeroTime_changed(const QVariant new_value)
void capture_state_updated(int state)
void extents_changed(bool horz, bool vert)