Daniel Brötzmann pushed to branch newcontrol at gajim / gajim
Commits: 9dd83e35 by wurstsalat at 2022-07-29T21:15:29+02:00 fix: BaseControl: Fix displaying received GcMessage events
- - - - - b44ea8f3 by wurstsalat at 2022-07-29T21:21:39+02:00 refactor: Control: Move drag and drop handling to ChatStack
- - - - -
5 changed files:
- gajim/data/gui/chat_control.ui - gajim/gtk/chat_stack.py - gajim/gtk/controls/base.py - gajim/gtk/controls/chat.py - gajim/gtk/controls/groupchat.py
Changes:
===================================== gajim/data/gui/chat_control.ui ===================================== @@ -45,49 +45,4 @@ </packing> </child> </object> - <object class="GtkBox" id="drop_area"> - <property name="name">DropArea</property> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="no-show-all">True</property> - <property name="opacity">0.90</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> - <property name="orientation">vertical</property> - <property name="spacing">18</property> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="valign">end</property> - <property name="vexpand">True</property> - <property name="icon-name">mail-attachment-symbolic</property> - <property name="icon_size">6</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="valign">start</property> - <property name="vexpand">True</property> - <property name="label" translatable="yes">Drop Files or Contacts</property> - <property name="wrap">True</property> - <property name="max-width-chars">40</property> - <style> - <class name="bold16"/> - </style> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> </interface>
===================================== gajim/gtk/chat_stack.py ===================================== @@ -43,6 +43,7 @@
from .chat_banner import ChatBanner from .chat_function_page import ChatFunctionPage +from .const import TARGET_TYPE_URI_LIST from .control_stack import ControlStack from .controls.groupchat import GroupchatControl from .message_actions_box import MessageActionsBox @@ -59,6 +60,8 @@ def __init__(self): self.set_vexpand(True) self.set_hexpand(True)
+ self._current_contact: Optional[ChatContactT] = None + self.add_named(ChatPlaceholderBox(), 'empty')
self._chat_function_page = ChatFunctionPage() @@ -77,9 +80,51 @@ def __init__(self): box.add(Gtk.Separator()) box.add(self._message_action_box)
- self._current_contact: Optional[ChatContactT] = None - - self.add_named(box, 'controls') + dnd_icon = Gtk.Image.new_from_icon_name( + 'mail-attachment-symbolic', Gtk.IconSize.DIALOG) + dnd_icon.set_vexpand(True) + dnd_icon.set_valign(Gtk.Align.END) + dnd_label = Gtk.Label(label=_('Drop files or contacts')) + dnd_label.set_max_width_chars(40) + dnd_label.set_vexpand(True) + dnd_label.set_valign(Gtk.Align.START) + dnd_label.get_style_context().add_class('bold16') + + self._drop_area = Gtk.Box( + orientation=Gtk.Orientation.VERTICAL, spacing=18) + self._drop_area.set_no_show_all(True) + self._drop_area.set_hexpand(True) + self._drop_area.set_vexpand(True) + self._drop_area.set_name('DropArea') + self._drop_area.add(dnd_icon) + self._drop_area.add(dnd_label) + + overlay = Gtk.Overlay() + overlay.add_overlay(self._drop_area) + overlay.add(box) + overlay.connect('drag-data-received', self._on_drag_data_received) + overlay.connect('drag-motion', self._on_drag_motion) + overlay.connect('drag-leave', self._on_drag_leave) + + uri_entry = Gtk.TargetEntry.new( + 'text/uri-list', + Gtk.TargetFlags.OTHER_APP, + TARGET_TYPE_URI_LIST) + dnd_list = [uri_entry, + Gtk.TargetEntry.new( + 'OBJECT_DROP', + Gtk.TargetFlags.SAME_APP, + 0)] + dst_targets = Gtk.TargetList.new([uri_entry]) + dst_targets.add_text_targets(0) + + overlay.drag_dest_set( + Gtk.DestDefaults.ALL, + dnd_list, + Gdk.DragAction.COPY | Gdk.DragAction.MOVE) + overlay.drag_dest_set_target_list(dst_targets) + + self.add_named(overlay, 'controls')
self._connect_actions() self.show_all() @@ -484,6 +529,45 @@ def _on_stateful_action(self, action.set_state(param) contact.settings.set('send_marker', param.get_boolean())
+ def _on_drag_data_received(self, + _widget: Gtk.Widget, + _context: Gdk.DragContext, + _x_coord: int, + _y_coord: int, + selection: Gtk.SelectionData, + target_type: int, + _timestamp: int + ) -> None: + if not selection.get_data(): + return + + log.debug('Drop received: %s, %s', selection.get_data(), target_type) + + # TODO: Contact drag and drop for invitations (AdHoc MUC/MUC) + if target_type == TARGET_TYPE_URI_LIST: + control = app.window.get_active_control() + if control is not None: + control.drag_data_file_transfer(selection) + + def _on_drag_leave(self, + _widget: Gtk.Widget, + _context: Gdk.DragContext, + _time: int + ) -> None: + self._drop_area.set_no_show_all(True) + self._drop_area.hide() + + def _on_drag_motion(self, + _widget: Gtk.Widget, + _context: Gdk.DragContext, + _x_coord: int, + _y_coord: int, + _time: int + ) -> bool: + self._drop_area.set_no_show_all(False) + self._drop_area.show_all() + return True + def _show_chat_function_page(self, function: str, data: Optional[str] = None
===================================== gajim/gtk/controls/base.py ===================================== @@ -65,7 +65,6 @@ from gajim.gui.builder import get_builder from gajim.gui.util import set_urgency_hint from gajim.gui.const import ControlType -from gajim.gui.const import TARGET_TYPE_URI_LIST
from gajim.command_system.implementation.middleware import ChatCommandProcessor from gajim.command_system.implementation.middleware import CommandTools @@ -121,32 +120,6 @@ def __init__(self, widget_name: str, account: str, jid: JID) -> None: self.xml = get_builder('chat_control.ui') self.widget = cast(Gtk.Box, self.xml.get_object('control_box'))
- # Drag and drop - self.xml.overlay.add_overlay(self.xml.drop_area) - self.xml.drop_area.hide() - self.xml.overlay.connect( - 'drag-data-received', self._on_drag_data_received) - self.xml.overlay.connect('drag-motion', self._on_drag_motion) - self.xml.overlay.connect('drag-leave', self._on_drag_leave) - - uri_entry = Gtk.TargetEntry.new( - 'text/uri-list', - Gtk.TargetFlags.OTHER_APP, - TARGET_TYPE_URI_LIST) - dst_targets = Gtk.TargetList.new([uri_entry]) - dst_targets.add_text_targets(0) - self._dnd_list = [uri_entry, - Gtk.TargetEntry.new( - 'MY_TREE_MODEL_ROW', - Gtk.TargetFlags.SAME_APP, - 0)] - - self.xml.overlay.drag_dest_set( - Gtk.DestDefaults.ALL, - self._dnd_list, - Gdk.DragAction.COPY | Gdk.DragAction.MOVE) - self.xml.overlay.drag_dest_set_target_list(dst_targets) - # Create ConversationView and connect signals self.conversation_view = ConversationView(self.account, self.contact)
@@ -230,7 +203,7 @@ def process_event(self, event: events.ApplicationEvent) -> None: self.conversation_view.update_call_rows() return
- if isinstance(event, events.MessageReceived): + if isinstance(event, events.MessageReceived) and not self.is_groupchat: self._on_message_received(event) return
@@ -396,38 +369,6 @@ def _on_autoscroll_changed(self, def _on_jump_to_end(self, _button: Gtk.Button) -> None: self.reset_view()
- def _on_drag_data_received(self, - widget: Gtk.Widget, - context: Gdk.DragContext, - x_coord: int, - y_coord: int, - selection: Gtk.SelectionData, - target_type: int, - timestamp: int - ) -> None: - """ - Derived types SHOULD implement this - """ - - def _on_drag_leave(self, - _widget: Gtk.Widget, - _context: Gdk.DragContext, - _time: int - ) -> None: - self.xml.drop_area.set_no_show_all(True) - self.xml.drop_area.hide() - - def _on_drag_motion(self, - _widget: Gtk.Widget, - _context: Gdk.DragContext, - _x_coord: int, - _y_coord: int, - _time: int - ) -> bool: - self.xml.drop_area.set_no_show_all(False) - self.xml.drop_area.show_all() - return True - def drag_data_file_transfer(self, selection: Gtk.SelectionData) -> None: # we may have more than one file dropped uri_splitted = selection.get_uris()
===================================== gajim/gtk/controls/chat.py ===================================== @@ -31,9 +31,6 @@
import logging
-from gi.repository import Gtk -from gi.repository import Gdk - from nbxmpp import JID from nbxmpp.const import Chatstate from nbxmpp.modules.security_labels import Displaymarking @@ -46,7 +43,6 @@ from gajim.common.modules.contacts import BareContact
from gajim.gui.controls.base import BaseControl -from gajim.gui.const import TARGET_TYPE_URI_LIST from gajim.gui.const import ControlType
from gajim.command_system.implementation.hosts import ChatCommands @@ -197,25 +193,6 @@ def shutdown(self) -> None: super(ChatControl, self).shutdown() app.check_finalize(self)
- def _on_drag_data_received(self, - widget: Gtk.Widget, - context: Gdk.DragContext, - x_coord: int, - y_coord: int, - selection: Gtk.SelectionData, - target_type: int, - timestamp: int - ) -> None: - if not selection.get_data(): - return - - log.debug('Drop received: %s, %s', selection.get_data(), target_type) - - # TODO: Contact drag and drop for AdHocMUC - if target_type == TARGET_TYPE_URI_LIST: - # File drag and drop (handled in chat_control_base) - self.drag_data_file_transfer(selection) - def _on_presence_received(self, event: events.PresenceReceived) -> None: if not app.settings.get('print_status_in_chats'): return
===================================== gajim/gtk/controls/groupchat.py ===================================== @@ -37,7 +37,6 @@ from nbxmpp.structs import MucSubject
from gi.repository import Gtk -from gi.repository import Gdk
from gajim.common import app from gajim.common import events @@ -55,7 +54,6 @@ from gajim.command_system.implementation.hosts import GroupChatCommands
from gajim.gui.const import ControlType -from gajim.gui.const import TARGET_TYPE_URI_LIST from gajim.gui.dialogs import DialogButton from gajim.gui.dialogs import ConfirmationDialog from gajim.gui.groupchat_roster import GroupchatRoster @@ -635,22 +633,3 @@ def shutdown(self, reason: Optional[str] = None) -> None:
super(GroupchatControl, self).shutdown() app.check_finalize(self) - - def _on_drag_data_received(self, - widget: Gtk.Widget, - context: Gdk.DragContext, - x_coord: int, - y_coord: int, - selection: Gtk.SelectionData, - target_type: int, - timestamp: int - ) -> None: - if not selection.get_data(): - return - - log.debug('Drop received: %s, %s', selection.get_data(), target_type) - - # TODO: Contact drag and drop for Invitations - if target_type == TARGET_TYPE_URI_LIST: - # File drag and drop (handled in chat_control_base) - self.drag_data_file_transfer(selection)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/3d8ac70c960e51c3080bb9beb873da8f...