Esempio n. 1
0
 def __init__(self, parent, title, app, manager, key=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     if key is None:
         key = manager.getSelected()
     self.app = app
     self.manager = manager
     self.key = key
     self.table_color = app.opt.colors['table']
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
     #
     self.top.wm_minsize(400, 200)
     if self.top.winfo_screenwidth() >= 800:
         w1, w2 = 200, 400
     else:
         w1, w2 = 200, 300
     font = app.getFont("default")
     padx, pady = 4, 4
     frame = Tkinter.Frame(top_frame)
     frame.pack(fill='both',
                expand=True,
                padx=kw.padx - padx,
                pady=kw.pady - pady)
     self.tree = self.Tree_Class(self,
                                 frame,
                                 key=key,
                                 default=kw.default,
                                 font=font,
                                 width=w1)
     self.tree.frame.pack(side="left",
                          fill='both',
                          expand=False,
                          padx=padx,
                          pady=pady)
     self.preview = MfxScrolledCanvas(frame, width=w2, hbar=0, vbar=0)
     self.preview.pack(side="right",
                       fill='both',
                       expand=True,
                       padx=padx,
                       pady=pady)
     self.preview.canvas.preview = 1
     # create a preview of the current state
     self.preview_key = -1
     self.updatePreview(key)
     #
     focus = self.createButtons(bottom_frame, kw)
     focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 2
0
 def __init__(self, parent, rootnodes, **kw):
     kw['bd'] = 0
     kw['bg'] = 'white'
     MfxScrolledCanvas.__init__(self, parent, **kw)
     #
     self.rootnodes = rootnodes
     self.updateNodesWithTree(self.rootnodes, self)
     self.selection_key = None
     self.nodes = {}
     self.keys = {}
     #
     self.style = self.Style()
     ##self.style.text_normal_fg = self.canvas.cget("insertbackground")
     #self.style.text_normal_fg = self.canvas.option_get('foreground', '') or self.canvas.cget("insertbackground")
     #self.style.text_normal_bg = self.canvas.option_get('background', self.canvas.cget("background"))
     #
     bind(self.canvas, "<ButtonPress-1>", self.singleClick)
     bind(self.canvas, "<Double-Button-1>", self.doubleClick)
     ##bind(self.canvas, "<ButtonRelease-1>", xxx)
     self.pack(fill='both', expand=True)
Esempio n. 3
0
 def __init__(self, parent, rootnodes, **kw):
     kw['bd'] = 0
     kw['bg'] = 'white'
     MfxScrolledCanvas.__init__(self, parent, **kw)
     #
     self.rootnodes = rootnodes
     self.updateNodesWithTree(self.rootnodes, self)
     self.selection_key = None
     self.nodes = {}
     self.keys = {}
     #
     self.style = self.Style()
     ##self.style.text_normal_fg = self.canvas.cget("insertbackground")
     #self.style.text_normal_fg = self.canvas.option_get('foreground', '') or self.canvas.cget("insertbackground")
     #self.style.text_normal_bg = self.canvas.option_get('background', self.canvas.cget("background"))
     #
     bind(self.canvas, "<ButtonPress-1>", self.singleClick)
     bind(self.canvas, "<Double-Button-1>", self.doubleClick)
     ##bind(self.canvas, "<ButtonRelease-1>", xxx)
     self.pack(fill='both', expand=True)
Esempio n. 4
0
    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.manager = manager
        self.key = key
        #padx, pady = kw.padx, kw.pady
        padx, pady = 5, 5
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 216, 400
        else:
            w1, w2 = 200, 300
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill='both')
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)

        font = app.getFont("default")
        self.tree = self.Tree_Class(self, left_frame, key=key,
                                    default=kw.default,
                                    font=font, width=w1)
        self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.preview_images = []
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)
Esempio n. 5
0
 def __init__(self, parent, title, app, manager, key=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     if key is None:
         key = manager.getSelected()
     self.app = app
     self.manager = manager
     self.key = key
     self.table_color = app.opt.colors['table']
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
     #
     self.top.wm_minsize(400, 200)
     if self.top.winfo_screenwidth() >= 800:
         w1, w2 = 200, 400
     else:
         w1, w2 = 200, 300
     font = app.getFont("default")
     padx, pady = 4, 4
     frame = Tkinter.Frame(top_frame)
     frame.pack(fill='both', expand=True,
                padx=kw.padx-padx, pady=kw.pady-pady)
     self.tree = self.Tree_Class(self, frame, key=key,
                                 default=kw.default,
                                 font=font, width=w1)
     self.tree.frame.pack(side="left", fill='both', expand=False,
                          padx=padx, pady=pady)
     self.preview = MfxScrolledCanvas(frame, width=w2, hbar=0, vbar=0)
     self.preview.pack(side="right", fill='both', expand=True,
                       padx=padx, pady=pady)
     self.preview.canvas.preview = 1
     # create a preview of the current state
     self.preview_key = -1
     self.updatePreview(key)
     #
     focus = self.createButtons(bottom_frame, kw)
     focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 6
0
    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.manager = manager
        self.key = key
        self.app = app
        #padx, pady = kw.padx, kw.pady
        padx, pady = 5, 5
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 240, 400
        else:
            w1, w2 = 200, 300
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill='both')
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)

        font = app.getFont("default")
        self.tree = self.Tree_Class(self, left_frame, key=key,
                                    default=kw.default,
                                    font=font, width=w1)
        self.tree.frame.grid(row=0, column=0, sticky='nsew',
                             padx=padx, pady=pady)
        if USE_PIL:
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_x)
            self.scale_x = Tkinter.Scale(
                left_frame, label=_('Scale X:'),
                from_=0.5, to=4.0, resolution=0.1,
                orient='horizontal', variable=var,
                #value=app.opt.scale_x,
                command=self._updateScale)
            self.scale_x.grid(row=1, column=0, sticky='ew', padx=padx, pady=pady)
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_y)
            self.scale_y = Tkinter.Scale(
                left_frame, label=_('Scale Y:'),
                from_=0.5, to=4.0, resolution=0.1,
                orient='horizontal', variable=var,
                #value=app.opt.scale_y,
                command=self._updateScale)
            self.scale_y.grid(row=2, column=0, sticky='ew', padx=padx, pady=pady)
            #
            self.auto_scale = Tkinter.BooleanVar()
            self.auto_scale.set(app.opt.auto_scale)
            check = Tkinter.Checkbutton(
                left_frame, text=_('Auto scaling'),
                variable=self.auto_scale,
                takefocus=False,
                command=self._updateAutoScale
                )
            check.grid(row=3, column=0, columnspan=2, sticky='w',
                       padx=padx, pady=pady)
            #
            self.preserve_aspect = Tkinter.BooleanVar()
            self.preserve_aspect.set(app.opt.preserve_aspect_ratio)
            self.aspect_check = Tkinter.Checkbutton(
                left_frame, text=_('Preserve aspect ratio'),
                variable=self.preserve_aspect,
                takefocus=False,
                #command=self._updateScale
                )
            self.aspect_check.grid(row=4, column=0, sticky='w',
                                   padx=padx, pady=pady)
            self._updateAutoScale()
        #
        left_frame.rowconfigure(0, weight=1)
        left_frame.columnconfigure(0, weight=1)
        #
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.preview_images = []
        self.scale_images = []
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)
Esempio n. 7
0
class SelectCardsetDialogWithPreview(MfxDialog):
    Tree_Class = SelectCardsetTree
    TreeDataHolder_Class = SelectCardsetTree
    TreeData_Class = SelectCardsetData

    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.manager = manager
        self.key = key
        self.app = app
        #padx, pady = kw.padx, kw.pady
        padx, pady = 5, 5
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 240, 400
        else:
            w1, w2 = 200, 300
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill='both')
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)

        font = app.getFont("default")
        self.tree = self.Tree_Class(self, left_frame, key=key,
                                    default=kw.default,
                                    font=font, width=w1)
        self.tree.frame.grid(row=0, column=0, sticky='nsew',
                             padx=padx, pady=pady)
        if USE_PIL:
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_x)
            self.scale_x = Tkinter.Scale(
                left_frame, label=_('Scale X:'),
                from_=0.5, to=4.0, resolution=0.1,
                orient='horizontal', variable=var,
                #value=app.opt.scale_x,
                command=self._updateScale)
            self.scale_x.grid(row=1, column=0, sticky='ew', padx=padx, pady=pady)
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_y)
            self.scale_y = Tkinter.Scale(
                left_frame, label=_('Scale Y:'),
                from_=0.5, to=4.0, resolution=0.1,
                orient='horizontal', variable=var,
                #value=app.opt.scale_y,
                command=self._updateScale)
            self.scale_y.grid(row=2, column=0, sticky='ew', padx=padx, pady=pady)
            #
            self.auto_scale = Tkinter.BooleanVar()
            self.auto_scale.set(app.opt.auto_scale)
            check = Tkinter.Checkbutton(
                left_frame, text=_('Auto scaling'),
                variable=self.auto_scale,
                takefocus=False,
                command=self._updateAutoScale
                )
            check.grid(row=3, column=0, columnspan=2, sticky='w',
                       padx=padx, pady=pady)
            #
            self.preserve_aspect = Tkinter.BooleanVar()
            self.preserve_aspect.set(app.opt.preserve_aspect_ratio)
            self.aspect_check = Tkinter.Checkbutton(
                left_frame, text=_('Preserve aspect ratio'),
                variable=self.preserve_aspect,
                takefocus=False,
                #command=self._updateScale
                )
            self.aspect_check.grid(row=4, column=0, sticky='w',
                                   padx=padx, pady=pady)
            self._updateAutoScale()
        #
        left_frame.rowconfigure(0, weight=1)
        left_frame.columnconfigure(0, weight=1)
        #
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.preview_images = []
        self.scale_images = []
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def destroy(self):
        self.tree.updateNodesWithTree(self.tree.rootnodes, None)
        self.tree.destroy()
        self.preview.unbind_all()
        self.preview_images = []
        MfxDialog.destroy(self)

    def initKw(self, kw):
        kw = KwStruct(kw,
                      strings=(_("&OK"), _("&Load"), _("&Cancel"),),
                      default=0,
                      resizable=True,
                      padx=10, pady=10,
                      buttonpadx=10, buttonpady=5,
                      )
        return MfxDialog.initKw(self, kw)

    def mDone(self, button):
        if button in (0, 1):            # Load/Cancel
            self.key = self.tree.selection_key
            self.tree.n_expansions = 1  # save xyview in any case
            if USE_PIL:
                auto_scale = bool(self.auto_scale.get())
                if button == 1:
                    self.app.menubar.tkopt.auto_scale.set(auto_scale)
                if auto_scale:
                    self.scale_values = (self.app.opt.scale_x,
                                         self.app.opt.scale_y,
                                         auto_scale,
                                         bool(self.preserve_aspect.get()))
                else:
                    self.scale_values = (self.scale_x.get(),
                                         self.scale_y.get(),
                                         auto_scale,
                                         self.app.opt.preserve_aspect_ratio)
        if button in (3, 4):
            cs = self.manager.get(self.tree.selection_key)
            if not cs:
                return
            ##title = CARDSET+" "+cs.name
            title = CARDSET.capitalize()+" "+cs.name
            CardsetInfoDialog(self.top, title=title, cardset=cs, images=self.preview_images)
            return
        MfxDialog.mDone(self, button)

    def _updateAutoScale(self, v=None):
        if self.auto_scale.get():
            self.aspect_check.config(state='normal')
            self.scale_x.config(state='disabled')
            self.scale_y.config(state='disabled')
        else:
            self.aspect_check.config(state='disabled')
            self.scale_x.config(state='normal')
            self.scale_y.config(state='normal')

    def _updateScale(self, v):
        self.updatePreview()

    def updatePreview(self, key=None):
        if key == self.preview_key:
            return
        if key is None:
            key = self.key
        canvas = self.preview.canvas
        canvas.deleteAllItems()
        self.preview_images = []
        cs = self.manager.get(key)
        if not cs:
            self.preview_key = -1
            return
        names, columns = cs.getPreviewCardNames()
        try:
            #???names, columns = cs.getPreviewCardNames()
            for n in names:
                f = os.path.join(cs.dir, n + cs.ext)
                self.preview_images.append(loadImage(file=f))
        except:
            self.preview_key = -1
            self.preview_images = []
            return
        i, x, y, sx, sy, dx, dy = 0, 10, 10, 0, 0, cs.CARDW + 10, cs.CARDH + 10
        if USE_PIL:
            xf = self.scale_x.get()
            yf = self.scale_y.get()
            dx = int(dx*xf)
            dy = int(dy*yf)
            self.scale_images = []
        for image in self.preview_images:
            if USE_PIL:
                image = image.resize(xf, yf)
                self.scale_images.append(image)
            MfxCanvasImage(canvas, x, y, anchor="nw", image=image)
            sx, sy = max(x, sx), max(y, sy)
            i = i + 1
            if i % columns == 0:
                x, y = 10, y + dy
            else:
                x = x + dx
        canvas.config(scrollregion=(0, 0, sx+dx, sy+dy),
                      width=sx+dx, height=sy+dy)
        #canvas.config(xscrollincrement=dx, yscrollincrement=dy)
        canvas.event_generate('<Configure>') # update bg image
        self.preview_key = key
        self.key = key
