chiark / gitweb /
Change how the engine is interfaced from the python code. Put the GCode viewer in...
[cura.git] / Cura / gui / app.py
index ef5856e8c5bb5eed9570e3829529cf91d364cae8..47932c60c5e163b1415a7f1536cd9a15ba8af560 100644 (file)
@@ -1,4 +1,5 @@
 from __future__ import absolute_import
+__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
 
 import sys
 import os
@@ -10,17 +11,42 @@ import warnings
 #Only import the _core to save import time
 import wx._core
 
-from Cura.util import profile
 
 class CuraApp(wx.App):
-       def __init__(self):
-               if platform.system() == "Windows":
-                       super(CuraApp, self).__init__(redirect = True, filename = 'output.txt')
+       def __init__(self, files):
+               if platform.system() == "Windows" and not 'PYCHARM_HOSTED' in os.environ:
+                       super(CuraApp, self).__init__(redirect=True, filename='output.txt')
                else:
-                       super(CuraApp, self).__init__(redirect = False)
+                       super(CuraApp, self).__init__(redirect=False)
 
                self.mainWindow = None
                self.splash = None
+               self.loadFiles = files
+
+               if sys.platform.startswith('win'):
+                       #Check for an already running instance, if another instance is running load files in there
+                       from Cura.util import version
+                       from ctypes import windll
+                       import ctypes
+                       import socket
+                       import threading
+
+                       portNr = 0xCA00 + sum(map(ord, version.getVersion(False)))
+                       if len(files) > 0:
+                               try:
+                                       other_hwnd = windll.user32.FindWindowA(None, ctypes.c_char_p('Cura - ' + version.getVersion()))
+                                       if other_hwnd != 0:
+                                               sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+                                               sock.sendto('\0'.join(files), ("127.0.0.1", portNr))
+
+                                               windll.user32.SetForegroundWindow(other_hwnd)
+                                               return
+                               except:
+                                       pass
+
+                       socketListener = threading.Thread(target=self.Win32SocketListener, args=(portNr,))
+                       socketListener.daemon = True
+                       socketListener.start()
 
                if sys.platform.startswith('darwin'):
                        #Do not show a splashscreen on OSX, as by Apple guidelines
@@ -31,18 +57,50 @@ class CuraApp(wx.App):
 
        def MacOpenFile(self, path):
                try:
-                       self.mainWindow._loadModels([path])
+                       self.mainWindow.OnDropFiles([path])
                except Exception as e:
                        warnings.warn("File at {p} cannot be read: {e}".format(p=path, e=str(e)))
 
+       def Win32SocketListener(self, port):
+               import socket
+               try:
+                       sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+                       sock.bind(("127.0.0.1", port))
+                       while True:
+                               data, addr = sock.recvfrom(2048)
+                               self.mainWindow.OnDropFiles(data.split('\0'))
+               except:
+                       pass
+
        def afterSplashCallback(self):
                #These imports take most of the time and thus should be done after showing the splashscreen
+               import webbrowser
                from Cura.gui import mainWindow
                from Cura.gui import configWizard
+               from Cura.gui import newVersionDialog
+               from Cura.util import profile
+               from Cura.util import resources
+               from Cura.util import version
+
+               resources.setupLocalization(profile.getPreference('language'))  # it's important to set up localization at very beginning to install _
+
+               #If we do not have preferences yet, try to load it from a previous Cura install
+               if profile.getMachineSetting('machine_type') == 'unknown':
+                       try:
+                               otherCuraInstalls = profile.getAlternativeBasePaths()
+                               otherCuraInstalls.sort()
+                               if len(otherCuraInstalls) > 0:
+                                       profile.loadPreferences(os.path.join(otherCuraInstalls[-1], 'preferences.ini'))
+                                       profile.loadProfile(os.path.join(otherCuraInstalls[-1], 'current_profile.ini'))
+                       except:
+                               import traceback
+                               print traceback.print_exc()
 
                #If we haven't run it before, run the configuration wizard.
-               if profile.getPreference('machine_type') == 'unknown':
-                       if platform.system() == "Darwin":
+               if profile.getMachineSetting('machine_type') == 'unknown':
+                       if platform.system() == "Windows":
+                               exampleFile = os.path.normpath(os.path.join(resources.resourceBasePath, 'example', 'UltimakerRobot_support.stl'))
+                       else:
                                #Check if we need to copy our examples
                                exampleFile = os.path.expanduser('~/CuraExamples/UltimakerRobot_support.stl')
                                if not os.path.isfile(exampleFile):
@@ -50,12 +108,54 @@ class CuraApp(wx.App):
                                                os.makedirs(os.path.dirname(exampleFile))
                                        except:
                                                pass
-                                       for filename in glob.glob(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'example', '*.*'))):
+                                       for filename in glob.glob(os.path.normpath(os.path.join(resources.resourceBasePath, 'example', '*.*'))):
                                                shutil.copy(filename, os.path.join(os.path.dirname(exampleFile), os.path.basename(filename)))
-                                       profile.putPreference('lastFile', exampleFile)
+                       self.loadFiles = [exampleFile]
+                       if self.splash is not None:
+                               self.splash.Show(False)
                        configWizard.configWizard()
 
-               #Hide the splashscreen before showing the main window.
+               if profile.getPreference('check_for_updates') == 'True':
+                       newVersion = version.checkForNewerVersion()
+                       if newVersion is not None:
+                               if self.splash is not None:
+                                       self.splash.Show(False)
+                               if wx.MessageBox(_("A new version of Cura is available, would you like to download?"), _("New version available"), wx.YES_NO | wx.ICON_INFORMATION) == wx.YES:
+                                       webbrowser.open(newVersion)
+                                       return
+               if profile.getMachineSetting('machine_name') == '':
+                       return
+               self.mainWindow = mainWindow.mainWindow()
                if self.splash is not None:
                        self.splash.Show(False)
-               self.mainWindow = mainWindow.mainWindow()
+               self.mainWindow.Show()
+               self.mainWindow.OnDropFiles(self.loadFiles)
+               if profile.getPreference('last_run_version') != version.getVersion(False):
+                       profile.putPreference('last_run_version', version.getVersion(False))
+                       newVersionDialog.newVersionDialog().Show()
+
+               setFullScreenCapable(self.mainWindow)
+
+if platform.system() == "Darwin":
+       try:
+               import ctypes, objc
+               _objc = ctypes.PyDLL(objc._objc.__file__)
+
+               # PyObject *PyObjCObject_New(id objc_object, int flags, int retain)
+               _objc.PyObjCObject_New.restype = ctypes.py_object
+               _objc.PyObjCObject_New.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int]
+
+               def setFullScreenCapable(frame):
+                       frameobj = _objc.PyObjCObject_New(frame.GetHandle(), 0, 1)
+
+                       NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7
+                       window = frameobj.window()
+                       newBehavior = window.collectionBehavior() | NSWindowCollectionBehaviorFullScreenPrimary
+                       window.setCollectionBehavior_(newBehavior)
+       except:
+               def setFullScreenCapable(frame):
+                       pass
+
+else:
+       def setFullScreenCapable(frame):
+               pass