view frontends/primitivus/files_management.py @ 177:8f56238309d9

Primitivus: AdvancedEdit and Notification bar improved - AdvancedEdit now support a completion callback - Notification bar now show progressions
author Goffi <goffi@goffi.org>
date Mon, 16 Aug 2010 21:06:03 +0800
parents a50953ac6191
children d6c0c5dca9b9
line wrap: on
line source

#!/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 <http://www.gnu.org/licenses/>.
"""

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])