Esempio n. 8
0
 def destroy(self):
     for node in self.keys.get(self.selection_key, []):
         node.selected = 0
     MfxScrolledCanvas.destroy(self)
Esempio n. 9
0
class SelectGameDialogWithPreview(SelectGameDialog):
    Tree_Class = SelectGameTreeWithPreview

    def __init__(self, parent, title, app, gameid, bookmark=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        self.app = app
        self.gameid = gameid
        self.bookmark = bookmark
        self.random = None
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(app)
        #
        self.top.wm_minsize(400, 200)
        sw = self.top.winfo_screenwidth()
        if sw >= 1100:
            w1, w2 = 250, 600
        elif sw >= 900:
            w1, w2 = 250, 500
        elif sw >= 800:
            w1, w2 = 220, 480
        else:
            w1, w2 = 200, 300
        ##print sw, w1, w2
        w2 = max(200, min(w2, 10 + 12 * (app.subsampled_images.CARDW + 10)))
        ##print sw, w1, w2
        ##padx, pady = kw.padx, kw.pady
        padx, pady = kw.padx / 2, kw.pady / 2
        # PanedWindow
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill='both')
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)
        # Tree
        font = app.getFont("default")
        self.tree = self.Tree_Class(self,
                                    left_frame,
                                    key=gameid,
                                    default=kw.default,
                                    font=font,
                                    width=w1)
        self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both')
        # LabelFrame
        info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
        stats_frame = Tkinter.LabelFrame(right_frame, text=_('Statistics'))
        info_frame.grid(row=0,
                        column=0,
                        padx=padx,
                        pady=pady,
                        ipadx=padx,
                        ipady=pady,
                        sticky='nws')
        stats_frame.grid(row=0,
                         column=1,
                         padx=padx,
                         pady=pady,
                         ipadx=padx,
                         ipady=pady,
                         sticky='nws')
        # Info
        self.info_labels = {}
        i = 0
        for n, t, f, row in (
            ('name', _('Name:'), info_frame, 0),
            ('altnames', _('Alternate names:'), info_frame, 1),
            ('category', _('Category:'), info_frame, 2),
            ('type', _('Type:'), info_frame, 3),
            ('skill_level', _('Skill level:'), info_frame, 4),
            ('decks', _('Decks:'), info_frame, 5),
            ('redeals', _('Redeals:'), info_frame, 6),
                #
            ('played', _('Played:'), stats_frame, 0),
            ('won', _('Won:'), stats_frame, 1),
            ('lost', _('Lost:'), stats_frame, 2),
            ('time', _('Playing time:'), stats_frame, 3),
            ('moves', _('Moves:'), stats_frame, 4),
            ('percent', _('% won:'), stats_frame, 5),
        ):
            title_label = Tkinter.Label(f, text=t, justify='left', anchor='w')
            title_label.grid(row=row, column=0, sticky='nw')
            text_label = Tkinter.Label(f, justify='left', anchor='w')
            text_label.grid(row=row, column=1, sticky='nw')
            self.info_labels[n] = (title_label, text_label)
        ##info_frame.columnconfigure(1, weight=1)
        info_frame.rowconfigure(6, weight=1)
        stats_frame.rowconfigure(6, weight=1)
        # Canvas
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.grid(row=1,
                          column=0,
                          columnspan=3,
                          padx=padx,
                          pady=pady,
                          sticky='nsew')
        right_frame.columnconfigure(1, weight=1)
        right_frame.rowconfigure(1, weight=1)
        #
        focus = self.createButtons(bottom_frame, kw)
        # set the scale factor
        self.preview.canvas.preview = 2
        # create a preview of the current game
        self.preview_key = -1
        self.preview_game = None
        self.preview_app = None
        self.updatePreview(gameid, animations=0)
        ##focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def initKw(self, kw):
        kw = KwStruct(
            kw,
            strings=(
                _("&Select"),
                _("&Rules"),
                _("&Cancel"),
            ),
            default=0,
        )
        return SelectGameDialog.initKw(self, kw)

    def destroy(self):
        self.deletePreview(destroy=1)
        self.preview.unbind_all()
        SelectGameDialog.destroy(self)

    def deletePreview(self, destroy=0):
        self.preview_key = -1
        # clean up the canvas
        if self.preview:
            unbind_destroy(self.preview.canvas)
            self.preview.canvas.deleteAllItems()
            if destroy:
                self.preview.canvas.delete("all")
        #
        #for l in self.info_labels.values():
        #    l.config(text='')
        # destruct the game
        if self.preview_game:
            self.preview_game.endGame()
            self.preview_game.destruct()
            destruct(self.preview_game)
        self.preview_game = None
        # destruct the app
        if destroy:
            if self.preview_app:
                destruct(self.preview_app)
            self.preview_app = None

    def updatePreview(self, gameid, animations=10):
        if gameid == self.preview_key:
            return
        self.deletePreview()
        canvas = self.preview.canvas
        #
        gi = self.app.gdb.get(gameid)
        if not gi:
            self.preview_key = -1
            return
        #
        if self.preview_app is None:
            self.preview_app = Struct(
                # variables
                audio=self.app.audio,
                canvas=canvas,
                cardset=self.app.cardset.copy(),
                comments=self.app.comments.new(),
                gamerandom=self.app.gamerandom,
                gdb=self.app.gdb,
                gimages=self.app.gimages,
                images=self.app.subsampled_images,
                menubar=None,
                miscrandom=self.app.miscrandom,
                opt=self.app.opt.copy(),
                startup_opt=self.app.startup_opt,
                stats=self.app.stats.new(),
                top=None,
                top_cursor=self.app.top_cursor,
                toolbar=None,
                # methods
                constructGame=self.app.constructGame,
                getFont=self.app.getFont,
            )
            self.preview_app.opt.shadow = 0
            self.preview_app.opt.shade = 0
        #
        self.preview_app.audio = None  # turn off audio for intial dealing
        if animations >= 0:
            self.preview_app.opt.animations = animations
        #
        if self.preview_game:
            self.preview_game.endGame()
            self.preview_game.destruct()
        ##self.top.wm_title("Select Game - " + self.app.getGameTitleName(gameid))
        title = self.app.getGameTitleName(gameid)
        self.top.wm_title(_("Playable Preview - ") + title)
        #
        self.preview_game = gi.gameclass(gi)
        self.preview_game.createPreview(self.preview_app)
        #
        random = None
        if gameid == self.gameid:
            random = self.app.game.random.copy()
        if gameid == self.gameid and self.bookmark:
            self.preview_game.restoreGameFromBookmark(self.bookmark)
        else:
            self.preview_game.newGame(random=random, autoplay=1)
        gw, gh = self.preview_game.width, self.preview_game.height
        canvas.config(scrollregion=(0, 0, gw, gh))
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)
        #
        self.preview_app.audio = self.app.audio
        if self.app.opt.animations:
            self.preview_app.opt.animations = 10
        else:
            self.preview_app.opt.animations = 0
        # save seed
        self.random = self.preview_game.random.copy()
        self.random.origin = self.random.ORIGIN_PREVIEW
        self.preview_key = gameid
        #
        self.updateInfo(gameid)
        #
        rules_button = self.buttons[1]
        if self.app.getGameRulesFilename(gameid):
            rules_button.config(state="normal")
        else:
            rules_button.config(state="disabled")

    def updateInfo(self, gameid):
        gi = self.app.gdb.get(gameid)
        # info
        name = gi.name
        altnames = '\n'.join(gi.altnames)
        category = _(CSI.TYPE[gi.category])
        type = ''
        if gi.si.game_type in GI.TYPE_NAMES:
            type = _(GI.TYPE_NAMES[gi.si.game_type])
        sl = {
            GI.SL_LUCK: _('Luck only'),
            GI.SL_MOSTLY_LUCK: _('Mostly luck'),
            GI.SL_BALANCED: _('Balanced'),
            GI.SL_MOSTLY_SKILL: _('Mostly skill'),
            GI.SL_SKILL: _('Skill only'),
        }
        skill_level = sl.get(gi.skill_level)
        if gi.redeals == -2: redeals = _('variable')
        elif gi.redeals == -1: redeals = _('unlimited')
        else: redeals = str(gi.redeals)
        # stats
        won, lost, time, moves = self.app.stats.getFullStats(
            self.app.opt.player, gameid)
        if won + lost > 0: percent = "%.1f" % (100.0 * won / (won + lost))
        else: percent = "0.0"
        time = format_time(time)
        moves = str(round(moves, 1))
        for n, t in (
            ('name', name),
            ('altnames', altnames),
            ('category', category),
            ('type', type),
            ('skill_level', skill_level),
            ('decks', gi.decks),
            ('redeals', redeals),
            ('played', won + lost),
            ('won', won),
            ('lost', lost),
            ('time', time),
            ('moves', moves),
            ('percent', percent),
        ):
            title_label, text_label = self.info_labels[n]
            if t in ('', None):
                title_label.grid_remove()
                text_label.grid_remove()
            else:
                title_label.grid()
                text_label.grid()
            text_label.config(text=t)
