141 lines
4.2 KiB
Python
141 lines
4.2 KiB
Python
import base
|
|
from callhandler import CallHandler
|
|
from browser import Browser
|
|
from PyQt6.QtCore import Qt
|
|
from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout
|
|
from PyQt6.QtCore import QThread, QObject, pyqtSignal as Signal, pyqtSlot as Slot
|
|
import time
|
|
|
|
class Sight(QWidget):
|
|
js_work_requested = Signal(str)
|
|
|
|
def __init__(self, id, page):
|
|
super().__init__()
|
|
|
|
self.id = id
|
|
self.page = page
|
|
self.data = {} # private data(s) of the sight
|
|
self.children = []
|
|
self.parent = None
|
|
self.js_worker = self.JsRunWorker()
|
|
|
|
base.data["active_sight"] = self.id
|
|
self.title = id
|
|
|
|
if base.frameSupported():
|
|
self.setWindowFlags(Qt.WindowType(0x00000800)) # remove the os windows frame (borders, close and other buttons
|
|
self.setAttribute(Qt.WidgetAttribute(0x78)) # (int: 120)) # Make Transparent
|
|
|
|
self.browser = Browser()
|
|
self.browser.addObject('handler', CallHandler(self) )
|
|
|
|
#self.browser.loadAdminContent(page)
|
|
if "sight-admin" in id:
|
|
self.browser.loadAdminContent(page)
|
|
else:
|
|
self.browser.loadContent(page)
|
|
|
|
self.layout = QVBoxLayout()
|
|
self.layout.addWidget(self.browser)
|
|
self.layout.setSpacing(0);
|
|
self.layout.setContentsMargins(1, 1, 1, 1); #Need 1,1,1,1 if it is 0,0,0,0 I got setgeometry warnings
|
|
|
|
self.setLayout(self.layout)
|
|
|
|
|
|
|
|
def runJs(self,request_js):
|
|
self.browser.page().runJavaScript(request_js)
|
|
|
|
|
|
def st(self):
|
|
self.js_worker_thread = QThread()
|
|
self.js_worker.js_run.connect(self.runJs)
|
|
|
|
self.js_work_requested.connect(self.js_worker.do_work)
|
|
# move worker to the worker thread
|
|
self.js_worker.moveToThread(self.js_worker_thread)
|
|
# start the thread
|
|
self.js_worker_thread.start()
|
|
self.js_work_requested.emit(self.page)
|
|
|
|
# use when the frameSupported is False (for instance wayland)
|
|
def closeEvent(self, event):
|
|
self.js_worker.dont_work()
|
|
self.js_worker_thread.quit()
|
|
|
|
base.sights.close(self.id)
|
|
|
|
def getParent(self):
|
|
return self.parent
|
|
|
|
def getPageId(self):
|
|
return self.page
|
|
|
|
def setParent(self, id):
|
|
self.parent = id
|
|
|
|
def addChild(self, id):
|
|
self.children.insert(0, id)
|
|
print(self.children)
|
|
|
|
def getChildren(self):
|
|
return self.children
|
|
|
|
def removeChild(self, id):
|
|
if id in self.children:
|
|
self.children.remove(id)
|
|
print(self.children)
|
|
|
|
def setLayoutContentMargins(self,a,b,c,d):
|
|
self.layout.setContentsMargins(a, b, c, d)
|
|
|
|
def setTitle(self, title):
|
|
self.title = title
|
|
|
|
def getTitle(self):
|
|
return self.title
|
|
def getId(self):
|
|
return self.id
|
|
def addData(self, key, value):
|
|
self.data[key] = value
|
|
def getData(self, key):
|
|
if key in self.data:
|
|
return self.data[key]
|
|
return None
|
|
|
|
class JsRunWorker(QObject):
|
|
__js_requests = []
|
|
__infinitive = True
|
|
js_run = Signal(str)
|
|
|
|
def addRequest(self, js):
|
|
self.__js_requests.append(js)
|
|
#print("REQUESTS: ")
|
|
#print(self.__js_requests)
|
|
|
|
@Slot(str)
|
|
def do_work(self, name):
|
|
sec_sleep = 0.5
|
|
while self.__infinitive:
|
|
rs = self.__js_requests
|
|
self.__js_requests.clear()
|
|
|
|
time.sleep(sec_sleep)
|
|
for request in rs:
|
|
time.sleep(sec_sleep)
|
|
print(name + " " +request)
|
|
try:
|
|
self.js_run.emit(request)
|
|
except Exception as error:
|
|
print("Error " + str(error))
|
|
|
|
#break
|
|
# self.__js_requests.remove(request)
|
|
# base.sights.get(page).browser.page().runJavaScript("receiveData('message', 'logs', {'event_code':'do_work', 'msg':'test', 'date':'ye'})", self.ready)
|
|
|
|
def dont_work(self):
|
|
self.__infinitive = False
|
|
def ready(self, returnValue):
|
|
if returnValue is not None:
|
|
print(returnValue) |