File details
This commit is contained in:
@@ -26,6 +26,10 @@ body {
|
|||||||
line-height: 1.5em;
|
line-height: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 10px;
|
width: 10px;
|
||||||
background-color: rgb(40, 40, 40);
|
background-color: rgb(40, 40, 40);
|
||||||
@@ -245,7 +249,8 @@ a:not(.disabled):hover, i:not(.disabled):hover {
|
|||||||
.content {
|
.content {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
overflow: auto;
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
margin-top: 37px;
|
margin-top: 37px;
|
||||||
}
|
}
|
||||||
@@ -508,7 +513,37 @@ body.drag .torrent-placeholder span {
|
|||||||
* TORRENT LIST: EXPANDED TORRENT DETAILS
|
* TORRENT LIST: EXPANDED TORRENT DETAILS
|
||||||
*/
|
*/
|
||||||
.torrent.selected {
|
.torrent.selected {
|
||||||
height: 240px;
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details {
|
||||||
|
padding: 8em 20px 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details table {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1000px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details td {
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details td.col-name {
|
||||||
|
width: auto;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details td.col-progress {
|
||||||
|
width: 4em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.torrent-details td.col-size {
|
||||||
|
width: 4em;
|
||||||
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -24,13 +24,15 @@ function renderTorrent (torrentSummary, state, dispatch) {
|
|||||||
// Get ephemeral data (like progress %) directly from the WebTorrent handle
|
// Get ephemeral data (like progress %) directly from the WebTorrent handle
|
||||||
var infoHash = torrentSummary.infoHash
|
var infoHash = torrentSummary.infoHash
|
||||||
var torrent = state.client.torrents.find((x) => x.infoHash === infoHash)
|
var torrent = state.client.torrents.find((x) => x.infoHash === infoHash)
|
||||||
|
var isSelected = state.selectedInfoHash === infoHash
|
||||||
|
|
||||||
// Background image: show some nice visuals, like a frame from the movie, if possible
|
// Background image: show some nice visuals, like a frame from the movie, if possible
|
||||||
var style = {}
|
var style = {}
|
||||||
if (torrentSummary.posterURL) {
|
if (torrentSummary.posterURL) {
|
||||||
style['background-image'] = 'linear-gradient(to bottom, ' +
|
var gradient = isSelected
|
||||||
'rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%), ' +
|
? 'linear-gradient(to bottom, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.4) 100%)'
|
||||||
`url("${torrentSummary.posterURL}")`
|
: 'linear-gradient(to bottom, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%)'
|
||||||
|
style['background-image'] = gradient + `, url('${torrentSummary.posterURL}')`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Foreground: name of the torrent, basic info like size, play button,
|
// Foreground: name of the torrent, basic info like size, play button,
|
||||||
@@ -38,11 +40,13 @@ function renderTorrent (torrentSummary, state, dispatch) {
|
|||||||
var classes = ['torrent']
|
var classes = ['torrent']
|
||||||
// playStatus turns the play button into a loading spinner or error icon
|
// playStatus turns the play button into a loading spinner or error icon
|
||||||
if (torrent && torrent.playStatus) classes.push(torrent.playStatus)
|
if (torrent && torrent.playStatus) classes.push(torrent.playStatus)
|
||||||
if (state.selectedInfoHash === infoHash) classes.push('selected')
|
if (isSelected) classes.push('selected')
|
||||||
|
classes = classes.join(' ')
|
||||||
return hx`
|
return hx`
|
||||||
<div class='${classes.join(' ')}' style=${style} onclick=${() => dispatch('toggleSelectTorrent', infoHash)}>
|
<div style=${style} class=${classes} onclick=${() => dispatch('toggleSelectTorrent', infoHash)}>
|
||||||
${renderTorrentMetadata(torrent, torrentSummary)}
|
${renderTorrentMetadata(torrent, torrentSummary)}
|
||||||
${renderTorrentButtons(torrentSummary, dispatch)}
|
${renderTorrentButtons(torrentSummary, dispatch)}
|
||||||
|
${isSelected ? renderTorrentDetails(torrent, torrentSummary) : ''}
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
@@ -96,7 +100,7 @@ function renderTorrentMetadata (torrent, torrentSummary) {
|
|||||||
// Play button starts streaming the torrent immediately, unpausing if needed
|
// Play button starts streaming the torrent immediately, unpausing if needed
|
||||||
function renderTorrentButtons (torrentSummary, dispatch) {
|
function renderTorrentButtons (torrentSummary, dispatch) {
|
||||||
return hx`
|
return hx`
|
||||||
<div class="buttons">
|
<div class='buttons'>
|
||||||
<i.btn.icon.download
|
<i.btn.icon.download
|
||||||
class='${torrentSummary.status}'
|
class='${torrentSummary.status}'
|
||||||
onclick=${() => dispatch('toggleTorrent', torrentSummary)}>
|
onclick=${() => dispatch('toggleTorrent', torrentSummary)}>
|
||||||
@@ -114,3 +118,45 @@ function renderTorrentButtons (torrentSummary, dispatch) {
|
|||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Show files, per-file download status and play buttons, and so on
|
||||||
|
function renderTorrentDetails (torrent, torrentSummary) {
|
||||||
|
var filesElement
|
||||||
|
if (!torrent || !torrent.files) {
|
||||||
|
// We don't know what files this torrent contains
|
||||||
|
var message = torrent
|
||||||
|
? 'Downloading torrent data using magnet link...'
|
||||||
|
: 'Failed to download torrent data from magnet link. Click the download button to try again...'
|
||||||
|
filesElement = hx`<div class='files warning'>${message}</div>`
|
||||||
|
} else {
|
||||||
|
// We do know the files. List them and show download stats for each one
|
||||||
|
var fileRows = torrent.files.map(function (file) {
|
||||||
|
var numPieces = 0
|
||||||
|
for (var piece = file._startPiece; piece < file._endPiece; piece++) {
|
||||||
|
if (torrent.bitfield.get(piece)) numPieces++
|
||||||
|
}
|
||||||
|
var progress = Math.round(100 * numPieces / (file._endPiece - file._startPiece)) + '%'
|
||||||
|
return hx`
|
||||||
|
<tr>
|
||||||
|
<td class='col-name'>${file.name}</td>
|
||||||
|
<td class='col-progress'>${progress}</td>
|
||||||
|
<td class='col-size'>${prettyBytes(file.length)}</td>
|
||||||
|
</li>
|
||||||
|
`
|
||||||
|
})
|
||||||
|
filesElement = hx`
|
||||||
|
<div class='files'>
|
||||||
|
<strong>Files</strong>
|
||||||
|
<table>
|
||||||
|
${fileRows}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
return hx`
|
||||||
|
<div class='torrent-details'>
|
||||||
|
${filesElement}
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user