Esempio n. 10
0
 def __init__(self, parent, title, app, gameid, bookmark=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     self.app = app
     self.gameid = gameid
     self.bookmark = bookmark
     self.random = None
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(app)
     #
     self.top.wm_minsize(400, 200)
     sw = self.top.winfo_screenwidth()
     if sw >= 1100:
         w1, w2 = 250, 600
     elif sw >= 900:
         w1, w2 = 250, 500
     elif sw >= 800:
         w1, w2 = 220, 480
     else:
         w1, w2 = 200, 300
     ##print sw, w1, w2
     w2 = max(200, min(w2, 10 + 12 * (app.subsampled_images.CARDW + 10)))
     ##print sw, w1, w2
     ##padx, pady = kw.padx, kw.pady
     padx, pady = kw.padx / 2, kw.pady / 2
     # PanedWindow
     paned_window = Tkinter.PanedWindow(top_frame)
     paned_window.pack(expand=True, fill="both")
     left_frame = Tkinter.Frame(paned_window)
     right_frame = Tkinter.Frame(paned_window)
     paned_window.add(left_frame)
     paned_window.add(right_frame)
     # Tree
     font = app.getFont("default")
     self.tree = self.Tree_Class(self, left_frame, key=gameid, default=kw.default, font=font, width=w1)
     self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill="both")
     # LabelFrame
     info_frame = Tkinter.LabelFrame(right_frame, text=_("About game"))
     stats_frame = Tkinter.LabelFrame(right_frame, text=_("Statistics"))
     info_frame.grid(row=0, column=0, padx=padx, pady=pady, ipadx=padx, ipady=pady, sticky="nws")
     stats_frame.grid(row=0, column=1, padx=padx, pady=pady, ipadx=padx, ipady=pady, sticky="nws")
     # Info
     self.info_labels = {}
     i = 0
     for n, t, f, row in (
         ("name", _("Name:"), info_frame, 0),
         ("altnames", _("Alternate names:"), info_frame, 1),
         ("category", _("Category:"), info_frame, 2),
         ("type", _("Type:"), info_frame, 3),
         ("skill_level", _("Skill level:"), info_frame, 4),
         ("decks", _("Decks:"), info_frame, 5),
         ("redeals", _("Redeals:"), info_frame, 6),
         #
         ("played", _("Played:"), stats_frame, 0),
         ("won", _("Won:"), stats_frame, 1),
         ("lost", _("Lost:"), stats_frame, 2),
         ("time", _("Playing time:"), stats_frame, 3),
         ("moves", _("Moves:"), stats_frame, 4),
         ("percent", _("% won:"), stats_frame, 5),
     ):
         title_label = Tkinter.Label(f, text=t, justify="left", anchor="w")
         title_label.grid(row=row, column=0, sticky="nw")
         text_label = Tkinter.Label(f, justify="left", anchor="w")
         text_label.grid(row=row, column=1, sticky="nw")
         self.info_labels[n] = (title_label, text_label)
     ##info_frame.columnconfigure(1, weight=1)
     info_frame.rowconfigure(6, weight=1)
     stats_frame.rowconfigure(6, weight=1)
     # Canvas
     self.preview = MfxScrolledCanvas(right_frame, width=w2)
     self.preview.setTile(app, app.tabletile_index, force=True)
     self.preview.grid(row=1, column=0, columnspan=3, padx=padx, pady=pady, sticky="nsew")
     right_frame.columnconfigure(1, weight=1)
     right_frame.rowconfigure(1, weight=1)
     #
     focus = self.createButtons(bottom_frame, kw)
     # set the scale factor
     self.preview.canvas.preview = 2
     # create a preview of the current game
     self.preview_key = -1
     self.preview_game = None
     self.preview_app = None
     self.updatePreview(gameid, animations=0)
     ##focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 11
