|
|
|
@@ -0,0 +1,171 @@
|
|
|
|
|
package ch.hevs.isc.slopify_v2
|
|
|
|
|
|
|
|
|
|
import java.util
|
|
|
|
|
import javax.swing._
|
|
|
|
|
import javax.swing.table.{DefaultTableModel, TableModel, TableRowSorter}
|
|
|
|
|
|
|
|
|
|
class GUI extends JFrame {
|
|
|
|
|
setSize(800, 600)
|
|
|
|
|
setTitle("Slopify V2")
|
|
|
|
|
|
|
|
|
|
// Artists
|
|
|
|
|
val artistsListModel: DefaultListModel[String] = new DefaultListModel[String]()
|
|
|
|
|
val artistsList: JList[String] = new JList(artistsListModel)
|
|
|
|
|
artistsList.setLayoutOrientation(JList.VERTICAL)
|
|
|
|
|
val col1: JScrollPane = new JScrollPane(artistsList)
|
|
|
|
|
artistsList.addListSelectionListener(_ => {
|
|
|
|
|
val artistName: String = artistsList.getSelectedValue
|
|
|
|
|
val artist: Option[Artist] = db.getArtistByName(artistName)
|
|
|
|
|
if (artist.isDefined) {
|
|
|
|
|
selectArtist(artist.get)
|
|
|
|
|
} else {
|
|
|
|
|
clearAlbums()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Albums
|
|
|
|
|
val albumsListModel: DefaultListModel[String] = new DefaultListModel[String]()
|
|
|
|
|
val albumsList: JList[String] = new JList(albumsListModel)
|
|
|
|
|
val col2: JScrollPane = new JScrollPane(albumsList)
|
|
|
|
|
albumsList.addListSelectionListener(_ => {
|
|
|
|
|
if (curArtist.isDefined) {
|
|
|
|
|
val albumName: String = albumsList.getSelectedValue
|
|
|
|
|
val album: Option[Album] = curArtist.get.getAlbumByName(albumName)
|
|
|
|
|
if (album.isDefined) {
|
|
|
|
|
selectAlbum(album.get)
|
|
|
|
|
} else {
|
|
|
|
|
clearSongs()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Songs
|
|
|
|
|
val songsTableHeaders: Array[Object] = Array("Track no", "Title")
|
|
|
|
|
val songsTable: JTable = new JTable(Array.empty[Array[Object]], songsTableHeaders)
|
|
|
|
|
val songsTableModel: DefaultTableModel = new DefaultTableModel()
|
|
|
|
|
songsTableModel.addColumn("Track no")
|
|
|
|
|
songsTableModel.addColumn("Title")
|
|
|
|
|
songsTable.setModel(songsTableModel)
|
|
|
|
|
songsTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN)
|
|
|
|
|
|
|
|
|
|
val tableSorter: TableRowSorter[TableModel] = new TableRowSorter(songsTable.getModel)
|
|
|
|
|
val songsSortKeys: util.List[RowSorter.SortKey] = new util.ArrayList[RowSorter.SortKey]()
|
|
|
|
|
songsSortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING))
|
|
|
|
|
tableSorter.setSortKeys(songsSortKeys)
|
|
|
|
|
songsTable.setRowSorter(tableSorter)
|
|
|
|
|
|
|
|
|
|
//val songsListModel: DefaultListModel[String] = new DefaultListModel[String]()
|
|
|
|
|
//val songsList: JList[String] = new JList(songsListModel)
|
|
|
|
|
//val col3: JScrollPane = new JScrollPane(songsList)
|
|
|
|
|
val col3: JScrollPane = new JScrollPane(songsTable)
|
|
|
|
|
/*
|
|
|
|
|
songsList.addListSelectionListener(_ => {
|
|
|
|
|
if (curAlbum.isDefined) {
|
|
|
|
|
val songName: String = songsList.getSelectedValue
|
|
|
|
|
val song: Option[Song] = curAlbum.get.getSongByTitle(songName)
|
|
|
|
|
if (song.isDefined) {
|
|
|
|
|
selectSong(song.get)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
*/
|
|
|
|
|
val songsSelectionModel: ListSelectionModel = songsTable.getSelectionModel
|
|
|
|
|
songsSelectionModel.addListSelectionListener(e => {
|
|
|
|
|
val row: Int = e.getFirstIndex
|
|
|
|
|
val songName: String = songsTableModel.getValueAt(row, 0).asInstanceOf[String]
|
|
|
|
|
val song: Option[Song] = curAlbum.get.getSongByTitle(songName)
|
|
|
|
|
if (song.isDefined) {
|
|
|
|
|
selectSong(song.get)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
val split1: JSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, col1, col2)
|
|
|
|
|
val split2: JSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, split1, col3)
|
|
|
|
|
split1.setResizeWeight(0.5)
|
|
|
|
|
split2.setResizeWeight(0.66)
|
|
|
|
|
|
|
|
|
|
val myMenuBar: JMenuBar = new JMenuBar()
|
|
|
|
|
val fileMenu: JMenu = new JMenu("File")
|
|
|
|
|
val refreshDbBtn: JMenuItem = new JMenuItem("Refresh Database")
|
|
|
|
|
refreshDbBtn.addActionListener(_ => refreshDatabase())
|
|
|
|
|
|
|
|
|
|
fileMenu.add(refreshDbBtn)
|
|
|
|
|
myMenuBar.add(fileMenu)
|
|
|
|
|
setJMenuBar(myMenuBar)
|
|
|
|
|
getContentPane.add(split2)
|
|
|
|
|
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
|
|
|
|
|
|
|
|
|
|
var db: DataBase = _
|
|
|
|
|
var curArtist: Option[Artist] = None
|
|
|
|
|
var curAlbum: Option[Album] = None
|
|
|
|
|
var curSong: Option[Song] = None
|
|
|
|
|
|
|
|
|
|
refreshDatabase()
|
|
|
|
|
setVisible(true)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clearArtists(): Unit = {
|
|
|
|
|
artistsListModel.clear()
|
|
|
|
|
curArtist = None
|
|
|
|
|
}
|
|
|
|
|
def clearAlbums(): Unit = {
|
|
|
|
|
albumsListModel.clear()
|
|
|
|
|
curAlbum = None
|
|
|
|
|
}
|
|
|
|
|
def clearSongs(): Unit = {
|
|
|
|
|
songsTableModel.setRowCount(0)
|
|
|
|
|
//songsListModel.clear()
|
|
|
|
|
curSong = None
|
|
|
|
|
}
|
|
|
|
|
def addArtist(artist: Artist): Unit = {
|
|
|
|
|
println(s"Adding $artist")
|
|
|
|
|
artistsListModel.addElement(artist.name)
|
|
|
|
|
}
|
|
|
|
|
def addAlbum(album: Album): Unit = {
|
|
|
|
|
println(s"Adding $album")
|
|
|
|
|
albumsListModel.addElement(album.name)
|
|
|
|
|
}
|
|
|
|
|
def addSong(song: Song): Unit = {
|
|
|
|
|
println(s"Adding $song")
|
|
|
|
|
val row: Array[String] = Array(
|
|
|
|
|
song.number.toString.reverse.padTo(2, '0').reverse,
|
|
|
|
|
song.title
|
|
|
|
|
)
|
|
|
|
|
songsTableModel.addRow(row.asInstanceOf[Array[AnyRef]])
|
|
|
|
|
//songsListModel.addElement(s"${song.title} (n° ${song.number})")
|
|
|
|
|
}
|
|
|
|
|
def refreshDatabase(): Unit = {
|
|
|
|
|
db = DataBaseHelper.create("res/songs")
|
|
|
|
|
clearArtists()
|
|
|
|
|
clearAlbums()
|
|
|
|
|
clearSongs()
|
|
|
|
|
val artists: Array[Artist] = db.getArtists().sortBy(_.name)
|
|
|
|
|
for (artist: Artist <- artists) {
|
|
|
|
|
addArtist(artist)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
def selectArtist(artist: Artist): Unit = {
|
|
|
|
|
curArtist = Some(artist)
|
|
|
|
|
clearAlbums()
|
|
|
|
|
val albums: Array[Album] = artist.getAlbums().sortBy(_.name)
|
|
|
|
|
for (album: Album <- albums) {
|
|
|
|
|
addAlbum(album)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
def selectAlbum(album: Album): Unit = {
|
|
|
|
|
curAlbum = Some(album)
|
|
|
|
|
clearSongs()
|
|
|
|
|
for (song: Song <- album.getSongs()) {
|
|
|
|
|
addSong(song)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
def selectSong(song: Song): Unit = {
|
|
|
|
|
curSong = Some(song)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
object GUI {
|
|
|
|
|
def main(args: Array[String]): Unit = {
|
|
|
|
|
val gui: GUI = new GUI()
|
|
|
|
|
}
|
|
|
|
|
}
|