mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-20 12:49:38 +08:00
Initial basic version of this feature.
CURA-3335
This commit is contained in:
parent
9cf0fdc4a3
commit
0e306df1bc
@ -1,5 +1,9 @@
|
|||||||
# Copyright (c) 2015 Ultimaker B.V.
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the AGPLv3 or higher.
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
import json
|
||||||
|
|
||||||
|
from PyQt5.QtCore import QTextStream
|
||||||
|
from PyQt5.QtNetwork import QLocalServer
|
||||||
|
|
||||||
from UM.Qt.QtApplication import QtApplication
|
from UM.Qt.QtApplication import QtApplication
|
||||||
from UM.Scene.SceneNode import SceneNode
|
from UM.Scene.SceneNode import SceneNode
|
||||||
@ -420,13 +424,44 @@ class CuraApplication(QtApplication):
|
|||||||
|
|
||||||
self._plugins_loaded = True
|
self._plugins_loaded = True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
def addCommandLineOptions(self, parser):
|
def addCommandLineOptions(self, parser):
|
||||||
super().addCommandLineOptions(parser)
|
super().addCommandLineOptions(parser)
|
||||||
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
|
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
|
||||||
|
parser.add_argument("--single-instance", action="store_true", default=False)
|
||||||
|
|
||||||
|
def _setUpSingleInstanceServer(self):
|
||||||
|
if self.getCommandLineOption("single_instance", False):
|
||||||
|
self.__single_instance_server = QLocalServer()
|
||||||
|
self.__single_instance_server.newConnection.connect(self._singleInstanceServerNewConnection)
|
||||||
|
self.__single_instance_server.listen("ultimaker-cura")
|
||||||
|
|
||||||
|
def _singleInstanceServerNewConnection(self):
|
||||||
|
Logger.log('d', 'Saw something on the single instance server')
|
||||||
|
other_cura_connection = self.__single_instance_server.nextPendingConnection()
|
||||||
|
if other_cura_connection is not None:
|
||||||
|
def readyRead():
|
||||||
|
while other_cura_connection.canReadLine():
|
||||||
|
line = other_cura_connection.readLine()
|
||||||
|
payload = json.loads(str(line, encoding="ASCII").strip())
|
||||||
|
command = payload["command"]
|
||||||
|
if command == "clear-all":
|
||||||
|
self.deleteAll()
|
||||||
|
|
||||||
|
elif command == "open":
|
||||||
|
self.deleteAll()
|
||||||
|
self._openFile(payload["filePath"])
|
||||||
|
|
||||||
|
elif command == "focus":
|
||||||
|
self.focusWindow()
|
||||||
|
|
||||||
|
other_cura_connection.readyRead.connect(readyRead)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene..."))
|
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene..."))
|
||||||
|
|
||||||
|
self._setUpSingleInstanceServer()
|
||||||
|
|
||||||
controller = self.getController()
|
controller = self.getController()
|
||||||
|
|
||||||
controller.setActiveView("SolidView")
|
controller.setActiveView("SolidView")
|
||||||
|
36
cura_app.py
36
cura_app.py
@ -2,11 +2,14 @@
|
|||||||
|
|
||||||
# Copyright (c) 2015 Ultimaker B.V.
|
# Copyright (c) 2015 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the AGPLv3 or higher.
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import platform
|
import platform
|
||||||
|
import time
|
||||||
|
|
||||||
|
from PyQt5.QtNetwork import QLocalSocket
|
||||||
from UM.Platform import Platform
|
from UM.Platform import Platform
|
||||||
|
|
||||||
#WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612
|
#WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612
|
||||||
@ -58,5 +61,36 @@ if Platform.isWindows() and hasattr(sys, "frozen"):
|
|||||||
# Force an instance of CuraContainerRegistry to be created and reused later.
|
# Force an instance of CuraContainerRegistry to be created and reused later.
|
||||||
cura.Settings.CuraContainerRegistry.getInstance()
|
cura.Settings.CuraContainerRegistry.getInstance()
|
||||||
|
|
||||||
|
# Peek the arguments and look for the 'single-instance' flag.
|
||||||
|
parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace
|
||||||
|
cura.CuraApplication.CuraApplication.addCommandLineOptions(parser)
|
||||||
|
parsed_command_line = vars(parser.parse_args())
|
||||||
|
|
||||||
|
if "single_instance" in parsed_command_line and parsed_command_line["single_instance"]:
|
||||||
|
print("Check for single instance")
|
||||||
|
single_instance_socket = QLocalSocket()
|
||||||
|
single_instance_socket.connectToServer("ultimaker-cura")
|
||||||
|
single_instance_socket.waitForConnected()
|
||||||
|
if single_instance_socket.state() == QLocalSocket.ConnectedState:
|
||||||
|
print("Connected to the other Cura instance.")
|
||||||
|
print(repr(parsed_command_line))
|
||||||
|
|
||||||
|
payload = {"command": "clear-all"}
|
||||||
|
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII"))
|
||||||
|
|
||||||
|
payload = {"command": "focus"}
|
||||||
|
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII"))
|
||||||
|
|
||||||
|
if len(parsed_command_line["file"]) != 0:
|
||||||
|
for filename in parsed_command_line["file"]:
|
||||||
|
payload = { "command": "open", "filePath": filename }
|
||||||
|
single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII"))
|
||||||
|
|
||||||
|
single_instance_socket.flush()
|
||||||
|
|
||||||
|
|
||||||
|
single_instance_socket.close()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
app = cura.CuraApplication.CuraApplication.getInstance()
|
app = cura.CuraApplication.CuraApplication.getInstance()
|
||||||
app.run()
|
app.run()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user