X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/346a9b8e1fcfe30629f0d1ee4675e9e8f89890cf..4c4732c6ed8cb0aaa70fb2d4c6e5a958868c5349:/src/pgu/gui/app.py?ds=sidebyside diff --git a/src/pgu/gui/app.py b/src/pgu/gui/app.py deleted file mode 100644 index 857af98..0000000 --- a/src/pgu/gui/app.py +++ /dev/null @@ -1,279 +0,0 @@ -""" -""" -import pygame -from pygame.locals import * - -import pguglobals -import container -from const import * - -class App(container.Container): - """The top-level widget for an application. - -
App(theme=None)
- -
-
theme
an instance of a Theme, optional as it will use the default Theme class. -
- - Basic Example - - app = gui.App() - app.run(widget=widget,screen=screen) - - - Integrated Example - - app = gui.App() - gui.init(widget=widget) - while 1: - for e in pygame.event.get(): - app.event(e) - app.update(screen) - - - - - """ - def __init__(self,theme=None,**params): - self.set_global_app() - - if theme == None: - from theme import Theme - theme = Theme() - self.theme = theme - - params['decorate'] = 'app' - container.Container.__init__(self,**params) - self._quit = False - self.widget = None - self._chsize = False - self._repaint = False - - self.screen = None - self.container = None - self.events = [] - - def set_global_app(self): - # Keep a global reference to this application instance so that PGU - # components can easily find it. - pguglobals.app = self - # For backwards compatibility we keep a reference in the class - # itself too. - App.app = self - - def resize(self): - - screen = self.screen - w = self.widget - wsize = 0 - - #5 cases - - #input screen is already set use its size - if screen: - self.screen = screen - width,height = screen.get_width(),screen.get_height() - - #display.screen - elif pygame.display.get_surface(): - screen = pygame.display.get_surface() - self.screen = screen - width,height = screen.get_width(),screen.get_height() - - #app has width,height - elif self.style.width != 0 and self.style.height != 0: - screen = pygame.display.set_mode((self.style.width,self.style.height),SWSURFACE) - self.screen = screen - width,height = screen.get_width(),screen.get_height() - - #widget has width,height, or its own size.. - else: - wsize = 1 - width,height = w.rect.w,w.rect.h = w.resize() - #w._resize() - screen = pygame.display.set_mode((width,height),SWSURFACE) - self.screen = screen - - #use screen to set up size of this widget - self.style.width,self.style.height = width,height - self.rect.w,self.rect.h = width,height - self.rect.x,self.rect.y = 0,0 - - w.rect.x,w.rect.y = 0,0 - w.rect.w,w.rect.h = w.resize(width,height) - - for w in self.windows: - w.rect.w,w.rect.h = w.resize() - - self._chsize = False - - - def init(self,widget=None,screen=None): #TODO widget= could conflict with module widget - """Initialize the application. - -
App.init(widget=None,screen=None)
- -
-
widget
main widget -
screen
pygame.Surface to render to -
- """ - - self.set_global_app() - - if widget: self.widget = widget - if screen: self.screen = screen - - self.resize() - - w = self.widget - - self.widgets = [] - self.widgets.append(w) - w.container = self - self.focus(w) - - pygame.key.set_repeat(500,30) - - self._repaint = True - self._quit = False - - self.send(INIT) - - def event(self,e): - """Pass an event to the main widget. - -
App.event(e)
- -
-
e
event -
- """ - self.set_global_app() - - #NOTE: might want to deal with ACTIVEEVENT in the future. - self.send(e.type,e) - container.Container.event(self,e) - if e.type == MOUSEBUTTONUP: - if e.button not in (4,5): #ignore mouse wheel - sub = pygame.event.Event(CLICK,{ - 'button':e.button, - 'pos':e.pos}) - self.send(sub.type,sub) - container.Container.event(self,sub) - - - def loop(self): - self.set_global_app() - - s = self.screen - for e in pygame.event.get(): - if not (e.type == QUIT and self.mywindow): - self.event(e) - us = self.update(s) - pygame.display.update(us) - - - def paint(self,screen): - self.screen = screen - if self._chsize: - self.resize() - self._chsize = False - if hasattr(self,'background'): - self.background.paint(screen) - container.Container.paint(self,screen) - - def update(self,screen): - """Update the screen. - -
-
screen
pygame surface -
- """ - self.screen = screen - if self._chsize: - self.resize() - self._chsize = False - if self._repaint: - self.paint(screen) - self._repaint = False - return [pygame.Rect(0,0,screen.get_width(),screen.get_height())] - else: - us = container.Container.update(self,screen) - return us - - def run(self,widget=None,screen=None): - """Run an application. - -

Automatically calls App.init and then forever loops App.event and App.update

- -
-
widget
main widget -
screen
pygame.Surface to render to -
- """ - self.init(widget,screen) - while not self._quit: - self.loop() - pygame.time.wait(10) - - def reupdate(self,w=None): pass - def repaint(self,w=None): self._repaint = True - def repaintall(self): self._repaint = True - def chsize(self): - self._chsize = True - self._repaint = True - - def quit(self,value=None): self._quit = True - - def open(self, w, pos=None): - w.container = self - - if (w.rect.w == 0 or w.rect.h == 0): - w.rect.size = w.resize() - - if (not pos): - # Auto-center the window - w.rect.center = self.rect.center - #w.rect.topleft = ((self.rect.w - w.rect.w)/2, - # (self.rect.h - w.rect.h)/2) - else: - # Show the window in a particular location - w.rect.topleft = pos - - self.windows.append(w) - self.mywindow = w - self.focus(w) - self.repaint(w) - w.send(OPEN) - - def close(self, w): - if self.myfocus is w: self.blur(w) - - if w not in self.windows: return #no need to remove it twice! happens. - - self.windows.remove(w) - - self.mywindow = None - if self.windows: - self.mywindow = self.windows[-1] - self.focus(self.mywindow) - - if not self.mywindow: - self.myfocus = self.widget #HACK: should be done fancier, i think.. - if not self.myhover: - self.enter(self.widget) - - self.repaintall() - w.send(CLOSE) - - -class Desktop(App): - """Create an App using the desktop theme class. - -
Desktop()
- """ - def __init__(self,**params): - params.setdefault('cls','desktop') - App.__init__(self,**params)