From d78d3602f7d841c229460bb72988f8ce3b0587d5 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 09:25:33 +0200 Subject: [PATCH 001/112] add new plugin settings --- qtribu/gui/dlg_settings.py | 4 ++++ qtribu/gui/dlg_settings.ui | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index be572971..1d2ed2bb 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -121,6 +121,10 @@ def load_settings(self) -> dict: self.chb_integration_news_feed.setChecked(settings.integration_qgis_news_feed) self.chb_license_global_accept.setChecked(settings.license_global_accept) + # qchat + self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) + self.le_qchat_nick_name.setText(settings.qchat_nickname) + # misc self.opt_debug.setChecked(settings.debug_mode) self.lbl_version_saved_value.setText(settings.version) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index ca62a866..61c4525c 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -300,6 +300,35 @@ + + + + QChat + + + + + + Instance URI: + + + + + + + Nickname: + + + + + + + + + + + + From 266a7bfd09f981e22ebd952b3957183c8f3ea822 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 09:27:19 +0200 Subject: [PATCH 002/112] add qchat skeleton --- qtribu/gui/wdg_qchat.py | 151 +++++++++++++++++++ qtribu/gui/wdg_qchat.ui | 255 +++++++++++++++++++++++++++++++++ qtribu/logic/qchat_client.py | 52 +++++++ qtribu/plugin_main.py | 24 +++- qtribu/toolbelt/preferences.py | 4 + 5 files changed, 483 insertions(+), 3 deletions(-) create mode 100644 qtribu/gui/wdg_qchat.py create mode 100644 qtribu/gui/wdg_qchat.ui create mode 100644 qtribu/logic/qchat_client.py diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py new file mode 100644 index 00000000..c7a2e8e5 --- /dev/null +++ b/qtribu/gui/wdg_qchat.py @@ -0,0 +1,151 @@ +# standard +from datetime import datetime +from pathlib import Path +from typing import Any + +from qgis.gui import QgsDockWidget + +# PyQGIS +from qgis.PyQt import uic +from qgis.PyQt.QtWidgets import QTreeWidgetItem, QWidget + +from qtribu.logic.qchat_client import QChatApiClient + +# plugin +from qtribu.toolbelt import PlgLogger, PlgOptionsManager + +# -- GLOBALS -- +MARKER_VALUE = "---" + + +class QChatWidget(QgsDockWidget): + def __init__(self, parent: QWidget = None): + """QWidget to see and post messages on chat + + :param parent: parent widget or application + :type parent: QWidget + """ + super().__init__(parent) + self.log = PlgLogger().log + self.plg_settings = PlgOptionsManager() + uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) + + # fill fields from saved settings + self.settings = self.plg_settings.get_plg_settings() + self.load_settings() + + # initialize QChat API client + self.qchat_client = QChatApiClient(self.settings.qchat_instance_uri) + + # load rooms + rooms = self.qchat_client.get_rooms() + self.cb_room.addItem(MARKER_VALUE) + for room in rooms: + self.cb_room.addItem(room["name"]) + self.current_room = MARKER_VALUE + + self.cb_room.currentIndexChanged.connect(self.on_room_changed) + + # connect signal listener + self.connected = False + self.btn_connect.pressed.connect(self.on_connect_button_clicked) + + # tree widget initialization + self.tw_chat.setHeaderLabels( + [ + self.tr("Room"), + self.tr("Date"), + self.tr("Nick"), + self.tr("Message"), + ] + ) + + def load_settings(self) -> dict: + """Load options from QgsSettings into UI form.""" + self.lb_instance.setText(self.settings.qchat_instance_uri) + self.le_nickname.setText(self.settings.qchat_nickname) + + def save_settings(self) -> None: + """Save form text into QgsSettings.""" + self.settings.qchat_nickname = self.le_nickname.text() + self.plg_settings.save_from_object(self.settings) + + def on_room_changed(self) -> None: + """ + Action called when room index is changed in the room combobox + """ + old_room = self.current_room + new_room = self.cb_room.currentText() + if new_room == MARKER_VALUE: + self.disconnect_from_room() + self.current_room = MARKER_VALUE + return + self.disconnect_from_room(log=old_room != MARKER_VALUE) + self.connect_to_room(new_room) + self.current_room = new_room + + def on_connect_button_clicked(self) -> None: + """ + Action called when clicking on "Connect" / "Disconnect" button + """ + if self.connected: + self.disconnect_from_room() + else: + room = self.cb_room.currentText() + if room == MARKER_VALUE: + return + self.connect_to_room(room) + + def connect_to_room(self, room: str, log: bool = True) -> None: + messages = self.qchat_client.get_last_messages(room) + messages.reverse() + if log: + self.tw_chat.insertTopLevelItem( + 0, + QTreeWidgetItem( + [ + room, + datetime.now().strftime("%H:%M"), + self.tr("Admin"), + self.tr("Connected to room '{room}'").format(room=room), + ] + ), + ) + for message in messages: + qtw_item = self.add_message_to_treeview(room, message) + self.tw_chat.insertTopLevelItem(0, qtw_item) + + self.btn_connect.setText(self.tr("Disconnect")) + self.lb_status.setText("Connected") + self.connected = True + + def disconnect_from_room(self, log: bool = True) -> None: + if log: + self.tw_chat.insertTopLevelItem( + 0, + QTreeWidgetItem( + [ + self.current_room, + datetime.now().strftime("%H:%M"), + self.tr("Admin"), + self.tr("Disconnected from room '{room}'").format( + room=self.current_room + ), + ] + ), + ) + self.btn_connect.setText(self.tr("Connect")) + self.lb_status.setText("Disconnected") + self.connected = False + + def add_message_to_treeview(self, room: str, message: dict[str, Any]) -> None: + item = QTreeWidgetItem( + [ + room, + # TODO: convert date to nice format like %H:%M + message["date_posted"], + message["author"], + message["message"], + ] + ) + return item diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui new file mode 100644 index 00000000..98a5db53 --- /dev/null +++ b/qtribu/gui/wdg_qchat.ui @@ -0,0 +1,255 @@ + + + QChatWidget + + + + 0 + 0 + 441 + 887 + + + + + 0 + 0 + + + + QChat + + + + + 0 + 0 + + + + + 5 + + + 5 + + + 10 + + + 5 + + + 10 + + + + + + 0 + 0 + + + + Rooms + + + + + + Room: + + + + + + + Status: + + + + + + + + 0 + 0 + + + + Instance: + + + + + + + + + + Not connected + + + + + + + Connect + + + + + + + INSTANCE + + + + + + + + + + + 0 + 0 + + + + + 0 + 1 + + + + + 0 + 1 + + + + Chat + + + false + + + + + + true + + + false + + + true + + + 4 + + + true + + + 64 + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 3 + + + + + 0 + 5 + + + + User + + + + + + Nickname: + + + + + + + + + + Message: + + + + + + + + + + Send message + + + + + + + + + + + + QgsCollapsibleGroupBox + QGroupBox +
qgscollapsiblegroupbox.h
+ 1 +
+
+ + grb_rooms + grb_chat + grb_user + + + +
diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py new file mode 100644 index 00000000..12093663 --- /dev/null +++ b/qtribu/logic/qchat_client.py @@ -0,0 +1,52 @@ +import json +from typing import Any + +# 3rd party +from qgis.PyQt.QtCore import QByteArray + +# plugin +from qtribu.__about__ import __title__, __version__ +from qtribu.toolbelt import NetworkRequestsManager + +# -- GLOBALS -- +HEADERS: dict = { + b"Accept": b"application/json", + b"User-Agent": bytes(f"{__title__}/{__version__}", "utf8"), +} + + +class QChatApiClient: + """ + QChat API client + """ + + def __init__(self, instance_uri: str, nb_messages_to_fetch: int = 12): + self.instance_uri = instance_uri + self.nb_messages_to_fetch = nb_messages_to_fetch + self.qntwk = NetworkRequestsManager() + + def get_rooms(self) -> list[dict[str, Any]]: + """ + Get available rooms with an API HTTP call + """ + url = f"{self.instance_uri}/rooms" + response: QByteArray = self.qntwk.get_from_source( + headers=HEADERS, + url=url, + response_expected_content_type="application/json", + ) + data = json.loads(str(response, "UTF8")) + return data + + def get_last_messages(self, room: str) -> list[dict[str, Any]]: + """ + Get last chat messages for a room with an API HTTP call + """ + url = f"{self.instance_uri}/room/{room}/messages/{self.nb_messages_to_fetch}" + response: QByteArray = self.qntwk.get_from_source( + headers=HEADERS, + url=url, + response_expected_content_type="application/json", + ) + data = json.loads(str(response, "UTF8")) + return data diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index 7551ed3a..d9eba975 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -11,7 +11,7 @@ # PyQGIS from qgis.core import Qgis, QgsApplication, QgsSettings from qgis.gui import QgisInterface -from qgis.PyQt.QtCore import QCoreApplication, QLocale, QTranslator +from qgis.PyQt.QtCore import QCoreApplication, QLocale, Qt, QTranslator from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QAction @@ -22,6 +22,7 @@ from qtribu.gui.dlg_settings import PlgOptionsFactory from qtribu.gui.form_article import ArticleForm from qtribu.gui.form_rdp_news import RdpNewsForm +from qtribu.gui.wdg_qchat import QChatWidget from qtribu.logic.news_feed.rss_reader import RssMiniReader from qtribu.logic.splash_changer import SplashChanger from qtribu.toolbelt import PlgLogger, PlgOptionsManager @@ -88,6 +89,9 @@ def initGui(self): self.form_contents = None self.form_rdp_news = None + # -- QChat + self.qchat_widget = None + # -- Actions self.action_show_latest_content = QAction( QIcon(str(DIR_PLUGIN_ROOT / "resources/images/logo_green_no_text.svg")), @@ -104,7 +108,7 @@ def initGui(self): self.iface.mainWindow(), ) self.action_contents.setToolTip(self.tr("Browse latest contents")) - self.action_contents.triggered.connect(self.contents) + self.action_contents.triggered.connect(self.open_contents) self.action_form_rdp_news = QAction( ICON_GEORDP, @@ -120,6 +124,13 @@ def initGui(self): ) self.action_form_article.triggered.connect(self.open_form_article) + self.action_open_chat = QAction( + QgsApplication.getThemeIcon("mActionOpenTableVisible.svg"), + self.tr("Open QChat"), + self.iface.mainWindow(), + ) + self.action_open_chat.triggered.connect(self.open_chat) + self.action_help = QAction( QIcon(QgsApplication.iconPath("mActionHelpContents.svg")), self.tr("Help"), @@ -146,6 +157,7 @@ def initGui(self): self.iface.addPluginToWebMenu(__title__, self.action_contents) self.iface.addPluginToWebMenu(__title__, self.action_form_rdp_news) self.iface.addPluginToWebMenu(__title__, self.action_form_article) + self.iface.addPluginToWebMenu(__title__, self.action_open_chat) self.iface.addPluginToWebMenu(__title__, self.action_splash) self.iface.addPluginToWebMenu(__title__, self.action_settings) self.iface.addPluginToWebMenu(__title__, self.action_help) @@ -292,7 +304,7 @@ def on_show_latest_content(self): ) raise err - def contents(self): + def open_contents(self) -> None: """Action to open contents dialog""" if not self.form_contents: self.form_contents = GeotribuContentsDialog() @@ -341,3 +353,9 @@ def _post_form_rdp_news(self, dialog_result: int) -> None: # clean up self.form_rdp_news.deleteLater() self.form_rdp_news = None + + def open_chat(self) -> None: + if not self.qchat_widget: + self.qchat_widget = QChatWidget(self.iface.mainWindow()) + self.iface.addDockWidget(int(Qt.RightDockWidgetArea), self.qchat_widget) + self.qchat_widget.show() diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index e5bba271..72714013 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -36,6 +36,10 @@ class PlgSettingsStructure: rss_source: str = "https://geotribu.fr/feed_rss_created.xml" rss_poll_frequency_hours: int = 24 + # QChat + qchat_instance_uri: str = "http://localhost:8000" + qchat_nickname: str = "John Doe" + # usage browser: int = 1 notify_push_info: bool = True From 6288f04eb4786691b0e66e9987d1f8fc128402dd Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 11:17:37 +0200 Subject: [PATCH 003/112] refactor messages fetching --- qtribu/logic/qchat_client.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 12093663..4f60c0c5 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -14,13 +14,17 @@ b"User-Agent": bytes(f"{__title__}/{__version__}", "utf8"), } +NB_MESSAGES_TO_FETCH = 6 + class QChatApiClient: """ QChat API client """ - def __init__(self, instance_uri: str, nb_messages_to_fetch: int = 12): + def __init__( + self, instance_uri: str, nb_messages_to_fetch: int = NB_MESSAGES_TO_FETCH + ): self.instance_uri = instance_uri self.nb_messages_to_fetch = nb_messages_to_fetch self.qntwk = NetworkRequestsManager() From dbdca1e4bea45ca0d02779571f5d4d278d33e5cd Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 11:17:54 +0200 Subject: [PATCH 004/112] display dates with time format --- qtribu/gui/wdg_qchat.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index c7a2e8e5..d3c823aa 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -142,8 +142,9 @@ def add_message_to_treeview(self, room: str, message: dict[str, Any]) -> None: item = QTreeWidgetItem( [ room, - # TODO: convert date to nice format like %H:%M - message["date_posted"], + datetime.strptime( + message["date_posted"], "%Y-%m-%dT%H:%M:%SZ" + ).strftime("%H:%M"), message["author"], message["message"], ] From 736268fa2bdeb7fa053ad93567b6e4b4c5be60cf Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 12:30:50 +0200 Subject: [PATCH 005/112] add websocket client --- qtribu/gui/wdg_qchat.py | 79 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index d3c823aa..7f90ed13 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -1,13 +1,16 @@ # standard +import json from datetime import datetime +from functools import partial from pathlib import Path from typing import Any from qgis.gui import QgsDockWidget # PyQGIS -from qgis.PyQt import uic -from qgis.PyQt.QtWidgets import QTreeWidgetItem, QWidget +from qgis.PyQt import QtWebSockets, uic +from qgis.PyQt.QtCore import QUrl +from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget from qtribu.logic.qchat_client import QChatApiClient @@ -60,7 +63,16 @@ def __init__(self, parent: QWidget = None): ] ) - def load_settings(self) -> dict: + # initialize websocket client + self.ws_client = QtWebSockets.QWebSocket( + "", QtWebSockets.QWebSocketProtocol.Version13, None + ) + self.ws_client.textMessageReceived.connect(self.on_ws_message_received) + + # send message signal listener + self.btn_send.pressed.connect(self.on_send_button_clicked) + + def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" self.lb_instance.setText(self.settings.qchat_instance_uri) self.le_nickname.setText(self.settings.qchat_nickname) @@ -76,11 +88,12 @@ def on_room_changed(self) -> None: """ old_room = self.current_room new_room = self.cb_room.currentText() + is_marker = old_room != MARKER_VALUE if new_room == MARKER_VALUE: - self.disconnect_from_room() + self.disconnect_from_room(log=is_marker, close_ws=is_marker) self.current_room = MARKER_VALUE return - self.disconnect_from_room(log=old_room != MARKER_VALUE) + self.disconnect_from_room(log=is_marker, close_ws=is_marker) self.connect_to_room(new_room) self.current_room = new_room @@ -115,11 +128,18 @@ def connect_to_room(self, room: str, log: bool = True) -> None: qtw_item = self.add_message_to_treeview(room, message) self.tw_chat.insertTopLevelItem(0, qtw_item) + ws_instance_url = "ws://" + self.settings.qchat_instance_uri.split("://")[-1] + ws_url = f"{ws_instance_url}/room/{room}/ws" + self.ws_client.open(QUrl(ws_url)) + self.ws_client.connected.connect(partial(self.on_ws_connected, room)) + + def on_ws_connected(self, room: str) -> None: self.btn_connect.setText(self.tr("Disconnect")) self.lb_status.setText("Connected") + self.current_room = room self.connected = True - def disconnect_from_room(self, log: bool = True) -> None: + def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: if log: self.tw_chat.insertTopLevelItem( 0, @@ -137,8 +157,53 @@ def disconnect_from_room(self, log: bool = True) -> None: self.btn_connect.setText(self.tr("Connect")) self.lb_status.setText("Disconnected") self.connected = False + if close_ws: + self.ws_client.connected.disconnect() + self.ws_client.close() + + def on_ws_disconnected(self) -> None: + self.btn_connect.setText(self.tr("Connect")) + self.lb_status.setText("Disconnected") + self.connected = False + + def on_ws_error(self, error_code) -> None: + QTreeWidgetItem( + [ + "ERROR", + datetime.now().strftime("%H:%M"), + self.tr("Admin"), + self.ws_client.errorString(), + ] + ), + + def on_ws_message_received(self, message: str) -> None: + message = json.loads(message) + self.tw_chat.insertTopLevelItem( + 0, self.add_message_to_treeview(message["room"], message) + ) + + def on_send_button_clicked(self) -> None: + nickname = self.le_nickname.text() + message_text = self.le_message.text() + + # check if nickname and message are correctly filled + if not nickname or not message_text: + QMessageBox.warning( + self, + self.tr("Impossible"), + self.tr("Nickname and message boxes must be filled"), + ) + return + + # send message to websocket + message = {"message": message_text, "author": nickname} + self.ws_client.sendTextMessage(json.dumps(message)) + self.le_message.setText("") + self.save_settings() - def add_message_to_treeview(self, room: str, message: dict[str, Any]) -> None: + def add_message_to_treeview( + self, room: str, message: dict[str, Any] + ) -> QTreeWidgetItem: item = QTreeWidgetItem( [ room, From 8724240b0ede22e29077ec9994b41b4fcc1d8029 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 17:00:22 +0200 Subject: [PATCH 006/112] add clear chat button --- qtribu/gui/wdg_qchat.py | 18 ++++++++++-------- qtribu/gui/wdg_qchat.ui | 7 +++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 7f90ed13..ff16cfdf 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -5,10 +5,11 @@ from pathlib import Path from typing import Any -from qgis.gui import QgsDockWidget - # PyQGIS -from qgis.PyQt import QtWebSockets, uic +# +from PyQt5 import QtWebSockets # noqa QGS103 +from qgis.gui import QgsDockWidget +from qgis.PyQt import uic from qgis.PyQt.QtCore import QUrl from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget @@ -63,6 +64,9 @@ def __init__(self, parent: QWidget = None): ] ) + # clear chat signal listener + self.btn_clear_chat.pressed.connect(self.on_clear_chat_button_clicked) + # initialize websocket client self.ws_client = QtWebSockets.QWebSocket( "", QtWebSockets.QWebSocketProtocol.Version13, None @@ -110,8 +114,6 @@ def on_connect_button_clicked(self) -> None: self.connect_to_room(room) def connect_to_room(self, room: str, log: bool = True) -> None: - messages = self.qchat_client.get_last_messages(room) - messages.reverse() if log: self.tw_chat.insertTopLevelItem( 0, @@ -124,9 +126,6 @@ def connect_to_room(self, room: str, log: bool = True) -> None: ] ), ) - for message in messages: - qtw_item = self.add_message_to_treeview(room, message) - self.tw_chat.insertTopLevelItem(0, qtw_item) ws_instance_url = "ws://" + self.settings.qchat_instance_uri.split("://")[-1] ws_url = f"{ws_instance_url}/room/{room}/ws" @@ -182,6 +181,9 @@ def on_ws_message_received(self, message: str) -> None: 0, self.add_message_to_treeview(message["room"], message) ) + def on_clear_chat_button_clicked(self) -> None: + self.tw_chat.clear() + def on_send_button_clicked(self) -> None: nickname = self.le_nickname.text() message_text = self.le_message.text() diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 98a5db53..2ef62cfa 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -177,6 +177,13 @@ + + + + Clear + + + From e6ff55c384ccbb5bb305d16874a937197f960086 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 17:10:50 +0200 Subject: [PATCH 007/112] set nice icons --- qtribu/gui/wdg_qchat.py | 9 +++++++++ qtribu/plugin_main.py | 8 ++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index ff16cfdf..11df8b73 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -8,9 +8,11 @@ # PyQGIS # from PyQt5 import QtWebSockets # noqa QGS103 +from qgis.core import QgsApplication from qgis.gui import QgsDockWidget from qgis.PyQt import uic from qgis.PyQt.QtCore import QUrl +from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget from qtribu.logic.qchat_client import QChatApiClient @@ -53,6 +55,7 @@ def __init__(self, parent: QWidget = None): # connect signal listener self.connected = False self.btn_connect.pressed.connect(self.on_connect_button_clicked) + self.btn_connect.setIcon(QIcon(QgsApplication.iconPath("mIconConnect.svg"))) # tree widget initialization self.tw_chat.setHeaderLabels( @@ -66,6 +69,9 @@ def __init__(self, parent: QWidget = None): # clear chat signal listener self.btn_clear_chat.pressed.connect(self.on_clear_chat_button_clicked) + self.btn_clear_chat.setIcon( + QIcon(QgsApplication.iconPath("mActionDeleteSelectedFeatures.svg")) + ) # initialize websocket client self.ws_client = QtWebSockets.QWebSocket( @@ -75,6 +81,9 @@ def __init__(self, parent: QWidget = None): # send message signal listener self.btn_send.pressed.connect(self.on_send_button_clicked) + self.btn_send.setIcon( + QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg")) + ) def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index d9eba975..24d197cd 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -102,13 +102,13 @@ def initGui(self): self.action_show_latest_content.setToolTip(self.tr("Newest article")) self.action_show_latest_content.triggered.connect(self.on_show_latest_content) - self.action_contents = QAction( + self.action_open_contents = QAction( QgsApplication.getThemeIcon("mActionOpenTableVisible.svg"), self.tr("Browse latest contents"), self.iface.mainWindow(), ) - self.action_contents.setToolTip(self.tr("Browse latest contents")) - self.action_contents.triggered.connect(self.open_contents) + self.action_open_contents.setToolTip(self.tr("Browse latest contents")) + self.action_open_contents.triggered.connect(self.open_contents) self.action_form_rdp_news = QAction( ICON_GEORDP, @@ -125,7 +125,7 @@ def initGui(self): self.action_form_article.triggered.connect(self.open_form_article) self.action_open_chat = QAction( - QgsApplication.getThemeIcon("mActionOpenTableVisible.svg"), + QgsApplication.getThemeIcon("mMessageLog.svg"), self.tr("Open QChat"), self.iface.mainWindow(), ) From 1d1fa156215a0e847104d3d216f573543a3440d8 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 18 Jul 2024 17:20:27 +0200 Subject: [PATCH 008/112] docstring and displayed date format --- qtribu/gui/wdg_qchat.py | 47 ++++++++++++++++++++++++++++++++++------- qtribu/gui/wdg_qchat.ui | 3 +++ qtribu/plugin_main.py | 2 +- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 11df8b73..41dcc5b1 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -22,6 +22,7 @@ # -- GLOBALS -- MARKER_VALUE = "---" +DISPLAY_DATE_FORMAT = "%H:%M:%S" class QChatWidget(QgsDockWidget): @@ -62,7 +63,7 @@ def __init__(self, parent: QWidget = None): [ self.tr("Room"), self.tr("Date"), - self.tr("Nick"), + self.tr("Nickname"), self.tr("Message"), ] ) @@ -123,13 +124,16 @@ def on_connect_button_clicked(self) -> None: self.connect_to_room(room) def connect_to_room(self, room: str, log: bool = True) -> None: + """ + Connect widget to a specific room + """ if log: self.tw_chat.insertTopLevelItem( 0, QTreeWidgetItem( [ room, - datetime.now().strftime("%H:%M"), + datetime.now().strftime(DISPLAY_DATE_FORMAT), self.tr("Admin"), self.tr("Connected to room '{room}'").format(room=room), ] @@ -142,19 +146,26 @@ def connect_to_room(self, room: str, log: bool = True) -> None: self.ws_client.connected.connect(partial(self.on_ws_connected, room)) def on_ws_connected(self, room: str) -> None: + """ + Action called when websocket is connected to a room + """ self.btn_connect.setText(self.tr("Disconnect")) self.lb_status.setText("Connected") + self.grb_user.setEnabled(True) self.current_room = room self.connected = True def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: + """ + Disconnect widget from the current room + """ if log: self.tw_chat.insertTopLevelItem( 0, QTreeWidgetItem( [ self.current_room, - datetime.now().strftime("%H:%M"), + datetime.now().strftime(DISPLAY_DATE_FORMAT), self.tr("Admin"), self.tr("Disconnected from room '{room}'").format( room=self.current_room @@ -164,36 +175,55 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: ) self.btn_connect.setText(self.tr("Connect")) self.lb_status.setText("Disconnected") + self.grb_user.setEnabled(False) self.connected = False if close_ws: self.ws_client.connected.disconnect() self.ws_client.close() def on_ws_disconnected(self) -> None: + """ + Action called when websocket is disconnected + """ self.btn_connect.setText(self.tr("Connect")) self.lb_status.setText("Disconnected") + self.grb_user.setEnabled(False) self.connected = False - def on_ws_error(self, error_code) -> None: + def on_ws_error(self, error_code: int) -> None: + """ + Action called when an error appears on the websocket + """ QTreeWidgetItem( [ "ERROR", - datetime.now().strftime("%H:%M"), + datetime.now().strftime(DISPLAY_DATE_FORMAT), self.tr("Admin"), self.ws_client.errorString(), ] ), def on_ws_message_received(self, message: str) -> None: + """ + Action called when a message is received from the websocket + """ message = json.loads(message) self.tw_chat.insertTopLevelItem( 0, self.add_message_to_treeview(message["room"], message) ) def on_clear_chat_button_clicked(self) -> None: + """ + Action called when the clear chat button is clicked + """ self.tw_chat.clear() def on_send_button_clicked(self) -> None: + """ + Action called when the send button is clicked + """ + + # retrieve nickname and message nickname = self.le_nickname.text() message_text = self.le_message.text() @@ -215,12 +245,13 @@ def on_send_button_clicked(self) -> None: def add_message_to_treeview( self, room: str, message: dict[str, Any] ) -> QTreeWidgetItem: + """ + Creates a QTreeWidgetItem from a QChat message dict + """ item = QTreeWidgetItem( [ room, - datetime.strptime( - message["date_posted"], "%Y-%m-%dT%H:%M:%SZ" - ).strftime("%H:%M"), + datetime.now().strftime("%H:%M:%S"), message["author"], message["message"], ] diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 2ef62cfa..cbaf6718 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -189,6 +189,9 @@ + + false + 0 diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index 24d197cd..8f2b0ed3 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -126,7 +126,7 @@ def initGui(self): self.action_open_chat = QAction( QgsApplication.getThemeIcon("mMessageLog.svg"), - self.tr("Open QChat"), + self.tr("QChat"), self.iface.mainWindow(), ) self.action_open_chat.triggered.connect(self.open_chat) From bae1061b62cbc9c72871db4c72b0a8eb0d9c69a0 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 17:59:18 +0200 Subject: [PATCH 009/112] add send message action on return press --- qtribu/gui/wdg_qchat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 41dcc5b1..1f52dadf 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -81,6 +81,7 @@ def __init__(self, parent: QWidget = None): self.ws_client.textMessageReceived.connect(self.on_ws_message_received) # send message signal listener + self.le_message.returnPressed.connect(self.on_send_button_clicked) self.btn_send.pressed.connect(self.on_send_button_clicked) self.btn_send.setIcon( QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg")) From 4a22bcdc2767d9ba1b898c7bf5d78ffcac40f182 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 18:00:19 +0200 Subject: [PATCH 010/112] edit buttons cursors --- qtribu/gui/wdg_qchat.ui | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index cbaf6718..90d05458 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -93,6 +93,9 @@ + + PointingHandCursor + Connect @@ -179,6 +182,9 @@ + + PointingHandCursor + Clear @@ -236,6 +242,9 @@ + + PointingHandCursor + Send message From be93bdd84eac81ad5d562f3bd1799be110599aff Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 18:03:14 +0200 Subject: [PATCH 011/112] fix ws disconnection issue --- qtribu/gui/wdg_qchat.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 1f52dadf..3bf33a0b 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -103,12 +103,13 @@ def on_room_changed(self) -> None: """ old_room = self.current_room new_room = self.cb_room.currentText() - is_marker = old_room != MARKER_VALUE + old_is_marker = old_room != MARKER_VALUE if new_room == MARKER_VALUE: - self.disconnect_from_room(log=is_marker, close_ws=is_marker) + if self.connected: + self.disconnect_from_room(log=old_is_marker, close_ws=old_is_marker) self.current_room = MARKER_VALUE return - self.disconnect_from_room(log=is_marker, close_ws=is_marker) + self.disconnect_from_room(log=old_is_marker, close_ws=old_is_marker) self.connect_to_room(new_room) self.current_room = new_room From b96d3718d58898e8c5204b936d0e97d647687cd6 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 19:11:09 +0200 Subject: [PATCH 012/112] fix rooms fetch from API --- qtribu/logic/qchat_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 4f60c0c5..80717491 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -29,7 +29,7 @@ def __init__( self.nb_messages_to_fetch = nb_messages_to_fetch self.qntwk = NetworkRequestsManager() - def get_rooms(self) -> list[dict[str, Any]]: + def get_rooms(self) -> list[str]: """ Get available rooms with an API HTTP call """ From 705744df07fd63ce22299247347be382df107f48 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 19:11:32 +0200 Subject: [PATCH 013/112] add dizzy cheatcode --- qtribu/constants.py | 2 ++ qtribu/gui/wdg_qchat.py | 15 ++++++++---- qtribu/plugin_main.py | 4 +++- qtribu/tasks/__init__.py | 0 qtribu/tasks/dizzy.py | 51 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 qtribu/tasks/__init__.py create mode 100644 qtribu/tasks/dizzy.py diff --git a/qtribu/constants.py b/qtribu/constants.py index bb0f9324..8e592a84 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -190,3 +190,5 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path description="icône globe pointillisme", ), ) + +CHEATCODE_DIZZY = "givemesomecheese" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 3bf33a0b..6aa45f3d 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -9,13 +9,15 @@ # from PyQt5 import QtWebSockets # noqa QGS103 from qgis.core import QgsApplication -from qgis.gui import QgsDockWidget +from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic from qgis.PyQt.QtCore import QUrl from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget +from qtribu.constants import CHEATCODE_DIZZY from qtribu.logic.qchat_client import QChatApiClient +from qtribu.tasks.dizzy import DizzyTask # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager @@ -26,13 +28,14 @@ class QChatWidget(QgsDockWidget): - def __init__(self, parent: QWidget = None): + def __init__(self, iface: QgisInterface, parent: QWidget = None): """QWidget to see and post messages on chat :param parent: parent widget or application :type parent: QWidget """ super().__init__(parent) + self.iface = iface self.log = PlgLogger().log self.plg_settings = PlgOptionsManager() uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) @@ -48,7 +51,7 @@ def __init__(self, parent: QWidget = None): rooms = self.qchat_client.get_rooms() self.cb_room.addItem(MARKER_VALUE) for room in rooms: - self.cb_room.addItem(room["name"]) + self.cb_room.addItem(room) self.current_room = MARKER_VALUE self.cb_room.currentIndexChanged.connect(self.on_room_changed) @@ -210,8 +213,12 @@ def on_ws_message_received(self, message: str) -> None: Action called when a message is received from the websocket """ message = json.loads(message) + if message["message"] == CHEATCODE_DIZZY: + task = DizzyTask("Cheatcode activation", self.iface) + QgsApplication.taskManager().addTask(task) + return self.tw_chat.insertTopLevelItem( - 0, self.add_message_to_treeview(message["room"], message) + 0, self.add_message_to_treeview(self.current_room, message) ) def on_clear_chat_button_clicked(self) -> None: diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index 8f2b0ed3..6aa27fc4 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -356,6 +356,8 @@ def _post_form_rdp_news(self, dialog_result: int) -> None: def open_chat(self) -> None: if not self.qchat_widget: - self.qchat_widget = QChatWidget(self.iface.mainWindow()) + self.qchat_widget = QChatWidget( + iface=self.iface, parent=self.iface.mainWindow() + ) self.iface.addDockWidget(int(Qt.RightDockWidgetArea), self.qchat_widget) self.qchat_widget.show() diff --git a/qtribu/tasks/__init__.py b/qtribu/tasks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/qtribu/tasks/dizzy.py b/qtribu/tasks/dizzy.py new file mode 100644 index 00000000..4d3c1516 --- /dev/null +++ b/qtribu/tasks/dizzy.py @@ -0,0 +1,51 @@ +import random +from datetime import datetime, timedelta +from time import sleep + +from qgis.core import QgsTask +from qgis.gui import QgisInterface +from qgis.PyQt.QtGui import QTransform + + +class DizzyTask(QgsTask): + def __init__( + self, + description: str, + iface: QgisInterface, + duration: float = 3, + refresh: float = 0.15, + max_offset: int = 12, + max_angle: int = 6, + ): + super().__init__(description, QgsTask.CanCancel) + self.iface = iface + self.duration = duration + self.refresh = refresh + self.max_offset = max_offset + self.max_angle = max_angle + + def run(self) -> bool: + stop_time = datetime.now() + timedelta(seconds=self.duration) + d = self.max_offset + r = self.max_angle + canvas = self.iface.mapCanvas() + while datetime.now() < stop_time: + if self.isCancelled(): + break + rect = canvas.sceneRect() + if rect.x() < -d or rect.x() > d or rect.y() < -d or rect.y() > d: + # do not affect panning + pass + else: + rect.moveTo(random.randint(-d, d), random.randint(-d, d)) + canvas.setSceneRect(rect) + matrix = QTransform() + matrix.rotate(random.randint(-r, r)) + canvas.setTransform(matrix) + sleep(self.refresh) + return True + + def finished(self, result: bool) -> None: + canvas = self.iface.mapCanvas() + canvas.setSceneRect(canvas.sceneRect()) + canvas.setTransform(QTransform()) From 3b9ace19c5b344c9c4dfae2fc6e266f707b89e87 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 19 Jul 2024 19:40:07 +0200 Subject: [PATCH 014/112] disconnect when widget is closed --- qtribu/gui/wdg_qchat.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 6aa45f3d..7b1fc6cc 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -90,6 +90,9 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg")) ) + # widget closed signal + self.closed.connect(self.on_widget_closed) + def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" self.lb_instance.setText(self.settings.qchat_instance_uri) @@ -260,9 +263,16 @@ def add_message_to_treeview( item = QTreeWidgetItem( [ room, - datetime.now().strftime("%H:%M:%S"), + datetime.now().strftime(DISPLAY_DATE_FORMAT), message["author"], message["message"], ] ) return item + + def on_widget_closed(self) -> None: + """ + Action called when the widget is closed + """ + if self.connected: + self.disconnect_from_room() From 8ddb95dbc970ccdc443683931cad49163cdb2585 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 07:36:34 +0200 Subject: [PATCH 015/112] add instance status button + exception handling --- qtribu/gui/wdg_qchat.py | 38 +++++++++++++++++++--- qtribu/gui/wdg_qchat.ui | 63 +++++++++++++++++++++++------------- qtribu/logic/qchat_client.py | 12 +++---- 3 files changed, 80 insertions(+), 33 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 7b1fc6cc..332ea31a 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -47,12 +47,20 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): # initialize QChat API client self.qchat_client = QChatApiClient(self.settings.qchat_instance_uri) + # status signal listener + self.btn_status.pressed.connect(self.on_status_button_clicked) + self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) + # load rooms - rooms = self.qchat_client.get_rooms() self.cb_room.addItem(MARKER_VALUE) - for room in rooms: - self.cb_room.addItem(room) - self.current_room = MARKER_VALUE + try: + rooms = self.qchat_client.get_rooms() + for room in rooms: + self.cb_room.addItem(room) + except Exception as exc: + self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) + finally: + self.current_room = MARKER_VALUE self.cb_room.currentIndexChanged.connect(self.on_room_changed) @@ -103,6 +111,28 @@ def save_settings(self) -> None: self.settings.qchat_nickname = self.le_nickname.text() self.plg_settings.save_from_object(self.settings) + def on_status_button_clicked(self) -> None: + """ + Action called when clicking on "Status" button + """ + try: + status = self.qchat_client.get_status() + text = """Status: {status} + +Rooms: +{rooms_status}""".format( + status=status["status"], + rooms_status="\n".join( + [ + f"- {r['name']} : {r['nb_connected_users']} user(s)" + for r in status["rooms"] + ] + ), + ) + QMessageBox.information(self, self.tr("QChat instance status"), text) + except Exception as exc: + QMessageBox.critical(self, self.tr("QChat error"), str(exc)) + def on_room_changed(self) -> None: """ Action called when room index is changed in the room combobox diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 90d05458..7a285a10 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -54,44 +54,31 @@ Rooms - + Room: - + Status: - - - - - 0 - 0 - - - - Instance: - - - - + - + Not connected - + PointingHandCursor @@ -102,11 +89,41 @@ - - - INSTANCE - - + + + + + + 0 + 0 + + + + Instance: + + + + + + + Instance set in QTribu's plugin settings + + + INSTANCE + + + + + + + Check instance status + + + Status + + + + diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 80717491..4ab8b324 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -29,11 +29,11 @@ def __init__( self.nb_messages_to_fetch = nb_messages_to_fetch self.qntwk = NetworkRequestsManager() - def get_rooms(self) -> list[str]: + def get_status(self) -> dict[str, Any]: """ - Get available rooms with an API HTTP call + Get instance status with an API call """ - url = f"{self.instance_uri}/rooms" + url = f"{self.instance_uri}/status" response: QByteArray = self.qntwk.get_from_source( headers=HEADERS, url=url, @@ -42,11 +42,11 @@ def get_rooms(self) -> list[str]: data = json.loads(str(response, "UTF8")) return data - def get_last_messages(self, room: str) -> list[dict[str, Any]]: + def get_rooms(self) -> list[str]: """ - Get last chat messages for a room with an API HTTP call + Get available rooms with an API HTTP call """ - url = f"{self.instance_uri}/room/{room}/messages/{self.nb_messages_to_fetch}" + url = f"{self.instance_uri}/rooms" response: QByteArray = self.qntwk.get_from_source( headers=HEADERS, url=url, From 959aae91b42c48ce78e8daca2be7ace76fecc2cc Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 08:23:01 +0200 Subject: [PATCH 016/112] fix qchat settings --- qtribu/gui/dlg_settings.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 1d2ed2bb..c3249e98 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -94,6 +94,10 @@ def apply(self): settings.integration_qgis_news_feed = self.chb_integration_news_feed.isChecked() settings.license_global_accept = self.chb_license_global_accept.isChecked() + # qchat + settings.qchat_instance_uri = self.le_qchat_instance_uri.text() + settings.qchat_nickname = self.le_qchat_nickname.text() + # misc settings.debug_mode = self.opt_debug.isChecked() settings.version = __version__ @@ -123,7 +127,7 @@ def load_settings(self) -> dict: # qchat self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) - self.le_qchat_nick_name.setText(settings.qchat_nickname) + self.le_qchat_nickname.setText(settings.qchat_nickname) # misc self.opt_debug.setChecked(settings.debug_mode) From e9a36d04c1d19d7225f32dae50a00e92d30a25c8 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 08:38:16 +0200 Subject: [PATCH 017/112] add qchat action to toolbar --- qtribu/plugin_main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index 6aa27fc4..e5ee2500 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -115,6 +115,9 @@ def initGui(self): self.tr("Propose a news to the next GeoRDP"), self.iface.mainWindow(), ) + self.action_form_rdp_news.setToolTip( + self.tr("Propose a news to the next GeoRDP") + ) self.action_form_rdp_news.triggered.connect(self.open_form_rdp_news) self.action_form_article = QAction( @@ -122,6 +125,7 @@ def initGui(self): self.tr("Submit an article"), self.iface.mainWindow(), ) + self.action_form_article.setToolTip(self.tr("Submit an article")) self.action_form_article.triggered.connect(self.open_form_article) self.action_open_chat = QAction( @@ -129,6 +133,7 @@ def initGui(self): self.tr("QChat"), self.iface.mainWindow(), ) + self.action_open_chat.setToolTip(self.tr("QChat")) self.action_open_chat.triggered.connect(self.open_chat) self.action_help = QAction( @@ -201,7 +206,7 @@ def initGui(self): # -- Toolbar self.toolbar.addAction(self.action_show_latest_content) - self.toolbar.addAction(self.action_contents) + self.toolbar.addAction(self.action_open_chat) self.toolbar.addAction(self.action_form_rdp_news) self.toolbar.addAction(self.action_form_article) From 88670de85d62a4e585900984fc23f4bbdc581613 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 09:46:54 +0200 Subject: [PATCH 018/112] init stuff on widget open --- qtribu/gui/wdg_qchat.py | 61 +++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 332ea31a..cff94cf3 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -21,6 +21,7 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager +from qtribu.toolbelt.preferences import PlgSettingsStructure # -- GLOBALS -- MARKER_VALUE = "---" @@ -28,6 +29,13 @@ class QChatWidget(QgsDockWidget): + + connected: bool = False + current_room: str = None + + settings: PlgSettingsStructure + qchat_client = QChatApiClient + def __init__(self, iface: QgisInterface, parent: QWidget = None): """QWidget to see and post messages on chat @@ -40,27 +48,13 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.plg_settings = PlgOptionsManager() uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) - # fill fields from saved settings - self.settings = self.plg_settings.get_plg_settings() - self.load_settings() - - # initialize QChat API client - self.qchat_client = QChatApiClient(self.settings.qchat_instance_uri) - # status signal listener self.btn_status.pressed.connect(self.on_status_button_clicked) self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) - # load rooms - self.cb_room.addItem(MARKER_VALUE) - try: - rooms = self.qchat_client.get_rooms() - for room in rooms: - self.cb_room.addItem(room) - except Exception as exc: - self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) - finally: - self.current_room = MARKER_VALUE + # widget opened / closed signals + self.opened.connect(self.on_widget_opened) + self.closed.connect(self.on_widget_closed) self.cb_room.currentIndexChanged.connect(self.on_room_changed) @@ -98,9 +92,6 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg")) ) - # widget closed signal - self.closed.connect(self.on_widget_closed) - def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" self.lb_instance.setText(self.settings.qchat_instance_uri) @@ -111,6 +102,32 @@ def save_settings(self) -> None: self.settings.qchat_nickname = self.le_nickname.text() self.plg_settings.save_from_object(self.settings) + def on_widget_opened(self) -> None: + """ + Action called when the widget is opened + """ + + # fill fields from saved settings + self.settings = self.plg_settings.get_plg_settings() + self.load_settings() + + # initialize QChat API client + self.qchat_client = QChatApiClient(self.settings.qchat_instance_uri) + + # clear rooms combobox items + self.cb_room.clear() # delete all items from comboBox + + # load rooms + self.cb_room.addItem(MARKER_VALUE) + try: + rooms = self.qchat_client.get_rooms() + for room in rooms: + self.cb_room.addItem(room) + except Exception as exc: + self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) + finally: + self.current_room = MARKER_VALUE + def on_status_button_clicked(self) -> None: """ Action called when clicking on "Status" button @@ -178,7 +195,9 @@ def connect_to_room(self, room: str, log: bool = True) -> None: ), ) - ws_instance_url = "ws://" + self.settings.qchat_instance_uri.split("://")[-1] + protocol, domain = self.settings.qchat_instance_uri.split("://") + ws_protocol = "wss" if protocol == "https" else "ws" + ws_instance_url = f"{ws_protocol}://{domain}" ws_url = f"{ws_instance_url}/room/{room}/ws" self.ws_client.open(QUrl(ws_url)) self.ws_client.connected.connect(partial(self.on_ws_connected, room)) From c3016fe9e1f6dad28f935128c312cc28c0941b92 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 10:42:38 +0200 Subject: [PATCH 019/112] set taskmanager in widget initialization --- qtribu/gui/wdg_qchat.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index cff94cf3..5ae84923 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -3,7 +3,7 @@ from datetime import datetime from functools import partial from pathlib import Path -from typing import Any +from typing import Any, Optional # PyQGIS # @@ -31,7 +31,7 @@ class QChatWidget(QgsDockWidget): connected: bool = False - current_room: str = None + current_room: Optional[str] = None settings: PlgSettingsStructure qchat_client = QChatApiClient @@ -44,6 +44,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): """ super().__init__(parent) self.iface = iface + self.task_manager = QgsApplication.taskManager() self.log = PlgLogger().log self.plg_settings = PlgOptionsManager() uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) @@ -267,7 +268,7 @@ def on_ws_message_received(self, message: str) -> None: message = json.loads(message) if message["message"] == CHEATCODE_DIZZY: task = DizzyTask("Cheatcode activation", self.iface) - QgsApplication.taskManager().addTask(task) + self.task_manager.addTask(task) return self.tw_chat.insertTopLevelItem( 0, self.add_message_to_treeview(self.current_room, message) From 097787a93d015ed9c3df514ef8b3f9d1feb99f91 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 10:47:26 +0200 Subject: [PATCH 020/112] do not use cache when fetching qchat instance status --- qtribu/logic/qchat_client.py | 1 + qtribu/toolbelt/network_manager.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 4ab8b324..8212fe46 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -38,6 +38,7 @@ def get_status(self) -> dict[str, Any]: headers=HEADERS, url=url, response_expected_content_type="application/json", + use_cache=False, ) data = json.loads(str(response, "UTF8")) return data diff --git a/qtribu/toolbelt/network_manager.py b/qtribu/toolbelt/network_manager.py index 62eb0ac1..861fa529 100644 --- a/qtribu/toolbelt/network_manager.py +++ b/qtribu/toolbelt/network_manager.py @@ -115,9 +115,10 @@ def get_from_source( url: Optional[str] = None, headers: Optional[dict] = None, response_expected_content_type: str = "application/xml", + use_cache: bool = True, ) -> Optional[QByteArray]: """Method to retrieve a RSS feed from a referenced source in preferences. \ - Use cache. + Can use cache if wanted, or not. :raises ConnectionError: if any problem occurs during feed fetching. :raises TypeError: if response mime-type is not valid @@ -151,7 +152,7 @@ def get_from_source( req_status = self.ntwk_requester.get( request=req, - forceRefresh=False, + forceRefresh=not use_cache, ) # check if request is fine From 355f7ebafc5838350eefd79f9beafec065d47c3b Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 15:04:58 +0200 Subject: [PATCH 021/112] add instance rules actions --- qtribu/gui/dlg_settings.py | 18 +++++++++++++++++- qtribu/gui/dlg_settings.ui | 7 +++++++ qtribu/gui/wdg_qchat.py | 33 +++++++++++++++++++++++++++++---- qtribu/gui/wdg_qchat.ui | 18 ++++++------------ qtribu/logic/qchat_client.py | 25 ++++++++++++++++++++----- 5 files changed, 79 insertions(+), 22 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index c3249e98..595003b9 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -13,7 +13,7 @@ from qgis.gui import QgsOptionsPageWidget, QgsOptionsWidgetFactory from qgis.PyQt import uic from qgis.PyQt.QtGui import QIcon -from qgis.PyQt.QtWidgets import QButtonGroup +from qgis.PyQt.QtWidgets import QButtonGroup, QMessageBox # project from qtribu.__about__ import ( @@ -23,6 +23,7 @@ __uri_tracker__, __version__, ) +from qtribu.logic.qchat_client import QChatApiClient from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.commons import open_url_in_browser from qtribu.toolbelt.preferences import PlgSettingsStructure @@ -59,6 +60,9 @@ def __init__(self, parent=None): self.opt_browser_group.addButton(self.opt_browser_qt, 1) self.opt_browser_group.addButton(self.opt_browser_os, 2) + self.btn_rules.pressed.connect(self.show_instance_rules) + self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("mIconWarning.svg"))) + # customization self.btn_help.setIcon(QIcon(QgsApplication.iconPath("mActionHelpContents.svg"))) self.btn_help.pressed.connect(partial(open_url_in_browser, __uri_homepage__)) @@ -133,6 +137,18 @@ def load_settings(self) -> dict: self.opt_debug.setChecked(settings.debug_mode) self.lbl_version_saved_value.setText(settings.version) + def show_instance_rules(self) -> None: + instance_url = self.le_qchat_instance_uri.text() + client = QChatApiClient(instance_url) + rules = client.get_rules() + QMessageBox.information( + self, + self.tr("Instance rules"), + self.tr("Instance rules ({instance_url}):\n\n{rules}").format( + instance_url=instance_url, rules=rules["rules"] + ), + ) + def reset_read_history(self): """Set latest_content_guid to None.""" new_settings = PlgSettingsStructure( diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 61c4525c..8d270cdc 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -326,6 +326,13 @@ + + + + Instance rules + + + diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 5ae84923..cbbbeca0 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -8,7 +8,7 @@ # PyQGIS # from PyQt5 import QtWebSockets # noqa QGS103 -from qgis.core import QgsApplication +from qgis.core import Qgis, QgsApplication from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic from qgis.PyQt.QtCore import QUrl @@ -49,7 +49,9 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.plg_settings = PlgOptionsManager() uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) - # status signal listener + # rules and status signal listener + self.btn_rules.pressed.connect(self.on_rules_button_clicked) + self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("mIconWarning.svg"))) self.btn_status.pressed.connect(self.on_status_button_clicked) self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) @@ -95,7 +97,11 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" - self.lb_instance.setText(self.settings.qchat_instance_uri) + self.lb_instance.setText( + self.tr("Instance: {instance}").format( + instance=self.settings.qchat_instance_uri + ) + ) self.le_nickname.setText(self.settings.qchat_nickname) def save_settings(self) -> None: @@ -126,9 +132,27 @@ def on_widget_opened(self) -> None: self.cb_room.addItem(room) except Exception as exc: self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) + self.log(message=str(exc), log_level=Qgis.Critical) finally: self.current_room = MARKER_VALUE + def on_rules_button_clicked(self) -> None: + """ + Action called when clicking on "Rules" button + """ + try: + rules = self.qchat_client.get_rules() + QMessageBox.information( + self, + self.tr("Instance rules"), + self.tr("Instance rules ({instance_url}):\n\n{rules}").format( + instance_url=self.qchat_client.instance_uri, rules=rules["rules"] + ), + ) + except Exception as exc: + self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) + self.log(message=str(exc), log_level=Qgis.Critical) + def on_status_button_clicked(self) -> None: """ Action called when clicking on "Status" button @@ -149,7 +173,8 @@ def on_status_button_clicked(self) -> None: ) QMessageBox.information(self, self.tr("QChat instance status"), text) except Exception as exc: - QMessageBox.critical(self, self.tr("QChat error"), str(exc)) + self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) + self.log(message=str(exc), log_level=Qgis.Critical) def on_room_changed(self) -> None: """ diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 7a285a10..7a56085f 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -91,25 +91,19 @@ - - - - 0 - 0 - + + + Instance set in QTribu's plugin settings - Instance: + Instance: http://gischat.net - - - Instance set in QTribu's plugin settings - + - INSTANCE + Rules diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 8212fe46..0eab8dc0 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -14,7 +14,7 @@ b"User-Agent": bytes(f"{__title__}/{__version__}", "utf8"), } -NB_MESSAGES_TO_FETCH = 6 +CONTENT_TYPE_JSON = "application/json" class QChatApiClient: @@ -23,10 +23,10 @@ class QChatApiClient: """ def __init__( - self, instance_uri: str, nb_messages_to_fetch: int = NB_MESSAGES_TO_FETCH + self, + instance_uri: str, ): self.instance_uri = instance_uri - self.nb_messages_to_fetch = nb_messages_to_fetch self.qntwk = NetworkRequestsManager() def get_status(self) -> dict[str, Any]: @@ -37,12 +37,26 @@ def get_status(self) -> dict[str, Any]: response: QByteArray = self.qntwk.get_from_source( headers=HEADERS, url=url, - response_expected_content_type="application/json", + response_expected_content_type=CONTENT_TYPE_JSON, use_cache=False, ) data = json.loads(str(response, "UTF8")) return data + def get_rules(self) -> dict[str, str]: + """ + Get instance rules with an API call + """ + url = f"{self.instance_uri}/rules" + response: QByteArray = self.qntwk.get_from_source( + headers=HEADERS, + url=url, + response_expected_content_type=CONTENT_TYPE_JSON, + use_cache=True, + ) + data = json.loads(str(response, "UTF8")) + return data + def get_rooms(self) -> list[str]: """ Get available rooms with an API HTTP call @@ -51,7 +65,8 @@ def get_rooms(self) -> list[str]: response: QByteArray = self.qntwk.get_from_source( headers=HEADERS, url=url, - response_expected_content_type="application/json", + response_expected_content_type=CONTENT_TYPE_JSON, + use_cache=True, ) data = json.loads(str(response, "UTF8")) return data From 777a024687552a72927071ab6a02c6130b2f8b2d Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 15:05:56 +0200 Subject: [PATCH 022/112] update qchat default settings --- qtribu/toolbelt/preferences.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 72714013..4e8955ac 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -37,8 +37,8 @@ class PlgSettingsStructure: rss_poll_frequency_hours: int = 24 # QChat - qchat_instance_uri: str = "http://localhost:8000" - qchat_nickname: str = "John Doe" + qchat_instance_uri: str = "https://qchat.guilhemallaman.net" + qchat_nickname: str = "J.D." # usage browser: int = 1 From 43f127b88aeddb3e0881feed9e9871778f416066 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 16:55:14 +0200 Subject: [PATCH 023/112] set ui nice cursors --- qtribu/gui/wdg_qchat.ui | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 7a56085f..1d522ce3 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -92,6 +92,9 @@ + + ForbiddenCursor + Instance set in QTribu's plugin settings @@ -102,6 +105,9 @@ + + PointingHandCursor + Rules @@ -109,6 +115,9 @@ + + PointingHandCursor + Check instance status From 8b9d9ff501633a64654cf50eecd51ae363e8f2b0 Mon Sep 17 00:00:00 2001 From: gounux Date: Sun, 21 Jul 2024 17:03:46 +0200 Subject: [PATCH 024/112] fix disconnect bug --- qtribu/gui/wdg_qchat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index cbbbeca0..cde5c859 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -188,7 +188,8 @@ def on_room_changed(self) -> None: self.disconnect_from_room(log=old_is_marker, close_ws=old_is_marker) self.current_room = MARKER_VALUE return - self.disconnect_from_room(log=old_is_marker, close_ws=old_is_marker) + if self.connected: + self.disconnect_from_room(log=old_is_marker, close_ws=old_is_marker) self.connect_to_room(new_room) self.current_room = new_room From ce80f02400ecd5875c3fbe7b6834f6dc1efe69d9 Mon Sep 17 00:00:00 2001 From: gounux Date: Mon, 22 Jul 2024 09:17:37 +0200 Subject: [PATCH 025/112] set cheatcode optional with a pref checkbox --- qtribu/gui/dlg_settings.py | 2 ++ qtribu/gui/dlg_settings.ui | 13 ++++++++++--- qtribu/gui/wdg_qchat.py | 20 ++++++++++++++++---- qtribu/toolbelt/preferences.py | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 595003b9..e1e71057 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -101,6 +101,7 @@ def apply(self): # qchat settings.qchat_instance_uri = self.le_qchat_instance_uri.text() settings.qchat_nickname = self.le_qchat_nickname.text() + settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() # misc settings.debug_mode = self.opt_debug.isChecked() @@ -132,6 +133,7 @@ def load_settings(self) -> dict: # qchat self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) self.le_qchat_nickname.setText(settings.qchat_nickname) + self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) # misc self.opt_debug.setChecked(settings.debug_mode) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 8d270cdc..17422764 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -6,7 +6,7 @@ 0 0 - 809 + 803 468 @@ -313,7 +313,7 @@ - + Nickname: @@ -323,7 +323,7 @@ - + @@ -333,6 +333,13 @@ + + + + Activate cheatcodes + + + diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index cde5c859..25b4c29d 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -292,10 +292,10 @@ def on_ws_message_received(self, message: str) -> None: Action called when a message is received from the websocket """ message = json.loads(message) - if message["message"] == CHEATCODE_DIZZY: - task = DizzyTask("Cheatcode activation", self.iface) - self.task_manager.addTask(task) - return + if self.settings.qchat_activate_cheatcode: + activated = self.check_cheatcode(message) + if activated: + return self.tw_chat.insertTopLevelItem( 0, self.add_message_to_treeview(self.current_room, message) ) @@ -352,3 +352,15 @@ def on_widget_closed(self) -> None: """ if self.connected: self.disconnect_from_room() + + def check_cheatcode(self, message: dict[str, str]) -> bool: + """ + Checks if a received message contains a cheatcode + Does action if necessary + Returns true if a cheatcode has been activated + """ + if message["message"] == CHEATCODE_DIZZY: + task = DizzyTask(f"Cheatcode activation: {CHEATCODE_DIZZY}", self.iface) + self.task_manager.addTask(task) + return True + return False diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 4e8955ac..a112b0b5 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -39,6 +39,7 @@ class PlgSettingsStructure: # QChat qchat_instance_uri: str = "https://qchat.guilhemallaman.net" qchat_nickname: str = "J.D." + qchat_activate_cheatcode: bool = True # usage browser: int = 1 From 75593a78184e204b76f9956488a47b0dffc414d5 Mon Sep 17 00:00:00 2001 From: gounux Date: Mon, 22 Jul 2024 13:03:38 +0200 Subject: [PATCH 026/112] add author in metadata --- qtribu/metadata.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/metadata.txt b/qtribu/metadata.txt index 824a7766..0c25b466 100644 --- a/qtribu/metadata.txt +++ b/qtribu/metadata.txt @@ -7,7 +7,7 @@ icon=resources/images/logo_geotribu.png tags=geotribu,blog,rss,splash,community # credits and contact -author=Julien Moura (Geotribu) +author=Julien Moura (Geotribu), Guilhem Allaman (Geotribu) email=geotribu@gmail.com homepage=https://geotribu.github.io/qtribu/ repository=https://github.com/geotribu/qtribu/ From 86b810a5e0f3982dd3fbdccfa652af325f97ab1a Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 07:13:40 +0200 Subject: [PATCH 027/112] edit about in metadata --- qtribu/metadata.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/metadata.txt b/qtribu/metadata.txt index 0c25b466..6a24bc43 100644 --- a/qtribu/metadata.txt +++ b/qtribu/metadata.txt @@ -1,6 +1,6 @@ [general] name=QTribu -about=Garde le Qontact avec ta Geotribu ! +about=Garde le Qontact avec ta Geotribu ! Keep in touch with your geo tribe ! category=Web description=Geotribu (https://geotribu.fr) content right into QGIS. icon=resources/images/logo_geotribu.png From 81d4f13c47f312f64fd954ba510cf7ee06fddd6f Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 12:22:10 +0200 Subject: [PATCH 028/112] edit about in metadata --- qtribu/resources/sounds/chicken.ogg | Bin 0 -> 26255 bytes qtribu/resources/sounds/dog.ogg | Bin 0 -> 18460 bytes qtribu/resources/sounds/dontcrybaby.ogg | Bin 0 -> 129945 bytes qtribu/resources/sounds/iamarobot.ogg | Bin 0 -> 102350 bytes qtribu/resources/sounds/its10oclock.ogg | Bin 0 -> 53149 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 qtribu/resources/sounds/chicken.ogg create mode 100644 qtribu/resources/sounds/dog.ogg create mode 100644 qtribu/resources/sounds/dontcrybaby.ogg create mode 100644 qtribu/resources/sounds/iamarobot.ogg create mode 100644 qtribu/resources/sounds/its10oclock.ogg diff --git a/qtribu/resources/sounds/chicken.ogg b/qtribu/resources/sounds/chicken.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dc3edd2df4e27739a96cc910593dfcb0af4887f7 GIT binary patch literal 26255 zcmeFYXH-*9+b_Hm0)!qQKtRv{p@m|=&_zS&RR{#>Ql%puD~4+5h=4SaZU{xX3W{_= z5a}R@AV|l8sMtLl|M&CU_c>qAyVmo5de=K^_Uzfy=Qr2PTyxE}PkDJ+0Z`yyCS#mg z`oN30bx90z7!q+V#LXx4AONacbMOKHN()B*=hpu7zZ+(T ze@fy26PUV2oK;p+P*qV-#NiHdpuxv8(EXf;XNVRU=?+FJ9>X8RqWyi`{>cbo{O2t} z)Ukm81OUK;wC{8hh-j+E?K?J#||I z7`B0q<09VAkF8M$6JwMOEn=C}H-zK5<)o8hdU5yp<6z3tDKT$w1Cz0AL~4Glk@8oe zI4|w<{QuN}(KgJ8Wzrr%#p!E`24m(BwfB#M*FIG#cuuZD)PFkm?!Q&EYpa2B`U|=LP`PEf+Eik{+n97lw`ut`#bdfWFc~JNA4q-Fjhfu^sC_KBh}E z|8yOk=xC7G|LKTKKPq%seFKw)_^)n)0}2Eo4gS)bQ6t7=9P?~k?$jRs6t9*gQf~rJ z9^-SeR1L6H@tjb0vQlv(+XS4>32kAm%o`;gr)yY0w4~O9GIla^GQ|blW6DD zHmI52c{#MIeA%a!J8gB_|2NC_m%uRq5QZ@b!5EM*dL+>E7hMYb0lLCHiWt2RxuJ3V zKYbkI)dB%M9rn+n@vi{@0QSLp_K^b;t6NI7#5(#RG_Z$Wo9np-~RBe~|%z3_Qo^ajtqi*T23oW(;zt81T;-{`LJo zc@f6(guUaS{Z}DiMIVlHf6(Rr*SFkr2K*SqaZ7OZ_#d19v#xruE?w@?y@5kP=j-4gh?h$4j=#Q-WV5M;=MVabF&V=&BNG>fh5!b37WwI_;w zaAyC;0s}^9PoR?kBQRnVPZj%jR3;cv?1Rvwl!Fo8LjOI7z!cB%qDct7T*=O3W>hg< z?n;(_=lV|{xH6-HzzrN%!v5cFQcLoL0F)KA9FQkSTe0N_0NWgiBmi)+%a;Zh`u~~v z-z($+s8AqC8m#b1gWM8WBWAD>$YC5kPN{@|y#W(TAGEGs+sZAN0xtYez!CtM`WocS zc=a;Nee$J}Fh&!{Pa%Es*DnL&xIG$b2BbvUC7@Y-R5< z5T8&31Bg&SILXZ}f9*n%R8nPC{y(MYjp5C#$VQo!7m7e;$tS;(-Y93bcl=2DGV~p zDaAKZu*vmfaco?K5>Z(wMH&D)QI$xmr#MN`a)eMnCJsrIl&Bad(b453k_=y*wJ}zr zEQ{nTLq?EfsI)KcKZK_&Xe+<|)`(3yuhgnd3~j=Zl@ z_TQiXk9_hVbM}`*`wxc^_)b;>zMh<|*XTAHvvmPS6hZ;Xy%SY|3S}qCR9M5o5eT!k zPi`Pm71uH4llK07p(EPTqS@1Kaz&w>L>ZYr8+S{YI1BMH zxPH`vLvlrHezM|;uX7|h#c4+Xh>T?bbYoJF)nIP%r7;NzHSz!;ZfFEZBp}UzR8dY! zQ3t7llL#-d2E+dPM6*&3sORtbhhz+f{q<##w*KWq7|Yx`$Z>E)lBtOO8;dZOt|&+T z>%>%5o^{|O5y9Sq1NAqZL^;Ue9)!V5z`-+?i3hV)WPx3lso*hYk%;3V$;eb7jp3qT zBp7CG%u*7^0}|%}_Fw_VGT`V6tAWfhN?S^h%u^&}F8)8xt$_cKD z+5m-;0RRjz#$!O|67V_{5e9`B90Dk4-Lq8P9%9gW3l;>o6@=gxLsS5)Z5_*<90@le z3LDFH45BbmxV9W;F$E@E7}Udi?tC|g`KSyw91WHW035&vuz`*MH}}}EtB1FLP}up) zlsIZi2Dm_iMi96Ro?Imey1MvKl%UWdVUfc}(4u1E7;qW?=M0Xf05I4;9M!=J4uk!3 z$R^bN%?}(LvJb-D6YAG=wZ=`K{>Zf|gw5P_p>T?}zOD9~;`c4|vnvY?}a6!;+S~nG*Xnv=* z_3c;|f35YkBNZpd%t;I3G$L+H%Q^gfI?>lU^uFqogsVIb!-Yk+Zp&&7z$$W*U>1Bj zykWv#hkp~N3Wx2XvZ(9UbG05XZMN&%KYl;#vw@VAym9nATexE1jQz`_6m*I8(B0%} z40#79)b-6?WYSyfzIyk@Vfx|N#LVQHvN`qKyWENIG#1{ndW?%+%#G9?Yzo!`4!`if z&pUKvf90lPr@(*s_nVo4@9H=&yFlF82O)K~B`2$!)S9oxQ$0 zJdsc?3RTTqd{X{9WzP47{($80Ks zNOR5vQ$&xZb-K_;fQ$3@9mDdlM3%c&YgCq}OK%YO)=D?ux_P$@1v0dc-OGwP$^5qQ z!?PWoo(ECAz{}iINh;FuU*ZMV-bbOCUuw%VA05VB-Dgl=ib^i6RLQt*+(LXhEO*S0 z&5pg5Dd>hLUlU!pnog(j$+5ciVq>V>v86WU%?rNy)*5DW80&oN8>I$qLGRUe+0~C` zNM;6_%t05^#?{JCmRghP8)tv+w;8;ACJv1@H-?ts+mm#PD`KMz`nAwq5~ZlAQt~;G zcB5tU>h=DhEAW#68gC@h`*PmQoyhB7xaxBqCq&E$eezCzXO`Y{=H-Q=mLn?Vt!jcz!Q~We{brNBz&$ALr6x)SVt4vMyHIViXChGTc#&N^^YTq$~U!~0RF)O## zHYK4=ti5AhW8B$+#Pam?`wQ`Q&Jo!Y83uxz=wJ;pDeKzd4;z?-(yBIbN~IL0}&=t4Iui%vPW zlH`w`E;{wn_{!^a#Mq-)Km$eYp7-Uw;xqQMp|m4 zb)Xn~y<3iZPG}wWi7&UOAy8t=VC&u|G?{B_pX*=`uk}UnSK6m~#-L9aqhg7A!m%c0 zBx}9-&5IEjZEZ9Q1Hn!o1>+Rcymz9M@l%W0^DL$St2tepr@?Tw^AFgCXB5tte5gJY zz|^IYTOeI!SwAkCYc1c;ma^l&kF7CF%m`wEgz%=oj!fr{x7>EYPv)390W3_Xx4Zy7LfP=k+NfkPEo84D=B4)bhrLw=Ka8B1cK2 z#R{eQ&h=*LYup;&9BWPWCFfU;s?3FHW*=u*#b5fbB~H-9`tZ z_uT)FV5MMM@cCOU`a9tlih7%KquT2)TscBC;aj$Gxy1kShF;9&g5-c>0-3(}ICj-< zmovtQY=M_bq#}jhKZBfBv7LmfY{0&DZ>@iRbeO3`phH`#Q^4lr-S?ky@JAnhL4h}o zf{(fyV^^7y)dk!Y*6B9f8KkpnYDs33+`$&ruDQNA>B_Z>h!B8 z^virUi4(20Z%yh*UT?Zq8nE1B9qg$VW^B=6^ob@q#Il0Aq1yBK5b2}YGfmBFBZg-A z$o92I+%7l{eu^<}e(09F-S5_u+i|UhXfZF7`KI^xXG-b!2$$d84oCZ6_-bw%iS2`g z{W)G$Q^hq`c-g5$SOIqKuk3~5jFMUS@4{prc4c=PLXryC98WRqk z^>4g)j0s?WMh{ZPS9eb_qh;dR&t}776YFteSz+_zl~q8(Q&pc=Hvx{1=m>lgEE_qebv+s(8m51b{Ze=hop@afr2>gzL+vS8VBrKYii z4+o!mj41X$Z2)P|zJZ2PPQvPErPy;P_sv$0MYLB*ZmN){!m3&h|2 z*yO%=e%O+3uE!|arc>{jaGK|6@|j|Bckbu$p1lK!YO7oqc%08-M|odIKGCj;3eOt`M*?RQqiH(%|Jrh?Qg{ZHJk9BdL`m;+S ze29VoooQ?gxlQ$5U0t?m>TB4W)!8t>+KSIREX%%D=0%`Tc+2c9q)vbeUxRImP^yIl ziI<`3x>$x&RaRg@BYI;NNb5`>VL>smI|NXI>Y+1I39d`ha3P-wGkcOA&>NMY9-?ON>7adLnm6gE+y=MLCCi5gxaudKg#~fw*U` z<_*`o1*HXBk?ZKRskA;^uQq!yk|0{CAJfZggfe>BAPP%l3W0|p9uN&o>@8@_)oWaX zjpEKcmrWdEQSLw%#>Fkg4MCFA#G}OW2vDjVL9C2R=o&+GMwg+T+UcLg1)^|xCwaUq z%m7<%EY_s^Yj5Vkp?>eUFG_aBre_K)gF;N-pjMQObd%i3!oK3YM$cAH@55d=tr*^@ zn>iJxRctrCU_+T!^wC}45|BramVP5x?>7}UX6DEchPSRoAOe0T4BSoruJHBO`P0yj zT*rLo`;a9EQ-x;?FM$t_%JQK+U1t@wqmNt5<$(M6G!0Al)rIx#wju=tQZ?wKEPMzU zakmj!Ot-c&qg&ieHoRVcdDqQL+b92sr8Wc zdoKD2K&4o{rp)j3(Nn(-PMGD58VfksK6jd0p!Es747xCTvp2cDykX#DYC;gcTVft~ z?RV~0_prK?Uh0<}jFq=t)v%s=dg58FM!)@U<*m08LXkmha%Tntn!;1_=5C0NDs^n^ zSV3k4xCF}=OPfwHI-WW1krDO2O&LNNFv{_K;o{jK910Fy!!(TyAuIcqYNxodFlh3y zP!mrfSi0jB2P~m>UC!Um@YLQaok zMhT1@e6Gr+{85Yl$decc7Uz;j>8)ECC*t%8c3+4Oiw&87gk9>(*JaKyp)p_ApUVNv z@4=rPYu-qFM1OCP+&}-N)zk3Xdhz|1QM2Wes=%7d5D|xg-j}#LnuAVv>Ri8E?D4!- z`9w+6>*pGJ)(p~dUf73tF7O=C(dX{Pc;&&P&&9p_awtM|3$qBxkT~3ETa!fQYf#VU zZ%B%zP6Zz8tEc8y%7}5MNs2<^s-#PFWGT5S0VK0~Mm4o}A3vOWP>ztm1UTI(4@eq@ z3d$WF_U(zuNU@1yM^IjGLY*ZYA2eEYQ7HjepZw4jGQkm3JeqSynycy#S)MeOx_s_s z<@Ygfjm~p|udhcxxhy&1+5SA8*Fqd>@lMR_`>@ zyzprK`5tHduWTfnL4wijlzH;=EYbQ2<+*7~!&2$%gT~um{eg&^n78p7dl5&Ea@6Mk zQ81cg3txNd>?~xj{O3*)Ej6YT(MVI2SFeq_%5Ey^D1#VkOj5TYbF+)t=qlQ-pd;F2 zU%P}7gymI|#{wLx0`JY+G*3yA7cwPl2`vlsObUiP7Qq(BGMrMW2Isl&p=wKhRy_3X zAvvV1z0H``8j$GtoS(9jgf72TU6&UXCbyOrzG>VHE6vnVUN|XA2*~drdkS6DS5AkG z5oPt?4?O?nzV+(FA&qyoQE6HQ9C{bUDRnF@AC1o##rp4SCix8IL#URFse+3kx1JZ2 z^`lsq?N5dEs}~!K7hBGtz+H&TPhTtl@N~*W*+wQ5k>8uF$n=(`&&~X??|sZ!=~9+x z)~NtfoV4)R(zVyq;zB=hFTd#9(IM81gp^Wh^VA0a+R%`S<1UYEwbU*2ug6SsmPgOt z$e{@|89AI|aI-1)Iksby5oQwaYiUB~%|7dbKe6f6hZt+E@CT4X#cAfPM{~4AZuwu8 z&HLP4%1UX`?;4G$7FvQqY_)_WKCqmgH;;KVBgrC&Idvq0-?-?+j$HG+gp~|KUl3lN zU(fYncZS7t>+y&y=it(g+WNgd zeI}w!16y%#e`j*E+6kl zN3G)e)OMPFLjY+{ZnAV%xUZzFSMaLbdZDM{&FT=cF$;yx&Db&x63)41-1W0ekK&z+ zOBLC~M0<7l?f}bh0}Tw9Q3Z`!Iq%w-D&G$%V0ht<$$Z;MH)-Bn%xoNhzuT_uBr5rwkoMGt)fdQjyZz5* zo%={s(6!9V*Same9V$`7QfKU=xm$dbo#l0^b34oq@hfr63@E-@ANDvh`m>^AN45Ir zl@Ze~kY{JMhN7CD{z=Ry0-c8At`}~s*5s}_f}%qdBdi4wOPdwx8?#UpeyhUF>_vXEB!Z_^7ip;8~YNkR};hAeITeVb4i>yNHP1X#>zt=KZurpy_pF)3NAzb`=!}|rd4@@Gy{-sc|8)xl)^JLM8`ikl`!FQA|%8egzKZvTtG>em!T#R2& zwp75-JaPr0IejH=a{SdHQ`K#jWpsTDav47}H*+|$4`*7f<4?)52u788Q;^mM4s+ff zALGlF3#63SC%P1Q57!5^H5?$3t`{4+fPsHu1m+}c6v{-#;xr?%i=5-+PgS=H!)8rp()~Y&BpOx z%Px`M#Y%~=5n<*l?g?H&pIdWWr6PfjSxn-gv|k%Xs}z^yRg9Js+)sWt@nt{1NHYV_ zTQcbKP9L}PxFI|Be&K4z8hXEw99;|=V_DYx%ns!JgHJDthRik zVG|aI#tW|678EVIC#Ij2VAf~3E(~=+6SQgQ&cot_&kxGu)hkvXVwyF1lr&P(@L_Mm z44H37E@;|o#aJ@7-HNWsT7LO%B5dORZq&IS_S8rd+pM2bsoinX#Wrkg1?DyGrM>Jk zZGsVPJa(G}zr9WN^`Z0IrVXaYFjuh9t9c#a)oYvX*}}{IK_69n-Y_DYj&Z)SC3nhd z;J#J(C*%oKW6$d`S9WAQ!|fdbC~j+VFhj?@!+_EjUwveNQeHra`cPl4Y>uBGK;e8I zTt7|M6~`vc3A0aF01#Lws+tB-L2k#rVk80Jy$J!P9n#7j3n4ZKr{*cm?ZAXjJh36Q2&q zeR;PADM9qRdqtT5#hMNNl^K*Q+cHYNhu}|z^2j~`@3>0caMCt>+?F+6N!m5`hLv1z+yZr4a$AHSQ@+# zD;-ngkp$D!zbtn75;d?K1d zOQ&u~XD*8COBb02>HeD8t+_TL6n>8Pa!@?WUf{3CX(n8;=W5>Mu$@I#xwW74iy!?a zB8)Dvg_}jJYc^J%={zSy_02jNqx1UkBj4X${<_uv*rsB_O;wlWDZ?8TCh&j)-z*Nkt z0JDXS;SAY%C@j{ScqfQUNAi}gXx361PmWsWEYI#v+jj@!r^)jg(nkbR{Ehq)7PQrN`i8?L2wVP;C8$dk_KCLndI-T$Rzk zuTf55h}`G)1cxl(>+>b#F#;4&1=2ziOzVr{j8J6%tBk^4P1XfNfLp4vg-UG(?~Y7Udcu1VG#4 zp>Dnbny2i(h;$6SXv!_8q)kThBNNnZUTf)%46zxxh!tF(qyMv9nvy&Xzj|*REbU% zH;a!$YLz(-#|7ND)x`BB9yh!DKIq#^jsTnd=b+uP41nEsBI9fvGk@nr27rD8((1-P z^uRW|T0AYm6+4SWS}+4>I;hoz1yg(DU(NR6kYN9G<@w2=vL%vWmJAL(8WjQR008xF z6&2GYWvDI>25M2>k1RW=p>Ldr5lM_u10h7q3LO%#0Dz4@%7Dc=4nTU7j>^B7$BNLd zn8!291~^3?(`vZX{M6 z`EC>;>&#UJn+;S_{H$|wFtBg?FGcXN07x?YB@b$s<-Xl0yNe=!HQl#%7zQMPx|zyT zcoDt^DitmUxFBV1rowPwZwYb-_lp!=eoX+#Eyy)7ajlyYx=zFj@yf}|TU$M{Ay;6@ zEWn?MS`ay2Gkgk2eVOJH0o7ndQ(+*~6K05`h2j3G<3jBdE3@laNA`cwybN%Ofb@-SCs zOOeDNGSZdP>8{}wlik1`rMcm;lxguEea=)kvxGi_oWZ*%-)@TUul$^s%mc3_WYyHD zuGQAr=5*fcUry}xB}ZNP9wqwY;)>pvOGaj|?uy)#{G)LekQ=OD{wg78BmDTYcngxm ziqsJnp7aGZDRiHQwM==(oVU}jm=NFHNS-v=uTC`Z;!HHCD1o#w$3GQrig&#E+vwJZ zg;=5|By=~_>3f03>mLUSY#$(k;eHapp%L{rj4Xvj;ZTLsbx&LD%V9tsA3#k?vW!(O zEd|kCs1swgofP9w2Gt>yy;C&Gw3D61$F`d#iDU3%kMzmbqVeEtL+76t3kJ0hfuwXM zMJ7RjAT7zh+yFoT*0*uHOyGQ19P6zey%;gi4`h(EE`_zF0*G&0bCRaJJf(vSv<~Xq zh{EfMP4jKv57#*Ys`nZ)64D$w1+R1N4ZgO>7+~BpMu3tZ#kk*JlSSJTcQy_?*s|T` zMxC}1pzRO2d9F9V`>c43e)AmAYIv=<1n_~TAy^BaKUnUK|8!-R40l#HyZBzl0Qw6* z<8EO7X!gdcVd?F)i#tb-WqE>=XXyyoa+kxDYk+qbhi28IvDl}LjyXeQvT{fYor+?# z%m8;5?r;FuDh5di@TIwedOsjYWx3!B;G{A#b_PB{GFrrC+2l)WV9@adIDtH_Fm?!B zh6#qL)(5MxcLoCd2;S8e0Fa%#DhC-YV|oLC;{3pL-;&*%P-y4_D75D`TW?3nNf<2g z;?wePcI9b|)}@Mv%DBZ5m^P7Dd0eV5|~oAa}3mA4Pyx$lv>!INIO0%s$&5-VWj+hM^XyAt1@M{kD1zNDk!A& z&RdHwoHX_Yn{%);Q%dcbR9&8Ps5~&kPrMxL*-&KJq@qJf49ybAxqx zc10v@=Ooi`R=Sf=^7v6543zNIMB-v$ChILj|EKKSj?yWkVsHJgJU3?$N~o&k^K8VdOh;a;VpF9qZtbj0cMv;U?e` z6b|Hh{stAbStedE`VZwPdG_1pR6COSxZSM@5N^fNX}20~OL2Y37T5)C+++*@#IT~0 zY*_VZ-Q&bE12ln$$Hiab-O6uj9Cx}4hJZ6DXMYWDyen?(U}u$BmWkrv+oH5J1AWCl z1@TcLNDhDkugMI$xlnk6&iQj4Vum#Fvf3aD@N0SJoBU{aTG2Kp{3{gov%#6#@r$1&_(J6&*+7MbBcVfEl^0{wd#^!n=*IqvcbX~` zxteO_9#hris(HeY+;lJN7{5>B_jhRWvsa`M+w#G!_QwDqiP{s2_H6-X64hCT}Vb2j*4bu2QpXVs1|T_d*b79UNS3eEFzm^^zoCer~BgF zgrj$AzIs<$o^4O9$vQo;naa4wweWSjn2V*8weba~h)Rgg7F`7qsk83ttMz7+F|KLv zi@N>JiJJ@sfdes#?7Z5oQH*U*j5P5&@k!CyOSAWy#2zGB8=;^lq+4RWG7wo(O_!M~ zB0jJ(#e^Ii+IOgRfCCxXa|Dm1Akm1RT$M;Og>_-sbvoU?ue6v#i{bW5wXMcZC-o(` zwj@n;`C`%5EgP+4wXCd$2nwVC4Vk4NC>6@xY^V~n!Yh74wDFwzy~`Ykt^?JwYQ!$8eh9~*oVj=<9w+C75wx3mv@mN(VnaRSWYpKqtY^t zrOhs9#=ziUJnoTi}6Mi*elozgZ(W8w}4x4!`Vj?X3?)mn(l$aQ_z6zEOGK;2AV@zF{{ z)Fr5=yTuOAxhfCuhZrO7#_1hz?(xli-?G3!(yz@LSb`=JT=+8FlOELA);KoMr@F9W zr7-~7%{s-_n!82_tI}u5VMS0xFaqRyabshtOnO?;URFuj4Put@YaxR|Q{dt!8ttoL zO;|C4GG69j#0W=Qqi%Sk>pjk4rZw(3o@AUi+os-grvBMh{+tRS3(*s0MQ1KJaoD;? z(q=ieoxVS5bnCl#v&f~^kT%;m71J&;lN_b^CgMJX!1873mH>(<9}u|R?#(%<9&*UK zc(baGMa%lt4Q1hoNiEE@CQJL!;Zg~ZoOd)~N1RQ0c9|-2uEZjaIQ#SLf(MHj-vEzH zh-yS99_Ojyb0bu)>M6Me0d&ULD>J$G(!08}`;a|dl_~(fd))C3lmr-d+IUmd6tJsO z6g3rXm>?UW|FQxDVzV4%mOC>tV3f5*Q4WCAt!4xgv~8M^bUm=~DF)UtPCrTE67gAd(q^`M;{faD4TU2qZ(sfK zKYf2)Ox;Zdo%rDUWRHHRxsYqbPSK+jClMav`qJc3d%Xy^)v87Oi(_zThxF>8Y}R>0 zOijg~(k!XF7R#d7>vMiD=1XG$kICsOAd!n;#s^5|lGK1n$r|VvQ^lN68}JT;+-u8T zOra`H+fE9JV^L&TtbTpJ3j_k;Wv>@XlY|2N?ln+pfD+^SCb`r#@sx`kz#ewbT$u$% z?Kfay2fBe?BTH8R)I1hXgxEZN*qR}7Mu9ZWWhu0=QGG@_WBXfp#KYub-io}Z9j`Vk zXHIfkEzBA3-9+CkK_rRXmb;xX9oHe0@$w3H>2$Kj3n{MMJ0gxc z4tuP3<$HzG4K#%`2o83;tc?km@e%mM?;;(j_%|x;dfg^!Dfg2t4Fj7TFb~yIdiV93 z!Ht=D4)~ti-^1xg$#Zvks-n0SQb!MIaWFGzpz1Mdvlklz$Q>~oJ_BBEUI4*sDqO?Q z3mzSl!Ht@NHd=-*_1~fjN>h*;Y{!nV@yUdfWOe(YztqQYy-Y9)@tzs?hr<*lYoTE5 zA#iu3i*E`Yqu(#=HTI`}m=>+6+GltW-z-vBb4Q#d z37;y%vlA0nI(`!FG#|%)Sg`LSkGrVGw>8r}u`*j{cOG4-#X_G~$)IvGpgMo9B;YiJ zd&#ENZPkrTwi1!!wCRK)ED~V=teSxi{-g$2F!oqXDBy)ctGG#ANxEX98DiIS(F#Hl zP>ZPuSp^w`UfE&;ia~AZ!+eZlXK3kZI2GDxf>t}dSqcRK8%mS&?eXx+M(eSvSKOB&+#Y+DG5OW$zkXQRJ1)g0m4Gromlrjf}k z-0AajJArKUPL&<)fwqSN)KgsQ2KK9rSz1aE^HmY$@h zjaS@tkui336Pq^9G{56B-x|%|b9o_+N`v}H7-?_-S*@FvJdD z@%U)ict{}u7aEHK>7hbJ80;}KmW7SV(yprfiN%Xo-0iJ67&L4INp}sN zc=NkndFk;irM$>eCzoGKy48#$iiP}1ApdKCUb}kWW_w)b$JDbwTYDkz^I6cmaTf=A z3bkToda*ZGLCL%#dqJ#gk~DvVI4y~6*}~7Kld_`2sQr+54Nhq6F)Y>gN7y6k-v_eC zVWOjriF%Fx&K^Aq<^m(P2>HS>6^Kcw(vdmGZFa>iY=>TYV-Wseb|nc8pq z*#et>f}*2|{Q@m-w^zpZ-%fK5hPRn$PDG+)-}zfbudJ^}ZH5Va4#HK;s4&8t+-dcY zj=|pV38m=?!N+z3lo~opHp*OInqE$i0y0^=@D~WIYNr*z(*f+*&syHM1xN^N|w26*Ou<-y^1pRxsF`H z3oXru>qZuh+PY3kZz|3|x_I}Us=T*1OTfn;pIbTUBTv6#2w!yGZQi$y)Owj@0KbUO z3;N0`W1&NP7dti)Z96I9!7AaD{xJMu{R8}A1odN?{s_uoC8d>A{&4*Pq_LWK{O9jK|1f^~{Reoz zx*;Qvm6cXfR*_XzRoz{B|9bt+=G@-)vPY46#XJ77LEcMEo?hlv?Rxl+y(j!%yw~td zfWcK^=jD}iI}29}-9ajvqVdHh*_OrFPWdYK1uFCDit-4gn+m6yVXl8gXd{?86&Ndl;*6D^K)-soqyRwo ztkVa-$FZb7;r6a&JIh+Ji!2H!5bIO-uWvewbzo=_w7{i13nE=v5dKnmC|z)BYee%5 zVlP3zeTX@rn|k;8XP+OY_jS;7r<>E_e9Pxcv$R|4Yhx>daG zGImtHCvsKtg~>}5Zmy4ScioVtHKC?w=Ci%kkeLMAbGE+p@=obVV1$s@!MumDC$)&VPr#P+61aMLrp>LZRA zlhFK}FSZ?hPZO?u{S_i2@?e+j`b0$X*t3+%>#~z?v#_@#Y)(|0wT+z6KX-G6%iSk5 z2XWH2mS<6L?Q-{q%V#P6+ch;;mt()IhAUN)r%Ps^AJ_f$s}fTdkB$4ie|FNqJOce^ z)PCd;evo~{y}*NMy`j323&qL@81$4vr>({GoJsEETdHSPGaYbREjkZsd5{LI49xOr zNG8rU&jM4K3PO)tldHWvwqm}O>@yzrrsKq|qonVj2eZfDPgF_#a(OWqO>Zry8 z_A|{{*?GIz-JVx4%%>@3c~8%?$Blp1t3p_QEy``v1~UXb4fC+9EmIeXc`&B}0PRZ{ zLC;F|+cwbYzBRVisZ@xrUM(M=g(5tL48W`#wA!>Tc~>-7(9N)VciOP%<@vp$ch`!u z#>;$o66-4Uq^%FjMY2A;=e+rd2bLijFi#H@$0A|~xdSfjYKYg#>=JL}v6cadwgkoF z?=^Lk<2}wWJZ5`jblK13t!RmMP1?$0DHqrM*P~wCMvONj|Mc(|ONXZPQuPg5Bzi8R z7UfMcOO8%F+jXCgLtg9%4w+Uv6tXDWZu7bnpIk5!h&tm797e6ynh5Z)zIBbNDCAJZ zJ$1OLKp|erJtyPU^NRtzqB(nun(>md;8oLA?4Gllo6MI?t_39?P<=j2aV9-oVY%W` zC>@|yCCpg^p(TAZW2A{FH%T%d#Redk(Y-FhFcu7h1tYEU2B8G}eFlae+-*<-=xy;l zVah;-3q~OQxiODLCW%{A+Z&ggiw_c~O&F$5y?bPS*7^GIcJH`QrC#KKRDkdKj_Tb7 z-{Vu>Y%XG{@9L^pEVn9$FUZcnQ~Y5#{mCV*h@CXyStc9wpc_MY$6~i-a6(6QIrp*1 z?wpDj6>8n~OzWjn$)SjylmxZ`$YGR3w%5l8R=6${ zI1e16WOpuy2S9;mKAO@N{O!ZLX)U1mGG=U8anTG>J1-GuNT~nfv zWQyA~7`0i9G8o5k6CZBz&AzDHI=|uE9~BeyH7KvWeXZE`QUj;SVy-wFx4>{zgqs*1 zlQcbR+orj=FilYVc2{d>$h_s$d*Cy*`Z2p_iG(031U#fq_rn{Bi~n&ump`gras7| z)-QJ&{N193&fi6&*|#KdyQeDZrwB1NFae#QgkJ9qGG{kRq5@i#n;B;uUJe&CZ^|3&yE$xp>!n*G}EFo6I=a{nBwFW z!mcv;%p-69dX4&VLZ9BFtS!-A9eN_Jv}|i>H}Je|-2I14(^BMaw(EQIQoi?7;k)0< zjn9jQME%g^xW_H}>InE-i7wL8N@{2r6UAd2&!OU=e#2E_-7I^R9x}uVpsB@Jw-lOf zIHJIZ4y6?XfE#yp6`ihl53k6or)Ze!=H`m?o8Nk&l8rIqi6<2Du$0A>1h7*oHL_c4 zV-|sD6Mm-LcqdZI*3Z^7(@9;^heUM>rZY1bGh808`+Ye=Z%v)yqCnw%VUviPI!Dos zEmpF&C?Ay154Y@;5>`5_J`rV}@*_-}tt@Iq|7CXtyzx`KXB*R;^=9c*J*U`Nr!R>2 z1ENaE-y`F}IVa!Gof>F3f?MFuZ-Z{1V8Tz3nJyM=Vi_KJ(Gv_UssI#thmMBscE)t* zDTE$B9KeY=aSHvy13&R&68+by8IM(x9gTU0n;L25ABbFA_@#pm?$(RM-Q2vuEG#$i zOK0Hb=5NtAHyb%U?4tFp8D%*(El2sa_B3?qBj%Xp#+MD@yfQ*U$f?t&v1IEriX2~x zfO0G#tv$6Raq-sqx|xC0xiD#o!2tzlM~@e72Kf;DltHEK;7ad5mEvzMk(so(9A7_%ed_!_4@yYu}vZF|y6i>J-&JZIH-9^^*_?D)JxbAi{T z30XJ|}iUBnG} zYm*YJua%Exz@2$(tTfs}MC(_rm-nZQ>xa#N?l5Jn9+U+rCS>P?p`_PrxoX2>Pajog z>GUY}gRW$F+;bhyQ8UM&VOiU^X1u2puLEI4WxPE-^F6tH?`!zv?qmVEobOv06mS|1 zGskj-RT7K~hisF-J@RhG-d7D%3S&KTsIPJ>*lIRE@)gAUKKrY$ebXx;+wU$kORm;= z+QLhBlWTvhs=VCuHhbzcRFCLQ?gd5E-Hbpz39yj5pbm6K--T4QV!RY{+#k^ME6D+3 zv;Oo_eu#7{9>P8Hf1 zh`qXZyeR4A1Wtl;kwXB{x6Y>_mLtE#bLFLsV>7enW!9g<6*yqbZ^&P) zk!!W`uy&buO~L5mo&66@9s=LDZ`p4D)_xXVbX_Nmfm7(PV9xYsXGyIm0fFGpV?D@3 zc9ZRkM{g9ZsNBK8!%I--qUcgwEEmZza? zyMhpkwfqpOy#$&LP#}PdkXkO(8q8U*k)#K+P_8|=W(EM7A`<~37c+(97KPxt92G4Y zM>hbXAO6@Dgusdh;BqbYwN(Ttej_nG4wOm&?0{=2540FUJy`+~g`tv4tbfXvAgs4$ z445ZtXZp=JtTgN5UuzjW_q^uk?YP~W@xo{wAtZU;S7<1m<3oYuSI&rU3U?}1b7F;s z*Qdw)lG0rFTRmtjebbaR7lBKDia?a0%FnmFc4}{Zj*KnrkBAy6^dvmKBF1*-f7Nj1 z(NMl&`<*ev*aw5LW$e2sBvCVr-N-P*SYssnE=tjm?AeuwtYgd|H1_I;Pzl*aA!RAq z)ACCy_08}5&iDTDzUMjTJ?}ZseV*sN@8`O&>oVC<==t^bq~dcnzQZHVZl_Ot5dpjf zr214~Og*mQ5;k(+0e!~FgGK;_m$$Ikakh&+wb zc?3YD*tD}^)K|Ko?n;^xJWp)!TF;)kOPLc|3l8qYh?E7VEp;j0<_1w7Dw3Y(W6A>F znKaE`HEav3U_>gKbs(QT`ImMve`Z1ag2KuhSNQZ^_cNr1HsjRpnj#Cc!^v(L{rSP_ z|Nh1J%`dg^z+Wx`!e4)|zF!WksQ9HOJ7@oQ1Vc`ofh9e&V|(;O5Hfo}6k_Ga)&wA= z;)k8LCBxD0`*pX7KjGfcT(st9pNRAQSle_g(0~kLz$R zD@@g?f|(#*f*N?e3N5m6A}S4wHj8Q|%o>*Z_EhKZi_0-(zmVpgE45K1F_LBL&+Vo5 zyb^VI?^_P73GsBwLPAY9ecq&*Z)}cT%DLyJ|H>2Fvs7#wH?S?B8@8Ch<6itn)OyLB-M&OG(`qdK`yJqC5E)OwXpQH`Wz4N}iW$-j=TqML znq>UY5pHyyKsx?95desyph34_1hh4s+<6^Hh5?kop&*ew%J72?Pv->DTK;$8U2|Lx zL}H*3J05_BPhQ{uuK4Wh$RQPB-CkJT#+)Jrjfa*~>y#lJuZ7oDCrv*aOfsVf14c`- zKxzW>bG+#tg?%;?L51p$Q+5-n229z+HF)SEyn%WMmx_s)v^sk#etbSGN-)qOHojl_ z+Q5#yb(yR~oeqv1c<;9JO-q4$)zs07a z{!(36TD3(VEf|#k-}pZ;V&yoc7<3+|BzHu!wZl5a!+`RE4TWbz9Blx)Id@1-NosmJ zfPw+?Vt51uK-je>H!yYDXS~A#t6tqH^)7PbM(W?XB^fvq#0p#J@chqrCUp5y_(Fw= z5zZ*EfGr+2mGbV(5%x#0k#f{ZqrfZ9P(BVc2Z_OA?@wgqAKiMe#4xux2if&n{FnQtXd-KOuU-wTxdiByQKDu^M#b1y0 zYdP=)>sQrA$b6q#Dw?P}bfL7ES-u|W=5_YXqJ_HT6xH)l&^*hgZdTMJomMWpezZ>9 zDBwf!!lI3?#pGn_K0(oMVnm~}*E}2ljk#NuB?ut=1Iah8 z>wl6#zZ;x{fXO@1XTV^JS?aJb64Ij9bg$ zQOw`TRo3@H(zTyS_KhE_6-U;7pU@0a?1XRa{&_zCC5QE50-CfN%%;)Ef@=JL`jhWn zi+e#lvzBADm&c>^G=;eZ3_5d5@%Q}K0!WI&(jmM5OSr*a`lW zV~vH<09E;gSmdzsk?W9@N4Rqn7Sl>vX9#DzO}NdEdaLc1G>Oi!6b<(QoK z(=q8P>$f-F(&j(rG&NG~(<%pHTk9TT?|XOOw%RAV`uVk)yG=ZN(@V~IjOohujd;~~ zpmMvk_?G6^T$%V#spI{rZqP zbFo&v+{VScA%@{!CZu-6w06h24jU-+{?J9C?u395X>4Bh1xNW$wdM5J*IA8+t;Ww9 z?g{6lA2zu^f2OLC#fNVq)MaaKI{RgQ5%5;I2SO*m_qatovP5d8XW})6X|3|JnL_MS zMS7;LJS`BU!vY7T2NLyh<^UFgU>n?t>J!p=0rV|IJK%dG!x}yU*6Fi6lc!g11Fbc@ zObC~Gcq2jR=9KhLT>oB*F9qKRy+`rrN&*!jx$?_%MJ1m-*^SxLRVO?6vb*-VUfRBv4L6$b2%kX^ zImZ5(>(4%avfe4Ru_g2fY0Te?K}9YL3z)oCcjI6jj0Uq13LXPE!H&$?42jA{tpZhC zqY6NI9?T0khyW)`919;v`wr3R!~Y?u8nYz)AW%u8iQ=c#|EmlDdFMtXI%CzaDqtoh zb6B}r2Y`}L)qs_5M#cz01%)YmVK4&mC`UEgkxW98y(pS)!gEt84<+Q<_NG!Z4~F*> z{A7Lu;6&fZe{Yonb4}OgoWCO=W3dyPHY*xW)~x>KwSVkF&bMbP8smL=9{fFf^_cAh zD?dI?%XIh*EhJ3Xz7#cd@|i(BRQ4tq2)`e z4Nn8G);4bN59N%+spnLoV z(L5oBza#ExUKA*A>$gJiaS<>W=o^ez0QE`bT~zPW2PoO`A`oZHM2btu2X&W5b;seN zN_lSr;0K_$AM+boI$Wb_fs3OSztW+S5Zq96uU|W;9&Jylnl|(rH~ryjxEaY6z%-%_Q)P1 z&+3OhO8a0oC_ET$B6yD_v*}K~N55|Q<5Pkt5KWVHb&&OV{j-=>L6 zs05kYq|w^E+)0$|o{Kz793b=#;KiZt3T@^Fu;oTdl)w?Pc2+l?MBEXe4#`&vWU6s; zLVZPbGn4hj2oNY?2xEr;5V|1tfdLA%ssgD0Sm;fX956j-rBoTxl3i~CNa=e4$qq|m z3LZuR0g}5HC5`UZSS`q#o~u1nHeUswDgU>qi{fVlU%!9Fv5x!Q{5}R%HSD(CE9_$U z^L!Sr;xaljU;EJ&7pdj&oOj;$U;RMZzTw#>w98w3p4c+i{cBTHZI+`Yr6l=6U<|r)r$Fc$fKB)@e4A4eAX7yaa%V zP!NFc9=LG+O zrJw1lLn$_H@bS_goY^1zoe9Gt=qg_YYa3rNtgPqtL`SQ$_`cJTF!+@((Lvo*_ zov;pRoXr{V5M`7iX*E!M7CQvo$Qn9;QUxm6mPi0il$RZWN)#s)1OW#7^g!r*6ppV1 z$doj~mBH4N%qh00bp*h|s9W{LO$Mi-Y8MQk6kC|YecF=lC51Ll={`spZu7;moi@)|CO2Ree(Cs;wmYq# z9QjgTd5+l|durEV<%NRZXI1nfy1nU>!G)-&q?jI|Sc)<5=P5RT>xI^s+}Y=ydSc9L zcHkZFA@sAgD(5X z%md5RWqYi_(#@No1K3D#nNOXn%Aa3z40WE3ro(+}PD>uIm1%zx6Kxbb6?%$zrdlsK;hSU5Ps=y>^b72*==I}b z`*#5!(zrYCqKWbQ-g{|Rru9>9H93@NGY90D52AxS6jv>aq5CI7*2@HRlNrzXA54!Bk`xt=4R(+0XKq9mU+f2@Cy#tD?%y$*5_b5?&^LTrud z9#$orPr@u%BqFaW3BfL5b#V-INeNQTfN#Lik{gX*$wPya;ZoVY!qB7?u^gCi2DGJr zcvnK*SSl>L+O*y%bf!0?;gjD9VJnI%^^cx&J=p@tzc8xP$EA(S7*z|qou&FLhLo~jOp8y|_`#{bgC{pPCJ29ju9;;XOZ-dMC z+^9xDLGG48C|JAm<<9HzXHcZJr;dO~jy6Zf?ZGg`C=)AAGC%W*^|pol^!4+o^zUr{ zHPvbdcXt)csnDofjJpp=Y<*&lx(K&JSyQG^aCS18tbGGyt5aDjIYy&8mfK5~o2$PV zvA&H`;^j*{pKmSf>?0@Sb4aU^La3?#Yn-dnyng3e3DK>CmgqIhJ;acZ`$;@S4_O=9 zS^VhlzCC4hB_Xi@o@r~sf5>&rf>z{r)jFa$WVzKC-BMS@X({$@w(^A=wWRn4d%B565w?jyHlJxNJCIDN^nSNRg2%Bm|rM~ezjtq%ApPLys<&@#W^#&0t!ofbdW zDEta2_Kn|?OXL4$V{Z{~|NZ%tU2YTs)zS|j8q9F$MTM~NK%Fa=os3{mA?fepYqR`zwD^LcoE3;+!^suzopp z%0bb@_7mFJX%JCzNj^hSScE&do9Y=j>7^NP2p` zMnKe3FP>pG#P2st5gU^TXjBK|O7�he3~ptDT7VHA?->v24wE%_FzUj4+y-5@1Y} zeJgMB->oTYGzj%T6RztldWBg}$Y^d#7G{!OeKS_A*f19ya|Dd1Bkie))YZFokIZw; zZH`S$P6n0IOiYUC9U{uvrX(Ylo}-gYBhlh+LXIkSntFXr{GjxxkhG<`l+N_3l^@52 z_^tEUf;;jTDkT}!HcpNv#X$@sKd=46q4oL8aldPuYcoTxey%wO+w#52A^qaLtHedk zLVv%Rrb0iSlLe#b;G1qbq3u&KPV}AcwHtWP4DOwuJ-&L6Ff+mW4}U&y-wC<{k|Zfz z_bqzx@n`QGY*3)FpkLQ!F8XjW1QPWr93NhEr%JUL@9bz%&_K1fbMy^~&4UN$PJDpNjP!oG z^Cn^Pe(rKU{jvh$p_E)LVM#=vrl?Lt1H-Rd^IL=*tfo*XJ<13Y#jUg+9yi|kMpyB3 z&8{KxvS-2{Ci8{Nn#BWd#nuy-8*iJ5|GbvEQ&$1@VyegOIU<3J3)@e3Bg#+JlQgY@R};@f zpLTeE>DLZ*PJb-@5|lY_jP(w4^X}36C>Eu`g78e3f_QCDBr%VZ?edH`y`Cwuv>xAo z^?8a~M0{+j+z|FT;Ze?QgSy5q2|<2nDxz<5M_{i%iWGTkNK^bj61p!`gWVXqscXmQ zz%_lLv&7&cOmy&M#U-!?)4EQrAZVU$fAO@eP+ew+lM=D$!QRm;r(2wQ)X;%3bQ=t@ z4uUW17D8K#^bc7D$bE^83Z_d$<{kVpEy#b9J7;`sU)`6NRv@mo6npJX^%V04T~y?N zGpXZM@X+#0+^4neKY!lc)ter6YsrQ=S}0w!_v#*xJ0cLS;W%uO%3P-V3O@TMHu2z` z?X5O6BDmBfq@je%QBXNx$jHA>X*Y_)D*)@As-L^q^u0D|Ph3){#AnPmj$z{Z;~s<~ zdrni(TkJ(!34=r=%E;L1V;Yg00i+NlN}e;vAj|XSB?+jHqT)(l6;CL=2J@09v}x2y z=(cF&ixd5$Ct{Yq5J?=Z;1 z`*COc3gqIIf2sypcWUg#7Oo7<+K(?j+zJx?K0g!@V{o-;NH4rT%>;b<(oD!QI%i|j8x>KE0|-6uyu z5aIqyy5BSAKGg`t#vpG;2P3X=A0C%ry*!kOl<494vu+n?I`dNo5pp?qT-Xvj_72lu z8kYtsJ83va)_Ka7gwW|@L3plS@`Dnp&jUGmU2k%AYX%;kf`KSW;vw!SW4Ka$fMZX} z#mBoxhLBUSAsjjUZ8~zp0_wY12pG$om#2s*>NB)LPXto;UodqCy5!J{RFIWA=f+jT zLSPsz>;{khq8zKWoVJm+H+#=$G+pl?@>lcy39ah3-WyL&-V{=ZtufFXxWbP;ck8c# zYU`WV-7|-Ob==Bd7K?!o(=>vu_6MZBL=9ZHu2vI2yp}oMmFj^x>sw|spKEwNg~7^c zlaTj(d&wgnYzRyk9JyTq2mrtLm37oLh^?9$Yiu)!tmVoa13aHY))*ZnEUTKWT&lxY z;}haRd}&YjcVa!TWRwQQQ+EhNr+LEk4s*j|ni@!?$Hs3CoykHSr^j?+GvuJFHI9JCHgb*6r-@kEtvR~vMn3^7v-|K^{4fBtap zrhHHCoNFI$VDkEL|I_Qz?vOz);9X^Oh|m%T<&z4~cfRmuvV@+Tm~S_^F-R1s6rnq- zGCzp5idI^$j_B1uJEtw=DRbvJ^Y{E`A+34%3-E2F!=D2OPvu$2! z23lr`Ju@(fv@wN%;HBmi(0a(emg7$i^Sh!rM;CK+W|2L&IG1-V5Fq#DI1MDn2O$(B>Xka?(W>-fDR&or%2MKM z_ON zXC<$TQz`c=(<=`vq)vPM32LsI3M>sGFo>l(c$>XF(RvQKIBz*?IZv(lbH}7*&KvyP zY)Ri#l1PC^s?PTA2jgzRj@$K3p0q4)e`kc@NfF*~C+fxnxxvVYBL{o;vPs(O-t$+% ziPuwzZFPddSz#S-Vw&F;cAhb`#XR=S5j}dfIhc%Ygk%uBp^b*-KuAB{YeS{ literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/dog.ogg b/qtribu/resources/sounds/dog.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b8af471a14334ce95dd6088c6e58c922c85bd092 GIT binary patch literal 18460 zcmeFZcUV(Tw?DcQ0)!qq(xikIiu7usg(e^g2_1xl-lU`0=q2MFN3kF_yut5#&ikJG&+k6Zxqsc~&NG?4X4cftnzClk>|AkkGY7!Hzl`dun5uz^yYx{@V8mB&o5czgGTl zasvP`L(wDs*{J`fa|Qrtu_~d$icsNB*o;qsM#t8Ifp7qTkc&~&F+Z=LrTZL%ebMT( z{2$gf$K}l5iuyy6|nWHDkU} zqZ(hKLCcMd0z!w{W?|su$ooRMNitPhXic9_j<;DjP;5>64<*)kV=5nU8s zM5aXRZlvWWw~#5yI**k6%Z+5ppyLL*;PPo$;AvKWot?pL-a^(>FR{BLr(kN3OkEk; zUM+J{(?+yuO=)u+3A%8bY|0CK#v*6Ex)bxZA+GhJE~B7XL`%MJWCxalI@Q+ z68i^mFrWz)jA26?{Fj4^7mVc!7?r3hjx<746HAli$D|&O|8>;&Y9BFb(8~?LbR_Er z(B?i$3sznSYMc2{%@#IZbuDNkiHa;V?O*%^$k=OBopDY>o#u>-m#8WXphXb>fm7gA zGyrhr6Yn%L-@ol4?{j7m6bso(&&n&!nj^8nE-!L|t=n$fF2>k@yS+lT$H7ikIWE@! z!~WBB@<10LclLi8A~D1jIIgw@&w~9|Gsyx4{MhvW_BX>O_~jY+#EjIH&x%)AFQC|v zvx?Yhc6*eH4@%i(R>|I6*&b`*W0~V)+Zw!l&t>`B?brWd?WzAZkp%$MGlV5Fgd{TF zs;0mVHQk31fF{-Hh$O6wr@U3ofE#9rcx1TU$RXzCZ|B`dkp4yiV5d<|4WaTnq53+3 zcs*q+KEpjPhgh92Ia;~bS-<;#vUGntI2-_i;Q9e@eKZ`2CKG?r4W~avm-ne092p=r zHlz4Y8>d+>kO8#}`e)MkmjD2Oex!kIY?{}EMPwc=jWw5^Mpy>KXGz_&l;uH$R)x@nt&Y2sq^8LAaZNSk;PAI*PvyN^A9Ia{9phD z091pGQYNg(jB<~BF#_Ch_WTt#kNnLW_dWVQpFeGOse3*QiBdGlt@I!vWKFQ_WPN4r z6!xgffps7zwiW_tg8^Ow&N~17jr(GR%If@oazRcjnwVn^Gb(S~Co4-H`IV$5DU;9V zPnReR78~=gU=nGET+kIZa%}8;@SD>d$R(0?I{y|ri!s3l+Y1mXJ@QE;QazpS6*h97 z_Ai1XHWNxcNTixh8JNjwcER@6RHrp0?T*T8V#zt#TjqdHlk9dj(VJmkkoh?-z^PAa zjEp)XFIibmD$YzoBsNS((=ln52ugy(#Q~s~tCG!pR8~~59L7Bak7m;r6{(m(lLX4q zXbJXcj1fYlEDP-^frX(Zs@TYK-k;;Mpm6mvZrKsUQ0w9h27oOQjfrQtbLQzUo3YzWlv!v!}1Skoig6Gr>MD{X{{qmgp8Tpi(r?RIT2D_^?OTA0Pqn) z4HScUEc8_+xap)6okdR9OHHn*G_p$W0@J1yjLt$s$)n;wx<3nGK<@HMjSHs=)qC&bawJO>6i)8$y<8Ps zf%MuE6&NU40znv?#76CSxlMTaoQ?Nj;G~wgVDV6=jwuHo>1s)|4jYbJFls|fFyyemlwelUY47>F|3Mp(!~Rlf=$(I2Fe8bg(-fy$ zB#DZszg(D+ctttezjjR3#)zgQnuXjsPq8OwU?f47F0U$CIp)$5JA>tLDx=}#|7TWl zChI(ZJ@!B|8v-$a9z9Wwo)mZw&xx0d&dS8dzh~2?*WTd`HkP20 z&gRk{;woPZxLgv*NS+n7fbj4%0HA68Q_Sb&@_05AX_ z$rZE%n3<=?ot)jh{erIF3XhIYN+VB@WOD|%Mc%oJXzJ=J26CO@=HcbzKPw<8Bn&4{ z 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%0A;m`4Hx*n z@rKazDW!M-{z~|nG`b`@UAkf3r1N>wk=spV9JKaOeqG_*wOz%!t0DJL0{P9&n1CbW z(ddI0I7j}as~?+r6an@#78{$3pC}4_#NO0%;9s8X(s%CNpkh@=+^}pZP#-JU? zpcFpQ@Cfn;zzS0l(Uh%VXZ)OYDQ4Ly-xOnb?kD4!Col}%VmNbgT3XrCj&hif7YU!n z^fJ)P1wC_3C#0?1V(TaKz>e^6G;7Rh z*q9AI-8FyJ%Alik=JsMAO-`o$@u!RK4szEXdc`_dpK}k4xkKeM0Ka zw_)X~4o@CGF8_OUqg{dS_dOS^2b_iYt$_u`5?!pZ2bOUk3HVzuNaFeK|0`SoqyK7p zn*yl8K!wv3JTLvfdiCl>fOrak(yOX!vBJx2rxw*t0AS`nB+QIFUtV4WcyiANxo5aN p;ALODyu8#G7wxuav$&`YfP4!iGi;a_mo_YIuL9ofku2c_xKlt>0&)NV literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/dontcrybaby.ogg b/qtribu/resources/sounds/dontcrybaby.ogg new file mode 100644 index 0000000000000000000000000000000000000000..58012f3cfa5a45ed17b226ffc6adaec25fefbbd5 GIT binary patch literal 129945 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�Hh>BY6>-9G4-U8(M`NF_KRlsFIM> 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�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 literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/its10oclock.ogg b/qtribu/resources/sounds/its10oclock.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cd6291caa535afb246c459ce57af23b19ab8414d GIT binary patch literal 53149 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 Date: Tue, 23 Jul 2024 12:24:57 +0200 Subject: [PATCH 029/112] add optional chat sounds --- qtribu/constants.py | 3 +++ qtribu/gui/dlg_settings.py | 5 +++++ qtribu/gui/dlg_settings.ui | 25 ++++++++++++++++++++++-- qtribu/gui/wdg_qchat.py | 35 ++++++++++++++++++++++++++++++++-- qtribu/toolbelt/preferences.py | 2 ++ qtribu/utils.py | 21 ++++++++++++++++++++ 6 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 qtribu/utils.py diff --git a/qtribu/constants.py b/qtribu/constants.py index 8e592a84..09648c24 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -192,3 +192,6 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path ) CHEATCODE_DIZZY = "givemesomecheese" +CHEATCODE_DONTCRYBABY = "dontcrybaby" +CHEATCODE_IAMAROBOT = "iamarobot" +CHEATCODE_10OCLOCK = "its10oclock" diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index e1e71057..7db4779e 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -102,6 +102,8 @@ def apply(self): settings.qchat_instance_uri = self.le_qchat_instance_uri.text() settings.qchat_nickname = self.le_qchat_nickname.text() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() + settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() + settings.qchat_ring_tone = self.cbb_ring_tone.currentText() # misc settings.debug_mode = self.opt_debug.isChecked() @@ -134,6 +136,9 @@ def load_settings(self) -> dict: self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) self.le_qchat_nickname.setText(settings.qchat_nickname) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) + self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) + # TODO: load and select item from settings + # self.cbb_ring_tone.setItemText(settings.qchat_ring_tone) # misc self.opt_debug.setChecked(settings.debug_mode) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 17422764..43c096c3 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -6,8 +6,8 @@ 0 0 - 803 - 468 + 796 + 583 @@ -340,6 +340,27 @@ + + + + Play sounds + + + + + + + + dog + + + + + chicken + + + + diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 25b4c29d..d13edddd 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -1,5 +1,6 @@ # standard import json +import os from datetime import datetime from functools import partial from pathlib import Path @@ -15,13 +16,20 @@ from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget -from qtribu.constants import CHEATCODE_DIZZY +from qtribu.__about__ import DIR_PLUGIN_ROOT +from qtribu.constants import ( + CHEATCODE_10OCLOCK, + CHEATCODE_DIZZY, + CHEATCODE_DONTCRYBABY, + CHEATCODE_IAMAROBOT, +) from qtribu.logic.qchat_client import QChatApiClient from qtribu.tasks.dizzy import DizzyTask # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.preferences import PlgSettingsStructure +from qtribu.utils import play_sound # -- GLOBALS -- MARKER_VALUE = "---" @@ -299,6 +307,8 @@ def on_ws_message_received(self, message: str) -> None: self.tw_chat.insertTopLevelItem( 0, self.add_message_to_treeview(self.current_room, message) ) + if self.settings.qchat_play_sounds: + self._play_sound(self.settings.qchat_ring_tone) def on_clear_chat_button_clicked(self) -> None: """ @@ -359,8 +369,29 @@ def check_cheatcode(self, message: dict[str, str]) -> bool: Does action if necessary Returns true if a cheatcode has been activated """ - if message["message"] == CHEATCODE_DIZZY: + msg = message["message"] + + # make QGIS shuffle for a few seconds + if msg == CHEATCODE_DIZZY: task = DizzyTask(f"Cheatcode activation: {CHEATCODE_DIZZY}", self.iface) self.task_manager.addTask(task) return True + + # play sounds + if self.settings.qchat_play_sounds: + if msg in [CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_10OCLOCK]: + self._play_sound(msg) + return True return False + + def _play_sound(self, file_name: str) -> None: + """ + Play a sound inside QGIS + The file_name param must be the name (without extension) of a .ogg audio file inside resources/sounds folder + """ + file_path = str(DIR_PLUGIN_ROOT / f"resources/sounds/{file_name}.ogg") + if not os.path.exists(file_path): + err_msg = f"File '{file_name}.wav' not found in resources/sounds folder" + self.log(message=err_msg, log_level=Qgis.Critical) + raise FileNotFoundError(err_msg) + play_sound(file_path) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index a112b0b5..a3fb1ec5 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -40,6 +40,8 @@ class PlgSettingsStructure: qchat_instance_uri: str = "https://qchat.guilhemallaman.net" qchat_nickname: str = "J.D." qchat_activate_cheatcode: bool = True + qchat_play_sounds: bool = False + qchat_ring_tone: str = "dog" # usage browser: int = 1 diff --git a/qtribu/utils.py b/qtribu/utils.py new file mode 100644 index 00000000..c0e5adf7 --- /dev/null +++ b/qtribu/utils.py @@ -0,0 +1,21 @@ +from PyQt5 import QtMultimedia # noqa QGS103 +from PyQt5.QtMultimedia import QSound # noqa QGS103 +from qgis.PyQt.QtCore import QUrl + + +def play_sound(file: str) -> None: + """ + Play a sound using QSound object + """ + QSound.play(file) + + +def play_soundmedia(file: str) -> None: + """ + Play a sound using QTMultimedia QMediaPlayer + """ + url = QUrl.fromLocalFile(file) + content = QtMultimedia.QMediaContent(url) + player = QtMultimedia.QMediaPlayer() + player.setMedia(content) + player.play() From c085f033e95fafd399bf5fbbad7b6381acb70345 Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 12:34:06 +0200 Subject: [PATCH 030/112] fix sound play --- qtribu/gui/wdg_qchat.py | 4 ++-- qtribu/utils.py | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index d13edddd..64c0cedd 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -29,7 +29,7 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.preferences import PlgSettingsStructure -from qtribu.utils import play_sound +from qtribu.utils import play_sound_media # -- GLOBALS -- MARKER_VALUE = "---" @@ -394,4 +394,4 @@ def _play_sound(self, file_name: str) -> None: err_msg = f"File '{file_name}.wav' not found in resources/sounds folder" self.log(message=err_msg, log_level=Qgis.Critical) raise FileNotFoundError(err_msg) - play_sound(file_path) + play_sound_media(file_path) diff --git a/qtribu/utils.py b/qtribu/utils.py index c0e5adf7..d00f662f 100644 --- a/qtribu/utils.py +++ b/qtribu/utils.py @@ -1,5 +1,5 @@ from PyQt5 import QtMultimedia # noqa QGS103 -from PyQt5.QtMultimedia import QSound # noqa QGS103 +from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer, QSound # noqa QGS103 from qgis.PyQt.QtCore import QUrl @@ -10,12 +10,13 @@ def play_sound(file: str) -> None: QSound.play(file) -def play_soundmedia(file: str) -> None: +def play_sound_media(file: str) -> None: """ Play a sound using QTMultimedia QMediaPlayer """ url = QUrl.fromLocalFile(file) - content = QtMultimedia.QMediaContent(url) - player = QtMultimedia.QMediaPlayer() - player.setMedia(content) + player = QMediaPlayer() + player.setMedia(QMediaContent(url)) + player.setVolume(100) + player.audioAvailableChanged.connect(lambda: player.play()) player.play() From 229960d8337b28c50fbc71a7e33fd6f3de5d4f55 Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 12:40:42 +0200 Subject: [PATCH 031/112] edit sound volume in plugin settings --- qtribu/gui/dlg_settings.py | 2 ++ qtribu/gui/dlg_settings.ui | 18 +++++++++++++++++- qtribu/gui/wdg_qchat.py | 4 ++-- qtribu/toolbelt/preferences.py | 1 + qtribu/utils.py | 11 ++--------- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 7db4779e..5961d5e0 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -103,6 +103,7 @@ def apply(self): settings.qchat_nickname = self.le_qchat_nickname.text() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() + settings.qchat_sound_volume = self.hsl_sound_volume.value() settings.qchat_ring_tone = self.cbb_ring_tone.currentText() # misc @@ -137,6 +138,7 @@ def load_settings(self) -> dict: self.le_qchat_nickname.setText(settings.qchat_nickname) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) + self.hsl_sound_volume.setValue(settings.qchat_sound_volume) # TODO: load and select item from settings # self.cbb_ring_tone.setItemText(settings.qchat_ring_tone) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 43c096c3..0f991473 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -347,7 +347,7 @@ - + @@ -361,6 +361,22 @@ + + + + 1 + + + 100 + + + 50 + + + Qt::Horizontal + + + diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 64c0cedd..e846665c 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -29,7 +29,7 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.preferences import PlgSettingsStructure -from qtribu.utils import play_sound_media +from qtribu.utils import play_sound # -- GLOBALS -- MARKER_VALUE = "---" @@ -394,4 +394,4 @@ def _play_sound(self, file_name: str) -> None: err_msg = f"File '{file_name}.wav' not found in resources/sounds folder" self.log(message=err_msg, log_level=Qgis.Critical) raise FileNotFoundError(err_msg) - play_sound_media(file_path) + play_sound(file_path, self.settings.qchat_sound_volume) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index a3fb1ec5..1fa5850d 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -41,6 +41,7 @@ class PlgSettingsStructure: qchat_nickname: str = "J.D." qchat_activate_cheatcode: bool = True qchat_play_sounds: bool = False + qchat_sound_volume: int = 50 qchat_ring_tone: str = "dog" # usage diff --git a/qtribu/utils.py b/qtribu/utils.py index d00f662f..62b2ae53 100644 --- a/qtribu/utils.py +++ b/qtribu/utils.py @@ -3,20 +3,13 @@ from qgis.PyQt.QtCore import QUrl -def play_sound(file: str) -> None: - """ - Play a sound using QSound object - """ - QSound.play(file) - - -def play_sound_media(file: str) -> None: +def play_sound(file: str, volume: int) -> None: """ Play a sound using QTMultimedia QMediaPlayer """ url = QUrl.fromLocalFile(file) player = QMediaPlayer() player.setMedia(QMediaContent(url)) - player.setVolume(100) + player.setVolume(volume) player.audioAvailableChanged.connect(lambda: player.play()) player.play() From e484fe4beb031de830f06f84c5ff026590dbf065 Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 13:51:47 +0200 Subject: [PATCH 032/112] fix widget initialization --- qtribu/gui/wdg_qchat.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index e846665c..6436f48b 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -67,8 +67,6 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.opened.connect(self.on_widget_opened) self.closed.connect(self.on_widget_closed) - self.cb_room.currentIndexChanged.connect(self.on_room_changed) - # connect signal listener self.connected = False self.btn_connect.pressed.connect(self.on_connect_button_clicked) @@ -144,6 +142,8 @@ def on_widget_opened(self) -> None: finally: self.current_room = MARKER_VALUE + self.cb_room.currentIndexChanged.connect(self.on_room_changed) + def on_rules_button_clicked(self) -> None: """ Action called when clicking on "Rules" button @@ -362,6 +362,7 @@ def on_widget_closed(self) -> None: """ if self.connected: self.disconnect_from_room() + self.cb_room.currentIndexChanged.disconnect() def check_cheatcode(self, message: dict[str, str]) -> bool: """ From 6418623692e9d21437d4ed4873990a0245b07e83 Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 15:03:31 +0200 Subject: [PATCH 033/112] add more ringtones --- qtribu/resources/sounds/beep_1.ogg | Bin 0 -> 5916 bytes qtribu/resources/sounds/beep_2.ogg | Bin 0 -> 4460 bytes qtribu/resources/sounds/beep_3.ogg | Bin 0 -> 5965 bytes qtribu/resources/sounds/beep_4.ogg | Bin 0 -> 10817 bytes qtribu/resources/sounds/beep_5.ogg | Bin 0 -> 8051 bytes qtribu/resources/sounds/beep_6.ogg | Bin 0 -> 10616 bytes qtribu/resources/sounds/beep_7.ogg | Bin 0 -> 19968 bytes qtribu/resources/sounds/horn.ogg | Bin 0 -> 9777 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 qtribu/resources/sounds/beep_1.ogg create mode 100644 qtribu/resources/sounds/beep_2.ogg create mode 100644 qtribu/resources/sounds/beep_3.ogg create mode 100644 qtribu/resources/sounds/beep_4.ogg create mode 100644 qtribu/resources/sounds/beep_5.ogg create mode 100644 qtribu/resources/sounds/beep_6.ogg create mode 100644 qtribu/resources/sounds/beep_7.ogg create mode 100644 qtribu/resources/sounds/horn.ogg diff --git a/qtribu/resources/sounds/beep_1.ogg b/qtribu/resources/sounds/beep_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7cb02547d9f626ce4f8604e4d75f33445d3c71df GIT binary patch literal 5916 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 C>9rF8 literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/beep_2.ogg b/qtribu/resources/sounds/beep_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6ff899844ec3240d983dc0fe2d0cee51223333be GIT binary patch literal 4460 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 H1h)SLZ3z-7 literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/beep_3.ogg b/qtribu/resources/sounds/beep_3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aa4cccbf2797058925066128173518f60621b691 GIT binary patch literal 5965 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 FzX8fn?RfwI literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/beep_4.ogg b/qtribu/resources/sounds/beep_4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1df613ba6902b052b8ce2a8b48f607e14ef45ac4 GIT binary patch literal 10817 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 H`X}%oThJl* literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/beep_6.ogg b/qtribu/resources/sounds/beep_6.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9fc0cd0d40eaff313ddef901284126c6a5060ba8 GIT binary patch literal 10616 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 literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/beep_7.ogg b/qtribu/resources/sounds/beep_7.ogg new file mode 100644 index 0000000000000000000000000000000000000000..08a567e96d958f63dd52e57afd79f230608740e1 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/qtribu/resources/sounds/horn.ogg b/qtribu/resources/sounds/horn.ogg new file mode 100644 index 0000000000000000000000000000000000000000..89bb645f8523d4a74018bcbbbd6e94363507511a GIT binary patch literal 9777 zcmaiZcRbZ!`1rZQ3|(7Dl)VYL_TKYy?JX;mT(_v`+LDmnjj}^#WmSaCviGKBrJ@Lx z@q5$f^Z9h8r8%9RYDPe)lfrJ1Lte*(z2o#WJD#z z#gEuIp`Y7j*DDv@{1qXhD@2qyFLgxa^zm}}D+nX``#!6tZUF--0C3}21hooqOc5wn zHIq{d>}tKv}zzjM64<~R|JouRZ=*g zA_T>tA)MC{4yE?*Llf-@QB}!LM=XfTQiU(d?y^T{qODL6ZiO@Aq*@&@yc7*Fb4%-( zgp;CI*dtnm`D4Rc#p{?Nkkb5dVV}f1hr>^(#Sp`FrFU5)JX8aj{b)UVf ziv0vRwKWMe5r7=x(}~U3iT|XN#BH6#b6l71lnB3nc3dTo#dV;mFs0JG%0PB3cM$;c zY}wcXtJnh1*yWgb@`$KXI3NIkgqo33H&f6~(daYBj@9^1{jX}9=632>9I_#5(96A; zG)5e8iu8CMpl%RoW5rtu{~DRVqDPZUQHGw&T*$VjA?j73PiN{>2PHj>tw%3s;(EK5 zG9`K;C^yrZiU{#7XSQZrQ~rhcs)G87f=9Tky{k@{wCxbYTNac^yjKlDBxPRlMExoV z(y0%^Jk&qJ;f_=tKR&muvS-pCeHJy;r#@YpS;-cI*$@jv~yN@4oUrL|T$WuwQqSS@TS}|t6(xX=1-_Xm%@D~;~-euJo zJ%NH04CS%?I3e4sk)FDkXnLgCB}U*$raz@%(O+|N9!(7Z#y{8xXixu7{m$M;%VSCh zRgob{=^-;sEZ%J_4R2i=Y&#xlzY{zI)m^-^Rhpai|EYh64n;X9qf6| zr=b2FCN!bIk3sv`-*lgG>ko4G3N*U8Dnlfk(Nnr;V?M*NEn##BhN!y#r*kdhx zEz^8$Yw%O)Zc{tKbN{Q_lN}F{4gk5Na{@_c1(FtIVD?d>_rQnE@($<7v~L| z>Qxom$m zh2Yw%fs$Y51A*h7(7h5ET!7+SmBbr2nT1J7$iZl7XnwrUCY* zST}1(^EG?xF|6fiFr<0J%y5Dci%r8$jJRRb@Qwl484LS~F|74y@YHCe<7jY8QOV28 z@5;-cJ}dq6O!UvouWKo~Lk3438qqMt8d_HSn&EwI={3g~u_I}kW_U+7hrFnj<>gRx7~>x!sG2z-R3Oatase(J4W$yI|f5F zhGQf6AuN7w6u`^Q7zmzzz5jkx`}O;3E>SL}aQPsKzjaLrZ}`L?Wh@C88TGa0-V}6DW?vVD7Sn zC!%?Ia7KFkIRz$q`Z*D!Y64Y}7#p9m5u(jq>4-ra{(@=~y}QK)thV0LT5+nKnaN3L zzJiovLN{74D;!!vp@q&ySfI@c&BqfSuSdpJkfdk8Q^2AwSe2UM0ujb-eCpdWaQp>r zNqRm!1y;5O=o%JW{88h4$Bh?MV=&&SI1Hr9jYdxpQl+OS0rd(}MWdz%sWQ`pdgUS{ zFk+>5sR~l1FEMI@xeF2W^&}uwm#Y>>RXs)W>0J4F+L>I-%c@z`1^zZZ!sJ@kaMUP#5LirO^pF5D6&o; zW1#5seg7AO$Il$|VDa|$I~u0akOM;wt_Vp%80+oeA@gHQO{Aj~))K;`xy@PGAMw=S zZCNZvjxfHq7ou#(@H0D+&S<&X%WE&!|FnFU?*L!}Nd~gvY!=$G0<0&5k9!3rZqVGS z>Trdlpsln3h0%l7MixIPEfLS5Vqkqn2Vx*!CBF}Ck@r%L_Q@ltAcgL~-0Xj{wEqK< zfL&u*u&X?tEl?$^lEWngBS1=T#FS%y1KoURfKfE96t7HlnY>HU@N25m0bMaqXK}y_T zK8k{rq<{FJJVJ6g8JQZTwu3d$}Exhjh)-zhAUa~=gV2jSR%RRCaUwJ^JrrP?jwQOrdy zQBJbBk_#8h175m4$hHB($r_#VYK zJ&(-F#gH8xC;&A3CjsanLD3GdYelt_YDagF=|I^qR60Qu8EE2yYiLMC-_NOP9{BJb zMh7J+{}dz=c?>~*2$0C*;|&so{3RY8Z;tS&oM(|}*pr-`tP)PHGiT16Ju56OC?w3w z!z(U5JN2%$vA#UNNL)x*gol?`NL1>_`apH_ z`n$7cIhoUTHiGm_4eKPwrpgJG-nf+xRcilqW!jRCtUc%;Q~Nl z&5Irq!WHSx!#4*{!)|AAE0naaIx}p z4))A&(|5eb&uN@O!jHZe=fhlO73q>b=HlG%Ow{Y6^XOM)=i@fM3B?oRJ1h=vr zNs7|Ny3V%(1O31un!W9Q-8~q=*W$5_1RL!$3(VVYX*Gh#vkbXt2BAxHA4i2wn>{InP?+=#UtsJqp@2PK|hZ|qFYA`1BInYx*A?-j&K`{|&DXEe3 zEKIC!le;-w7p^6GEy`dkCL^jBIo`2qJW@WCkh6UL)n|i_+}>>z+&#pL>BM?gpzc154yOVHnDnuvno&-A;PT3i@^QgbLq4q=pe$cZ*scvnhxGDzqxbGt=hWU1gJl&C*3L zZs5LIdQT&|Tah#K8=V#U$@Aq5Lx1JeYYshO-6kzet+D>d7hY_ySq2JdQv@!nKPGix^?=E*o9tp zxb~=YKO8tXx|GYcwX#`_Db!VnD!()En5muGS?hQbXBG>%HHD~T23eXu!EW{AXP}wQ zBrKFKcnEFgbJ@m+iscH29LHTj?z?_W% z-GW8$%T3F?o=!LNg-G9^q25eVDpeoURz`0Y|EfbM=)3be)NMZ3`3);(0Djxk)L%K~YJ2F%6yB=$R%oAW(rj*Mc(=)! zseb^|FqVlZ+d{;UfS#)&RBWT7K46(49DBv%>_A+Q7_)YHF2?6A3a{ zt%A5U&qkmUFw=^Ye90qxmU-_5Gp^*b3z(bf`ABm>Ym<}S{N$`znFNhwW0c~IXN%?C z5l_`|{KUKaCODvBDxkN%8X`*alID`E)mXd_AT*wwdUadFu@@_JzlJEOU_1Hl3*~-1 z&e%uVX3A2*QG3{%7IEw0$#FN1dBQi-4qiYwF~9sJ!bUksjVKmvXpEk5`fB1l6k%Of zQ;lCAJA0n_(Zz`YoYr8;JF`4Qkekw@B|ayqU1O_Ql38 zZ00rc{B2yf>xMdGlkXyU#&nmx@~Q$a)mO52EK9efpQ4tpDKwEBtWD~gMZdb>5<=vB z{M}zV@%!cXMui15#BtUpP9_j==akaH4yuKJrnH!`IlWJB(U;O!hzE?<+2+V`NWFA6 zG5^qTVdqSI`#|XE>mJ%vg$6`KQ670FJ6#eSN-eMU-jb#O~ zGTnqACtIgRCW4hL(Fi1=y^S}l;YMsjN4lW=H)TV!JAH5O66oLQ-`^+v7!u?$-KY6Z z_mw~Q!Xy5b5yv~&LesJLZMHz%vB!vP_dHTTjDkXGogwhF?|Zg$_Qj4As4vR5?$ysN z4&}Z==`y2w5}tZ@!#mriQn2LXg@biB>B~MoI)_0^qUU}*ANxl7v+G(}GICpHP~;H( z^^ra+>}gwG_W*0}DP`&?bUJt5HA~0tyEYrwrY^9jdx>1Q50vzn5}6u9e>k`#rzs3( zCuvz9Tt^&OT4?gYB?!F(Z_7Ebr%A^pPZV~Pbq9Q1e$%<{A7mcQnmVBLz3{uw*ge?1 z+yGAUnmO$IUd4lgob~qo$4LLgaWw*l%;AS(b>RBuc{c&CIbElBwna`Nldn7bo~!JT znS^w||IBr}Gre+1p1Jo@MzHJG_u@acdl*dYseQ<3J2K8xCTl28MEOy0Y5oc}6Kh{x zh4afkjaGQHTyY|J1wpwieG9~a^ zgsUW|C7XB{=!5w@*hk{-_Um!y(|hZK7MxjRkCewwhCV$%e0A1H2GuRYeX4VAa&Vg- z40vJ3{ab9P_fLre&yjFVTl2u%*X5OceeEChTyTN)+BsR$e%TEAo>y`uT2m-ef8GA3 z^hE1wxiyZ@?*re{ux6Kg4Fh-SJ{dpA3m+s8X8rvuStHeKJpb}G8GW$>HG1skBkuc= z((<>W+NV34&-?XFm#84VWO|ZR?w#kKWhM#bm9JVeUdEjm8D73_w7a==CM?TVJ<*BE z|2yB=P*P55gV5rfJF~9?b${ZEFVaN9_2k*Ne(#=# zQcd{uzafM3<_s;1R|D>SMXl~gQlJ|O0G(_vMe`C+SS_rZ&Yq7IT~{KfFP0)-P| zepy_M9iVZnHTInR{^*4wCm0iWHfNC71lOQtR~a4B zxA+6!>Dm0+YpW&KNG>^(oh>j-2U0F!pOViKi>Ae_D=vwx<~9{>%r#WzDVyB-|RL)pg^?ade3byoCDeYJel7G@@O!VdClBqZs7OdFF%0 z&u3uO4_j+U-jSXF5>$LQ;v!BZw()b)`1%fQfBWWexJP{T$^rB+`3NTsJRxB5#HpV$>!$!?C1!p>6OaeS)NIBEv4{tHpDhfms+vXNH^9%dLP&M9PP(%`P zoB*|Up~3U_%F3-ub2^`BX}4DsgFc>*qGf$d)=BYAY>N@7Ri3M?d)M5;`KXrpg>vbf z1Q3KJrj!xbWIWg-;~%Q5?>xk^6&qd0EuAXA9XzBhDSRT7@I~TNNl$jGAZo6PS6iXu z@Zs~5UKLq?8WdJ1woM)dV=|Rg7$ejBZsd>~YUykqj1H099}44tJDgXttB-7A{r!3b z*TywDC_g7=I_p{RDOc8emq|+wlc?Jc;}97Qy6wxEk#UB^lw1xWRq=kNa6b`RV3C!$JW&708W!Jw`|(BlTNl9Y0; z&>ur^65j(E$L;+hqf-`2aP|(rJ7ot4`w}^+h>MlbX}#jX?S;(b(`p~d2}0I|y*H+- zjQ=(X*H(r`Stj*VV6ousn|Uvy?|eJ!`m3A?I3At= z!s^3LQw_=u+$%3t8G-m%<#dyOX|SQJ>tkL`VRw^Z5Uzms{4pn{}80%3; zgZ`nyElx+g#}H-lF6^{6>q)1shWIFfWqvN9NVO~;p6d<_<=ovDIhg=In?U* zNZcA}k;{d49Pqztf0;5sXJW zn_(Ty9p7x(1gG~-6uk8+MF%(49GWb+XWq01rM#a)DOhQ^Z@v!sPq)Ew#GlZ zWm4U_`Qau748+tr_N*g8Bhh{EBPHoFO>fv4>R_1h%G(C@b&dKur5G|5fL$8 zcJU*=341vga#N01hztb3ZuC}^^;O_k2OI6k4-dY7`Vx=+Px#wbCL%0t7yn{l zIR3(X+g6B{fR&|Se|5_NsXIlXdLBYtny^K)HERn$%OxF>S%<88M;I#-!qc7OpT?eKclnkE;7Rz@oaX&V>tbc3-EOP(8Pv6T_o_{>qMt&HI^x&$8>rGKF`4xrXKQX0`u}{~V#Xmq%&h-6@>S zx}`OIuz6RFDd{rvNYBUmh^6ecu7?*!TT(|^N0v_ja4~kdD}5nZ`1E2UVZ`HyupCiF`8c|vsCB6s1q$!xI`-KGLAU2oTv6b}XW>kTKlQ}W z4Ofx_W|FjX^7ysuKfTHAbAP>}IQ02=v%kLHif-kh8;tXz-ymBybIfq9no~kQEACSO z|9kuyd%dLapYRVs3P{EdFIb?w&~RW0*!tcr#zRkFk4)>!#d*-H zE!MQZemT2L*ZaJYm`lW4sI9N(Ec(#PH+>ndBD*p8OKjX?BpOzRin^qr?@VU2<=ExZ z(nevYbRX?M8rRYvgy%QM#n)c&lXfRiZBX3c$^0H;6*A1VA%tjLZoS2AyT7vDD@S!t zNal^t`0cC^p`6-TK$k+z1k^>(zoNJ_Z^BPtk=`o!^@8!2=vmi;mkDoGGVb0u)i4lq zv-(5#C2tjtkx5R@n#>%=$;yx?V7=cpjC$8je+EhFWX`)Ve>xCnmnJHAYmr>p$^A#5 zIqZkqsrjFJ9UGe;XDh)x&m=Vk*bx`o60GW0gCBm}u4N^hdeCZ~9)rwyvMKBq-tqVn zKaIZggeyrCu9R{%-5`Q{{o`Ul$V{B($IB#O{11Ve;vK(qS!^U6?9f@!JRyEErwV+n zbm^qPe!Hr7JKaH@%~cD}xd$E@dWKoWjc>MA~4_wrplFpjV^M!-dX2;HU32R?Ov2xo@Pk za$tUgIY5p@nDl4&g^2IZN4ni&xlHd9pwdmC$wypNC^t_|s_x_iB0KkAC3Ih-j=|9b zw^noQ=&_;~I#AXuFKZ zdJIo?Y~O3i@cYdO1(y`jPe>+f5ejc+^;eQyQb}THqVWyCN3nMJ2MmiJsI)&^WpZ#oZnO?vc`y*(UKzkukj~h2?>&_j&}*MIU4o^KbBMJ zoD*Tg^h;-(oxVt>)SPs>hwgLzty1Ov6QKDou>j1BOBZ{>*XZwD(Y>;6gb6LG zLwv3|`_U7Q>) zXq6sJQ#m-u>sPmQ`t4AlyI6Zd3RjD{3`u{4+5@zbdq z8OTv4b*U9)lj7v$`$>_nLW=n4d_~X|{VZA?$6z;-ha1TKzFE6q|L6N}{J=BTGP^E% ziJ^yzi>IU!AX+E)*OVQZQ@S>3EVt^w2SpTvye_%1f6VT!M5>TMueYr2sQRxz3;Nim zl9aCraTr~;qhpesMVc5iKLZQ2{8inym!QEzSMUV0-ydfzg--*%9av*@W?Saj2YZ4F zzH%w=X})@29@dzwIR*Q)(fK9(MHRUd;lS}$^{usxS+k(xlQ%mgpJCU=F2%M~ZM&rj zgs;7|xe<77x@nI-T`2XYP9rZJh|}xI1ofLAH3q&evg{e((7h7&*f@(wl52gZB>#%6>C$+2Sl`_pR|U z=K_NkvKSYx_=>>!~&mZd8+m7&ZG61#oycs6+?fz>W7*e z%*u)#lqJ)3E`1>h{&i;0QKn3hBK5pYQA4o(@0!sa_!M`q^}X$maMK4b-f{PU>hx0{ mhM?#x@$-42Ql6xx6j2B6C%=D<6igC1Md=NIYXcR5 Date: Tue, 23 Jul 2024 15:04:04 +0200 Subject: [PATCH 034/112] play tone in preferences widget --- qtribu/gui/dlg_settings.py | 12 ++++++++++ qtribu/gui/dlg_settings.ui | 40 ++++++++++++++++++++++++++++++++++ qtribu/gui/wdg_qchat.py | 22 +++++-------------- qtribu/toolbelt/preferences.py | 6 ++--- qtribu/utils.py | 17 +++++++++++++++ 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 5961d5e0..ca4a5580 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -27,6 +27,7 @@ from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.commons import open_url_in_browser from qtribu.toolbelt.preferences import PlgSettingsStructure +from qtribu.utils import play_resource_sound # ############################################################################ # ########## Globals ############### @@ -85,6 +86,9 @@ def __init__(self, parent=None): # load previously saved settings self.load_settings() + # play sound on ringtone changed + self.cbb_ring_tone.currentIndexChanged.connect(self.on_ring_tone_changed) + def apply(self): """Called to permanently apply the settings shown in the options page (e.g. \ save them to QgsSettings objects). This is usually called when the options \ @@ -158,6 +162,14 @@ def show_instance_rules(self) -> None: ), ) + def on_ring_tone_changed(self) -> None: + """ + Action called when ringtone value is changed + """ + play_resource_sound( + self.cbb_ring_tone.currentText(), self.hsl_sound_volume.value() + ) + def reset_read_history(self): """Set latest_content_guid to None.""" new_settings = PlgSettingsStructure( diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 0f991473..8e3cbccd 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -349,6 +349,46 @@ + + + beep_1 + + + + + beep_2 + + + + + beep_3 + + + + + beep_4 + + + + + beep_5 + + + + + beep_6 + + + + + beep_7 + + + + + horn + + dog diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 6436f48b..ae1ca5a4 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -1,6 +1,5 @@ # standard import json -import os from datetime import datetime from functools import partial from pathlib import Path @@ -16,7 +15,6 @@ from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget -from qtribu.__about__ import DIR_PLUGIN_ROOT from qtribu.constants import ( CHEATCODE_10OCLOCK, CHEATCODE_DIZZY, @@ -29,7 +27,7 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.preferences import PlgSettingsStructure -from qtribu.utils import play_sound +from qtribu.utils import play_resource_sound # -- GLOBALS -- MARKER_VALUE = "---" @@ -308,7 +306,9 @@ def on_ws_message_received(self, message: str) -> None: 0, self.add_message_to_treeview(self.current_room, message) ) if self.settings.qchat_play_sounds: - self._play_sound(self.settings.qchat_ring_tone) + play_resource_sound( + self.settings.qchat_ring_tone, self.settings.qchat_sound_volume + ) def on_clear_chat_button_clicked(self) -> None: """ @@ -381,18 +381,6 @@ def check_cheatcode(self, message: dict[str, str]) -> bool: # play sounds if self.settings.qchat_play_sounds: if msg in [CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_10OCLOCK]: - self._play_sound(msg) + play_resource_sound(msg, self.settings.qchat_sound_volume) return True return False - - def _play_sound(self, file_name: str) -> None: - """ - Play a sound inside QGIS - The file_name param must be the name (without extension) of a .ogg audio file inside resources/sounds folder - """ - file_path = str(DIR_PLUGIN_ROOT / f"resources/sounds/{file_name}.ogg") - if not os.path.exists(file_path): - err_msg = f"File '{file_name}.wav' not found in resources/sounds folder" - self.log(message=err_msg, log_level=Qgis.Critical) - raise FileNotFoundError(err_msg) - play_sound(file_path, self.settings.qchat_sound_volume) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 1fa5850d..81aa9875 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -40,9 +40,9 @@ class PlgSettingsStructure: qchat_instance_uri: str = "https://qchat.guilhemallaman.net" qchat_nickname: str = "J.D." qchat_activate_cheatcode: bool = True - qchat_play_sounds: bool = False - qchat_sound_volume: int = 50 - qchat_ring_tone: str = "dog" + qchat_play_sounds: bool = True + qchat_sound_volume: int = 33 + qchat_ring_tone: str = "beep_1" # usage browser: int = 1 diff --git a/qtribu/utils.py b/qtribu/utils.py index 62b2ae53..cb08356c 100644 --- a/qtribu/utils.py +++ b/qtribu/utils.py @@ -1,7 +1,24 @@ +import os + from PyQt5 import QtMultimedia # noqa QGS103 from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer, QSound # noqa QGS103 from qgis.PyQt.QtCore import QUrl +from qtribu.__about__ import DIR_PLUGIN_ROOT + + +def play_resource_sound(resource: str, volume: int) -> None: + """ + Play a sound inside QGIS + The file_name param must be the name (without extension) of a .ogg audio file inside resources/sounds folder + """ + file_path = str(DIR_PLUGIN_ROOT / f"resources/sounds/{resource}.ogg") + if not os.path.exists(file_path): + raise FileNotFoundError( + f"File '{resource}.wav' not found in resources/sounds folder" + ) + play_sound(file_path, volume) + def play_sound(file: str, volume: int) -> None: """ From 76777e7ed67ffcc95d42df335046053ef7c45b6d Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 16:44:42 +0200 Subject: [PATCH 035/112] edit default qchat instance --- qtribu/toolbelt/preferences.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 81aa9875..8c9cc9ec 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -37,7 +37,7 @@ class PlgSettingsStructure: rss_poll_frequency_hours: int = 24 # QChat - qchat_instance_uri: str = "https://qchat.guilhemallaman.net" + qchat_instance_uri: str = "https://gischat.geotribu.net" qchat_nickname: str = "J.D." qchat_activate_cheatcode: bool = True qchat_play_sounds: bool = True From bebfa833fa7c8f13235d3115d9f26a7f60baad3c Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 17:11:57 +0200 Subject: [PATCH 036/112] add audio mention to pixabay --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7695038e..7a45afc2 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,5 @@ Plugin pour QGIS > 3.28 Inutile au travail donc forcément indispensable. :book: :fr: [Voir la documentation](https://geotribu.github.io/qtribu/) + +:sound: Audio sounds come from [pixabay.com](https://pixabay.com) (see [terms of license](https://pixabay.com/service/license-summary/)) From c41b650226912d4f77185637dfa0e1d282006bb2 Mon Sep 17 00:00:00 2001 From: Guilhem Allaman <40383801+gounux@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:22:07 +0200 Subject: [PATCH 037/112] Update qtribu/metadata.txt Co-authored-by: Julien Signed-off-by: Guilhem Allaman <40383801+gounux@users.noreply.github.com> --- qtribu/metadata.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qtribu/metadata.txt b/qtribu/metadata.txt index 6a24bc43..b8196353 100644 --- a/qtribu/metadata.txt +++ b/qtribu/metadata.txt @@ -1,6 +1,7 @@ [general] name=QTribu -about=Garde le Qontact avec ta Geotribu ! Keep in touch with your geo tribe ! +about[en]=Keep in touch with your GIS Tribe! +about[fr]=Garde le Qontact avec ta Geotribu ! category=Web description=Geotribu (https://geotribu.fr) content right into QGIS. icon=resources/images/logo_geotribu.png From 87ebbf1a1471957c4202d1ed3147cadcf421bbc2 Mon Sep 17 00:00:00 2001 From: gounux Date: Tue, 23 Jul 2024 18:36:48 +0200 Subject: [PATCH 038/112] edit action order --- qtribu/plugin_main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index e5ee2500..55c9e743 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -158,11 +158,10 @@ def initGui(self): self.action_splash.triggered.connect(self.splash_chgr.switch) # -- Menu + self.iface.addPluginToWebMenu(__title__, self.action_open_chat) self.iface.addPluginToWebMenu(__title__, self.action_show_latest_content) - self.iface.addPluginToWebMenu(__title__, self.action_contents) self.iface.addPluginToWebMenu(__title__, self.action_form_rdp_news) self.iface.addPluginToWebMenu(__title__, self.action_form_article) - self.iface.addPluginToWebMenu(__title__, self.action_open_chat) self.iface.addPluginToWebMenu(__title__, self.action_splash) self.iface.addPluginToWebMenu(__title__, self.action_settings) self.iface.addPluginToWebMenu(__title__, self.action_help) From 77ca994f59230f1e8a18258281bd74c1c6fdb552 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 04:53:39 +0200 Subject: [PATCH 039/112] move nickname to authoring widget --- qtribu/gui/dlg_settings.py | 2 -- qtribu/gui/dlg_settings.ui | 48 ++++++++++++++--------------------- qtribu/gui/wdg_authoring.py | 2 ++ qtribu/gui/wdg_authoring.ui | 50 ++++++++++++++++++++++++++----------- qtribu/utils.py | 2 +- 5 files changed, 57 insertions(+), 47 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index ca4a5580..6ad65fe4 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -104,7 +104,6 @@ def apply(self): # qchat settings.qchat_instance_uri = self.le_qchat_instance_uri.text() - settings.qchat_nickname = self.le_qchat_nickname.text() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() settings.qchat_sound_volume = self.hsl_sound_volume.value() @@ -139,7 +138,6 @@ def load_settings(self) -> dict: # qchat self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) - self.le_qchat_nickname.setText(settings.qchat_nickname) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) self.hsl_sound_volume.setValue(settings.qchat_sound_volume) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 8e3cbccd..e9e7b175 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -313,19 +313,9 @@ - - - - Nickname: - - - - - - @@ -333,21 +323,37 @@ - + Activate cheatcodes - + Play sounds - + + + + 1 + + + 100 + + + 50 + + + Qt::Horizontal + + + + @@ -401,22 +407,6 @@ - - - - 1 - - - 100 - - - 50 - - - Qt::Horizontal - - - diff --git a/qtribu/gui/wdg_authoring.py b/qtribu/gui/wdg_authoring.py index aacf28b8..363db56a 100644 --- a/qtribu/gui/wdg_authoring.py +++ b/qtribu/gui/wdg_authoring.py @@ -36,6 +36,7 @@ def load_settings(self) -> dict: settings = self.plg_settings.get_plg_settings() # author + self.ln_qchat_nickname.setText(settings.qchat_nickname) self.lne_firstname.setText(settings.author_firstname) self.lne_lastname.setText(settings.author_lastname) self.lne_email.setText(settings.author_email) @@ -50,6 +51,7 @@ def save_settings(self) -> None: settings = self.plg_settings.get_plg_settings() # store user inputs + settings.qchat_nickname = self.lne_qchat_nickname.text() settings.author_firstname = self.lne_firstname.text() settings.author_lastname = self.lne_lastname.text() settings.author_email = self.lne_email.text() diff --git a/qtribu/gui/wdg_authoring.ui b/qtribu/gui/wdg_authoring.ui index c8c6cedf..1eaf6d6f 100644 --- a/qtribu/gui/wdg_authoring.ui +++ b/qtribu/gui/wdg_authoring.ui @@ -7,7 +7,7 @@ 0 0 350 - 225 + 268 @@ -41,7 +41,7 @@ - + @@ -54,7 +54,7 @@ - + Pierre @@ -64,7 +64,7 @@ - + @@ -77,7 +77,7 @@ - + Qt::ImhUppercaseOnly @@ -90,7 +90,7 @@ - + @@ -103,7 +103,7 @@ - + Qt::ImhEmailCharactersOnly @@ -116,7 +116,7 @@ - + Used to credit the commit author. @@ -126,7 +126,7 @@ - + Qt::ImhUrlCharactersOnly @@ -139,7 +139,7 @@ - + Used during broadcasting to credit author. @@ -149,7 +149,7 @@ - + https://www.linkedin.com/in/pierredupont/ @@ -159,7 +159,7 @@ - + Used during broadcasting to credit author. @@ -169,7 +169,7 @@ - + https://twitter.com/geotribu @@ -179,14 +179,14 @@ - + Mastodon account: - + Qt::ImhUrlCharactersOnly @@ -199,6 +199,26 @@ + + + + + 75 + true + + + + QChat nickname: + + + + + + + pdupont + + + diff --git a/qtribu/utils.py b/qtribu/utils.py index cb08356c..00777b1a 100644 --- a/qtribu/utils.py +++ b/qtribu/utils.py @@ -22,7 +22,7 @@ def play_resource_sound(resource: str, volume: int) -> None: def play_sound(file: str, volume: int) -> None: """ - Play a sound using QTMultimedia QMediaPlayer + Play a sound using QtMultimedia QMediaPlayer """ url = QUrl.fromLocalFile(file) player = QMediaPlayer() From cea901ae99c1ecabf6620407133563720d03bd10 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 04:55:00 +0200 Subject: [PATCH 040/112] add volume label in preferences widget --- qtribu/gui/dlg_settings.ui | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index e9e7b175..89ca9b00 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -340,13 +340,13 @@ - 1 + 0 100 - 50 + 33 Qt::Horizontal @@ -407,6 +407,13 @@ + + + + Sounds volume : + + + From 42ff1db0f53a4c5182e6375308c39fe9baeba8a8 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:03:16 +0200 Subject: [PATCH 041/112] use label instead of lineedit for nickname in qchat widget --- qtribu/gui/wdg_qchat.py | 38 +++++++++++++++++-------------------- qtribu/gui/wdg_qchat.ui | 42 +++++++++++++++++++++++++---------------- 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index ae1ca5a4..914203ed 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -39,7 +39,6 @@ class QChatWidget(QgsDockWidget): connected: bool = False current_room: Optional[str] = None - settings: PlgSettingsStructure qchat_client = QChatApiClient def __init__(self, iface: QgisInterface, parent: QWidget = None): @@ -93,25 +92,24 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.ws_client.textMessageReceived.connect(self.on_ws_message_received) # send message signal listener - self.le_message.returnPressed.connect(self.on_send_button_clicked) + self.lne_message.returnPressed.connect(self.on_send_button_clicked) self.btn_send.pressed.connect(self.on_send_button_clicked) self.btn_send.setIcon( QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg")) ) + @property + def settings(self) -> PlgSettingsStructure: + return self.plg_settings.get_plg_settings() + def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" - self.lb_instance.setText( + self.lbl_instance.setText( self.tr("Instance: {instance}").format( instance=self.settings.qchat_instance_uri ) ) - self.le_nickname.setText(self.settings.qchat_nickname) - - def save_settings(self) -> None: - """Save form text into QgsSettings.""" - self.settings.qchat_nickname = self.le_nickname.text() - self.plg_settings.save_from_object(self.settings) + self.lbl_nickname.setText(self.settings.qchat_nickname) def on_widget_opened(self) -> None: """ @@ -119,28 +117,27 @@ def on_widget_opened(self) -> None: """ # fill fields from saved settings - self.settings = self.plg_settings.get_plg_settings() self.load_settings() # initialize QChat API client self.qchat_client = QChatApiClient(self.settings.qchat_instance_uri) # clear rooms combobox items - self.cb_room.clear() # delete all items from comboBox + self.cbb_room.clear() # delete all items from comboBox # load rooms - self.cb_room.addItem(MARKER_VALUE) + self.cbb_room.addItem(MARKER_VALUE) try: rooms = self.qchat_client.get_rooms() for room in rooms: - self.cb_room.addItem(room) + self.cbb_room.addItem(room) except Exception as exc: self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) self.log(message=str(exc), log_level=Qgis.Critical) finally: self.current_room = MARKER_VALUE - self.cb_room.currentIndexChanged.connect(self.on_room_changed) + self.cbb_room.currentIndexChanged.connect(self.on_room_changed) def on_rules_button_clicked(self) -> None: """ @@ -187,7 +184,7 @@ def on_room_changed(self) -> None: Action called when room index is changed in the room combobox """ old_room = self.current_room - new_room = self.cb_room.currentText() + new_room = self.cbb_room.currentText() old_is_marker = old_room != MARKER_VALUE if new_room == MARKER_VALUE: if self.connected: @@ -206,7 +203,7 @@ def on_connect_button_clicked(self) -> None: if self.connected: self.disconnect_from_room() else: - room = self.cb_room.currentText() + room = self.cbb_room.currentText() if room == MARKER_VALUE: return self.connect_to_room(room) @@ -322,8 +319,8 @@ def on_send_button_clicked(self) -> None: """ # retrieve nickname and message - nickname = self.le_nickname.text() - message_text = self.le_message.text() + nickname = self.settings.qchat_nickname + message_text = self.lne_message.text() # check if nickname and message are correctly filled if not nickname or not message_text: @@ -337,8 +334,7 @@ def on_send_button_clicked(self) -> None: # send message to websocket message = {"message": message_text, "author": nickname} self.ws_client.sendTextMessage(json.dumps(message)) - self.le_message.setText("") - self.save_settings() + self.lne_message.setText("") def add_message_to_treeview( self, room: str, message: dict[str, Any] @@ -362,7 +358,7 @@ def on_widget_closed(self) -> None: """ if self.connected: self.disconnect_from_room() - self.cb_room.currentIndexChanged.disconnect() + self.cbb_room.currentIndexChanged.disconnect() def check_cheatcode(self, message: dict[str, str]) -> bool: """ diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 1d522ce3..821f60dc 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -55,24 +55,24 @@ - + Room: - + Status: - + - + Not connected @@ -91,7 +91,7 @@ - + ForbiddenCursor @@ -159,7 +159,7 @@ - + true @@ -240,27 +240,24 @@ User - - + + Nickname: - - - - - + + Message: - - - + + + PointingHandCursor @@ -270,6 +267,19 @@ + + + + ForbiddenCursor + + + Nickname set in QTribu's plugin settings + + + Nickname + + + From 3bf1ed501115fce922bce417c7e8e1810638fc6f Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:12:41 +0200 Subject: [PATCH 042/112] log in msgbar if no nickname set --- qtribu/gui/wdg_authoring.py | 2 +- qtribu/gui/wdg_qchat.py | 35 ++++++++++++++++++++++------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/qtribu/gui/wdg_authoring.py b/qtribu/gui/wdg_authoring.py index 363db56a..faeaedda 100644 --- a/qtribu/gui/wdg_authoring.py +++ b/qtribu/gui/wdg_authoring.py @@ -36,7 +36,7 @@ def load_settings(self) -> dict: settings = self.plg_settings.get_plg_settings() # author - self.ln_qchat_nickname.setText(settings.qchat_nickname) + self.lne_qchat_nickname.setText(settings.qchat_nickname) self.lne_firstname.setText(settings.author_firstname) self.lne_lastname.setText(settings.author_lastname) self.lne_email.setText(settings.author_email) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 914203ed..f916e17b 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -15,6 +15,7 @@ from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget +from qtribu.__about__ import __title__ from qtribu.constants import ( CHEATCODE_10OCLOCK, CHEATCODE_DIZZY, @@ -70,7 +71,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.btn_connect.setIcon(QIcon(QgsApplication.iconPath("mIconConnect.svg"))) # tree widget initialization - self.tw_chat.setHeaderLabels( + self.twg_chat.setHeaderLabels( [ self.tr("Room"), self.tr("Date"), @@ -213,7 +214,7 @@ def connect_to_room(self, room: str, log: bool = True) -> None: Connect widget to a specific room """ if log: - self.tw_chat.insertTopLevelItem( + self.twg_chat.insertTopLevelItem( 0, QTreeWidgetItem( [ @@ -237,7 +238,7 @@ def on_ws_connected(self, room: str) -> None: Action called when websocket is connected to a room """ self.btn_connect.setText(self.tr("Disconnect")) - self.lb_status.setText("Connected") + self.lbl_status.setText("Connected") self.grb_user.setEnabled(True) self.current_room = room self.connected = True @@ -247,7 +248,7 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: Disconnect widget from the current room """ if log: - self.tw_chat.insertTopLevelItem( + self.twg_chat.insertTopLevelItem( 0, QTreeWidgetItem( [ @@ -261,7 +262,7 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: ), ) self.btn_connect.setText(self.tr("Connect")) - self.lb_status.setText("Disconnected") + self.lbl_status.setText("Disconnected") self.grb_user.setEnabled(False) self.connected = False if close_ws: @@ -273,7 +274,7 @@ def on_ws_disconnected(self) -> None: Action called when websocket is disconnected """ self.btn_connect.setText(self.tr("Connect")) - self.lb_status.setText("Disconnected") + self.lbl_status.setText("Disconnected") self.grb_user.setEnabled(False) self.connected = False @@ -299,7 +300,7 @@ def on_ws_message_received(self, message: str) -> None: activated = self.check_cheatcode(message) if activated: return - self.tw_chat.insertTopLevelItem( + self.twg_chat.insertTopLevelItem( 0, self.add_message_to_treeview(self.current_room, message) ) if self.settings.qchat_play_sounds: @@ -322,15 +323,23 @@ def on_send_button_clicked(self) -> None: nickname = self.settings.qchat_nickname message_text = self.lne_message.text() - # check if nickname and message are correctly filled - if not nickname or not message_text: - QMessageBox.warning( - self, - self.tr("Impossible"), - self.tr("Nickname and message boxes must be filled"), + if not nickname: + self.log( + message=self.tr("Nickname not set : please open settings and set it"), + log_level=Qgis.Warning, + push=PlgOptionsManager().get_plg_settings().notify_push_info, + duration=PlgOptionsManager().get_plg_settings().notify_push_duration, + button=True, + button_label=self.tr("Open Settings"), + button_connect=lambda: self.iface.showOptionsDialog( + currentPage=f"mOptionsPage{__title__}" + ), ) return + if not message_text: + return + # send message to websocket message = {"message": message_text, "author": nickname} self.ws_client.sendTextMessage(json.dumps(message)) From 474414a97e3830d4ce0cf46e500b403aa65431be Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:14:11 +0200 Subject: [PATCH 043/112] edit instance rules button icon --- qtribu/gui/dlg_settings.py | 2 +- qtribu/gui/wdg_qchat.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 6ad65fe4..7d3cb3ed 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -62,7 +62,7 @@ def __init__(self, parent=None): self.opt_browser_group.addButton(self.opt_browser_os, 2) self.btn_rules.pressed.connect(self.show_instance_rules) - self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("mIconWarning.svg"))) + self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("processingResult.svg"))) # customization self.btn_help.setIcon(QIcon(QgsApplication.iconPath("mActionHelpContents.svg"))) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index f916e17b..ebb580f6 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -57,7 +57,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): # rules and status signal listener self.btn_rules.pressed.connect(self.on_rules_button_clicked) - self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("mIconWarning.svg"))) + self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("processingResult.svg"))) self.btn_status.pressed.connect(self.on_status_button_clicked) self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) From c415f5b0d4ff0f49319d7157b10a0cb2c4934bd4 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:21:05 +0200 Subject: [PATCH 044/112] add settings button in qchat widget --- qtribu/gui/wdg_qchat.py | 14 +++-- qtribu/gui/wdg_qchat.ui | 113 +++++++++++++++++++++++----------------- 2 files changed, 74 insertions(+), 53 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index ebb580f6..993b79f0 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -61,6 +61,14 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.btn_status.pressed.connect(self.on_status_button_clicked) self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) + # open settings signal listener + self.btn_settings.pressed.connect( + lambda: self.iface.showOptionsDialog(currentPage=f"mOptionsPage{__title__}") + ) + self.btn_settings.setIcon( + QgsApplication.getThemeIcon("console/iconSettingsConsole.svg") + ) + # widget opened / closed signals self.opened.connect(self.on_widget_opened) self.closed.connect(self.on_widget_closed) @@ -105,11 +113,7 @@ def settings(self) -> PlgSettingsStructure: def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" - self.lbl_instance.setText( - self.tr("Instance: {instance}").format( - instance=self.settings.qchat_instance_uri - ) - ) + self.lbl_instance.setText(self.settings.qchat_instance_uri) self.lbl_nickname.setText(self.settings.qchat_nickname) def on_widget_opened(self) -> None: diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 821f60dc..b1233f9d 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -54,55 +54,8 @@ Rooms - - - - Room: - - - - - - - Status: - - - - - - - - - - Not connected - - - - - - - PointingHandCursor - - - Connect - - - - + - - - - ForbiddenCursor - - - Instance set in QTribu's plugin settings - - - Instance: http://gischat.net - - - @@ -126,8 +79,72 @@ + + + + PointingHandCursor + + + Settings + + + + + + + Room: + + + + + + + + + + PointingHandCursor + + + Connect + + + + + + + Status: + + + + + + + Not connected + + + + + + + ForbiddenCursor + + + Instance set in QTribu's plugin settings + + + https://gischat.geotribu.net + + + + + + + Instance: + + + From 4e5ac82d7e1f38472415e04f7e2fdfddb5c2d6a7 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:42:55 +0200 Subject: [PATCH 045/112] colorize messages --- qtribu/gui/wdg_qchat.py | 87 +++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 993b79f0..182470e7 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -12,7 +12,7 @@ from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic from qgis.PyQt.QtCore import QUrl -from qgis.PyQt.QtGui import QIcon +from qgis.PyQt.QtGui import QBrush, QColor, QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget from qtribu.__about__ import __title__ @@ -34,6 +34,11 @@ MARKER_VALUE = "---" DISPLAY_DATE_FORMAT = "%H:%M:%S" +ADMIN_MESSAGES_NICKNAME = "admin" +ADMIN_MESSAGES_COLOR = "#ffa500" +MENTION_MESSAGES_COLOR = "#00cc00" +USER_MESSAGES_COLOR = "#4169e1" + class QChatWidget(QgsDockWidget): @@ -218,17 +223,16 @@ def connect_to_room(self, room: str, log: bool = True) -> None: Connect widget to a specific room """ if log: - self.twg_chat.insertTopLevelItem( - 0, - QTreeWidgetItem( - [ - room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), - self.tr("Admin"), - self.tr("Connected to room '{room}'").format(room=room), - ] - ), + item = QTreeWidgetItem( + [ + room, + datetime.now().strftime(DISPLAY_DATE_FORMAT), + ADMIN_MESSAGES_NICKNAME, + self.tr("Connected to room '{room}'").format(room=room), + ] ) + item.setForeground(0, QBrush(QColor(ADMIN_MESSAGES_COLOR))) + self.twg_chat.insertTopLevelItem(0, item) protocol, domain = self.settings.qchat_instance_uri.split("://") ws_protocol = "wss" if protocol == "https" else "ws" @@ -252,19 +256,18 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: Disconnect widget from the current room """ if log: - self.twg_chat.insertTopLevelItem( - 0, - QTreeWidgetItem( - [ - self.current_room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), - self.tr("Admin"), - self.tr("Disconnected from room '{room}'").format( - room=self.current_room - ), - ] - ), + item = QTreeWidgetItem( + [ + self.current_room, + datetime.now().strftime(DISPLAY_DATE_FORMAT), + ADMIN_MESSAGES_NICKNAME, + self.tr("Disconnected from room '{room}'").format( + room=self.current_room + ), + ] ) + item.setForeground(0, QBrush(QColor(ADMIN_MESSAGES_COLOR))) + self.twg_chat.insertTopLevelItem(0, item) self.btn_connect.setText(self.tr("Connect")) self.lbl_status.setText("Disconnected") self.grb_user.setEnabled(False) @@ -300,13 +303,35 @@ def on_ws_message_received(self, message: str) -> None: Action called when a message is received from the websocket """ message = json.loads(message) + + # check if a cheatcode is activated if self.settings.qchat_activate_cheatcode: activated = self.check_cheatcode(message) if activated: return - self.twg_chat.insertTopLevelItem( - 0, self.add_message_to_treeview(self.current_room, message) - ) + + # check if message mentions current user + if f"@{self.settings.qchat_nickname}" in message["message"]: + item = self.create_message_item( + self.current_room, message, color=MENTION_MESSAGES_COLOR + ) + self.log( + message=self.tr("You were mentionned by {sender}: {message}").format( + sender=message["author"], message=message["message"] + ), + log_level=Qgis.Info, + push=PlgOptionsManager().get_plg_settings().notify_push_info, + duration=PlgOptionsManager().get_plg_settings().notify_push_duration, + ) + elif message["author"] == self.settings.qchat_nickname: + item = self.create_message_item( + self.current_room, message, color=USER_MESSAGES_COLOR + ) + else: + item = self.create_message_item(self.current_room, message) + self.twg_chat.insertTopLevelItem(0, item) + + # check if a notification sound should be played if self.settings.qchat_play_sounds: play_resource_sound( self.settings.qchat_ring_tone, self.settings.qchat_sound_volume @@ -316,7 +341,7 @@ def on_clear_chat_button_clicked(self) -> None: """ Action called when the clear chat button is clicked """ - self.tw_chat.clear() + self.twg_chat.clear() def on_send_button_clicked(self) -> None: """ @@ -349,11 +374,13 @@ def on_send_button_clicked(self) -> None: self.ws_client.sendTextMessage(json.dumps(message)) self.lne_message.setText("") - def add_message_to_treeview( - self, room: str, message: dict[str, Any] + @staticmethod + def create_message_item( + room: str, message: dict[str, Any], color: str = None ) -> QTreeWidgetItem: """ Creates a QTreeWidgetItem from a QChat message dict + Optionally with a color given as hexa string """ item = QTreeWidgetItem( [ @@ -363,6 +390,8 @@ def add_message_to_treeview( message["message"], ] ) + if color: + item.setForeground(0, QBrush(QColor(color))) return item def on_widget_closed(self) -> None: From 8d6b92a723fd6cdcfa83de32cc13c435b12fb386 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 05:52:43 +0200 Subject: [PATCH 046/112] minor UI edits --- qtribu/gui/wdg_qchat.py | 2 +- qtribu/gui/wdg_qchat.ui | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 182470e7..84336d5a 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -179,7 +179,7 @@ def on_status_button_clicked(self) -> None: status=status["status"], rooms_status="\n".join( [ - f"- {r['name']} : {r['nb_connected_users']} user(s)" + f"- {r['name']} : {r['nb_connected_users']} user{'s' if r['nb_connected_users'] > 1 else ''}" for r in status["rooms"] ] ), diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index b1233f9d..772edd1b 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -54,6 +54,26 @@ Rooms + + + + Instance: + + + + + + + ForbiddenCursor + + + Instance set in QTribu's plugin settings + + + https://gischat.geotribu.net + + + @@ -125,26 +145,6 @@ - - - - ForbiddenCursor - - - Instance set in QTribu's plugin settings - - - https://gischat.geotribu.net - - - - - - - Instance: - - - From 1998634207680f52ddcbd28c9069c5c2bc14b1ad Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 06:59:11 +0200 Subject: [PATCH 047/112] set alphanum validator for nickname --- qtribu/gui/wdg_authoring.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/wdg_authoring.py b/qtribu/gui/wdg_authoring.py index faeaedda..f0715848 100644 --- a/qtribu/gui/wdg_authoring.py +++ b/qtribu/gui/wdg_authoring.py @@ -6,7 +6,7 @@ from qgis.PyQt.QtWidgets import QWidget # plugin -from qtribu.gui.gui_commons import QVAL_EMAIL, QVAL_URL +from qtribu.gui.gui_commons import QVAL_ALPHANUM, QVAL_EMAIL, QVAL_URL from qtribu.toolbelt import PlgLogger, PlgOptionsManager @@ -23,6 +23,7 @@ def __init__(self, parent: QWidget = None): uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self) # check inputs + self.lne_qchat_nickname.setValidator(QVAL_ALPHANUM) self.lne_email.setValidator(QVAL_EMAIL) self.lne_github_account.setValidator(QVAL_URL) self.lne_linkedin_account.setValidator(QVAL_URL) From f51c6ab32301e1cae21057ed4d8ed5925ea1a551 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 07:28:19 +0200 Subject: [PATCH 048/112] add cat notif sound --- qtribu/gui/dlg_settings.ui | 5 +++++ qtribu/resources/sounds/cat.ogg | Bin 0 -> 9046 bytes 2 files changed, 5 insertions(+) create mode 100644 qtribu/resources/sounds/cat.ogg diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 89ca9b00..04789d85 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -395,6 +395,11 @@ horn + + + cat + + dog diff --git a/qtribu/resources/sounds/cat.ogg b/qtribu/resources/sounds/cat.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8ded1a8818c23abf60eed414517810475bfdc608 GIT binary patch literal 9046 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 W)cp5E2FeWc<%h|AJOkz%0RI7Q@{AS$ literal 0 HcmV?d00001 From 0b430ebfa20e1fd0ba53f56f18a3efbca1fa18aa Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 07:32:15 +0200 Subject: [PATCH 049/112] check nick length and reload settings afeter showing form --- qtribu/constants.py | 2 ++ qtribu/gui/wdg_qchat.py | 54 ++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index 09648c24..2e7d70ea 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -191,6 +191,8 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path ), ) +QCHAT_NICKNAME_MINLENGTH = 3 + CHEATCODE_DIZZY = "givemesomecheese" CHEATCODE_DONTCRYBABY = "dontcrybaby" CHEATCODE_IAMAROBOT = "iamarobot" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 84336d5a..15955ae4 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -21,6 +21,7 @@ CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, + QCHAT_NICKNAME_MINLENGTH, ) from qtribu.logic.qchat_client import QChatApiClient from qtribu.tasks.dizzy import DizzyTask @@ -38,6 +39,7 @@ ADMIN_MESSAGES_COLOR = "#ffa500" MENTION_MESSAGES_COLOR = "#00cc00" USER_MESSAGES_COLOR = "#4169e1" +ERROR_MESSAGES_COLOR = "#ff0000" class QChatWidget(QgsDockWidget): @@ -67,9 +69,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.btn_status.setIcon(QIcon(QgsApplication.iconPath("mIconInfo.svg"))) # open settings signal listener - self.btn_settings.pressed.connect( - lambda: self.iface.showOptionsDialog(currentPage=f"mOptionsPage{__title__}") - ) + self.btn_settings.pressed.connect(self.on_settings_button_clicked) self.btn_settings.setIcon( QgsApplication.getThemeIcon("console/iconSettingsConsole.svg") ) @@ -186,9 +186,15 @@ def on_status_button_clicked(self) -> None: ) QMessageBox.information(self, self.tr("QChat instance status"), text) except Exception as exc: - self.iface.messageBar().pushCritical(self.tr("QChat error"), str(exc)) self.log(message=str(exc), log_level=Qgis.Critical) + def on_settings_button_clicked(self) -> None: + """ + Action called when clicking on "Settings" button + """ + self.iface.showOptionsDialog(currentPage=f"mOptionsPage{__title__}") + self.load_settings() + def on_room_changed(self) -> None: """ Action called when room index is changed in the room combobox @@ -289,14 +295,22 @@ def on_ws_error(self, error_code: int) -> None: """ Action called when an error appears on the websocket """ - QTreeWidgetItem( - [ - "ERROR", - datetime.now().strftime(DISPLAY_DATE_FORMAT), - self.tr("Admin"), - self.ws_client.errorString(), - ] - ), + item = ( + QTreeWidgetItem( + [ + self.tr("ERROR"), + datetime.now().strftime(DISPLAY_DATE_FORMAT), + ADMIN_MESSAGES_NICKNAME, + self.ws_client.errorString(), + ] + ), + ) + item.setForeground(0, QBrush(QColor(ERROR_MESSAGES_COLOR))) + self.twg_chat.insertTopLevelItem(0, item) + self.log( + message=f"{error_code}: {self.ws_client.errorString()}", + log_level=Qgis.Critical, + ) def on_ws_message_received(self, message: str) -> None: """ @@ -360,9 +374,21 @@ def on_send_button_clicked(self) -> None: duration=PlgOptionsManager().get_plg_settings().notify_push_duration, button=True, button_label=self.tr("Open Settings"), - button_connect=lambda: self.iface.showOptionsDialog( - currentPage=f"mOptionsPage{__title__}" + button_connect=self.on_settings_button_clicked, + ) + return + + if len(nickname) < QCHAT_NICKNAME_MINLENGTH: + self.log( + message=self.tr( + "Nickname too short : must be at least 3 characters. Please open settings and set it" ), + log_level=Qgis.Warning, + push=PlgOptionsManager().get_plg_settings().notify_push_info, + duration=PlgOptionsManager().get_plg_settings().notify_push_duration, + button=True, + button_label=self.tr("Open Settings"), + button_connect=self.on_settings_button_clicked, ) return From 3f093e8111d29a628a3dc665597df0ad9d753cb8 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 07:54:01 +0200 Subject: [PATCH 050/112] refactor way to add messages in chat --- qtribu/constants.py | 7 +++ qtribu/gui/wdg_qchat.py | 114 ++++++++++++++++++++-------------------- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index 2e7d70ea..8485d3ac 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -191,8 +191,15 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path ), ) +# QChat QCHAT_NICKNAME_MINLENGTH = 3 +ADMIN_MESSAGES_NICKNAME = "admin" +ADMIN_MESSAGES_COLOR = "#ffa500" +MENTION_MESSAGES_COLOR = "#00cc00" +USER_MESSAGES_COLOR = "#4169e1" +ERROR_MESSAGES_COLOR = "#ff0000" +# QChat cheatcodes CHEATCODE_DIZZY = "givemesomecheese" CHEATCODE_DONTCRYBABY = "dontcrybaby" CHEATCODE_IAMAROBOT = "iamarobot" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 15955ae4..c1383df7 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -3,7 +3,7 @@ from datetime import datetime from functools import partial from pathlib import Path -from typing import Any, Optional +from typing import Optional # PyQGIS # @@ -17,11 +17,15 @@ from qtribu.__about__ import __title__ from qtribu.constants import ( + ADMIN_MESSAGES_COLOR, + ADMIN_MESSAGES_NICKNAME, CHEATCODE_10OCLOCK, CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, + MENTION_MESSAGES_COLOR, QCHAT_NICKNAME_MINLENGTH, + USER_MESSAGES_COLOR, ) from qtribu.logic.qchat_client import QChatApiClient from qtribu.tasks.dizzy import DizzyTask @@ -35,12 +39,6 @@ MARKER_VALUE = "---" DISPLAY_DATE_FORMAT = "%H:%M:%S" -ADMIN_MESSAGES_NICKNAME = "admin" -ADMIN_MESSAGES_COLOR = "#ffa500" -MENTION_MESSAGES_COLOR = "#00cc00" -USER_MESSAGES_COLOR = "#4169e1" -ERROR_MESSAGES_COLOR = "#ff0000" - class QChatWidget(QgsDockWidget): @@ -229,16 +227,9 @@ def connect_to_room(self, room: str, log: bool = True) -> None: Connect widget to a specific room """ if log: - item = QTreeWidgetItem( - [ - room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), - ADMIN_MESSAGES_NICKNAME, - self.tr("Connected to room '{room}'").format(room=room), - ] + self.add_admin_message( + room, self.tr("Connected to room '{room}'").format(room=room) ) - item.setForeground(0, QBrush(QColor(ADMIN_MESSAGES_COLOR))) - self.twg_chat.insertTopLevelItem(0, item) protocol, domain = self.settings.qchat_instance_uri.split("://") ws_protocol = "wss" if protocol == "https" else "ws" @@ -262,18 +253,12 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: Disconnect widget from the current room """ if log: - item = QTreeWidgetItem( - [ - self.current_room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), - ADMIN_MESSAGES_NICKNAME, - self.tr("Disconnected from room '{room}'").format( - room=self.current_room - ), - ] + self.add_admin_message( + self.current_room, + self.tr("Disconnected from room '{room}'").format( + room=self.current_room + ), ) - item.setForeground(0, QBrush(QColor(ADMIN_MESSAGES_COLOR))) - self.twg_chat.insertTopLevelItem(0, item) self.btn_connect.setText(self.tr("Connect")) self.lbl_status.setText("Disconnected") self.grb_user.setEnabled(False) @@ -295,18 +280,7 @@ def on_ws_error(self, error_code: int) -> None: """ Action called when an error appears on the websocket """ - item = ( - QTreeWidgetItem( - [ - self.tr("ERROR"), - datetime.now().strftime(DISPLAY_DATE_FORMAT), - ADMIN_MESSAGES_NICKNAME, - self.ws_client.errorString(), - ] - ), - ) - item.setForeground(0, QBrush(QColor(ERROR_MESSAGES_COLOR))) - self.twg_chat.insertTopLevelItem(0, item) + self.add_admin_message(self.tr("ERROR"), self.ws_client.errorString()) self.log( message=f"{error_code}: {self.ws_client.errorString()}", log_level=Qgis.Critical, @@ -327,7 +301,10 @@ def on_ws_message_received(self, message: str) -> None: # check if message mentions current user if f"@{self.settings.qchat_nickname}" in message["message"]: item = self.create_message_item( - self.current_room, message, color=MENTION_MESSAGES_COLOR + self.current_room, + message["author"], + message["message"], + foreground_color=MENTION_MESSAGES_COLOR, ) self.log( message=self.tr("You were mentionned by {sender}: {message}").format( @@ -339,10 +316,15 @@ def on_ws_message_received(self, message: str) -> None: ) elif message["author"] == self.settings.qchat_nickname: item = self.create_message_item( - self.current_room, message, color=USER_MESSAGES_COLOR + self.current_room, + message["author"], + message["message"], + foreground_color=USER_MESSAGES_COLOR, ) else: - item = self.create_message_item(self.current_room, message) + item = self.create_message_item( + self.current_room, message["author"], message["message"] + ) self.twg_chat.insertTopLevelItem(0, item) # check if a notification sound should be played @@ -400,24 +382,44 @@ def on_send_button_clicked(self) -> None: self.ws_client.sendTextMessage(json.dumps(message)) self.lne_message.setText("") + def add_admin_message(self, room: str, message: str) -> None: + """ + Adds an admin message to QTreeWidget chat + """ + item = self.create_message_item( + room, + ADMIN_MESSAGES_NICKNAME, + message, + foreground_color=ADMIN_MESSAGES_COLOR, + ) + self.twg_chat.insertTopLevelItem(0, item) + @staticmethod def create_message_item( - room: str, message: dict[str, Any], color: str = None + room: str, + author: str, + message: str, + dt: datetime = datetime.now(), + foreground_color: str = None, + background_color: str = None, ) -> QTreeWidgetItem: """ - Creates a QTreeWidgetItem from a QChat message dict - Optionally with a color given as hexa string - """ - item = QTreeWidgetItem( - [ - room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), - message["author"], - message["message"], - ] - ) - if color: - item.setForeground(0, QBrush(QColor(color))) + Creates a QTreeWidgetItem for adding to QTreeWidget chat + Optionally with foreground / background colors given as hexa string + """ + item_data = [ + room, + dt.strftime(DISPLAY_DATE_FORMAT), + author, + message, + ] + item = QTreeWidgetItem(item_data) + if foreground_color: + for i in range(len(item_data)): + item.setForeground(i, QBrush(QColor(foreground_color))) + if background_color: + for i in range(len(item_data)): + item.setBackground(i, QBrush(QColor(background_color))) return item def on_widget_closed(self) -> None: From 62f24f7eced3382e9d701071348ea34994d75073 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 08:08:48 +0200 Subject: [PATCH 051/112] refactor utils sound functions to common file --- qtribu/gui/dlg_settings.py | 3 +-- qtribu/gui/wdg_qchat.py | 2 +- qtribu/toolbelt/commons.py | 33 +++++++++++++++++++++++++++++++++ qtribu/utils.py | 32 -------------------------------- 4 files changed, 35 insertions(+), 35 deletions(-) delete mode 100644 qtribu/utils.py diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 7d3cb3ed..3fffcd70 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -25,9 +25,8 @@ ) from qtribu.logic.qchat_client import QChatApiClient from qtribu.toolbelt import PlgLogger, PlgOptionsManager -from qtribu.toolbelt.commons import open_url_in_browser +from qtribu.toolbelt.commons import open_url_in_browser, play_resource_sound from qtribu.toolbelt.preferences import PlgSettingsStructure -from qtribu.utils import play_resource_sound # ############################################################################ # ########## Globals ############### diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index c1383df7..413763f6 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -32,8 +32,8 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager +from qtribu.toolbelt.commons import play_resource_sound from qtribu.toolbelt.preferences import PlgSettingsStructure -from qtribu.utils import play_resource_sound # -- GLOBALS -- MARKER_VALUE = "---" diff --git a/qtribu/toolbelt/commons.py b/qtribu/toolbelt/commons.py index a9d1b2cf..df3beca2 100644 --- a/qtribu/toolbelt/commons.py +++ b/qtribu/toolbelt/commons.py @@ -46,3 +46,36 @@ def open_url_in_webviewer(url: str, window_title: str) -> None: web_viewer.display_web_page(url) if web_viewer.wdg_web: web_viewer.set_window_title(window_title) + + +import os + +from PyQt5 import QtMultimedia # noqa QGS103 +from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer, QSound # noqa QGS103 + +from qtribu.__about__ import DIR_PLUGIN_ROOT + + +def play_resource_sound(resource: str, volume: int) -> None: + """ + Play a sound inside QGIS + The file_name param must be the name (without extension) of a .ogg audio file inside resources/sounds folder + """ + file_path = str(DIR_PLUGIN_ROOT / f"resources/sounds/{resource}.ogg") + if not os.path.exists(file_path): + raise FileNotFoundError( + f"File '{resource}.wav' not found in resources/sounds folder" + ) + play_sound(file_path, volume) + + +def play_sound(file: str, volume: int) -> None: + """ + Play a sound using QtMultimedia QMediaPlayer + """ + url = QUrl.fromLocalFile(file) + player = QMediaPlayer() + player.setMedia(QMediaContent(url)) + player.setVolume(volume) + player.audioAvailableChanged.connect(lambda: player.play()) + player.play() diff --git a/qtribu/utils.py b/qtribu/utils.py deleted file mode 100644 index 00777b1a..00000000 --- a/qtribu/utils.py +++ /dev/null @@ -1,32 +0,0 @@ -import os - -from PyQt5 import QtMultimedia # noqa QGS103 -from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer, QSound # noqa QGS103 -from qgis.PyQt.QtCore import QUrl - -from qtribu.__about__ import DIR_PLUGIN_ROOT - - -def play_resource_sound(resource: str, volume: int) -> None: - """ - Play a sound inside QGIS - The file_name param must be the name (without extension) of a .ogg audio file inside resources/sounds folder - """ - file_path = str(DIR_PLUGIN_ROOT / f"resources/sounds/{resource}.ogg") - if not os.path.exists(file_path): - raise FileNotFoundError( - f"File '{resource}.wav' not found in resources/sounds folder" - ) - play_sound(file_path, volume) - - -def play_sound(file: str, volume: int) -> None: - """ - Play a sound using QtMultimedia QMediaPlayer - """ - url = QUrl.fromLocalFile(file) - player = QMediaPlayer() - player.setMedia(QMediaContent(url)) - player.setVolume(volume) - player.audioAvailableChanged.connect(lambda: player.play()) - player.play() From dc56aa65cf638490db1846b98d473a54792c15fa Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 08:11:19 +0200 Subject: [PATCH 052/112] load settings beep sound --- qtribu/gui/dlg_settings.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 3fffcd70..07817a0c 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -12,6 +12,7 @@ from qgis.core import QgsApplication from qgis.gui import QgsOptionsPageWidget, QgsOptionsWidgetFactory from qgis.PyQt import uic +from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QButtonGroup, QMessageBox @@ -140,8 +141,11 @@ def load_settings(self) -> dict: self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) self.hsl_sound_volume.setValue(settings.qchat_sound_volume) - # TODO: load and select item from settings - # self.cbb_ring_tone.setItemText(settings.qchat_ring_tone) + beep_index = self.cbb_ring_tone.findText( + settings.qchat_ring_tone, Qt.MatchFixedString + ) + if beep_index >= 0: + self.cbb_ring_tone.setCurrentIndex(beep_index) # misc self.opt_debug.setChecked(settings.debug_mode) From 1dd3debc1f0bb97746f3cbe4ca1e900f93539ebe Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 08:14:52 +0200 Subject: [PATCH 053/112] crop beep 7 sound --- qtribu/resources/sounds/beep_7.ogg | Bin 19968 -> 27365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/qtribu/resources/sounds/beep_7.ogg b/qtribu/resources/sounds/beep_7.ogg index 08a567e96d958f63dd52e57afd79f230608740e1..bc276003c2722b1b15672708420f040351741935 100644 GIT binary patch literal 27365 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 literal 19968 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 From 9098c5f059284d360bf03abebf5e9fc7a8d1490b Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 08:16:36 +0200 Subject: [PATCH 054/112] swap mention and user messages colors --- qtribu/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index 8485d3ac..3ffd8f3b 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -195,8 +195,8 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path QCHAT_NICKNAME_MINLENGTH = 3 ADMIN_MESSAGES_NICKNAME = "admin" ADMIN_MESSAGES_COLOR = "#ffa500" -MENTION_MESSAGES_COLOR = "#00cc00" -USER_MESSAGES_COLOR = "#4169e1" +MENTION_MESSAGES_COLOR = "#4169e1" +USER_MESSAGES_COLOR = "#00cc00" ERROR_MESSAGES_COLOR = "#ff0000" # QChat cheatcodes From bd65c5f34dbb65f011a6885d52dd4eb2acb5c820 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 09:06:10 +0200 Subject: [PATCH 055/112] add internal message handling --- qtribu/constants.py | 1 + qtribu/gui/wdg_qchat.py | 30 ++++++++++++++++++++++++++++-- qtribu/gui/wdg_qchat.ui | 6 +++--- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index 3ffd8f3b..bd008005 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -198,6 +198,7 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path MENTION_MESSAGES_COLOR = "#4169e1" USER_MESSAGES_COLOR = "#00cc00" ERROR_MESSAGES_COLOR = "#ff0000" +INTERNAL_MESSAGE_AUTHOR = "internal" # QChat cheatcodes CHEATCODE_DIZZY = "givemesomecheese" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 413763f6..1cea77d6 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -3,7 +3,7 @@ from datetime import datetime from functools import partial from pathlib import Path -from typing import Optional +from typing import Any, Optional # PyQGIS # @@ -23,6 +23,7 @@ CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, + INTERNAL_MESSAGE_AUTHOR, MENTION_MESSAGES_COLOR, QCHAT_NICKNAME_MINLENGTH, USER_MESSAGES_COLOR, @@ -261,6 +262,7 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: ) self.btn_connect.setText(self.tr("Connect")) self.lbl_status.setText("Disconnected") + self.grb_qchat.setTitle(self.tr("QChat")) self.grb_user.setEnabled(False) self.connected = False if close_ws: @@ -273,6 +275,7 @@ def on_ws_disconnected(self) -> None: """ self.btn_connect.setText(self.tr("Connect")) self.lbl_status.setText("Disconnected") + self.grb_qchat.setTitle(self.tr("QChat")) self.grb_user.setEnabled(False) self.connected = False @@ -292,6 +295,11 @@ def on_ws_message_received(self, message: str) -> None: """ message = json.loads(message) + # check if this is an internal message + if message["author"] == INTERNAL_MESSAGE_AUTHOR: + self.handle_internal_message(message) + return + # check if a cheatcode is activated if self.settings.qchat_activate_cheatcode: activated = self.check_cheatcode(message) @@ -328,11 +336,29 @@ def on_ws_message_received(self, message: str) -> None: self.twg_chat.insertTopLevelItem(0, item) # check if a notification sound should be played - if self.settings.qchat_play_sounds: + if ( + self.settings.qchat_play_sounds + and message["author"] != self.settings.qchat_nickname + ): play_resource_sound( self.settings.qchat_ring_tone, self.settings.qchat_sound_volume ) + def handle_internal_message(self, message: dict[str, Any]) -> None: + """ + Handle an internal message, spotted by its author + """ + payload = json.loads(message["message"]) + if "nb_users" in payload: + nb_users = payload["nb_users"] + self.grb_qchat.setTitle( + self.tr("QChat - room: {room} - {nb_users} user{suffix}").format( + room=self.current_room, + nb_users=nb_users, + suffix="" if nb_users <= 1 else "s", + ) + ) + def on_clear_chat_button_clicked(self) -> None: """ Action called when the clear chat button is clicked diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 772edd1b..2a818f71 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -149,7 +149,7 @@ - + 0 @@ -169,7 +169,7 @@ - Chat + QChat false @@ -313,7 +313,7 @@ grb_rooms - grb_chat + grb_qchat grb_user From a1f86152635bd1f2825e34075a4fa2c3975b34de Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 09:23:43 +0200 Subject: [PATCH 056/112] change internal messages data model --- qtribu/gui/wdg_qchat.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 1cea77d6..e2087528 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -348,9 +348,8 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: """ Handle an internal message, spotted by its author """ - payload = json.loads(message["message"]) - if "nb_users" in payload: - nb_users = payload["nb_users"] + if "nb_users" in message: + nb_users = message["nb_users"] self.grb_qchat.setTitle( self.tr("QChat - room: {room} - {nb_users} user{suffix}").format( room=self.current_room, From f53fc6d565b1575e3222aa93aff60e07db77875f Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 09:40:06 +0200 Subject: [PATCH 057/112] fix datetime display --- qtribu/gui/wdg_qchat.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index e2087528..2c23b4b0 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -424,7 +424,6 @@ def create_message_item( room: str, author: str, message: str, - dt: datetime = datetime.now(), foreground_color: str = None, background_color: str = None, ) -> QTreeWidgetItem: @@ -434,7 +433,7 @@ def create_message_item( """ item_data = [ room, - dt.strftime(DISPLAY_DATE_FORMAT), + datetime.now().strftime(DISPLAY_DATE_FORMAT), author, message, ] From e8f7e620c95b0859dbf9ec61243cf9963b8e6f7e Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 10:28:56 +0200 Subject: [PATCH 058/112] print current time using QTime object --- qtribu/gui/wdg_qchat.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 2c23b4b0..3355932e 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -1,6 +1,5 @@ # standard import json -from datetime import datetime from functools import partial from pathlib import Path from typing import Any, Optional @@ -11,7 +10,7 @@ from qgis.core import Qgis, QgsApplication from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic -from qgis.PyQt.QtCore import QUrl +from qgis.PyQt.QtCore import QTime, QUrl from qgis.PyQt.QtGui import QBrush, QColor, QIcon from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget @@ -433,7 +432,7 @@ def create_message_item( """ item_data = [ room, - datetime.now().strftime(DISPLAY_DATE_FORMAT), + QTime.currentTime().toString(), author, message, ] From 9439ba5f37245f97b5353c44bf6ff2c301de3339 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 10:33:20 +0200 Subject: [PATCH 059/112] disconnect websocket if settings change --- qtribu/gui/wdg_qchat.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 3355932e..d740a3f3 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -190,7 +190,20 @@ def on_settings_button_clicked(self) -> None: """ Action called when clicking on "Settings" button """ + # save current instance and nickname to check afterwards if they have changed + old_instance = self.settings.qchat_instance_uri + old_nickname = self.settings.qchat_nickname self.iface.showOptionsDialog(currentPage=f"mOptionsPage{__title__}") + + # get new instance and nickname settings + new_instance = self.settings.qchat_instance_uri + new_nickname = self.settings.qchat_nickname + + # disconnect if instance or nickname have changed + if old_instance != new_instance or old_nickname != new_nickname: + self.disconnect_from_room(log=self.connected, close_ws=self.connected) + + # reload settings self.load_settings() def on_room_changed(self) -> None: From cd784851e1ed6c900f17f49d0609682157bebd35 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 10:40:38 +0200 Subject: [PATCH 060/112] create new room groupbox --- qtribu/gui/wdg_qchat.ui | 67 ++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 2a818f71..74e118de 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -43,7 +43,7 @@ 10 - + 0 @@ -51,13 +51,13 @@ - Rooms + Instance - + - + - Instance: + URI: @@ -111,34 +111,59 @@ - + + + + + + + + 0 + 0 + + + + Room + + + Room: - - - - - - - PointingHandCursor - - - Connect - - + + + + + + + + + + 0 + 0 + + + + PointingHandCursor + + + Connect + + + + - + Status: - + Not connected @@ -312,7 +337,7 @@ - grb_rooms + grb_instance grb_qchat grb_user From d88403f58838c5c44e0165ac7c71b00956e88d95 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 10:56:10 +0200 Subject: [PATCH 061/112] nicer UI updates --- qtribu/gui/dlg_settings.py | 6 ++++-- qtribu/gui/dlg_settings.ui | 2 +- qtribu/gui/wdg_qchat.py | 13 ++++++------- qtribu/gui/wdg_qchat.ui | 40 ++++++++++---------------------------- 4 files changed, 21 insertions(+), 40 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 07817a0c..613cc0a3 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -24,6 +24,7 @@ __uri_tracker__, __version__, ) +from qtribu.gui.gui_commons import QVAL_URL from qtribu.logic.qchat_client import QChatApiClient from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.commons import open_url_in_browser, play_resource_sound @@ -61,6 +62,7 @@ def __init__(self, parent=None): self.opt_browser_group.addButton(self.opt_browser_qt, 1) self.opt_browser_group.addButton(self.opt_browser_os, 2) + self.lne_qchat_instance_uri.setValidator(QVAL_URL) self.btn_rules.pressed.connect(self.show_instance_rules) self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("processingResult.svg"))) @@ -103,7 +105,7 @@ def apply(self): settings.license_global_accept = self.chb_license_global_accept.isChecked() # qchat - settings.qchat_instance_uri = self.le_qchat_instance_uri.text() + settings.qchat_instance_uri = self.lne_qchat_instance_uri.text() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() settings.qchat_sound_volume = self.hsl_sound_volume.value() @@ -137,7 +139,7 @@ def load_settings(self) -> dict: self.chb_license_global_accept.setChecked(settings.license_global_accept) # qchat - self.le_qchat_instance_uri.setText(settings.qchat_instance_uri) + self.lne_qchat_instance_uri.setText(settings.qchat_instance_uri) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) self.hsl_sound_volume.setValue(settings.qchat_sound_volume) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 04789d85..40c9a418 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -314,7 +314,7 @@ - + diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index d740a3f3..ad408528 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -116,7 +116,9 @@ def settings(self) -> PlgSettingsStructure: def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" - self.lbl_instance.setText(self.settings.qchat_instance_uri) + self.grb_instance.setTitle( + self.tr("Instance: {uri}").format(uri=self.settings.qchat_instance_uri) + ) self.lbl_nickname.setText(self.settings.qchat_nickname) def on_widget_opened(self) -> None: @@ -257,6 +259,7 @@ def on_ws_connected(self, room: str) -> None: """ self.btn_connect.setText(self.tr("Disconnect")) self.lbl_status.setText("Connected") + self.grb_room.setTitle(self.tr("Room: {room}").format(room=room)) self.grb_user.setEnabled(True) self.current_room = room self.connected = True @@ -274,6 +277,7 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: ) self.btn_connect.setText(self.tr("Connect")) self.lbl_status.setText("Disconnected") + self.grb_room.setTitle(self.tr("Room")) self.grb_qchat.setTitle(self.tr("QChat")) self.grb_user.setEnabled(False) self.connected = False @@ -285,10 +289,6 @@ def on_ws_disconnected(self) -> None: """ Action called when websocket is disconnected """ - self.btn_connect.setText(self.tr("Connect")) - self.lbl_status.setText("Disconnected") - self.grb_qchat.setTitle(self.tr("QChat")) - self.grb_user.setEnabled(False) self.connected = False def on_ws_error(self, error_code: int) -> None: @@ -363,8 +363,7 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: if "nb_users" in message: nb_users = message["nb_users"] self.grb_qchat.setTitle( - self.tr("QChat - room: {room} - {nb_users} user{suffix}").format( - room=self.current_room, + self.tr("QChat - {nb_users} user{suffix}").format( nb_users=nb_users, suffix="" if nb_users <= 1 else "s", ) diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/wdg_qchat.ui index 74e118de..6ee08f71 100644 --- a/qtribu/gui/wdg_qchat.ui +++ b/qtribu/gui/wdg_qchat.ui @@ -54,27 +54,7 @@ Instance - - - - URI: - - - - - - ForbiddenCursor - - - Instance set in QTribu's plugin settings - - - https://gischat.geotribu.net - - - - @@ -99,16 +79,6 @@ - - - - PointingHandCursor - - - Settings - - - @@ -325,6 +295,16 @@ + + + + PointingHandCursor + + + Settings + + + From 2dd38f147b4fa15cd9be87742e253cc550497894 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 13:35:36 +0200 Subject: [PATCH 062/112] add arcgis cheatcode --- qtribu/constants.py | 1 + qtribu/gui/wdg_qchat.py | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/qtribu/constants.py b/qtribu/constants.py index bd008005..bd5bf2bc 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -205,3 +205,4 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path CHEATCODE_DONTCRYBABY = "dontcrybaby" CHEATCODE_IAMAROBOT = "iamarobot" CHEATCODE_10OCLOCK = "its10oclock" +CHEATCODE_ARCGIS_MONEY_MONEY = "arcgismoneymoney" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index ad408528..750f74f5 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -19,6 +19,7 @@ ADMIN_MESSAGES_COLOR, ADMIN_MESSAGES_NICKNAME, CHEATCODE_10OCLOCK, + CHEATCODE_ARCGIS_MONEY_MONEY, CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, @@ -479,6 +480,18 @@ def check_cheatcode(self, message: dict[str, str]) -> bool: self.task_manager.addTask(task) return True + # mimic the behaviour of ArcGIS Pro + if msg == CHEATCODE_ARCGIS_MONEY_MONEY: + text = self.tr( + "Your account is not licensed for QGIS Pro. " + "Please ask your organization administrator to assign you a user type " + "that is compatible with QGIS Pro (e.g. Creator) along with an add-on " + "QGIS Pro license, or a user type that includes QGIS Pro " + "(e.g. GIS Professional)." + ) + QMessageBox.critical(self, self.tr("QGIS Pro"), text, QMessageBox.Ok) + return True + # play sounds if self.settings.qchat_play_sounds: if msg in [CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_10OCLOCK]: From e7f09e47d393eb927abdc171e730af32f117845e Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 13:41:14 +0200 Subject: [PATCH 063/112] remove arcgis cheatcode --- qtribu/constants.py | 1 - qtribu/gui/wdg_qchat.py | 13 ------------- 2 files changed, 14 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index bd5bf2bc..bd008005 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -205,4 +205,3 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path CHEATCODE_DONTCRYBABY = "dontcrybaby" CHEATCODE_IAMAROBOT = "iamarobot" CHEATCODE_10OCLOCK = "its10oclock" -CHEATCODE_ARCGIS_MONEY_MONEY = "arcgismoneymoney" diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/wdg_qchat.py index 750f74f5..ad408528 100644 --- a/qtribu/gui/wdg_qchat.py +++ b/qtribu/gui/wdg_qchat.py @@ -19,7 +19,6 @@ ADMIN_MESSAGES_COLOR, ADMIN_MESSAGES_NICKNAME, CHEATCODE_10OCLOCK, - CHEATCODE_ARCGIS_MONEY_MONEY, CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, @@ -480,18 +479,6 @@ def check_cheatcode(self, message: dict[str, str]) -> bool: self.task_manager.addTask(task) return True - # mimic the behaviour of ArcGIS Pro - if msg == CHEATCODE_ARCGIS_MONEY_MONEY: - text = self.tr( - "Your account is not licensed for QGIS Pro. " - "Please ask your organization administrator to assign you a user type " - "that is compatible with QGIS Pro (e.g. Creator) along with an add-on " - "QGIS Pro license, or a user type that includes QGIS Pro " - "(e.g. GIS Professional)." - ) - QMessageBox.critical(self, self.tr("QGIS Pro"), text, QMessageBox.Ok) - return True - # play sounds if self.settings.qchat_play_sounds: if msg in [CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_10OCLOCK]: From 4d39b87193f3f7cb84648a182e737dc6dd065d4c Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 14:43:54 +0200 Subject: [PATCH 064/112] improve(gischat): handle case where external dependencies are not installed --- qtribu/plugin_main.py | 52 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index 55c9e743..b7a73a04 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -11,8 +11,8 @@ # PyQGIS from qgis.core import Qgis, QgsApplication, QgsSettings from qgis.gui import QgisInterface -from qgis.PyQt.QtCore import QCoreApplication, QLocale, Qt, QTranslator -from qgis.PyQt.QtGui import QIcon +from qgis.PyQt.QtCore import QCoreApplication, QLocale, Qt, QTranslator, QUrl +from qgis.PyQt.QtGui import QDesktopServices, QIcon from qgis.PyQt.QtWidgets import QAction # project @@ -28,6 +28,15 @@ from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.commons import open_url_in_browser, open_url_in_webviewer +# conditional imports +try: + from qtribu.gui.wdg_qchat import QChatWidget + + EXTERNAL_DEPENDENCIES_AVAILABLE: bool = True +except ImportError: + EXTERNAL_DEPENDENCIES_AVAILABLE: bool = False + + # ############################################################################ # ########## Classes ############### # ################################## @@ -216,6 +225,9 @@ def initGui(self): ) self.iface.initializationCompleted.connect(self.post_ui_init) + if not self.check_dependencies(): + return + def unload(self): """Cleans up when plugin is disabled/uninstalled.""" # -- Clean up menu @@ -308,6 +320,42 @@ def on_show_latest_content(self): ) raise err + def check_dependencies(self) -> bool: + """Check if all dependencies are satisfied. If not, warn the user and disable plugin. + + :return: dependencies status + :rtype: bool + """ + # if import failed + if not EXTERNAL_DEPENDENCIES_AVAILABLE: + self.log( + message=self.tr( + "Error importing some of dependencies. " + "Related functions have been disabled." + ), + log_level=2, + push=True, + duration=60, + button=True, + button_connect=partial( + QDesktopServices.openUrl, + QUrl(f"{__uri_homepage__}installation.html"), + ), + ) + # disable plugin widgets + self.action_open_chat.setEnabled(False) + + # add tooltip over menu + msg_disable = self.tr( + "Plugin disabled. Please install all dependencies and then restart QGIS." + " Refer to the documentation for more information." + ) + self.action_open_chat.setToolTip(msg_disable) + return False + else: + self.log(message=self.tr("Dependencies satisfied"), log_level=3) + return True + def open_contents(self) -> None: """Action to open contents dialog""" if not self.form_contents: From 80c12fcea5c386ecf0f914a67bf4f516a8560823 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 14:46:27 +0200 Subject: [PATCH 065/112] fix(gischat): remove action chat when plugin is unloaded --- qtribu/plugin_main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index b7a73a04..f81f9326 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -235,6 +235,7 @@ def unload(self): self.iface.removePluginWebMenu(__title__, self.action_form_article) self.iface.removePluginWebMenu(__title__, self.action_form_rdp_news) self.iface.removePluginWebMenu(__title__, self.action_show_latest_content) + self.iface.removePluginWebMenu(__title__, self.action_open_chat) self.iface.removePluginWebMenu(__title__, self.action_contents) self.iface.removePluginWebMenu(__title__, self.action_settings) self.iface.removePluginWebMenu(__title__, self.action_splash) @@ -252,6 +253,7 @@ def unload(self): # remove actions del self.action_help del self.action_georezo + del self.action_open_chat def post_ui_init(self): """Run after plugin's UI has been initialized. From 6efb9438318f97d654cce0da2cc0214ba40acbba Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 14:56:21 +0200 Subject: [PATCH 066/112] improve(docs): add how to install dependencies --- docs/installation.md | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index c6475c75..443c139b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,19 +1,41 @@ # Installation -## Depuis le projet Github +## Dépendances + +Certaines fonctionnalités du plugin reposent sur des dépendances logicielles tierces non incluses dans le packaging de QGIS sur certaines plateformes : + +- QGISChat: QtWebSockets + +### Linux + +> Par exemple sur Ubuntu 22.04. Adapter à votre distribution. + +Ouvrir un terminal et exécuter la commande suivante : + +```sh +sudo apt install python3-pyqt5.qtwebsockets +``` + +---- + +## Version stable (recommandée) + +Le plugin est publié sur le dépôt officiel des extensions de QGIS : . + +## Version stable depuis le projet Github (alternative) En plus d'être publié dans le dépôt officiel de plugins de QGIS, QTribu est également disponible via son propre dépôt personnalisé. Dans QGIS : 1. Menu `Extensions` > `Installer/Gérer des extensions` 2. Onglet `Paramètres` 3. Sous la liste des dépôts, cliquer sur `Ajouter...` et renseigner : - * Nom : + - Nom : ```txt Dépôt personnalisé du plugin QTribu ``` - * URL : + - URL : ```html https://github.com/geotribu/qtribu/releases/latest/download/plugins.xml @@ -35,10 +57,10 @@ Selon votre configuration, redémarrer QGIS peut être nécessaire, le gestionna Une fois installé, le plugin s'intègre : -* dans le menu `Internet` : +- dans le menu `Internet` : ![Menu QTribu](https://cdn.geotribu.fr/img/projets-geotribu/plugin_qtribu/qtribu_menu_plugin.png "Menu QTribu") -* dans la barre d'outils sous forme d'une simple icône : +- dans la barre d'outils : ![Toolbar QTribu](https://cdn.geotribu.fr/img/projets-geotribu/plugin_qtribu/qtribu_toolbar.png "Toolbar QTribu") From cf03fc213b10608ce43eb060014a619f6816981d Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 14:59:30 +0200 Subject: [PATCH 067/112] refacto: change prefix to fit UI class --- qtribu/gui/{wdg_qchat.py => dck_qchat.py} | 0 qtribu/gui/{wdg_qchat.ui => dck_qchat.ui} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename qtribu/gui/{wdg_qchat.py => dck_qchat.py} (100%) rename qtribu/gui/{wdg_qchat.ui => dck_qchat.ui} (100%) diff --git a/qtribu/gui/wdg_qchat.py b/qtribu/gui/dck_qchat.py similarity index 100% rename from qtribu/gui/wdg_qchat.py rename to qtribu/gui/dck_qchat.py diff --git a/qtribu/gui/wdg_qchat.ui b/qtribu/gui/dck_qchat.ui similarity index 100% rename from qtribu/gui/wdg_qchat.ui rename to qtribu/gui/dck_qchat.ui From 17588d2d7af0d2293a84e8aa6b5a480a056fc4a2 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 14:59:47 +0200 Subject: [PATCH 068/112] refacto: change prefix to fit UI class --- qtribu/plugin_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index f81f9326..bf6f81ce 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -30,7 +30,7 @@ # conditional imports try: - from qtribu.gui.wdg_qchat import QChatWidget + from qtribu.gui.dck_qchat import QChatWidget EXTERNAL_DEPENDENCIES_AVAILABLE: bool = True except ImportError: From 0fbc2b758c40a5af75d8a58d34d53fd6e0aa404e Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 15:04:03 +0200 Subject: [PATCH 069/112] refacto: rename into nickname to make it generic --- qtribu/gui/dck_qchat.py | 14 +++++++------- qtribu/gui/wdg_authoring.py | 4 ++-- qtribu/toolbelt/preferences.py | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index ad408528..c823b148 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -119,7 +119,7 @@ def load_settings(self) -> None: self.grb_instance.setTitle( self.tr("Instance: {uri}").format(uri=self.settings.qchat_instance_uri) ) - self.lbl_nickname.setText(self.settings.qchat_nickname) + self.lbl_nickname.setText(self.settings.author_nickname) def on_widget_opened(self) -> None: """ @@ -194,12 +194,12 @@ def on_settings_button_clicked(self) -> None: """ # save current instance and nickname to check afterwards if they have changed old_instance = self.settings.qchat_instance_uri - old_nickname = self.settings.qchat_nickname + old_nickname = self.settings.author_nickname self.iface.showOptionsDialog(currentPage=f"mOptionsPage{__title__}") # get new instance and nickname settings new_instance = self.settings.qchat_instance_uri - new_nickname = self.settings.qchat_nickname + new_nickname = self.settings.author_nickname # disconnect if instance or nickname have changed if old_instance != new_instance or old_nickname != new_nickname: @@ -319,7 +319,7 @@ def on_ws_message_received(self, message: str) -> None: return # check if message mentions current user - if f"@{self.settings.qchat_nickname}" in message["message"]: + if f"@{self.settings.author_nickname}" in message["message"]: item = self.create_message_item( self.current_room, message["author"], @@ -334,7 +334,7 @@ def on_ws_message_received(self, message: str) -> None: push=PlgOptionsManager().get_plg_settings().notify_push_info, duration=PlgOptionsManager().get_plg_settings().notify_push_duration, ) - elif message["author"] == self.settings.qchat_nickname: + elif message["author"] == self.settings.author_nickname: item = self.create_message_item( self.current_room, message["author"], @@ -350,7 +350,7 @@ def on_ws_message_received(self, message: str) -> None: # check if a notification sound should be played if ( self.settings.qchat_play_sounds - and message["author"] != self.settings.qchat_nickname + and message["author"] != self.settings.author_nickname ): play_resource_sound( self.settings.qchat_ring_tone, self.settings.qchat_sound_volume @@ -381,7 +381,7 @@ def on_send_button_clicked(self) -> None: """ # retrieve nickname and message - nickname = self.settings.qchat_nickname + nickname = self.settings.author_nickname message_text = self.lne_message.text() if not nickname: diff --git a/qtribu/gui/wdg_authoring.py b/qtribu/gui/wdg_authoring.py index f0715848..68b6f3e5 100644 --- a/qtribu/gui/wdg_authoring.py +++ b/qtribu/gui/wdg_authoring.py @@ -37,7 +37,7 @@ def load_settings(self) -> dict: settings = self.plg_settings.get_plg_settings() # author - self.lne_qchat_nickname.setText(settings.qchat_nickname) + self.lne_qchat_nickname.setText(settings.author_nickname) self.lne_firstname.setText(settings.author_firstname) self.lne_lastname.setText(settings.author_lastname) self.lne_email.setText(settings.author_email) @@ -52,7 +52,7 @@ def save_settings(self) -> None: settings = self.plg_settings.get_plg_settings() # store user inputs - settings.qchat_nickname = self.lne_qchat_nickname.text() + settings.author_nickname = self.lne_qchat_nickname.text() settings.author_firstname = self.lne_firstname.text() settings.author_lastname = self.lne_lastname.text() settings.author_email = self.lne_email.text() diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 8c9cc9ec..06bed692 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -38,7 +38,6 @@ class PlgSettingsStructure: # QChat qchat_instance_uri: str = "https://gischat.geotribu.net" - qchat_nickname: str = "J.D." qchat_activate_cheatcode: bool = True qchat_play_sounds: bool = True qchat_sound_volume: int = 33 @@ -59,6 +58,7 @@ class PlgSettingsStructure: ) # authoring + author_nickname: str = "" author_firstname: str = "" author_lastname: str = "" author_email: str = "" From 00de59ee8c4b97f457c14e16747f5b0137d2a2ca Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 15:05:04 +0200 Subject: [PATCH 070/112] fix: unreacheable var (HS) --- qtribu/toolbelt/preferences.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 06bed692..22accfc8 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -69,7 +69,7 @@ class PlgSettingsStructure: @property def browser_as_str(self) -> str: - """Returns mathcing browser value name from its code. + """Returns matching browser value name from its code. :return: browser value name :rtype: str @@ -80,7 +80,7 @@ def browser_as_str(self) -> str: return "system" else: log_hdlr.PlgLogger.log( - message=f"Invalid browser code: {self.impex_access_mode}", log_level=1 + message=f"Invalid browser code: {self.browser}", log_level=1 ) return "qgis" From 592cc0dcfd49cf00cfcf3260e53ed47f3e601aae Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:16:48 +0200 Subject: [PATCH 071/112] add gis license expired cheatcode --- qtribu/constants.py | 1 + qtribu/gui/dck_qchat.py | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index bd008005..cf67c6c0 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -205,3 +205,4 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path CHEATCODE_DONTCRYBABY = "dontcrybaby" CHEATCODE_IAMAROBOT = "iamarobot" CHEATCODE_10OCLOCK = "its10oclock" +CHEATCODE_QGIS_PRO_LICENSE = "qgisprolicense" diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index c823b148..484d4c3c 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -22,6 +22,7 @@ CHEATCODE_DIZZY, CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, + CHEATCODE_QGIS_PRO_LICENSE, INTERNAL_MESSAGE_AUTHOR, MENTION_MESSAGES_COLOR, QCHAT_NICKNAME_MINLENGTH, @@ -32,12 +33,11 @@ # plugin from qtribu.toolbelt import PlgLogger, PlgOptionsManager -from qtribu.toolbelt.commons import play_resource_sound +from qtribu.toolbelt.commons import open_url_in_webviewer, play_resource_sound from qtribu.toolbelt.preferences import PlgSettingsStructure # -- GLOBALS -- MARKER_VALUE = "---" -DISPLAY_DATE_FORMAT = "%H:%M:%S" class QChatWidget(QgsDockWidget): @@ -330,6 +330,7 @@ def on_ws_message_received(self, message: str) -> None: message=self.tr("You were mentionned by {sender}: {message}").format( sender=message["author"], message=message["message"] ), + application=self.tr("QChat"), log_level=Qgis.Info, push=PlgOptionsManager().get_plg_settings().notify_push_info, duration=PlgOptionsManager().get_plg_settings().notify_push_duration, @@ -479,9 +480,42 @@ def check_cheatcode(self, message: dict[str, str]) -> bool: self.task_manager.addTask(task) return True + # QGIS pro license expiration message + if msg == CHEATCODE_QGIS_PRO_LICENSE: + self.log( + message=self.tr("Your QGIS Pro license is about to expire"), + application=self.tr("QGIS Pro"), + log_level=Qgis.Warning, + push=PlgOptionsManager().get_plg_settings().notify_push_info, + duration=PlgOptionsManager().get_plg_settings().notify_push_duration, + button=True, + button_label=self.tr("Click here to renew it"), + button_connect=self.on_renew_clicked, + ) + return True # play sounds if self.settings.qchat_play_sounds: if msg in [CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_10OCLOCK]: play_resource_sound(msg, self.settings.qchat_sound_volume) return True return False + + def on_renew_clicked(self) -> None: + msg_box = QMessageBox() + msg_box.setWindowTitle(self.tr("QGIS")) + msg_box.setIcon(QMessageBox.Information) + msg_box.setText( + self.tr( + """No ... it was a joke ! + +QGIS is Free and Open Source software, forever. +Free to use, not to make. + +Visit the new website ? +""" + ) + ) + msg_box.setStandardButtons(QMessageBox.Yes) + return_value = msg_box.exec() + if return_value == QMessageBox.Yes: + open_url_in_webviewer("https://qgis.org/funding/donate/", "qgis.org") From b7bdf015809d536ae5c3216add17de325b59955e Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:18:47 +0200 Subject: [PATCH 072/112] edit qgis license message --- qtribu/gui/dck_qchat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 484d4c3c..3a27fcac 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -506,12 +506,12 @@ def on_renew_clicked(self) -> None: msg_box.setIcon(QMessageBox.Information) msg_box.setText( self.tr( - """No ... it was a joke ! + """No... it was a joke! QGIS is Free and Open Source software, forever. Free to use, not to make. -Visit the new website ? +Visit the website ? """ ) ) From 5f1a981ba03003adee217738d6d90d54ae9e4b79 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:24:45 +0200 Subject: [PATCH 073/112] set status string message to translatable --- qtribu/gui/dck_qchat.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 3a27fcac..db3eaf98 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -172,14 +172,18 @@ def on_status_button_clicked(self) -> None: """ try: status = self.qchat_client.get_status() - text = """Status: {status} + user_txt = self.tr("user") + text = self.tr( + """Status: {status} Rooms: -{rooms_status}""".format( + +{rooms_status}""" + ).format( status=status["status"], rooms_status="\n".join( [ - f"- {r['name']} : {r['nb_connected_users']} user{'s' if r['nb_connected_users'] > 1 else ''}" + f"- {r['name']} : {r['nb_connected_users']} {user_txt}{'s' if r['nb_connected_users'] > 1 else ''}" for r in status["rooms"] ] ), @@ -364,9 +368,9 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: if "nb_users" in message: nb_users = message["nb_users"] self.grb_qchat.setTitle( - self.tr("QChat - {nb_users} user{suffix}").format( + self.tr("QChat - {nb_users} {user_txt}").format( nb_users=nb_users, - suffix="" if nb_users <= 1 else "s", + user_txt=self.tr("user") if nb_users <= 1 else self.tr("users"), ) ) From dcad031195e9be10416f2e6b5524353111bccb47 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:26:19 +0200 Subject: [PATCH 074/112] feature: add tooltip to message qtreewidgetitem --- qtribu/gui/dck_qchat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index db3eaf98..5ce5730a 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -454,6 +454,7 @@ def create_message_item( message, ] item = QTreeWidgetItem(item_data) + item.setTooltip(message) if foreground_color: for i in range(len(item_data)): item.setForeground(i, QBrush(QColor(foreground_color))) From 9572451702e9398df8b3d7fbad55f1b4e5d4ddd9 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:27:05 +0200 Subject: [PATCH 075/112] fix: fix tooltip typo --- qtribu/gui/dck_qchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 5ce5730a..2d683f8b 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -454,7 +454,7 @@ def create_message_item( message, ] item = QTreeWidgetItem(item_data) - item.setTooltip(message) + item.setToolTip(message) if foreground_color: for i in range(len(item_data)): item.setForeground(i, QBrush(QColor(foreground_color))) From beded06e9a6eb45373aa09d0396740328273eca3 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 24 Jul 2024 15:27:55 +0200 Subject: [PATCH 076/112] fix: fix tooltip item --- qtribu/gui/dck_qchat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 2d683f8b..e13b07e5 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -454,7 +454,7 @@ def create_message_item( message, ] item = QTreeWidgetItem(item_data) - item.setToolTip(message) + item.setToolTip(3, message) if foreground_color: for i in range(len(item_data)): item.setForeground(i, QBrush(QColor(foreground_color))) From 9d475e24231b7562ab09ab930262c31a1e399dc8 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 06:17:37 +0200 Subject: [PATCH 077/112] fix: fix typo --- qtribu/gui/dlg_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 613cc0a3..00727390 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -154,7 +154,7 @@ def load_settings(self) -> dict: self.lbl_version_saved_value.setText(settings.version) def show_instance_rules(self) -> None: - instance_url = self.le_qchat_instance_uri.text() + instance_url = self.lne_qchat_instance_uri.text() client = QChatApiClient(instance_url) rules = client.get_rules() QMessageBox.information( From 2b31957398d765926bb75dcc984d5a842b4f2223 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Wed, 24 Jul 2024 15:45:24 +0200 Subject: [PATCH 078/112] fix: remove qchat dockwidget when plugin is unloaded --- qtribu/plugin_main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index bf6f81ce..b5a8ddca 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -246,6 +246,7 @@ def unload(self): # -- Clean up toolbar del self.toolbar + del self.qchat_widget # -- Clean up preferences panel in QGIS settings self.iface.unregisterOptionsWidgetFactory(self.options_factory) From 630d91f9c4513f798481b7e5e4d29078e56b409d Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 07:31:38 +0200 Subject: [PATCH 079/112] feat: set author and message max length --- qtribu/gui/dck_qchat.ui | 6 +++++- qtribu/gui/wdg_authoring.ui | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/dck_qchat.ui b/qtribu/gui/dck_qchat.ui index 6ee08f71..e64aff56 100644 --- a/qtribu/gui/dck_qchat.ui +++ b/qtribu/gui/dck_qchat.ui @@ -267,7 +267,11 @@ - + + + 255 + + diff --git a/qtribu/gui/wdg_authoring.ui b/qtribu/gui/wdg_authoring.ui index 1eaf6d6f..f89ee7d1 100644 --- a/qtribu/gui/wdg_authoring.ui +++ b/qtribu/gui/wdg_authoring.ui @@ -214,6 +214,9 @@ + + 32 + pdupont From 8aae62c9766a213f2c7b5654de607555d1bd6f63 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 08:55:52 +0200 Subject: [PATCH 080/112] feat: add right click copy to clipboard action --- qtribu/gui/dck_qchat.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index e13b07e5..8b5af770 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -10,9 +10,9 @@ from qgis.core import Qgis, QgsApplication from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic -from qgis.PyQt.QtCore import QTime, QUrl -from qgis.PyQt.QtGui import QBrush, QColor, QIcon -from qgis.PyQt.QtWidgets import QMessageBox, QTreeWidgetItem, QWidget +from qgis.PyQt.QtCore import Qt, QTime, QUrl +from qgis.PyQt.QtGui import QBrush, QColor, QCursor, QIcon +from qgis.PyQt.QtWidgets import QAction, QMenu, QMessageBox, QTreeWidgetItem, QWidget from qtribu.__about__ import __title__ from qtribu.constants import ( @@ -90,6 +90,10 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.tr("Message"), ] ) + self.twg_chat.setContextMenuPolicy(Qt.CustomContextMenu) + self.twg_chat.customContextMenuRequested.connect( + self.on_custom_context_menu_requested + ) # clear chat signal listener self.btn_clear_chat.pressed.connect(self.on_clear_chat_button_clicked) @@ -374,6 +378,31 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: ) ) + def on_custom_context_menu_requested(self, point) -> None: + """ + Action called on right click on a chat message + """ + item = self.twg_chat.itemAt(point) + message = item.text(3) + + menu = QMenu(self.tr("QChat Menu"), self) + + # copy message action + copy_action = QAction( + QgsApplication.getThemeIcon("mActionEditCopy.svg"), + self.tr("Copy message to clipboard"), + ) + copy_action.triggered.connect(partial(self.on_copy_message, message)) + menu.addAction(copy_action) + + menu.exec(QCursor.pos()) + + def on_copy_message(self, message: str) -> None: + """ + Action called when copy to clipboard is triggered + """ + QgsApplication.instance().clipboard().setText(message) + def on_clear_chat_button_clicked(self) -> None: """ Action called when the clear chat button is clicked From c661aa6ec4c84b597a7a528050bed4bc1d917863 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 09:11:59 +0200 Subject: [PATCH 081/112] feat: add right click hide message action --- qtribu/gui/dck_qchat.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 8b5af770..44e25e75 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -387,22 +387,39 @@ def on_custom_context_menu_requested(self, point) -> None: menu = QMenu(self.tr("QChat Menu"), self) - # copy message action + # copy message to clipboard action copy_action = QAction( QgsApplication.getThemeIcon("mActionEditCopy.svg"), self.tr("Copy message to clipboard"), ) - copy_action.triggered.connect(partial(self.on_copy_message, message)) + copy_action.triggered.connect( + partial(self.on_copy_message_to_clipboard, message) + ) menu.addAction(copy_action) + # hide message action + hide_action = QAction( + QgsApplication.getThemeIcon("mActionHideSelectedLayers.svg"), + self.tr("Hide message"), + ) + hide_action.triggered.connect(partial(self.on_hide_message, item)) + menu.addAction(hide_action) + menu.exec(QCursor.pos()) - def on_copy_message(self, message: str) -> None: + def on_copy_message_to_clipboard(self, message: str) -> None: """ - Action called when copy to clipboard is triggered + Action called when copy to clipboard menu action is triggered """ QgsApplication.instance().clipboard().setText(message) + def on_hide_message(self, item: QTreeWidgetItem) -> None: + """ + Action called when hide message menu action is triggered + """ + root = self.twg_chat.invisibleRootItem() + (item.parent() or root).removeChild(item) + def on_clear_chat_button_clicked(self) -> None: """ Action called when the clear chat button is clicked From 97318ff2793c4f406431709a56c34d49e3d2a59e Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 09:24:05 +0200 Subject: [PATCH 082/112] feat: set admin message optional display in settings --- qtribu/gui/dck_qchat.py | 7 +- qtribu/gui/dlg_settings.py | 6 + qtribu/gui/dlg_settings.ui | 212 ++++++++++++++++++--------------- qtribu/toolbelt/preferences.py | 1 + 4 files changed, 130 insertions(+), 96 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 44e25e75..089766e0 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -249,7 +249,7 @@ def connect_to_room(self, room: str, log: bool = True) -> None: """ Connect widget to a specific room """ - if log: + if log and self.settings.qchat_display_admin_messages: self.add_admin_message( room, self.tr("Connected to room '{room}'").format(room=room) ) @@ -276,7 +276,7 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: """ Disconnect widget from the current room """ - if log: + if log and self.settings.qchat_display_admin_messages: self.add_admin_message( self.current_room, self.tr("Disconnected from room '{room}'").format( @@ -303,7 +303,8 @@ def on_ws_error(self, error_code: int) -> None: """ Action called when an error appears on the websocket """ - self.add_admin_message(self.tr("ERROR"), self.ws_client.errorString()) + if self.settings.qchat_display_admin_messages: + self.add_admin_message(self.tr("ERROR"), self.ws_client.errorString()) self.log( message=f"{error_code}: {self.ws_client.errorString()}", log_level=Qgis.Critical, diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 00727390..04b36cc8 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -107,6 +107,9 @@ def apply(self): # qchat settings.qchat_instance_uri = self.lne_qchat_instance_uri.text() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() + settings.qchat_display_admin_messages = ( + self.ckb_display_admin_messages.isChecked() + ) settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() settings.qchat_sound_volume = self.hsl_sound_volume.value() settings.qchat_ring_tone = self.cbb_ring_tone.currentText() @@ -141,6 +144,9 @@ def load_settings(self) -> dict: # qchat self.lne_qchat_instance_uri.setText(settings.qchat_instance_uri) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) + self.ckb_display_admin_messages.setChecked( + settings.qchat_display_admin_messages + ) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) self.hsl_sound_volume.setValue(settings.qchat_sound_volume) beep_index = self.cbb_ring_tone.findText( diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 40c9a418..3ae3fa69 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -305,119 +305,145 @@ QChat - - - - - Instance URI: - - - - - - - - - - Instance rules - - - - - - - Activate cheatcodes - - - - - - - Play sounds - - - - - - - 0 - - - 100 - - - 33 - - - Qt::Horizontal - - - - - - - - beep_1 - - + + + - - beep_2 - + + + Instance URI: + + - - beep_3 - + - - beep_4 - + + + Instance rules + + + + + + - - beep_5 - + + + Activate cheatcodes + + - - beep_6 - + + + Display admin messages + + + + + + - - beep_7 - + + + Play sounds + + - - horn - + + + Volume: + + - - cat - + + + 0 + + + 100 + + + 33 + + + Qt::Horizontal + + - - dog - + + + Notification tone: + + - - chicken - + + + + beep_1 + + + + + beep_2 + + + + + beep_3 + + + + + beep_4 + + + + + beep_5 + + + + + beep_6 + + + + + beep_7 + + + + + horn + + + + + cat + + + + + dog + + + + + chicken + + + - - - - - - Sounds volume : - - + diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 22accfc8..fc110a47 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -39,6 +39,7 @@ class PlgSettingsStructure: # QChat qchat_instance_uri: str = "https://gischat.geotribu.net" qchat_activate_cheatcode: bool = True + qchat_display_admin_messages: bool = True qchat_play_sounds: bool = True qchat_sound_volume: int = 33 qchat_ring_tone: str = "beep_1" From 3001859f5699967379c83a8c9d4df01a0d29ff14 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 10:04:08 +0200 Subject: [PATCH 083/112] feat: mention user when double clicking on chat button --- qtribu/gui/dck_qchat.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 089766e0..783418f1 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -10,7 +10,7 @@ from qgis.core import Qgis, QgsApplication from qgis.gui import QgisInterface, QgsDockWidget from qgis.PyQt import uic -from qgis.PyQt.QtCore import Qt, QTime, QUrl +from qgis.PyQt.QtCore import QPoint, Qt, QTime, QUrl from qgis.PyQt.QtGui import QBrush, QColor, QCursor, QIcon from qgis.PyQt.QtWidgets import QAction, QMenu, QMessageBox, QTreeWidgetItem, QWidget @@ -90,6 +90,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.tr("Message"), ] ) + self.twg_chat.itemDoubleClicked.connect(self.on_message_double_clicked) self.twg_chat.setContextMenuPolicy(Qt.CustomContextMenu) self.twg_chat.customContextMenuRequested.connect( self.on_custom_context_menu_requested @@ -379,9 +380,18 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: ) ) - def on_custom_context_menu_requested(self, point) -> None: + # def on_message_double_clicked(self, point: QModelIndex) -> None: + def on_message_double_clicked(self, item: QTreeWidgetItem, column: int) -> None: """ - Action called on right click on a chat message + Action called when double clicking on a chat message + """ + text = self.lne_message.text() + author = item.text(2) + self.lne_message.setText(f"{text}@{author} ") + + def on_custom_context_menu_requested(self, point: QPoint) -> None: + """ + Action called when right clicking on a chat message """ item = self.twg_chat.itemAt(point) message = item.text(3) @@ -466,7 +476,7 @@ def on_send_button_clicked(self) -> None: return # send message to websocket - message = {"message": message_text, "author": nickname} + message = {"message": message_text.strip(), "author": nickname} self.ws_client.sendTextMessage(json.dumps(message)) self.lne_message.setText("") From a7f4cbb77b62dadc29457f2beef44bc6c1b21a3a Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 10:07:59 +0200 Subject: [PATCH 084/112] fix: remove comment --- qtribu/gui/dck_qchat.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 783418f1..1b2efe1f 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -380,7 +380,6 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: ) ) - # def on_message_double_clicked(self, point: QModelIndex) -> None: def on_message_double_clicked(self, item: QTreeWidgetItem, column: int) -> None: """ Action called when double clicking on a chat message From 878d55b1e7b2b34bc4575ebc17a6c90d5ef494d5 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 10:10:29 +0200 Subject: [PATCH 085/112] feat: add mention action on right click --- qtribu/gui/dck_qchat.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 1b2efe1f..4ef79e96 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -415,6 +415,16 @@ def on_custom_context_menu_requested(self, point: QPoint) -> None: hide_action.triggered.connect(partial(self.on_hide_message, item)) menu.addAction(hide_action) + # mention user action + mention_action = QAction( + QgsApplication.getThemeIcon("mMessageLogRead.svg"), + self.tr("Mention user"), + ) + mention_action.triggered.connect( + partial(self.on_message_double_clicked, item, 2) + ) + menu.addAction(mention_action) + menu.exec(QCursor.pos()) def on_copy_message_to_clipboard(self, message: str) -> None: From 91e185bde125378465f06e238230f8eea3746a75 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 12:00:39 +0200 Subject: [PATCH 086/112] fix: reload widget if instance have changed --- qtribu/gui/dck_qchat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 4ef79e96..afd2ed7f 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -213,6 +213,8 @@ def on_settings_button_clicked(self) -> None: # disconnect if instance or nickname have changed if old_instance != new_instance or old_nickname != new_nickname: self.disconnect_from_room(log=self.connected, close_ws=self.connected) + self.on_widget_closed() + self.on_widget_opened() # reload settings self.load_settings() From d0334f7ecc0c747088e00ccac6605179c94ac673 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 12:01:55 +0200 Subject: [PATCH 087/112] fix: no mention if author is user or admin --- qtribu/gui/dck_qchat.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index afd2ed7f..ae45481f 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -395,6 +395,7 @@ def on_custom_context_menu_requested(self, point: QPoint) -> None: Action called when right clicking on a chat message """ item = self.twg_chat.itemAt(point) + author = item.text(2) message = item.text(3) menu = QMenu(self.tr("QChat Menu"), self) @@ -418,14 +419,18 @@ def on_custom_context_menu_requested(self, point: QPoint) -> None: menu.addAction(hide_action) # mention user action - mention_action = QAction( - QgsApplication.getThemeIcon("mMessageLogRead.svg"), - self.tr("Mention user"), - ) - mention_action.triggered.connect( - partial(self.on_message_double_clicked, item, 2) - ) - menu.addAction(mention_action) + if ( + author != self.settings.author_nickname + and author != ADMIN_MESSAGES_NICKNAME + ): + mention_action = QAction( + QgsApplication.getThemeIcon("mMessageLogRead.svg"), + self.tr("Mention user"), + ) + mention_action.triggered.connect( + partial(self.on_message_double_clicked, item, 2) + ) + menu.addAction(mention_action) menu.exec(QCursor.pos()) From dbebe8fcbb72ad1be5ce3dbb82aa7f58bd892613 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 14:27:59 +0200 Subject: [PATCH 088/112] feat: add avatars --- qtribu/constants.py | 1 + qtribu/gui/dck_qchat.py | 24 +++++- qtribu/gui/dlg_settings.py | 8 +- qtribu/gui/dlg_settings.ui | 7 ++ qtribu/gui/wdg_authoring.py | 24 ++++++ qtribu/gui/wdg_authoring.ui | 150 +++++++++++++++++++++++++++++---- qtribu/toolbelt/preferences.py | 2 + 7 files changed, 194 insertions(+), 22 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index cf67c6c0..a4be85b8 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -195,6 +195,7 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path QCHAT_NICKNAME_MINLENGTH = 3 ADMIN_MESSAGES_NICKNAME = "admin" ADMIN_MESSAGES_COLOR = "#ffa500" +ADMIN_MESSAGES_AVATAR = "mIconWarning.svg" MENTION_MESSAGES_COLOR = "#4169e1" USER_MESSAGES_COLOR = "#00cc00" ERROR_MESSAGES_COLOR = "#ff0000" diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index ae45481f..94086e71 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -16,6 +16,7 @@ from qtribu.__about__ import __title__ from qtribu.constants import ( + ADMIN_MESSAGES_AVATAR, ADMIN_MESSAGES_COLOR, ADMIN_MESSAGES_NICKNAME, CHEATCODE_10OCLOCK, @@ -125,6 +126,9 @@ def load_settings(self) -> None: self.tr("Instance: {uri}").format(uri=self.settings.qchat_instance_uri) ) self.lbl_nickname.setText(self.settings.author_nickname) + self.btn_send.setIcon( + QIcon(QgsApplication.iconPath(self.settings.author_avatar)) + ) def on_widget_opened(self) -> None: """ @@ -335,6 +339,7 @@ def on_ws_message_received(self, message: str) -> None: item = self.create_message_item( self.current_room, message["author"], + message["avatar"], message["message"], foreground_color=MENTION_MESSAGES_COLOR, ) @@ -351,12 +356,16 @@ def on_ws_message_received(self, message: str) -> None: item = self.create_message_item( self.current_room, message["author"], + message["avatar"], message["message"], foreground_color=USER_MESSAGES_COLOR, ) else: item = self.create_message_item( - self.current_room, message["author"], message["message"] + self.current_room, + message["author"], + message["avatar"], + message["message"], ) self.twg_chat.insertTopLevelItem(0, item) @@ -460,6 +469,7 @@ def on_send_button_clicked(self) -> None: # retrieve nickname and message nickname = self.settings.author_nickname + avatar = self.settings.author_avatar message_text = self.lne_message.text() if not nickname: @@ -492,7 +502,11 @@ def on_send_button_clicked(self) -> None: return # send message to websocket - message = {"message": message_text.strip(), "author": nickname} + message = { + "message": message_text.strip(), + "author": nickname, + "avatar": avatar, + } self.ws_client.sendTextMessage(json.dumps(message)) self.lne_message.setText("") @@ -503,15 +517,17 @@ def add_admin_message(self, room: str, message: str) -> None: item = self.create_message_item( room, ADMIN_MESSAGES_NICKNAME, + ADMIN_MESSAGES_AVATAR, message, foreground_color=ADMIN_MESSAGES_COLOR, ) self.twg_chat.insertTopLevelItem(0, item) - @staticmethod def create_message_item( + self, room: str, author: str, + avatar: Optional[str], message: str, foreground_color: str = None, background_color: str = None, @@ -527,6 +543,8 @@ def create_message_item( message, ] item = QTreeWidgetItem(item_data) + if self.settings.qchat_show_avatars and avatar: + item.setIcon(2, QIcon(QgsApplication.iconPath(avatar))) item.setToolTip(3, message) if foreground_color: for i in range(len(item_data)): diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 04b36cc8..1ecdaf47 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -24,7 +24,6 @@ __uri_tracker__, __version__, ) -from qtribu.gui.gui_commons import QVAL_URL from qtribu.logic.qchat_client import QChatApiClient from qtribu.toolbelt import PlgLogger, PlgOptionsManager from qtribu.toolbelt.commons import open_url_in_browser, play_resource_sound @@ -62,7 +61,8 @@ def __init__(self, parent=None): self.opt_browser_group.addButton(self.opt_browser_qt, 1) self.opt_browser_group.addButton(self.opt_browser_os, 2) - self.lne_qchat_instance_uri.setValidator(QVAL_URL) + # disabled this for instances with port in URL + # self.lne_qchat_instance_uri.setValidator(QVAL_URL) self.btn_rules.pressed.connect(self.show_instance_rules) self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("processingResult.svg"))) @@ -110,6 +110,7 @@ def apply(self): settings.qchat_display_admin_messages = ( self.ckb_display_admin_messages.isChecked() ) + settings.qchat_show_avatars = self.ckb_show_avatars.isChecked() settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() settings.qchat_sound_volume = self.hsl_sound_volume.value() settings.qchat_ring_tone = self.cbb_ring_tone.currentText() @@ -130,7 +131,7 @@ def apply(self): log_level=4, ) - def load_settings(self) -> dict: + def load_settings(self) -> None: """Load options from QgsSettings into UI form.""" settings = self.plg_settings.get_plg_settings() @@ -147,6 +148,7 @@ def load_settings(self) -> dict: self.ckb_display_admin_messages.setChecked( settings.qchat_display_admin_messages ) + self.ckb_show_avatars.setChecked(settings.qchat_show_avatars) self.ckb_play_sounds.setChecked(settings.qchat_play_sounds) self.hsl_sound_volume.setValue(settings.qchat_sound_volume) beep_index = self.cbb_ring_tone.findText( diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 3ae3fa69..53d52368 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -343,6 +343,13 @@ + + + + Show avatars + + + diff --git a/qtribu/gui/wdg_authoring.py b/qtribu/gui/wdg_authoring.py index 68b6f3e5..5138fb99 100644 --- a/qtribu/gui/wdg_authoring.py +++ b/qtribu/gui/wdg_authoring.py @@ -2,7 +2,10 @@ from pathlib import Path # PyQGIS +from qgis.core import QgsApplication from qgis.PyQt import uic +from qgis.PyQt.QtCore import Qt +from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QWidget # plugin @@ -29,6 +32,9 @@ def __init__(self, parent: QWidget = None): self.lne_linkedin_account.setValidator(QVAL_URL) self.lne_twitter_account.setValidator(QVAL_URL) + # play sound on ringtone changed + self.cbb_qchat_avatar.currentIndexChanged.connect(self.on_avatar_index_changed) + # fill fields from saved settings self.load_settings() @@ -38,6 +44,15 @@ def load_settings(self) -> dict: # author self.lne_qchat_nickname.setText(settings.author_nickname) + avatar_index = self.cbb_qchat_avatar.findText( + settings.author_avatar, Qt.MatchFixedString + ) + if avatar_index >= 0: + self.cbb_qchat_avatar.setCurrentIndex(avatar_index) + self.btn_avatar_preview.setIcon( + QIcon(QgsApplication.iconPath(settings.author_avatar)) + ) + self.lne_firstname.setText(settings.author_firstname) self.lne_lastname.setText(settings.author_lastname) self.lne_email.setText(settings.author_email) @@ -53,6 +68,7 @@ def save_settings(self) -> None: # store user inputs settings.author_nickname = self.lne_qchat_nickname.text() + settings.author_avatar = self.cbb_qchat_avatar.currentText() settings.author_firstname = self.lne_firstname.text() settings.author_lastname = self.lne_lastname.text() settings.author_email = self.lne_email.text() @@ -63,3 +79,11 @@ def save_settings(self) -> None: # save it self.plg_settings.save_from_object(settings) + + def on_avatar_index_changed(self) -> None: + """ + Action launched when avatar index is changed in combobox + """ + self.btn_avatar_preview.setIcon( + QIcon(QgsApplication.iconPath(self.cbb_qchat_avatar.currentText())) + ) diff --git a/qtribu/gui/wdg_authoring.ui b/qtribu/gui/wdg_authoring.ui index f89ee7d1..7ff2c6f1 100644 --- a/qtribu/gui/wdg_authoring.ui +++ b/qtribu/gui/wdg_authoring.ui @@ -6,8 +6,8 @@ 0 0 - 350 - 268 + 406 + 344 @@ -41,7 +41,7 @@ - + @@ -54,7 +54,7 @@ - + Pierre @@ -64,7 +64,7 @@ - + @@ -77,7 +77,7 @@ - + Qt::ImhUppercaseOnly @@ -90,7 +90,7 @@ - + @@ -103,7 +103,7 @@ - + Qt::ImhEmailCharactersOnly @@ -116,7 +116,7 @@ - + Used to credit the commit author. @@ -126,7 +126,7 @@ - + Qt::ImhUrlCharactersOnly @@ -139,7 +139,7 @@ - + Used during broadcasting to credit author. @@ -149,7 +149,7 @@ - + https://www.linkedin.com/in/pierredupont/ @@ -159,7 +159,7 @@ - + Used during broadcasting to credit author. @@ -169,7 +169,7 @@ - + https://twitter.com/geotribu @@ -179,14 +179,14 @@ - + Mastodon account: - + Qt::ImhUrlCharactersOnly @@ -222,6 +222,124 @@ + + + + + 75 + true + + + + QChat avatar: + + + + + + + + + + 0 + 0 + + + + + mActionAddHtml.svg + + + + + mActionArrowUp.svg + + + + + mActionCalculateField.svg + + + + + mActionMapTips.svg + + + + + mActionPropertiesWidget.svg + + + + + mIconCamera.svg + + + + + mIconCertificate.svg + + + + + mIconInfo.svg + + + + + mIconPostgis.svg + + + + + mIconPyramid.svg + + + + + mIconRaster.svg + + + + + mIconSpatialite.svg + + + + + mIconXyz.svg + + + + + mIconZip.svg + + + + + mGeoPackage.svg + + + + + + + + true + + + + 0 + 0 + + + + Preview + + + + + diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index fc110a47..c3d6a862 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -40,6 +40,7 @@ class PlgSettingsStructure: qchat_instance_uri: str = "https://gischat.geotribu.net" qchat_activate_cheatcode: bool = True qchat_display_admin_messages: bool = True + qchat_show_avatars: bool = True qchat_play_sounds: bool = True qchat_sound_volume: int = 33 qchat_ring_tone: str = "beep_1" @@ -60,6 +61,7 @@ class PlgSettingsStructure: # authoring author_nickname: str = "" + author_avatar: str = "mGeoPackage.svg" author_firstname: str = "" author_lastname: str = "" author_email: str = "" From 536b2122a44bb8e7260ef9b5bff6771b993a0c48 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 14:56:20 +0200 Subject: [PATCH 089/112] feat: use editable combobox for instance in settings --- qtribu/gui/dlg_settings.py | 35 ++++++++++++++++++++++------------- qtribu/gui/dlg_settings.ui | 30 +++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 1ecdaf47..b6e9ff7e 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -9,7 +9,7 @@ from pathlib import Path # PyQGIS -from qgis.core import QgsApplication +from qgis.core import Qgis, QgsApplication from qgis.gui import QgsOptionsPageWidget, QgsOptionsWidgetFactory from qgis.PyQt import uic from qgis.PyQt.QtCore import Qt @@ -105,7 +105,7 @@ def apply(self): settings.license_global_accept = self.chb_license_global_accept.isChecked() # qchat - settings.qchat_instance_uri = self.lne_qchat_instance_uri.text() + settings.qchat_instance_uri = self.cbb_qchat_instance_uri.currentText() settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() settings.qchat_display_admin_messages = ( self.ckb_display_admin_messages.isChecked() @@ -143,7 +143,13 @@ def load_settings(self) -> None: self.chb_license_global_accept.setChecked(settings.license_global_accept) # qchat - self.lne_qchat_instance_uri.setText(settings.qchat_instance_uri) + instance_index = self.cbb_qchat_instance_uri.findText( + settings.qchat_instance_uri, Qt.MatchFixedString + ) + if instance_index >= 0: + self.cbb_qchat_instance_uri.setCurrentIndex(instance_index) + else: + self.cbb_qchat_instance_uri.setCurrentText(settings.qchat_instance_uri) self.ckb_cheatcodes.setChecked(settings.qchat_activate_cheatcode) self.ckb_display_admin_messages.setChecked( settings.qchat_display_admin_messages @@ -162,16 +168,19 @@ def load_settings(self) -> None: self.lbl_version_saved_value.setText(settings.version) def show_instance_rules(self) -> None: - instance_url = self.lne_qchat_instance_uri.text() - client = QChatApiClient(instance_url) - rules = client.get_rules() - QMessageBox.information( - self, - self.tr("Instance rules"), - self.tr("Instance rules ({instance_url}):\n\n{rules}").format( - instance_url=instance_url, rules=rules["rules"] - ), - ) + instance_url = self.cbb_qchat_instance_uri.currentText() + try: + client = QChatApiClient(instance_url) + rules = client.get_rules() + QMessageBox.information( + self, + self.tr("Instance rules"), + self.tr("Instance rules ({instance_url}):\n\n{rules}").format( + instance_url=instance_url, rules=rules["rules"] + ), + ) + except Exception as e: + self.log(message=str(e), log_level=Qgis.Critical) def on_ring_tone_changed(self) -> None: """ diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 53d52368..ff88787a 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -316,7 +316,30 @@ - + + + + + + + 0 + 0 + + + + true + + + + https://gischat.geotribu.net + + + + + https://gischat.geotribu.fr + + + @@ -653,6 +676,11 @@ + + QgsSymbolButton + QToolButton +
qgssymbolbutton.h
+
AuthoringWidget QWidget From 818b7ebbd4ac70a156b2a0e48b00a91dd8f24daf Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 25 Jul 2024 14:44:17 +0200 Subject: [PATCH 090/112] update(docs): add QtMutimedia as required dependency --- docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 443c139b..a30cbffb 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -4,7 +4,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles tierces non incluses dans le packaging de QGIS sur certaines plateformes : -- QGISChat: QtWebSockets +- QGISChat: (Py)QtMutimedia, (Py)QtWebSockets ### Linux @@ -13,7 +13,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles t Ouvrir un terminal et exécuter la commande suivante : ```sh -sudo apt install python3-pyqt5.qtwebsockets +sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets ``` ---- From cf6477dca42823da6336c24f77be63c2e8aaee8f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:47:53 +0000 Subject: [PATCH 091/112] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index a30cbffb..f2afb719 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,7 +13,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles t Ouvrir un terminal et exécuter la commande suivante : ```sh -sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets +sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets ``` ---- From a91fb3aeeaef6fef39868d6763db979c11281a35 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 15:10:33 +0200 Subject: [PATCH 092/112] feat: display main language in rules action --- qtribu/gui/dck_qchat.py | 8 ++++++-- qtribu/gui/dlg_settings.py | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 94086e71..066e2a0f 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -167,8 +167,12 @@ def on_rules_button_clicked(self) -> None: QMessageBox.information( self, self.tr("Instance rules"), - self.tr("Instance rules ({instance_url}):\n\n{rules}").format( - instance_url=self.qchat_client.instance_uri, rules=rules["rules"] + self.tr( + "Instance rules ({instance_url}):\n\n{rules}\n\nMain language: {main_lang}" + ).format( + instance_url=self.qchat_client.instance_uri, + rules=rules["rules"], + main_lang=rules["main_lang"], ), ) except Exception as exc: diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index b6e9ff7e..3943862d 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -175,8 +175,12 @@ def show_instance_rules(self) -> None: QMessageBox.information( self, self.tr("Instance rules"), - self.tr("Instance rules ({instance_url}):\n\n{rules}").format( - instance_url=instance_url, rules=rules["rules"] + self.tr( + "Instance rules ({instance_url}):\n\n{rules}\n\nMain language: {main_lang}" + ).format( + instance_url=instance_url, + rules=rules["rules"], + main_lang=rules["main_lang"], ), ) except Exception as e: From 43b64b5435de8756e188c83009421f52e1120ad2 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 25 Jul 2024 15:03:44 +0200 Subject: [PATCH 093/112] update(docs): add how to download branch version --- docs/installation.md | 28 +++++++++++++++++- ...ub_actions_workflow_packaging_listing.webp | Bin 0 -> 52234 bytes ..._packaging_summary_annotated_artefact.webp | Bin 0 -> 29800 bytes ...hub_pr_checks_tab_annotated_packaging.webp | Bin 0 -> 26160 bytes 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 docs/static/github_actions_workflow_packaging_listing.webp create mode 100644 docs/static/github_actions_workflow_packaging_summary_annotated_artefact.webp create mode 100644 docs/static/github_pr_checks_tab_annotated_packaging.webp diff --git a/docs/installation.md b/docs/installation.md index f2afb719..445bb91b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,7 +13,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles t Ouvrir un terminal et exécuter la commande suivante : ```sh -sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets +sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets ``` ---- @@ -53,6 +53,32 @@ Selon votre configuration, redémarrer QGIS peut être nécessaire, le gestionna ---- +## Version en développement + +### Depuis une branche + +1. S'identifier sur Github.com +1. Se rendre sur la page correspondant au workflow GitHub Actions "📦 Packaging & 🚀 Release" : [cliquer ici](https://github.com/geotribu/qtribu/actions/workflows/packager.yml) +1. Filtrer sur la branche souhaitée + + ![Github - Workflow run listing](./static/github_actions_workflow_packaging_listing.webp) + +1. Sélectionner la dernière exécution qui a fonctionné (avec une coche verte) +1. En bas de la page _Summary_, télécharger l'artefact du plugin packagé : + + ![Github - Workflow run summary](./static/github_actions_workflow_packaging_summary_annotated_artefact.webp) + +1. Décompresser le fichier ZIP. +1. Ajouter le zip depuis le menu de QGIS ([voir la doc officielle](https://docs.qgis.org/3.34/fr/docs/user_manual/plugins/plugins.html#the-install-from-zip-tab) pour cette étape si besoin) + +:::{note} +Il est aussi possible d'accéder à la page depuis l'onglet `Checks` de la Pull Request correspondante : + +![Github - PR Checks tab](./static/github_pr_checks_tab_annotated_packaging.webp) +::: + +---- + ## Intégration dans QGIS Une fois installé, le plugin s'intègre : diff --git a/docs/static/github_actions_workflow_packaging_listing.webp b/docs/static/github_actions_workflow_packaging_listing.webp new file mode 100644 index 0000000000000000000000000000000000000000..f2c55ccebe84b23cce9408297e1d8aca946e00ac GIT binary patch literal 52234 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 literal 0 HcmV?d00001 diff --git a/docs/static/github_actions_workflow_packaging_summary_annotated_artefact.webp b/docs/static/github_actions_workflow_packaging_summary_annotated_artefact.webp new file mode 100644 index 0000000000000000000000000000000000000000..b35d4c295cffa8806e773fac39d16f573d19ea27 GIT binary patch literal 29800 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

