using pv::data::SignalData;
using pv::data::Segment;
-using pv::util::format_time;
using pv::util::TimeUnit;
using pv::util::Timestamp;
updating_scroll_(false),
sticky_scrolling_(false), // Default setting is set in MainWindow::setup_ui()
always_zoom_to_fit_(false),
- tick_period_(0.0),
+ tick_period_(0),
tick_prefix_(pv::util::SIPrefix::yocto),
tick_precision_(0),
time_unit_(util::TimeUnit::Time),
}
}
-double View::tick_period() const
+const pv::util::Timestamp& View::tick_period() const
{
return tick_period_;
}
-void View::set_tick_period(double tick_period)
+void View::set_tick_period(const pv::util::Timestamp& tick_period)
{
if (tick_period_ != tick_period) {
tick_period_ = tick_period;
QFontMetrics m(QApplication::font());
+ // Copies of the member variables with the same name, used in the calculation
+ // and written back afterwards, so that we don't emit signals all the time
+ // during the calculation.
+ pv::util::Timestamp tick_period = tick_period_;
+ pv::util::SIPrefix tick_prefix = tick_prefix_;
+ unsigned tick_precision = tick_precision_;
+
do {
const double min_period = scale_ * min_width;
const int order = (int)floorf(log10f(min_period));
- const double order_decimal = pow(10.0, order);
+ const pv::util::Timestamp order_decimal =
+ pow(pv::util::Timestamp(10), order);
// Allow for a margin of error so that a scale unit of 1 can be used.
// Otherwise, for a SU of 1 the tick period will almost always be below
unsigned int unit = 0;
do {
- tp_with_margin = order_decimal * (ScaleUnits[unit++] + tp_margin);
+ tp_with_margin = order_decimal.convert_to<double>() *
+ (ScaleUnits[unit++] + tp_margin);
} while (tp_with_margin < min_period && unit < countof(ScaleUnits));
- set_tick_period(order_decimal * ScaleUnits[unit - 1]);
- set_tick_prefix(static_cast<pv::util::SIPrefix>(
- (order - pv::util::exponent(pv::util::SIPrefix::yocto)) / 3));
+ tick_period = order_decimal * ScaleUnits[unit - 1];
+ tick_prefix = static_cast<pv::util::SIPrefix>(
+ (order - pv::util::exponent(pv::util::SIPrefix::yocto)) / 3);
// Precision is the number of fractional digits required, not
// taking the prefix into account (and it must never be negative)
- set_tick_precision(std::max((int)ceil(log10f(1 / tick_period_)), 0));
+ tick_precision = std::max(ceil(log10(1 / tick_period)).convert_to<int>(), 0);
- tick_period_width = tick_period_ / scale_;
+ tick_period_width = (tick_period / scale_).convert_to<double>();
- const QString label_text =
- format_time(max_time, tick_prefix_, time_unit_, tick_precision_);
+ const QString label_text = Ruler::format_time_with_distance(
+ tick_period, max_time, tick_prefix, time_unit_, tick_precision);
label_width = m.boundingRect(0, 0, INT_MAX, INT_MAX,
Qt::AlignLeft | Qt::AlignTop, label_text).width() +
MinValueSpacing;
min_width += SpacingIncrement;
-
} while (tick_period_width < label_width);
+
+ set_tick_period(tick_period);
+ set_tick_prefix(tick_prefix);
+ set_tick_precision(tick_precision);
}
void View::update_scroll()
get_scroll_layout(length, offset);
length = max(length - areaSize.width(), 0.0);
- int major_tick_distance = tick_period_ / scale_;
+ int major_tick_distance = (tick_period_ / scale_).convert_to<int>();
horizontalScrollBar()->setPageStep(areaSize.width() / 2);
horizontalScrollBar()->setSingleStep(major_tick_distance);