|
21 | 21 | from hashlib import md5
|
22 | 22 | from inspect import signature
|
23 | 23 | from itertools import chain
|
24 |
| -from os.path import join, abspath, dirname, basename, isfile |
| 24 | +from os.path import join, abspath, dirname, basename, isfile, isdir |
25 | 25 | from threading import Event
|
26 | 26 | from typing import List
|
27 | 27 |
|
|
43 | 43 | from ovos_utils.intents import Intent, IntentBuilder
|
44 | 44 | from ovos_utils.intents.intent_service_interface import munge_regex, munge_intent_parser, IntentServiceInterface
|
45 | 45 | from ovos_utils.json_helper import merge_dict
|
46 |
| -from ovos_utils.log import LOG |
| 46 | +from ovos_utils.log import LOG, deprecated |
47 | 47 | from ovos_utils.messagebus import get_handler_name, create_wrapper, EventContainer, get_message_lang
|
48 | 48 | from ovos_utils.parse import match_one
|
49 | 49 | from ovos_utils.process_utils import RuntimeRequirements
|
@@ -81,76 +81,6 @@ def is_classic_core():
|
81 | 81 | return False # standalone
|
82 | 82 |
|
83 | 83 |
|
84 |
| -class SkillGUI(GUIInterface): |
85 |
| - """SkillGUI - Interface to the Graphical User Interface |
86 |
| -
|
87 |
| - Values set in this class are synced to the GUI, accessible within QML |
88 |
| - via the built-in sessionData mechanism. For example, in Python you can |
89 |
| - write in a skill: |
90 |
| - self.gui['temp'] = 33 |
91 |
| - self.gui.show_page('Weather.qml') |
92 |
| - Then in the Weather.qml you'd access the temp via code such as: |
93 |
| - text: sessionData.time |
94 |
| - """ |
95 |
| - |
96 |
| - def __init__(self, skill): |
97 |
| - self.skill = skill |
98 |
| - super().__init__(skill.skill_id, config=Configuration()) |
99 |
| - |
100 |
| - @property |
101 |
| - def bus(self): |
102 |
| - if self.skill: |
103 |
| - return self.skill.bus |
104 |
| - |
105 |
| - @property |
106 |
| - def skill_id(self): |
107 |
| - return self.skill.skill_id |
108 |
| - |
109 |
| - def setup_default_handlers(self): |
110 |
| - """Sets the handlers for the default messages.""" |
111 |
| - msg_type = self.build_message_type('set') |
112 |
| - self.skill.add_event(msg_type, self.gui_set) |
113 |
| - |
114 |
| - def register_handler(self, event, handler): |
115 |
| - """Register a handler for GUI events. |
116 |
| -
|
117 |
| - When using the triggerEvent method from Qt |
118 |
| - triggerEvent("event", {"data": "cool"}) |
119 |
| -
|
120 |
| - Args: |
121 |
| - event (str): event to catch |
122 |
| - handler: function to handle the event |
123 |
| - """ |
124 |
| - msg_type = self.build_message_type(event) |
125 |
| - self.skill.add_event(msg_type, handler) |
126 |
| - |
127 |
| - def _pages2uri(self, page_names): |
128 |
| - # Convert pages to full reference |
129 |
| - page_urls = [] |
130 |
| - for name in page_names: |
131 |
| - page = self.skill._resources.locate_qml_file(name) |
132 |
| - if page: |
133 |
| - if self.remote_url: |
134 |
| - page_urls.append(self.remote_url + "/" + page) |
135 |
| - elif page.startswith("file://"): |
136 |
| - page_urls.append(page) |
137 |
| - else: |
138 |
| - page_urls.append("file://" + page) |
139 |
| - else: |
140 |
| - raise FileNotFoundError(f"Unable to find page: {name}") |
141 |
| - |
142 |
| - return page_urls |
143 |
| - |
144 |
| - def shutdown(self): |
145 |
| - """Shutdown gui interface. |
146 |
| -
|
147 |
| - Clear pages loaded through this interface and remove the skill |
148 |
| - reference to make ref counting warning more precise. |
149 |
| - """ |
150 |
| - self.release() |
151 |
| - self.skill = None |
152 |
| - |
153 |
| - |
154 | 84 | def simple_trace(stack_trace):
|
155 | 85 | """Generate a simplified traceback.
|
156 | 86 |
|
@@ -1954,3 +1884,44 @@ def get_scheduled_event_status(self, name):
|
1954 | 1884 | def cancel_all_repeating_events(self):
|
1955 | 1885 | """Cancel any repeating events started by the skill."""
|
1956 | 1886 | return self.event_scheduler.cancel_all_repeating_events()
|
| 1887 | + |
| 1888 | + |
| 1889 | +class SkillGUI(GUIInterface): |
| 1890 | + def __init__(self, skill: BaseSkill): |
| 1891 | + """ |
| 1892 | + Wraps `GUIInterface` for use with a skill. |
| 1893 | + """ |
| 1894 | + self._skill = skill |
| 1895 | + skill_id = skill.skill_id |
| 1896 | + bus = skill.bus |
| 1897 | + config = skill.config_core.get('gui') |
| 1898 | + ui_directories = self._get_ui_directories() |
| 1899 | + GUIInterface.__init__(self, skill_id=skill_id, bus=bus, config=config, |
| 1900 | + ui_directories=ui_directories) |
| 1901 | + |
| 1902 | + @property |
| 1903 | + @deprecated("`skill` should not be referenced directly", "0.1.0") |
| 1904 | + def skill(self): |
| 1905 | + return self._skill |
| 1906 | + |
| 1907 | + def _get_ui_directories(self) -> dict: |
| 1908 | + """ |
| 1909 | + Get a dict of UI directories by GUI framework. |
| 1910 | + @return: Dict of framework name to UI resource directory |
| 1911 | + """ |
| 1912 | + ui_directories = dict() |
| 1913 | + base_directory = self._skill.root_dir |
| 1914 | + if isdir(join(base_directory, "gui")): |
| 1915 | + LOG.debug("Skill implements resources in `gui` directory") |
| 1916 | + ui_directories["all"] = join(base_directory, "gui") |
| 1917 | + return ui_directories |
| 1918 | + LOG.info("Checking for legacy UI directories") |
| 1919 | + # TODO: Add deprecation log after ovos-gui is implemented |
| 1920 | + if isdir(join(base_directory, "ui5")): |
| 1921 | + ui_directories["qt5"] = join(base_directory, "ui5") |
| 1922 | + if isdir(join(base_directory, "ui6")): |
| 1923 | + ui_directories["qt6"] = join(base_directory, "ui6") |
| 1924 | + if isdir(join(base_directory, "ui")) and "qt5" not in ui_directories: |
| 1925 | + LOG.debug("Handling `ui` directory as `qt5`") |
| 1926 | + ui_directories["qt5"] = join(base_directory, "ui") |
| 1927 | + return ui_directories |
0 commit comments