chiark / gitweb /
Remove extra comma at the end of the print window title when in error state
[cura.git] / Cura / gui / printWindow.py
index 077c5a2aaedcf35f00dc5fc8e2994d70747e6ab3..a50e06db38dd6ed8283a52e27fc73ca9177836e9 100644 (file)
@@ -1,6 +1,7 @@
 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
 
 import wx
+from wx.lib.intctrl import IntCtrl
 import power
 import time
 import sys
@@ -36,15 +37,17 @@ elif sys.platform.startswith('darwin'):
        frameworkPath=objc.pathForFramework("/System/Library/Frameworks/IOKit.framework"),
        globals=globals())
        objc.loadBundleFunctions(bundle, globals(), [("IOPMAssertionCreateWithName", b"i@I@o^I")])
+       objc.loadBundleFunctions(bundle, globals(), [("IOPMAssertionRelease", b"iI")])
        def preventComputerFromSleeping(frame, prevent):
                if prevent:
                        success, preventComputerFromSleeping.assertionID = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, "Cura is printing", None)
                        if success != kIOReturnSuccess:
                                preventComputerFromSleeping.assertionID = None
                else:
-                       if preventComputerFromSleeping.assertionID is not None:
-                               IOPMAssertionRelease(preventComputerFromSleeping.assertionID)
-                               preventComputerFromSleeping.assertionID = None
+                       if hasattr(preventComputerFromSleeping, "assertionID"):
+                               if preventComputerFromSleeping.assertionID is not None:
+                                       IOPMAssertionRelease(preventComputerFromSleeping.assertionID)
+                                       preventComputerFromSleeping.assertionID = None
 else:
        def preventComputerFromSleeping(frame, prevent):
                if os.path.isfile("/usr/bin/xdg-screensaver"):
@@ -400,7 +403,7 @@ class printWindowPlugin(wx.Frame):
                if self._infoText is not None:
                        self._infoText.SetLabel(info)
                else:
-                       self.SetTitle(info.replace('\n', ', '))
+                       self.SetTitle(info.replace('\n', ', ').strip().strip(','))
                if isPrinting != self._isPrinting:
                        self._isPrinting = isPrinting
                        preventComputerFromSleeping(self, self._isPrinting)
@@ -575,12 +578,19 @@ class printWindowAdvanced(wx.Frame):
                self._lastUpdateTime = time.time()
                self._isPrinting = False
 
-               self.SetSizer(wx.BoxSizer())
+               self.SetSizer(wx.BoxSizer(wx.VERTICAL))
+               self.toppanel = wx.Panel(self)
+               self.topsizer = wx.GridBagSizer(2, 2)
+               self.toppanel.SetSizer(self.topsizer)
+               self.toppanel.SetBackgroundColour(wx.WHITE)
+               self.topsizer.SetEmptyCellSize((125, 1))
                self.panel = wx.Panel(self)
-               self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)
                self.sizer = wx.GridBagSizer(2, 2)
+               self.sizer.SetEmptyCellSize((125, 1))
                self.panel.SetSizer(self.sizer)
                self.panel.SetBackgroundColour(wx.WHITE)
+               self.GetSizer().Add(self.toppanel, 0, flag=wx.EXPAND)
+               self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)
 
                self._fullscreenTemperature = None
                self._termHistory = []
@@ -627,7 +637,7 @@ class printWindowAdvanced(wx.Frame):
                self._addMovementCommand(220, 255, 0, self._homeXYZ, "Y")
                self._addMovementCommand(200, 255, 0, self._homeXYZ, "Z")
 
