Changeset 1159:205b05b8ff8c

Show
Ignore:
Timestamp:
05/17/08 23:56:47 (7 months ago)
Author:
Tobias Eberle <info@…>
Message:

filemanager: rewrite of file hidden check: checkers can now be en-/disabled by the user

Location:
pida
Files:
2 added
4 modified

Legend:

Unmodified
Added
Removed
  • pida/core/actions.py

    r1146 r1159  
    22 
    33# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: 
    4 #Copyright (c) 2005-2006 The PIDA Project 
     4#Copyright (c) 2005-2006,2008 The PIDA Project 
    55 
    66#Permission is hereby granted, free of charge, to any person obtaining a copy 
     
    3434import warnings 
    3535 
     36# kiwi imports 
     37from pida.ui.dropdownmenutoolbutton import DropDownMenuToolButton 
     38 
    3639 
    3740 
     
    4750        gtk.Action.__init__(self, *args, **kw) 
    4851        self.set_tool_item_type(gtk.MenuToolButton) 
     52 
     53class PidaDropDownMenuToolAction(gtk.Action): 
     54    """ 
     55    Custom gtk.Action subclass for handling toolitems with a dropdown menu 
     56    attached. 
     57    """ 
     58 
     59    __gtype_name__ = "PidaDropDownMenuToolAction" 
     60 
     61    def __init__(self, *args, **kw): 
     62        gtk.Action.__init__(self, *args, **kw) 
     63        self.set_tool_item_type(DropDownMenuToolButton) 
     64        self._set_arrow = ((kw['label'] == None) or (kw['label'] == '')) and \ 
     65                          (kw['stock_id'] == None) 
     66 
     67    def create_tool_item(self): 
     68        toolitem = gtk.Action.create_tool_item(self) 
     69        if (self._set_arrow == True): 
     70            toolitem.set_arrow() 
     71        return toolitem 
    4972 
    5073 
     
    5376TYPE_RADIO = gtk.RadioAction 
    5477TYPE_MENUTOOL = PidaMenuToolAction 
     78TYPE_DROPDOWNMENUTOOL = PidaDropDownMenuToolAction 
    5579 
    5680 
  • pida/services/filemanager/filemanager.py

    r1150 r1159  
    11# -*- coding: utf-8 -*-  
    22 
    3 # Copyright (c) 2007 The PIDA Project 
     3# Copyright (c) 2007-2008 The PIDA Project 
    44 
    55#Permission is hereby granted, free of charge, to any person obtaining a copy 
     
    4040from pida.core.events import EventsConfig 
    4141from pida.core.actions import ActionsConfig 
    42 from pida.core.actions import TYPE_NORMAL, TYPE_MENUTOOL, TYPE_RADIO, TYPE_TOGGLE 
    43 from pida.core.options import OptionsConfig, OTypeBoolean, OTypeString 
     42from pida.core.actions import TYPE_NORMAL, TYPE_MENUTOOL, TYPE_DROPDOWNMENUTOOL, TYPE_RADIO, TYPE_TOGGLE 
     43from pida.core.options import OptionsConfig, OTypeBoolean, OTypeString, OTypeStringList 
    4444from pida.core.environment import get_uidef_path 
    4545 
     
    4848from pida.ui.views import PidaView 
    4949from pida.ui.objectlist import AttrSortCombo 
     50from pida.ui.dropdownmenutoolbutton import DropDownMenuToolButton 
    5051from kiwi.ui.objectlist import Column, ColoredColumn, ObjectList 
     52 
     53from filehiddencheck import * 
     54 
    5155 
    5256# locale 
     
    150154        self._vbox.show() 
    151155        self.create_toolbar() 
     156        self._file_hidden_check_actions = {} 
     157        self._create_file_hidden_check_toolbar() 
    152158        self.create_file_list() 
    153159        self._clipboard_file = None 
     
    204210        from operator import and_ 
    205211        def check(checker): 
    206             return checker( 
    207                     name=entry.name,  
    208                     path=entry.parent_path, 
    209                     state=entry.state, 
    210                     ) 
     212            check = checker(self.svc.boss) 
     213            if (check.identifier in self._file_hidden_check_actions) and \ 
     214               (self._file_hidden_check_actions[check.identifier].get_active()): 
     215                return check(name=entry.name, path=entry.parent_path, 
     216                    state=entry.state, ) 
     217            else: 
     218                return True 
    211219 
    212220        if self.svc.opt('show_hidden'): 
     
    334342        return ancs 
    335343 
     344    def _on_act_file_hidden_check(self, action, check): 
     345        if (check.scope == SCOPE_GLOBAL): 
     346            # global 
     347            active_checker = self.svc.opt('file_hidden_check') 
     348            if (action.get_active()): 
     349                active_checker.append(check.identifier) 
     350            else: 
     351                active_checker.remove(check.identifier) 
     352            self.svc.set_opt('file_hidden_check', active_checker) 
     353        else: 
     354            # project 
     355            if (self.svc.current_project is not None): 
     356                section = self.svc.current_project.get_section('file_hidden_check') 
     357                if (section is None): 
     358                    section = {} 
     359                section[check.identifier] = action.get_active() 
     360                self.svc.current_project.save_section('file_hidden_check', 
     361                  section) 
     362        self.update_to_path() 
     363     
     364    def __file_hidden_check_scope_project_set_active(self, action): 
     365        """sets active state of a file hidden check action with 
     366           scope = project 
     367           relies on action name = identifier of checker""" 
     368        if (self.svc.current_project is not None): 
     369            section = self.svc.current_project.get_section('file_hidden_check') 
     370            action.set_active( 
     371              (section is not None) and 
     372              (action.get_name() in section) and 
     373              (section[action.get_name()] == 'True')) 
     374        else: 
     375            action.set_active(False) 
     376         
     377     
     378    def refresh_file_hidden_check(self): 
     379        """refreshes active status of actions of project scope checker""" 
     380        for checker in self.svc.features('file_hidden_check'): 
     381            check = checker(self.svc.boss) 
     382            if (check.scope == SCOPE_PROJECT): 
     383                action = self._file_hidden_check_actions[check.identifier] 
     384                self.__file_hidden_check_scope_project_set_active(action) 
     385     
     386    def _create_file_hidden_check_toolbar(self): 
     387        self._file_hidden_check_actions = {} 
     388        menu = gtk.Menu() 
     389        separator = gtk.SeparatorMenuItem() 
     390        project_scope_count = 0 
     391        menu.append(separator) 
     392        for checker in self.svc.features('file_hidden_check'): 
     393            check = checker(self.svc.boss) 
     394            action = gtk.ToggleAction(check.identifier, check.label, 
     395              check.label, None) 
     396            # active? 
     397            if (check.scope == SCOPE_GLOBAL): 
     398                action.set_active( 
     399                    check.identifier in self.svc.opt('file_hidden_check')) 
     400            else: 
     401                self.__file_hidden_check_scope_project_set_active(action) 
     402 
     403            action.connect('activate', self._on_act_file_hidden_check, check) 
     404            self._file_hidden_check_actions[check.identifier] = action 
     405            menuitem = action.create_menu_item() 
     406            if (check.scope == SCOPE_GLOBAL): 
     407                menu.prepend(menuitem) 
     408            else: 
     409                menu.append(menuitem) 
     410                project_scope_count += 1 
     411        menu.show_all() 
     412        if (project_scope_count == 0): 
     413            separator.hide() 
     414        toolitem = None 
     415        for proxy in self.svc.get_action('toolbar_hidden_menu').get_proxies(): 
     416            if (isinstance(proxy, DropDownMenuToolButton)): 
     417                toolitem = proxy 
     418                break 
     419        if (toolitem is not None): 
     420            toolitem.set_menu(menu) 
     421 
    336422    def get_selected_filename(self): 
    337423        fileentry = self.file_list.get_selected() 
     
    383469            self._fix_paste_sensitivity() 
    384470 
     471class DotFilesFileHiddenCheck(FileHiddenCheck): 
     472    _identifier = "DotFiles" 
     473    _label = "Hide Dot-Files" 
     474    _scope = SCOPE_GLOBAL 
     475     
     476    def __call__(self, name, path, state): 
     477        return name[0] != '.' 
     478 
     479class RegExFileHiddenCheck(FileHiddenCheck): 
     480    _identifier = "RegEx" 
     481    _label = "Hide by User defined Regular Expression" 
     482    _scope = SCOPE_GLOBAL 
     483     
     484    def __call__(self, name, path, state): 
     485        _re = self.boss.get_service('filemanager').opt('hide_regex') 
     486        if not re: 
     487            return True 
     488        else: 
     489            return re.match(_re, name) is None 
    385490 
    386491class FilemanagerEvents(EventsConfig): 
     
    394499        self.subscribe_foreign_event('project', 'project_switched', 
    395500                                     self.svc.on_project_switched) 
     501        self.subscribe_foreign_event('plugins', 'plugin_started', 
     502            self.on_plugin_started) 
     503        self.subscribe_foreign_event('plugins', 'plugin_stopped', 
     504            self.on_plugin_stopped); 
     505 
     506    def on_plugin_started(self, plugin): 
     507        if (plugin.has_foreign_feature('filemanager', 'file_hidden_check')): 
     508            self.svc.refresh_file_hidden_check_menu() 
     509     
     510    def on_plugin_stopped(self, plugin): 
     511        self.svc.refresh_file_hidden_check_menu() 
    396512 
    397513 
     
    429545 
    430546    def subscribe_foreign_features(self): 
    431         self.subscribe_feature('file_hidden_check', self.svc.check_hidden_regex) 
     547        self.subscribe_feature('file_hidden_check', DotFilesFileHiddenCheck) 
     548        self.subscribe_feature('file_hidden_check', RegExFileHiddenCheck) 
    432549 
    433550        self.subscribe_foreign_feature('contexts', 'file-menu', 
     
    446563                True, 
    447564                _('Shows hidden files')) 
     565        self.create_option( 
     566                'file_hidden_check', 
     567                _('Used file hidden checker'), 
     568                OTypeStringList, 
     569                [], 
     570                _('The used file hidden checker')) 
    448571         
    449572        self.create_option( 
     
    566689            TYPE_TOGGLE, 
    567690            _('Show Hidden Files'), 
    568             _('Toggle the display of hidden files'), 
     691            _('Show hidden files'), 
    569692            gtk.STOCK_SELECT_ALL, 
    570693            self.on_toggle_hidden, 
    571694        ) 
     695        self.create_action( 
     696            'toolbar_hidden_menu', 
     697            TYPE_DROPDOWNMENUTOOL, 
     698            '', 
     699            _('Setup which kind of files should be hidden'), 
     700            None, 
     701            None, 
     702        ) 
     703 
    572704 
    573705    def on_browse_for_file(self, action): 
     
    590722        self.svc.boss.cmd('commander','execute_shell', cwd=self.svc.path) 
    591723 
     724    def _on_menu_down(self, menu, action): 
     725        action.set_active(False) 
     726        print "down" 
     727     
    592728    def on_toggle_hidden(self, action): 
    593729        self.svc.set_opt('show_hidden', action.get_active()) 
     
    661797        self.browse(dir) 
    662798 
    663     def check_hidden_regex(self, name, path, state): 
    664         _re = self.opt('hide_regex') 
    665         if not re: 
    666             return True 
    667         else: 
    668             return re.match(_re, name) is None 
    669  
    670799    def rename_file(self, old, new, basepath): 
    671800        pass 
    672801 
     802    def refresh_file_hidden_check_menu(self): 
     803        self.get_view()._create_file_hidden_check_toolbar() 
     804     
    673805    def on_project_switched(self, project): 
    674806        self.current_project = project 
    675807        self.get_action('toolbar_projectroot').set_sensitive(project is not None) 
     808        self.get_view().refresh_file_hidden_check() 
    676809 
    677810 
  • pida/services/filemanager/uidef/filemanager-toolbar.xml

    r905 r1159  
    66        <toolitem action="toolbar_refresh" name="toolbar_refresh"/> 
    77        <toolitem action="toolbar_terminal" name="toolbar_terminal"/> 
    8         <toolitem action="toolbar_toggle_hidden" name="toggle_hidden"/> 
     8        <toolitem action="toolbar_toggle_hidden" name="toolbar_toggle_hidden"/> 
     9        <toolitem action="toolbar_hidden_menu" name="toolbar_hidden_menu"/> 
    910        <separator /> 
    1011        <toolitem action="toolbar_delete" name="toolbar_delete"/> 
  • pida/services/versioncontrol/versioncontrol.py

    r1150 r1159  
    11# -*- coding: utf-8 -*-  
    22 
    3 # Copyright (c) 2007 The PIDA Project 
     3# Copyright (c) 2007-2008 The PIDA Project 
    44 
    55#Permission is hereby granted, free of charge, to any person obtaining a copy 
     
    4242 
    4343from pida.utils.gthreads import AsyncTask, gcall 
     44 
     45from pida.services.filemanager.filehiddencheck import FileHiddenCheck, SCOPE_GLOBAL 
    4446 
    4547# locale 
     
    216218        self.svc.get_action('show_commit').set_active(False) 
    217219 
     220class VersionControlFileHiddenCheck(FileHiddenCheck): 
     221    _identifier = "VersionControl" 
     222    _label = "Hide Ignored Files by Version Control" 
     223    _scope = SCOPE_GLOBAL 
     224     
     225    def __call__(self, name, path, state): 
     226        return not (state == "hidden" or state == "ignored") 
    218227 
    219228class VersioncontrolFeaturesConfig(FeaturesConfig): 
     
    228237            self.subscribe_feature("workdir-manager", mgr) 
    229238 
    230         self.subscribe_foreign_feature( 
    231                 "filemanager", "file_hidden_check", 
    232                 self.svc.ignored_file_checker 
    233                 ) 
     239        #self.subscribe_foreign_feature( 
     240        #        "filemanager", "file_hidden_check", 
     241        #        self.svc.ignored_file_checker 
     242        #        ) 
     243        self.subscribe_foreign_feature('filemanager', 'file_hidden_check', 
     244            VersionControlFileHiddenCheck) 
    234245        self.subscribe_foreign_feature('contexts', 'file-menu', 
    235246            (self.svc.get_action_group(), 'versioncontrol-file-menu.xml'))