chiark / gitweb /
Some small changes suggested by ErikDeBruijn
[cura.git] / Cura / gui / mainWindow.py
index 4edb45dec192c0f376e44bd5110990b84ee980fe..9321d653e9ec572943e9c714722d7e5258229210 100644 (file)
@@ -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
@@ -30,7 +31,8 @@ class mainWindow(wx.Frame):
 
                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 +92,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 +107,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():
@@ -134,17 +126,26 @@ class mainWindow(wx.Frame):
                self.Bind(wx.EVT_MENU, self.onCopyProfileClipboard,i)
                self.menubar.Append(toolsMenu, _("Tools"))
 
+               #Machine menu for machine configuration/tooling
+               self.machineMenu = wx.Menu()
+               self.updateMachineMenu()
+
+               self.menubar.Append(self.machineMenu, _("Machine"))
+
                expertMenu = wx.Menu()
+               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..."))
                self.normalModeOnlyItems.append(i)
                self.Bind(wx.EVT_MENU, self.OnExpertOpen, i)
                expertMenu.AppendSeparator()
-               if firmwareInstall.getDefaultFirmware() is not None:
-                       i = expertMenu.Append(-1, _("Install default Marlin firmware"))
-                       self.Bind(wx.EVT_MENU, self.OnDefaultMarlinFirmware, i)
-               i = expertMenu.Append(-1, _("Install custom firmware"))
-               self.Bind(wx.EVT_MENU, self.OnCustomFirmware, 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..."))
@@ -153,9 +154,6 @@ class mainWindow(wx.Frame):
                        i = expertMenu.Append(-1, _("Run head offset wizard..."))
                        self.Bind(wx.EVT_MENU, self.OnHeadOffsetWizard, i)
 
-               i = expertMenu.Append(-1, _("Add new machine..."))
-               self.Bind(wx.EVT_MENU, self.OnAddNewMachine, i)
-
                self.menubar.Append(expertMenu, _("Expert"))
 
                helpMenu = wx.Menu()
@@ -262,14 +260,16 @@ class mainWindow(wx.Frame):
                                        profileString = do.GetText()
                                wx.TheClipboard.Close()
 
-                               if "CURA_PROFILE_STRING:" in profileString:
+                               startTag = "CURA_PROFILE_STRING:"
+                               if startTag in profileString:
                                        #print "Found correct syntax on clipboard"
-                                       profileString = profileString.replace("\n","")
-                                       profileString = profileString.replace("CURA_PROFILE_STRING:", "")
+                                       profileString = profileString.replace("\n","").strip()
+                                       profileString = profileString[profileString.find(startTag)+len(startTag):]
                                        if profileString != self.lastTriedClipboard:
+                                               print profileString
                                                self.lastTriedClipboard = profileString
                                                profile.setProfileFromString(profileString)
-                                               print "changed profile"
+                                               self.scene.notification.message("Loaded new profile from clipboard.")
                                                self.updateProfileToAllControls()
                except:
                        print "Unable to read from clipboard"
@@ -284,8 +284,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:
@@ -308,6 +310,7 @@ class mainWindow(wx.Frame):
                prefDialog = preferencesDialog.preferencesDialog(self)
                prefDialog.Centre()
                prefDialog.Show()
+               wx.CallAfter(prefDialog.Show)
 
        def OnMachineSettings(self, e):
                prefDialog = preferencesDialog.machineSettingsDialog(self)
@@ -374,6 +377,29 @@ class mainWindow(wx.Frame):
                self.updateSliceMode()
                self.updateProfileToAllControls()
 
+       def updateMachineMenu(self):
+               #Remove all items so we can rebuild the menu. Inserting items seems to cause crashes, so this is the safest way.
+               for item in self.machineMenu.GetMenuItems():
+                       self.machineMenu.RemoveItem(item)
+
+               #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)
+                       if n == int(profile.getPreferenceFloat('active_machine')):
+                               i.Check(True)
+                       self.Bind(wx.EVT_MENU, lambda e: self.OnSelectMachine(e.GetId()), i)
+
+               self.machineMenu.AppendSeparator()
+               i = self.machineMenu.Append(-1, _("Add new machine..."))
+               self.Bind(wx.EVT_MENU, self.OnAddNewMachine, i)
+
+               #Add tools for machines.
+               self.machineMenu.AppendSeparator()
+               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)
                dlg.SetWildcard("ini files (*.ini)|*.ini")
@@ -454,6 +480,11 @@ class mainWindow(wx.Frame):
                configWizard.configWizard(True)
                self.Show()
                self.reloadSettingPanels()
+               self.updateMachineMenu()
+
+       def OnSelectMachine(self, index):
+               profile.setActiveMachine(index)
+               self.reloadSettingPanels()
 
        def OnBedLevelWizard(self, e):
                configWizard.bedLevelWizard()
@@ -498,26 +529,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."))
-               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 <http://www.gnu.org/licenses/>.
-""")
-               wx.AboutBox(info)
+               aboutBox = aboutWindow.aboutWindow()
+               aboutBox.Centre()
+               aboutBox.Show()
 
        def OnClose(self, e):
                profile.saveProfile(profile.getDefaultProfilePath())
@@ -538,7 +552,7 @@ class mainWindow(wx.Frame):
                                self.normalSashPos = self.splitter.GetSashPosition()
                        profile.putPreference('window_normal_sash', self.normalSashPos)
 
-               #HACK: Set the paint function of the glCanvas to nothing so it won't keep refreshing. Which keeps wxWidgets from quiting.
+               #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()
@@ -594,7 +608,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())