-               self.powerWarningText = wx.StaticText(parent=self.panel,
+               self.powerWarningText = wx.StaticText(parent=self.toppanel,
                        id=-1,
                        label=_("Your computer is running on battery power.\nConnect your computer to AC power or your print might not finish."),
                        style=wx.ALIGN_CENTER)
@@ -637,54 +647,56 @@ class printWindowAdvanced(wx.Frame):
                self.powerWarningTimer = wx.Timer(self)
                self.Bind(wx.EVT_TIMER, self.OnPowerWarningChange, self.powerWarningTimer)
                self.OnPowerWarningChange(None)
-               self.powerWarningTimer.Start(1000)
+               self.powerWarningTimer.Start(10000)
 
-               self.connectButton = wx.Button(self.panel, -1, _("Connect"), size=(125, 30))
-               self.printButton = wx.Button(self.panel, -1, _("Print"), size=(125, 30))
-               self.cancelButton = wx.Button(self.panel, -1, _("Cancel"), size=(125, 30))
-               self.errorLogButton = wx.Button(self.panel, -1, _("Error log"), size=(125, 30))
-               self.motorsOffButton = wx.Button(self.panel, -1, _("Motors off"), size=(125, 30))
+               self.connectButton = wx.Button(self.toppanel, -1, _("Connect"), size=(125, 30))
+               self.printButton = wx.Button(self.toppanel, -1, _("Print"), size=(125, 30))
+               self.cancelButton = wx.Button(self.toppanel, -1, _("Cancel"), size=(125, 30))
+               self.errorLogButton = wx.Button(self.toppanel, -1, _("Error log"), size=(125, 30))
+               self.motorsOffButton = wx.Button(self.toppanel, -1, _("Motors off"), size=(125, 30))
                self.movementBitmap = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(wx.Image(
                                resources.getPathForImage('print-window.png'))), (0, 0))
                self.temperatureBitmap = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(wx.Image(
                                resources.getPathForImage('print-window-temperature.png'))), (0, 0))
-               self.temperatureField = TemperatureField(self.panel)
+               self.temperatureField = TemperatureField(self.panel, self._setHotendTemperature)
                self.temperatureBedBitmap = wx.StaticBitmap(self.panel, -1, wx.BitmapFromImage(wx.Image(
                                resources.getPathForImage('print-window-temperature-bed.png'))), (0, 0))
-               self.temperatureBedField = TemperatureField(self.panel)
+               self.temperatureBedField = TemperatureField(self.panel, self._setBedTemperature)
                self.temperatureGraph = TemperatureGraph(self.panel)
+               self.temperatureGraph.SetMinSize((250, 100))
                self.progress = wx.Gauge(self.panel, -1, range=1000)
 
                f = wx.Font(8, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
-               self._termLog = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE | wx.TE_DONTWRAP)
+               self._termLog = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE)
                self._termLog.SetFont(f)
                self._termLog.SetEditable(0)
+               self._termLog.SetMinSize((385, -1))
                self._termInput = wx.TextCtrl(self.panel, style=wx.TE_PROCESS_ENTER)
                self._termInput.SetFont(f)
 
                self.Bind(wx.EVT_TEXT_ENTER, self.OnTermEnterLine, self._termInput)
                self._termInput.Bind(wx.EVT_CHAR, self.OnTermKey)
 