0
class SelectGameDialogWithPreview(SelectGameDialog):
    Tree_Class = SelectGameTreeWithPreview

    def __init__(self, parent, title, app, gameid, bookmark=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        self.app = app
        self.gameid = gameid
        self.bookmark = bookmark
        self.random = None
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(app)
        #
        self.top.wm_minsize(400, 200)
        sw = self.top.winfo_screenwidth()
        if sw >= 1100:
            w1, w2 = 250, 600
        elif sw >= 900:
            w1, w2 = 250, 500
        elif sw >= 800:
            w1, w2 = 220, 480
        else:
            w1, w2 = 200, 300
        ##print sw, w1, w2
        w2 = max(200, min(w2, 10 + 12 * (app.subsampled_images.CARDW + 10)))
        ##print sw, w1, w2
        ##padx, pady = kw.padx, kw.pady
        padx, pady = kw.padx / 2, kw.pady / 2
        # PanedWindow
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill="both")
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)
        # Tree
        font = app.getFont("default")
        self.tree = self.Tree_Class(self, left_frame, key=gameid, default=kw.default, font=font, width=w1)
        self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill="both")
        # LabelFrame
        info_frame = Tkinter.LabelFrame(right_frame, text=_("About game"))
        stats_frame = Tkinter.LabelFrame(right_frame, text=_("Statistics"))
        info_frame.grid(row=0, column=0, padx=padx, pady=pady, ipadx=padx, ipady=pady, sticky="nws")
        stats_frame.grid(row=0, column=1, padx=padx, pady=pady, ipadx=padx, ipady=pady, sticky="nws")
        # Info
        self.info_labels = {}
        i = 0
        for n, t, f, row in (
            ("name", _("Name:"), info_frame, 0),
            ("altnames", _("Alternate names:"), info_frame, 1),
            ("category", _("Category:"), info_frame, 2),
            ("type", _("Type:"), info_frame, 3),
            ("skill_level", _("Skill level:"), info_frame, 4),
            ("decks", _("Decks:"), info_frame, 5),
            ("redeals", _("Redeals:"), info_frame, 6),
            #
            ("played", _("Played:"), stats_frame, 0),
            ("won", _("Won:"), stats_frame, 1),
            ("lost", _("Lost:"), stats_frame, 2),
            ("time", _("Playing time:"), stats_frame, 3),
            ("moves", _("Moves:"), stats_frame, 4),
            ("percent", _("% won:"), stats_frame, 5),
        ):
            title_label = Tkinter.Label(f, text=t, justify="left", anchor="w")
            title_label.grid(row=row, column=0, sticky="nw")
            text_label = Tkinter.Label(f, justify="left", anchor="w")
            text_label.grid(row=row, column=1, sticky="nw")
            self.info_labels[n] = (title_label, text_label)
        ##info_frame.columnconfigure(1, weight=1)
        info_frame.rowconfigure(6, weight=1)
        stats_frame.rowconfigure(6, weight=1)
        # Canvas
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.grid(row=1, column=0, columnspan=3, padx=padx, pady=pady, sticky="nsew")
        right_frame.columnconfigure(1, weight=1)
        right_frame.rowconfigure(1, weight=1)
        #
        focus = self.createButtons(bottom_frame, kw)
        # set the scale factor
        self.preview.canvas.preview = 2
        # create a preview of the current game
        self.preview_key = -1
        self.preview_game = None
        self.preview_app = None
        self.updatePreview(gameid, animations=0)
        ##focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def initKw(self, kw):
        kw = KwStruct(kw, strings=(_("&Select"), _("&Rules"), _("&Cancel")), default=0)
        return SelectGameDialog.initKw(self, kw)

    def destroy(self):
        self.deletePreview(destroy=1)
        self.preview.unbind_all()
        SelectGameDialog.destroy(self)

    def deletePreview(self, destroy=0):
        self.preview_key = -1
        # clean up the canvas
        if self.preview:
            unbind_destroy(self.preview.canvas)
            self.preview.canvas.deleteAllItems()
            if destroy:
                self.preview.canvas.delete("all")
        #
        # for l in self.info_labels.values():
        #    l.config(text='')
        # destruct the game
        if self.preview_game:
            self.preview_game.endGame()
            self.preview_game.destruct()
            destruct(self.preview_game)
        self.preview_game = None
        # destruct the app
        if destroy:
            if self.preview_app:
                destruct(self.preview_app)
            self.preview_app = None

    def updatePreview(self, gameid, animations=10):
        if gameid == self.preview_key:
            return
        self.deletePreview()
        canvas = self.preview.canvas
        #
        gi = self.app.gdb.get(gameid)
        if not gi:
            self.preview_key = -1
            return
        #
        if self.preview_app is None:
            self.preview_app = Struct(
                # variables
                audio=self.app.audio,
                canvas=canvas,
                cardset=self.app.cardset.copy(),
                comments=self.app.comments.new(),
                gamerandom=self.app.gamerandom,
                gdb=self.app.gdb,
                gimages=self.app.gimages,
                images=self.app.subsampled_images,
                menubar=None,
                miscrandom=self.app.miscrandom,
                opt=self.app.opt.copy(),
                startup_opt=self.app.startup_opt,
                stats=self.app.stats.new(),
                top=None,
                top_cursor=self.app.top_cursor,
                toolbar=None,
                # methods
                constructGame=self.app.constructGame,
                getFont=self.app.getFont,
            )
            self.preview_app.opt.shadow = 0
            self.preview_app.opt.shade = 0
        #
        self.preview_app.audio = None  # turn off audio for intial dealing
        if animations >= 0:
            self.preview_app.opt.animations = animations
        #
        if self.preview_game:
            self.preview_game.endGame()
            self.preview_game.destruct()
        ##self.top.wm_title("Select Game - " + self.app.getGameTitleName(gameid))
        title = self.app.getGameTitleName(gameid)
        self.top.wm_title(_("Playable Preview - ") + title)
        #
        self.preview_game = gi.gameclass(gi)
        self.preview_game.createPreview(self.preview_app)
        #
        random = None
        if gameid == self.gameid:
            random = self.app.game.random.copy()
        if gameid == self.gameid and self.bookmark:
            self.preview_game.restoreGameFromBookmark(self.bookmark)
        else:
            self.preview_game.newGame(random=random, autoplay=1)
        gw, gh = self.preview_game.width, self.preview_game.height
        canvas.config(scrollregion=(0, 0, gw, gh))
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)
        #
        self.preview_app.audio = self.app.audio
        if self.app.opt.animations:
            self.preview_app.opt.animations = 10
        else:
            self.preview_app.opt.animations = 0
        # save seed
        self.random = self.preview_game.random.copy()
        self.random.origin = self.random.ORIGIN_PREVIEW
        self.preview_key = gameid
        #
        self.updateInfo(gameid)
        #
        rules_button = self.buttons[1]
        if self.app.getGameRulesFilename(gameid):
            rules_button.config(state="normal")
        else:
            rules_button.config(state="disabled")

    def updateInfo(self, gameid):
        gi = self.app.gdb.get(gameid)
        # info
        name = gi.name
        altnames = "\n".join(gi.altnames)
        category = _(CSI.TYPE[gi.category])
        type = ""
        if gi.si.game_type in GI.TYPE_NAMES:
            type = _(GI.TYPE_NAMES[gi.si.game_type])
        sl = {
            GI.SL_LUCK: _("Luck only"),
            GI.SL_MOSTLY_LUCK: _("Mostly luck"),
            GI.SL_BALANCED: _("Balanced"),
            GI.SL_MOSTLY_SKILL: _("Mostly skill"),
            GI.SL_SKILL: _("Skill only"),
        }
        skill_level = sl.get(gi.skill_level)
        if gi.redeals == -2:
            redeals = _("variable")
        elif gi.redeals == -1:
            redeals = _("unlimited")
        else:
            redeals = str(gi.redeals)
        # stats
        won, lost, time, moves = self.app.stats.getFullStats(self.app.opt.player, gameid)
        if won + lost > 0:
            percent = "%.1f" % (100.0 * won / (won + lost))
        else:
            percent = "0.0"
        time = format_time(time)
        moves = str(round(moves, 1))
        for n, t in (
            ("name", name),
            ("altnames", altnames),
            ("category", category),
            ("type", type),
            ("skill_level", skill_level),
            ("decks", gi.decks),
            ("redeals", redeals),
            ("played", won + lost),
            ("won", won),
            ("lost", lost),
            ("time", time),
            ("moves", moves),
            ("percent", percent),
        ):
            title_label, text_label = self.info_labels[n]
            if t in ("", None):
                title_label.grid_remove()
                text_label.grid_remove()
            else:
                title_label.grid()
                text_label.grid()
            text_label.config(text=t)
