# HG changeset patch # User Goffi # Date 1281625771 -28800 # Node ID 96a2c5904e35fb7302b3adecd0c50433bac944e0 # Parent 333a62fab0e3875d30770d6ce48d3cce3911be72 Primitivus: send_file first draft - a new dialog for choosing a file is work in progress diff -r 333a62fab0e3 -r 96a2c5904e35 frontends/primitivus/custom_widgets.py --- a/frontends/primitivus/custom_widgets.py Thu Aug 12 13:18:11 2010 +0800 +++ b/frontends/primitivus/custom_widgets.py Thu Aug 12 23:09:31 2010 +0800 @@ -899,7 +899,7 @@ top_columns.widget_list[1] = label_widget class VerticalSeparator(urwid.WidgetDecoration, urwid.WidgetWrap): - def __init__(self, original_widget, left_char = utf8decode("│"), right_char = ''): + def __init__(self, original_widget, left_char = u"│", right_char = ''): """Draw a separator on left and/or right of original_widget.""" widgets = [original_widget] diff -r 333a62fab0e3 -r 96a2c5904e35 frontends/primitivus/files_management.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frontends/primitivus/files_management.py Thu Aug 12 23:09:31 2010 +0800 @@ -0,0 +1,101 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +Primitivus: a SAT frontend +Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) + +This program is free software: you can 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. + +This program 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 this program. If not, see . +""" + +import urwid +import custom_widgets +from tools.jid import JID +import os, os.path +from xml.dom import minidom +from logging import debug, info, error + +class PathEdit(custom_widgets.AdvancedEdit): + + def keypress(self, size, key): + if key == 'ctrl w': + if self.edit_pos<2: + return + before = self.edit_text[:self.edit_pos] + pos = (before[:-1] if before.endswith('/') else before).rfind("/")+1 + self.set_edit_text(before[:pos] + self.edit_text[self.edit_pos:]) + self.set_edit_pos(pos) + return + else: + return super(PathEdit, self).keypress(size, key) + +class FileDialog(urwid.WidgetWrap): + + def __init__(self,title=_("Please select a file")): + self.__home_path = os.path.expanduser('~') + self.path_wid = PathEdit(_('Path: '), os.getcwdu()) + urwid.connect_signal(self.path_wid, 'change', self.onPathChange) + header = urwid.Pile([self.path_wid, urwid.Divider(u'─')]) + bookm_list = urwid.SimpleListWalker([]) + self.bookmarks = list(self.getBookmarks()) + self.bookmarks.sort() + for bookmark in self.bookmarks: + if bookmark.startswith(self.__home_path): + bookmark="~"+bookmark[len(self.__home_path):] + book_wid = custom_widgets.ClickableText(bookmark) + urwid.connect_signal(book_wid, 'click', self.onBookmarkSelected) + bookm_list.append(book_wid) + bookm_wid = urwid.Frame(urwid.ListBox(bookm_list), urwid.AttrMap(urwid.Text(_('Bookmarks'),'center'),'title')) + self.files_list = urwid.SimpleListWalker([urwid.Text('toto.mkv')]) + files_wid = urwid.ListBox(self.files_list) + center_row = urwid.Columns([('weight',2,bookm_wid), + ('weight',8,custom_widgets.VerticalSeparator(files_wid))]) + main_frame = custom_widgets.FocusFrame(center_row, header) + decorated = custom_widgets.LabelLine(main_frame, custom_widgets.SurroundedText(title)) + urwid.WidgetWrap.__init__(self, decorated) + + def getBookmarks(self): + gnome_bookm = os.path.expanduser("~/.gtk-bookmarks") + kde_bookm = os.path.expanduser("~/.kde/share/apps/kfileplaces/bookmarks.xm") + bookmarks = set() + try: + with open(gnome_bookm) as gnome_fd: + for bm in gnome_fd.readlines(): + if bm.startswith("file:///"): + bookmarks.add(bm[7:].replace('\n','')) + except IOError: + info(_('No Gnome bookmarks file found')) + pass + + try: + dom = minidom.parse(kde_bookm) + for elem in getElementsByTagName('bookmark'): + bm = elem.getAttribute("href") + if bm.startswith("file:///"): + bookmarks.add(bm[7:]) + except IOError: + info(_('No KDE bookmarks file found')) + pass + + return bookmarks + + def onBookmarkSelected(self, button): + self.path_wid.set_edit_text(os.path.expanduser(button.get_text())) + + def onPathChange(self, edit, text): + if os.path.isdir(text): + del self.files_list[:] + files = os.listdir(text) + files.sort() + self.files_list.extend([custom_widgets.ClickableText(filename) for filename in files])