X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Cura%2Fgui%2FmainWindow.py;h=590252a53d3bc4adfbe1d1751e5894bcd36ce187;hb=6208201bafdeaf82883181471c6da3a41283cfe7;hp=657d8548f692119d08fd303188e46e7391f11836;hpb=38e1927ba2df99fe98ef97c878b694598a9482c6;p=cura.git diff --git a/Cura/gui/mainWindow.py b/Cura/gui/mainWindow.py index 657d8548..590252a5 100644 --- a/Cura/gui/mainWindow.py +++ b/Cura/gui/mainWindow.py @@ -14,6 +14,7 @@ from Cura.gui import configWizard from Cura.gui import firmwareInstall from Cura.gui import simpleMode from Cura.gui import sceneView +from Cura.gui import aboutWindow from Cura.gui.util import dropTarget #from Cura.gui.tools import batchRun from Cura.gui.tools import pidDebugger @@ -26,11 +27,10 @@ class mainWindow(wx.Frame): def __init__(self): super(mainWindow, self).__init__(None, title='Cura - ' + version.getVersion()) - self.extruderCount = int(profile.getMachineSetting('extruder_amount')) - wx.EVT_CLOSE(self, self.OnClose) - self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles, meshLoader.loadSupportedExtensions() + ['.g', '.gcode', '.ini'])) + # allow dropping any file, restrict later + self.SetDropTarget(dropTarget.FileDropTarget(self.OnDropFiles)) self.normalModeOnlyItems = [] @@ -90,14 +90,14 @@ class mainWindow(wx.Frame): # Model MRU list modelHistoryMenu = wx.Menu() - self.fileMenu.AppendMenu(wx.NewId(), _("&Recent Model Files"), modelHistoryMenu) + self.fileMenu.AppendMenu(wx.NewId(), '&' + _("Recent Model Files"), modelHistoryMenu) self.modelFileHistory.UseMenu(modelHistoryMenu) self.modelFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnModelMRU, id=self.ID_MRU_MODEL1, id2=self.ID_MRU_MODEL10) # Profle MRU list profileHistoryMenu = wx.Menu() - self.fileMenu.AppendMenu(wx.NewId(), _("&Recent Profile Files"), profileHistoryMenu) + self.fileMenu.AppendMenu(wx.NewId(), _("Recent Profile Files"), profileHistoryMenu) self.profileFileHistory.UseMenu(profileHistoryMenu) self.profileFileHistory.AddFilesToMenu() self.Bind(wx.EVT_MENU_RANGE, self.OnProfileMRU, id=self.ID_MRU_PROFILE1, id2=self.ID_MRU_PROFILE10) @@ -105,25 +105,15 @@ class mainWindow(wx.Frame): self.fileMenu.AppendSeparator() i = self.fileMenu.Append(wx.ID_EXIT, _("Quit")) self.Bind(wx.EVT_MENU, self.OnQuit, i) - self.menubar.Append(self.fileMenu, _("&File")) + self.menubar.Append(self.fileMenu, '&' + _("File")) toolsMenu = wx.Menu() - - i = toolsMenu.Append(-1, _("Switch to quickprint...")) - self.switchToQuickprintMenuItem = i - self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) - - i = toolsMenu.Append(-1, _("Switch to full settings...")) - self.switchToNormalMenuItem = i - self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) - - #toolsMenu.AppendSeparator() #i = toolsMenu.Append(-1, 'Batch run...') #self.Bind(wx.EVT_MENU, self.OnBatchRun, i) #self.normalModeOnlyItems.append(i) if minecraftImport.hasMinecraft(): - i = toolsMenu.Append(-1, _("Minecraft import...")) + i = toolsMenu.Append(-1, _("Minecraft map import...")) self.Bind(wx.EVT_MENU, self.OnMinecraftImport, i) if version.isDevVersion(): @@ -132,6 +122,17 @@ class mainWindow(wx.Frame): i = toolsMenu.Append(-1, _("Copy profile to clipboard")) self.Bind(wx.EVT_MENU, self.onCopyProfileClipboard,i) + + toolsMenu.AppendSeparator() + self.allAtOnceItem = toolsMenu.Append(-1, _("Print all at once"), kind=wx.ITEM_RADIO) + self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.allAtOnceItem) + self.oneAtATime = toolsMenu.Append(-1, _("Print one at a time"), kind=wx.ITEM_RADIO) + self.Bind(wx.EVT_MENU, self.onOneAtATimeSwitch, self.oneAtATime) + if profile.getPreference('oneAtATime') == 'True': + self.oneAtATime.Check(True) + else: + self.allAtOnceItem.Check(True) + self.menubar.Append(toolsMenu, _("Tools")) #Machine menu for machine configuration/tooling @@ -141,17 +142,25 @@ class mainWindow(wx.Frame): self.menubar.Append(self.machineMenu, _("Machine")) expertMenu = wx.Menu() - i = expertMenu.Append(-1, _("Open expert settings...")) + i = expertMenu.Append(-1, _("Switch to quickprint..."), kind=wx.ITEM_RADIO) + self.switchToQuickprintMenuItem = i + self.Bind(wx.EVT_MENU, self.OnSimpleSwitch, i) + + i = expertMenu.Append(-1, _("Switch to full settings..."), kind=wx.ITEM_RADIO) + self.switchToNormalMenuItem = i + self.Bind(wx.EVT_MENU, self.OnNormalSwitch, i) + expertMenu.AppendSeparator() + + i = expertMenu.Append(-1, _("Open expert settings...\tCTRL+E")) self.normalModeOnlyItems.append(i) self.Bind(wx.EVT_MENU, self.OnExpertOpen, i) expertMenu.AppendSeparator() i = expertMenu.Append(-1, _("Run first run wizard...")) self.Bind(wx.EVT_MENU, self.OnFirstRunWizard, i) - i = expertMenu.Append(-1, _("Run bed leveling wizard...")) - self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, i) - if self.extruderCount > 1: - i = expertMenu.Append(-1, _("Run head offset wizard...")) - self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, i) + self.bedLevelWizardMenuItem = expertMenu.Append(-1, _("Run bed leveling wizard...")) + self.Bind(wx.EVT_MENU, self.OnBedLevelWizard, self.bedLevelWizardMenuItem) + self.headOffsetWizardMenuItem = expertMenu.Append(-1, _("Run head offset wizard...")) + self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, self.headOffsetWizardMenuItem) self.menubar.Append(expertMenu, _("Expert")) @@ -247,13 +256,15 @@ class mainWindow(wx.Frame): self.Centre() self.updateSliceMode() + self.scene.SetFocus() def onTimer(self, e): #Check if there is something in the clipboard profileString = "" try: if not wx.TheClipboard.IsOpened(): - wx.TheClipboard.Open() + if not wx.TheClipboard.Open(): + return do = wx.TextDataObject() if wx.TheClipboard.GetData(do): profileString = do.GetText() @@ -283,8 +294,10 @@ class mainWindow(wx.Frame): for i in self.normalModeOnlyItems: i.Enable(not isSimple) - self.switchToQuickprintMenuItem.Enable(not isSimple) - self.switchToNormalMenuItem.Enable(isSimple) + if isSimple: + self.switchToQuickprintMenuItem.Check() + else: + self.switchToNormalMenuItem.Check() # Set splitter sash position & size if isSimple: @@ -301,17 +314,33 @@ class mainWindow(wx.Frame): self.splitter.SetSashPosition(self.normalSashPos, True) # Enabled sash self.splitter.SetSashSize(4) + self.defaultFirmwareInstallMenuItem.Enable(firmwareInstall.getDefaultFirmware() is not None) + if profile.getMachineSetting('machine_type') == 'ultimaker2': + self.bedLevelWizardMenuItem.Enable(False) + self.headOffsetWizardMenuItem.Enable(False) + if int(profile.getMachineSetting('extruder_amount')) < 2: + self.headOffsetWizardMenuItem.Enable(False) self.scene.updateProfileToControls() + def onOneAtATimeSwitch(self, e): + profile.putPreference('oneAtATime', self.oneAtATime.IsChecked()) + if self.oneAtATime.IsChecked() and profile.getMachineSettingFloat('extruder_head_size_height') < 1: + wx.MessageBox(_('For "One at a time" printing, you need to have entered the correct head size and gantry height in the machine settings'), _('One at a time warning'), wx.OK | wx.ICON_WARNING) + self.scene.updateProfileToControls() + self.scene.sceneUpdated() + def OnPreferences(self, e): prefDialog = preferencesDialog.preferencesDialog(self) prefDialog.Centre() prefDialog.Show() + prefDialog.Raise() + wx.CallAfter(prefDialog.Show) def OnMachineSettings(self, e): prefDialog = preferencesDialog.machineSettingsDialog(self) prefDialog.Centre() prefDialog.Show() + prefDialog.Raise() def OnDropFiles(self, files): if len(files) > 0: @@ -380,21 +409,24 @@ class mainWindow(wx.Frame): #Add a menu item for each machine configuration. for n in xrange(0, profile.getMachineCount()): - i = self.machineMenu.Append(n, profile.getMachineSetting('machine_name', n).title(), kind=wx.ITEM_RADIO) + i = self.machineMenu.Append(n + 0x1000, profile.getMachineSetting('machine_name', n).title(), kind=wx.ITEM_RADIO) if n == int(profile.getPreferenceFloat('active_machine')): i.Check(True) - self.Bind(wx.EVT_MENU, lambda e: self.OnSelectMachine(e.GetId()), i) + self.Bind(wx.EVT_MENU, lambda e: self.OnSelectMachine(e.GetId() - 0x1000), i) self.machineMenu.AppendSeparator() - i = self.machineMenu.Append(-1, _("Add new machine...")) - self.Bind(wx.EVT_MENU, self.OnAddNewMachine, i) + + i = self.machineMenu.Append(-1, _("Machine settings...")) + self.Bind(wx.EVT_MENU, self.OnMachineSettings, i) #Add tools for machines. self.machineMenu.AppendSeparator() - i = self.machineMenu.Append(-1, _("Install custom firmware")) + + self.defaultFirmwareInstallMenuItem = self.machineMenu.Append(-1, _("Install default firmware...")) + self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, self.defaultFirmwareInstallMenuItem) + + i = self.machineMenu.Append(-1, _("Install custom firmware...")) self.Bind(wx.EVT_MENU, self.OnCustomFirmware, i) - i = self.machineMenu.Append(-1, _("Install default Marlin firmware")) - self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, i) def OnLoadProfile(self, e): dlg=wx.FileDialog(self, _("Select profile file to load"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) @@ -470,14 +502,6 @@ class mainWindow(wx.Frame): self.Show() self.reloadSettingPanels() - def OnAddNewMachine(self, e): - self.Hide() - profile.setActiveMachine(profile.getMachineCount()) - configWizard.configWizard(True) - self.Show() - self.reloadSettingPanels() - self.updateMachineMenu() - def OnSelectMachine(self, index): profile.setActiveMachine(index) self.reloadSettingPanels() @@ -525,31 +549,9 @@ class mainWindow(wx.Frame): wx.MessageBox(_("You are running the latest version of Cura!"), _("Awesome!"), wx.ICON_INFORMATION) def OnAbout(self, e): - info = wx.AboutDialogInfo() - info.SetName("Cura") - info.SetDescription(""" -End solution for Open Source Fused Filament Fabrication 3D printing. -* Cura is the graphical User Interface. -* CuraEngine is the slicer/gcode generator. -Cura and the CuraEngine are licensed AGPLv3. - """) - info.SetWebSite('http://software.ultimaker.com/') - info.SetCopyright(_("Copyright (C) David Braam")) - info.SetLicence(""" - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -""") - wx.AboutBox(info) + aboutBox = aboutWindow.aboutWindow() + aboutBox.Centre() + aboutBox.Show() def OnClose(self, e): profile.saveProfile(profile.getDefaultProfilePath()) @@ -573,7 +575,7 @@ Cura and the CuraEngine are licensed AGPLv3. #HACK: Set the paint function of the glCanvas to nothing so it won't keep refreshing. Which can keep wxWidgets from quiting. print "Closing down" self.scene.OnPaint = lambda e : e - self.scene._slicer.cleanup() + self.scene._engine.cleanup() self.Destroy() def OnQuit(self, e): @@ -599,10 +601,7 @@ class normalSettingsPanel(configBase.configPanelBase): #Plugin page self.pluginPanel = pluginPanel.pluginPanel(self.nb, callback) - if len(self.pluginPanel.pluginList) > 0: - self.nb.AddPage(self.pluginPanel, _("Plugins")) - else: - self.pluginPanel.Show(False) + self.nb.AddPage(self.pluginPanel, _("Plugins")) #Alteration page if profile.getMachineSetting('gcode_flavor') == 'UltiGCode': @@ -626,7 +625,7 @@ class normalSettingsPanel(configBase.configPanelBase): n += 1 + len(profile.getSettingsForCategory(category, title)) if n > count / 2: p = right - configBase.TitleRow(p, title) + configBase.TitleRow(p, _(title)) for s in profile.getSettingsForCategory(category, title): configBase.SettingRow(p, s.getName())