Esempio n. 12
0
 def __init__(self, parent, title, app, manager, key=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     if key is None:
         key = manager.getSelected()
     self.manager = manager
     self.key = key
     self.app = app
     self.cardset_values = None
     # padx, pady = kw.padx, kw.pady
     padx, pady = 5, 5
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
     #
     self.top.wm_minsize(400, 200)
     if self.top.winfo_screenwidth() >= 800:
         w1, w2 = 240, 400
     else:
         w1, w2 = 200, 300
     paned_window = ttk.PanedWindow(top_frame, orient='horizontal')
     paned_window.pack(expand=True, fill='both')
     left_frame = ttk.Frame(paned_window)
     right_frame = ttk.Frame(paned_window)
     paned_window.add(left_frame)
     paned_window.add(right_frame)
     font = app.getFont("default")
     self.tree = self.Tree_Class(self,
                                 left_frame,
                                 key=key,
                                 default=kw.default,
                                 font=font,
                                 width=w1)
     self.tree.frame.grid(row=0,
                          column=0,
                          sticky='nsew',
                          padx=padx,
                          pady=pady)
     if USE_PIL:
         #
         var = Tkinter.DoubleVar()
         var.set(app.opt.scale_x)
         self.scale_x = PysolScale(left_frame,
                                   label=_('Scale X:'),
                                   from_=0.5,
                                   to=4.0,
                                   resolution=0.1,
                                   orient='horizontal',
                                   variable=var,
                                   value=app.opt.scale_x,
                                   command=self._updateScale)
         self.scale_x.grid(row=1,
                           column=0,
                           sticky='ew',
                           padx=padx,
                           pady=pady)
         #
         var = Tkinter.DoubleVar()
         var.set(app.opt.scale_y)
         self.scale_y = PysolScale(left_frame,
                                   label=_('Scale Y:'),
                                   from_=0.5,
                                   to=4.0,
                                   resolution=0.1,
                                   orient='horizontal',
                                   variable=var,
                                   value=app.opt.scale_y,
                                   command=self._updateScale)
         self.scale_y.grid(row=2,
                           column=0,
                           sticky='ew',
                           padx=padx,
                           pady=pady)
         #
         self.auto_scale = Tkinter.BooleanVar()
         self.auto_scale.set(app.opt.auto_scale)
         check = ttk.Checkbutton(left_frame,
                                 text=_('Auto scaling'),
                                 variable=self.auto_scale,
                                 takefocus=False,
                                 command=self._updateAutoScale)
         check.grid(row=3,
                    column=0,
                    columnspan=2,
                    sticky='ew',
                    padx=padx,
                    pady=pady)
         #
         self.preserve_aspect = Tkinter.BooleanVar()
         self.preserve_aspect.set(app.opt.preserve_aspect_ratio)
         self.aspect_check = ttk.Checkbutton(
             left_frame,
             text=_('Preserve aspect ratio'),
             variable=self.preserve_aspect,
             takefocus=False,
             # command=self._updateScale
         )
         self.aspect_check.grid(row=4,
                                column=0,
                                sticky='ew',
                                padx=padx,
                                pady=pady)
         self._updateAutoScale()
     #
     left_frame.rowconfigure(0, weight=1)
     left_frame.columnconfigure(0, weight=1)
     #
     self.preview = MfxScrolledCanvas(right_frame, width=w2)
     self.preview.setTile(app, app.tabletile_index, force=True)
     self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
     self.preview.canvas.preview = 1
     # create a preview of the current state
     self.preview_key = -1
     self.preview_images = []
     self.scale_images = []
     self.updatePreview(key)
     #
     focus = self.createButtons(bottom_frame, kw)
     focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 13
0
class SelectCardsetDialogWithPreview(MfxDialog):
    Tree_Class = SelectCardsetTree
    TreeDataHolder_Class = SelectCardsetTree
    TreeData_Class = SelectCardsetData

    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.manager = manager
        self.key = key
        self.app = app
        self.cardset_values = None
        # padx, pady = kw.padx, kw.pady
        padx, pady = 5, 5
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 240, 400
        else:
            w1, w2 = 200, 300
        paned_window = ttk.PanedWindow(top_frame, orient='horizontal')
        paned_window.pack(expand=True, fill='both')
        left_frame = ttk.Frame(paned_window)
        right_frame = ttk.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)
        font = app.getFont("default")
        self.tree = self.Tree_Class(self,
                                    left_frame,
                                    key=key,
                                    default=kw.default,
                                    font=font,
                                    width=w1)
        self.tree.frame.grid(row=0,
                             column=0,
                             sticky='nsew',
                             padx=padx,
                             pady=pady)
        if USE_PIL:
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_x)
            self.scale_x = PysolScale(left_frame,
                                      label=_('Scale X:'),
                                      from_=0.5,
                                      to=4.0,
                                      resolution=0.1,
                                      orient='horizontal',
                                      variable=var,
                                      value=app.opt.scale_x,
                                      command=self._updateScale)
            self.scale_x.grid(row=1,
                              column=0,
                              sticky='ew',
                              padx=padx,
                              pady=pady)
            #
            var = Tkinter.DoubleVar()
            var.set(app.opt.scale_y)
            self.scale_y = PysolScale(left_frame,
                                      label=_('Scale Y:'),
                                      from_=0.5,
                                      to=4.0,
                                      resolution=0.1,
                                      orient='horizontal',
                                      variable=var,
                                      value=app.opt.scale_y,
                                      command=self._updateScale)
            self.scale_y.grid(row=2,
                              column=0,
                              sticky='ew',
                              padx=padx,
                              pady=pady)
            #
            self.auto_scale = Tkinter.BooleanVar()
            self.auto_scale.set(app.opt.auto_scale)
            check = ttk.Checkbutton(left_frame,
                                    text=_('Auto scaling'),
                                    variable=self.auto_scale,
                                    takefocus=False,
                                    command=self._updateAutoScale)
            check.grid(row=3,
                       column=0,
                       columnspan=2,
                       sticky='ew',
                       padx=padx,
                       pady=pady)
            #
            self.preserve_aspect = Tkinter.BooleanVar()
            self.preserve_aspect.set(app.opt.preserve_aspect_ratio)
            self.aspect_check = ttk.Checkbutton(
                left_frame,
                text=_('Preserve aspect ratio'),
                variable=self.preserve_aspect,
                takefocus=False,
                # command=self._updateScale
            )
            self.aspect_check.grid(row=4,
                                   column=0,
                                   sticky='ew',
                                   padx=padx,
                                   pady=pady)
            self._updateAutoScale()
        #
        left_frame.rowconfigure(0, weight=1)
        left_frame.columnconfigure(0, weight=1)
        #
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.preview_images = []
        self.scale_images = []
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def destroy(self):
        self.tree.updateNodesWithTree(self.tree.rootnodes, None)
        self.tree.destroy()
        self.preview.unbind_all()
        self.preview_images = []
        MfxDialog.destroy(self)

    def initKw(self, kw):
        if USE_PIL:
            s = (_("&Info / Settings..."), 10)
        else:
            s = (_("&Info..."), 10)
        kw = KwStruct(
            kw,
            strings=(
                s,
                'sep',
                _("&OK"),
                _("&Cancel"),
            ),
            default=0,
            resizable=True,
        )
        return MfxDialog.initKw(self, kw)

    def mDone(self, button):
        if button in (0, 1):  # Load/Cancel
            self.key = self.tree.selection_key
            self.tree.n_expansions = 1  # save xyview in any case
            if USE_PIL:
                auto_scale = bool(self.auto_scale.get())
                if button == 1:
                    self.app.menubar.tkopt.auto_scale.set(auto_scale)
                if auto_scale:
                    self.scale_values = (self.app.opt.scale_x,
                                         self.app.opt.scale_y, auto_scale,
                                         bool(self.preserve_aspect.get()))
                else:
                    self.scale_values = (self.scale_x.get(),
                                         self.scale_y.get(), auto_scale,
                                         self.app.opt.preserve_aspect_ratio)
        if button == 10:  # Info
            cs = self.manager.get(self.tree.selection_key)
            if not cs:
                return
            # title = CARDSET+" "+cs.name
            title = CARDSET.capitalize() + " " + cs.name
            d = CardsetInfoDialog(self.top,
                                  title=title,
                                  cardset=cs,
                                  images=self.preview_images)
            self.cardset_values = d.cardset_values
            return
        MfxDialog.mDone(self, button)

    def _updateAutoScale(self, v=None):
        if self.auto_scale.get():
            self.aspect_check.config(state='normal')
            self.scale_x.state('disabled')
            self.scale_y.state('disabled')
        else:
            self.aspect_check.config(state='disabled')
            self.scale_x.state('!disabled')
            self.scale_y.state('!disabled')

    def _updateScale(self, v):
        self.updatePreview()

    def updatePreview(self, key=None):
        if key == self.preview_key:
            return
        if key is None:
            key = self.key
        canvas = self.preview.canvas
        canvas.deleteAllItems()
        self.preview_images = []
        cs = self.manager.get(key)
        if not cs:
            self.preview_key = -1
            return
        names, columns = cs.getPreviewCardNames()
        try:
            # ???names, columns = cs.getPreviewCardNames()
            for n in names:
                f = os.path.join(cs.dir, n + cs.ext)
                self.preview_images.append(loadImage(file=f))
        except:
            self.preview_key = -1
            self.preview_images = []
            return
        i, x, y, sx, sy, dx, dy = 0, 10, 10, 0, 0, cs.CARDW + 10, cs.CARDH + 10
        if USE_PIL:
            xf = self.scale_x.get()
            yf = self.scale_y.get()
            dx = int(dx * xf)
            dy = int(dy * yf)
            self.scale_images = []
        for image in self.preview_images:
            if USE_PIL:
                image = image.resize(xf, yf)
                self.scale_images.append(image)
            MfxCanvasImage(canvas, x, y, anchor="nw", image=image)
            sx, sy = max(x, sx), max(y, sy)
            i = i + 1
            if i % columns == 0:
                x, y = 10, y + dy
            else:
                x = x + dx
        canvas.config(scrollregion=(0, 0, sx + dx, sy + dy),
                      width=sx + dx,
                      height=sy + dy)
        # canvas.config(xscrollincrement=dx, yscrollincrement=dy)
        canvas.event_generate('<Configure>')  # update bg image
        self.preview_key = key
        self.key = key
