DoubleSlider: Fixed ruler for sequential print of the object with different heights
This commit is contained in:
parent
308d6b7809
commit
a5d5ceb30d
2 changed files with 24 additions and 6 deletions
|
@ -254,7 +254,7 @@ void Control::SetMaxValue(const int max_value)
|
||||||
void Control::SetSliderValues(const std::vector<double>& values)
|
void Control::SetSliderValues(const std::vector<double>& values)
|
||||||
{
|
{
|
||||||
m_values = values;
|
m_values = values;
|
||||||
m_ruler.count = std::count(m_values.begin(), m_values.end(), m_values.front());
|
m_ruler.init(m_values);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos)
|
void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos)
|
||||||
|
@ -1023,8 +1023,23 @@ void Control::draw_colored_band(wxDC& dc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Control::Ruler::init(const std::vector<double>& values)
|
||||||
|
{
|
||||||
|
max_values.clear();
|
||||||
|
max_values.reserve(std::count(values.begin(), values.end(), values.front()));
|
||||||
|
|
||||||
|
auto it = std::find(values.begin() + 1, values.end(), values.front());
|
||||||
|
while (it != values.end()) {
|
||||||
|
max_values.push_back(*(it - 1));
|
||||||
|
it = std::find(it + 1, values.end(), values.front());
|
||||||
|
}
|
||||||
|
max_values.push_back(*(it - 1));
|
||||||
|
}
|
||||||
|
|
||||||
void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, double scroll_step)
|
void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, double scroll_step)
|
||||||
{
|
{
|
||||||
|
if (values.empty())
|
||||||
|
return;
|
||||||
int DPI = GUI::get_dpi_for_window(win);
|
int DPI = GUI::get_dpi_for_window(win);
|
||||||
int pixels_per_sm = lround((double)(DPI) * 5.0/25.4);
|
int pixels_per_sm = lround((double)(DPI) * 5.0/25.4);
|
||||||
|
|
||||||
|
@ -1035,7 +1050,7 @@ void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, do
|
||||||
|
|
||||||
int pow = -2;
|
int pow = -2;
|
||||||
int step = 0;
|
int step = 0;
|
||||||
auto end_it = count == 1 ? values.end() : values.begin() + lround(values.size() / count);
|
auto end_it = std::find(values.begin() + 1, values.end(), values.front());
|
||||||
|
|
||||||
while (pow < 3) {
|
while (pow < 3) {
|
||||||
for (int istep : {1, 2, 5}) {
|
for (int istep : {1, 2, 5}) {
|
||||||
|
@ -1099,7 +1114,7 @@ void Control::draw_ruler(wxDC& dc)
|
||||||
double short_tick = std::nan("");
|
double short_tick = std::nan("");
|
||||||
int tick = 0;
|
int tick = 0;
|
||||||
double value = 0.0;
|
double value = 0.0;
|
||||||
int sequence = 0;
|
size_t sequence = 0;
|
||||||
|
|
||||||
int prev_y_pos = -1;
|
int prev_y_pos = -1;
|
||||||
wxCoord label_height = dc.GetMultiLineTextExtent("0").y - 2;
|
wxCoord label_height = dc.GetMultiLineTextExtent("0").y - 2;
|
||||||
|
@ -1107,7 +1122,7 @@ void Control::draw_ruler(wxDC& dc)
|
||||||
|
|
||||||
while (tick <= m_max_value) {
|
while (tick <= m_max_value) {
|
||||||
value += m_ruler.long_step;
|
value += m_ruler.long_step;
|
||||||
if (value > m_values.back() && sequence < m_ruler.count) {
|
if (value > m_ruler.max_values[sequence] && sequence < m_ruler.count()) {
|
||||||
value = m_ruler.long_step;
|
value = m_ruler.long_step;
|
||||||
for (; tick < values_size; tick++)
|
for (; tick < values_size; tick++)
|
||||||
if (m_values[tick] < value)
|
if (m_values[tick] < value)
|
||||||
|
@ -1140,7 +1155,7 @@ void Control::draw_ruler(wxDC& dc)
|
||||||
|
|
||||||
draw_short_ticks(dc, short_tick, tick);
|
draw_short_ticks(dc, short_tick, tick);
|
||||||
|
|
||||||
if (value == m_values.back() && sequence < m_ruler.count) {
|
if (value == m_ruler.max_values[sequence] && sequence < m_ruler.count()) {
|
||||||
value = 0.0;
|
value = 0.0;
|
||||||
sequence++;
|
sequence++;
|
||||||
tick++;
|
tick++;
|
||||||
|
|
|
@ -424,10 +424,13 @@ private:
|
||||||
struct Ruler {
|
struct Ruler {
|
||||||
double long_step;
|
double long_step;
|
||||||
double short_step;
|
double short_step;
|
||||||
int count { 1 }; // > 1 for sequential print
|
std::vector<double> max_values;// max value for each object/instance in sequence print
|
||||||
|
// > 1 for sequential print
|
||||||
|
|
||||||
|
void init(const std::vector<double>& values);
|
||||||
void update(wxWindow* win, const std::vector<double>& values, double scroll_step);
|
void update(wxWindow* win, const std::vector<double>& values, double scroll_step);
|
||||||
bool is_ok() { return long_step > 0 && short_step > 0; }
|
bool is_ok() { return long_step > 0 && short_step > 0; }
|
||||||
|
size_t count() { return max_values.size(); }
|
||||||
} m_ruler;
|
} m_ruler;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue