///|
fn concise_field(value : DateTime, level : Int32) -> Int32 {
match level {
0 => value.year
1 => value.month
2 => value.day
3 => value.hour
4 => value.minute
_ => value.second
}
}
///|
// Fixed dates.py ConciseDateFormatter.format_ticks, independent of locator
// selection. Calendar fields select the finest unit that differs in the batch.
fn concise_layout(
formatter : DateFormatter,
settings : ConciseSettings,
values : Array[Double],
inverted : Bool,
) -> (Array[String], String) raise DateError {
if values.is_empty() {
return ([], "")
}
let dates : Array[DateTime] = []
for value in values {
dates.push(formatter.converted_date(value))
}
let mut level = 5
let mut show_offset = settings.show_offset
for step in 0..<6 {
let index = 5 - step
let first = concise_field(dates[0], index)
if dates.any(value => concise_field(value, index) != first) {
level = index
if index < 2 && dates.any(value => concise_field(value, index) == 1) {
show_offset = false
}
break
}
}
let labels : Array[String] = []
for date in dates {
let zero = if level < 5 {
concise_field(date, level) ==
(if level == 1 || level == 2 { 1 } else { 0 })
} else {
date.second == 0 && date.microsecond == 0
}
labels.push(
format_date(
date,
if zero {
settings.zero_formats[level]
} else {
settings.formats[level]
},
),
)
}
if level >= 5 {
let mut trailing_zeros : Int32? = None
for label in labels {
if label.contains(".") {
let count = label.length() - label.trim_end(chars="0").length()
trailing_zeros = Some(
match trailing_zeros {
Some(previous) => Int32::min(previous, count)
None => count
},
)
}
}
if trailing_zeros is Some(count) && count > 0 {
for index in 0..