Skip to content
Open
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Fullscreen stages the cover four ways, picked from one Stage setting under Appearance >
Fullscreen: plain, haloed in drifting particles with a ring of spectrum bars, dressed as the
label of a record that turns under a slow sheen, or slid out of its square sleeve with the
record turning behind it. The cover turns with the record wherever there is one, the particles
fade in as the music starts and out as it stops, and how many of them drift is its own setting.

### Changed

- An artist page opens as soon as their profile and popular tracks arrive, and fills its
Expand Down
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,19 +187,19 @@ AI-assisted proofreading and translation of human-written text are permitted.

| Language | Translated | Coverage |
| --- | --- | --- |
| English (`en-US`) | 720/720 | 100% |
| Deutsch (`de`) | 631/720 | 88% |
| Español (`es`) | 691/720 | 96% |
| Français (`fr`) | 631/720 | 88% |
| Italiano (`it`) | 609/720 | 85% |
| Bahasa Indonesia (`id`) | 609/720 | 85% |
| 日本語 (`ja`) | 609/720 | 85% |
| Русский (`ru`) | 711/720 | 99% |
| Українська (`uk`) | 711/720 | 99% |
| Polski (`pl`) | 711/720 | 99% |
| Português (Brasil) (`pt-BR`) | 609/720 | 85% |
| 简体中文 (`zh-CN`) | 609/720 | 85% |
| Türkçe (`tr`) | 609/720 | 85% |
| English (`en-US`) | 733/733 | 100% |
| Deutsch (`de`) | 631/733 | 86% |
| Español (`es`) | 691/733 | 94% |
| Français (`fr`) | 631/733 | 86% |
| Italiano (`it`) | 609/733 | 83% |
| Bahasa Indonesia (`id`) | 609/733 | 83% |
| 日本語 (`ja`) | 609/733 | 83% |
| Русский (`ru`) | 711/733 | 96% |
| Українська (`uk`) | 711/733 | 96% |
| Polski (`pl`) | 711/733 | 96% |
| Português (Brasil) (`pt-BR`) | 609/733 | 83% |
| 简体中文 (`zh-CN`) | 609/733 | 83% |
| Türkçe (`tr`) | 609/733 | 83% |

<!-- i18n:end -->

Expand Down
9 changes: 9 additions & 0 deletions assets/i18n/en-US/main.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,15 @@ settings-ambient = Ambient background
settings-ambient-detail = Fill the fullscreen player with colours drawn from the cover
settings-ambient-motion = Ambient motion
settings-ambient-motion-detail = Drift the ambient colours instead of holding them still
settings-stage = Stage
settings-stage-detail = How fullscreen stages the cover
settings-stage-style-cover = Cover only
settings-stage-style-starry = Starry
settings-stage-style-vinyl = Spinning vinyl
settings-stage-style-sleeve = Sleeve and vinyl
settings-particles = Drifting particles
settings-particles-detail = How many particles drift off the cover
settings-particles-value = { $count }
settings-visualizer = Visualizer
settings-visualizer-detail = How the spectrum is drawn behind fullscreen artwork
settings-visualizer-style-none = Off
Expand Down
4 changes: 2 additions & 2 deletions crates/state/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ pub use scrobble::{ScrobbleRow, ScrobbleState, Scrobbling};
pub use search::{AlbumHit, ArtistHit, Hit, Kind, PlaylistHit, Search};
pub use session::{Failure, ProviderInfo, Session, SessionEvent, SessionState};
pub use settings::{
AppSettings, DiscordName, FilterValue, FullscreenControlsAutohide, RomanizationScripts,
SYSTEM_FONT, SideTab, remember_window, window_placement,
AppSettings, DiscordName, FilterValue, FullscreenControlsAutohide, MAX_PARTICLES,
RomanizationScripts, SYSTEM_FONT, SideTab, remember_window, window_placement,
};
pub use song::SongDetail;
pub use tags::{TagState, Tags};
Expand Down
50 changes: 50 additions & 0 deletions crates/state/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,8 @@ const DEFAULT_SIDEBAR_WIDTH: f32 = 195.;
const DEFAULT_SIDEBAR_RIGHT_WIDTH: f32 = 254.;
const DEFAULT_FONT_SIZE: f32 = 14.;
const DEFAULT_LYRICS_SCALE: f32 = 1.;
/// The most particles the starry stage sheds. The stepper in settings steps to this too.
pub const MAX_PARTICLES: usize = 1024;
const DEFAULT_STARTUP: &str = "home";
/// "Whatever the platform uses".
pub const SYSTEM_FONT: &str = "auto";
Expand Down Expand Up @@ -314,6 +316,14 @@ struct Appearance {
adaptive_theme: bool,
ambient: bool,
ambient_motion: bool,
/// Whether the fullscreen stage is on — the on bit of `stage_style`, kept
/// so an old settings file keeps its answer.
starry: bool,
/// The record choice from before the stage styles were one setting, read
/// only while `stage_style` is still empty.
vinyl: bool,
particles: usize,
stage_style: String,
visualizer: bool,
visualizer_style: String,
icons: String,
Expand Down Expand Up @@ -504,6 +514,10 @@ impl Default for Appearance {
adaptive_theme: true,
ambient: true,
ambient_motion: true,
starry: false,
vinyl: true,
particles: 36,
stage_style: String::new(),
visualizer: true,
visualizer_style: ui::VisualizerStyle::default().id().to_owned(),
icons: icons::BASE.to_owned(),
Expand Down Expand Up @@ -796,6 +810,27 @@ impl AppSettings {
self.values.appearance.ambient_motion
}

/// How fullscreen stages the cover. The old `starry` switch is still the
/// on bit and the old `vinyl` switch the record choice, so a settings file
/// written before the three were one setting keeps its answers.
pub fn stage_style(&self) -> ui::StageStyle {
match self.values.appearance.starry {
false => ui::StageStyle::Cover,
true => match self.values.appearance.stage_style.as_str() {
"" => match self.values.appearance.vinyl {
true => ui::StageStyle::Vinyl,
false => ui::StageStyle::Starry,
},
id => ui::StageStyle::from_id(id),
},
}
}

/// How many particles drift off the cover in the starry stage.
pub fn particles(&self) -> usize {
self.values.appearance.particles.min(MAX_PARTICLES)
}

/// Whether the playing cover should colour the theme, given whether fullscreen is up. The
/// ambient background is painted out of the tint, so fullscreen tints whatever the adaptive
/// theme setting says.
Expand Down Expand Up @@ -1397,6 +1432,21 @@ impl AppSettings {
self.schedule_save(cx);
}

/// Picking a style turns the stage on; picking `Cover` turns it off and
/// leaves the style behind it alone, so the old choice comes back with it.
pub fn set_stage_style(&mut self, style: ui::StageStyle, cx: &mut Context<Self>) {
self.values.appearance.starry = style.shown();
if style.shown() {
self.values.appearance.stage_style = style.id().to_owned();
}
self.schedule_save(cx);
}

pub fn set_particles(&mut self, particles: usize, cx: &mut Context<Self>) {
self.values.appearance.particles = particles.clamp(0, MAX_PARTICLES);
self.schedule_save(cx);
}

/// Picking a style turns the visualizer on; picking `None` turns it off and leaves the style
/// behind it alone, so the old choice comes back with it.
pub fn set_visualizer_style(&mut self, style: ui::VisualizerStyle, cx: &mut Context<Self>) {
Expand Down
Loading
Loading