VertexEngine-WebEngine 1.2rc1__py3-none-any.whl → 1.2rc3__py3-none-any.whl

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.
@@ -1,17 +1,101 @@
1
- from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal
2
-
1
+ from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal, QTimer
2
+ import json
3
+ import functools
3
4
 
4
5
  class JSBridge(QObject):
5
-
6
- sceneChanged = pyqtSignal(str)
7
-
6
+ # Core signals
7
+ eventReceived = pyqtSignal(str, str) # eventName, jsonData
8
+ logMessage = pyqtSignal(str)
9
+
8
10
  def __init__(self, scene_manager):
9
11
  super().__init__()
10
12
  self.scene_manager = scene_manager
13
+ self._event_listeners = {} # Python-side listeners
14
+ self._timers = []
11
15
 
16
+ # -----------------------
17
+ # Scene management
18
+ # -----------------------
12
19
  @pyqtSlot(str)
13
20
  def loadScene(self, name):
14
21
  print("🎮 JS Requested Scene:", name)
15
-
16
22
  self.scene_manager.load_scene(name)
17
- self.sceneChanged.emit(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 ✅")
@@ -1,6 +1,5 @@
1
1
  from PyQt6.QtWebEngineWidgets import QWebEngineView
2
2
  from PyQt6.QtWebChannel import QWebChannel
3
-
4
3
  from VertexWebEngineCore.WebScene import SceneManager
5
4
  from VertexWebEngineCore.JSBridge import JSBridge
6
5
 
@@ -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.2rc1
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.2rc1), NEW!
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
@@ -0,0 +1,13 @@
1
+ VertexEngine/VertexWebEngineCore/JSBridge.py,sha256=gJOj5yU3ZGcZrErOgJXynMl7_SxM38aQvFbEchQQ15U,3485
2
+ VertexEngine/VertexWebEngineCore/WebEngineURLInterceptor.py,sha256=0JoHzsNI01MY-J1ztV_y-NLqS3BH4FaMnTc45Dq9iKA,431
3
+ VertexEngine/VertexWebEngineCore/WebPage.py,sha256=FvX73SBQ8v5G-cW-wZk0QgW_f-ex9vOYkhjWh9pDFIE,357
4
+ VertexEngine/VertexWebEngineCore/WebProfile.py,sha256=M7Eob3yK8-4g4xfUO0DBoMcWV6vAqYhhVec1gQycsIQ,429
5
+ VertexEngine/VertexWebEngineCore/WebScene.py,sha256=2G5KuyM5sO7A4GlMUkKHNXvM1clYPNTrFbNwILp8GwI,1223
6
+ VertexEngine/VertexWebEngineWidgets/EngineView.py,sha256=tC4nm54UTJKQWl1WxtLAPJZ9WMKM73x9lqZGmdYQBtg,683
7
+ VertexEngine/WebBrowserSystem/BrowserToolBar.py,sha256=Zgkji2IkEENcsVeIdpBCVoCyeWOE9hZ_pCY3Bf7F9gU,1214
8
+ VertexEngine/WebBrowserSystem/downloads.py,sha256=tIRai529DRgqLjUp74L88PSTL8aPu4_SKBo5dj5KTFY,395
9
+ vertexengine_webengine-1.2rc3.dist-info/licenses/LICENSE,sha256=dV2_I9Rq_DHkqouiT6TD2tsQVh9pgzlqFrkT8BuW2X8,1096
10
+ vertexengine_webengine-1.2rc3.dist-info/METADATA,sha256=R_2NTwfbyJ2qED18X2QmMP4tDN-FdAk8EUoFjU5LvZU,2590
11
+ vertexengine_webengine-1.2rc3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
12
+ vertexengine_webengine-1.2rc3.dist-info/top_level.txt,sha256=ONNMJUQViY7bNuEYPB2TaUwj7Jo1Is2yuBY4KOv19wM,13
13
+ vertexengine_webengine-1.2rc3.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- VertexEngine/VertexWebEngineCore/JSBridge.py,sha256=Pbd7NzaEyfMOvQMHBR99tysDVTKoUXHAn9-097_EzEI,426
2
- VertexEngine/VertexWebEngineCore/WebScene.py,sha256=2G5KuyM5sO7A4GlMUkKHNXvM1clYPNTrFbNwILp8GwI,1223
3
- VertexEngine/VertexWebEngineWidgets/EngineView.py,sha256=cUCRvYAtXI7p2v-1QMTksLHAfs5JZXcvF90avJ54TqE,685
4
- vertexengine_webengine-1.2rc1.dist-info/licenses/LICENSE,sha256=dV2_I9Rq_DHkqouiT6TD2tsQVh9pgzlqFrkT8BuW2X8,1096
5
- vertexengine_webengine-1.2rc1.dist-info/METADATA,sha256=9XJJFjYQk853OsFPW9r6ev4vINhUFhTtGuTkEnq_WDA,2485
6
- vertexengine_webengine-1.2rc1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
7
- vertexengine_webengine-1.2rc1.dist-info/top_level.txt,sha256=ONNMJUQViY7bNuEYPB2TaUwj7Jo1Is2yuBY4KOv19wM,13
8
- vertexengine_webengine-1.2rc1.dist-info/RECORD,,