initial commit

This commit is contained in:
2020-10-13 17:34:05 +02:00
parent d4824f2f88
commit 30a865ba7a
4 changed files with 116 additions and 38 deletions
@@ -37,3 +37,37 @@
background-color: var(--lumo-contrast-5pct);
padding: var(--lumo-space-s) var(--lumo-space-l);
}
.v-grid-cell.red {
color: red;
}
.v-grid-cell.yellow {
color: yellow;
}
.v-grid-cell.green {
color: green;
}
[part~="cell"].success {
background: green;
}
.success {
background: green;
}
.v-grid-cell.success {
color: green;
}
.error {
color: red;
}
series-cliffhanger
series-cliffhanger-open
series-open
@@ -12,6 +12,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Objects;
import java.util.SortedMap;
public class Serie
@@ -146,6 +147,19 @@ public class Serie
this.maxSeason = maxSeason;
}
public String getSeriesStyle()
{
String style = "";
if(seriesCliffhanger)
style = style + "font-style: italic; ";
if(Objects.equals(seriesStatus, "Returning Series"))
style = style + "font-weight: bold; ";
return style;
}
@Override
public String toString()
{
@@ -19,26 +19,26 @@ public class EpisodeService
try
{
return jdbcTemplate.query("SELECT serie.seriesID seriesID," +
" serie.seriesName seriesName," +
" YEAR(serie.firstAired) seriesFirstAired," +
" serie.resolution seriesResolution," +
" serie.cliffhanger seriesCliffhanger," +
" serie.status seriesStatus," +
" serie.download seriesDownload," +
" season.seasonNumber seasonNumber," +
" episode.episodeNumber episodeNumber," +
" episode.state episodeState," +
" ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," +
" ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" +
" FROM serie" +
" LEFT JOIN season ON serie.seriesID = season.seriesID" +
" LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" +
" WHERE season.seasonNumber != 0 OR" +
" serie.seriesID >= 1000000 " +
" ORDER BY serie.seriesName," +
" serie.firstAired," +
" season.seasonNumber," +
" episode.episodeNumber;",
" serie.seriesName seriesName," +
" YEAR(serie.firstAired) seriesFirstAired," +
" serie.resolution seriesResolution," +
" serie.cliffhanger seriesCliffhanger," +
" serie.status seriesStatus," +
" serie.download seriesDownload," +
" season.seasonNumber seasonNumber," +
" episode.episodeNumber episodeNumber," +
" episode.state episodeState," +
" ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," +
" ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" +
" FROM serie" +
" LEFT JOIN season ON serie.seriesID = season.seriesID" +
" LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" +
" WHERE season.seasonNumber != 0 OR" +
" serie.seriesID >= 1000000 " +
" ORDER BY serie.seriesName," +
" serie.firstAired," +
" season.seasonNumber," +
" episode.episodeNumber;",
(rs, rowNum) -> new Episode(rs.getInt("seriesID"), rs.getString("seriesName"), rs.getInt("seriesFirstAired"), rs.getString("seriesResolution"), rs.getBoolean("seriesCliffhanger"), rs.getString("seriesStatus"), rs.getString("seriesDownload"), rs.getInt("seasonNumber"), rs.getInt("episodeNumber"), rs.getInt("episodeState"), rs.getInt("minSeason"), rs.getInt("maxSeason")));
} catch(Exception e)
@@ -19,6 +19,8 @@ import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.StreamResource;
import org.springframework.beans.factory.annotation.Autowired;
import com.vaadin.flow.data.renderer.ComponentRenderer;
import com.vaadin.flow.data.renderer.TemplateRenderer;
import javax.imageio.ImageIO;
import javax.xml.transform.stream.StreamSource;
@@ -50,6 +52,9 @@ public class SeriesView extends Div implements AfterNavigationObserver
private boolean isInitialized = false;
private Integer stateWidth = 4;
private Integer stateHeight = 20;
public SeriesView()
{
setId("series-view");
@@ -57,10 +62,12 @@ public class SeriesView extends Div implements AfterNavigationObserver
serie = new Grid<>();
serie.addThemeVariants(GridVariant.LUMO_NO_BORDER);
serie.setHeightFull();
serie.addColumn(Serie::getSeriesName).setHeader("Series Name");
serie.addColumn(TemplateRenderer.<Serie>of("<div style$=\"[[item.style]]\">[[item.name]]</div>")
.withProperty("name", Serie::getSeriesName)
.withProperty("style", Serie::getSeriesStyle))
.setHeader("Series Name");
serie.addColumn(Serie::getSeriesFirstAired).setHeader("First Aired");
serie.addColumn(Serie::getSeriesResolution).setHeader("Resolution");
serie.addColumn(Serie::getSeriesCliffhanger).setHeader("Cliffhanger");
serie.addItemDoubleClickListener(
event ->
@@ -68,6 +75,8 @@ public class SeriesView extends Div implements AfterNavigationObserver
Notification.show("Clicked Item: " + event.getItem());
});
serie.getColumns().forEach(col -> col.setAutoWidth(true));
add(serie);
}
@@ -87,9 +96,6 @@ public class SeriesView extends Div implements AfterNavigationObserver
final Integer sFinal = s;
serie.addComponentColumn(i ->
{
// StreamResource r = new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState()));
// Image img = new Image(r, "");
// return img;
return new Image(new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState())), "");
}).setHeader("Season " + sFinal);
}
@@ -125,10 +131,10 @@ public class SeriesView extends Div implements AfterNavigationObserver
private InputStream getImageInputStream(Integer curSeason, SortedMap<Integer, Integer> state)
{
ByteArrayOutputStream imagebuffer = null;
Integer season = -1;
Integer episode = -1;
boolean found = false;
ByteArrayOutputStream imagebuffer = null;
Integer season = -1;
Integer episode = -1;
SortedMap<Integer, Integer> seasonState = new TreeMap<>();
for(Integer key : state.keySet())
{
@@ -136,13 +142,12 @@ public class SeriesView extends Div implements AfterNavigationObserver
episode = key & 0xFF;
if(season == curSeason)
{
found = true;
seasonState.put(episode, state.get(key));
else if(season > curSeason)
break;
}
}
if(!found)
if(seasonState.size() == 0)
{
BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
Graphics2D drawable = image.createGraphics();
@@ -161,13 +166,38 @@ public class SeriesView extends Div implements AfterNavigationObserver
}
}
BufferedImage image = new BufferedImage(100, 10, BufferedImage.TYPE_INT_RGB);
BufferedImage image = new BufferedImage(stateWidth * seasonState.lastKey(), stateHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D drawable = image.createGraphics();
Color colGrey = new Color(192, 192, 192);
Color colBlue = new Color(0, 0, 192);
Color colGreen = new Color(0, 192, 0);
Color colBlack = new Color(0, 0, 0);
Color col = colBlack;
drawable.setColor(Color.WHITE);
drawable.fillRect(0, 0, 100, 10);
drawable.setColor(Color.BLACK);
drawable.drawString("S" + season + "E" + episode, 5, 10);
drawable.setColor(colBlack);
drawable.fillRect(0, 0, stateWidth * seasonState.lastKey(), stateHeight);
for(Integer key : seasonState.keySet())
{
switch(seasonState.get(key))
{
case 0:
col = colBlack;
break;
case 1:
col = colGrey;
break;
case 2:
col = colBlue;
break;
case 3:
col = colGreen;
break;
}
drawable.setColor(col);
drawable.fillRect((key - 1) * stateWidth, 0, stateWidth - 1, stateHeight);
}
try
{