Skip to content
This repository has been archived by the owner on Feb 3, 2020. It is now read-only.

Commit

Permalink
remove files to trash implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
baverman committed May 27, 2011
1 parent a2225cc commit f59e49e
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 34 deletions.
7 changes: 4 additions & 3 deletions fmd/app.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import gtk

from uxie.actions import Activator, ContextActivator
from uxie.feedback import TextFeedback, FeedbackManager
from uxie.feedback import TextFeedback, FeedbackManager, FeedbackHelper
import filelist
import clipboard

Expand All @@ -15,8 +15,9 @@ def __init__(self):

self.clipboard = clipboard.Clipboard()
self.feedback = FeedbackManager()
self.window.feedback = FeedbackHelper(self.feedback, self.window)

self.filelist = filelist.FileList(self.clipboard, self)
self.filelist = filelist.FileList(self.clipboard)
self.window.add(self.filelist.widget)

self.activator = Activator()
Expand Down Expand Up @@ -47,7 +48,7 @@ def get_context(self, window, ctx):
return self.filelist
elif ctx == 'filelist_active' and self.filelist.view.has_focus():
return self.filelist
elif ctx == 'filelist_with_selected_files' and self.filelist.view.selected:
elif ctx == 'filelist_with_selected_files' and self.filelist.model.selection:
return self.filelist

return None
Expand Down
80 changes: 70 additions & 10 deletions fmd/filelist.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import gio

from uxie.search import InteractiveSearch
from uxie.tree import SelectionListStore

from .iconview import FmdIconView

Expand Down Expand Up @@ -69,11 +70,10 @@ def forward(self):


class FileList(object):
def __init__(self, clipboard, feedback):
def __init__(self, clipboard):
self.clipboard = clipboard
self.feedback = feedback

self.model = gtk.ListStore(gtk.gdk.Pixbuf, str, gio.FileInfo, bool)
self.model = SelectionListStore(gtk.gdk.Pixbuf, str, gio.FileInfo, bool)

self.widget = gtk.VBox()

Expand Down Expand Up @@ -109,6 +109,12 @@ def __init__(self, clipboard, feedback):
self.history = History()
self.show_hidden = False

self.monitor = None

@property
def feedback(self):
return self.view.get_toplevel().feedback

def _search(self, text, direction, skip):
idx = sidx = self.view.get_cursor()[0] if self.view.get_cursor() else 0

Expand Down Expand Up @@ -157,6 +163,48 @@ def get_pixbuf(self, info):
self.icon_cache[content_type] = pixbuf
return pixbuf

def setup_monitor(self, file):
if self.monitor:
self.monitor.cancel()

self.monitor = file.monitor()
self.monitor.connect('changed', self.on_file_change)

def get_info_for_file_which_will_change_model(self, file):
if not self.current_folder.equal(file.get_parent()):
return None

fi = file.query_info('standard::*')
if not self.show_hidden and fi.get_is_hidden():
return None

return fi

def add_file(self, file):
fi = self.get_info_for_file_which_will_change_model(file)
self.model.append((self.get_pixbuf(fi), fi.get_display_name(), fi, True))
self.view.refresh()

def remove_file(self, file):
if not self.current_folder.equal(file.get_parent()):
return None

for r in self.model:
if r[2].get_name() == file.get_basename():
del self.model[r.path]
break

self.view.refresh()

def on_file_change(self, monitor, file, other_file, event_type):
if event_type == gio.FILE_MONITOR_EVENT_CREATED:
self.add_file(file)
elif event_type == gio.FILE_MONITOR_EVENT_DELETED:
self.remove_file(file)
elif event_type == gio.FILE_MONITOR_EVENT_MOVED:
self.remove_file(file)
self.add_file(other_file)

def fill(self, uri, add_to_history=True, cursor=None, scroll=None):
self.view.set_model(None)

Expand All @@ -168,6 +216,8 @@ def fill(self, uri, add_to_history=True, cursor=None, scroll=None):
self.current_folder = gio.file_parse_name(uri)
enumerator = self.current_folder.enumerate_children('standard::*')

self.setup_monitor(self.current_folder)

infos = []
while True:
fi = enumerator.next_file()
Expand Down Expand Up @@ -242,7 +292,7 @@ def show_hidden(self):

def get_filelist_from_selection(self):
result = []
for path in self.view.selected:
for path in self.model.selection:
result.append(self.current_folder.get_child_for_display_name(
self.model[path][1]))

Expand All @@ -253,9 +303,9 @@ def cut(self):
self.clipboard.cut(filelist)

for r in self.model:
r[3] = r.path not in self.view.selected
r[3] = r.path not in self.model.selection
self.view.queue_draw()
self.feedback.show_feedback('Cut')
self.feedback.show('Cut')

