1
# Copyright 2005 Joe Wreschnig
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License version 2 as
5
# published by the Free Software Foundation
7
# $Id: downloader.py 3494 2006-06-23 04:43:35Z mu $
19
from qltk.views import AllTreeView
21
class DownloadWindow(qltk.Window):
25
def download(klass, source, target):
26
if klass.downloads is None:
27
# source fileobj, target fileobj, I/O watch callback ID
28
klass.downloads = gtk.ListStore(object, object, int)
29
if klass.__window is None:
30
klass.__window = DownloadWindow()
31
klass.__window._download(source, target)
32
klass.__window.present()
33
download = classmethod(download)
36
super(DownloadWindow, self).__init__()
37
self.set_title("Quod Libet - " + _("Downloads"))
38
self.set_default_size(300, 150)
39
self.set_border_width(12)
43
view.connect('popup-menu', self.__popup_menu)
44
view.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
45
view.set_model(self.downloads)
46
view.set_rules_hint(True)
48
render = gtk.CellRendererText()
49
render.set_property('ellipsize', pango.ELLIPSIZE_START)
50
column = gtk.TreeViewColumn(_("Filename"), render)
51
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
52
column.set_expand(True)
53
def cell_data_name(column, cell, model, iter):
54
cell.set_property('text', model[iter][1].name)
55
column.set_cell_data_func(render, cell_data_name)
56
view.append_column(column)
58
render = gtk.CellRendererText()
59
column = gtk.TreeViewColumn(_("Size"), render)
60
column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY)
61
def cell_data_size(column, cell, model, iter):
62
size = util.format_size(model[iter][1].tell())
63
cell.set_property('text', size)
64
column.set_cell_data_func(render, cell_data_size)
65
view.append_column(column)
67
sw = gtk.ScrolledWindow()
69
sw.set_shadow_type(gtk.SHADOW_IN)
70
sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
73
'delete-event', DownloadWindow.__delete_event, self)
77
for row in self.downloads:
78
self.downloads.row_changed(row.path, row.iter)
81
def __popup_menu(self, view):
82
selection = view.get_selection()
83
model, paths = selection.get_selected_rows()
85
iters = map(model.get_iter, paths)
87
item = gtk.ImageMenuItem(gtk.STOCK_STOP)
88
item.connect_object('activate', self.__stop_download, iters)
90
menu.connect('selection-done', lambda m: m.destroy())
92
return view.popup_menu(menu, 0, gtk.get_current_event_time())
94
def __stop_download(self, iters):
96
gobject.source_remove(self.downloads[iter][2])
97
self.downloads[iter][0].close()
98
self.downloads[iter][1].close()
99
os.unlink(self.downloads[iter][1].name)
100
self.downloads.remove(iter)
103
super(DownloadWindow, self).present()
104
if self.__timeout is None:
105
self.__timeout = gobject.timeout_add(1000, self.__update)
107
def __delete_event(self, event):
109
if self.__timeout is not None:
110
gobject.source_remove(self.__timeout)
111
self.__timeout = None
114
def _download(self, source, target):
115
fileobj = file(target, "wb")
116
url = urllib.urlopen(source)
119
iter = self.downloads.append(row=[sock, fileobj, 0])
120
sig_id = gobject.io_add_watch(
121
sock, gobject.IO_IN|gobject.IO_ERR|gobject.IO_HUP,
122
self.__got_data, fileobj, iter)
123
self.downloads[iter][2] = sig_id
125
def __got_data(self, src, condition, fileobj, iter):
126
if condition in [gobject.IO_ERR, gobject.IO_HUP]:
129
self.downloads.remove(iter)
132
buf = src.recv(1024*1024)
133
if buf: fileobj.write(buf)
137
self.downloads.remove(iter)