mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-10-05 22:48:11 +08:00
windows fixes (#767)
This commit is contained in:
@@ -11,10 +11,6 @@ WindowUtils = cef.WindowUtils()
|
|||||||
# OS differences
|
# OS differences
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
CefWidgetParent = QWidget
|
CefWidgetParent = QWidget
|
||||||
if LINUX:
|
|
||||||
# noinspection PyUnresolvedReferences
|
|
||||||
CefWidgetParent = QX11EmbedContainer
|
|
||||||
|
|
||||||
|
|
||||||
class CefWidget(CefWidgetParent):
|
class CefWidget(CefWidgetParent):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
|||||||
+19
-7
@@ -1,11 +1,13 @@
|
|||||||
# flake8: noqa F403, F405
|
# flake8: noqa F403, F405
|
||||||
from functools import partialmethod
|
from functools import partialmethod
|
||||||
from multiprocessing import Pipe, Process
|
from multiprocessing import Pipe, Process
|
||||||
from os.path import splitext, basename
|
from os import environ
|
||||||
|
from os.path import splitext, basename, dirname, join
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
from cefpython3 import cefpython as cef
|
from cefpython3 import cefpython as cef
|
||||||
|
import PySide2
|
||||||
from PySide2.QtCore import *
|
from PySide2.QtCore import *
|
||||||
from PySide2.QtWidgets import *
|
from PySide2.QtWidgets import *
|
||||||
|
|
||||||
@@ -15,12 +17,18 @@ from server.gui.utils import WINDOWS, LINUX, MAC, FileLoadSignals, Emitter, Work
|
|||||||
from server.utils.constants import MODES
|
from server.utils.constants import MODES
|
||||||
from server.utils.utils import find_available_port
|
from server.utils.utils import find_available_port
|
||||||
|
|
||||||
|
if WINDOWS or LINUX:
|
||||||
|
dirname = dirname(PySide2.__file__)
|
||||||
|
plugin_path = join(dirname, 'plugins', 'platforms')
|
||||||
|
environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
# TODO remember this or calculate it?
|
# TODO remember this or calculate it?
|
||||||
WIDTH = 1024
|
WIDTH = 1024
|
||||||
HEIGHT = 768
|
HEIGHT = 768
|
||||||
GUI_PORT = find_available_port("localhost")
|
GUI_PORT = find_available_port("localhost")
|
||||||
|
BROWSER_INDEX = 0
|
||||||
|
LOAD_INDEX = 1
|
||||||
|
|
||||||
class MainWindow(QMainWindow):
|
class MainWindow(QMainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -39,6 +47,8 @@ class MainWindow(QMainWindow):
|
|||||||
self.setupLayout()
|
self.setupLayout()
|
||||||
self.setupMenu()
|
self.setupMenu()
|
||||||
|
|
||||||
|
def showBrowser(self):
|
||||||
|
self.stacked_layout.setCurrentIndex(BROWSER_INDEX)
|
||||||
def restartOnError(self):
|
def restartOnError(self):
|
||||||
self.window().shutdownServer()
|
self.window().shutdownServer()
|
||||||
# close emitter on error/finished
|
# close emitter on error/finished
|
||||||
@@ -51,10 +61,11 @@ class MainWindow(QMainWindow):
|
|||||||
def setupLayout(self):
|
def setupLayout(self):
|
||||||
self.resize(WIDTH, HEIGHT)
|
self.resize(WIDTH, HEIGHT)
|
||||||
self.cef_widget = CefWidget(self)
|
self.cef_widget = CefWidget(self)
|
||||||
|
self.cef_widget.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding))
|
||||||
self.data_widget = LoadWidget(self)
|
self.data_widget = LoadWidget(self)
|
||||||
self.stacked_layout = QStackedLayout()
|
self.stacked_layout = QStackedLayout()
|
||||||
self.stacked_layout.addWidget(self.data_widget)
|
|
||||||
self.stacked_layout.addWidget(self.cef_widget)
|
self.stacked_layout.addWidget(self.cef_widget)
|
||||||
|
self.stacked_layout.addWidget(self.data_widget)
|
||||||
main_layout = QVBoxLayout()
|
main_layout = QVBoxLayout()
|
||||||
main_layout.setContentsMargins(0, 0, 0, 0)
|
main_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
main_layout.setSpacing(0)
|
main_layout.setSpacing(0)
|
||||||
@@ -80,7 +91,8 @@ class MainWindow(QMainWindow):
|
|||||||
# cef widget in the layout with the container.
|
# cef widget in the layout with the container.
|
||||||
self.container = QWidget.createWindowContainer(
|
self.container = QWidget.createWindowContainer(
|
||||||
self.cef_widget.hidden_window, parent=self)
|
self.cef_widget.hidden_window, parent=self)
|
||||||
self.stacked_layout.addWidget(self.container, 1, 0)
|
self.stacked_layout.replaceWidget(self.cef_widget, self.container)
|
||||||
|
self.stacked_layout.setCurrentIndex(LOAD_INDEX)
|
||||||
|
|
||||||
def setupServer(self):
|
def setupServer(self):
|
||||||
self.shutdownServer()
|
self.shutdownServer()
|
||||||
@@ -108,7 +120,7 @@ class MainWindow(QMainWindow):
|
|||||||
file_menu.addAction(load_action)
|
file_menu.addAction(load_action)
|
||||||
|
|
||||||
def showLoad(self):
|
def showLoad(self):
|
||||||
self.stacked_layout.setCurrentIndex(0)
|
self.stacked_layout.setCurrentIndex(LOAD_INDEX)
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
# Close browser (force=True) and free CEF reference
|
# Close browser (force=True) and free CEF reference
|
||||||
@@ -209,7 +221,7 @@ class LoadWidget(QFrame):
|
|||||||
def onDataReady(self):
|
def onDataReady(self):
|
||||||
self.site_ready_worker = SiteReadyWorker(self.window().url)
|
self.site_ready_worker = SiteReadyWorker(self.window().url)
|
||||||
self.site_ready_worker.signals.ready.connect(self.onServerReady)
|
self.site_ready_worker.signals.ready.connect(self.onServerReady)
|
||||||
self.site_ready_worker.signals.error.connect(self.onError)
|
self.site_ready_worker.signals.error.connect(self.onServerError)
|
||||||
|
|
||||||
srw_thread = threading.Thread(target=self.site_ready_worker.run, daemon=True)
|
srw_thread = threading.Thread(target=self.site_ready_worker.run, daemon=True)
|
||||||
srw_thread.start()
|
srw_thread.start()
|
||||||
@@ -217,7 +229,7 @@ class LoadWidget(QFrame):
|
|||||||
def onServerReady(self):
|
def onServerReady(self):
|
||||||
if not self.serverError:
|
if not self.serverError:
|
||||||
self.window().cef_widget.browser.Navigate(self.window().url)
|
self.window().cef_widget.browser.Navigate(self.window().url)
|
||||||
self.window().stacked_layout.setCurrentIndex(1)
|
self.window().showBrowser()
|
||||||
|
|
||||||
def onError(self, err, server_error=False):
|
def onError(self, err, server_error=False):
|
||||||
# Restart worker
|
# Restart worker
|
||||||
@@ -225,7 +237,7 @@ class LoadWidget(QFrame):
|
|||||||
self.serverError = True
|
self.serverError = True
|
||||||
# Report error and switch to load screen
|
# Report error and switch to load screen
|
||||||
self.window().shutdownServer()
|
self.window().shutdownServer()
|
||||||
self.window().stacked_layout.setCurrentIndex(0)
|
self.window().stacked_layout.setCurrentIndex(LOAD_INDEX)
|
||||||
self.error_label.setText(f"Error: {err}")
|
self.error_label.setText(f"Error: {err}")
|
||||||
self.error_label.resize(self.MAX_CONTENT_WIDTH, self.error_label.height())
|
self.error_label.resize(self.MAX_CONTENT_WIDTH, self.error_label.height())
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import errno
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
from PySide2.QtCore import QObject, Signal
|
from PySide2.QtCore import QObject, Signal
|
||||||
@@ -60,6 +61,12 @@ class Emitter:
|
|||||||
except EOFError:
|
except EOFError:
|
||||||
# Server done
|
# Server done
|
||||||
break
|
break
|
||||||
|
except OSError as e:
|
||||||
|
if e.errno == errno.EBADF:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.signals.error.emit(str(e))
|
||||||
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.signals.error.emit(str(e))
|
self.signals.error.emit(str(e))
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from multiprocessing import Process
|
from multiprocessing import Process
|
||||||
import traceback
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
@@ -65,7 +64,6 @@ class Worker(EmittingProcess):
|
|||||||
try:
|
try:
|
||||||
server.app.run(host=self.host, debug=False, port=self.port, threaded=True)
|
server.app.run(host=self.host, debug=False, port=self.port, threaded=True)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
|
||||||
self.emit("server_error", str(e))
|
self.emit("server_error", str(e))
|
||||||
finally:
|
finally:
|
||||||
self.emit("finished")
|
self.emit("finished")
|
||||||
@@ -87,6 +85,5 @@ class SiteReadyWorker:
|
|||||||
except requests.exceptions.ConnectionError:
|
except requests.exceptions.ConnectionError:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
|
||||||
self.signals.error.emit(str(e))
|
self.signals.error.emit(str(e))
|
||||||
self.signals.timeout.emit()
|
self.signals.timeout.emit()
|
||||||
|
|||||||
Reference in New Issue
Block a user