home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Demo / sgi / gl / glstdwin / glstdwwin.py < prev    next >
Text File  |  1992-12-14  |  3KB  |  140 lines

  1. # Define window operations for STDWIN
  2.  
  3. import gl
  4. from stdwinevents import *
  5. from glstdwin import G            # Global variables
  6. from glstdwin import MASK        # Tunable constant
  7.  
  8. class WindowObject:
  9.     #
  10.     def _init(self, title):
  11.         self._docsize = (0, 0)
  12.         self._fg = G.fg
  13.         self._bg = G.bg
  14.         self._title = title
  15.         self._font = G.font
  16.         self._size = G.size
  17.         self._menus = []
  18.         self._gid = gl.winopen(title)
  19.         gl.winconstraints() # To remove prefsize() effect
  20.         self._fixviewport()
  21.         self._needredraw()
  22.         return self
  23.     #
  24.     def close(self):
  25.         del G.windowmap[`self._gid`]
  26.         gl.winclose(self._gid)
  27.         self._gid = 0
  28.     #
  29.     def _needredraw(self):
  30.         if self in G.drawqueue:
  31.             G.drawqueue.remove(self)
  32.         G.drawqueue.append(self)
  33.     #
  34.     def begindrawing(self):
  35.         from glstdwdraw import DrawingObject
  36.         return DrawingObject()._init(self)
  37.     #
  38.     def change(self, area):
  39.         self._needredraw()
  40.         # XXX Should record the area to be drawn?
  41.     #
  42.     def gettitle(self):
  43.         return self._title
  44.     #
  45.     def getdocsize(self):
  46.         return self._docsize
  47.     #
  48.     def getorigin(self):
  49.         return self._area[0]
  50.     #
  51.     def getwinsize(self):
  52.         return self._area[1]
  53.     #
  54.     def scroll(self, area, by):
  55.         # XXX ought to use gl.rectcopy()
  56.         if by <> (0, 0):
  57.             self.change(area)
  58.     #
  59.     def setdocsize(self, docsize):
  60.         self._docsize = docsize
  61.     #
  62.     def setorigin(self, origin):
  63.         pass # XXX
  64.     #
  65.     def settimer(self, decisecs):
  66.         pass # XXX
  67.     #
  68.     def settitle(self, title):
  69.         self._title = title
  70.         gl.wintitle(title)
  71.     #
  72.     def show(self, area):
  73.         pass # XXX
  74.     #
  75.     def _fixviewport(self):
  76.         #
  77.         # Called after redraw or resize, and initially.
  78.         #
  79.         # Fix the coordinate system so that (0, 0) is top left,
  80.         # units are pixels, and positive axes point right and down.
  81.         #
  82.         # Make the viewport slightly larger than the window,
  83.         # and set the screenmask exactly to the window; this
  84.         # help fixing character clipping.
  85.         #
  86.         # Set self._area to the window rectangle in STDWIN coords.
  87.         #
  88.         gl.winset(self._gid)
  89.         gl.reshapeviewport()
  90.         x0, x1, y0, y1 = gl.getviewport()
  91.         width, height = x1-x0, y1-y0
  92.         gl.viewport(x0-MASK, x1+MASK, y0-MASK, y1+MASK)
  93.         gl.scrmask(x0, x1, y0, y1)
  94.         gl.ortho2(-MASK, width+MASK, height+MASK, -MASK)
  95.         self._area = (0, 0), (width, height)
  96.     #
  97.     def menucreate(self, title):
  98.         from glstdwmenu import MenuObject
  99.         menu = MenuObject()._init(self, title)
  100.         self._menus.append(menu)
  101.         return menu
  102.     #
  103.     def _domenu(self):
  104.         if not self._menus:
  105.             return None
  106.         if len(self._menus) == 1:
  107.             pup = self._menus[0]._makepup(0)
  108.             val = gl.dopup(pup)
  109.             gl.freepup(pup)
  110.             if val < 0:
  111.                 return None
  112.             return WE_MENU, self, (self._menus[0], val)
  113.         #
  114.         # More than one menu: use nested menus.
  115.         #
  116.         pups = []
  117.         firstitem = 0
  118.         for menu in self._menus:
  119.             pups.append(menu._makepup(firstitem))
  120.             firstitem = firstitem + 100
  121.         pup = gl.newpup()
  122.         for i in range(len(self._menus)):
  123.             gl.addtopup(pup, self._menus[i]._title + '%m', pups[i])
  124.         val = gl.dopup(pup)
  125.         gl.freepup(pup)
  126.         for pup in pups:
  127.             gl.freepup(pup)
  128.         if val < 0:
  129.             return None
  130.         i_menu, i_item = divmod(val, 100)
  131.         return WE_MENU, self, (self._menus[i_menu], i_item)
  132.     #
  133.     def _doshortcut(self, char):
  134.         for menu in self._menus:
  135.             i = menu._checkshortcut(char)
  136.             if i >= 0:
  137.                 return WE_MENU, self, (menu, i)
  138.         return None
  139.     #
  140.