diff --git a/base.py b/base.py index a87688e..ca710cc 100644 --- a/base.py +++ b/base.py @@ -81,8 +81,8 @@ def loadConfigTemplate(): def start(): # Creating admin sight - #sights.create("sight-admin", "sight-admin") - #sights.show("sight-admin") + sights.create("sight-admin", "sight-admin") + sights.show("sight-admin") # Creating the main Sight sights.create("main", data["default_template_page"]) diff --git a/core/messenger/broadcast.py b/core/messenger/broadcast.py index 3f1db12..b75b3c0 100644 --- a/core/messenger/broadcast.py +++ b/core/messenger/broadcast.py @@ -9,19 +9,13 @@ class Broadcast: if base.registrar.checkData(record) is not None: for sight in base.sights.getSights().values(): if len(record.getHeader().getReceivers()) == 0: - """sight.browser.page().runJavaScript("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( - True) + "')", self.ready)""" - sight.js_worker.addRequest("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( - True) + "')") - else: - if sight.getPageId() in record.getHeader().getReceivers(): - print("ID " +str(sight.getId())) - """sight.browser.page().runJavaScript( - "receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( - True) + "')", self.ready)""" - sight.js_worker.addRequest( - "receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( - True) + "')") + print("EVERY ID " + str(sight.getPageId())) + sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( + True) + "')", sight.getPageId()) + elif sight.getPageId() in record.getHeader().getReceivers(): + print("ID " + str(sight.getPageId())) + sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( + True) + "')", sight.getPageId()) else: print("Couldnt send message") diff --git a/core/sight/threads/jsrun_worker.py b/core/sight/threads/jsrun_worker.py new file mode 100644 index 0000000..72c8716 --- /dev/null +++ b/core/sight/threads/jsrun_worker.py @@ -0,0 +1,24 @@ +import time +from PyQt6.QtCore import QRunnable, QObject, QThreadPool, pyqtSignal as Signal, pyqtSlot as Slot +import base + +class Signals(QObject): + started = Signal(str) + jsrun = Signal(str) + completed = Signal(str) + + +class JsRunWorker(QRunnable): + def __init__(self, js_script, page_id): + super().__init__() + self.page_id = page_id + self.js_script = js_script + self.signals = Signals() + + @Slot() + def run(self): + self.signals.started.emit(self.page_id) + time.sleep(0.5) + #print("PAGE ID is " + str(self.page_id) + " - " + self.js_script) + self.signals.jsrun.emit(self.js_script) + self.signals.completed.emit(self.page_id) diff --git a/sight.py b/sight.py index be83acd..a41c734 100644 --- a/sight.py +++ b/sight.py @@ -1,13 +1,14 @@ import base +from core.sight.threads.jsrun_worker import JsRunWorker 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 +from PyQt6.QtCore import QThread,QThreadPool, QObject, pyqtSignal as Signal, pyqtSlot as Slot +from queue import Queue import time class Sight(QWidget): - js_work_requested = Signal(str) def __init__(self, id, page): super().__init__() @@ -17,7 +18,7 @@ class Sight(QWidget): self.data = {} # private data(s) of the sight self.children = [] self.parent = None - self.js_worker = self.JsRunWorker() + self.pool = QThreadPool.globalInstance() base.data["active_sight"] = self.id self.title = id @@ -42,27 +43,25 @@ class Sight(QWidget): self.setLayout(self.layout) + def addJob(self, js_script, page_id): + worker = JsRunWorker(js_script, page_id) + worker.signals.completed.connect(self.complete) + worker.signals.jsrun.connect(self.runJs) + worker.signals.started.connect(self.start) + self.pool.start(worker) + def start(self, n): + print(f'Job in "{n}" page started...') + + def complete(self, n): + print(f'Job in "{n}" page completed.') 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() + self.pool.clear() base.sights.close(self.id) @@ -102,40 +101,4 @@ class Sight(QWidget): 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) \ No newline at end of file + return None \ No newline at end of file diff --git a/sightfactory.py b/sightfactory.py index 8f86798..6223a33 100644 --- a/sightfactory.py +++ b/sightfactory.py @@ -4,11 +4,17 @@ import json import random from sight import Sight + class SightFactory(): + __job_jsrun = None + def __init__(self): self.list = {} self.data = {} #Global data(s) for the sight(s) - + + def addJsJob(self, script, page_id): + self.__job_jsrun.addJob(script,page_id) + def create(self, id, page): log.byCode("SF1000E","The page '" + str(page) + "' with '"+str(id)+"' id.") if str(id) == "main" and self.checkKey(id): @@ -40,7 +46,6 @@ class SightFactory(): if self.checkKey(id): self.list[id].show() log.byCode("SF1000E","The '"+str(id)+"' sight is showed!") - self.list[id].st() return True log.byCode("SF1001W", "This '"+str(id)+"' id isn't exist to show!") return False