Skip to content

Commit b40fc69

Browse files
authored
feature(qchat): share QML style when sending geojson vector in ws (#235)
1 parent c43591d commit b40fc69

File tree

5 files changed

+65
-27
lines changed

5 files changed

+65
-27
lines changed

qtribu/gui/dck_qchat.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# standard
22
import base64
33
import json
4-
import os
54
import tempfile
65
from functools import partial
76
from pathlib import Path
@@ -860,8 +859,8 @@ def on_send_screenshot_button_clicked(self) -> None:
860859
Action called when the Send QGIS screenshot button is clicked
861860
"""
862861

863-
sc_fp = os.path.join(tempfile.gettempdir(), "qgis_screenshot.png")
864-
self.iface.mapCanvas().saveAsImage(sc_fp)
862+
sc_fp = Path(tempfile.gettempdir()) / "qgis_screenshot.png"
863+
self.iface.mapCanvas().saveAsImage(str(sc_fp))
865864
with open(sc_fp, "rb") as file:
866865
data = file.read()
867866
message = QChatImageMessage(
@@ -1030,6 +1029,16 @@ def on_send_layer_to_qchat(self) -> None:
10301029
exporter.setDestinationCrs(layer.crs())
10311030
exporter.setTransformGeometries(True)
10321031
geojson_str = exporter.exportFeatures(layer.getFeatures())
1032+
1033+
# save and read QML style to and from temp file
1034+
save_style_path = Path(tempfile.gettempdir()) / "qchat_layer_style.qml"
1035+
layer.saveNamedStyle(
1036+
str(save_style_path),
1037+
categories=QgsMapLayer.StyleCategory.AllStyleCategories,
1038+
)
1039+
with open(save_style_path, "r", encoding="utf-8") as file:
1040+
qml_style = file.read()
1041+
10331042
message = QChatGeojsonMessage(
10341043
type=QCHAT_MESSAGE_TYPE_GEOJSON,
10351044
author=self.settings.author_nickname,
@@ -1038,5 +1047,6 @@ def on_send_layer_to_qchat(self) -> None:
10381047
crs_wkt=layer.crs().toWkt(),
10391048
crs_authid=layer.crs().authid(),
10401049
geojson=json.loads(geojson_str),
1050+
style=qml_style,
10411051
)
10421052
self.qchat_ws.send_message(message)

qtribu/gui/qchat_tree_widget_items.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import base64
22
import json
3-
import os
43
import tempfile
4+
from pathlib import Path
55
from typing import Optional
66

77
from qgis.core import (
88
QgsApplication,
99
QgsCoordinateReferenceSystem,
1010
QgsCoordinateTransform,
11+
QgsMapLayer,
1112
QgsPointXY,
1213
QgsProject,
1314
QgsRectangle,
@@ -223,14 +224,27 @@ def __init__(self, parent: QTreeWidget, message: QChatGeojsonMessage):
223224
def on_click(self, column: int) -> None:
224225
if column == MESSAGE_COLUMN:
225226
# save geojson to temp file
226-
save_path = os.path.join(
227-
tempfile.gettempdir(), f"{self.message.layer_name}.geojson"
227+
save_path = (
228+
Path(tempfile.gettempdir()) / f"{self.message.layer_name}.geojson"
228229
)
229230
with open(save_path, "w") as file:
230231
json.dump(self.message.geojson, file)
232+
233+
# save QML style to temp file
234+
save_style_path = (
235+
Path(tempfile.gettempdir()) / f"{self.message.layer_name}_style.qml"
236+
)
237+
with open(save_style_path, "w", encoding="utf-8") as style_file:
238+
style_file.write(self.message.style)
239+
231240
# load geojson file into QGIS
232-
layer = QgsVectorLayer(save_path, self.message.layer_name, "ogr")
241+
layer = QgsVectorLayer(str(save_path), self.message.layer_name, "ogr")
233242
layer.setCrs(QgsCoordinateReferenceSystem.fromWkt(self.message.crs_wkt))
243+
layer.loadNamedStyle(
244+
str(save_style_path),
245+
loadFromLocalDb=False,
246+
categories=QgsMapLayer.StyleCategory.AllStyleCategories,
247+
)
234248
QgsProject.instance().addMapLayer(layer)
235249

236250
@property

qtribu/logic/qchat_messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class QChatGeojsonMessage(QChatMessage):
5656
crs_wkt: str
5757
crs_authid: str
5858
geojson: dict
59+
style: Optional[str]
5960

6061

6162
@dataclass(init=True, frozen=True)

qtribu/logic/qchat_websocket.py

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
QChatUncompliantMessage,
3535
)
3636
from qtribu.toolbelt import PlgLogger
37+
from qtribu.toolbelt.exceptions import QChatMessageCanNotBeParsedException
3738

3839
# conditional import depending on Qt version
3940
if int(QT_VERSION_STR.split(".")[0]) == 5:
@@ -133,23 +134,33 @@ def on_message_received(self, text: str) -> None:
133134
)
134135
return
135136
msg_type = message["type"]
136-
if msg_type == QCHAT_MESSAGE_TYPE_UNCOMPLIANT:
137-
self.uncompliant_message_received.emit(QChatUncompliantMessage(**message))
138-
elif msg_type == QCHAT_MESSAGE_TYPE_TEXT:
139-
self.text_message_received.emit(QChatTextMessage(**message))
140-
elif msg_type == QCHAT_MESSAGE_TYPE_IMAGE:
141-
self.image_message_received.emit(QChatImageMessage(**message))
142-
elif msg_type == QCHAT_MESSAGE_TYPE_NB_USERS:
143-
self.nb_users_message_received.emit(QChatNbUsersMessage(**message))
144-
elif msg_type == QCHAT_MESSAGE_TYPE_NEWCOMER:
145-
self.newcomer_message_received.emit(QChatNewcomerMessage(**message))
146-
elif msg_type == QCHAT_MESSAGE_TYPE_EXITER:
147-
self.exiter_message_received.emit(QChatExiterMessage(**message))
148-
elif msg_type == QCHAT_MESSAGE_TYPE_LIKE:
149-
self.like_message_received.emit(QChatLikeMessage(**message))
150-
elif msg_type == QCHAT_MESSAGE_TYPE_GEOJSON:
151-
self.geojson_message_received.emit(QChatGeojsonMessage(**message))
152-
elif msg_type == QCHAT_MESSAGE_TYPE_CRS:
153-
self.crs_message_received.emit(QChatCrsMessage(**message))
154-
elif msg_type == QCHAT_MESSAGE_TYPE_BBOX:
155-
self.bbox_message_received.emit(QChatBboxMessage(**message))
137+
try:
138+
if msg_type == QCHAT_MESSAGE_TYPE_UNCOMPLIANT:
139+
self.uncompliant_message_received.emit(
140+
QChatUncompliantMessage(**message)
141+
)
142+
elif msg_type == QCHAT_MESSAGE_TYPE_TEXT:
143+
self.text_message_received.emit(QChatTextMessage(**message))
144+
elif msg_type == QCHAT_MESSAGE_TYPE_IMAGE:
145+
self.image_message_received.emit(QChatImageMessage(**message))
146+
elif msg_type == QCHAT_MESSAGE_TYPE_NB_USERS:
147+
self.nb_users_message_received.emit(QChatNbUsersMessage(**message))
148+
elif msg_type == QCHAT_MESSAGE_TYPE_NEWCOMER:
149+
self.newcomer_message_received.emit(QChatNewcomerMessage(**message))
150+
elif msg_type == QCHAT_MESSAGE_TYPE_EXITER:
151+
self.exiter_message_received.emit(QChatExiterMessage(**message))
152+
elif msg_type == QCHAT_MESSAGE_TYPE_LIKE:
153+
self.like_message_received.emit(QChatLikeMessage(**message))
154+
elif msg_type == QCHAT_MESSAGE_TYPE_GEOJSON:
155+
self.geojson_message_received.emit(QChatGeojsonMessage(**message))
156+
elif msg_type == QCHAT_MESSAGE_TYPE_CRS:
157+
self.crs_message_received.emit(QChatCrsMessage(**message))
158+
elif msg_type == QCHAT_MESSAGE_TYPE_BBOX:
159+
self.bbox_message_received.emit(QChatBboxMessage(**message))
160+
except KeyError:
161+
text = self.tr(
162+
"Unintelligible message received. Please make sure you are using the latest plugin version. (type={type})"
163+
).format(type=msg_type)
164+
message = QChatUncompliantMessage(reason=text)
165+
self.uncompliant_message_received.emit(message)
166+
raise QChatMessageCanNotBeParsedException(message=text)

qtribu/toolbelt/exceptions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class QChatMessageCanNotBeParsedException(Exception):
2+
pass

0 commit comments

Comments
 (0)