feat(downloading): choose dir on new download

This commit is contained in:
Alexey Kasyanchuk
2018-08-28 19:47:55 +03:00
parent 5f874883a1
commit 4c2ff465f2
10 changed files with 217 additions and 86 deletions

55
src/app/context-menu.js Normal file
View File

@ -0,0 +1,55 @@
import React, {Component} from 'react';
import {List, ListItem} from 'material-ui/List';
export default class ContextMenu extends Component {
constructor(props) {
super(props)
this.state = {toggle: false}
}
render()
{
return (
<div style={{position: 'relative', display: 'inline-block'}}>
<div style={{display: 'inline-block'}} onClick={(e) => {
this.setState({toggle: !this.state.toggle})
if(this.props.onClick)
this.props.onClick(e)
}}>
{this.props.children}
</div>
{
this.state.toggle
&&
<div style={{width: '100%', height: '100%', position: 'fixed', top: 0, left: 0, zIndex: 2}} onClick={(e) => {
this.setState({toggle: !this.state.toggle})
e.preventDefault()
e.stopPropagation()
}}><span></span></div>
}
{
this.state.toggle
&&
<List className='context-menu' style={Object.assign({
position: 'absolute',
maxWidth: 350,
minWidth: 200,
top: -20,
backgroundColor: '#ffffff',
boxShadow: '0 0 10px rgba(0,0,0,0.45)',
borderRadius: 6,
zIndex: 3
}, !this.props.rightAlign ? { left: -30 } : { right: -30 })}>
{
this.props.menu && this.props.menu.map(menu => <ListItem style={{fontSize: '0.9em'}} primaryText={menu.name} leftIcon={menu.icon} onClick={(e) => {
menu.click()
this.setState({toggle: !this.state.toggle})
e.preventDefault()
e.stopPropagation()
}} />)
}
</List>
}
</div>
)
}
}

View File

