PageRenderTime 354ms CodeModel.GetById 171ms app.highlight 17ms RepoModel.GetById 164ms app.codeStats 0ms

/Mac/Demo/PICTbrowse/cicnbrowse.py

http://unladen-swallow.googlecode.com/
Python | 161 lines | 161 code | 0 blank | 0 comment | 1 complexity | 4153a0a2e0ad752bb72e5004c40f34e6 MD5 | raw file
  1"""browsepict - Display all "cicn" resources found"""
  2
  3import FrameWork
  4import EasyDialogs
  5from Carbon import Res
  6from Carbon import Qd
  7from Carbon import Win
  8from Carbon import Controls
  9from Carbon import List
 10from Carbon import Icn
 11import macresource
 12
 13#
 14# Resource definitions
 15ID_MAIN=512
 16MAIN_LIST=1
 17MAIN_SHOW=2
 18
 19# Where is the picture window?
 20LEFT=200
 21TOP=64
 22MINWIDTH=32
 23MINHEIGHT=32
 24MAXWIDTH=320
 25MAXHEIGHT=320
 26
 27def main():
 28    macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc")
 29    CIconbrowse()
 30
 31class CIconbrowse(FrameWork.Application):
 32    def __init__(self):
 33        # First init menus, etc.
 34        FrameWork.Application.__init__(self)
 35        # Next create our dialog
 36        self.main_dialog = MyDialog(self)
 37        # Now open the dialog
 38        contents = self.findcicnresources()
 39        self.main_dialog.open(ID_MAIN, contents)
 40        # Finally, go into the event loop
 41        self.mainloop()
 42
 43    def makeusermenus(self):
 44        self.filemenu = m = FrameWork.Menu(self.menubar, "File")
 45        self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit)
 46
 47    def quit(self, *args):
 48        self._quit()
 49
 50    def showCIcon(self, resid):
 51        w = CIconwindow(self)
 52        w.open(resid)
 53        #EasyDialogs.Message('Show cicn %r' % (resid,))
 54
 55    def findcicnresources(self):
 56        num = Res.CountResources('cicn')
 57        rv = []
 58        for i in range(1, num+1):
 59            Res.SetResLoad(0)
 60            try:
 61                r = Res.GetIndResource('cicn', i)
 62            finally:
 63                Res.SetResLoad(1)
 64            id, type, name = r.GetResInfo()
 65            rv.append((id, name))
 66        return rv
 67
 68class CIconwindow(FrameWork.Window):
 69    def open(self, (resid, resname)):
 70        if not resname:
 71            resname = '#%r' % (resid,)
 72        self.resid = resid
 73        self.picture = Icn.GetCIcon(self.resid)
 74        l, t, r, b = 0, 0, 32, 32
 75        self.pictrect = (l, t, r, b)
 76        width = r-l
 77        height = b-t
 78        if width < MINWIDTH: width = MINWIDTH
 79        elif width > MAXWIDTH: width = MAXWIDTH
 80        if height < MINHEIGHT: height = MINHEIGHT
 81        elif height > MAXHEIGHT: height = MAXHEIGHT
 82        bounds = (LEFT, TOP, LEFT+width, TOP+height)
 83
 84        self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0)
 85        self.do_postopen()
 86
 87    def do_update(self, *args):
 88        currect = self.fitrect()
 89        Icn.PlotCIcon(currect, self.picture)
 90
 91    def fitrect(self):
 92        """Return self.pictrect scaled to fit in window"""
 93        graf = self.wid.GetWindowPort()
 94        screenrect = graf.GetPortBounds()
 95        picwidth = self.pictrect[2] - self.pictrect[0]
 96        picheight = self.pictrect[3] - self.pictrect[1]
 97        if picwidth > screenrect[2] - screenrect[0]:
 98            factor = float(picwidth) / float(screenrect[2]-screenrect[0])
 99            picwidth = picwidth / factor
100            picheight = picheight / factor
101        if picheight > screenrect[3] - screenrect[1]:
102            factor = float(picheight) / float(screenrect[3]-screenrect[1])
103            picwidth = picwidth / factor
104            picheight = picheight / factor
105        return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth),
106                        screenrect[1]+int(picheight))
107
108class MyDialog(FrameWork.DialogWindow):
109    "Main dialog window for cicnbrowse"
110
111    def open(self, id, contents):
112        self.id = id
113        FrameWork.DialogWindow.open(self, ID_MAIN)
114        self.dlg.SetDialogDefaultItem(MAIN_SHOW)
115        self.contents = contents
116        self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST)
117        h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart,
118                        Controls.kControlListBoxListHandleTag)
119        self.list = List.as_List(h)
120        self.setlist()
121
122    def setlist(self):
123        self.list.LDelRow(0, 0)
124        self.list.LSetDrawingMode(0)
125        if self.contents:
126            self.list.LAddRow(len(self.contents), 0)
127            for i in range(len(self.contents)):
128                v = repr(self.contents[i][0])
129                if self.contents[i][1]:
130                    v = v + '"' + self.contents[i][1] + '"'
131                self.list.LSetCell(v, (0, i))
132        self.list.LSetDrawingMode(1)
133        self.list.LUpdate(self.wid.GetWindowPort().visRgn)
134
135    def getselection(self):
136        items = []
137        point = (0,0)
138        while 1:
139            ok, point = self.list.LGetSelect(1, point)
140            if not ok:
141                break
142            items.append(point[1])
143            point = point[0], point[1]+1
144        values = []
145        for i in items:
146            values.append(self.contents[i])
147        return values
148
149    def do_show(self, *args):
150        selection = self.getselection()
151        for resid in selection:
152            self.parent.showCIcon(resid)
153
154    def do_close(self):
155        self.close()
156
157    def do_itemhit(self, item, event):
158        if item == MAIN_SHOW:
159            self.do_show()
160
161main()