VertexEngine-WebEngine 1.2rc1__tar.gz → 1.2rc3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vertexengine_webengine-1.2rc1/src/VertexEngine_WebEngine.egg-info → vertexengine_webengine-1.2rc3}/PKG-INFO +6 -2
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/README.md +5 -1
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/pyproject.toml +1 -1
- vertexengine_webengine-1.2rc3/src/VertexEngine/VertexWebEngineCore/JSBridge.py +101 -0
- vertexengine_webengine-1.2rc3/src/VertexEngine/VertexWebEngineCore/WebEngineURLInterceptor.py +12 -0
- vertexengine_webengine-1.2rc3/src/VertexEngine/VertexWebEngineCore/WebPage.py +9 -0
- vertexengine_webengine-1.2rc3/src/VertexEngine/VertexWebEngineCore/WebProfile.py +14 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine/VertexWebEngineWidgets/EngineView.py +0 -1
- vertexengine_webengine-1.2rc3/src/VertexEngine/WebBrowserSystem/BrowserToolBar.py +39 -0
- vertexengine_webengine-1.2rc3/src/VertexEngine/WebBrowserSystem/downloads.py +14 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3/src/VertexEngine_WebEngine.egg-info}/PKG-INFO +6 -2
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine_WebEngine.egg-info/SOURCES.txt +5 -0
- vertexengine_webengine-1.2rc1/src/VertexEngine/VertexWebEngineCore/JSBridge.py +0 -17
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/LICENSE +0 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/setup.cfg +0 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine/VertexWebEngineCore/WebScene.py +0 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine_WebEngine.egg-info/dependency_links.txt +0 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine_WebEngine.egg-info/requires.txt +0 -0
- {vertexengine_webengine-1.2rc1 → vertexengine_webengine-1.2rc3}/src/VertexEngine_WebEngine.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: VertexEngine-WebEngine
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2rc3
|
|
4
4
|
Summary: The offical WebEngine Extension of the VertexEngine SDK.
|
|
5
5
|
Author-email: Tyrel Miguel <annbasilan0828@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -22,7 +22,11 @@ VertexEngine-WebEngine is a WebEngine built for the VertexEngine SDK. It's a sep
|
|
|
22
22
|
The documentation is in the following link:
|
|
23
23
|
[Project Documentation](https://vertexenginedocs.netlify.app/) for help.
|
|
24
24
|
|
|
25
|
-
## Change Logs (1.
|
|
25
|
+
## Change Logs (1.2rc3), NEW!
|
|
26
|
+
### 1.2rc3
|
|
27
|
+
- FULL REFINATION OF THE BROWSER! Documentation Updated.
|
|
28
|
+
### 1.2rc2
|
|
29
|
+
- EXPANDED JS BRIDGE!
|
|
26
30
|
### 1.2rc1
|
|
27
31
|
- FULL ENGINE REVAMP! Check Documentation for more details.
|
|
28
32
|
### Version 1.1
|
|
@@ -5,7 +5,11 @@ VertexEngine-WebEngine is a WebEngine built for the VertexEngine SDK. It's a sep
|
|
|
5
5
|
The documentation is in the following link:
|
|
6
6
|
[Project Documentation](https://vertexenginedocs.netlify.app/) for help.
|
|
7
7
|
|
|
8
|
-
## Change Logs (1.
|
|
8
|
+
## Change Logs (1.2rc3), NEW!
|
|
9
|
+
### 1.2rc3
|
|
10
|
+
- FULL REFINATION OF THE BROWSER! Documentation Updated.
|
|
11
|
+
### 1.2rc2
|
|
12
|
+
- EXPANDED JS BRIDGE!
|
|
9
13
|
### 1.2rc1
|
|
10
14
|
- FULL ENGINE REVAMP! Check Documentation for more details.
|
|
11
15
|
### Version 1.1
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "VertexEngine-WebEngine"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.2rc3"
|
|
8
8
|
description = "The offical WebEngine Extension of the VertexEngine SDK."
|
|
9
9
|
authors = [
|
|
10
10
|
{ name="Tyrel Miguel", email="annbasilan0828@gmail.com" }
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal, QTimer
|
|
2
|
+
import json
|
|
3
|
+
import functools
|
|
4
|
+
|
|
5
|
+
class JSBridge(QObject):
|
|
6
|
+
# Core signals
|
|
7
|
+
eventReceived = pyqtSignal(str, str) # eventName, jsonData
|
|
8
|
+
logMessage = pyqtSignal(str)
|
|
9
|
+
|
|
10
|
+
def __init__(self, scene_manager):
|
|
11
|
+
super().__init__()
|
|
12
|
+
self.scene_manager = scene_manager
|
|
13
|
+
self._event_listeners = {} # Python-side listeners
|
|
14
|
+
self._timers = []
|
|
15
|
+
|
|
16
|
+
# -----------------------
|
|
17
|
+
# Scene management
|
|
18
|
+
# -----------------------
|
|
19
|
+
@pyqtSlot(str)
|
|
20
|
+
def loadScene(self, name):
|
|
21
|
+
print("🎮 JS Requested Scene:", name)
|
|
22
|
+
self.scene_manager.load_scene(name)
|
|
23
|
+
self.emitEvent("sceneChanged", {"name": name})
|
|
24
|
+
|
|
25
|
+
@pyqtSlot(result=str)
|
|
26
|
+
def getCurrentScene(self):
|
|
27
|
+
return self.scene_manager.current_scene
|
|
28
|
+
|
|
29
|
+
# -----------------------
|
|
30
|
+
# Event system
|
|
31
|
+
# -----------------------
|
|
32
|
+
@pyqtSlot(str, str)
|
|
33
|
+
def emitEvent(self, event_name, json_data="{}"):
|
|
34
|
+
"""Emit event to Python listeners and JS"""
|
|
35
|
+
try:
|
|
36
|
+
data = json.loads(json_data)
|
|
37
|
+
except json.JSONDecodeError:
|
|
38
|
+
data = {"raw": json_data}
|
|
39
|
+
|
|
40
|
+
# Python-side listeners
|
|
41
|
+
listeners = self._event_listeners.get(event_name, [])
|
|
42
|
+
for callback in listeners:
|
|
43
|
+
callback(data)
|
|
44
|
+
|
|
45
|
+
# Emit signal to JS
|
|
46
|
+
self.eventReceived.emit(event_name, json.dumps(data))
|
|
47
|
+
print(f"✨ Event emitted: {event_name} → {data}")
|
|
48
|
+
|
|
49
|
+
def onEvent(self, event_name, callback):
|
|
50
|
+
"""Register Python listener"""
|
|
51
|
+
if event_name not in self._event_listeners:
|
|
52
|
+
self._event_listeners[event_name] = []
|
|
53
|
+
self._event_listeners[event_name].append(callback)
|
|
54
|
+
print(f"✅ Python listener registered for '{event_name}'")
|
|
55
|
+
|
|
56
|
+
# -----------------------
|
|
57
|
+
# Logging
|
|
58
|
+
# -----------------------
|
|
59
|
+
@pyqtSlot(str)
|
|
60
|
+
def jsLog(self, message):
|
|
61
|
+
print("📝 JS Log:", message)
|
|
62
|
+
self.logMessage.emit(message)
|
|
63
|
+
|
|
64
|
+
# -----------------------
|
|
65
|
+
# Data exchange
|
|
66
|
+
# -----------------------
|
|
67
|
+
@pyqtSlot(str)
|
|
68
|
+
def sendData(self, json_data):
|
|
69
|
+
try:
|
|
70
|
+
data = json.loads(json_data)
|
|
71
|
+
print("📥 Received data from JS:", data)
|
|
72
|
+
self.emitEvent("dataReceived", json_data)
|
|
73
|
+
except json.JSONDecodeError:
|
|
74
|
+
print("❌ Invalid JSON received from JS")
|
|
75
|
+
|
|
76
|
+
def updateSceneData(self, data_dict):
|
|
77
|
+
json_str = json.dumps(data_dict)
|
|
78
|
+
self.emitEvent("sceneDataUpdated", json_str)
|
|
79
|
+
|
|
80
|
+
# -----------------------
|
|
81
|
+
# Timers / delayed calls
|
|
82
|
+
# -----------------------
|
|
83
|
+
@pyqtSlot(str, int)
|
|
84
|
+
def delayedCall(self, callback_event, delay_ms):
|
|
85
|
+
"""Call an event after delay (ms)"""
|
|
86
|
+
timer = QTimer(self)
|
|
87
|
+
timer.setSingleShot(True)
|
|
88
|
+
timer.timeout.connect(functools.partial(self.emitEvent, callback_event))
|
|
89
|
+
timer.start(delay_ms)
|
|
90
|
+
self._timers.append(timer)
|
|
91
|
+
print(f"⏱ Scheduled delayed event '{callback_event}' in {delay_ms}ms")
|
|
92
|
+
|
|
93
|
+
# -----------------------
|
|
94
|
+
# Dynamic JS loading
|
|
95
|
+
# -----------------------
|
|
96
|
+
@pyqtSlot(str, result=str)
|
|
97
|
+
def loadJSModule(self, url):
|
|
98
|
+
"""Return the URL to JS for dynamic import (for WebEngine to fetch)"""
|
|
99
|
+
print(f"🌐 JS requested module: {url}")
|
|
100
|
+
# In practice, the JS will do: import(moduleURL)
|
|
101
|
+
return url
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from PyQt6.QtWebEngineCore import QWebEngineUrlRequestInterceptor
|
|
2
|
+
|
|
3
|
+
class VertexInterceptor(QWebEngineUrlRequestInterceptor):
|
|
4
|
+
def interceptRequest(self, info):
|
|
5
|
+
url = info.requestUrl().toString()
|
|
6
|
+
|
|
7
|
+
# Block ads/tracking
|
|
8
|
+
blocked_words = ["ads", "doubleclick", "tracker"]
|
|
9
|
+
|
|
10
|
+
if any(word in url for word in blocked_words):
|
|
11
|
+
print("🚫 Blocked:", url)
|
|
12
|
+
info.block(True)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from PyQt6.QtWebEngineCore import QWebEnginePage
|
|
2
|
+
|
|
3
|
+
class VertexWebPage(QWebEnginePage):
|
|
4
|
+
def javaScriptConsoleMessage(self, level, message, line, source):
|
|
5
|
+
print(f"[JS Console] {message} (Line {line})")
|
|
6
|
+
|
|
7
|
+
def acceptNavigationRequest(self, url, nav_type, isMainFrame):
|
|
8
|
+
print("Navigating to:", url.toString())
|
|
9
|
+
return True
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from PyQt6.QtWebEngineCore import QWebEngineProfile
|
|
2
|
+
|
|
3
|
+
class VertexProfile(QWebEngineProfile):
|
|
4
|
+
def __init__(self):
|
|
5
|
+
super().__init__("MyBrowserProfile")
|
|
6
|
+
|
|
7
|
+
self.setPersistentCookiesPolicy(
|
|
8
|
+
QWebEngineProfile.PersistentCookiesPolicy.ForcePersistentCookies
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
self.setCachePath("cache/")
|
|
12
|
+
self.setPersistentStoragePath("storage/")
|
|
13
|
+
|
|
14
|
+
print("Profile Loaded ✅")
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from PyQt6.QtWidgets import QToolBar, QLineEdit
|
|
2
|
+
from PyQt6.QtGui import QAction
|
|
3
|
+
|
|
4
|
+
class NavBar(QToolBar):
|
|
5
|
+
def __init__(self, tabs):
|
|
6
|
+
super().__init__()
|
|
7
|
+
|
|
8
|
+
self.tabs = tabs
|
|
9
|
+
|
|
10
|
+
# Buttons
|
|
11
|
+
back_btn = QAction("⬅", self)
|
|
12
|
+
forward_btn = QAction("➡", self)
|
|
13
|
+
reload_btn = QAction("🔄", self)
|
|
14
|
+
newtab_btn = QAction("➕", self)
|
|
15
|
+
|
|
16
|
+
back_btn.triggered.connect(lambda: self.current().back())
|
|
17
|
+
forward_btn.triggered.connect(lambda: self.current().forward())
|
|
18
|
+
reload_btn.triggered.connect(lambda: self.current().reload())
|
|
19
|
+
newtab_btn.triggered.connect(lambda: self.tabs.add_new_tab())
|
|
20
|
+
|
|
21
|
+
self.addAction(back_btn)
|
|
22
|
+
self.addAction(forward_btn)
|
|
23
|
+
self.addAction(reload_btn)
|
|
24
|
+
self.addAction(newtab_btn)
|
|
25
|
+
|
|
26
|
+
# URL Bar
|
|
27
|
+
self.url_bar = QLineEdit()
|
|
28
|
+
self.url_bar.returnPressed.connect(self.load_url)
|
|
29
|
+
self.addWidget(self.url_bar)
|
|
30
|
+
|
|
31
|
+
def current(self):
|
|
32
|
+
return self.tabs.currentWidget()
|
|
33
|
+
|
|
34
|
+
def load_url(self):
|
|
35
|
+
url = self.url_bar.text()
|
|
36
|
+
if not url.startswith("http"):
|
|
37
|
+
url = "https://" + url
|
|
38
|
+
|
|
39
|
+
self.current().load(url)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
class DownloadManager:
|
|
4
|
+
def __init__(self):
|
|
5
|
+
self.download_folder = "downloads/"
|
|
6
|
+
os.makedirs(self.download_folder, exist_ok=True)
|
|
7
|
+
|
|
8
|
+
def handle_download(self, download):
|
|
9
|
+
filename = download.downloadFileName()
|
|
10
|
+
|
|
11
|
+
download.setDownloadDirectory(self.download_folder)
|
|
12
|
+
download.accept()
|
|
13
|
+
|
|
14
|
+
print("📥 Downloading:", filename)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: VertexEngine-WebEngine
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2rc3
|
|
4
4
|
Summary: The offical WebEngine Extension of the VertexEngine SDK.
|
|
5
5
|
Author-email: Tyrel Miguel <annbasilan0828@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -22,7 +22,11 @@ VertexEngine-WebEngine is a WebEngine built for the VertexEngine SDK. It's a sep
|
|
|
22
22
|
The documentation is in the following link:
|
|
23
23
|
[Project Documentation](https://vertexenginedocs.netlify.app/) for help.
|
|
24
24
|
|
|
25
|
-
## Change Logs (1.
|
|
25
|
+
## Change Logs (1.2rc3), NEW!
|
|
26
|
+
### 1.2rc3
|
|
27
|
+
- FULL REFINATION OF THE BROWSER! Documentation Updated.
|
|
28
|
+
### 1.2rc2
|
|
29
|
+
- EXPANDED JS BRIDGE!
|
|
26
30
|
### 1.2rc1
|
|
27
31
|
- FULL ENGINE REVAMP! Check Documentation for more details.
|
|
28
32
|
### Version 1.1
|
|
@@ -2,8 +2,13 @@ LICENSE
|
|
|
2
2
|
README.md
|
|
3
3
|
pyproject.toml
|
|
4
4
|
src/VertexEngine/VertexWebEngineCore/JSBridge.py
|
|
5
|
+
src/VertexEngine/VertexWebEngineCore/WebEngineURLInterceptor.py
|
|
6
|
+
src/VertexEngine/VertexWebEngineCore/WebPage.py
|
|
7
|
+
src/VertexEngine/VertexWebEngineCore/WebProfile.py
|
|
5
8
|
src/VertexEngine/VertexWebEngineCore/WebScene.py
|
|
6
9
|
src/VertexEngine/VertexWebEngineWidgets/EngineView.py
|
|
10
|
+
src/VertexEngine/WebBrowserSystem/BrowserToolBar.py
|
|
11
|
+
src/VertexEngine/WebBrowserSystem/downloads.py
|
|
7
12
|
src/VertexEngine_WebEngine.egg-info/PKG-INFO
|
|
8
13
|
src/VertexEngine_WebEngine.egg-info/SOURCES.txt
|
|
9
14
|
src/VertexEngine_WebEngine.egg-info/dependency_links.txt
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class JSBridge(QObject):
|
|
5
|
-
|
|
6
|
-
sceneChanged = pyqtSignal(str)
|
|
7
|
-
|
|
8
|
-
def __init__(self, scene_manager):
|
|
9
|
-
super().__init__()
|
|
10
|
-
self.scene_manager = scene_manager
|
|
11
|
-
|
|
12
|
-
@pyqtSlot(str)
|
|
13
|
-
def loadScene(self, name):
|
|
14
|
-
print("🎮 JS Requested Scene:", name)
|
|
15
|
-
|
|
16
|
-
self.scene_manager.load_scene(name)
|
|
17
|
-
self.sceneChanged.emit(name)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|