Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ preferences convert them.

### Settings Persistence Contract

`UserSettings` (`src/settings.rs`) is a `Serialize`/`Deserialize` struct persisted as JSON at `{app_data_dir}/UltraLog/settings.json` (or `.../ultralog/settings.json` on Linux). It currently covers: `language`, `scroll_to_zoom`, `show_grid`, `grid_opacity`, `unit_preferences`, `font_scale`, `color_blind_mode`, `ultra_intensity`, `high_contrast`, `field_normalization`, `cursor_tracking`, `auto_check_updates`, `custom_normalizations`, and the Track Map preferences (`tile_provider`, `tile_cache_max_mb`, `tiles_enabled`, `tile_opacity`, `tile_grayscale`, `tile_privacy_notice_seen`, `hidden_widgets`), and `export` (the ExportDialog's last format and theme per format).
`UserSettings` (`src/settings.rs`) is a `Serialize`/`Deserialize` struct persisted as JSON at `{app_data_dir}/UltraLog/settings.json` (or `.../ultralog/settings.json` on Linux). It currently covers: `language`, `scroll_to_zoom`, `show_grid`, `hover_readout` (default on), `grid_opacity`, `unit_preferences`, `font_scale`, `color_blind_mode`, `ultra_intensity`, `high_contrast`, `field_normalization`, `cursor_tracking`, `auto_check_updates`, `custom_normalizations`, and the Track Map preferences (`tile_provider`, `tile_cache_max_mb`, `tiles_enabled`, `tile_opacity`, `tile_grayscale`, `tile_privacy_notice_seen`, `hidden_widgets`), and `export` (the ExportDialog's last format and theme per format).

- **Load** - `UltraLogApp::new` calls `UserSettings::load()` and copies each field into the corresponding live `UltraLogApp` field (e.g. `app.color_blind_mode = user_settings.color_blind_mode`).
- **Save** - `UltraLogApp` implements `eframe::App::save`, which eframe calls on its auto-save interval (~30s) and again at shutdown. `save()` rebuilds a `UserSettings` from the current live fields, and only writes to disk if it differs from the last-loaded/saved value.
Expand Down Expand Up @@ -877,6 +877,7 @@ ColorScale, and the footer (ultralog.co · version · export date).
- **Playback** - Play through log data at 0.25x to 8x speed
- **Cursor Tracking** - Lock view to follow cursor during playback/scrubbing
- **Min/Max Legend** - Shows peak values for each channel
- **Hover Readout** - A hairline and a value box at the mouse pointer with every series' value there (issue #98 follow-up), beside the cursor legend; `plot_style::hover_readout`, rows from `series_rows_at`, so log B and R4 apply. It turns off egui_plot's crosshair (`show_crosshair(!hover_readout)`); Settings → Display → Values at the pointer
- **Initial Zoom** - Charts start zoomed to first 60 seconds for better initial view
- **Multi-File Tabs** - Chrome-style tabs for working with multiple log files simultaneously
- **Internationalization** - `rust-i18n`-backed language selection (`src/i18n.rs`)
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ultralog"
version = "3.0.0"
version = "3.1.0"
edition = "2024"
# egui/eframe 0.36 is the binding constraint on the minimum supported Rust
# version; edition 2024 itself only needs 1.85.
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ A high-performance, cross-platform ECU log viewer written in Rust.

![CI](https://github.com/ClassicMiniDIY/UltraLog/actions/workflows/ci.yml/badge.svg)
![License](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)
![Version](https://img.shields.io/badge/version-3.0.0-green.svg)
![Version](https://img.shields.io/badge/version-3.1.0-green.svg)

---

Expand Down Expand Up @@ -47,6 +47,7 @@ UltraLog is an **independent, open-source** desktop application designed for aut
- **Normalized display** - All channels scaled 0-1 for easy comparison regardless of original units
- **Min/Max legend** - Peak values displayed for each channel at a glance
- **Real-time cursor values** - Legend shows live values at cursor position with proper units
- **Values at the pointer** - Move the mouse over the chart for a line and a box with every channel's value at that point, without clicking (turn it off in Settings → Display)
- **High-performance rendering** - LTTB (Largest Triangle Three Buckets) algorithm reduces millions of points to 2,000 while preserving visual fidelity
- **Stacked plot areas** - Split the chart into up to 10 independent vertically-stacked panels, each with its own Y-axis and channel set — ideal for comparing channels with wildly different scales

Expand Down
2 changes: 2 additions & 0 deletions i18n/ar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "عجلة الماوس تكبر المخطط مباشرة بدلاً من الإزاحة"
show_grid: "إظهار الشبكة"
show_grid_desc: "رسم شبكة الخلفية للرسم البياني"
hover_readout: "القيم عند المؤشر"
hover_readout_desc: "اعرض خطاً وقيمة كل قناة حيث تشير الفأرة على الرسم البياني"
grid_opacity: "الشفافية:"
field_names: "أسماء الحقول"
field_normalization: "توحيد الحقول"
Expand Down
2 changes: 2 additions & 0 deletions i18n/bn.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "মাউস হুইল সরাসরি চার্টকে জুম করে প্যানিং এর পরিবর্তে"
show_grid: "গ্রিড দেখান"
show_grid_desc: "চার্ট পটভূমি গ্রিড আঁকুন"
hover_readout: "পয়েন্টারে মান"
hover_readout_desc: "চার্টে মাউস যেখানে আছে সেখানে একটি রেখা এবং প্রতিটি চ্যানেলের মান দেখান"
grid_opacity: "স্বচ্ছতা:"
field_names: "ফিল্ড নাম"
field_normalization: "ফিল্ড নরমালাইজেশন"
Expand Down
2 changes: 2 additions & 0 deletions i18n/de.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "Mausrad zoomt direkt in das Diagramm, anstatt es zu verschieben"
show_grid: "Gitter anzeigen"
show_grid_desc: "Gitter im Hintergrund anzeichnen"
hover_readout: "Werte am Mauszeiger"
hover_readout_desc: "Zeigt eine Linie und den Wert jedes Kanals dort, wo die Maus im Diagramm steht"
grid_opacity: "Deckkraft:"
field_names: "Feldnamen"
field_normalization: "Feldnormalisierung"
Expand Down
2 changes: 2 additions & 0 deletions i18n/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "Scroll wheel zooms the chart directly instead of panning"
show_grid: "Show grid"
show_grid_desc: "Draw the chart background grid"
hover_readout: "Values at the pointer"
hover_readout_desc: "Show a line and every channel's value where the mouse points on the chart"
grid_opacity: "Opacity"
field_names: "Field Names"
field_normalization: "Field normalization"
Expand Down
2 changes: 2 additions & 0 deletions i18n/es.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ settings:
scroll_to_zoom_desc: "La rueda de desplazamiento amplía el gráfico directamente en lugar de desplazarse"
show_grid: "Mostrar cuadrícula"
show_grid_desc: "Mostrar la cuadrícula de fondo del gráfico"
hover_readout: "Valores en el puntero"
hover_readout_desc: "Muestra una línea y el valor de cada canal donde apunta el ratón en el gráfico"
grid_opacity: "Opacidad:"
field_names: "Nombres de Campos"
field_normalization: "Normalizacion de Campos"
Expand Down
2 changes: 2 additions & 0 deletions i18n/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "La molette de la souris zoome le graphique directement au lieu de faire defiler"
show_grid: "Afficher la grille"
show_grid_desc: "Afficher la grille de fond du graphique"
hover_readout: "Valeurs sous le pointeur"
hover_readout_desc: "Affiche une ligne et la valeur de chaque canal là où pointe la souris sur le graphique"
grid_opacity: "Opacité :"
field_names: "Noms des champs"
field_normalization: "Normalisation des champs"
Expand Down
2 changes: 2 additions & 0 deletions i18n/hi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "माउस व्हील सीधे चार्ट को ज़ूम करता है, पैन करने के बजाय"
show_grid: "ग्रिड दिखाएं"
show_grid_desc: "चार्ट पृष्ठभूमि ग्रिड बनाएं"
hover_readout: "पॉइंटर पर मान"
hover_readout_desc: "चार्ट पर जहाँ माउस है वहाँ एक रेखा और हर चैनल का मान दिखाएँ"
grid_opacity: "अस्पष्टता:"
field_names: "फ़ील्ड नाम"
field_normalization: "फ़ील्ड नॉर्मलाइज़ेशन"
Expand Down
2 changes: 2 additions & 0 deletions i18n/id.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "Roda mouse memperbesar grafik secara langsung daripada menggeser"
show_grid: "Tampilkan Kisi"
show_grid_desc: "Gambar kisi latar belakang bagan"
hover_readout: "Nilai di penunjuk"
hover_readout_desc: "Tampilkan garis dan nilai setiap kanal di tempat mouse menunjuk pada grafik"
grid_opacity: "Opacity:"
field_names: "Nama Field"
field_normalization: "Normalisasi Field"
Expand Down
2 changes: 2 additions & 0 deletions i18n/it.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "La rotella del mouse ingrandisce il grafico direttamente invece di scorrere"
show_grid: "Mostra griglia"
show_grid_desc: "Disegna la griglia di sfondo del grafico"
hover_readout: "Valori al puntatore"
hover_readout_desc: "Mostra una linea e il valore di ogni canale dove punta il mouse sul grafico"
grid_opacity: "Opacità:"
field_names: "Nomi dei Campi"
field_normalization: "Normalizzazione Campi"
Expand Down
2 changes: 2 additions & 0 deletions i18n/ja.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "マウスホイールでチャートを直接ズームします(パンの代わりに)"
show_grid: "グリッドを表示"
show_grid_desc: "チャートの背景グリッドを描画"
hover_readout: "ポインター位置の値"
hover_readout_desc: "チャート上でマウスが指す位置に線と各チャンネルの値を表示します"
grid_opacity: "不透明度:"
field_names: "フィールド名"
field_normalization: "フィールド正規化"
Expand Down
2 changes: 2 additions & 0 deletions i18n/pt-BR.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ settings:
scroll_to_zoom_desc: "A roda do mouse amplia o gráfico diretamente em vez de fazer pan"
show_grid: "Mostrar Grade"
show_grid_desc: "Desenhar a grade de fundo do gráfico"
hover_readout: "Valores no ponteiro"
hover_readout_desc: "Mostra uma linha e o valor de cada canal onde o mouse aponta no gráfico"
grid_opacity: "Opacidade:"
field_names: "Nomes dos Campos"
field_normalization: "Normalização de Campos"
Expand Down
2 changes: 2 additions & 0 deletions i18n/pt-PT.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "A roda do rato amplia o gráfico diretamente em vez de fazer pan"
show_grid: "Mostrar Grelha"
show_grid_desc: "Desenhar a grelha de fundo do gráfico"
hover_readout: "Valores no ponteiro"
hover_readout_desc: "Mostra uma linha e o valor de cada canal onde o rato aponta no gráfico"
grid_opacity: "Opacidade:"
field_names: "Nomes dos Campos"
field_normalization: "Normalização de Campos"
Expand Down
2 changes: 2 additions & 0 deletions i18n/ru.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ settings:
scroll_to_zoom_desc: "Колесико мыши увеличивает график напрямую вместо панорамирования"
show_grid: "Показывать сетку"
show_grid_desc: "Отображать координатную сетку на графике"
hover_readout: "Значения под указателем"
hover_readout_desc: "Показывает линию и значение каждого канала там, где на графике находится мышь"
grid_opacity: "Прозрачность:"
field_names: "Имена полей"
field_normalization: "Нормализация полей"
Expand Down
2 changes: 2 additions & 0 deletions i18n/ur.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ settings:
scroll_to_zoom_desc: "ماؤس وہیل براہ راست چارٹ کو بڑھاتا ہے بجائے پیننگ کے"
show_grid: "گرڈ دکھائیں"
show_grid_desc: "چار्ट کی پس منظر کی شبکہ کھینچیں"
hover_readout: "پوائنٹر پر قدریں"
hover_readout_desc: "چارٹ پر جہاں ماؤس ہے وہاں ایک لکیر اور ہر چینل کی قدر دکھائیں"
grid_opacity: "شفافیت:"
field_names: "فیلڈ کے نام"
field_normalization: "فیلڈ نارملائزیشن"
Expand Down
2 changes: 2 additions & 0 deletions i18n/zh-CN.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ settings:
scroll_to_zoom_desc: "鼠标滚轮直接缩放图表,而不是平移"
show_grid: "显示网格"
show_grid_desc: "绘制图表背景网格"
hover_readout: "指针处的数值"
hover_readout_desc: "在图表上鼠标所指的位置显示一条线和每个通道的数值"
grid_opacity: "不透明度:"
field_names: "字段名称"
field_normalization: "字段标准化"
Expand Down
5 changes: 5 additions & 0 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ pub struct UltraLogApp {
pub(crate) scroll_to_zoom: bool,
/// When true, draw the chart background grid
pub(crate) show_grid: bool,
/// When true, the chart shows a line and a value box at the mouse pointer
pub(crate) hover_readout: bool,
/// Grid line opacity (0..=255) used as the alpha of the base grid color
pub(crate) grid_opacity: u8,
// === Unit Preferences ===
Expand Down Expand Up @@ -278,6 +280,7 @@ impl Default for UltraLogApp {
initial_view_seconds: 60.0, // Start with 60 second view
scroll_to_zoom: false,
show_grid: true,
hover_readout: true,
grid_opacity: 255,
unit_preferences: UnitPreferences::default(),
font_scale: FontScale::default(),
Expand Down Expand Up @@ -340,6 +343,7 @@ impl UltraLogApp {
language: user_settings.language,
scroll_to_zoom: user_settings.scroll_to_zoom,
show_grid: user_settings.show_grid,
hover_readout: user_settings.hover_readout,
grid_opacity: user_settings.grid_opacity,
unit_preferences: user_settings.unit_preferences.clone(),
font_scale: user_settings.font_scale,
Expand Down Expand Up @@ -2632,6 +2636,7 @@ impl eframe::App for UltraLogApp {
language: self.language,
scroll_to_zoom: self.scroll_to_zoom,
show_grid: self.show_grid,
hover_readout: self.hover_readout,
grid_opacity: self.grid_opacity,
unit_preferences: self.unit_preferences.clone(),
font_scale: self.font_scale,
Expand Down
9 changes: 9 additions & 0 deletions src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ pub struct UserSettings {
/// When true, draw the chart background grid
#[serde(default = "default_show_grid")]
pub show_grid: bool,
/// When true, the chart shows a line and a value box at the mouse pointer (issue #98).
/// On by default, also for settings files from before it existed.
#[serde(default = "default_hover_readout")]
pub hover_readout: bool,
/// Grid line opacity, 0..=255. Modulates the base grid color's alpha
/// before egui_plot's distance-based fade
#[serde(default = "default_grid_opacity")]
Expand Down Expand Up @@ -106,6 +110,10 @@ fn default_show_grid() -> bool {
true
}

fn default_hover_readout() -> bool {
true
}

fn default_grid_opacity() -> u8 {
255
}
Expand All @@ -129,6 +137,7 @@ impl Default for UserSettings {
language: Language::default(),
scroll_to_zoom: false,
show_grid: default_show_grid(),
hover_readout: default_hover_readout(),
grid_opacity: default_grid_opacity(),
unit_preferences: UnitPreferences::default(),
font_scale: FontScale::default(),
Expand Down
5 changes: 0 additions & 5 deletions src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -646,11 +646,6 @@ impl PlotArea {
collapsed: false,
}
}

/// Get the number of channels in this plot area
pub fn channel_count(&self) -> usize {
self.channel_indices.len()
}
}

// ============================================================================
Expand Down
Loading
Loading