def copy(self):
filelist = self.get_filelist_from_selection()
Expand All @@ -264,18 +314,28 @@ def copy(self):
for r in self.model:
r[3] = True
self.view.queue_draw()
self.feedback.show_feedback('Copy')
self.feedback.show('Copy')

def paste(self):
self.clipboard.paste(self.current_folder)

for r in self.model:
r[3] = True
self.view.queue_draw()
self.feedback.show_feedback('Pasted', 'done')
self.feedback.show('Pasted', 'done')

def delete(self):
self.feedback.show_feedback('You are going to delete files', 'warn')
files = self.get_filelist_from_selection()
try:
for f in files:
f.trash()
except gio.Error, e:
self.feedback.show(str(e), 'error')
else:
if len(files) == 1:
self.feedback.show('File was deleted', 'done')
else:
self.feedback.show('Files were deleted', 'done')

def force_delete(self):
self.feedback.show_feedback('You are going to delete files', 'error')
self.feedback.show('You are going to delete files', 'error')
50 changes: 29 additions & 21 deletions fmd/iconview.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ def __init__(self):
self.item_cache = {}
self.columns = []
self.column_first_item = {}
self.selected = {}
self.cursor = None

self.item_draw_queue = []
Expand All @@ -72,34 +71,36 @@ def _prepare_cell(self, cell, row):

def unselect_all(self):
if self.model:
for path in self.selected:
for path in self.model.selection:
self._queue_path_draw(path)

self.selected.clear()
self.model.clear_selection()

def set_cursor(self, path, select=True, select_between=False):
prev = self.cursor
self.cursor = path
if select:
self.unselect_all()
self.selected[path] = True

if self.model:
if select:
self.unselect_all()
self.model.select(path)

if self.cursor not in self.item_cache:
return

if prev:
self._queue_path_draw(prev)
if select_between:
cursor = self.cursor
remove_selection = cursor in self.selected and prev in self.selected
remove_selection = self.model.is_selected(cursor) and self.model.is_selected(prev)
if prev > self.cursor:
prev, cursor = cursor, prev

for path in self._foreach_path(prev, cursor):
if remove_selection and path != self.cursor:
try:
del self.selected[path]
except KeyError: pass
self.model.unselect(path)
else:
self.selected[path] = True
self.model.select(path)

self._queue_path_draw(path)

Expand All @@ -111,7 +112,7 @@ def get_cursor(self):

def _draw_item(self, item, row, xoffset, earea):
flags = 0
if row.path in self.selected:
if self.model.is_selected(row.path):
flags = gtk.CELL_RENDERER_SELECTED
self.style.paint_flat_box(self.window, gtk.STATE_SELECTED, gtk.SHADOW_NONE,
earea, self, 'fmd icon text', item.x + item.tx - xoffset, item.y + item.ty,
Expand Down Expand Up @@ -229,7 +230,11 @@ def do_realize(self):
self.window.set_background(self.style.base[gtk.STATE_NORMAL])

def _queue_path_draw(self, path):
item = self.item_cache[path]
try:
item = self.item_cache[path]
except KeyError:
return

self.item_draw_queue.append((path, item))
xoffset = int(self._hadj.value)
self.window.invalidate_rect(Rectangle(item.x - xoffset, item.y,
Expand Down Expand Up @@ -270,9 +275,10 @@ def scroll_to_path(self, path, align=None):
item = self.item_cache[path]
maxx = self.allocation.width
xoffset = int(self._hadj.value)
margin = self.style_get_property('margin')

x1 = item.x - xoffset
x2 = item.x + item.width - xoffset
x1 = item.x - xoffset - margin
x2 = x1 + item.width
if align is None:
if 0 <= x1 <= maxx and 0 <= x2 <= maxx:
return
Expand Down Expand Up @@ -333,17 +339,19 @@ def do_key_press_event(self, event):

if keyval == keysyms.space and state == CONTROL_MASK:
if self.cursor:
if self.cursor in self.selected:
del self.selected[self.cursor]
self._queue_path_draw(self.cursor)
elif self.cursor not in self.selected:
self.selected[self.cursor] = True
self._queue_path_draw(self.cursor)
self.model.invert_selection(self.cursor)
self._queue_path_draw(self.cursor)

return True

return False

def refresh(self):
self.update_item_cache()
self.needed_full_redraw = True
self.queue_draw()


gobject.type_register(FmdIconView)

gtk.widget_class_install_style_property(FmdIconView, ('hspacing', gobject.TYPE_INT,
Expand Down

0 comments on commit f59e49e

Please sign in to comment.