Changeset 3770


Ignore:
Timestamp:
10/14/11 19:10:43 (3 years ago)
Author:
prock
Message:
  • Pychan widgets can now be shown/hidden even if they are not top level containers. There is one drawback with this implementation and that is when you modify the container widget after you hide a widget. The widget is not guaranteed to come back in the same spot you would expect it to. This only happens when you modify the container widget. I'm keeping this ticket open so people can test. [t:375]
  • Added a Show Hide test to the PychanTest? module in fife_test.
  • Added some more tiles to the rpg tileset in fife_test.
Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/engine/python/fife/extensions/pychan/widgets/containers.py

    r3541 r3770  
    4949                self.real_widget = _real_widget or fife.Container() 
    5050                self.children = [] 
     51                self.hidden_children = [] 
    5152                self.margins = margins 
    5253                self.padding = padding 
     
    5758        def addChild(self, widget): 
    5859                widget.parent = self 
     60                widget._visible = self._visible 
    5961                self.children.append(widget) 
    6062                self.real_widget.add(widget.real_widget) 
     
    8587                self.children.remove(widget) 
    8688                self.real_widget.remove(widget.real_widget) 
     89                 
     90                if widget in self.hidden_children: 
     91                        self.hidden_children.remove(widget) 
     92                         
    8793                widget.parent = None 
    8894 
     95        def hideChild(self, child): 
     96                if not child in self.children: 
     97                        raise RuntimeError("%s does not have %s as direct child widget." % (str(self), str(child))) 
     98                 
     99                self.hidden_children.append(child) 
     100                child._widgetposition = self.children.index(child) 
     101         
     102                self.children.remove(child) 
     103                self.real_widget.remove(child.real_widget) 
     104                 
     105        def showChild(self, child): 
     106                if not child in self.hidden_children: 
     107                        raise RuntimeError("%s does not have %s as direct hidden child widget." % (str(self), str(child))) 
     108 
     109                if child._widgetposition > len(self.children) or 0-child._widgetposition > len(self.children): 
     110                        self.addChild(child) 
     111                else: 
     112                        self.insertChild(child, child._widgetposition)                   
     113                         
     114                self.hidden_children.remove(child) 
     115                child._widgetposition = -1 
     116                         
    89117        def add(self,*widgets): 
    90118                print "PyChan: Deprecation warning: Please use 'addChild' or 'addChildren' instead." 
  • trunk/engine/python/fife/extensions/pychan/widgets/widget.py

    r3697 r3770  
    122122                self.__parent = None 
    123123                self.parent = parent 
     124                 
     125                #used when saving the position of the widget when hiding it 
     126                self._widgetposition = -1 
    124127 
    125128                self.has_name = False 
     
    228231                Show the widget and all contained widgets. 
    229232                """ 
     233                if self._visible: return 
     234 
    230235                if self.parent: 
    231                         raise RuntimeError(Widget.HIDE_SHOW_ERROR) 
    232                 if self._visible: return 
    233                 self.adaptLayout() 
    234                 self.beforeShow() 
    235                 get_manager().show(self) 
    236                 self._visible = True 
     236                        self.beforeShow() 
     237                        self.parent.showChild(self) 
     238                        self.parent.adaptLayout() 
     239                        self._visible = True 
     240                else: 
     241                        self.adaptLayout() 
     242                        self.beforeShow() 
     243                        get_manager().show(self) 
     244                        self._visible = True 
     245                         
     246                def _show(widget): 
     247                        widget._visible = True 
     248                                 
     249                self.deepApply(_show) 
    237250 
    238251        def hide(self): 
     
    240253                Hide the widget and all contained widgets. 
    241254                """ 
     255                if not self._visible: return 
     256                 
    242257                if self.parent: 
    243                         raise RuntimeError(Widget.HIDE_SHOW_ERROR) 
    244                 if not self._visible: return 
    245  
    246                 get_manager().hide(self) 
     258                        self.parent.hideChild(self) 
     259                        self.parent.adaptLayout() 
     260                else: 
     261                        get_manager().hide(self) 
    247262 
    248263                self.afterHide() 
    249264                self._visible = False 
     265                 
     266                def _hide(widget): 
     267                        widget._visible = False 
     268                                 
     269                self.deepApply(_hide) 
    250270 
    251271        def isVisible(self): 
     
    254274                either directly or as part of a container widget. 
    255275                """ 
    256                 widget = self 
    257                 while widget.parent: 
    258                         widget = widget.parent 
    259                 return widget._visible 
     276 
     277                return self._visible 
    260278 
    261279        def adaptLayout(self,recurse=True): 
  • trunk/tests/fife_test/data/maps/tileset_test.xml

    r3711 r3770  
    22<map format="1.0" id="tileset_test"> 
    33        <import file="../tilesets/rpg_tiles.xml"></import> 
    4         <layer transparency="0" y_offset="0.0" id="layer1" x_offset="0.0" x_scale="1.0" rotation="0.0" pathing="cell_edges_only" y_scale="1.0" grid_type="square"> 
     4        <layer transparency="0" id="layer1" x_offset="0.0" x_scale="1.0" y_scale="1.0" grid_type="square" pathing="cell_edges_only" y_offset="0.0" rotation="0.0"> 
    55                <instances> 
     6                        <i stackpos="0" r="0" ns="rpg_tileset" x="-2.0" y="-2.0" o="brick" z="0.0"></i> 
     7                        <i stackpos="0" r="0" x="-2.0" y="-1.0" o="brick" z="0.0"></i> 
     8                        <i stackpos="0" r="0" x="-1.0" y="-1.0" o="brick" z="0.0"></i> 
     9                        <i stackpos="0" r="0" x="-1.0" y="-2.0" o="brick" z="0.0"></i> 
     10                        <i stackpos="0" r="0" x="0.0" y="-2.0" o="brick" z="0.0"></i> 
     11                        <i stackpos="0" r="0" x="0.0" y="-1.0" o="brick" z="0.0"></i> 
     12                        <i stackpos="0" r="0" x="0.0" y="0.0" o="brick" z="0.0"></i> 
     13                        <i stackpos="0" r="0" x="-1.0" y="0.0" o="brick" z="0.0"></i> 
     14                        <i stackpos="0" r="0" x="-2.0" y="0.0" o="brick" z="0.0"></i> 
     15                        <i stackpos="0" r="0" x="-2.0" y="1.0" o="brick" z="0.0"></i> 
     16                        <i stackpos="0" r="0" x="-1.0" y="1.0" o="brick" z="0.0"></i> 
     17                        <i stackpos="0" r="0" x="0.0" y="1.0" o="brick" z="0.0"></i> 
     18                        <i stackpos="0" r="0" x="1.0" y="-1.0" o="brick" z="0.0"></i> 
     19                        <i stackpos="0" r="0" x="1.0" y="-2.0" o="brick" z="0.0"></i> 
     20                        <i stackpos="0" r="0" x="1.0" y="-3.0" o="brick" z="0.0"></i> 
     21                        <i stackpos="0" r="0" x="0.0" y="-3.0" o="brick" z="0.0"></i> 
     22                        <i stackpos="0" r="0" x="-1.0" y="-3.0" o="brick" z="0.0"></i> 
     23                        <i stackpos="0" r="0" x="-2.0" y="-3.0" o="brick" z="0.0"></i> 
     24                        <i stackpos="0" r="0" x="-3.0" y="-3.0" o="brick" z="0.0"></i> 
     25                        <i stackpos="0" r="0" x="-3.0" y="-2.0" o="brick" z="0.0"></i> 
     26                        <i stackpos="0" r="0" x="-3.0" y="-1.0" o="brick" z="0.0"></i> 
     27                        <i stackpos="0" r="0" x="-3.0" y="0.0" o="brick" z="0.0"></i> 
     28                        <i stackpos="0" r="0" x="-3.0" y="1.0" o="brick" z="0.0"></i> 
     29                        <i stackpos="0" r="90" x="-4.0" y="-3.0" o="gbside" z="0.0"></i> 
     30                        <i stackpos="0" r="90" x="-4.0" y="-2.0" o="gbside" z="0.0"></i> 
     31                        <i stackpos="0" r="90" x="-4.0" y="-1.0" o="gbside" z="0.0"></i> 
     32                        <i stackpos="0" r="90" x="-4.0" y="0.0" o="gbside" z="0.0"></i> 
     33                        <i stackpos="0" r="90" x="-4.0" y="1.0" o="gbside" z="0.0"></i> 
     34                        <i stackpos="0" r="0" x="-4.0" y="-4.0" o="gbcorner" z="0.0"></i> 
     35                        <i stackpos="0" r="0" x="1.0" y="-4.0" o="gbside" z="0.0"></i> 
     36                        <i stackpos="0" r="0" x="0.0" y="-4.0" o="gbside" z="0.0"></i> 
     37                        <i stackpos="0" r="0" x="-1.0" y="-4.0" o="gbside" z="0.0"></i> 
     38                        <i stackpos="0" r="0" x="-2.0" y="-4.0" o="gbside" z="0.0"></i> 
     39                        <i stackpos="0" r="0" x="-3.0" y="-4.0" o="gbside" z="0.0"></i> 
     40                        <i stackpos="0" r="0" x="1.0" y="1.0" o="brick" z="0.0"></i> 
     41                        <i stackpos="0" r="0" x="1.0" y="0.0" o="brick" z="0.0"></i> 
     42                        <i stackpos="0" r="270" x="2.0" y="-3.0" o="gbside" z="0.0"></i> 
     43                        <i stackpos="0" r="270" x="2.0" y="-2.0" o="gbside" z="0.0"></i> 
     44                        <i stackpos="0" r="270" x="2.0" y="-1.0" o="gbside" z="0.0"></i> 
     45                        <i stackpos="0" r="270" x="2.0" y="0.0" o="gbside" z="0.0"></i> 
     46                        <i stackpos="0" r="270" x="2.0" y="1.0" o="gbside" z="0.0"></i> 
     47                        <i stackpos="0" r="180" x="1.0" y="2.0" o="gbside" z="0.0"></i> 
     48                        <i stackpos="0" r="180" x="0.0" y="2.0" o="gbside" z="0.0"></i> 
     49                        <i stackpos="0" r="180" x="-1.0" y="2.0" o="gbside" z="0.0"></i> 
     50                        <i stackpos="0" r="180" x="-2.0" y="2.0" o="gbside" z="0.0"></i> 
     51                        <i stackpos="0" r="180" x="-3.0" y="2.0" o="gbside" z="0.0"></i> 
     52                        <i stackpos="0" r="270" x="2.0" y="-4.0" o="gbcorner" z="0.0"></i> 
     53                        <i stackpos="0" r="180" x="2.0" y="2.0" o="gbcorner" z="0.0"></i> 
     54                        <i stackpos="0" r="90" x="-4.0" y="2.0" o="gbcorner" z="0.0"></i> 
    655                </instances> 
    756                <lights> 
    857                </lights> 
    958        </layer> 
    10         <camera ref_cell_width="48" zoom="1.0" ref_cell_height="48" rotation="0.0" tilt="0.0" ref_layer_id="layer1" id="camera1"> 
     59        <camera ref_layer_id="layer1" id="camera1" tilt="0.0" zoom="1.0" ref_cell_width="48" ref_cell_height="48" rotation="0.0"> 
    1160        </camera> 
    1261</map> 
  • trunk/tests/fife_test/data/tilesets/rpg_tiles.xml

    r3711 r3770  
    161161        <image source="tile_01_02.png" direction="270"/> 
    162162</object> 
    163  
     163<object id="gtreebase" namespace="rpg_tileset" blocking="1" static="1"> 
     164        <image source="tile_01_05.png" direction="0"/> 
     165</object> 
     166<object id="streebase" namespace="rpg_tileset" blocking="1" static="1"> 
     167        <image source="tile_02_05.png" direction="0"/> 
     168</object> 
     169<object id="treetop" namespace="rpg_tileset" blocking="0" static="1"> 
     170        <image source="tile_01_06.png" direction="0"/> 
     171</object> 
     172<object id="btreebase" namespace="rpg_tileset" blocking="1" static="1"> 
     173        <image source="tile_02_06.png" direction="0"/> 
     174</object> 
     175<object id="gscorner" namespace="rpg_tileset" blocking="0" static="1"> 
     176        <image source="tile_00_07.png" direction="0"/> 
     177        <image source="tile_01_07.png" direction="90"/> 
     178        <image source="tile_01_08.png" direction="180"/> 
     179        <image source="tile_00_08.png" direction="270"/> 
     180</object> 
     181<object id="sgcorner" namespace="rpg_tileset" blocking="0" static="1"> 
     182        <image source="tile_00_09.png" direction="0"/> 
     183        <image source="tile_02_09.png" direction="90"/> 
     184        <image source="tile_02_11.png" direction="180"/> 
     185        <image source="tile_00_11.png" direction="270"/> 
     186</object> 
     187<object id="sgside" namespace="rpg_tileset" blocking="0" static="1"> 
     188        <image source="tile_00_10.png" direction="0"/> 
     189        <image source="tile_01_09.png" direction="90"/> 
     190        <image source="tile_02_10.png" direction="180"/> 
     191        <image source="tile_01_11.png" direction="270"/> 
     192</object> 
  • trunk/tests/fife_test/tests/PychanTest.py

    r3700 r3770  
    187187                self.styledCredits.show() 
    188188 
     189class ShowHideTest(PyChanExample): 
     190        def __init__(self): 
     191                super(ShowHideTest,self).__init__('data/gui/showhide.xml') 
     192 
     193        def start(self): 
     194                self.widget = pychan.loadXML(self.xmlFile) 
     195 
     196                self.text1widget = self.widget.findChild(name="text1") 
     197                self.text2widget = self.widget.findChild(name="text2") 
     198                self.text3widget = self.widget.findChild(name="text3") 
     199                self.vbox1widget = self.widget.findChild(name="vbox1") 
     200 
     201 
     202                eventMap = { 
     203                        'closeButton':self.stop, 
     204                        'hideText1': self.text1widget.hide, 
     205                        'showText1': self.text1widget.show, 
     206                        'hideText2': self.text2widget.hide, 
     207                        'showText2': self.text2widget.show, 
     208                        'hideText3': self.text3widget.hide, 
     209                        'showText3': self.text3widget.show, 
     210                        'hideVBox1': self.vbox1widget.hide, 
     211                        'showVBox1': self.vbox1widget.show, 
     212                } 
     213 
     214                self.widget.mapEvents(eventMap) 
     215                 
     216                self.widget.show() 
    189217 
    190218class DynamicExample(PyChanExample): 
     
    616644                        'Colortester': ColorExample(), 
    617645                        'GuiAnimations' : PocAnimations(), 
     646                        'Show Hide Test' : ShowHideTest(), 
    618647                } 
    619648                self.demoList = self.gui.findChild(name='demoList') 
Note: See TracChangeset for help on using the changeset viewer.