Mercurial > fife-parpg
diff demos/pychan_demo/pychan_demo.py @ 613:8c9cdcc9bc4f
Renaming pychan_test.py to pychan_demo.py to make it a bit more obvious which file to execute.
author | prock@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Fri, 24 Sep 2010 15:19:58 +0000 |
parents | demos/pychan_demo/pychan_test.py@427150724fe1 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demos/pychan_demo/pychan_demo.py Fri Sep 24 15:19:58 2010 +0000 @@ -0,0 +1,187 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# #################################################################### +# Copyright (C) 2005-2009 by the FIFE team +# http://www.fifengine.de +# This file is part of FIFE. +# +# FIFE is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# #################################################################### + +# This is the pychan demo client for FIFE. + +import sys, os, re + +fife_path = os.path.join('..','..','engine','python') +if os.path.isdir(fife_path) and fife_path not in sys.path: + sys.path.insert(0,fife_path) + +from fife import fife +print "Using the FIFE python module found here: ", os.path.dirname(fife.__file__) + +from fife.extensions import fifelog +from fife.extensions import basicapplication +from fife.extensions import pychan +from fife.extensions.pychan.dialogs import trace + +class PyChanExample(object): + """ + Example class. + """ + def __init__(self,xmlFile): + self.xmlFile = xmlFile + self.widget = None + + def start(self): + """ + The Example Protocoll: start + """ + # For simplicity the most basic examples should define + # a okButton and/or a closeButton. Those are mapped + # to the stop handler. + self.widget = pychan.loadXML(self.xmlFile) + eventMap = { + 'closeButton':self.stop, + 'okButton' :self.stop + } + # Since the basic example are not required to + # supply close and ok button, we 'ignoreMissing' + self.widget.mapEvents(eventMap, ignoreMissing = True) + self.widget.show() + + #from pprint import pprint + #pprint(self.widget.getNamedChildren()) + + def stop(self): + """ + The Example Protocoll: stop + """ + if self.widget: + self.widget.hide() + self.widget = None + +class TextSetter(object): + def __init__(self,text): + self.text = text + def __call__(self,widget): + widget.text = self.text + +class DemoApplication(basicapplication.ApplicationBase): + def __init__(self): + # Let the ApplicationBase initialise FIFE + super(DemoApplication,self).__init__() + + # Init Pychan + pychan.loadFonts("fonts/freefont.fontdef") + pychan.manager.setDefaultFont("FreeSans") + pychan.setupModalExecution(self.mainLoop,self.breakFromMainLoop) + + # Build the main GUI + self.gui = pychan.loadXML('gui/demoapp.xml') + self.gui.min_size = self.engine.getRenderBackend().getScreenWidth(),self.engine.getRenderBackend().getScreenHeight() + + eventMap = { + 'creditsLink' : self.showCredits, + 'closeButton' : self.quit, + 'demoList' : self.selectExample, + } + self.gui.mapEvents(eventMap) + + # A simple hover-effect for the credits label + credits = self.gui.findChild(name="creditsLink") + # setEnterCallback is deprecated - we use it here to test it. + credits.setEnterCallback(TextSetter(u"CREDITS")) + # Note that we can't simply write: + # credits.capture(credits._setText(u"Credits"), event_name="mouseExited") + # that's because that would call credits._setText _NOW_ and we want to call + # it later. + credits.capture(lambda : credits._setText(u"Credits"), event_name="mouseExited") + + + # import example modules + from dynamic import DynamicExample + from styling import StylingExample + from sliders import SliderExample + from colortester import ColorExample + from poc_gui_animation import PocAnimations + + # Our list of examples + # We keep a dictionary of these and fill + # the ListBox on the left with its names. + self.examples = { + 'Absolute Positioning' : PyChanExample('gui/absolute.xml'), + 'All Widgets' : PyChanExample('gui/all_widgets.xml'), + 'Basic Styling' : StylingExample(), + 'Dynamic Widgets' : DynamicExample(), + 'Sliders' : SliderExample(), + 'ScrollArea' : PyChanExample('gui/scrollarea.xml'), + 'Colortester': ColorExample(), + 'GuiAnimations' : PocAnimations(), + } + self.demoList = self.gui.findChild(name='demoList') + self.demoList.items = sorted(self.examples.keys()) + + # Finally show the main GUI + self.gui.show() + + self.currentExample = None + self.creditsWidget = None + + # We use the trace decorator which can help debugging the examples. + # mostly it's for show though :-) + @trace + def selectExample(self): + """ + Callback handler for clicking on the example list. + """ + if self.demoList.selected_item is None: + return + #print "selected",self.demoList.selected_item + if self.currentExample: + self.currentExample.stop() + self.currentExample = self.examples[self.demoList.selected_item] + self.gui.findChild(name="xmlSource").text = unicode(open(self.currentExample.xmlFile).read(), 'utf8') + self.currentExample.start() + + def showCredits(self): + """ + Callback handler from the credits link/label. + """ + # We use PyChan's synchronous execution feature here. + pychan.loadXML('gui/credits.xml').execute({ 'okButton' : "Yay!" }) + +class TestXMLApplication(basicapplication.ApplicationBase): + """ + Test Application. Run the pychan_test.py file + with the XML file you want to load as argument. + """ + def __init__(self,xmlfile): + super(TestXMLApplication,self).__init__() + pychan.init(self.engine,debug=True) + self.start() + @trace + def start(self): + self.widget = pychan.loadXML(xmlfile) + self.widget.show() + +if __name__ == '__main__': + import sys + if len(sys.argv) == 2: + app = TestXMLApplication(sys.argv[1]) + else: + app = DemoApplication() + app.run()