-               self.sizer.Add(self.powerWarningText, pos=(0, 0), span=(1, 6), flag=wx.EXPAND|wx.BOTTOM, border=5)
-               self.sizer.Add(self.connectButton, pos=(1, 0), flag=wx.LEFT, border=2)
-               self.sizer.Add(self.printButton, pos=(1, 1), flag=wx.LEFT, border=2)
-               self.sizer.Add(self.cancelButton, pos=(1, 2), flag=wx.LEFT, border=2)
-               self.sizer.Add(self.errorLogButton, pos=(1, 4), flag=wx.LEFT, border=2)
-               self.sizer.Add(self.motorsOffButton, pos=(1, 5), flag=wx.LEFT|wx.RIGHT, border=2)
-               self.sizer.Add(self.movementBitmap, pos=(2, 0), span=(2, 3))
-               self.sizer.Add(self.temperatureGraph, pos=(4, 0), span=(4, 2), flag=wx.EXPAND)
-               self.sizer.Add(self.temperatureBitmap, pos=(4, 2), span=(1, 1), flag=wx.EXPAND)
-               self.sizer.Add(self.temperatureField, pos=(5, 2), span=(1, 1), flag=wx.EXPAND)
-               self.sizer.Add(self.temperatureBedBitmap, pos=(6, 2), span=(1, 1), flag=wx.EXPAND)
-               self.sizer.Add(self.temperatureBedField, pos=(7, 2), span=(1, 1), flag=wx.EXPAND)
-               self.sizer.Add(self._termLog, pos=(2, 3), span=(5, 3), flag=wx.EXPAND)
-               self.sizer.Add(self._termInput, pos=(7, 3), span=(1, 3), flag=wx.EXPAND)
-               self.sizer.Add(self.progress, pos=(8, 0), span=(1, 6), flag=wx.EXPAND|wx.BOTTOM)
+               self.topsizer.Add(self.powerWarningText, pos=(0, 0), span=(1, 6), flag=wx.EXPAND|wx.BOTTOM, border=5)
+               self.topsizer.Add(self.connectButton, pos=(1, 0), flag=wx.LEFT, border=2)
+               self.topsizer.Add(self.printButton, pos=(1, 1), flag=wx.LEFT, border=2)
+               self.topsizer.Add(self.cancelButton, pos=(1, 2), flag=wx.LEFT, border=2)
+               self.topsizer.Add(self.errorLogButton, pos=(1, 4), flag=wx.LEFT, border=2)
+               self.topsizer.Add(self.motorsOffButton, pos=(1, 5), flag=wx.LEFT|wx.RIGHT, border=2)
+               self.sizer.Add(self.movementBitmap, pos=(0, 0), span=(2, 3))
+               self.sizer.Add(self.temperatureGraph, pos=(2, 0), span=(4, 2), flag=wx.EXPAND)
+               self.sizer.Add(self.temperatureBitmap, pos=(2, 2))
+               self.sizer.Add(self.temperatureField, pos=(3, 2))
+               self.sizer.Add(self.temperatureBedBitmap, pos=(4, 2))
+               self.sizer.Add(self.temperatureBedField, pos=(5, 2))
+               self.sizer.Add(self._termLog, pos=(0, 3), span=(5, 3), flag=wx.EXPAND|wx.RIGHT, border=5)
+               self.sizer.Add(self._termInput, pos=(5, 3), span=(1, 3), flag=wx.EXPAND|wx.RIGHT, border=5)
+               self.sizer.Add(self.progress, pos=(6, 0), span=(1, 6), flag=wx.EXPAND|wx.BOTTOM)
 
                self.Bind(wx.EVT_SIZE, self.OnSize)
                self.Bind(wx.EVT_CLOSE, self.OnClose)
                self.movementBitmap.Bind(wx.EVT_LEFT_DOWN, self.OnMovementClick)
-               self.temperatureGraph.Bind(wx.EVT_LEFT_DOWN, self.OnTemperatureClick)
+               self.temperatureGraph.Bind(wx.EVT_LEFT_UP, self.OnTemperatureClick)
                self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect)
                self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)
                self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
@@ -708,6 +720,7 @@ class printWindowAdvanced(wx.Frame):
                # will be bigger than it should be until a power warning change
                self.Layout()
                self.Fit()
+               e.Skip()
 
        def OnClose(self, e):
                if self._printerConnection.hasActiveConnection():
@@ -724,38 +737,17 @@ class printWindowAdvanced(wx.Frame):
                type = self.powerManagement.get_providing_power_source_type()
                if type == power.POWER_TYPE_AC and self.powerWarningText.IsShown():
                        self.powerWarningText.Hide()
-                       self.panel.Layout()
+                       self.toppanel.Layout()
                        self.Layout()
                        self.Fit()
                        self.Refresh()
                elif type != power.POWER_TYPE_AC and not self.powerWarningText.IsShown():
                        self.powerWarningText.Show()
-                       self.panel.Layout()
+                       self.toppanel.Layout()
                        self.Layout()
                        self.Fit()
                        self.Refresh()
 
-       def script_addTextButton(self, r_text, g_text, b_text, r_button, g_button, b_button, button_text, command, data):
-               x_text, y_text, w_text, h_text = self._getColoredRect(r_text, g_text, b_text)
-               if x_text < 0:
-                       return
-               x_button, y_button, w_button, h_button = self._getColoredRect(r_button, g_button, b_button)
-               if x_button < 0:
-                       return
-               from wx.lib.intctrl import IntCtrl
-               text = IntCtrl(self, -1)
-               text.SetBounds(0, 300)
-               text.SetPosition((x_text, y_text))
-               text.SetSize((w_text, h_text))
-
-               button = wx.Button(self, -1, _(button_text))
-               button.SetPosition((x_button, y_button))
-               button.SetSize((w_button, h_button))
-               button.command = command
-               button.data = data
-               self._buttonList.append(button)
-               self.Bind(wx.EVT_BUTTON, lambda e: command(data % text.GetValue()), button)
-
        def OnConnect(self, e):
                self._printerConnection.openActiveConnection()
 