S`A;wa4~rl-B0YvX*VPtoBc-a%?l2tX#48hyv- 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 literal 0 HcmV?d00001 diff --git a/docs/static/github_pr_checks_tab_annotated_packaging.webp b/docs/static/github_pr_checks_tab_annotated_packaging.webp new file mode 100644 index 0000000000000000000000000000000000000000..93baffb61cbd042956f5c784bffd33013c5bea83 GIT binary patch literal 26160 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 literal 0 HcmV?d00001 From b6bbb249a16b27b1f1423158a664bb3982e1f742 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:03:57 +0000 Subject: [PATCH 094/112] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 445bb91b..9db78f9c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,7 +13,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles t Ouvrir un terminal et exécuter la commande suivante : ```sh -sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets +sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets ``` ---- From 10b95fd7fc0ec6fe380f1b986ab4a825de0c1f02 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 25 Jul 2024 15:05:49 +0200 Subject: [PATCH 095/112] chore(packaging): update version to 0.18.0-beta1 and set it as experimental --- qtribu/metadata.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qtribu/metadata.txt b/qtribu/metadata.txt index b8196353..66fe3d4f 100644 --- a/qtribu/metadata.txt +++ b/qtribu/metadata.txt @@ -16,10 +16,10 @@ tracker=https://github.com/geotribu/qtribu/issues/ # experimental flag deprecated=False -experimental=False +experimental=True qgisMinimumVersion=3.28 qgisMaximumVersion=3.99 # versionnement -version=0.18.0 +version=1.0.0-beta1 changelog= From 4a21fccfc62da842a5fcaaf42cb6111493e385ca Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 17:07:39 +0200 Subject: [PATCH 096/112] feat: use QgsFilterLineEdit for message input --- qtribu/gui/dck_qchat.ui | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/qtribu/gui/dck_qchat.ui b/qtribu/gui/dck_qchat.ui index e64aff56..7e244c03 100644 --- a/qtribu/gui/dck_qchat.ui +++ b/qtribu/gui/dck_qchat.ui @@ -259,21 +259,14 @@ - + Message: - - - - 255 - - - - + PointingHandCursor @@ -296,6 +289,13 @@ + + + + + + + @@ -319,6 +319,11 @@

qgscollapsiblegroupbox.h
1
+ + QgsFilterLineEdit + QLineEdit +
qgsfilterlineedit.h
+
grb_instance From ffbb36a768f792cf6d0b140bdd6c15f974664a2c Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 18:31:11 +0200 Subject: [PATCH 097/112] feat: set message colors in settings --- qtribu/constants.py | 3 - qtribu/gui/dck_qchat.py | 9 +-- qtribu/gui/dlg_settings.py | 8 ++- qtribu/gui/dlg_settings.ui | 111 +++++++++++++++++++++++++++++++-- qtribu/toolbelt/preferences.py | 3 + 5 files changed, 120 insertions(+), 14 deletions(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index a4be85b8..0a476a2a 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -194,10 +194,7 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path # QChat QCHAT_NICKNAME_MINLENGTH = 3 ADMIN_MESSAGES_NICKNAME = "admin" -ADMIN_MESSAGES_COLOR = "#ffa500" ADMIN_MESSAGES_AVATAR = "mIconWarning.svg" -MENTION_MESSAGES_COLOR = "#4169e1" -USER_MESSAGES_COLOR = "#00cc00" ERROR_MESSAGES_COLOR = "#ff0000" INTERNAL_MESSAGE_AUTHOR = "internal" diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 066e2a0f..259049de 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -17,7 +17,6 @@ from qtribu.__about__ import __title__ from qtribu.constants import ( ADMIN_MESSAGES_AVATAR, - ADMIN_MESSAGES_COLOR, ADMIN_MESSAGES_NICKNAME, CHEATCODE_10OCLOCK, CHEATCODE_DIZZY, @@ -25,9 +24,7 @@ CHEATCODE_IAMAROBOT, CHEATCODE_QGIS_PRO_LICENSE, INTERNAL_MESSAGE_AUTHOR, - MENTION_MESSAGES_COLOR, QCHAT_NICKNAME_MINLENGTH, - USER_MESSAGES_COLOR, ) from qtribu.logic.qchat_client import QChatApiClient from qtribu.tasks.dizzy import DizzyTask @@ -345,7 +342,7 @@ def on_ws_message_received(self, message: str) -> None: message["author"], message["avatar"], message["message"], - foreground_color=MENTION_MESSAGES_COLOR, + foreground_color=self.settings.qchat_color_mention, ) self.log( message=self.tr("You were mentionned by {sender}: {message}").format( @@ -362,7 +359,7 @@ def on_ws_message_received(self, message: str) -> None: message["author"], message["avatar"], message["message"], - foreground_color=USER_MESSAGES_COLOR, + foreground_color=self.settings.qchat_color_self, ) else: item = self.create_message_item( @@ -523,7 +520,7 @@ def add_admin_message(self, room: str, message: str) -> None: ADMIN_MESSAGES_NICKNAME, ADMIN_MESSAGES_AVATAR, message, - foreground_color=ADMIN_MESSAGES_COLOR, + foreground_color=self.settings.qchat_color_admin, ) self.twg_chat.insertTopLevelItem(0, item) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 3943862d..e3e8a283 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -13,7 +13,7 @@ from qgis.gui import QgsOptionsPageWidget, QgsOptionsWidgetFactory from qgis.PyQt import uic from qgis.PyQt.QtCore import Qt -from qgis.PyQt.QtGui import QIcon +from qgis.PyQt.QtGui import QColor, QIcon from qgis.PyQt.QtWidgets import QButtonGroup, QMessageBox # project @@ -114,6 +114,9 @@ def apply(self): settings.qchat_play_sounds = self.ckb_play_sounds.isChecked() settings.qchat_sound_volume = self.hsl_sound_volume.value() settings.qchat_ring_tone = self.cbb_ring_tone.currentText() + settings.qchat_color_mention = self.cbt_color_mention.color().name() + settings.qchat_color_self = self.cbt_color_self.color().name() + settings.qchat_color_admin = self.cbt_color_admin.color().name() # misc settings.debug_mode = self.opt_debug.isChecked() @@ -162,6 +165,9 @@ def load_settings(self) -> None: ) if beep_index >= 0: self.cbb_ring_tone.setCurrentIndex(beep_index) + self.cbt_color_mention.setColor(QColor(settings.qchat_color_mention)) + self.cbt_color_self.setColor(QColor(settings.qchat_color_self)) + self.cbt_color_admin.setColor(QColor(settings.qchat_color_admin)) # misc self.opt_debug.setChecked(settings.debug_mode) diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index ff88787a..f9312144 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -353,9 +353,9 @@ - + - Activate cheatcodes + Show avatars @@ -367,9 +367,9 @@ - + - Show avatars + Activate cheatcodes @@ -475,6 +475,79 @@
+ + + + + + + 0 + 0 + + + + Mention message color: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Self message color: + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + Admin message color: + + + + + + + + 0 + 0 + + + + + + @@ -676,6 +749,11 @@ + + QgsColorButton + QToolButton +
qgscolorbutton.h
+
QgsSymbolButton QToolButton @@ -688,6 +766,31 @@ 1
+ + opt_browser_qt + opt_browser_os + opt_notif_push_msg + sbx_notif_duration + btn_reset_read_history + chb_integration_news_feed + chb_license_global_accept + mSymbolButton + cbb_qchat_instance_uri + btn_rules + ckb_show_avatars + ckb_display_admin_messages + ckb_cheatcodes + ckb_play_sounds + hsl_sound_volume + cbb_ring_tone + cbt_color_mention + cbt_color_self + cbt_color_admin + btn_help + btn_report + opt_debug + btn_reset +
diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index c3d6a862..9a6ddb24 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -44,6 +44,9 @@ class PlgSettingsStructure: qchat_play_sounds: bool = True qchat_sound_volume: int = 33 qchat_ring_tone: str = "beep_1" + qchat_color_mention: str = "#4169e1" + qchat_color_self: str = "#00cc00" + qchat_color_admin: str = "#ffa500" # usage browser: int = 1 From eea6d62f77481c7b4e87c7e847e9034649dcfb72 Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 25 Jul 2024 18:46:28 +0200 Subject: [PATCH 098/112] feat: add more debug logs --- qtribu/gui/dck_qchat.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 259049de..5d57f16f 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -104,6 +104,7 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): self.ws_client = QtWebSockets.QWebSocket( "", QtWebSockets.QWebSocketProtocol.Version13, None ) + self.ws_client.error.connect(self.on_ws_error) self.ws_client.textMessageReceived.connect(self.on_ws_message_received) # send message signal listener @@ -279,6 +280,7 @@ def on_ws_connected(self, room: str) -> None: self.grb_user.setEnabled(True) self.current_room = room self.connected = True + self.log(message=f"Websocket connected to room {room}") def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: """ @@ -306,6 +308,7 @@ def on_ws_disconnected(self) -> None: Action called when websocket is disconnected """ self.connected = False + self.log(message="Websocket disconnected") def on_ws_error(self, error_code: int) -> None: """ @@ -329,6 +332,10 @@ def on_ws_message_received(self, message: str) -> None: self.handle_internal_message(message) return + self.log( + message=f"Message received: [{message['author']}]: '{message['message']}'" + ) + # check if a cheatcode is activated if self.settings.qchat_activate_cheatcode: activated = self.check_cheatcode(message) @@ -391,6 +398,7 @@ def handle_internal_message(self, message: dict[str, Any]) -> None: user_txt=self.tr("user") if nb_users <= 1 else self.tr("users"), ) ) + self.log(message=f"Internal message received: {nb_users} users in room") def on_message_double_clicked(self, item: QTreeWidgetItem, column: int) -> None: """ From 344bf099f13e0371b5efaa257d0c560abed22ac0 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 07:41:33 +0200 Subject: [PATCH 099/112] feat: add more available avatar icons --- qtribu/gui/wdg_authoring.ui | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/qtribu/gui/wdg_authoring.ui b/qtribu/gui/wdg_authoring.ui index 7ff2c6f1..7031f296 100644 --- a/qtribu/gui/wdg_authoring.ui +++ b/qtribu/gui/wdg_authoring.ui @@ -280,11 +280,26 @@ mIconCertificate.svg + + + mIconFolder.svg + + + + + mIconGPU.svg + + mIconInfo.svg + + + mIconNetworkLogger.svg + + mIconPostgis.svg @@ -295,6 +310,11 @@ mIconPyramid.svg + + + mIconPythonFile.svg + + mIconRaster.svg From e7e55533147d849dd211ca5b4c538a74caba033b Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 08:42:47 +0200 Subject: [PATCH 100/112] feat: remove / at the end of the instance uri --- qtribu/gui/dlg_settings.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index e3e8a283..65c9aeb0 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -105,7 +105,11 @@ def apply(self): settings.license_global_accept = self.chb_license_global_accept.isChecked() # qchat - settings.qchat_instance_uri = self.cbb_qchat_instance_uri.currentText() + instance = self.cbb_qchat_instance_uri.currentText() + if instance.endswith("/"): + settings.qchat_instance_uri = instance[0:-1] + else: + settings.qchat_instance_uri = instance settings.qchat_activate_cheatcode = self.ckb_cheatcodes.isChecked() settings.qchat_display_admin_messages = ( self.ckb_display_admin_messages.isChecked() From b4f0b881cc24fd91741fbedf0a26bcb4992cee49 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 10:30:08 +0200 Subject: [PATCH 101/112] feat: add min/max nickname and message length in rules display --- qtribu/gui/dck_qchat.py | 12 +++++++++++- qtribu/gui/dlg_settings.py | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 5d57f16f..658608b1 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -166,11 +166,21 @@ def on_rules_button_clicked(self) -> None: self, self.tr("Instance rules"), self.tr( - "Instance rules ({instance_url}):\n\n{rules}\n\nMain language: {main_lang}" + """Instance rules ({instance_url}): + +{rules} + +Main language: {main_lang} +Max message length: {max_message_length} +Min nickname length: {min_nickname_length} +Max nickname length: {max_nickname_length}""" ).format( instance_url=self.qchat_client.instance_uri, rules=rules["rules"], main_lang=rules["main_lang"], + max_message_length=rules["max_message_length"], + min_nickname_length=rules["min_author_length"], + max_nickname_length=rules["max_author_length"], ), ) except Exception as exc: diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 65c9aeb0..3023c141 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -186,11 +186,21 @@ def show_instance_rules(self) -> None: self, self.tr("Instance rules"), self.tr( - "Instance rules ({instance_url}):\n\n{rules}\n\nMain language: {main_lang}" + """Instance rules ({instance_url}): + +{rules} + +Main language: {main_lang} +Max message length: {max_message_length} +Min nickname length: {min_nickname_length} +Max nickname length: {max_nickname_length}""" ).format( instance_url=instance_url, rules=rules["rules"], main_lang=rules["main_lang"], + max_message_length=rules["max_message_length"], + min_nickname_length=rules["min_author_length"], + max_nickname_length=rules["max_author_length"], ), ) except Exception as e: From 5dfa0b7cbd7835452fc4ac6616cfa43934786892 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 10:42:44 +0200 Subject: [PATCH 102/112] feat: discover instances button in settings --- qtribu/gui/dlg_settings.py | 26 ++++++++++++++++++++++++++ qtribu/gui/dlg_settings.ui | 16 +++++++--------- qtribu/logic/qchat_client.py | 12 ++++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/qtribu/gui/dlg_settings.py b/qtribu/gui/dlg_settings.py index 3023c141..e4051720 100644 --- a/qtribu/gui/dlg_settings.py +++ b/qtribu/gui/dlg_settings.py @@ -65,6 +65,8 @@ def __init__(self, parent=None): # self.lne_qchat_instance_uri.setValidator(QVAL_URL) self.btn_rules.pressed.connect(self.show_instance_rules) self.btn_rules.setIcon(QIcon(QgsApplication.iconPath("processingResult.svg"))) + self.btn_discover.pressed.connect(self.discover_instances) + self.btn_discover.setIcon(QIcon(QgsApplication.iconPath("mIconListView.svg"))) # customization self.btn_help.setIcon(QIcon(QgsApplication.iconPath("mActionHelpContents.svg"))) @@ -178,6 +180,9 @@ def load_settings(self) -> None: self.lbl_version_saved_value.setText(settings.version) def show_instance_rules(self) -> None: + """ + Action called when clicking on the "Instance rules" button + """ instance_url = self.cbb_qchat_instance_uri.currentText() try: client = QChatApiClient(instance_url) @@ -206,6 +211,27 @@ def show_instance_rules(self) -> None: except Exception as e: self.log(message=str(e), log_level=Qgis.Critical) + def discover_instances(self) -> None: + """ + Action called when clicking on the "Discover instances" button + """ + try: + client = QChatApiClient(self.cbb_qchat_instance_uri.currentText()) + instances = client.get_registered_instances() + msg = "" + for lang, lang_instances in instances.items(): + msg += f"[{lang}]:\n" + for li in lang_instances: + msg += f"- {li}\n" + msg += "\n" + QMessageBox.information( + self, + self.tr("Registered instances"), + msg, + ) + except Exception as e: + self.log(message=str(e), log_level=Qgis.Critical) + def on_ring_tone_changed(self) -> None: """ Action called when ringtone value is changed diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index f9312144..2ec01b6d 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -315,9 +315,6 @@ - - - @@ -348,6 +345,13 @@ + + + + Discover instances + + + @@ -754,11 +758,6 @@ QToolButton
qgscolorbutton.h
- - QgsSymbolButton - QToolButton -
qgssymbolbutton.h
-
AuthoringWidget QWidget @@ -774,7 +773,6 @@ btn_reset_read_history chb_integration_news_feed chb_license_global_accept - mSymbolButton cbb_qchat_instance_uri btn_rules ckb_show_avatars diff --git a/qtribu/logic/qchat_client.py b/qtribu/logic/qchat_client.py index 0eab8dc0..d73b14a9 100644 --- a/qtribu/logic/qchat_client.py +++ b/qtribu/logic/qchat_client.py @@ -16,6 +16,8 @@ CONTENT_TYPE_JSON = "application/json" +INSTANCES_JSON_URL = "https://github.com/geotribu/gischat/raw/main/instances.json" + class QChatApiClient: """ @@ -29,6 +31,16 @@ def __init__( self.instance_uri = instance_uri self.qntwk = NetworkRequestsManager() + def get_registered_instances(self) -> dict[str, list[str]]: + response: QByteArray = self.qntwk.get_from_source( + headers=HEADERS, + url=INSTANCES_JSON_URL, + response_expected_content_type="text/plain; charset=utf-8", + use_cache=False, + ) + data = json.loads(str(response, "UTF8")) + return data + def get_status(self) -> dict[str, Any]: """ Get instance status with an API call From ee5b01e45861b5d35eb5ffb1a3b6e40108a1ad9f Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 10:50:49 +0200 Subject: [PATCH 103/112] feat: mention when pinging @all --- qtribu/constants.py | 8 ++++++++ qtribu/gui/dck_qchat.py | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/qtribu/constants.py b/qtribu/constants.py index 0a476a2a..773b0f1c 100644 --- a/qtribu/constants.py +++ b/qtribu/constants.py @@ -204,3 +204,11 @@ def local_path(self, base_path: Path = Path().home() / ".geotribu/cdn/") -> Path CHEATCODE_IAMAROBOT = "iamarobot" CHEATCODE_10OCLOCK = "its10oclock" CHEATCODE_QGIS_PRO_LICENSE = "qgisprolicense" + +CHEATCODES = [ + CHEATCODE_DIZZY, + CHEATCODE_DONTCRYBABY, + CHEATCODE_IAMAROBOT, + CHEATCODE_10OCLOCK, + CHEATCODE_QGIS_PRO_LICENSE, +] diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 658608b1..34e0022d 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -23,6 +23,7 @@ CHEATCODE_DONTCRYBABY, CHEATCODE_IAMAROBOT, CHEATCODE_QGIS_PRO_LICENSE, + CHEATCODES, INTERNAL_MESSAGE_AUTHOR, QCHAT_NICKNAME_MINLENGTH, ) @@ -352,8 +353,13 @@ def on_ws_message_received(self, message: str) -> None: if activated: return + # do not display cheatcodes + if message["message"] in CHEATCODES: + return + # check if message mentions current user - if f"@{self.settings.author_nickname}" in message["message"]: + words = message["message"].split(" ") + if f"@{self.settings.author_nickname}" in words or "@all" in words: item = self.create_message_item( self.current_room, message["author"], From 067805d92366e0a08d593cd5c3ccf0f5df566f88 Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 15:02:57 +0200 Subject: [PATCH 104/112] feat: remove Room column --- qtribu/gui/dck_qchat.py | 17 +++++------------ qtribu/gui/dck_qchat.ui | 7 +------ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index 34e0022d..d4c0bcb0 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -83,7 +83,6 @@ def __init__(self, iface: QgisInterface, parent: QWidget = None): # tree widget initialization self.twg_chat.setHeaderLabels( [ - self.tr("Room"), self.tr("Date"), self.tr("Nickname"), self.tr("Message"), @@ -361,7 +360,6 @@ def on_ws_message_received(self, message: str) -> None: words = message["message"].split(" ") if f"@{self.settings.author_nickname}" in words or "@all" in words: item = self.create_message_item( - self.current_room, message["author"], message["avatar"], message["message"], @@ -378,7 +376,6 @@ def on_ws_message_received(self, message: str) -> None: ) elif message["author"] == self.settings.author_nickname: item = self.create_message_item( - self.current_room, message["author"], message["avatar"], message["message"], @@ -386,7 +383,6 @@ def on_ws_message_received(self, message: str) -> None: ) else: item = self.create_message_item( - self.current_room, message["author"], message["avatar"], message["message"], @@ -421,7 +417,7 @@ def on_message_double_clicked(self, item: QTreeWidgetItem, column: int) -> None: Action called when double clicking on a chat message """ text = self.lne_message.text() - author = item.text(2) + author = item.text(1) self.lne_message.setText(f"{text}@{author} ") def on_custom_context_menu_requested(self, point: QPoint) -> None: @@ -429,8 +425,8 @@ def on_custom_context_menu_requested(self, point: QPoint) -> None: Action called when right clicking on a chat message """ item = self.twg_chat.itemAt(point) - author = item.text(2) - message = item.text(3) + author = item.text(1) + message = item.text(2) menu = QMenu(self.tr("QChat Menu"), self) @@ -540,7 +536,6 @@ def add_admin_message(self, room: str, message: str) -> None: Adds an admin message to QTreeWidget chat """ item = self.create_message_item( - room, ADMIN_MESSAGES_NICKNAME, ADMIN_MESSAGES_AVATAR, message, @@ -550,7 +545,6 @@ def add_admin_message(self, room: str, message: str) -> None: def create_message_item( self, - room: str, author: str, avatar: Optional[str], message: str, @@ -562,15 +556,14 @@ def create_message_item( Optionally with foreground / background colors given as hexa string """ item_data = [ - room, QTime.currentTime().toString(), author, message, ] item = QTreeWidgetItem(item_data) if self.settings.qchat_show_avatars and avatar: - item.setIcon(2, QIcon(QgsApplication.iconPath(avatar))) - item.setToolTip(3, message) + item.setIcon(1, QIcon(QgsApplication.iconPath(avatar))) + item.setToolTip(2, message) if foreground_color: for i in range(len(item_data)): item.setForeground(i, QBrush(QColor(foreground_color))) diff --git a/qtribu/gui/dck_qchat.ui b/qtribu/gui/dck_qchat.ui index 7e244c03..64362264 100644 --- a/qtribu/gui/dck_qchat.ui +++ b/qtribu/gui/dck_qchat.ui @@ -182,7 +182,7 @@ true - 4 + 3 true @@ -205,11 +205,6 @@ 3 - - - 4 - -
From 16d9e8bb8a5ce28886419197fb2ad408b40e52ed Mon Sep 17 00:00:00 2001 From: gounux Date: Fri, 26 Jul 2024 15:11:58 +0200 Subject: [PATCH 105/112] feat: display messages at the bottom and scroll --- qtribu/gui/dck_qchat.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index d4c0bcb0..e2274c0e 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -387,7 +387,8 @@ def on_ws_message_received(self, message: str) -> None: message["avatar"], message["message"], ) - self.twg_chat.insertTopLevelItem(0, item) + self.twg_chat.addTopLevelItem(item) + self.twg_chat.scrollToItem(item) # check if a notification sound should be played if ( @@ -541,7 +542,8 @@ def add_admin_message(self, room: str, message: str) -> None: message, foreground_color=self.settings.qchat_color_admin, ) - self.twg_chat.insertTopLevelItem(0, item) + self.twg_chat.addTopLevelItem(item) + self.twg_chat.scrollToItem(item) def create_message_item( self, From 2551fd445553194b51fb1a64c544326541b0f649 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 31 Jul 2024 14:01:47 +0100 Subject: [PATCH 106/112] feat: set focus to message lineedit when mentioning user --- qtribu/gui/dck_qchat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index e2274c0e..d2d3a186 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -420,6 +420,7 @@ def on_message_double_clicked(self, item: QTreeWidgetItem, column: int) -> None: text = self.lne_message.text() author = item.text(1) self.lne_message.setText(f"{text}@{author} ") + self.lne_message.setFocus() def on_custom_context_menu_requested(self, point: QPoint) -> None: """ From e7194cc86a6c8dc30837a4834e83940b30c6ea93 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 1 Aug 2024 22:52:46 +0200 Subject: [PATCH 107/112] update(docs): add PyQtWebEngine to recommended deps --- docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 9db78f9c..d7d69fab 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -4,7 +4,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles tierces non incluses dans le packaging de QGIS sur certaines plateformes : -- QGISChat: (Py)QtMutimedia, (Py)QtWebSockets +- QGISChat: (Py)QtMutimedia, (Py)QtWebEngine, (Py)QtWebSockets, ### Linux @@ -13,7 +13,7 @@ Certaines fonctionnalités du plugin reposent sur des dépendances logicielles t Ouvrir un terminal et exécuter la commande suivante : ```sh -sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebsockets +sudo apt install python3-pyqt5.qtmultimedia python3-pyqt5.qtwebengine python3-pyqt5.qtwebsockets ``` ---- From 10c1d19b054a5d8212a26c25455b8ab1741c3d24 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 21 Aug 2024 08:35:18 +0200 Subject: [PATCH 108/112] feat: display admin messages to false by default --- qtribu/toolbelt/preferences.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/toolbelt/preferences.py b/qtribu/toolbelt/preferences.py index 9a6ddb24..666228e0 100644 --- a/qtribu/toolbelt/preferences.py +++ b/qtribu/toolbelt/preferences.py @@ -39,7 +39,7 @@ class PlgSettingsStructure: # QChat qchat_instance_uri: str = "https://gischat.geotribu.net" qchat_activate_cheatcode: bool = True - qchat_display_admin_messages: bool = True + qchat_display_admin_messages: bool = False qchat_show_avatars: bool = True qchat_play_sounds: bool = True qchat_sound_volume: int = 33 From 55baea4e1918c8d7af5fe09eef1a7221e483a427 Mon Sep 17 00:00:00 2001 From: gounux Date: Wed, 21 Aug 2024 09:14:17 +0200 Subject: [PATCH 109/112] fix: fix multiple widget opened signal triggered when moving widget --- qtribu/gui/dck_qchat.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/qtribu/gui/dck_qchat.py b/qtribu/gui/dck_qchat.py index d2d3a186..229690cc 100644 --- a/qtribu/gui/dck_qchat.py +++ b/qtribu/gui/dck_qchat.py @@ -41,6 +41,7 @@ class QChatWidget(QgsDockWidget): + initialized: bool = False connected: bool = False current_room: Optional[str] = None @@ -133,6 +134,11 @@ def on_widget_opened(self) -> None: Action called when the widget is opened """ + # hack to bypass multiple widget opened triggers when moving widget + if self.initialized: + return + self.initialized = True + # fill fields from saved settings self.load_settings() @@ -264,15 +270,10 @@ def on_connect_button_clicked(self) -> None: return self.connect_to_room(room) - def connect_to_room(self, room: str, log: bool = True) -> None: + def connect_to_room(self, room: str) -> None: """ Connect widget to a specific room """ - if log and self.settings.qchat_display_admin_messages: - self.add_admin_message( - room, self.tr("Connected to room '{room}'").format(room=room) - ) - protocol, domain = self.settings.qchat_instance_uri.split("://") ws_protocol = "wss" if protocol == "https" else "ws" ws_instance_url = f"{ws_protocol}://{domain}" @@ -291,6 +292,10 @@ def on_ws_connected(self, room: str) -> None: self.current_room = room self.connected = True self.log(message=f"Websocket connected to room {room}") + if self.settings.qchat_display_admin_messages: + self.add_admin_message( + self.tr("Connected to room '{room}'").format(room=room) + ) def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: """ @@ -298,7 +303,6 @@ def disconnect_from_room(self, log: bool = True, close_ws: bool = True) -> None: """ if log and self.settings.qchat_display_admin_messages: self.add_admin_message( - self.current_room, self.tr("Disconnected from room '{room}'").format( room=self.current_room ), @@ -325,7 +329,7 @@ def on_ws_error(self, error_code: int) -> None: Action called when an error appears on the websocket """ if self.settings.qchat_display_admin_messages: - self.add_admin_message(self.tr("ERROR"), self.ws_client.errorString()) + self.add_admin_message(self.ws_client.errorString()) self.log( message=f"{error_code}: {self.ws_client.errorString()}", log_level=Qgis.Critical, @@ -533,7 +537,7 @@ def on_send_button_clicked(self) -> None: self.ws_client.sendTextMessage(json.dumps(message)) self.lne_message.setText("") - def add_admin_message(self, room: str, message: str) -> None: + def add_admin_message(self, message: str) -> None: """ Adds an admin message to QTreeWidget chat """ @@ -582,6 +586,7 @@ def on_widget_closed(self) -> None: if self.connected: self.disconnect_from_room() self.cbb_room.currentIndexChanged.disconnect() + self.initialized = False def check_cheatcode(self, message: dict[str, str]) -> bool: """ From ad8e5bddba79b8e1d939a24cf8c58dc736bd289b Mon Sep 17 00:00:00 2001 From: gounux Date: Thu, 29 Aug 2024 08:49:03 +0200 Subject: [PATCH 110/112] add cow notif sound --- qtribu/gui/dlg_settings.ui | 5 +++++ qtribu/resources/sounds/cow.ogg | Bin 0 -> 20148 bytes 2 files changed, 5 insertions(+) create mode 100644 qtribu/resources/sounds/cow.ogg diff --git a/qtribu/gui/dlg_settings.ui b/qtribu/gui/dlg_settings.ui index 2ec01b6d..730ea4d5 100644 --- a/qtribu/gui/dlg_settings.ui +++ b/qtribu/gui/dlg_settings.ui @@ -475,6 +475,11 @@ chicken + + + cow + + diff --git a/qtribu/resources/sounds/cow.ogg b/qtribu/resources/sounds/cow.ogg new file mode 100644 index 0000000000000000000000000000000000000000..07290503e1459dfc2d317642caae4cc11b22dea0 GIT binary patch literal 20148 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 CEH^^{ literal 0 HcmV?d00001 From c213c2dfb15ae3a695af0c03a6d273663923b854 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 29 Aug 2024 22:47:01 +0200 Subject: [PATCH 111/112] fix(import): QChatWidget --- qtribu/plugin_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index b5a8ddca..f78779cc 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -18,11 +18,11 @@ # project from qtribu.__about__ import DIR_PLUGIN_ROOT, __icon_path__, __title__, __uri_homepage__ from qtribu.constants import ICON_ARTICLE, ICON_GEORDP +from qtribu.gui.dck_qchat import QChatWidget from qtribu.gui.dlg_contents import GeotribuContentsDialog from qtribu.gui.dlg_settings import PlgOptionsFactory from qtribu.gui.form_article import ArticleForm from qtribu.gui.form_rdp_news import RdpNewsForm -from qtribu.gui.wdg_qchat import QChatWidget from qtribu.logic.news_feed.rss_reader import RssMiniReader from qtribu.logic.splash_changer import SplashChanger from qtribu.toolbelt import PlgLogger, PlgOptionsManager From 84a74a50da63df2df7ad3d081cc06c1db518abd6 Mon Sep 17 00:00:00 2001 From: "Julien M." Date: Thu, 29 Aug 2024 22:49:54 +0200 Subject: [PATCH 112/112] fix(import): unload action_contents --- qtribu/plugin_main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qtribu/plugin_main.py b/qtribu/plugin_main.py index f78779cc..22633242 100644 --- a/qtribu/plugin_main.py +++ b/qtribu/plugin_main.py @@ -236,7 +236,6 @@ def unload(self): self.iface.removePluginWebMenu(__title__, self.action_form_rdp_news) self.iface.removePluginWebMenu(__title__, self.action_show_latest_content) self.iface.removePluginWebMenu(__title__, self.action_open_chat) - self.iface.removePluginWebMenu(__title__, self.action_contents) self.iface.removePluginWebMenu(__title__, self.action_settings) self.iface.removePluginWebMenu(__title__, self.action_splash)