import os import wx import re from sys import platform from configtool.decoration import Decoration from configtool.data import ( defineValueFormat, defineBoolFormat, reHelpTextStart, reHelpTextEnd, reDefine, reDefineBL, reDefQS, reDefQSm, reDefQSm2, reDefBool, reDefBoolBL, ) from configtool.mechanicalpage import MechanicalPage from configtool.accelerationpage import AccelerationPage from configtool.miscellaneouspage import MiscellaneousPage from configtool.protectedfiles import protectedFiles from configtool.printer import Printer class PrinterPanel(wx.Panel): def __init__(self, parent, nb, settings): wx.Panel.__init__(self, nb, wx.ID_ANY) self.parent = parent self.deco = Decoration() self.protFileLoaded = False self.settings = settings self.printer = Printer(self.settings) self.dir = os.path.join(self.settings.folder, "config") self.SetBackgroundColour(self.deco.getBackgroundColour()) self.Bind(wx.EVT_PAINT, self.deco.onPaintBackground) sz = wx.BoxSizer(wx.HORIZONTAL) self.nb = wx.Notebook(self, wx.ID_ANY, size=(21, 21), style=wx.BK_DEFAULT) self.nb.SetBackgroundColour(self.deco.getBackgroundColour()) self.nb.SetFont(self.settings.font) self.pages = [] self.titles = [] self.pageModified = [] self.pageValid = [] self.pgMech = self.registerPage(MechanicalPage, "Mechanical") self.pgAcc = self.registerPage(AccelerationPage, "Acceleration") self.pgMiscellaneous = self.registerPage(MiscellaneousPage, "Miscellaneous") sz.Add(self.nb, 1, wx.EXPAND + wx.ALL, 5) self.SetSizer(sz) self.Fit() def registerPage(self, klass, label, *args, **kwargs): page = klass( self, self.nb, len(self.pages), *args, font=self.settings.font, **kwargs ) self.nb.AddPage(page, label) self.pages.append(page) self.titles.append(label) self.pageModified.append(False) self.pageValid.append(True) return page def assertModified(self, pg, flag=True): self.pageModified[pg] = flag self.modifyTab(pg) def isModified(self): return True in self.pageModified def isValid(self): return not (False in self.pageValid) def hasData(self): return self.printer.hasData() def getFileName(self): return self.printer.configFile def assertValid(self, pg, flag=True): self.pageValid[pg] = flag self.modifyTab(pg) if False in self.pageValid: self.parent.enableSavePrinter(False, False) else: self.parent.enableSavePrinter(not self.protFileLoaded, True) def modifyTab(self, pg): if self.pageModified[pg] and not self.pageValid[pg]: pfx = "?* " elif self.pageModified[pg]: pfx = "* " elif not self.pageValid[pg]: pfx = "? " else: pfx = "" self.nb.SetPageText(pg, pfx + self.titles[pg]) if True in self.pageModified and False in self.pageValid: pfx = "?* " elif True in self.pageModified: pfx = "* " elif False in self.pageValid: pfx = "? " else: pfx = "" self.parent.setPrinterTabDecor(pfx) def setHeaters(self, ht): return self.pgMiscellaneous.setHeaters(ht) def onClose(self, evt): if not self.confirmLoseChanges("exit"): return self.Destroy() def confirmLoseChanges(self, msg): if True not in self.pageModified: return True dlg = wx.MessageDialog( self, "Are you sure you want to " + msg + "?\n" "There are changes to your printer " "configuration that will be lost.", "Changes pending", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION, ) rc = dlg.ShowModal() dlg.Destroy() if rc != wx.ID_YES: return False return True def onLoadConfig(self, evt): if not self.confirmLoseChanges("load a new printer configuration"): return if platform.startswith("darwin"): # Mac OS X appears to be a bit limited on wildcards. wildcard = "Printer configuration (printer.*.h)|*.h" else: wildcard = "Printer configuration (printer.*.h)|printer.*.h" dlg = wx.FileDialog( self, message="Choose a printer config file", defaultDir=self.dir, defaultFile="", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR, ) path = None if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() dlg.Destroy() if path is None: return self.dir = os.path.dirname(path) rc, efn = self.loadConfigFile(path) if not rc: dlg = wx.MessageDialog( self, "Unable to process file %s." % efn, "File error", wx.OK + wx.ICON_ERROR, ) dlg.ShowModal() dlg.Destroy() return def loadConfigFile(self, fn): ok, file = self.printer.loadConfigFile(fn) if not ok: return ok, file if os.path.basename(fn) in protectedFiles: self.parent.enableSavePrinter(False, True) self.protFileLoaded = True else: self.protFileLoaded = False self.parent.enableSavePrinter(True, True) self.parent.setPrinterTabFile(os.path.basename(fn)) for pg in self.pages: pg.insertValues(self.printer.cfgValues) pg.setHelpText(self.printer.helpText) k = "DC_EXTRUDER" if k in self.printer.cfgValues.keys() and self.printer.cfgValues[k][1] == True: self.pgMiscellaneous.setOriginalHeater(self.printer.cfgValues[k][0]) else: self.pgMiscellaneous.setOriginalHeater(None) return True, None def onSaveConfig(self, evt): path = self.getFileName() return self.saveConfigFile(path) def onSaveConfigAs(self, evt): if platform.startswith("darwin"): # Mac OS X appears to be a bit limited on wildcards. wildcard = "Printer configuration (printer.*.h)|*.h" else: wildcard = "Printer configuration (printer.*.h)|printer.*.h" dlg = wx.FileDialog( self, message="Save as ...", defaultDir=self.dir, defaultFile="", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, ) val = dlg.ShowModal() if val != wx.ID_OK: dlg.Destroy() return path = dlg.GetPath() dlg.Destroy() rc = self.saveConfigFile(path) if rc: self.parent.setPrinterTabFile(os.path.basename(path)) self.protFileLoaded = False self.parent.enableSavePrinter(True, True) return rc def saveConfigFile(self, path): if os.path.basename(path) in protectedFiles: dlg = wx.MessageDialog( self, "It's not allowed to overwrite files " "distributed by Teacup. Choose another name.", "Protected file error", wx.OK + wx.ICON_ERROR, ) dlg.ShowModal() dlg.Destroy() return False if not os.path.basename(path).startswith("printer."): dlg = wx.MessageDialog( self, "Illegal file name: %s.\n" 'File name must begin with "printer."' % path, "Illegal file name", wx.OK + wx.ICON_ERROR, ) dlg.ShowModal() dlg.Destroy() return False values = {} for pg in self.pages: v1 = pg.getValues() for k in v1.keys(): values[k] = v1[k] ext = os.path.splitext(os.path.basename(path))[1] self.dir = os.path.dirname(path) if ext == "": path += ".h" try: self.printer.saveConfigFile(path, values) except: dlg = wx.MessageDialog( self, "Unable to write to file %s." % path, "File error", wx.OK + wx.ICON_ERROR, ) dlg.ShowModal() dlg.Destroy() return False return True