@@ -790,9 +782,10 @@ class printWindowAdvanced(wx.Frame):
                self._colorCommandMap[(r, g, b)] = (command, step)
 
        def _moveXYZE(self, motor, step, feedrate):
+               # Prevent Z movement when paused and all moves when printing
                if (not self._printerConnection.hasActiveConnection() or \
                        self._printerConnection.isActiveConnectionOpen()) and \
-                       (not self._printerConnection.isPaused() and \
+                       (not (self._printerConnection.isPaused() and motor == 'Z') and \
                         not self._printerConnection.isPrinting()):
                        self._printerConnection.sendCommand("G91")
                        self._printerConnection.sendCommand("G1 %s%.1f F%d" % (motor, step, feedrate))
@@ -836,7 +829,8 @@ class printWindowAdvanced(wx.Frame):
                        self.panel.Show(True)
                else:
                        self._fullscreenTemperature = self.temperatureGraph.Clone(self)
-                       self._fullscreenTemperature.Bind(wx.EVT_LEFT_DOWN, self.OnTemperatureClick)
+                       self._fullscreenTemperature.Bind(wx.EVT_LEFT_UP, self.OnTemperatureClick)
+                       self._fullscreenTemperature.SetMinSize(self.panel.GetSize())
                        sizer.Add(self._fullscreenTemperature, 1, flag=wx.EXPAND)
                        self.panel.Show(False)
                self.Layout()
@@ -909,6 +903,7 @@ class printWindowAdvanced(wx.Frame):
                        self.cancelButton.Enable(False)
                self.errorLogButton.Show(self._printerConnection.isInErrorState())
                self._termInput.Enable(self._printerConnection.isAbleToSendDirectCommand())
+               self.Layout()
 
        def _doPrinterConnectionUpdate(self, connection, extraInfo = None):
                wx.CallAfter(self.__doPrinterConnectionUpdate, connection, extraInfo)
@@ -944,7 +939,7 @@ class printWindowAdvanced(wx.Frame):
                        info += 'Temperature: %d' % (self._printerConnection.getTemperature(0))
                if self._printerConnection.getBedTemperature() > 0:
                        info += ' Bed: %d' % (self._printerConnection.getBedTemperature())
-               self.SetTitle(info.replace('\n', ', '))
+               self.SetTitle(info.replace('\n', ', ').strip().strip(','))
                if isPrinting != self._isPrinting:
                        self._isPrinting = isPrinting
                        preventComputerFromSleeping(self, self._isPrinting)
@@ -953,20 +948,24 @@ class TemperatureField(wx.Panel):
        def __init__(self, parent, callback):
                super(TemperatureField, self).__init__(parent)
                self.callback = callback
-               
+
                self.SetBackgroundColour(wx.WHITE)
-               self.sizer = wx.BoxSizer()
-               self.SetSizer(self.sizer)
-               self.sizer.SetOrientation(wx.HORIZONTAL)
 
                self.text = IntCtrl(self, -1)
                self.text.SetBounds(0, 300)
-               self.sizer.Add(self.text, 1, flag=wx.EXPAND)
+               self.text.SetSize((60, 28))
+
+               self.unit = wx.StaticBitmap(self, -1, wx.BitmapFromImage(wx.Image(
+                               resources.getPathForImage('print-window-temperature-unit.png'))), (0, 0))
 
                self.button = wx.Button(self, -1, _("Set"))
-               self.sizer.Add(self.button, 0)
+               self.button.SetSize((35, 25))
                self.Bind(wx.EVT_BUTTON, lambda e: self.callback(self.text.GetValue()), self.button)
 
+               self.text.SetPosition((0, 0))
+               self.unit.SetPosition((60, 0))
+               self.button.SetPosition((90, 0))
+
 
 class TemperatureGraph(wx.Panel):
        def __init__(self, parent):
@@ -1004,6 +1003,7 @@ class TemperatureGraph(wx.Panel):
                self._lastDraw = now
                dc = wx.MemoryDC()
                dc.SelectObject(self._backBuffer)
+               dc.SetBackground(wx.Brush(wx.WHITE))
                dc.Clear()
                dc.SetFont(wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT))
                w, h = self.GetSizeTuple()