added multiple show types for scrobble chart
This commit is contained in:
parent
0dd9e5dda6
commit
c35be3b731
@ -4,12 +4,15 @@ import java.text.NumberFormat;
|
|||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.chart.AreaChart;
|
import javafx.scene.chart.AreaChart;
|
||||||
import javafx.scene.chart.XYChart;
|
import javafx.scene.chart.XYChart;
|
||||||
import javafx.scene.chart.XYChart.Data;
|
import javafx.scene.chart.XYChart.Data;
|
||||||
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.SplitPane;
|
import javafx.scene.control.SplitPane;
|
||||||
import javafx.scene.layout.GridPane;
|
import javafx.scene.layout.GridPane;
|
||||||
@ -18,6 +21,7 @@ import sarsoo.fmframework.fm.FmUserNetwork;
|
|||||||
import sarsoo.fmframework.fx.FmFramework;
|
import sarsoo.fmframework.fx.FmFramework;
|
||||||
import sarsoo.fmframework.music.FMObj;
|
import sarsoo.fmframework.music.FMObj;
|
||||||
import sarsoo.fmframework.music.Scrobble;
|
import sarsoo.fmframework.music.Scrobble;
|
||||||
|
import sarsoo.fmframework.util.FMObjCalendarWrapper;
|
||||||
import sarsoo.fmframework.util.MonthScrobbles;
|
import sarsoo.fmframework.util.MonthScrobbles;
|
||||||
import sarsoo.fmframework.util.ScrobbleCountCalendar;
|
import sarsoo.fmframework.util.ScrobbleCountCalendar;
|
||||||
|
|
||||||
@ -32,13 +36,32 @@ public class ScrobblesViewPaneController {
|
|||||||
@FXML
|
@FXML
|
||||||
private AreaChart<String, Integer> areaChart;
|
private AreaChart<String, Integer> areaChart;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private Button buttonTracks;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private Button buttonAlbums;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private Button buttonTracksAlbums;
|
||||||
|
|
||||||
|
private FMObj obj;
|
||||||
|
|
||||||
|
private LocalDate firstDate;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
|
|
||||||
|
buttonTracks.setDisable(true);
|
||||||
|
buttonAlbums.setDisable(true);
|
||||||
|
buttonTracksAlbums.setDisable(true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void populate(FMObj obj) {
|
public void populate(FMObj obj) {
|
||||||
|
|
||||||
|
this.obj = obj;
|
||||||
|
|
||||||
ArrayList<Scrobble> scrobbles = obj.getScrobbles();
|
ArrayList<Scrobble> scrobbles = obj.getScrobbles();
|
||||||
|
|
||||||
if (scrobbles != null) {
|
if (scrobbles != null) {
|
||||||
@ -71,20 +94,162 @@ public class ScrobblesViewPaneController {
|
|||||||
Config config = FmFramework.getSessionConfig();
|
Config config = FmFramework.getSessionConfig();
|
||||||
FmUserNetwork net = new FmUserNetwork(config.getValue("api_key"), config.getValue("username"));
|
FmUserNetwork net = new FmUserNetwork(config.getValue("api_key"), config.getValue("username"));
|
||||||
|
|
||||||
LocalDate date = net.getFirstScrobbleDateTime().toLocalDate();
|
firstDate = net.getFirstScrobbleDateTime().toLocalDate();
|
||||||
|
|
||||||
ScrobbleCountCalendar calendar = new ScrobbleCountCalendar(date);
|
buttonAlbums.setDisable(false);
|
||||||
|
buttonTracksAlbums.setDisable(false);
|
||||||
|
graphShowTracks();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void graphShowTracks() {
|
||||||
|
|
||||||
|
ArrayList<FMObjCalendarWrapper> list = new ArrayList<>();
|
||||||
|
|
||||||
|
ScrobbleCountCalendar totalCalendar = new ScrobbleCountCalendar(firstDate, "total");
|
||||||
|
|
||||||
|
for (Scrobble scrobble : obj.getScrobbles()) {
|
||||||
|
|
||||||
|
Boolean needNew = true;
|
||||||
|
|
||||||
|
LocalDateTime scrobbleDate = scrobble.getDateTime();
|
||||||
|
|
||||||
|
for (FMObjCalendarWrapper wrapper : list) {
|
||||||
|
if (scrobble.getTrack().equals(wrapper.getScrobble().getTrack())) {
|
||||||
|
|
||||||
|
needNew = false;
|
||||||
|
|
||||||
|
wrapper.getCalendar().addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needNew) {
|
||||||
|
|
||||||
|
ScrobbleCountCalendar calendar = new ScrobbleCountCalendar(firstDate, scrobble.getTrack().getName());
|
||||||
|
|
||||||
|
calendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
|
||||||
|
list.add(new FMObjCalendarWrapper(scrobble, calendar));
|
||||||
|
}
|
||||||
|
|
||||||
|
totalCalendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScrobbleCountCalendar> toShow = list.stream().map(FMObjCalendarWrapper::getCalendar)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (list.size() > 1) {
|
||||||
|
toShow.add(totalCalendar);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshGraph(toShow);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void graphShowAlbums() {
|
||||||
|
|
||||||
|
ArrayList<FMObjCalendarWrapper> list = new ArrayList<>();
|
||||||
|
|
||||||
|
ScrobbleCountCalendar totalCalendar = new ScrobbleCountCalendar(firstDate, "total");
|
||||||
|
|
||||||
|
for (Scrobble scrobble : obj.getScrobbles()) {
|
||||||
|
|
||||||
|
Boolean needNew = true;
|
||||||
|
|
||||||
|
LocalDateTime scrobbleDate = scrobble.getDateTime();
|
||||||
|
|
||||||
|
for (FMObjCalendarWrapper wrapper : list) {
|
||||||
|
if (scrobble.getAlbum().equals(wrapper.getScrobble().getAlbum())) {
|
||||||
|
|
||||||
|
needNew = false;
|
||||||
|
|
||||||
|
wrapper.getCalendar().addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needNew) {
|
||||||
|
|
||||||
|
ScrobbleCountCalendar calendar = new ScrobbleCountCalendar(firstDate, scrobble.getAlbum().getName());
|
||||||
|
|
||||||
|
calendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
|
||||||
|
list.add(new FMObjCalendarWrapper(scrobble, calendar));
|
||||||
|
}
|
||||||
|
|
||||||
|
totalCalendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScrobbleCountCalendar> toShow = list.stream().map(FMObjCalendarWrapper::getCalendar)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (list.size() > 1) {
|
||||||
|
toShow.add(totalCalendar);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshGraph(toShow);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void graphShowTracksByAlbum() {
|
||||||
|
|
||||||
|
ArrayList<FMObjCalendarWrapper> list = new ArrayList<>();
|
||||||
|
|
||||||
|
ScrobbleCountCalendar totalCalendar = new ScrobbleCountCalendar(firstDate, "total");
|
||||||
|
|
||||||
|
for (Scrobble scrobble : obj.getScrobbles()) {
|
||||||
|
|
||||||
|
Boolean needNew = true;
|
||||||
|
|
||||||
|
LocalDateTime scrobbleDate = scrobble.getDateTime();
|
||||||
|
|
||||||
|
for (FMObjCalendarWrapper wrapper : list) {
|
||||||
|
if (scrobble.getTrack().equals(wrapper.getScrobble().getTrack())
|
||||||
|
&& scrobble.getAlbum().equals(wrapper.getScrobble().getAlbum())) {
|
||||||
|
|
||||||
|
needNew = false;
|
||||||
|
|
||||||
|
wrapper.getCalendar().addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needNew) {
|
||||||
|
|
||||||
|
ScrobbleCountCalendar calendar = new ScrobbleCountCalendar(firstDate, scrobble.getAlbum().getName());
|
||||||
|
|
||||||
|
calendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
|
||||||
|
list.add(new FMObjCalendarWrapper(scrobble, calendar));
|
||||||
|
}
|
||||||
|
|
||||||
|
totalCalendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScrobbleCountCalendar> toShow = list.stream().map(FMObjCalendarWrapper::getCalendar)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (list.size() > 1) {
|
||||||
|
toShow.add(totalCalendar);
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshGraph(toShow);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshGraph(List<ScrobbleCountCalendar> calendars) {
|
||||||
|
|
||||||
|
areaChart.getData().clear();
|
||||||
|
|
||||||
|
for (ScrobbleCountCalendar calendar : calendars) {
|
||||||
|
|
||||||
XYChart.Series<String, Integer> series = new XYChart.Series<>();
|
XYChart.Series<String, Integer> series = new XYChart.Series<>();
|
||||||
|
series.setName(calendar.getName());
|
||||||
for (Scrobble scrobble : scrobbles) {
|
|
||||||
LocalDateTime scrobbleDate = scrobble.getDateTime();
|
|
||||||
calendar.addCount(scrobbleDate.getMonth(), scrobbleDate.getYear());
|
|
||||||
}
|
|
||||||
|
|
||||||
int cumulative = 0;
|
int cumulative = 0;
|
||||||
|
|
||||||
for(MonthScrobbles month: calendar.getMonthScrobbles()) {
|
for (MonthScrobbles month : calendar.getMonthScrobbles()) {
|
||||||
cumulative += month.getCount();
|
cumulative += month.getCount();
|
||||||
series.getData().add(new Data<String, Integer>(month.toString(), cumulative));
|
series.getData().add(new Data<String, Integer>(month.toString(), cumulative));
|
||||||
}
|
}
|
||||||
@ -92,7 +257,39 @@ public class ScrobblesViewPaneController {
|
|||||||
areaChart.getData().add(series);
|
areaChart.getData().add(series);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void handleShowTracks() {
|
||||||
|
|
||||||
|
buttonTracks.setDisable(true);
|
||||||
|
buttonAlbums.setDisable(false);
|
||||||
|
buttonTracksAlbums.setDisable(false);
|
||||||
|
|
||||||
|
graphShowTracks();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void handleShowAlbums() {
|
||||||
|
|
||||||
|
buttonTracks.setDisable(false);
|
||||||
|
buttonAlbums.setDisable(true);
|
||||||
|
buttonTracksAlbums.setDisable(false);
|
||||||
|
|
||||||
|
graphShowAlbums();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void handleShowTracksByAlbums() {
|
||||||
|
|
||||||
|
buttonTracks.setDisable(false);
|
||||||
|
buttonAlbums.setDisable(false);
|
||||||
|
buttonTracksAlbums.setDisable(true);
|
||||||
|
|
||||||
|
graphShowTracksByAlbum();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package sarsoo.fmframework.util;
|
||||||
|
|
||||||
|
import sarsoo.fmframework.music.Scrobble;
|
||||||
|
|
||||||
|
public class FMObjCalendarWrapper {
|
||||||
|
|
||||||
|
private Scrobble obj;
|
||||||
|
private ScrobbleCountCalendar calendar;
|
||||||
|
|
||||||
|
public FMObjCalendarWrapper(Scrobble scrobble, ScrobbleCountCalendar calendar) {
|
||||||
|
this.obj = scrobble;
|
||||||
|
this.calendar = calendar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScrobbleCountCalendar getCalendar() {
|
||||||
|
return calendar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scrobble getScrobble() {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -10,11 +10,13 @@ import sarsoo.fmframework.log.entry.ErrorEntry;
|
|||||||
|
|
||||||
public class ScrobbleCountCalendar {
|
public class ScrobbleCountCalendar {
|
||||||
|
|
||||||
public ArrayList<MonthScrobbles> months;
|
private ArrayList<MonthScrobbles> months;
|
||||||
|
private String name;
|
||||||
|
|
||||||
public ScrobbleCountCalendar(LocalDate date) {
|
public ScrobbleCountCalendar(LocalDate date, String name) {
|
||||||
|
|
||||||
months = new ArrayList<>();
|
months = new ArrayList<>();
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
LocalDate now = LocalDate.now();
|
LocalDate now = LocalDate.now();
|
||||||
|
|
||||||
@ -45,4 +47,8 @@ public class ScrobbleCountCalendar {
|
|||||||
return months;
|
return months;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
</ScrollPane>
|
</ScrollPane>
|
||||||
<AnchorPane fx:id="areaChartAnchorPane" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
|
<AnchorPane fx:id="areaChartAnchorPane" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
|
||||||
<children>
|
<children>
|
||||||
<AreaChart fx:id="areaChart" layoutX="-93.0" layoutY="69.0" legendVisible="false" prefHeight="798.0" prefWidth="504.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
<BorderPane prefHeight="384.0" prefWidth="256.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
|
<center>
|
||||||
|
<AreaChart fx:id="areaChart" prefHeight="798.0" prefWidth="504.0" BorderPane.alignment="CENTER">
|
||||||
<xAxis>
|
<xAxis>
|
||||||
<CategoryAxis side="BOTTOM" />
|
<CategoryAxis side="BOTTOM" />
|
||||||
</xAxis>
|
</xAxis>
|
||||||
@ -34,6 +36,17 @@
|
|||||||
<NumberAxis side="LEFT" />
|
<NumberAxis side="LEFT" />
|
||||||
</yAxis>
|
</yAxis>
|
||||||
</AreaChart>
|
</AreaChart>
|
||||||
|
</center>
|
||||||
|
<bottom>
|
||||||
|
<ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
|
||||||
|
<items>
|
||||||
|
<Button fx:id="buttonTracks" mnemonicParsing="false" onAction="#handleShowTracks" text="tracks" />
|
||||||
|
<Button fx:id="buttonAlbums" mnemonicParsing="false" onAction="#handleShowAlbums" text="albums" />
|
||||||
|
<Button fx:id="buttonTracksAlbums" mnemonicParsing="false" onAction="#handleShowTracksByAlbums" text="tracks & albums" />
|
||||||
|
</items>
|
||||||
|
</ToolBar>
|
||||||
|
</bottom>
|
||||||
|
</BorderPane>
|
||||||
</children>
|
</children>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
</items>
|
</items>
|
||||||
|
Loading…
Reference in New Issue
Block a user