class ScoringSandbox: def __init__(self, db = "./games.db", gameid = None, turnid = None, scoringModule = scoreState): self.frame = JFrame("Scoring Sandbox", defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE, size = (400, 300) ) self.frame.contentPane = JPanel(BorderLayout(5,5)) self.gamedb = GameDB(db) self.gameid = gameid self.turnid = turnid if gameid and turnid: self.board = gamedb.retrieveBoard(gameid, turnid) else: self.board = Board() self.scoringModule = scoringModule self.score = scoringModule and scoringModule.score or default_scorer self.initGui() self.display() def label_maker(self, is_board_label): def board_label_maker(board_item, i, j, colorizer): value = self.scores[i][j] label = common_label(its_a_trap(i, j) and "<html><font color='red'><b>X</b></font></html>" or "", PIECE_IMAGE[board_item and board_item.char or None], i, j, value, colorizer) if board_item: tooltip = "<html><table>" for attr, value in board_item.__dict__.iteritems(): tooltip += "<tr><td>" + attr.capitalize() + ":</td><td>" + str(value) + "</td></tr>" label.toolTipText = tooltip + "</table></html>" return label def number_label_maker(value, i, j, colorizer): return common_label("%.2f" % (value), None, i, j, value, colorizer) if is_board_label: return board_label_maker else: return number_label_maker def initGui(self): def make_game_selector(): self.gameChanger = False def dbChange(evt): if evt.source.text: self.gamedb = GameDB(evt.source.text) self.gameChanger = True def idChange(evt): if evt.source.text: self.gameid = evt.source.text self.gameChanger = True def turnChange(evt): if evt.source.text: self.turnid = evt.source.text self.gameChanger = True selector = JPanel() selector.add(JLabel("DB:")) selector.add(textfield(self.gamedb.dbfile, dbChange)) selector.add(JLabel("Game ID:")) selector.add(textfield(self.gameid, idChange)) selector.add(JLabel("Turn ID:")) selector.add(textfield(self.turnid, turnChange)) return JScrollPane(selector) def make_content_panel(): self.contentPanel = JPanel(GridLayout(1, 0, 5, 5)) self.render() return JScrollPane(self.contentPanel) def save(self, txt, filename): pass def make_code_editor(): import inspect panel = JPanel(BorderLayout(2,2)) self.codeArea = JTextArea() self.codeArea.text = self.scoringModule and inspect.getsource(self.scoringModule) or "" panel.add(JScrollPane(self.codeArea), BorderLayout.CENTER) return panel self.frame.contentPane.add(make_game_selector(), BorderLayout.NORTH) # self.frame.contentPane.add(make_content_panel(), BorderLayout.WEST) # self.frame.contentPane.add(make_code_editor(), BorderLayout.CENTER) pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, make_content_panel(), make_code_editor()) pane.setDividerLocation(self.frame.width/2) self.frame.contentPane.add(pane) reloadButton = JButton("Reload") def reload(evt): self.reload() reloadButton.addActionListener(reload) self.frame.contentPane.add(reloadButton, BorderLayout.SOUTH) def render(self): self.scorer, self.colorizer = self.score and (self.score, value_color) or (default_scorer, checkerboard) self.scores = self.scorer(self.board) self.contentPanel.removeAll() self.contentPanel.add(make_board_panel(self.board, self.label_maker(True), self.colorizer)) self.contentPanel.add(make_board_panel(self.scores, self.label_maker(False), self.colorizer)) self.contentPanel.revalidate() def reload(self): if self.gameChanger: self.board = self.gamedb.retrieveBoard(self.gameid, self.turnid) self.scores = self.score(self.board) self.gameChanger = False exec(self.codeArea.text) self.score = score self.render() def display(self): self.frame.pack() self.frame.visible = True self.reload()
class ScoringSandbox: def __init__(self, db="./games.db", gameid=None, turnid=None, scoringModule=scoreState): self.frame = JFrame("Scoring Sandbox", defaultCloseOperation=JFrame.DISPOSE_ON_CLOSE, size=(400, 300)) self.frame.contentPane = JPanel(BorderLayout(5, 5)) self.gamedb = GameDB(db) self.gameid = gameid self.turnid = turnid if gameid and turnid: self.board = gamedb.retrieveBoard(gameid, turnid) else: self.board = Board() self.scoringModule = scoringModule self.score = scoringModule and scoringModule.score or default_scorer self.initGui() self.display() def label_maker(self, is_board_label): def board_label_maker(board_item, i, j, colorizer): value = self.scores[i][j] label = common_label( its_a_trap(i, j) and "<html><font color='red'><b>X</b></font></html>" or "", PIECE_IMAGE[board_item and board_item.char or None], i, j, value, colorizer) if board_item: tooltip = "<html><table>" for attr, value in board_item.__dict__.iteritems(): tooltip += "<tr><td>" + attr.capitalize( ) + ":</td><td>" + str(value) + "</td></tr>" label.toolTipText = tooltip + "</table></html>" return label def number_label_maker(value, i, j, colorizer): return common_label("%.2f" % (value), None, i, j, value, colorizer) if is_board_label: return board_label_maker else: return number_label_maker def initGui(self): def make_game_selector(): self.gameChanger = False def dbChange(evt): if evt.source.text: self.gamedb = GameDB(evt.source.text) self.gameChanger = True def idChange(evt): if evt.source.text: self.gameid = evt.source.text self.gameChanger = True def turnChange(evt): if evt.source.text: self.turnid = evt.source.text self.gameChanger = True selector = JPanel() selector.add(JLabel("DB:")) selector.add(textfield(self.gamedb.dbfile, dbChange)) selector.add(JLabel("Game ID:")) selector.add(textfield(self.gameid, idChange)) selector.add(JLabel("Turn ID:")) selector.add(textfield(self.turnid, turnChange)) return JScrollPane(selector) def make_content_panel(): self.contentPanel = JPanel(GridLayout(1, 0, 5, 5)) self.render() return JScrollPane(self.contentPanel) def save(self, txt, filename): pass def make_code_editor(): import inspect panel = JPanel(BorderLayout(2, 2)) self.codeArea = JTextArea() self.codeArea.text = self.scoringModule and inspect.getsource( self.scoringModule) or "" panel.add(JScrollPane(self.codeArea), BorderLayout.CENTER) return panel self.frame.contentPane.add(make_game_selector(), BorderLayout.NORTH) # self.frame.contentPane.add(make_content_panel(), BorderLayout.WEST) # self.frame.contentPane.add(make_code_editor(), BorderLayout.CENTER) pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, make_content_panel(), make_code_editor()) pane.setDividerLocation(self.frame.width / 2) self.frame.contentPane.add(pane) reloadButton = JButton("Reload") def reload(evt): self.reload() reloadButton.addActionListener(reload) self.frame.contentPane.add(reloadButton, BorderLayout.SOUTH) def render(self): self.scorer, self.colorizer = self.score and ( self.score, value_color) or (default_scorer, checkerboard) self.scores = self.scorer(self.board) self.contentPanel.removeAll() self.contentPanel.add( make_board_panel(self.board, self.label_maker(True), self.colorizer)) self.contentPanel.add( make_board_panel(self.scores, self.label_maker(False), self.colorizer)) self.contentPanel.revalidate() def reload(self): if self.gameChanger: self.board = self.gamedb.retrieveBoard(self.gameid, self.turnid) self.scores = self.score(self.board) self.gameChanger = False exec(self.codeArea.text) self.score = score self.render() def display(self): self.frame.pack() self.frame.visible = True self.reload()
class TemplateBar(TransferHandler): def __init__(self): self.panel = JPanel() self.panel.layout = BoxLayout(self.panel,BoxLayout.Y_AXIS) #self.panel.minimumSize = 55,-1 self.panel.background = Color(0.1,0.1,0.1) self.max_icon_width = 40 self.templates = {} self.labels = [] self.panels = [] self.ng = ca.nengo.ui.NengoGraphics.getInstance() dh = DropHandler() self.ng.universe.transferHandler = dh self.ng.universe.getDropTarget().addDropTargetListener(dh) self.add_template('Network','ca.nengo.ui.models.constructors.CNetwork','images/nengoIcons/network.gif') self.add_template('Ensemble','ca.nengo.ui.models.constructors.CNEFEnsemble','images/nengoIcons/ensemble.gif') self.add_template('Input','ca.nengo.ui.models.constructors.CFunctionInput','images/nengoIcons/input.png') #self.add_template('Origin','ca.nengo.ui.models.constructors.CDecodedOrigin','images/nengoIcons/origin.png') self.add_template('Origin','nef.templates.origin','images/nengoIcons/origin.png') self.add_template('Termination','nef.templates.termination','images/nengoIcons/termination.png') self.panel.add(JSeparator(JSeparator.HORIZONTAL,maximumSize = (200,1),foreground = Color(0.3,0.3,0.3),background = Color(0.1,0.1,0.1))) for template in nef.templates.templates: self.add_template(getattr(template,'label'),template.__name__,'images/nengoIcons/'+getattr(template,'icon')) # get NengoGraphics to add me self.ng.setTemplatePanel(self.panel) def add_template(self,name,constructor,image): icon = ImageIcon(image) if icon.iconWidth>self.max_icon_width: icon = ImageIcon(icon.image.getScaledInstance(self.max_icon_width,icon.iconHeight*self.max_icon_width/icon.iconWidth,Image.SCALE_SMOOTH)) panel = JPanel(layout = BorderLayout(),opaque = False) button = JButton(icon = icon,toolTipText = name.replace('\n',' '), borderPainted = False,focusPainted = False,contentAreaFilled = False,margin = java.awt.Insets(0,0,0,0), verticalTextPosition = AbstractButton.BOTTOM,horizontalTextPosition = AbstractButton.CENTER, mousePressed = lambda e: e.source.transferHandler.exportAsDrag(e.source,e,TransferHandler.COPY)) button.transferHandler = self panel.add(button) text = '<html><center>%s</center></html>'%name.replace('\n','<br/>') label = JLabel(text,horizontalAlignment = SwingConstants.CENTER,foreground = Color.WHITE) self.labels.append(label) panel.add(label,BorderLayout.SOUTH) self.panels.append(panel) panel.alignmentY = Component.CENTER_ALIGNMENT panel.border = BorderFactory.createEmptyBorder(2,1,2,1) panel.maximumSize = panel.preferredSize self.panel.add(panel) self.templates[button] = constructor def getSourceActions(self,component): return TransferHandler.COPY def createTransferable(self,component): return TemplateTransferable(self.templates[component]) def toggle_labels(self): for l in self.labels: l.visible = not l.visible for p in self.panels: p.maximumSize = p.preferredSize p.revalidate() self.panel.revalidate() ca.nengo.ui.NengoGraphics.getInstance().contentPane.revalidate()