# This file is part of the Printrun suite. # # Printrun is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Printrun is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Printrun. If not, see . import wx class macroed(wx.Dialog): """Really simple editor to edit macro definitions""" def __init__(self,macro_name,definition,callback,gcode=False): self.indent_chars = " " title=" macro %s" if gcode: title=" %s" self.gcode=gcode wx.Dialog.__init__(self,None,title=title % macro_name,style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) self.callback = callback self.panel=wx.Panel(self,-1) titlesizer=wx.BoxSizer(wx.HORIZONTAL) titletext = wx.StaticText(self.panel,-1," _") #title%macro_name) #title.SetFont(wx.Font(11,wx.NORMAL,wx.NORMAL,wx.BOLD)) titlesizer.Add(titletext,1) self.findb = wx.Button(self.panel, -1, _("Find"),style=wx.BU_EXACTFIT) #New button for "Find" (Jezmy) self.findb.Bind(wx.EVT_BUTTON, self.find) self.okb = wx.Button(self.panel, -1, _("Save"),style=wx.BU_EXACTFIT) self.okb.Bind(wx.EVT_BUTTON, self.save) self.Bind(wx.EVT_CLOSE, self.close) titlesizer.Add(self.findb) titlesizer.Add(self.okb) self.cancelb = wx.Button(self.panel, -1, _("Cancel"),style=wx.BU_EXACTFIT) self.cancelb.Bind(wx.EVT_BUTTON, self.close) titlesizer.Add(self.cancelb) topsizer=wx.BoxSizer(wx.VERTICAL) topsizer.Add(titlesizer,0,wx.EXPAND) self.e=wx.TextCtrl(self.panel,style=wx.TE_MULTILINE+wx.HSCROLL,size=(400,400)) if not self.gcode: self.e.SetValue(self.unindent(definition)) else: self.e.SetValue("\n".join(definition)) topsizer.Add(self.e,1,wx.ALL+wx.EXPAND) self.panel.SetSizer(topsizer) topsizer.Layout() topsizer.Fit(self) self.Show() self.e.SetFocus() def find(self,ev): # Ask user what to look for, find it and point at it ... (Jezmy) S = self.e.GetStringSelection() if not S : S = "Z" FindValue = wx.GetTextFromUser('Please enter a search string:', caption="Search", default_value=S, parent=None) somecode = self.e.GetValue() numLines = len(somecode) position = somecode.find(FindValue, self.e.GetInsertionPoint()) if position == -1 : # ShowMessage(self,-1, "Not found!") titletext = wx.TextCtrl(self.panel,-1,"Not Found!") else: # self.title.SetValue("Position : "+str(position)) titletext = wx.TextCtrl(self.panel,-1,str(position)) # ananswer = wx.MessageBox(str(numLines)+" Lines detected in file\n"+str(position), "OK") self.e.SetFocus() self.e.SetInsertionPoint(position) self.e.SetSelection(position, position + len(FindValue)) self.e.ShowPosition(position) def ShowMessage(self, ev , message): dlg = wxMessageDialog(self, message, "Info!", wxOK | wxICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def save(self,ev): self.Destroy() if not self.gcode: self.callback(self.reindent(self.e.GetValue())) else: self.callback(self.e.GetValue().split("\n")) def close(self,ev): self.Destroy() if self.webInterface: webinterface.KillWebInterfaceThread() def unindent(self,text): self.indent_chars = text[:len(text)-len(text.lstrip())] if len(self.indent_chars)==0: self.indent_chars=" " unindented = "" lines = re.split(r"(?:\r\n?|\n)",text) #print lines if len(lines) <= 1: return text for line in lines: if line.startswith(self.indent_chars): unindented += line[len(self.indent_chars):] + "\n" else: unindented += line + "\n" return unindented def reindent(self,text): lines = re.split(r"(?:\r\n?|\n)",text) if len(lines) <= 1: return text reindented = "" for line in lines: if line.strip() != "": reindented += self.indent_chars + line + "\n" return reindented class options(wx.Dialog): """Options editor""" def __init__(self,pronterface): wx.Dialog.__init__(self, None, title=_("Edit settings"), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) topsizer=wx.BoxSizer(wx.VERTICAL) vbox=wx.StaticBoxSizer(wx.StaticBox(self, label=_("Defaults")) ,wx.VERTICAL) topsizer.Add(vbox,1,wx.ALL+wx.EXPAND) grid=wx.FlexGridSizer(rows=0,cols=2,hgap=8,vgap=2) grid.SetFlexibleDirection( wx.BOTH ) grid.AddGrowableCol( 1 ) grid.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) vbox.Add(grid,0,wx.EXPAND) ctrls = {} for k,v in sorted(pronterface.settings._all_settings().items()): ctrls[k,0] = wx.StaticText(self,-1,k) ctrls[k,1] = wx.TextCtrl(self,-1,str(v)) if k in pronterface.helpdict: ctrls[k,0].SetToolTipString(pronterface.helpdict.get(k)) ctrls[k,1].SetToolTipString(pronterface.helpdict.get(k)) grid.Add(ctrls[k,0],0,wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ALIGN_RIGHT) grid.Add(ctrls[k,1],1,wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND) topsizer.Add(self.CreateSeparatedButtonSizer(wx.OK+wx.CANCEL),0,wx.EXPAND) self.SetSizer(topsizer) topsizer.Layout() topsizer.Fit(self) if self.ShowModal()==wx.ID_OK: for k,v in pronterface.settings._all_settings().items(): if ctrls[k,1].GetValue() != str(v): pronterface.set(k,str(ctrls[k,1].GetValue())) self.Destroy() class ButtonEdit(wx.Dialog): """Custom button edit dialog""" def __init__(self,pronterface): wx.Dialog.__init__(self, None, title=_("Custom button"),style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) self.pronterface=pronterface topsizer=wx.BoxSizer(wx.VERTICAL) grid=wx.FlexGridSizer(rows=0,cols=2,hgap=4,vgap=2) grid.AddGrowableCol(1,1) grid.Add(wx.StaticText(self,-1, _("Button title")), 0, wx.BOTTOM|wx.RIGHT) self.name=wx.TextCtrl(self,-1,"") grid.Add(self.name,1,wx.EXPAND) grid.Add(wx.StaticText(self, -1, _("Command")), 0, wx.BOTTOM|wx.RIGHT) self.command=wx.TextCtrl(self,-1,"") xbox=wx.BoxSizer(wx.HORIZONTAL) xbox.Add(self.command,1,wx.EXPAND) self.command.Bind(wx.EVT_TEXT,self.macrob_enabler) self.macrob=wx.Button(self,-1,"..",style=wx.BU_EXACTFIT) self.macrob.Bind(wx.EVT_BUTTON,self.macrob_handler) xbox.Add(self.macrob,0) grid.Add(xbox,1,wx.EXPAND) grid.Add(wx.StaticText(self,-1, _("Color")),0,wx.BOTTOM|wx.RIGHT) self.color=wx.TextCtrl(self,-1,"") grid.Add(self.color,1,wx.EXPAND) topsizer.Add(grid,0,wx.EXPAND) topsizer.Add( (0,0),1) topsizer.Add(self.CreateStdDialogButtonSizer(wx.OK|wx.CANCEL),0,wx.ALIGN_CENTER) self.SetSizer(topsizer) def macrob_enabler(self,e): macro = self.command.GetValue() valid = False try: if macro == "": valid = True elif self.pronterface.macros.has_key(macro): valid = True elif hasattr(self.pronterface.__class__,u"do_"+macro): valid = False elif len([c for c in macro if not c.isalnum() and c != "_"]): valid = False else: valid = True except: if macro == "": valid = True elif self.pronterface.macros.has_key(macro): valid = True elif len([c for c in macro if not c.isalnum() and c != "_"]): valid = False else: valid = True self.macrob.Enable(valid) def macrob_handler(self,e): macro = self.command.GetValue() macro = self.pronterface.edit_macro(macro) self.command.SetValue(macro) if self.name.GetValue()=="": self.name.SetValue(macro) class TempGauge(wx.Panel): def __init__(self,parent,size=(200,22),title="",maxval=240,gaugeColour=None): wx.Panel.__init__(self,parent,-1,size=size) self.Bind(wx.EVT_PAINT,self.paint) self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self.width,self.height=size self.title=title self.max=maxval self.gaugeColour=gaugeColour self.value=0 self.setpoint=0 self.recalc() def recalc(self): mmax=max(int(self.setpoint*1.05),self.max) self.scale=float(self.width-2)/float(mmax) self.ypt=max(16,int(self.scale*max(self.setpoint,self.max/6))) def SetValue(self,value): self.value=value wx.CallAfter(self.Refresh) def SetTarget(self,value): self.setpoint=value self.recalc() wx.CallAfter(self.Refresh) def interpolatedColour(self,val,vmin,vmid,vmax,cmin,cmid,cmax): if val < vmin: return cmin if val > vmax: return cmax if val <= vmid: lo,hi,val,valhi = cmin,cmid,val-vmin,vmid-vmin else: lo,hi,val,valhi = cmid,cmax,val-vmid,vmax-vmid vv = float(val)/valhi rgb=lo.Red()+(hi.Red()-lo.Red())*vv,lo.Green()+(hi.Green()-lo.Green())*vv,lo.Blue()+(hi.Blue()-lo.Blue())*vv rgb=map(lambda x:x*0.8,rgb) return wx.Colour(*map(int,rgb)) def paint(self,ev): x0,y0,x1,y1,xE,yE = 1,1,self.ypt+1,1,self.width+1-2,20 dc=wx.PaintDC(self) dc.SetBackground(wx.Brush((255,255,255))) dc.Clear() cold,medium,hot = wx.Colour(0,167,223),wx.Colour(239,233,119),wx.Colour(210,50.100) gauge1,gauge2 = wx.Colour(255,255,210),(self.gaugeColour or wx.Colour(234,82,0)) shadow1,shadow2 = wx.Colour(110,110,110),wx.Colour(255,255,255) gc = wx.GraphicsContext.Create(dc) # draw shadow first # corners gc.SetBrush(gc.CreateRadialGradientBrush(xE-7,9,xE-7,9,8,shadow1,shadow2)) gc.DrawRectangle(xE-7,1,8,8) gc.SetBrush(gc.CreateRadialGradientBrush(xE-7,17,xE-7,17,8,shadow1,shadow2)) gc.DrawRectangle(xE-7,17,8,8) gc.SetBrush(gc.CreateRadialGradientBrush(x0+6,17,x0+6,17,8,shadow1,shadow2)) gc.DrawRectangle(0,17,x0+6,8) # edges gc.SetBrush(gc.CreateLinearGradientBrush(xE-13,0,xE-6,0,shadow1,shadow2)) gc.DrawRectangle(xE-6,9,10,8) gc.SetBrush(gc.CreateLinearGradientBrush(x0,yE-2,x0,yE+5,shadow1,shadow2)) gc.DrawRectangle(x0+6,yE-2,xE-12,7) # draw gauge background gc.SetBrush(gc.CreateLinearGradientBrush(x0,y0,x1+1,y1,cold,medium)) gc.DrawRoundedRectangle(x0,y0,x1+4,yE,6) gc.SetBrush(gc.CreateLinearGradientBrush(x1-2,y1,xE,y1,medium,hot)) gc.DrawRoundedRectangle(x1-2,y1,xE-x1,yE,6) # draw gauge width=12 w1=y0+9-width/2 w2=w1+width value=x0+max(10,min(self.width+1-2,int(self.value*self.scale))) #gc.SetBrush(gc.CreateLinearGradientBrush(x0,y0+3,x0,y0+15,gauge1,gauge2)) #gc.SetBrush(gc.CreateLinearGradientBrush(0,3,0,15,wx.Colour(255,255,255),wx.Colour(255,90,32))) gc.SetBrush(gc.CreateLinearGradientBrush(x0,y0+3,x0,y0+15,gauge1,self.interpolatedColour(value,x0,x1,xE,cold,medium,hot))) val_path = gc.CreatePath() val_path.MoveToPoint(x0,w1) val_path.AddLineToPoint(value,w1) val_path.AddLineToPoint(value+2,w1+width/4) val_path.AddLineToPoint(value+2,w2-width/4) val_path.AddLineToPoint(value,w2) #val_path.AddLineToPoint(value-4,10) val_path.AddLineToPoint(x0,w2) gc.DrawPath(val_path) # draw setpoint markers setpoint=x0+max(10,int(self.setpoint*self.scale)) gc.SetBrush(gc.CreateBrush(wx.Brush(wx.Colour(0,0,0)))) setp_path = gc.CreatePath() setp_path.MoveToPoint(setpoint-4,y0) setp_path.AddLineToPoint(setpoint+4,y0) setp_path.AddLineToPoint(setpoint,y0+5) setp_path.MoveToPoint(setpoint-4,yE) setp_path.AddLineToPoint(setpoint+4,yE) setp_path.AddLineToPoint(setpoint,yE-5) gc.DrawPath(setp_path) # draw readout text=u"T\u00B0 %u/%u"%(self.value,self.setpoint) #gc.SetFont(gc.CreateFont(wx.Font(12,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) #gc.DrawText(text,29,-2) gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) gc.DrawText(self.title,x0+19,y0+4) gc.DrawText(text, x0+119,y0+4) gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD))) gc.DrawText(self.title,x0+18,y0+3) gc.DrawText(text, x0+118,y0+3)