Skip to content

Commit

Permalink
Add a Timer widget to the playing music screen
Browse files Browse the repository at this point in the history
  • Loading branch information
Pixaurora committed Oct 9, 2024
1 parent bb7fa41 commit 5aef7a3
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,20 @@
import java.util.Optional;

import net.pixaurora.kitten_cube.impl.math.Size;
import net.pixaurora.kitten_cube.impl.ui.screen.align.AlignmentStrategy;
import net.pixaurora.kitten_cube.impl.ui.screen.align.PointManager;
import net.pixaurora.kitten_cube.impl.ui.widget.Widget;

public class WidgetContainer<T extends Widget> {
private final T widget;
private Optional<Size> window;
private Optional<AlignmentStrategy> customizedAlignment;
private Optional<PointManager> aligner;

public WidgetContainer(T widget) {
this.widget = widget;
this.window = Optional.empty();
this.customizedAlignment = Optional.empty();
this.aligner = Optional.empty();
}

Expand All @@ -23,8 +28,25 @@ public Optional<PointManager> customizedAligner() {
return this.aligner;
}

public WidgetContainer<T> customizedAlignment(AlignmentStrategy newAlignment) {
this.customizedAlignment = Optional.of(newAlignment);
this.updateAlignment();

return this;
}

public void onWindowUpdate(Size window) {
this.window = Optional.of(window);
this.widget.onWindowUpdate(window);
this.aligner = this.widget.alignmentMethod().map(alignment -> new PointManager(alignment, window));

this.updateAlignment();
}

private void updateAlignment() {
Size window = this.window.orElseThrow(RuntimeException::new);

Optional<AlignmentStrategy> alignment = this.customizedAlignment.isPresent() ? this.customizedAlignment
: this.widget.alignmentMethod();
this.aligner = alignment.map(alignment0 -> new PointManager(alignment0, window));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.pixaurora.kitten_heart.impl.music.progress;

import java.time.Duration;
import java.util.Optional;

import net.pixaurora.kit_tunes.api.music.ListeningProgress;
Expand All @@ -25,10 +26,20 @@ public ListeningProgress progress() {

@Override
public double percentComplete() {
return (double) this.playedDuration().toMillis() / this.totalDuration().toMillis();
}

@Override
public Duration playedDuration() {
return this.progress.amountPlayed();
}

@Override
public Duration totalDuration() {
if (this.track.isPresent()) {
return (double) this.progress.amountPlayed().toMillis() / this.track.get().duration().toMillis();
return this.track.get().duration();
} else {
return 1.0;
return this.playedDuration();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.pixaurora.kitten_heart.impl.KitTunes;
import net.pixaurora.kitten_heart.impl.music.progress.PlayingSong;
import net.pixaurora.kitten_heart.impl.ui.screen.KitTunesScreenTemplate;
import net.pixaurora.kitten_heart.impl.ui.widget.Timer;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBar;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBarTileSet;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBarTileSets;
Expand Down Expand Up @@ -80,8 +81,10 @@ private static interface DisplayMode {

public DisplayMode createMusicDisplay(PlayingSong song) {
WidgetContainer<ProgressBar> progressBar = this.addWidget(new ProgressBar(song, playingSongTileSet));
WidgetContainer<Timer> timer = this.addWidget(new Timer(Point.of(0, -9), song))
.customizedAlignment(Alignment.CENTER_BOTTOM);

return new MusicDisplayMode(progressBar, song);
return new MusicDisplayMode(progressBar, timer, song);
}

public DisplayMode createWaitingDisplay() {
Expand All @@ -90,10 +93,12 @@ public DisplayMode createWaitingDisplay() {

private class MusicDisplayMode implements DisplayMode {
private final WidgetContainer<ProgressBar> progressBar;
private final WidgetContainer<Timer> timer;
private final PlayingSong song;

MusicDisplayMode(WidgetContainer<ProgressBar> progressBar, PlayingSong song) {
MusicDisplayMode(WidgetContainer<ProgressBar> progressBar, WidgetContainer<Timer> timer, PlayingSong song) {
this.progressBar = progressBar;
this.timer = timer;
this.song = song;
}

Expand All @@ -105,6 +110,7 @@ public boolean isActive() {
@Override
public void cleanup() {
PlayingMusicScreen.this.removeWidget(progressBar);
PlayingMusicScreen.this.removeWidget(timer);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package net.pixaurora.kitten_heart.impl.ui.widget;

import net.pixaurora.kitten_cube.impl.math.Point;
import net.pixaurora.kitten_cube.impl.text.Color;
import net.pixaurora.kitten_cube.impl.text.Component;
import net.pixaurora.kitten_cube.impl.ui.controls.MouseButton;
import net.pixaurora.kitten_cube.impl.ui.display.GuiDisplay;
import net.pixaurora.kitten_cube.impl.ui.widget.Widget;
import net.pixaurora.kitten_cube.impl.ui.widget.text.PushableTextLines;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressProvider;

public class Timer implements Widget {
private final PushableTextLines text;
private final ProgressProvider progress;

private long playedSeconds;
private final long totalSeconds;

public Timer(Point pos, ProgressProvider progress) {
this.text = new PushableTextLines(pos);
this.progress = progress;
this.playedSeconds = -1;
this.totalSeconds = this.progress.totalDuration().getSeconds();
}

@Override
public void draw(GuiDisplay gui, Point mousePos) {
this.text.draw(gui, mousePos);
}

@Override
public void tick() {
long newPlayedSeconds = this.progress.playedDuration().getSeconds();

if (this.playedSeconds != newPlayedSeconds) {
this.playedSeconds = newPlayedSeconds;

this.text.clear();
this.text.push(Component.literal(this.display()), Color.WHITE);
}
}

private String display() {
StringBuilder display = new StringBuilder();

addTimer(display, this.playedSeconds);

display.append(new char[] { ' ', '/', ' ' });

addTimer(display, this.totalSeconds);

return display.toString();
}

private void addTimer(StringBuilder builder, long totalSeconds) {
long minutes = totalSeconds / 60;
long seconds = totalSeconds % 60;

builder.append(Long.toString(minutes));

builder.append(':');

if (seconds < 10) {
builder.append('0');
}
builder.append(Long.toString(seconds));
}

@Override
public void onClick(Point mousePos, MouseButton button) {
}

@Override
public boolean isWithinBounds(Point mousePos) {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package net.pixaurora.kitten_heart.impl.ui.widget.progress;

import java.time.Duration;

public interface ProgressProvider {
double percentComplete();

Duration playedDuration();

Duration totalDuration();
}

0 comments on commit 5aef7a3

Please sign in to comment.