Changeset 303 for trunk


Ignore:
Timestamp:
10/03/09 17:07:11 (10 years ago)
Author:
eliedebrauwer
Message:

Ticket #110: Patch by Elie De Brauwer. removed parpgfilebrowser, filebrowser seems to have the required logic already on board, also added licensing information and some formatting to filebrowser.py fix. fixes[s:trac, t:110]

Location:
trunk/game/scripts
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/game/scripts/filebrowser.py

    r262 r303  
    1 # coding: utf-8 
     1#!/usr/bin/python 
     2 
     3#   This program is free software: you can redistribute it and/or modify 
     4#   it under the terms of the GNU General Public License as published by 
     5#   the Free Software Foundation, either version 3 of the License, or 
     6#   (at your option) any later version. 
     7 
     8#   This program is distributed in the hope that it will be useful, 
     9#   but WITHOUT ANY WARRANTY; without even the implied warranty of 
     10#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     11#   GNU General Public License for more details. 
     12 
     13#   You should have received a copy of the GNU General Public License 
     14#   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
    215 
    316import pychan 
     
    619 
    720def u2s(string): 
    8         return string.encode(sys.getfilesystemencoding()) 
     21    return string.encode(sys.getfilesystemencoding()) 
    922 
    1023class FileBrowser(object): 
    11         """ 
    12         FileBrowser displays directory and file listings from the vfs. 
    13         The fileSelected parameter is a callback invoked when a file selection has been made; its 
     24    """ 
     25    FileBrowser displays directory and file listings from the vfs. 
     26    The fileSelected parameter is a callback invoked when a file selection has been made; its 
    1427    signature must be fileSelected(path,filename). If selectdir is set, fileSelected's 
    15                 filename parameter should be optional. 
    16         The savefile option provides a box for supplying a new filename that doesn't exist yet. 
    17   The selectdir option allows directories to be selected as well as files. 
    18         """ 
    19         def __init__(self, engine, fileSelected, savefile=False, selectdir=False, extensions=('xml',), guixmlpath="gui/filebrowser.xml"): 
    20                 self.engine = engine 
    21                 self.fileSelected = fileSelected 
     28    filename parameter should be optional. 
     29    The savefile option provides a box for supplying a new filename that doesn't exist yet. 
     30    The selectdir option allows directories to be selected as well as files. 
     31    """ 
     32    def __init__(self, engine, fileSelected, savefile=False, selectdir=False, extensions=('.dat',), guixmlpath="gui/filebrowser.xml"): 
     33        self.engine = engine 
     34        self.fileSelected = fileSelected 
    2235 
    23                 self._widget = None 
    24                 self.savefile = savefile 
    25                 self.selectdir = selectdir 
    26                  
    27                 self.guixmlpath = guixmlpath 
     36        self._widget = None 
     37        self.savefile = savefile 
     38        self.selectdir = selectdir 
     39         
     40        self.guixmlpath = guixmlpath 
    2841 
    29                 self.extensions = extensions 
    30                 self.path = './saves/' 
    31                 self.dir_list = [] 
    32                 self.file_list = [] 
     42        self.extensions = extensions 
     43        self.path = './saves/' 
     44        self.dir_list = [] 
     45        self.file_list = [] 
    3346 
    34         def showBrowser(self): 
    35                 if self._widget: 
    36                         self._widget.show() 
    37                         return 
    38                 self._widget = pychan.loadXML(self.guixmlpath) 
    39                 self._widget.mapEvents({ 
    40                         'dirList'       : self._setDirectory, 
    41                         'selectButton'  : self._selectFile, 
    42                         'closeButton'   : self._widget.hide 
    43                 }) 
    44                 self._setDirectory() 
    45                 if self.savefile: 
    46                         self._file_entry = widgets.TextField(name='saveField', text=u'')         
    47                         self._widget.findChild(name="fileColumn").addChild(self._file_entry) 
    48                 self._widget.show() 
     47    def showBrowser(self): 
     48        """ Shows the file dialog browser """ 
     49        if self._widget: 
     50            self._widget.show() 
     51            return 
     52        self._widget = pychan.loadXML(self.guixmlpath) 
     53        self._widget.mapEvents({ 
     54            'dirList'       : self._setDirectory, 
     55            'selectButton'  : self._selectFile, 
     56            'closeButton'   : self._widget.hide 
     57        }) 
     58        self._setDirectory() 
     59        if self.savefile: 
     60            self._file_entry = widgets.TextField(name='saveField', text=u'')     
     61            self._widget.findChild(name="fileColumn").addChild(self._file_entry) 
     62        self._widget.show() 
    4963 
    50         def _setDirectory(self): 
    51                 selection = self._widget.collectData('dirList') 
    52                 if not (selection < 0): 
    53                         new_dir = u2s(self.dir_list[selection]) 
    54                         lst = self.path.split('/') 
    55                         if new_dir == '..' and lst[-1] != '..' and lst[-1] != '.': 
    56                                 lst.pop() 
    57                         else: 
    58                                 lst.append(new_dir) 
    59                         self.path = '/'.join(lst) 
    60                          
    61                 def decodeList(list): 
    62                         fs_encoding = sys.getfilesystemencoding() 
    63                         if fs_encoding is None: fs_encoding = "ascii" 
    64                  
    65                         newList = [] 
    66                         for i in list: 
    67                                 try: newList.append(unicode(i, fs_encoding)) 
    68                                 except: 
    69                                         newList.append(unicode(i, fs_encoding, 'replace')) 
    70                                         print "WARNING: Could not decode item:", i 
    71                         return newList 
    72                          
    73                  
     64    def _setDirectory(self): 
     65        """ Directory change callback. """ 
     66        selection = self._widget.collectData('dirList') 
     67        if not (selection < 0): 
     68            new_dir = u2s(self.dir_list[selection]) 
     69            lst = self.path.split('/') 
     70            if new_dir == '..' and lst[-1] != '..' and lst[-1] != '.': 
     71                lst.pop() 
     72            else: 
     73                lst.append(new_dir) 
     74            self.path = '/'.join(lst) 
     75             
     76        def decodeList(list): 
     77            fs_encoding = sys.getfilesystemencoding() 
     78            if fs_encoding is None: fs_encoding = "ascii" 
     79         
     80            newList = [] 
     81            for i in list: 
     82                try: newList.append(unicode(i, fs_encoding)) 
     83                except: 
     84                    newList.append(unicode(i, fs_encoding, 'replace')) 
     85                    print "WARNING: Could not decode item:", i 
     86            return newList 
     87             
     88         
    7489 
    75                 self.dir_list = [] 
    76                 self.file_list = [] 
    77                  
    78                 dir_list = ('..',) + filter(lambda d: not d.startswith('.'), self.engine.getVFS().listDirectories(self.path)) 
    79                 file_list = filter(lambda f: f.split('.')[-1] in self.extensions, self.engine.getVFS().listFiles(self.path)) 
    80                                  
    81                 self.dir_list = decodeList(dir_list) 
    82                 self.file_list = decodeList(file_list) 
    83                 self._widget.distributeInitialData({ 
    84                         'dirList'  : self.dir_list, 
    85                         'fileList' : self.file_list 
    86                 }) 
     90        self.dir_list = [] 
     91        self.file_list = [] 
     92         
     93        dir_list = ('..',) + filter(lambda d: not d.startswith('.'), self.engine.getVFS().listDirectories(self.path)) 
     94        file_list = filter(lambda f: f.split('.')[-1] in self.extensions, self.engine.getVFS().listFiles(self.path)) 
     95                 
     96        self.dir_list = decodeList(dir_list) 
     97        self.file_list = decodeList(file_list) 
     98        self._widget.distributeInitialData({ 
     99            'dirList'  : self.dir_list, 
     100            'fileList' : self.file_list 
     101        }) 
    87102 
    88         def _selectFile(self): 
    89                 self._widget.hide() 
    90                 selection = self._widget.collectData('fileList') 
    91                 data = self._widget.collectData('saveField') 
     103    def _selectFile(self): 
     104        """ File selection callback. """ 
     105        self._widget.hide() 
     106        selection = self._widget.collectData('fileList') 
     107        data = self._widget.collectData('saveField') 
    92108 
    93                 if self.savefile: 
    94                         if data: 
    95                                 if (data.split('.')[1] == 'dat'): 
    96                                         self.fileSelected(self.path, u2s(self._widget.collectData('saveField'))) 
    97                                 else: 
    98                                         self._warningMessage() 
    99                                 return 
    100                          
     109        if self.savefile: 
     110            if data: 
     111                if (data.split('.')[1] == 'dat'): 
     112                    self.fileSelected(self.path, u2s(self._widget.collectData('saveField'))) 
     113                else: 
     114                    self._warningMessage() 
     115                return 
     116             
    101117 
    102                 if selection >= 0 and selection < len(self.file_list): 
    103                         self.fileSelected(self.path, u2s(self.file_list[selection])) 
    104                         return 
    105                  
    106                 if self.selectdir: 
    107                         self.fileSelected(self.path) 
    108                         return 
     118        if selection >= 0 and selection < len(self.file_list): 
     119            self.fileSelected(self.path, u2s(self.file_list[selection])) 
     120            return 
     121         
     122        if self.selectdir: 
     123            self.fileSelected(self.path) 
     124            return 
    109125 
    110                 print 'FileBrowser: error, no selection.' 
     126        print 'FileBrowser: error, no selection.' 
    111127 
    112         def _warningMessage(self): 
    113                 window = widgets.Window(title="Warning") 
    114                 text = "Please save the file as a .dat" 
    115                 label = widgets.Label(text=text) 
    116                 ok_button = widgets.Button(name="ok_button", text="Ok") 
    117                 window.addChildren([label, ok_button]) 
    118                 window.mapEvents({'ok_button':window.hide}) 
    119                 window.show() 
     128    def _warningMessage(self): 
     129        """ Shows the warning message dialog when a file with a 
     130        faulty extension was selected. """ 
     131        window = widgets.Window(title="Warning") 
     132        text = "Please save the file as a .dat" 
     133        label = widgets.Label(text=text) 
     134        ok_button = widgets.Button(name="ok_button", text="Ok") 
     135        window.addChildren([label, ok_button]) 
     136        window.mapEvents({'ok_button':window.hide}) 
     137        window.show() 
  • trunk/game/scripts/hud.py

    r294 r303  
    1919import pychan.widgets as widgets 
    2020from pychan.tools import callbackWithArguments as cbwa 
    21 from scripts.parpgfilebrowser import PARPGFileBrowser 
     21from scripts.filebrowser import FileBrowser 
    2222from scripts.context_menu import ContextMenu 
    2323from scripts import inventory 
     
    266266        """ Called when the user wants to save the game. 
    267267            @return: None""" 
    268         save_browser = PARPGFileBrowser(self.engine, 
     268        save_browser = FileBrowser(self.engine, 
    269269                                   self.saveGameCallback, 
    270270                                   savefile=True, 
     
    281281        """ Called when the user wants to load a game. 
    282282            @return: None""" 
    283         load_browser = PARPGFileBrowser(self.engine, 
     283        load_browser = FileBrowser(self.engine, 
    284284                                   self.loadGameCallback, 
    285285                                   savefile=False, 
Note: See TracChangeset for help on using the changeset viewer.