Esempio n. 14
0
 def __init__(self, parent, title, app, gameid, bookmark=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     self.app = app
     self.gameid = gameid
     self.bookmark = bookmark
     self.random = None
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(app)
     #
     self.top.wm_minsize(400, 200)
     sw = self.top.winfo_screenwidth()
     if sw >= 1100:
         w1, w2 = 250, 600
     elif sw >= 900:
         w1, w2 = 250, 500
     elif sw >= 800:
         w1, w2 = 220, 480
     else:
         w1, w2 = 200, 300
     ##print sw, w1, w2
     w2 = max(200, min(w2, 10 + 12*(app.subsampled_images.CARDW+10)))
     ##print sw, w1, w2
     ##padx, pady = kw.padx, kw.pady
     #padx, pady = kw.padx/2, kw.pady/2
     padx, pady = 4, 4
     # PanedWindow
     paned_window = ttk.PanedWindow(top_frame, orient='horizontal')
     paned_window.pack(expand=True, fill='both', padx=8, pady=8)
     left_frame = ttk.Frame(paned_window)
     right_frame = ttk.Frame(paned_window)
     paned_window.add(left_frame)
     paned_window.add(right_frame)
     # Tree
     font = app.getFont("default")
     self.tree = self.Tree_Class(self, left_frame, key=gameid,
                                 default=kw.default, font=font, width=w1)
     self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both')
     # LabelFrame
     info_frame = ttk.LabelFrame(right_frame, text=_('About game'))
     info_frame.grid(row=0, column=0, padx=padx, pady=pady,
                     ipadx=4, ipady=4, sticky='nws')
     stats_frame = ttk.LabelFrame(right_frame, text=_('Statistics'))
     stats_frame.grid(row=0, column=1, padx=padx, pady=pady,
                      ipadx=4, ipady=4, sticky='nws')
     # Info
     self.info_labels = {}
     i = 0
     for n, t, f, row in (
         ('name',        _('Name:'),             info_frame,   0),
         ('altnames',    _('Alternate names:'),  info_frame,   1),
         ('category',    _('Category:'),         info_frame,   2),
         ('type',        _('Type:'),             info_frame,   3),
         ('skill_level', _('Skill level:'),      info_frame,   4),
         ('decks',       _('Decks:'),            info_frame,   5),
         ('redeals',     _('Redeals:'),          info_frame,   6),
         #
         ('played',      _('Played:'),           stats_frame,  0),
         ('won',         _('Won:'),              stats_frame,  1),
         ('lost',        _('Lost:'),             stats_frame,  2),
         ('time',        _('Playing time:'),     stats_frame,  3),
         ('moves',       _('Moves:'),            stats_frame,  4),
         ('percent',     _('% won:'),            stats_frame,  5),
         ):
         title_label = ttk.Label(f, text=t, justify='left', anchor='w')
         title_label.grid(row=row, column=0, sticky='nw', padx=4)
         text_label = ttk.Label(f, justify='left', anchor='w')
         text_label.grid(row=row, column=1, sticky='nw', padx=4)
         self.info_labels[n] = (title_label, text_label)
     ##info_frame.columnconfigure(1, weight=1)
     info_frame.rowconfigure(6, weight=1)
     stats_frame.rowconfigure(6, weight=1)
     # Canvas
     self.preview = MfxScrolledCanvas(right_frame, width=w2)
     self.preview.setTile(app, app.tabletile_index, force=True)
     self.preview.grid(row=1, column=0, columnspan=3,
                       padx=padx, pady=pady, sticky='nsew')
     right_frame.columnconfigure(1, weight=1)
     right_frame.rowconfigure(1, weight=1)
     #
     focus = self.createButtons(bottom_frame, kw)
     # set the scale factor
     self.preview.canvas.preview = 2
     # create a preview of the current game
     self.preview_key = -1
     self.preview_game = None
     self.preview_app = None
     self.updatePreview(gameid, animations=0)
     ##focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 15
0
class SelectTileDialogWithPreview(MfxDialog):
    Tree_Class = SelectTileTree
    TreeDataHolder_Class = SelectTileTree
    TreeData_Class = SelectTileData

    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.app = app
        self.manager = manager
        self.key = key
        self.table_color = app.opt.colors['table']
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 200, 400
        else:
            w1, w2 = 200, 300
        font = app.getFont("default")
        padx, pady = 4, 4
        frame = ttk.Frame(top_frame)
        frame.pack(fill='both', expand=True,
                   padx=kw.padx-padx, pady=kw.pady-pady)
        self.tree = self.Tree_Class(self, frame, key=key, default=kw.default,
                                    font=font, width=w1)
        self.tree.frame.pack(side="left", fill='both', expand=False,
                             padx=padx, pady=pady)
        self.preview = MfxScrolledCanvas(frame, width=w2, hbar=0, vbar=0)
        self.preview.pack(side="right", fill='both', expand=True,
                          padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def destroy(self):
        self.tree.updateNodesWithTree(self.tree.rootnodes, None)
        self.tree.destroy()
        self.preview.unbind_all()
        MfxDialog.destroy(self)

    def initKw(self, kw):
        kw = KwStruct(kw,
                      strings=((_("&Solid color..."), 10),
                               'sep', _("&OK"), _("&Cancel"),),
                      default=0,
                      resizable=True,
                      font=None,
                      padx=10, pady=10,
                      )
        return MfxDialog.initKw(self, kw)

    def mDone(self, button):
        if button == 0:        # "OK" or double click
            if isinstance(self.tree.selection_key, basestring):
                self.key = str(self.tree.selection_key)
            else:
                self.key = self.tree.selection_key
            self.tree.n_expansions = 1  # save xyview in any case
        if button == 10:        # "Solid color..."
            try:
                c = tkColorChooser.askcolor(master=self.top,
                                            initialcolor=self.table_color,
                                            title=_("Select table color"))
            except Tkinter.TclError:
                pass
            else:
                if c and c[1]:
                    color = str(c[1])
                    self.key = color.lower()
                    self.table_color = self.key
                    self.tree.updateSelection(self.key)
                    self.updatePreview(self.key)
            return
        MfxDialog.mDone(self, button)

    def updatePreview(self, key):
        if key == self.preview_key:
            return
        canvas = self.preview.canvas
        canvas.deleteAllItems()
        if isinstance(key, basestring):
            # solid color
            canvas.config(bg=key)
            canvas.setTile(None)
            canvas.setTextColor(None)
            self.preview_key = key
            self.table_color = key
        else:
            # image
            tile = self.manager.get(key)
            if tile:
                if self.preview.setTile(self.app, key):
                    return
            self.preview_key = -1
Esempio n. 16
0
 def destroy(self):
     for node in self.keys.get(self.selection_key, []):
         node.selected = 0
     MfxScrolledCanvas.destroy(self)
Esempio n. 17
0
class SelectTileDialogWithPreview(MfxDialog):
    Tree_Class = SelectTileTree
    TreeDataHolder_Class = SelectTileTree
    TreeData_Class = SelectTileData

    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.app = app
        self.manager = manager
        self.key = key
        self.table_color = app.opt.colors['table']
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 200, 400
        else:
            w1, w2 = 200, 300
        font = app.getFont("default")
        padx, pady = 4, 4
        frame = Tkinter.Frame(top_frame)
        frame.pack(fill='both',
                   expand=True,
                   padx=kw.padx - padx,
                   pady=kw.pady - pady)
        self.tree = self.Tree_Class(self,
                                    frame,
                                    key=key,
                                    default=kw.default,
                                    font=font,
                                    width=w1)
        self.tree.frame.pack(side="left",
                             fill='both',
                             expand=False,
                             padx=padx,
                             pady=pady)
        self.preview = MfxScrolledCanvas(frame, width=w2, hbar=0, vbar=0)
        self.preview.pack(side="right",
                          fill='both',
                          expand=True,
                          padx=padx,
                          pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def destroy(self):
        self.tree.updateNodesWithTree(self.tree.rootnodes, None)
        self.tree.destroy()
        self.preview.unbind_all()
        MfxDialog.destroy(self)

    def initKw(self, kw):
        kw = KwStruct(
            kw,
            strings=(
                _("&OK"),
                _("&Solid color..."),
                _("&Cancel"),
            ),
            default=0,
            resizable=True,
            font=None,
            padx=10,
            pady=10,
            buttonpadx=10,
            buttonpady=5,
        )
        return MfxDialog.initKw(self, kw)

    def mDone(self, button):
        if button == 0:  # "OK" or double click
            if isinstance(self.tree.selection_key, basestring):
                self.key = str(self.tree.selection_key)
            else:
                self.key = self.tree.selection_key
            self.tree.n_expansions = 1  # save xyview in any case
        if button == 1:  # "Solid color..."
            try:
                c = tkColorChooser.askcolor(master=self.top,
                                            initialcolor=self.table_color,
                                            title=_("Select table color"))
            except Tkinter.TclError:
                pass
            else:
                if c and c[1]:
                    color = str(c[1])
                    self.key = color.lower()
                    self.table_color = self.key
                    self.tree.updateSelection(self.key)
                    self.updatePreview(self.key)
            return
        MfxDialog.mDone(self, button)

    def updatePreview(self, key):
        # print key
        if key == self.preview_key:
            return
        canvas = self.preview.canvas
        canvas.deleteAllItems()
        if isinstance(key, basestring):
            # solid color
            canvas.config(bg=key)
            canvas.setTile(None)
            canvas.setTextColor(None)
            self.preview_key = key
            self.table_color = key
        else:
            # image
            tile = self.manager.get(key)
            if tile:
                if self.preview.setTile(self.app, key):
                    return
            self.preview_key = -1
Esempio n. 18
0
 def __init__(self, parent, title, app, gameid, bookmark=None, **kw):
     kw = self.initKw(kw)
     MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
     top_frame, bottom_frame = self.createFrames(kw)
     self.createBitmaps(top_frame, kw)
     #
     self.app = app
     self.gameid = gameid
     self.bookmark = bookmark
     self.random = None
     if self.TreeDataHolder_Class.data is None:
         self.TreeDataHolder_Class.data = self.TreeData_Class(app)
     #
     self.top.wm_minsize(400, 200)
     sw = self.top.winfo_screenwidth()
     if sw >= 1100:
         w1, w2 = 250, 600
     elif sw >= 900:
         w1, w2 = 250, 500
     elif sw >= 800:
         w1, w2 = 220, 480
     else:
         w1, w2 = 200, 300
     ##print sw, w1, w2
     w2 = max(200, min(w2, 10 + 12 * (app.subsampled_images.CARDW + 10)))
     ##print sw, w1, w2
     ##padx, pady = kw.padx, kw.pady
     padx, pady = kw.padx / 2, kw.pady / 2
     # PanedWindow
     paned_window = Tkinter.PanedWindow(top_frame)
     paned_window.pack(expand=True, fill='both')
     left_frame = Tkinter.Frame(paned_window)
     right_frame = Tkinter.Frame(paned_window)
     paned_window.add(left_frame)
     paned_window.add(right_frame)
     # Tree
     font = app.getFont("default")
     self.tree = self.Tree_Class(self,
                                 left_frame,
                                 key=gameid,
                                 default=kw.default,
                                 font=font,
                                 width=w1)
     self.tree.frame.pack(padx=padx, pady=pady, expand=True, fill='both')
     # LabelFrame
     info_frame = Tkinter.LabelFrame(right_frame, text=_('About game'))
     stats_frame = Tkinter.LabelFrame(right_frame, text=_('Statistics'))
     info_frame.grid(row=0,
                     column=0,
                     padx=padx,
                     pady=pady,
                     ipadx=padx,
                     ipady=pady,
                     sticky='nws')
     stats_frame.grid(row=0,
                      column=1,
                      padx=padx,
                      pady=pady,
                      ipadx=padx,
                      ipady=pady,
                      sticky='nws')
     # Info
     self.info_labels = {}
     i = 0
     for n, t, f, row in (
         ('name', _('Name:'), info_frame, 0),
         ('altnames', _('Alternate names:'), info_frame, 1),
         ('category', _('Category:'), info_frame, 2),
         ('type', _('Type:'), info_frame, 3),
         ('skill_level', _('Skill level:'), info_frame, 4),
         ('decks', _('Decks:'), info_frame, 5),
         ('redeals', _('Redeals:'), info_frame, 6),
             #
         ('played', _('Played:'), stats_frame, 0),
         ('won', _('Won:'), stats_frame, 1),
         ('lost', _('Lost:'), stats_frame, 2),
         ('time', _('Playing time:'), stats_frame, 3),
         ('moves', _('Moves:'), stats_frame, 4),
         ('percent', _('% won:'), stats_frame, 5),
     ):
         title_label = Tkinter.Label(f, text=t, justify='left', anchor='w')
         title_label.grid(row=row, column=0, sticky='nw')
         text_label = Tkinter.Label(f, justify='left', anchor='w')
         text_label.grid(row=row, column=1, sticky='nw')
         self.info_labels[n] = (title_label, text_label)
     ##info_frame.columnconfigure(1, weight=1)
     info_frame.rowconfigure(6, weight=1)
     stats_frame.rowconfigure(6, weight=1)
     # Canvas
     self.preview = MfxScrolledCanvas(right_frame, width=w2)
     self.preview.setTile(app, app.tabletile_index, force=True)
     self.preview.grid(row=1,
                       column=0,
                       columnspan=3,
                       padx=padx,
                       pady=pady,
                       sticky='nsew')
     right_frame.columnconfigure(1, weight=1)
     right_frame.rowconfigure(1, weight=1)
     #
     focus = self.createButtons(bottom_frame, kw)
     # set the scale factor
     self.preview.canvas.preview = 2
     # create a preview of the current game
     self.preview_key = -1
     self.preview_game = None
     self.preview_app = None
     self.updatePreview(gameid, animations=0)
     ##focus = self.tree.frame
     self.mainloop(focus, kw.timeout)
Esempio n. 19
0
class SelectCardsetDialogWithPreview(MfxDialog):
    Tree_Class = SelectCardsetTree
    TreeDataHolder_Class = SelectCardsetTree
    TreeData_Class = SelectCardsetData

    def __init__(self, parent, title, app, manager, key=None, **kw):
        kw = self.initKw(kw)
        MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
        top_frame, bottom_frame = self.createFrames(kw)
        self.createBitmaps(top_frame, kw)
        #
        if key is None:
            key = manager.getSelected()
        self.manager = manager
        self.key = key
        #padx, pady = kw.padx, kw.pady
        padx, pady = 5, 5
        if self.TreeDataHolder_Class.data is None:
            self.TreeDataHolder_Class.data = self.TreeData_Class(manager, key)
        #
        self.top.wm_minsize(400, 200)
        if self.top.winfo_screenwidth() >= 800:
            w1, w2 = 216, 400
        else:
            w1, w2 = 200, 300
        paned_window = Tkinter.PanedWindow(top_frame)
        paned_window.pack(expand=True, fill='both')
        left_frame = Tkinter.Frame(paned_window)
        right_frame = Tkinter.Frame(paned_window)
        paned_window.add(left_frame)
        paned_window.add(right_frame)

        font = app.getFont("default")
        self.tree = self.Tree_Class(self, left_frame, key=key,
                                    default=kw.default,
                                    font=font, width=w1)
        self.tree.frame.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview = MfxScrolledCanvas(right_frame, width=w2)
        self.preview.setTile(app, app.tabletile_index, force=True)
        self.preview.pack(fill='both', expand=True, padx=padx, pady=pady)
        self.preview.canvas.preview = 1
        # create a preview of the current state
        self.preview_key = -1
        self.preview_images = []
        self.updatePreview(key)
        #
        focus = self.createButtons(bottom_frame, kw)
        focus = self.tree.frame
        self.mainloop(focus, kw.timeout)

    def destroy(self):
        self.tree.updateNodesWithTree(self.tree.rootnodes, None)
        self.tree.destroy()
        self.preview.unbind_all()
        self.preview_images = []
        MfxDialog.destroy(self)

    def initKw(self, kw):
        kw = KwStruct(kw,
                      strings=(_("&OK"), _("&Load"), _("&Cancel"),),
                      default=0,
                      resizable=True,
                      padx=10, pady=10,
                      buttonpadx=10, buttonpady=5,
                      )
        return MfxDialog.initKw(self, kw)

    def mDone(self, button):
        if button in (0, 1):               # Ok/Load
            self.key = self.tree.selection_key
            self.tree.n_expansions = 1  # save xyview in any case
        if button in (3, 4):
            cs = self.manager.get(self.tree.selection_key)
            if not cs:
                return
            ##title = CARDSET+" "+cs.name
            title = CARDSET.capitalize()+" "+cs.name
            CardsetInfoDialog(self.top, title=title, cardset=cs, images=self.preview_images)
            return
        MfxDialog.mDone(self, button)

    def updatePreview(self, key):
        if key == self.preview_key:
            return
        canvas = self.preview.canvas
        canvas.deleteAllItems()
        self.preview_images = []
        cs = self.manager.get(key)
        if not cs:
            self.preview_key = -1
            return
        names, columns = cs.getPreviewCardNames()
        try:
            #???names, columns = cs.getPreviewCardNames()
            for n in names:
                f = os.path.join(cs.dir, n + cs.ext)
                self.preview_images.append(loadImage(file=f))
        except:
            self.preview_key = -1
            self.preview_images = []
            return
        i, x, y, sx, sy, dx, dy = 0, 10, 10, 0, 0, cs.CARDW + 10, cs.CARDH + 10
        for image in self.preview_images:
            MfxCanvasImage(canvas, x, y, anchor="nw", image=image)
            sx, sy = max(x, sx), max(y, sy)
            i = i + 1
            if i % columns == 0:
                x, y = 10, y + dy
            else:
                x = x + dx
        canvas.config(scrollregion=(0, 0, sx+dx, sy+dy),
                      width=sx+dx, height=sy+dy)
        canvas.event_generate('<Configure>') # update bg image
        #canvas.config(xscrollincrement=dx, yscrollincrement=dy)
        self.preview_key = key