diff --git a/deluge/core/daemon.py b/deluge/core/daemon.py index 84c4514a1..d7ab813ba 100644 --- a/deluge/core/daemon.py +++ b/deluge/core/daemon.py @@ -182,6 +182,11 @@ class Daemon(object): """Returns a list of the exported methods.""" return self.rpcserver.get_method_list() + @export() + def get_version(self): + """Returns the daemon version""" + return get_version() + @export(1) def authorized_call(self, rpc): """Determines if session auth_level is authorized to call RPC. diff --git a/deluge/ui/web/css/deluge.css b/deluge/ui/web/css/deluge.css index f520a4747..b9fa03e98 100644 --- a/deluge/ui/web/css/deluge.css +++ b/deluge/ui/web/css/deluge.css @@ -21,12 +21,16 @@ button::-moz-focus-inner { background-image: url('../icons/deluge.png') !important; } -#tbar-deluge-text.x-item-disabled * { +.x-deluge-logo { + background-image: url('../ui_images/deluge-about.png'); +} + +#tbar-deluge-text * { color: black !important; font-weight: bold; } -#tbar-deluge-text.x-item-disabled { +#tbar-deluge-text { opacity: 1 !important; } diff --git a/deluge/ui/web/js/deluge-all/AboutWindow.js b/deluge/ui/web/js/deluge-all/AboutWindow.js new file mode 100644 index 000000000..5376d05c0 --- /dev/null +++ b/deluge/ui/web/js/deluge-all/AboutWindow.js @@ -0,0 +1,129 @@ +/** + * Deluge.AboutWindow.js + * + * Copyright (c) Damien Churchill 2009-2010 + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Ext.namespace('Deluge.about'); + +/** + * @class Deluge.about.AboutWindow + * @extends Ext.Window + */ +Deluge.about.AboutWindow = Ext.extend(Ext.Window, { + id: 'AboutWindow', + title: _('About Deluge'), + height: 330, + width: 270, + iconCls: 'x-deluge-main-panel', + resizable: false, + plain: true, + layout: { + type: 'vbox', + align: 'center', + }, + buttonAlign: 'center', + + initComponent: function() { + Deluge.about.AboutWindow.superclass.initComponent.call(this); + this.addEvents({ + build_ready: true, + }); + + var self = this; + var libtorrent = function() { + deluge.client.core.get_libtorrent_version({ + success: function(lt_version) { + comment += '
' + _('libtorrent:') + ' ' + lt_version; + Ext.getCmp('about_comment').setText(comment, false); + self.fireEvent('build_ready'); + }, + }); + }; + + var client_version = deluge.version; + + var comment = + _( + 'A peer-to-peer file sharing program\nutilizing the BitTorrent protocol.' + ).replace('\n', '
') + + '

' + + _('Client:') + + ' ' + + client_version + + '
'; + deluge.client.web.connected({ + success: function(connected) { + if (connected) { + deluge.client.daemon.get_version({ + success: function(server_version) { + comment += + _('Server:') + ' ' + server_version + '
'; + libtorrent(); + }, + }); + } else { + this.fireEvent('build_ready'); + } + }, + failure: function() { + this.fireEvent('build_ready'); + }, + scope: this, + }); + + this.add([ + { + xtype: 'box', + style: 'padding-top: 5px', + height: 80, + width: 240, + cls: 'x-deluge-logo', + hideLabel: true, + }, + { + xtype: 'label', + style: 'padding-top: 10px; font-weight: bold; font-size: 16px;', + text: _('Deluge') + ' ' + client_version, + }, + { + xtype: 'label', + id: 'about_comment', + style: 'padding-top: 10px; text-align:center; font-size: 12px;', + html: comment, + }, + { + xtype: 'label', + style: 'padding-top: 10px; font-size: 10px;', + text: _('Copyright 2007-2018 Deluge Team'), + }, + { + xtype: 'label', + style: 'padding-top: 5px; font-size: 12px;', + html: + 'deluge-torrent.org', + }, + ]); + this.addButton(_('Close'), this.onCloseClick, this); + }, + + show: function() { + this.on('build_ready', function() { + Deluge.about.AboutWindow.superclass.show.call(this); + }); + }, + + onCloseClick: function() { + this.close(); + }, +}); + +Ext.namespace('Deluge'); + +Deluge.About = function() { + new Deluge.about.AboutWindow().show(); +}; diff --git a/deluge/ui/web/js/deluge-all/Toolbar.js b/deluge/ui/web/js/deluge-all/Toolbar.js index 0b4e7588b..d51818b4a 100644 --- a/deluge/ui/web/js/deluge-all/Toolbar.js +++ b/deluge/ui/web/js/deluge-all/Toolbar.js @@ -20,9 +20,9 @@ Deluge.Toolbar = Ext.extend(Ext.Toolbar, { items: [ { id: 'tbar-deluge-text', - disabled: true, text: _('Deluge'), iconCls: 'x-deluge-main-panel', + handler: this.onAboutClick, }, new Ext.Toolbar.Separator(), { @@ -161,6 +161,11 @@ Deluge.Toolbar = Ext.extend(Ext.Toolbar, { window.open('http://dev.deluge-torrent.org/wiki/UserGuide'); }, + onAboutClick: function() { + var about = new Deluge.about.AboutWindow(); + about.show(); + }, + onPreferencesClick: function() { deluge.preferences.show(); }, diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py index 15d4c4353..d85205842 100644 --- a/deluge/ui/web/server.py +++ b/deluge/ui/web/server.py @@ -251,8 +251,8 @@ class LookupResource(resource.Resource, component.Component): if path in self.__paths: filename = os.path.basename(request.path).decode() for directory in self.__paths[path]: - if os.path.join(directory, filename): - path = os.path.join(directory, filename) + path = os.path.join(directory, filename) + if os.path.isfile(path): log.debug('Serving path: %s', path) mime_type = mimetypes.guess_type(path) request.setHeader(b'content-type', mime_type[0].encode()) @@ -461,6 +461,12 @@ class TopLevel(resource.Resource): self.putChild(b'flag', Flag()) self.putChild(b'icons', LookupResource('Icons', rpath('icons'))) self.putChild(b'images', LookupResource('Images', rpath('images'))) + self.putChild( + b'ui_images', + LookupResource( + 'UI_Images', common.resource_filename('deluge.ui.data', 'pixmaps') + ), + ) js = ScriptResource()