sightplace-rep/sight.py

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)