@ -0,0 +1,73 @@
import React from 'react';
import ContextMenu from './context-menu'
let dialog
if(typeof WEB === 'undefined')
dialog = require('electron').remote.dialog
export default (props) => {
return (
<ContextMenu rightAlign={true} onClick={(e) => {
e.preventDefault();
e.stopPropagation();
}} menu={[
{name: __('Download'), click: () => {
window.torrentSocket.emit('download', props.torrent, null, (added) => {
if(props.onAdded)
props.onAdded(added)
})
}, icon: <svg style={{
fill: 'black'
}} viewBox="0 0 56 56">
<g>
<path d="M35.586,41.586L31,46.172V28c0-1.104-0.896-2-2-2s-2,0.896-2,2v18.172l-4.586-4.586c-0.781-0.781-2.047-0.781-2.828,0
s-0.781,2.047,0,2.828l7.999,7.999c0.093,0.094,0.196,0.177,0.307,0.251c0.047,0.032,0.099,0.053,0.148,0.081
c0.065,0.036,0.127,0.075,0.196,0.103c0.065,0.027,0.133,0.042,0.2,0.062c0.058,0.017,0.113,0.04,0.173,0.051
C28.738,52.986,28.869,53,29,53s0.262-0.014,0.392-0.04c0.06-0.012,0.115-0.034,0.173-0.051c0.067-0.02,0.135-0.035,0.2-0.062
c0.069-0.028,0.131-0.067,0.196-0.103c0.05-0.027,0.101-0.049,0.148-0.081c0.11-0.074,0.213-0.157,0.307-0.251l7.999-7.999
c0.781-0.781,0.781-2.047,0-2.828S36.367,40.805,35.586,41.586z"/>
<path d="M47.835,18.986c-0.137-0.019-2.457-0.335-4.684,0.002C43.1,18.996,43.049,19,42.999,19c-0.486,0-0.912-0.354-0.987-0.85
c-0.083-0.546,0.292-1.056,0.838-1.139c1.531-0.233,3.062-0.196,4.083-0.124C46.262,9.135,39.83,3,32.085,3
C27.388,3,22.667,5.379,19.8,9.129C21.754,10.781,23,13.246,23,16c0,0.553-0.447,1-1,1s-1-0.447-1-1
c0-2.462-1.281-4.627-3.209-5.876c-0.227-0.147-0.462-0.277-0.702-0.396c-0.069-0.034-0.139-0.069-0.21-0.101
c-0.272-0.124-0.55-0.234-0.835-0.321c-0.035-0.01-0.071-0.017-0.106-0.027c-0.259-0.075-0.522-0.132-0.789-0.177
c-0.078-0.013-0.155-0.025-0.233-0.036C14.614,9.027,14.309,9,14,9c-3.859,0-7,3.141-7,7c0,0.082,0.006,0.163,0.012,0.244
l0.012,0.21l-0.009,0.16C7.008,16.744,7,16.873,7,17v0.63l-0.567,0.271C2.705,19.688,0,24,0,28.154C0,34.135,4.865,39,10.845,39H25
V28c0-2.209,1.791-4,4-4s4,1.791,4,4v11h2.353c0.059,0,0.116-0.005,0.174-0.009l0.198-0.011l0.271,0.011
C36.053,38.995,36.11,39,36.169,39h9.803C51.501,39,56,34.501,56,28.972C56,24.161,52.49,19.872,47.835,18.986z"/>
</g>
</svg>
},
{name: __('Download to') + '...', click: () => {
if(dialog)
{
const path = dialog.showOpenDialog({
properties: ['openDirectory']
});
if(!path || path.length < 1)
return
window.torrentSocket.emit('download', props.torrent, path[0], (added) => {
if(props.onAdded)
props.onAdded(added)
})
}
},
icon: <svg viewBox="0 0 60 60">
<g>
<path d="M54.168,0H5.832C4.271,0,3,1.271,3,2.832v54.336C3,58.729,4.271,60,5.832,60h48.336C55.729,60,57,58.729,57,57.168V2.832
C57,1.271,55.729,0,54.168,0z M5.832,2h48.336C54.627,2,55,2.373,55,2.832V29H5V2.832C5,2.373,5.373,2,5.832,2z M54.168,58H5.832
C5.373,58,5,57.627,5,57.168V31h50v26.168C55,57.627,54.627,58,54.168,58z"/>
<path d="M24.505,18h10.99C37.428,18,39,16.428,39,14.495V13c0-0.553-0.447-1-1-1s-1,0.447-1,1v1.495C37,15.325,36.325,16,35.495,16
h-10.99C23.675,16,23,15.325,23,14.495V13c0-0.553-0.447-1-1-1s-1,0.447-1,1v1.495C21,16.428,22.572,18,24.505,18z"/>
<path d="M38,41c-0.553,0-1,0.447-1,1v1.495C37,44.325,36.325,45,35.495,45h-10.99C23.675,45,23,44.325,23,43.495V42
c0-0.553-0.447-1-1-1s-1,0.447-1,1v1.495C21,45.428,22.572,47,24.505,47h10.99C37.428,47,39,45.428,39,43.495V42
C39,41.447,38.553,41,38,41z"/>
</g>
</svg>
}
]}>
{props.children}
</ContextMenu>
)
}

View File

