Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions qchat/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@
QFIELD_PLUGIN_INSTALLATION_URL = (
"https://geotribu.github.io/qchat/usage/installation.html"
)

# Emojis
QUICK_EMOJIS = ("😀", "😂", "❤️", "👍", "🎉", "🔥")
80 changes: 74 additions & 6 deletions qchat/gui/dck_qchat.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
from qgis.gui import QgisInterface, QgsDockWidget
from qgis.PyQt import uic
from qgis.PyQt.QtCore import QPoint, Qt
from qgis.PyQt.QtGui import QCursor, QIcon
from qgis.PyQt.QtGui import QCursor, QFont, QIcon
from qgis.PyQt.QtWidgets import (
QAction,
QFileDialog,
QMenu,
QMessageBox,
QToolButton,
QTreeWidgetItem,
QWidget,
)
Expand All @@ -43,7 +44,9 @@
QCHAT_MESSAGE_TYPE_TEXT,
QCHAT_NICKNAME_MAXLENGTH_DEFAULT,
QCHAT_NICKNAME_MINLENGTH,
QUICK_EMOJIS,
)
from qchat.gui.emojis.dlg_emoji_picker_full import FullEmojiPicker
from qchat.gui.qchat_tree_widget_items import (
MESSAGE_COLUMN,
QChatAdminTreeWidgetItem,
Expand Down Expand Up @@ -72,6 +75,7 @@
from qchat.tasks.dizzy import DizzyTask
from qchat.toolbelt import PlgLogger, PlgOptionsManager
from qchat.toolbelt.commons import open_url_in_browser, play_resource_sound
from qchat.toolbelt.font_helper import PlgFontHelper
from qchat.toolbelt.preferences import PlgSettingsStructure

# -- GLOBALS --
Expand Down Expand Up @@ -105,6 +109,8 @@ def __init__(
self.task_manager = QgsApplication.taskManager()
self.log = PlgLogger().log
self.plg_settings = PlgOptionsManager()
self.font_helper = PlgFontHelper()

uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self)

# set channel to autoreconnect to when widget will open
Expand Down Expand Up @@ -191,6 +197,11 @@ def __init__(
QIcon(QgsApplication.iconPath("mActionDoubleArrowRight.svg"))
)

# emoji picker
self.emojis_full_picker: Optional[FullEmojiPicker] = None
self.btn_emojis_picker: QToolButton
self._setup_emoji_button()

# send image message signal listener
self.btn_send_image.pressed.connect(self.on_send_image_button_clicked)
self.btn_send_image.setIcon(
Expand All @@ -215,6 +226,14 @@ def __init__(
QIcon(QgsApplication.iconPath("mActionSetProjection.svg"))
)

# set configured font
self.lne_message.setFont(self.messages_font)

@property
def messages_font(self) -> QFont:
"""Get messages text font."""
return self.font_helper.get_font_from_settings(self.settings)

@property
def settings(self) -> PlgSettingsStructure:
return self.plg_settings.get_plg_settings()
Expand All @@ -231,9 +250,7 @@ def load_settings(self) -> None:
self.btn_send.setIcon(QIcon(QgsApplication.iconPath(self.settings.avatar)))

def on_widget_opened(self) -> None:
"""
Action called when the widget is opened
"""
"""Action called when the widget is opened."""

# hack to bypass multiple widget opened triggers when moving widget
if self.initialized:
Expand Down Expand Up @@ -957,14 +974,26 @@ def on_send_crs_button_clicked(self) -> None:
self.qchat_ws.send_message(message)

def add_admin_message(self, text: str, timestamp: Optional[int] = None) -> None:
"""Adds an admin message to QTreeWidget chat.

:param text: admin message to insert
:type text: str
:param timestamp: datetime, defaults to None
:type timestamp: Optional[int], optional
"""
Adds an admin message to QTreeWidget chat
"""

item = QChatAdminTreeWidgetItem(self.twg_chat, text, timestamp)
self.add_tree_widget_item(item)

def add_tree_widget_item(self, item: QTreeWidgetItem) -> None:
"""Adds a QTreeWidgetItem to the chat QTreeWidget.

:param item: item to insert
:type item: QTreeWidgetItem
"""
self.twg_chat.addTopLevelItem(item)
if isinstance(item, QChatTextTreeWidgetItem):
item.setFont(MESSAGE_COLUMN, self.messages_font)
Comment on lines +995 to +996
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce qu'on pourrait pas mettre ça dans le init d'un QChatTextTreeWidgetItem ?

self.message = message
self.init_time_and_author()
self.setText(MESSAGE_COLUMN, message.text)
self.setToolTip(MESSAGE_COLUMN, message.text)

if self.ckb_autoscroll.isChecked():
self.twg_chat.scrollToItem(item)

Expand Down Expand Up @@ -1155,3 +1184,42 @@ def on_send_geojson_layer_to_qchat(self) -> None:
style=qml_style,
)
self.qchat_ws.send_message(message)

# -- EMOJIS --
def insert_emoji(self, emoji):
"""Insert selected emoji at cursor position"""
cursor_pos = self.lne_message.cursorPosition()
current_text = self.lne_message.text()
new_text = current_text[:cursor_pos] + emoji + " " + current_text[cursor_pos:]
self.lne_message.setText(new_text)
self.lne_message.setCursorPosition(cursor_pos + len(emoji) + 1)
self.lne_message.setFocus()

def _setup_emoji_button(self) -> None:
"""Setup emoji button with dropdown menu"""
self.btn_emojis_picker.setFont(self.messages_font)

default_action = QAction(
text=self.tr("..."),
parent=self.btn_emojis_picker,
triggered=self.show_full_picker,
)
default_action.setToolTip(self.tr("Open full emoji picker"))
self.btn_emojis_picker.setDefaultAction(default_action)
self.btn_emojis_picker.setText("😀") # Add emoji to button text

# populate dropdown list
for emoji in QUICK_EMOJIS:
action = QAction(emoji, self)
action.setData(emoji)
action.setFont(self.messages_font)
action.triggered.connect(partial(self.insert_emoji, emoji))
self.btn_emojis_picker.addAction(action)

def show_full_picker(self):
"""Show the full emoji picker dialog"""
if self.emojis_full_picker is None:
self.emojis_full_picker = FullEmojiPicker(self)
self.emojis_full_picker.emoji_selected.connect(self.insert_emoji)

self.emojis_full_picker.exec()
55 changes: 53 additions & 2 deletions qchat/gui/dck_qchat.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>446</width>
<height>887</height>
<width>467</width>
<height>894</height>
</rect>
</property>
<property name="sizePolicy">
Expand Down Expand Up @@ -219,6 +219,11 @@
<property name="text">
<string notr="true">3</string>
</property>
<property name="font">
<font>
<kerning>false</kerning>
</font>
</property>
</column>
</widget>
</item>
Expand Down Expand Up @@ -284,11 +289,57 @@
</item>
<item>
<widget class="QgsFilterLineEdit" name="lne_message">
<property name="font">
<font>
<family>Noto Color Emoji</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="placeholderText">
<string>Type your message here...</string>
</property>
<property name="qgisRelation" stdset="0">
<string notr="true"/>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btn_emojis_picker">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Noto Color Emoji</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="contextMenuPolicy">
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="toolTip">
<string>Pick an emoji to insert</string>
</property>
<property name="text">
<string notr="true">😀</string>
</property>
<property name="popupMode">
<enum>QToolButton::MenuButtonPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonFollowStyle</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_send">
<property name="cursor">
Expand Down
46 changes: 31 additions & 15 deletions qchat/gui/dlg_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,39 +31,33 @@
from qchat.logic.qchat_api_client import QChatApiClient
from qchat.toolbelt import PlgLogger, PlgOptionsManager
from qchat.toolbelt.commons import play_resource_sound
from qchat.toolbelt.font_helper import PlgFontHelper
from qchat.toolbelt.preferences import PlgSettingsStructure

# ############################################################################
# ########## Globals ###############
# ##################################

FORM_CLASS, _ = uic.loadUiType(
Path(__file__).parent / "{}.ui".format(Path(__file__).stem)
)


# ############################################################################
# ########## Classes ###############
# ##################################


class ConfigOptionsPage(FORM_CLASS, QgsOptionsPageWidget):
class ConfigOptionsPage(QgsOptionsPageWidget):
"""Settings form embedded into QGIS 'options' menu."""

def __init__(self, parent):
super().__init__(parent)
self.font_helper = PlgFontHelper()
self.log = PlgLogger().log
self.plg_settings = PlgOptionsManager()

# load UI and set objectName
self.setupUi(self)
uic.loadUi(Path(__file__).parent / f"{Path(__file__).stem}.ui", self)
# self.setupUi(self)
self.setObjectName("mOptionsPage{}".format(__title__))

report_context_message = quote(
"> Reported from plugin settings\n\n"
f"- operating system: {platform.system()} "
f"{platform.release()}_{platform.version()}\n"
f"- QGIS: {Qgis.QGIS_VERSION}"
f"- QGIS: {Qgis.QGIS_VERSION}\n"
f"- plugin version: {__version__}\n"
)

Expand Down Expand Up @@ -102,8 +96,13 @@ def __init__(self, parent):
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")))

self.cbb_ring_tone.currentIndexChanged.connect(self.on_ring_tone_changed)
self.cbb_font.currentFontChanged.connect(self.on_font_changed)
self.spb_font_size.valueChanged.connect(self.on_font_changed)
self.btn_download_emoji_font.setIcon(
QgsApplication.getThemeIcon("downloading_svg.svg")
)
self.btn_download_emoji_font.pressed.connect(self.font_helper.download_font)

# load previously saved settings
self.load_settings()
Expand Down Expand Up @@ -136,6 +135,10 @@ def apply(self):
settings.color_self = self.cbt_color_self.color().name()
settings.color_admin = self.cbt_color_admin.color().name()

# emojis
settings.messages_font_family = self.cbb_font.currentFont().toString()
settings.messages_font_size_pts = self.spb_font_size.value()

# misc
settings.debug_mode = self.opt_debug.isChecked()
settings.version = __version__
Expand All @@ -153,9 +156,8 @@ def load_settings(self):
"""Load options from QgsSettings into UI form."""
settings = self.plg_settings.get_plg_settings()

# Identity
self.lne_qchat_nickname.setText(settings.nickname)

# retrieve avatar among values
if settings.avatar in QCHAT_USER_AVATARS.values():
self.cbb_qchat_avatar.setCurrentIndex(
list(QCHAT_USER_AVATARS.values()).index(settings.avatar)
Expand All @@ -170,6 +172,7 @@ def load_settings(self):
)
self.cbb_qchat_avatar.setCurrentIndex(4)

# Other
instance_index = self.cbb_qchat_instance_uri.findText(
settings.instance_uri, Qt.MatchFlag.MatchFixedString
)
Expand All @@ -193,6 +196,13 @@ def load_settings(self):
self.cbt_color_self.setColor(QColor(settings.color_self))
self.cbt_color_admin.setColor(QColor(settings.color_admin))

# emojis
self.cbb_font.setCurrentFont(
self.font_helper.get_font_from_settings(plugin_settings=settings)
)
self.spb_font_size.setValue(settings.messages_font_size_pts)
self.on_font_changed()

# global
self.opt_debug.setChecked(settings.debug_mode)
self.lbl_version_saved_value.setText(settings.version)
Expand Down Expand Up @@ -287,6 +297,12 @@ def on_ring_tone_changed(self) -> None:
self.cbb_ring_tone.currentText(), self.hsl_sound_volume.value()
)

def on_font_changed(self) -> None:
"""When a font is selected, it's applied to the font label."""
picked_font = self.cbb_font.currentFont()
picked_font.setPointSize(self.spb_font_size.value())
self.lbl_font.setFont(picked_font)


class PlgOptionsFactory(QgsOptionsWidgetFactory):
"""Factory for options widget."""
Expand Down
Loading
Loading