mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-15 12:47:56 +08:00
97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
# flake8: noqa F403, F405
|
|
from cefpython3 import cefpython as cef
|
|
from PySide2.QtCore import *
|
|
from PySide2.QtGui import *
|
|
from PySide2.QtWidgets import *
|
|
|
|
from server.gui.utils import WINDOWS, LINUX
|
|
|
|
WindowUtils = cef.WindowUtils()
|
|
|
|
# OS differences
|
|
# noinspection PyUnresolvedReferences
|
|
CefWidgetParent = QWidget
|
|
|
|
|
|
class CefWidget(CefWidgetParent):
|
|
|
|
def __init__(self, parent=None):
|
|
super(CefWidget, self).__init__(parent)
|
|
self.parent = parent
|
|
self.browser = None
|
|
# TODO test without this on linux
|
|
self.hidden_window = None # Required for PyQt5 on Linux
|
|
self.show()
|
|
|
|
def focusInEvent(self, event):
|
|
# This event seems to never get called on Linux, as CEF is
|
|
# stealing all focus due to Issue #284.
|
|
if self.browser:
|
|
if WINDOWS:
|
|
WindowUtils.OnSetFocus(self.getHandle(), 0, 0, 0)
|
|
self.browser.SetFocus(True)
|
|
|
|
def focusOutEvent(self, event):
|
|
# This event seems to never get called on Linux, as CEF is
|
|
# stealing all focus due to Issue #284.
|
|
if self.browser:
|
|
self.browser.SetFocus(False)
|
|
|
|
def embedBrowser(self):
|
|
if LINUX:
|
|
self.hidden_window = QWindow()
|
|
window_info = cef.WindowInfo()
|
|
rect = [0, 0, self.width(), self.height()]
|
|
window_info.SetAsChild(self.getHandle(), rect)
|
|
# TODO better splash
|
|
self.browser = cef.CreateBrowserSync(window_info)
|
|
|
|
def getHandle(self):
|
|
if self.hidden_window:
|
|
# PyQt5 on Linux
|
|
return int(self.hidden_window.winId())
|
|
else:
|
|
return int(self.winId())
|
|
|
|
def moveEvent(self, _):
|
|
self.x = 0
|
|
self.y = 0
|
|
if self.browser:
|
|
if WINDOWS:
|
|
WindowUtils.OnSize(self.getHandle(), 0, 0, 0)
|
|
elif LINUX:
|
|
self.browser.SetBounds(self.x, self.y, self.width(),
|
|
self.height())
|
|
self.browser.NotifyMoveOrResizeStarted()
|
|
|
|
def resizeEvent(self, event):
|
|
size = event.size()
|
|
if self.browser:
|
|
if WINDOWS:
|
|
WindowUtils.OnSize(self.getHandle(), 0, 0, 0)
|
|
elif LINUX:
|
|
self.browser.SetBounds(self.x, self.y, size.width(),
|
|
size.height())
|
|
self.browser.NotifyMoveOrResizeStarted()
|
|
|
|
|
|
class CefApplication(QApplication):
|
|
|
|
def __init__(self, args):
|
|
super(CefApplication, self).__init__(args)
|
|
if not cef.GetAppSetting("external_message_pump"):
|
|
self.timer = self.createTimer()
|
|
|
|
def createTimer(self):
|
|
timer = QTimer()
|
|
timer.timeout.connect(self.onTimer)
|
|
timer.start(10)
|
|
return timer
|
|
|
|
def onTimer(self):
|
|
cef.MessageLoopWork()
|
|
|
|
def stopTimer(self):
|
|
# Stop the timer after Qt's message loop has ended
|
|
self.timer.stop()
|