@ -20,6 +20,7 @@ import FlatButton from 'material-ui/FlatButton';
import {fileTypeDetect} from './content' import {fileTypeDetect} from './content'
import {contentIcon} from './torrent' import {contentIcon} from './torrent'
import TrackersImages from './trackers-images' import TrackersImages from './trackers-images'
import DownloadTorrentMenu from './download-torrent-menu'
let parseDescriptionText = (text) => { let parseDescriptionText = (text) => {
return text.split("\n").map(function(item) { return text.split("\n").map(function(item) {
@ -447,6 +448,7 @@ export default class TorrentPage extends Page {
{ {
!this.state.downloaded && !this.state.downloading && !this.state.startingDownloading !this.state.downloaded && !this.state.downloading && !this.state.startingDownloading
&& &&
<DownloadTorrentMenu torrent={this.torrent}>
<RaisedButton <RaisedButton
href={`magnet:?xt=urn:btih:${this.torrent.hash}`} href={`magnet:?xt=urn:btih:${this.torrent.hash}`}
target="_self" target="_self"
@ -456,10 +458,6 @@ export default class TorrentPage extends Page {
style={{marginTop: 8}} style={{marginTop: 8}}
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
window.torrentSocket.emit('download', this.torrent, null, (added) => {
if(added)
this.setState({startingDownloading: true})
})
}} }}
icon={ icon={
<svg viewBox="0 0 56 56" fill='white'> <svg viewBox="0 0 56 56" fill='white'>
@ -483,6 +481,7 @@ export default class TorrentPage extends Page {
</svg> </svg>
} }
/> />
</DownloadTorrentMenu>
} }
{ {
this.state.downloading this.state.downloading

View File

@ -11,6 +11,7 @@ import LinearProgress from './LinearProgress';
let rating = require('./rating'); let rating = require('./rating');
import scrollBack from './remember-scroll' import scrollBack from './remember-scroll'
import TrackersImages from './trackers-images' import TrackersImages from './trackers-images'
import DownloadTorrentMenu from './download-torrent-menu'
const contentIcon = (type, category, fill = 'grey') => { const contentIcon = (type, category, fill = 'grey') => {
if(category == 'xxx') if(category == 'xxx')
@ -184,6 +185,8 @@ export default class Torrent extends Component {
this.state.downloadRemoveOnDone = removeOnDone this.state.downloadRemoveOnDone = removeOnDone
this.state.downloadPaused = paused this.state.downloadPaused = paused
} }
this.downloadPathInput = React.createRef();
} }
componentDidMount() componentDidMount()
@ -438,19 +441,16 @@ export default class Torrent extends Component {
{ {
!this.state.startingDownloading && !this.state.downloading && !this.state.downloaded !this.state.startingDownloading && !this.state.downloading && !this.state.downloaded
? ?
<DownloadTorrentMenu torrent={torrent} onAdded={(added) => {
if(added)
this.setState({startingDownloading: true})
}}>
<ToolTip hint={__('Download using built-in client')} right={true}> <ToolTip hint={__('Download using built-in client')} right={true}>
<a href={`magnet:?xt=urn:btih:${torrent.hash}`}> <a href={`magnet:?xt=urn:btih:${torrent.hash}`}>
<svg style={{ <svg style={{
height: '24px', height: '24px',
marginRight: 12, marginRight: 12,
fill: torrent.contentCategory != 'xxx' ? (torrent.peer ? '#5643db' : 'black') : (torrent.peer ? '#9083e2' : 'grey') fill: torrent.contentCategory != 'xxx' ? (torrent.peer ? '#5643db' : 'black') : (torrent.peer ? '#9083e2' : 'grey')
}} onClick={(e) => {
e.preventDefault();
e.stopPropagation();
window.torrentSocket.emit('download', torrent, null, (added) => {
if(added)
this.setState({startingDownloading: true})
})
}} viewBox="0 0 56 56"> }} viewBox="0 0 56 56">
<g> <g>
<path d="M35.586,41.586L31,46.172V28c0-1.104-0.896-2-2-2s-2,0.896-2,2v18.172l-4.586-4.586c-0.781-0.781-2.047-0.781-2.828,0 <path d="M35.586,41.586L31,46.172V28c0-1.104-0.896-2-2-2s-2,0.896-2,2v18.172l-4.586-4.586c-0.781-0.781-2.047-0.781-2.828,0
@ -473,6 +473,7 @@ export default class Torrent extends Component {
</svg> </svg>
</a> </a>
</ToolTip> </ToolTip>
</DownloadTorrentMenu>
: :
this.state.startingDownloading && !this.state.downloading this.state.startingDownloading && !this.state.downloading
? ?

View File

@ -187,6 +187,7 @@
"Torrents cleaned": "Torrents cleaned", "Torrents cleaned": "Torrents cleaned",
"or with hash": "or with hash", "or with hash": "or with hash",
"Check torrent files intergrity": "Check torrent files intergrity", "Check torrent files intergrity": "Check torrent files intergrity",
"Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation." "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.",
"Download to": "Download to"
} }
} }

View File

@ -187,6 +187,7 @@
"Torrents cleaned": "Торренты очещены", "Torrents cleaned": "Торренты очещены",
"or with hash": "или по хэшу", "or with hash": "или по хэшу",
"Check torrent files intergrity": "Проверка целостности файлов", "Check torrent files intergrity": "Проверка целостности файлов",
"Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Включить проверку целостности файлов в базе при добавлении каждого торрента. Отключение этой опции освободит некоторорое количество ресурсов процессора при добавлении." "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Включить проверку целостности файлов в базе при добавлении каждого торрента. Отключение этой опции освободит некоторорое количество ресурсов процессора при добавлении.",
"Download to": "Скачать в"
} }
} }

View File

@ -187,6 +187,7 @@
"Torrents cleaned": "Torrents cleaned", "Torrents cleaned": "Torrents cleaned",
"or with hash": "or with hash", "or with hash": "or with hash",
"Check torrent files intergrity": "Check torrent files intergrity", "Check torrent files intergrity": "Check torrent files intergrity",
"Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation." "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.": "Enable database torrents files intergrity check on adding each torrent. Disable this will free some cpu usage on adding operation.",
"Download to": "Download to"
} }
} }