mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-06 08:28:39 +00:00
Flake8 files_tab
This commit is contained in:
parent
c5f7eeaacb
commit
711962da84
1 changed files with 42 additions and 64 deletions
|
@ -1,38 +1,11 @@
|
||||||
#
|
# -*- coding: utf-8 -*-
|
||||||
# files_tab.py
|
|
||||||
#
|
#
|
||||||
# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
|
# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
|
||||||
#
|
#
|
||||||
# Deluge is free software.
|
# 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.
|
||||||
#
|
#
|
||||||
# You may redistribute it and/or modify it under the terms of the
|
|
||||||
# GNU General Public License, as published by the Free Software
|
|
||||||
# Foundation; either version 3 of the License, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# deluge is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with deluge. If not, write to:
|
|
||||||
# The Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# In addition, as a special exception, the copyright holders give
|
|
||||||
# permission to link the code of portions of this program with the OpenSSL
|
|
||||||
# library.
|
|
||||||
# You must obey the GNU General Public License in all respects for all of
|
|
||||||
# the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
# exception, you may extend this exception to your version of the file(s),
|
|
||||||
# but you are not obligated to do so. If you do not wish to do so, delete
|
|
||||||
# this exception statement from your version. If you delete this exception
|
|
||||||
# statement from all source files in the program, then also delete it here.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
import gtk
|
import gtk
|
||||||
import gtk.gdk
|
import gtk.gdk
|
||||||
|
@ -49,7 +22,9 @@ from deluge.ui.gtkui.common import reparent_iter, save_pickled_state_file, load_
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
def _(message): return message
|
|
||||||
|
def _(message):
|
||||||
|
return message
|
||||||
|
|
||||||
TRANSLATE = {
|
TRANSLATE = {
|
||||||
"Do Not Download": _("Do Not Download"),
|
"Do Not Download": _("Do Not Download"),
|
||||||
|
@ -60,11 +35,13 @@ TRANSLATE = {
|
||||||
|
|
||||||
del _
|
del _
|
||||||
|
|
||||||
|
|
||||||
def _t(text):
|
def _t(text):
|
||||||
if text in TRANSLATE:
|
if text in TRANSLATE:
|
||||||
text = TRANSLATE[text]
|
text = TRANSLATE[text]
|
||||||
return _(text)
|
return _(text)
|
||||||
|
|
||||||
|
|
||||||
def cell_priority(column, cell, model, row, data):
|
def cell_priority(column, cell, model, row, data):
|
||||||
if model.get_value(row, 5) == -1:
|
if model.get_value(row, 5) == -1:
|
||||||
# This is a folder, so lets just set it blank for now
|
# This is a folder, so lets just set it blank for now
|
||||||
|
@ -73,6 +50,7 @@ def cell_priority(column, cell, model, row, data):
|
||||||
priority = model.get_value(row, data)
|
priority = model.get_value(row, data)
|
||||||
cell.set_property("text", _t(deluge.common.FILE_PRIORITY[priority]))
|
cell.set_property("text", _t(deluge.common.FILE_PRIORITY[priority]))
|
||||||
|
|
||||||
|
|
||||||
def cell_priority_icon(column, cell, model, row, data):
|
def cell_priority_icon(column, cell, model, row, data):
|
||||||
if model.get_value(row, 5) == -1:
|
if model.get_value(row, 5) == -1:
|
||||||
# This is a folder, so lets just set it blank for now
|
# This is a folder, so lets just set it blank for now
|
||||||
|
@ -88,11 +66,13 @@ def cell_priority_icon(column, cell, model, row, data):
|
||||||
elif deluge.common.FILE_PRIORITY[priority] == "Highest Priority":
|
elif deluge.common.FILE_PRIORITY[priority] == "Highest Priority":
|
||||||
cell.set_property("stock-id", gtk.STOCK_GOTO_TOP)
|
cell.set_property("stock-id", gtk.STOCK_GOTO_TOP)
|
||||||
|
|
||||||
|
|
||||||
def cell_filename(column, cell, model, row, data):
|
def cell_filename(column, cell, model, row, data):
|
||||||
"""Only show the tail portion of the file path"""
|
"""Only show the tail portion of the file path"""
|
||||||
filepath = model.get_value(row, data)
|
filepath = model.get_value(row, data)
|
||||||
cell.set_property("text", os.path.split(filepath)[1])
|
cell.set_property("text", os.path.split(filepath)[1])
|
||||||
|
|
||||||
|
|
||||||
def cell_progress(column, cell, model, row, data):
|
def cell_progress(column, cell, model, row, data):
|
||||||
text = model.get_value(row, data[0])
|
text = model.get_value(row, data[0])
|
||||||
value = model.get_value(row, data[1])
|
value = model.get_value(row, data[1])
|
||||||
|
@ -100,6 +80,7 @@ def cell_progress(column, cell, model, row, data):
|
||||||
cell.set_property("text", text)
|
cell.set_property("text", text)
|
||||||
cell.set_property("value", value)
|
cell.set_property("value", value)
|
||||||
|
|
||||||
|
|
||||||
class FilesTab(Tab):
|
class FilesTab(Tab):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
Tab.__init__(self)
|
Tab.__init__(self)
|
||||||
|
@ -264,7 +245,7 @@ class FilesTab(Tab):
|
||||||
def load_state(self):
|
def load_state(self):
|
||||||
state = load_pickled_state_file("files_tab.state")
|
state = load_pickled_state_file("files_tab.state")
|
||||||
|
|
||||||
if state == None:
|
if not state:
|
||||||
return
|
return
|
||||||
|
|
||||||
if state["sort_id"] is not None and state["sort_order"] is not None:
|
if state["sort_id"] is not None and state["sort_order"] is not None:
|
||||||
|
@ -272,7 +253,7 @@ class FilesTab(Tab):
|
||||||
|
|
||||||
for (index, column) in enumerate(self.listview.get_columns()):
|
for (index, column) in enumerate(self.listview.get_columns()):
|
||||||
cname = column.get_title()
|
cname = column.get_title()
|
||||||
if state["columns"].has_key(cname):
|
if cname in state["columns"]:
|
||||||
cstate = state["columns"][cname]
|
cstate = state["columns"][cname]
|
||||||
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
|
||||||
column.set_fixed_width(cstate["width"] if cstate["width"] > 0 else 10)
|
column.set_fixed_width(cstate["width"] if cstate["width"] > 0 else 10)
|
||||||
|
@ -314,7 +295,8 @@ class FilesTab(Tab):
|
||||||
log.debug("Getting file list from core..")
|
log.debug("Getting file list from core..")
|
||||||
status_keys += ["files"]
|
status_keys += ["files"]
|
||||||
|
|
||||||
component.get("SessionProxy").get_torrent_status(self.torrent_id, status_keys).addCallback(self._on_get_torrent_status, self.torrent_id)
|
component.get("SessionProxy").get_torrent_status(
|
||||||
|
self.torrent_id, status_keys).addCallback(self._on_get_torrent_status, self.torrent_id)
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.treestore.clear()
|
self.treestore.clear()
|
||||||
|
@ -358,7 +340,7 @@ class FilesTab(Tab):
|
||||||
|
|
||||||
## The following 3 methods create the folder/file view in the treeview
|
## The following 3 methods create the folder/file view in the treeview
|
||||||
def prepare_file_store(self, files):
|
def prepare_file_store(self, files):
|
||||||
split_files = { }
|
split_files = {}
|
||||||
i = 0
|
i = 0
|
||||||
for file in files:
|
for file in files:
|
||||||
self.prepare_file(file, file["path"], i, split_files)
|
self.prepare_file(file, file["path"], i, split_files)
|
||||||
|
@ -372,22 +354,22 @@ class FilesTab(Tab):
|
||||||
else:
|
else:
|
||||||
file_name_chunk = file_name[:first_slash_index+1]
|
file_name_chunk = file_name[:first_slash_index+1]
|
||||||
if file_name_chunk not in files_storage:
|
if file_name_chunk not in files_storage:
|
||||||
files_storage[file_name_chunk] = { }
|
files_storage[file_name_chunk] = {}
|
||||||
self.prepare_file(file, file_name[first_slash_index+1:],
|
self.prepare_file(file, file_name[first_slash_index+1:],
|
||||||
file_num, files_storage[file_name_chunk])
|
file_num, files_storage[file_name_chunk])
|
||||||
|
|
||||||
def add_files(self, parent_iter, split_files):
|
def add_files(self, parent_iter, split_files):
|
||||||
ret = 0
|
ret = 0
|
||||||
for key,value in split_files.iteritems():
|
for key, value in split_files.iteritems():
|
||||||
if key.endswith("/"):
|
if key.endswith("/"):
|
||||||
chunk_iter = self.treestore.append(parent_iter,
|
chunk_iter = self.treestore.append(parent_iter,
|
||||||
[key, 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
[key, 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
||||||
chunk_size = self.add_files(chunk_iter, value)
|
chunk_size = self.add_files(chunk_iter, value)
|
||||||
self.treestore.set(chunk_iter, 1, chunk_size)
|
self.treestore.set(chunk_iter, 1, chunk_size)
|
||||||
ret += chunk_size
|
ret += chunk_size
|
||||||
else:
|
else:
|
||||||
self.treestore.append(parent_iter, [key,
|
self.treestore.append(parent_iter, [key,
|
||||||
value[1]["size"], "", 0, 0, value[0], gtk.STOCK_FILE])
|
value[1]["size"], "", 0, 0, value[0], gtk.STOCK_FILE])
|
||||||
ret += value[1]["size"]
|
ret += value[1]["size"]
|
||||||
return ret
|
return ret
|
||||||
###
|
###
|
||||||
|
@ -398,7 +380,7 @@ class FilesTab(Tab):
|
||||||
self.listview.expand_row("0", False)
|
self.listview.expand_row("0", False)
|
||||||
|
|
||||||
def get_selected_files(self):
|
def get_selected_files(self):
|
||||||
"""Returns a list of file indexes that are selected"""
|
"""Returns a list of file indexes that are selected."""
|
||||||
def get_iter_children(itr, selected):
|
def get_iter_children(itr, selected):
|
||||||
i = self.treestore.iter_children(itr)
|
i = self.treestore.iter_children(itr)
|
||||||
while i:
|
while i:
|
||||||
|
@ -428,9 +410,7 @@ class FilesTab(Tab):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def update_folder_percentages(self):
|
def update_folder_percentages(self):
|
||||||
"""
|
"""Go through the tree and update the folder complete percentages."""
|
||||||
Go through the tree and update the folder complete percentages.
|
|
||||||
"""
|
|
||||||
root = self.treestore.get_iter_root()
|
root = self.treestore.get_iter_root()
|
||||||
if root is None or self.treestore[root][5] != -1:
|
if root is None or self.treestore[root][5] != -1:
|
||||||
return
|
return
|
||||||
|
@ -523,16 +503,16 @@ class FilesTab(Tab):
|
||||||
def _on_key_press_event(self, widget, event):
|
def _on_key_press_event(self, widget, event):
|
||||||
keyname = gtk.gdk.keyval_name(event.keyval)
|
keyname = gtk.gdk.keyval_name(event.keyval)
|
||||||
if keyname is not None:
|
if keyname is not None:
|
||||||
func = getattr(self, 'keypress_' + keyname, None)
|
func = getattr(self, 'keypress_' + keyname.lower(), None)
|
||||||
selected_rows = self.listview.get_selection().get_selected_rows()[1]
|
selected_rows = self.listview.get_selection().get_selected_rows()[1]
|
||||||
if func and selected_rows:
|
if func and selected_rows:
|
||||||
return func(event)
|
return func(event)
|
||||||
|
|
||||||
def keypress_Menu(self, event):
|
def keypress_menu(self, event):
|
||||||
self.file_menu.popup(None, None, None, 3, event.time)
|
self.file_menu.popup(None, None, None, 3, event.time)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def keypress_F2(self, event):
|
def keypress_f2(self, event):
|
||||||
path, col = self.listview.get_cursor()
|
path, col = self.listview.get_cursor()
|
||||||
for column in self.listview.get_columns():
|
for column in self.listview.get_columns():
|
||||||
if column.get_title() == self.filename_column_name:
|
if column.get_title() == self.filename_column_name:
|
||||||
|
@ -550,9 +530,9 @@ class FilesTab(Tab):
|
||||||
self.torrent_id, ["save_path", "files"]).addCallback(self._on_show_file)
|
self.torrent_id, ["save_path", "files"]).addCallback(self._on_show_file)
|
||||||
|
|
||||||
def _set_file_priorities_on_user_change(self, selected, priority):
|
def _set_file_priorities_on_user_change(self, selected, priority):
|
||||||
"""Sets the file priorities in the core. It will change the selected
|
"""Sets the file priorities in the core. It will change the selected with the 'priority'"""
|
||||||
with the 'priority'"""
|
|
||||||
file_priorities = []
|
file_priorities = []
|
||||||
|
|
||||||
def set_file_priority(model, path, iter, data):
|
def set_file_priority(model, path, iter, data):
|
||||||
index = model.get_value(iter, 5)
|
index = model.get_value(iter, 5)
|
||||||
if index in selected and index != -1:
|
if index in selected and index != -1:
|
||||||
|
@ -603,6 +583,7 @@ class FilesTab(Tab):
|
||||||
# We are renaming a file
|
# We are renaming a file
|
||||||
itr = self.treestore.get_iter(path)
|
itr = self.treestore.get_iter(path)
|
||||||
# Recurse through the treestore to get the actual path of the file
|
# Recurse through the treestore to get the actual path of the file
|
||||||
|
|
||||||
def get_filepath(i):
|
def get_filepath(i):
|
||||||
ip = self.treestore.iter_parent(i)
|
ip = self.treestore.iter_parent(i)
|
||||||
fp = ""
|
fp = ""
|
||||||
|
@ -663,6 +644,7 @@ class FilesTab(Tab):
|
||||||
parent_path = [o for o in name.split("/")[:-1]]
|
parent_path = [o for o in name.split("/")[:-1]]
|
||||||
# Find the iter to the parent folder we need to add a new folder
|
# Find the iter to the parent folder we need to add a new folder
|
||||||
# to.
|
# to.
|
||||||
|
|
||||||
def find_parent(model, path, itr, user_data):
|
def find_parent(model, path, itr, user_data):
|
||||||
if model[itr][0] == parent_path[0] + "/":
|
if model[itr][0] == parent_path[0] + "/":
|
||||||
if len(parent_path) == 1:
|
if len(parent_path) == 1:
|
||||||
|
@ -681,17 +663,16 @@ class FilesTab(Tab):
|
||||||
break
|
break
|
||||||
child_iter = self.treestore.iter_next(child_iter)
|
child_iter = self.treestore.iter_next(child_iter)
|
||||||
if create:
|
if create:
|
||||||
parent_iter = self.treestore.append(parent_iter,
|
parent_iter = self.treestore.append(
|
||||||
[tc + "/", 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
parent_iter, [tc + "/", 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
||||||
|
|
||||||
# Find the iter for the file that needs to be moved
|
# Find the iter for the file that needs to be moved
|
||||||
def get_file_iter(model, path, itr, user_data):
|
def get_file_iter(model, path, itr, user_data):
|
||||||
if model[itr][5] == index:
|
if model[itr][5] == index:
|
||||||
model[itr][0] = name.split("/")[-1]
|
model[itr][0] = name.split("/")[-1]
|
||||||
t = self.treestore.append(
|
# t = self.treestore.append(
|
||||||
parent_iter,
|
# parent_iter,
|
||||||
self.treestore.get(itr,
|
# self.treestore.get(itr, *xrange(self.treestore.get_n_columns())))
|
||||||
*xrange(self.treestore.get_n_columns())))
|
|
||||||
itr_parent = self.treestore.iter_parent(itr)
|
itr_parent = self.treestore.iter_parent(itr)
|
||||||
self.treestore.remove(itr)
|
self.treestore.remove(itr)
|
||||||
self.remove_childless_folders(itr_parent)
|
self.remove_childless_folders(itr_parent)
|
||||||
|
@ -709,8 +690,8 @@ class FilesTab(Tab):
|
||||||
new_folders = name.split("/")[:-1]
|
new_folders = name.split("/")[:-1]
|
||||||
parent_iter = None
|
parent_iter = None
|
||||||
for f in new_folders:
|
for f in new_folders:
|
||||||
parent_iter = self.treestore.append(parent_iter,
|
parent_iter = self.treestore.append(
|
||||||
[f + "/", 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
parent_iter, [f + "/", 0, "", 0, 0, -1, gtk.STOCK_DIRECTORY])
|
||||||
child = self.get_iter_at_path(old_name)
|
child = self.get_iter_at_path(old_name)
|
||||||
self.treestore.append(
|
self.treestore.append(
|
||||||
parent_iter,
|
parent_iter,
|
||||||
|
@ -726,9 +707,7 @@ class FilesTab(Tab):
|
||||||
self.treestore.foreach(set_file_name, None)
|
self.treestore.foreach(set_file_name, None)
|
||||||
|
|
||||||
def get_iter_at_path(self, filepath):
|
def get_iter_at_path(self, filepath):
|
||||||
"""
|
"""Returns the gtkTreeIter for filepath."""
|
||||||
Returns the gtkTreeIter for filepath
|
|
||||||
"""
|
|
||||||
log.debug("get_iter_at_path: %s", filepath)
|
log.debug("get_iter_at_path: %s", filepath)
|
||||||
is_dir = False
|
is_dir = False
|
||||||
if filepath[-1] == "/":
|
if filepath[-1] == "/":
|
||||||
|
@ -759,9 +738,7 @@ class FilesTab(Tab):
|
||||||
return path_iter
|
return path_iter
|
||||||
|
|
||||||
def remove_childless_folders(self, itr):
|
def remove_childless_folders(self, itr):
|
||||||
"""
|
"""Goes up the tree removing childless itrs starting at itr."""
|
||||||
Goes up the tree removing childless itrs starting at itr
|
|
||||||
"""
|
|
||||||
while not self.treestore.iter_children(itr):
|
while not self.treestore.iter_children(itr):
|
||||||
parent = self.treestore.iter_parent(itr)
|
parent = self.treestore.iter_parent(itr)
|
||||||
self.treestore.remove(itr)
|
self.treestore.remove(itr)
|
||||||
|
@ -857,7 +834,8 @@ class FilesTab(Tab):
|
||||||
while itr:
|
while itr:
|
||||||
pp = self.treestore[itr][0] + pp
|
pp = self.treestore[itr][0] + pp
|
||||||
itr = self.treestore.iter_parent(itr)
|
itr = self.treestore.iter_parent(itr)
|
||||||
client.core.rename_folder(self.torrent_id, pp + model[selected[0]][0], parent_path + model[selected[0]][0])
|
client.core.rename_folder(self.torrent_id, pp + model[selected[0]][0],
|
||||||
|
parent_path + model[selected[0]][0])
|
||||||
else:
|
else:
|
||||||
#[(index, filepath), ...]
|
#[(index, filepath), ...]
|
||||||
to_rename = []
|
to_rename = []
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue