Philipp Hörist pushed to branch master at gajim / gajim
Commits: 93057ab6 by Daniel Brötzmann at 2019-06-20T12:04:58Z Rework file transfer windows
- - - - -
5 changed files:
- gajim/data/gui/filetransfers.ui - gajim/data/gui/send_file_dialog.ui → gajim/data/gui/filetransfers_send_file_dialog.ui - gajim/data/style/gajim.css - gajim/gtk/filetransfer.py - gajim/gtk/tooltips.py
Changes:
===================================== gajim/data/gui/filetransfers.ui ===================================== @@ -1,89 +1,133 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.20.1 --> +<!-- Generated with glade 3.22.1 --> <interface> - <requires lib="gtk+" version="3.12"/> + <requires lib="gtk+" version="3.20"/> <object class="GtkAccelGroup" id="accelgroup1"/> <object class="GtkMenu" id="file_transfers_menu"> <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="remove_menuitem"> + <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">_Remove</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_remove_menuitem_activate" swapped="no"/> - </object> - </child> - <child> - <object class="GtkMenuItem" id="continue_menuitem"> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes">Con_tinue</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_continue_menuitem_activate" swapped="no"/> + <signal name="activate" handler="_on_remove_menuitem_activate" swapped="no"/> </object> </child> <child> - <object class="GtkMenuItem" id="pause_menuitem"> + <object class="GtkMenuItem" id="pause_resume_menuitem"> + <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">_Pause</property> + <property name="label" translatable="yes">Pa_use/Resume</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_pause_menuitem_activate" swapped="no"/> + <signal name="activate" handler="_on_pause_resume_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkMenuItem" id="cancel_menuitem"> + <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">_Cancel</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_cancel_menuitem_activate" swapped="no"/> + <signal name="activate" handler="_on_cancel_menuitem_activate" swapped="no"/> </object> </child> <child> - <object class="GtkSeparatorMenuItem" id="separator11"> + <object class="GtkSeparatorMenuItem"> <property name="visible">True</property> <property name="can_focus">False</property> </object> </child> <child> <object class="GtkMenuItem" id="open_folder_menuitem"> + <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">_Open Containing Folder</property> + <property name="label" translatable="yes">_Open Folder</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_open_folder_menuitem_activate" swapped="no"/> + <signal name="activate" handler="_on_open_folder_menuitem_activate" swapped="no"/> </object> </child> </object> <object class="GtkWindow" id="file_transfers_window"> + <property name="width_request">500</property> + <property name="height_request">350</property> <property name="can_focus">False</property> - <property name="border_width">12</property> + <property name="border_width">18</property> <property name="title" translatable="yes">File Transfers</property> + <property name="window_position">center-always</property> + <property name="default_width">450</property> + <property name="default_height">350</property> <property name="type_hint">dialog</property> - <signal name="delete-event" handler="on_file_transfers_dialog_delete_event" swapped="no"/> - <signal name="key-press-event" handler="on_file_transfers_window_key_press_event" swapped="no"/> + <signal name="delete-event" handler="_on_file_transfers_dialog_delete_event" swapped="no"/> + <signal name="key-press-event" handler="_on_file_transfers_window_key_press_event" swapped="no"/> + <child type="titlebar"> + <placeholder/> + </child> <child> - <object class="GtkBox" id="vbox1"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> - <property name="spacing">6</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_bottom">6</property> + <property name="spacing">12</property> + <child> + <object class="GtkSwitch" id="notify_ft_complete"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <signal name="notify::active" handler="_on_notify_ft_complete_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</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="label" translatable="yes">_Show notification when file transfer is complete</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">notify_ft_complete</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkScrolledWindow" id="transfers_scrolledwindow"> <property name="width_request">460</property> <property name="height_request">150</property> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="transfers_list"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="enable_search">False</property> - <signal name="button-press-event" handler="on_transfers_list_button_press_event" swapped="no"/> - <signal name="button-release-event" handler="on_transfers_list_button_release_event" swapped="no"/> - <signal name="key-press-event" handler="on_transfers_list_key_press_event" swapped="no"/> - <signal name="row-activated" handler="on_transfers_list_row_activated" swapped="no"/> + <signal name="button-press-event" handler="_on_transfers_list_button_press_event" swapped="no"/> + <signal name="button-release-event" handler="_on_transfers_list_button_release_event" swapped="no"/> + <signal name="key-press-event" handler="_on_transfers_list_key_press_event" swapped="no"/> + <signal name="row-activated" handler="_on_transfers_list_row_activated" swapped="no"/> <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection1"/> + <object class="GtkTreeSelection"/> </child> <child internal-child="accessible"> <object class="AtkObject" id="transfers_list-atkobject"> @@ -97,132 +141,69 @@ <packing> <property name="expand">True</property> <property name="fill">True</property> - <property name="position">0</property> + <property name="position">1</property> </packing> </child> <child> - <object class="GtkButtonBox" id="hbuttonbox1"> + <object class="GtkToolbar"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="spacing">6</property> - <property name="layout_style">end</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> <child> - <object class="GtkButton" id="cleanup_button"> - <property name="label" translatable="yes">Clean _up</property> + <object class="GtkToolButton" id="cleanup_button"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Remove completed, cancelled and failed file transfers from the list</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_cleanup_button_clicked" swapped="no"/> - <child internal-child="accessible"> - <object class="AtkObject" id="cleanup_button-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property> - <property name="AtkObject::accessible-description" translatable="yes">This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed</property> - </object> - </child> + <property name="label" translatable="yes">toolbutton</property> + <property name="icon_name">edit-clear-all-symbolic</property> + <signal name="clicked" handler="_on_cleanup_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> + <property name="homogeneous">False</property> </packing> </child> <child> - <object class="GtkButton" id="pause_restore_button"> - <property name="label" translatable="yes">_Pause</property> + <object class="GtkToolButton" id="pause_resume_button"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Pause or resume file transfer</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_pause_restore_button_clicked" swapped="no"/> + <property name="icon_name">media-playback-pause-symbolic</property> + <signal name="clicked" handler="_on_pause_resume_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> + <property name="homogeneous">False</property> </packing> </child> <child> - <object class="GtkButton" id="cancel_button"> - <property name="label" translatable="yes">_Cancel</property> + <object class="GtkToolButton" id="cancel_button"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Cancel the selected file transfer and remove incomplete files</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/> - <child internal-child="accessible"> - <object class="AtkObject" id="cancel_button-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes">Cancel file transfer</property> - <property name="AtkObject::accessible-description" translatable="yes">Cancels the selected file transfer</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="close_button"> - <property name="label" translatable="yes">_Close</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Hide the window</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> + <property name="icon_name">process-stop-symbolic</property> + <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> + <property name="homogeneous">False</property> </packing> </child> + <style> + <class name="inline-toolbar"/> + </style> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="notify_ft_complete_checkbox"> - <property name="label" translatable="yes">_Notify me when a file transfer is complete</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_notify_ft_complete_checkbox_toggled" swapped="no"/> - <child internal-child="accessible"> - <object class="AtkObject" id="notify_ft_complete_checkbox-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes">When a file transfer is complete show a popup notification</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">2</property> </packing> </child> </object> </child> - <child type="titlebar"> - <placeholder/> - </child> <child internal-child="accessible"> <object class="AtkObject" id="file_transfers_window-atkobject"> <property name="AtkObject::accessible-name" translatable="yes">File Transfers</property>
===================================== gajim/data/gui/send_file_dialog.ui → gajim/data/gui/filetransfers_send_file_dialog.ui ===================================== @@ -5,43 +5,18 @@ <object class="GtkGrid" id="send_file_grid"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="border_width">18</property> <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - <child> - <object class="GtkScrolledWindow"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hexpand">True</property> - <property name="hscrollbar_policy">never</property> - <property name="shadow_type">in</property> - <child> - <object class="GtkViewport"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkListBox" id="listbox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="vexpand">True</property> - <property name="selection_mode">none</property> - <property name="activate_on_single_click">False</property> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">2</property> - </packing> - </child> + <property name="column_spacing">12</property> <child> <object class="GtkLabel"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Description:</property> + <property name="label" translatable="yes">Description</property> <property name="xalign">0</property> + <style> + <class name="dim-label"/> + </style> </object> <packing> <property name="left_attach">0</property> @@ -51,10 +26,9 @@ </child> <child> <object class="GtkScrolledWindow"> - <property name="height_request">40</property> + <property name="height_request">70</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hexpand">True</property> <property name="hscrollbar_policy">never</property> <property name="shadow_type">in</property> <child> @@ -62,6 +36,10 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="wrap_mode">word-char</property> + <property name="left_margin">6</property> + <property name="right_margin">6</property> + <property name="top_margin">6</property> + <property name="bottom_margin">6</property> </object> </child> </object> @@ -73,42 +51,123 @@ </child> <child> <object class="GtkButton"> - <property name="label" translatable="yes">Select Files</property> + <property name="label" translatable="yes">_Send Files</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="halign">start</property> - <signal name="clicked" handler="_select_files" swapped="no"/> + <property name="tooltip_text" translatable="yes">Send</property> + <property name="halign">center</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="_send" swapped="no"/> + <style> + <class name="suggested-action"/> + </style> </object> <packing> <property name="left_attach">0</property> <property name="top_attach">4</property> + <property name="width">2</property> </packing> </child> <child> - <object class="GtkButton"> - <property name="label" translatable="yes">Send</property> + <object class="GtkLabel"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="halign">end</property> - <signal name="clicked" handler="_send" swapped="no"/> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Files to send</property> + <property name="xalign">0</property> + <style> + <class name="dim-label"/> + </style> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">2</property> </packing> </child> <child> - <object class="GtkLabel"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Files:</property> - <property name="xalign">0</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkListBox" id="listbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="vexpand">True</property> + <property name="selection_mode">multiple</property> + <property name="activate_on_single_click">False</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkToolbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_arrow">False</property> + <property name="icon_size">1</property> + <child> + <object class="GtkToolButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Add Files</property> + <property name="use_underline">True</property> + <property name="icon_name">list-add-symbolic</property> + <signal name="clicked" handler="_select_files" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Remove Files</property> + <property name="use_underline">True</property> + <property name="icon_name">list-remove-symbolic</property> + <signal name="clicked" handler="_remove_files" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <style> + <class name="inline-toolbar"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="top_attach">1</property> <property name="width">2</property> </packing> </child>
===================================== gajim/data/style/gajim.css ===================================== @@ -114,6 +114,9 @@ list.settings > row > box { margin: 6px 18px; }
+/*SendFileDialog*/ +#SendFileDialog grid list > row { padding: 10px 20px 10px 10px; } + /* Preferences Window */ .PreferencesWindow { background-color: @theme_base_color; } .PreferencesStack { background-color: @theme_bg_color; } @@ -231,10 +234,6 @@ button.flat.link { padding: 0; border: 0; } /*MessageWindow Notebook*/ .notebook-tab-label {min-width: 80px}
-/*SendFileDialog*/ -#SendFileDialog grid {padding: 12px} -#SendFileDialog grid list { background-color: @theme_bg_color} - /*Icon colors*/ .success-color { color: @success_color; } .error-color { color: @error_color; }
===================================== gajim/gtk/filetransfer.py ===================================== @@ -36,8 +36,9 @@ from gajim.common import app from gajim.common import helpers from gajim.common.i18n import _ from gajim.common.file_props import FilesProp -from gajim.common.modules.bytestream import (is_transfer_active, is_transfer_paused, - is_transfer_stopped) +from gajim.common.modules.bytestream import (is_transfer_active, + is_transfer_paused, + is_transfer_stopped)
from gajim.gtk.dialogs import HigDialog from gajim.gtk.dialogs import InformationDialog @@ -50,7 +51,8 @@ from gajim.gtk.filechoosers import FileChooserDialog from gajim.gtk.tooltips import FileTransfersTooltip from gajim.gtk.util import get_builder
-log = logging.getLogger('gajim.filetransfer_window') +log = logging.getLogger('gajim.gtk.filetransfer') +
@unique class Column(IntEnum): @@ -66,46 +68,42 @@ class Column(IntEnum):
class FileTransfersWindow: def __init__(self): - self.files_props = {'r' : {}, 's': {}} + self.files_props = {'r': {}, 's': {}} self.height_diff = 0 - self.xml = get_builder('filetransfers.ui') - self.window = self.xml.get_object('file_transfers_window') - self.tree = self.xml.get_object('transfers_list') - self.cancel_button = self.xml.get_object('cancel_button') - self.pause_button = self.xml.get_object('pause_restore_button') - self.cleanup_button = self.xml.get_object('cleanup_button') - self.notify_ft_checkbox = self.xml.get_object( - 'notify_ft_complete_checkbox') - - shall_notify = app.config.get('notify_on_file_complete') - self.notify_ft_checkbox.set_active(shall_notify) + self._ui = get_builder('filetransfers.ui') + + self.window = self._ui.file_transfers_window + show_notification = app.config.get('notify_on_file_complete') + self._ui.notify_ft_complete.set_active(show_notification) self.model = Gtk.ListStore(str, str, str, str, str, int, int, str) - self.tree.set_model(self.model) + self._ui.transfers_list.set_model(self.model) col = Gtk.TreeViewColumn()
render_pixbuf = Gtk.CellRendererPixbuf()
col.pack_start(render_pixbuf, True) - render_pixbuf.set_property('xpad', 3) - render_pixbuf.set_property('ypad', 3) - render_pixbuf.set_property('yalign', .0) + render_pixbuf.set_property('xpad', 6) + render_pixbuf.set_property('ypad', 6) + render_pixbuf.set_property('yalign', 0.5) col.add_attribute(render_pixbuf, 'icon_name', 0) - self.tree.append_column(col) + self._ui.transfers_list.append_column(col)
col = Gtk.TreeViewColumn(_('File')) renderer = Gtk.CellRendererText() col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', Column.LABELS) - renderer.set_property('yalign', 0.) + renderer.set_property('xalign', 0.0) + renderer.set_property('yalign', 0.0) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', Column.FILE) - renderer.set_property('xalign', 0.) - renderer.set_property('yalign', 0.) + renderer.set_property('xalign', 0.0) + renderer.set_property('yalign', 0.0) renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) + col.set_min_width(160) col.set_expand(True) - self.tree.append_column(col) + self._ui.transfers_list.append_column(col)
col = Gtk.TreeViewColumn(_('Time')) renderer = Gtk.CellRendererText() @@ -115,9 +113,10 @@ class FileTransfersWindow: renderer.set_property('xalign', 0.5) renderer = Gtk.CellRendererText() renderer.set_property('ellipsize', Pango.EllipsizeMode.END) + renderer.set_property('xalign', 0.5) col.set_resizable(True) - col.set_expand(False) - self.tree.append_column(col) + col.set_min_width(70) + self._ui.transfers_list.append_column(col)
col = Gtk.TreeViewColumn(_('Progress')) renderer = Gtk.CellRendererProgress() @@ -127,37 +126,33 @@ class FileTransfersWindow: col.add_attribute(renderer, 'text', Column.PROGRESS) col.add_attribute(renderer, 'value', Column.PERCENT) col.add_attribute(renderer, 'pulse', Column.PULSE) - col.set_resizable(True) - col.set_expand(False) - self.tree.append_column(col) + col.set_resizable(False) + col.set_fixed_width(150) + self._ui.transfers_list.append_column(col)
self.icons = { - 'upload': 'go-up', - 'download': 'go-down', - 'stop': 'window-close', - 'waiting': 'view-refresh', - 'pause': 'media-playback-pause', - 'continue': 'media-playback-start', - 'ok': 'emblem-ok-symbolic', - 'computing': 'system-run', - 'hash_error': 'network-error-symbolic', + 'upload': 'go-up-symbolic', + 'download': 'go-down-symbolic', + 'stop': 'process-stop-symbolic', + 'waiting': 'emblem-synchronizing-symbolic', + 'pause': 'media-playback-pause-symbolic', + 'continue': 'media-playback-start-symbolic', + 'ok': 'emblem-ok-symbolic', + 'computing': 'system-run-symbolic', + 'hash_error': 'network-error-symbolic', }
- self.tree.get_selection().set_mode(Gtk.SelectionMode.SINGLE) - self.tree.get_selection().connect('changed', self.selection_changed) + self._ui.transfers_list.get_selection().set_mode( + Gtk.SelectionMode.SINGLE) + self._ui.transfers_list.get_selection().connect( + 'changed', self._selection_changed)
# Tooltip - self.tree.connect('query-tooltip', self._query_tooltip) - self.tree.set_has_tooltip(True) + self._ui.transfers_list.connect('query-tooltip', self._query_tooltip) + self._ui.transfers_list.set_has_tooltip(True) self.tooltip = FileTransfersTooltip()
- self.file_transfers_menu = self.xml.get_object('file_transfers_menu') - self.open_folder_menuitem = self.xml.get_object('open_folder_menuitem') - self.cancel_menuitem = self.xml.get_object('cancel_menuitem') - self.pause_menuitem = self.xml.get_object('pause_menuitem') - self.continue_menuitem = self.xml.get_object('continue_menuitem') - self.remove_menuitem = self.xml.get_object('remove_menuitem') - self.xml.connect_signals(self) + self._ui.connect_signals(self)
def _query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): try: @@ -190,7 +185,7 @@ class FileTransfersWindow: """ Find all transfers with peer 'jid' that belong to 'account' """ - active_transfers = [[], []] # ['senders', 'receivers'] + active_transfers = [[], []] # ['senders', 'receivers'] allfp = FilesProp.getAllFileProp() for file_props in allfp: if file_props.type_ == 's' and file_props.tt_account == account: @@ -218,7 +213,7 @@ class FileTransfersWindow: path = os.path.split(file_props.file_name)[0] if os.path.exists(path) and os.path.isdir(path): helpers.launch_file_manager(path) - self.tree.get_selection().unselect_all() + self._ui.transfers_list.get_selection().unselect_all()
if file_props.type_ == 'r': # file path is used below in 'Save in' @@ -226,36 +221,40 @@ class FileTransfersWindow: else: file_name = file_props.name sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) - sectext += '\n\t' + _('Size: %s') % \ - helpers.convert_bytes(file_props.size) + sectext += '\n\t' + _('Size: %s') % helpers.convert_bytes( + file_props.size) if file_props.type_ == 'r': jid = file_props.sender.split('/')[0] sender_name = app.contacts.get_first_contact_from_jid( - file_props.tt_account, jid).get_shown_name() + file_props.tt_account, jid).get_shown_name() sender = sender_name else: - #You is a reply of who sent a file + # You is a reply of who sent a file sender = _('You') sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': jid = file_props.receiver.split('/')[0] receiver_name = app.contacts.get_first_contact_from_jid( - file_props.tt_account, jid).get_shown_name() + file_props.tt_account, jid).get_shown_name() recipient = receiver_name else: - #You is a reply of who received a file + # You is a reply of who received a file recipient = _('You') sectext += recipient if file_props.type_ == 'r': sectext += '\n\t' + _('Saved in: %s') % file_path - dialog = HigDialog(app.interface.roster.window, Gtk.MessageType.INFO, - Gtk.ButtonsType.NONE, _('File transfer completed'), sectext) + dialog = HigDialog(app.interface.roster.window, + Gtk.MessageType.INFO, + Gtk.ButtonsType.NONE, + _('File transfer completed'), + sectext) if file_props.type_ == 'r': button = Gtk.Button.new_with_mnemonic(_('Open _Containing Folder')) button.connect('clicked', on_open, file_props) dialog.action_area.pack_start(button, True, True, 0) ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) + def on_ok(widget): dialog.destroy() ok_button.connect('clicked', on_ok) @@ -263,18 +262,22 @@ class FileTransfersWindow:
def show_request_error(self, file_props): """ - Show error dialog to the recipient saying that transfer has been canceled + Show error dialog to the recipient saying that + transfer has been canceled """ - InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.')) - self.tree.get_selection().unselect_all() + InformationDialog( + _('File transfer cancelled'), + _('Connection with peer could not be established.')) + self._ui.transfers_list.get_selection().unselect_all()
def show_send_error(self, file_props): """ Show error dialog to the sender saying that transfer has been canceled """ - InformationDialog(_('File transfer cancelled'), - _('Connection with peer cannot be established.')) - self.tree.get_selection().unselect_all() + InformationDialog( + _('File transfer cancelled'), + _('Connection with peer could not be established.')) + self._ui.transfers_list.get_selection().unselect_all()
def show_stopped(self, jid, file_props, error_msg=''): if file_props.type_ == 'r': @@ -286,7 +289,7 @@ class FileTransfersWindow: if error_msg: sectext += '\n\t' + _('Error message: %s') % error_msg ErrorDialog(_('File transfer stopped'), sectext) - self.tree.get_selection().unselect_all() + self._ui.transfers_list.get_selection().unselect_all()
def show_hash_error(self, jid, file_props, account):
@@ -310,8 +313,9 @@ class FileTransfersWindow: new_file_props.date = file_props.date new_file_props.hash_ = file_props.hash_ new_file_props.type_ = 'r' - tsid = app.connections[account].get_module('Jingle').start_file_transfer( - fjid, new_file_props, True) + tsid = app.connections[account].get_module( + 'Jingle').start_file_transfer(fjid, new_file_props, True) + new_file_props.transport_sid = tsid self.add_transfer(account, contact, new_file_props)
@@ -319,11 +323,14 @@ class FileTransfersWindow: file_name = os.path.basename(file_props.file_name) else: file_name = file_props.name - YesNoDialog(('File transfer error'), + YesNoDialog( + _('File transfer error'), _('The file %(file)s has been received, but it seems to have ' - 'been damaged along the way.\nDo you want to download it again?') % \ - {'file': file_name}, on_response_yes=(on_yes, jid, file_props, - account), type_=Gtk.MessageType.ERROR) + 'been damaged along the way.\n' + 'Do you want to download it again?') % + {'file': file_name}, + on_response_yes=(on_yes, jid, file_props, account), + type_=Gtk.MessageType.ERROR)
def show_file_send_request(self, account, contact): send_callback = partial(self.send_file, account, contact) @@ -344,16 +351,17 @@ class FileTransfersWindow: return (jid, resource) = contact.split('/', 1) contact = app.contacts.create_contact(jid=jid, account=account, - resource=resource) + resource=resource) file_name = os.path.split(file_path)[1] - file_props = self.get_send_file_props(account, contact, - file_path, file_name, file_desc) + file_props = self.get_send_file_props(account, contact, file_path, + file_name, file_desc) if file_props is None: return False
app.connections[account].get_module('Jingle').start_file_transfer( contact.get_full_jid(), file_props) self.add_transfer(account, contact, file_props) + return True
def _start_receive(self, file_path, account, contact, file_props): @@ -363,7 +371,8 @@ class FileTransfersWindow: file_props.file_name = file_path file_props.type_ = 'r' self.add_transfer(account, contact, file_props) - app.connections[account].get_module('Bytestream').send_file_approval(file_props) + app.connections[account].get_module('Bytestream').send_file_approval( + file_props)
def on_file_request_accepted(self, account, contact, file_props): def on_ok(account, contact, file_props, file_path): @@ -371,12 +380,12 @@ class FileTransfersWindow: app.config.set('last_save_dir', os.path.dirname(file_path)) # check if we have write permissions if not os.access(file_path, os.W_OK): - file_name = GLib.markup_escape_text(os.path.basename( - file_path)) + file_name = GLib.markup_escape_text( + os.path.basename(file_path)) ErrorDialog( _('Cannot overwrite existing file "%s"' % file_name), - _('A file with this name already exists and you do not ' - 'have permission to overwrite it.')) + _('A file with this name already exists and you do ' + 'not have permission to overwrite it.')) return stat = os.stat(file_path) dl_size = stat.st_size @@ -391,8 +400,10 @@ class FileTransfersWindow: self._start_receive(file_path, account, contact, file_props)
dialog = FTOverwriteConfirmationDialog( - _('This file already exists'), _('What do you want to do?'), - propose_resume=not dl_finished, on_response=on_response) + _('This file already exists'), + _('What do you want to do?'), + propose_resume=not dl_finished, + on_response=on_response) dialog.set_destroy_with_parent(True) return
@@ -410,7 +421,8 @@ class FileTransfersWindow:
con = app.connections[account] accept_cb = partial(on_ok, account, contact, file_props) - cancel_cb = partial(con.get_module('Bytestream').send_file_rejection, file_props) + cancel_cb = partial(con.get_module('Bytestream').send_file_rejection, + file_props) FileSaveDialog(accept_cb, cancel_cb, path=app.config.get('last_save_dir'), @@ -427,10 +439,10 @@ class FileTransfersWindow: file_props.name) if file_props.size: sec_text += '\n\t' + _('Size: %s') % \ - helpers.convert_bytes(file_props.size) + helpers.convert_bytes(file_props.size) if file_props.mime_type: sec_text += '\n\t' + _('Type: %s') % file_props.mime_type - if file_props.desc: + if file_props.desc: sec_text += '\n\t' + _('Description: %s') % file_props.desc prim_text = _('%s wants to send you a file:') % contact.jid dialog = None @@ -439,13 +451,16 @@ class FileTransfersWindow: self.on_file_request_accepted(account, contact, file_props)
def on_response_cancel(account, file_props): - app.connections[account].get_module('Bytestream').send_file_rejection(file_props) - - dialog = NonModalConfirmationDialog(prim_text, sec_text, - on_response_ok=(on_response_ok, account, contact, file_props), - on_response_cancel=(on_response_cancel, account, file_props)) + app.connections[account].get_module( + 'Bytestream').send_file_rejection(file_props) + + dialog = NonModalConfirmationDialog( + prim_text, + sec_text, + on_response_ok=(on_response_ok, account, contact, file_props), + on_response_cancel=(on_response_cancel, account, file_props)) dialog.connect('delete-event', lambda widget, event: - on_response_cancel(account, file_props)) + on_response_cancel(account, file_props)) dialog.popup()
def set_status(self, file_props, status): @@ -475,6 +490,7 @@ class FileTransfersWindow: text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) + def pulse(): p = self.model.get(iter_, Column.PULSE)[0] if p == GLib.MAXINT32: @@ -492,12 +508,12 @@ class FileTransfersWindow: self.model.set(iter_, Column.PULSE, GLib.MAXINT32) self.model.set(iter_, Column.IMAGE, self.icons[status]) path = self.model.get_path(iter_) - self.select_func(path) + self._select_func(path)
def _format_percent(self, percent): """ - Add extra spaces from both sides of the percent, so that progress string - has always a fixed size + Add extra spaces from both sides of the percent, so that progress + string has always a fixed size """ _str = ' ' if percent != 100.: @@ -517,9 +533,9 @@ class FileTransfersWindow: if _time >= 60: times['hours'] = _time / 60
- #Print remaining time in format 00:00:00 - #You can change the places of (hours), (minutes), (seconds) - - #they are not translatable. + # Print remaining time in format 00:00:00 + # You can change the places of (hours), (minutes), (seconds) - + # they are not translatable. return _('%(hours)02.d:%(minutes)02.d:%(seconds)02.d') % times
def _get_eta_and_speed(self, full_size, transfered_size, file_props): @@ -552,17 +568,19 @@ class FileTransfersWindow: account = file_props.tt_account if account in app.connections: # there is a connection to the account - app.connections[account].get_module('Bytestream').remove_transfer(file_props) - if file_props.type_ == 'r': # we receive a file + app.connections[account].get_module( + 'Bytestream').remove_transfer(file_props) + if file_props.type_ == 'r': # we receive a file other = file_props.sender - else: # we send a file + else: # we send a file other = file_props.receiver if isinstance(other, str): jid = app.get_jid_without_resource(other) - else: # It's a Contact instance + else: # It's a Contact instance jid = other.jid - for ev_type in ('file-error', 'file-completed', 'file-request-error', - 'file-send-error', 'file-stopped'): + for ev_type in ('file-error', 'file-completed', + 'file-request-error', 'file-send-error', + 'file-stopped'): for event in app.events.get_events(account, jid, [ev_type]): if event.file_props.sid == file_props.sid: app.events.remove_events(account, jid, event) @@ -601,21 +619,22 @@ class FileTransfersWindow: full_size -= file_props.offset
if file_props.elapsed_time > 0: - file_props.transfered_size.append((file_props.last_time, transfered_size)) + file_props.transfered_size.append((file_props.last_time, + transfered_size)) if len(file_props.transfered_size) > 6: file_props.transfered_size.pop(0) eta, speed = self._get_eta_and_speed(full_size, transfered_size, - file_props) + file_props)
self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PERCENT, int(percent)) text = self._format_time(eta) text += '\n' - #This should make the string Kb/s, - #where 'Kb' part is taken from %s. - #Only the 's' after / (which means second) should be translated. - text += _('(%(filesize_unit)s/s)') % {'filesize_unit': - helpers.convert_bytes(speed)} + # This should make the string Kb/s, + # where 'Kb' part is taken from %s. + # Only the 's' after / (which means second) should be translated. + text += _('(%(filesize_unit)s/s)') % { + 'filesize_unit': helpers.convert_bytes(speed)} self.model.set(iter_, Column.TIME, text)
# try to guess what should be the status image @@ -640,7 +659,7 @@ class FileTransfersWindow: self.set_status(file_props, 'ok') elif just_began: path = self.model.get_path(iter_) - self.select_func(path) + self._select_func(path)
def get_iter_by_sid(self, typ, sid): """ @@ -659,7 +678,7 @@ class FileTransfersWindow: return dt.isoformat() + 'Z'
def get_send_file_props(self, account, contact, file_path, file_name, - file_desc=''): + file_desc=''): """ Create new file_props object and set initial file transfer properties in it @@ -670,11 +689,12 @@ class FileTransfersWindow: ErrorDialog(_('Invalid File'), _('File: ') + file_path) return None if stat[6] == 0: - ErrorDialog(_('Invalid File'), - _('It is not possible to send empty files')) + ErrorDialog( + _('Invalid File'), + _('It is not possible to send empty files')) return None - file_props = FilesProp.getNewFileProp(account, - sid=helpers.get_random_string_16()) + file_props = FilesProp.getNewFileProp( + account, sid=helpers.get_random_string_16()) mod_date = os.path.getmtime(file_path) file_props.file_name = file_path file_props.name = file_name @@ -696,11 +716,10 @@ class FileTransfersWindow: return file_props.elapsed_time = 0 iter_ = self.model.prepend() - text_labels = '<b>' + _('Name: ') + '</b>\n' if file_props.type_ == 'r': - text_labels += '<b>' + _('Sender: ') + '</b>' + text_labels = '\n<b>' + _('Sender: ') + '</b>' else: - text_labels += '<b>' + _('Recipient: ') + '</b>' + text_labels = '\n<b>' + _('Recipient: ') + '</b>'
if file_props.type_ == 'r': file_name = os.path.split(file_props.file_name)[1] @@ -708,8 +727,15 @@ class FileTransfersWindow: file_name = file_props.name text_props = GLib.markup_escape_text(file_name) + '\n' text_props += contact.get_shown_name() - self.model.set(iter_, 1, text_labels, 2, text_props, Column.PULSE, -1, Column.SID, - file_props.type_ + file_props.sid) + self.model.set(iter_, + 1, + text_labels, + 2, + text_props, + Column.PULSE, + -1, + Column.SID, + file_props.type_ + file_props.sid) self.set_progress(file_props.type_, file_props.sid, 0, iter_) if file_props.started is False: status = 'waiting' @@ -719,77 +745,76 @@ class FileTransfersWindow: status = 'upload' file_props.tt_account = account self.set_status(file_props, status) - self.set_cleanup_sensitivity() + self._set_cleanup_sensitivity() self.window.show_all()
- def on_transfers_list_row_activated(self, widget, path, col): + def _on_transfers_list_row_activated(self, widget, path, col): # try to open the containing folder - self.on_open_folder_menuitem_activate(widget) + self._on_open_folder_menuitem_activate(widget)
- def set_cleanup_sensitivity(self): + def _set_cleanup_sensitivity(self): """ Check if there are transfer rows and set cleanup_button sensitive, or insensitive if model is empty """ if not self.model: - self.cleanup_button.set_sensitive(False) + self._ui.cleanup_button.set_sensitive(False) else: - self.cleanup_button.set_sensitive(True) + self._ui.cleanup_button.set_sensitive(True)
- def set_all_insensitive(self): + def _set_all_insensitive(self): """ Make all buttons/menuitems insensitive """ - self.pause_button.set_sensitive(False) - self.pause_menuitem.set_sensitive(False) - self.continue_menuitem.set_sensitive(False) - self.remove_menuitem.set_sensitive(False) - self.cancel_button.set_sensitive(False) - self.cancel_menuitem.set_sensitive(False) - self.open_folder_menuitem.set_sensitive(False) - self.set_cleanup_sensitivity() - - def set_buttons_sensitive(self, path, is_row_selected): + self._ui.pause_resume_button.set_sensitive(False) + self._ui.pause_resume_menuitem.set_sensitive(False) + self._ui.remove_menuitem.set_sensitive(False) + self._ui.cancel_button.set_sensitive(False) + self._ui.cancel_menuitem.set_sensitive(False) + self._ui.open_folder_menuitem.set_sensitive(False) + self._set_cleanup_sensitivity() + + def _set_buttons_sensitive(self, path, is_row_selected): """ Make buttons/menuitems sensitive as appropriate to the state of file transfer located at path 'path' """ if path is None: - self.set_all_insensitive() + self._set_all_insensitive() return current_iter = self.model.get_iter(path) sid = self.model[current_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) - self.remove_menuitem.set_sensitive(is_row_selected) - self.open_folder_menuitem.set_sensitive(is_row_selected) + self._ui.remove_menuitem.set_sensitive(is_row_selected) + self._ui.open_folder_menuitem.set_sensitive(is_row_selected) is_stopped = False if is_transfer_stopped(file_props): is_stopped = True - self.cancel_button.set_sensitive(not is_stopped) - self.cancel_menuitem.set_sensitive(not is_stopped) + self._ui.cancel_button.set_sensitive(not is_stopped) + self._ui.cancel_menuitem.set_sensitive(not is_stopped) if not is_row_selected: - # no selection, disable the buttons - self.set_all_insensitive() + # No selection, disable the buttons + self._set_all_insensitive() elif not is_stopped and file_props.continue_cb: if is_transfer_active(file_props): - # file transfer is active - self.toggle_pause_continue(True) - self.pause_button.set_sensitive(True) + # File transfer is active + self._toggle_pause_continue(True) + self._ui.pause_resume_button.set_sensitive(True) + self._ui.pause_resume_menuitem.set_sensitive(True) elif is_transfer_paused(file_props): - # file transfer is paused - self.toggle_pause_continue(False) - self.pause_button.set_sensitive(True) + # File transfer is paused + self._toggle_pause_continue(False) + self._ui.pause_resume_button.set_sensitive(True) + self._ui.pause_resume_menuitem.set_sensitive(True) else: - self.pause_button.set_sensitive(False) - self.pause_menuitem.set_sensitive(False) - self.continue_menuitem.set_sensitive(False) + self._ui.pause_resume_button.set_sensitive(False) + self._ui.pause_resume_menuitem.set_sensitive(False) else: - self.pause_button.set_sensitive(False) - self.pause_menuitem.set_sensitive(False) - self.continue_menuitem.set_sensitive(False) + self._ui.pause_resume_button.set_sensitive(False) + self._ui.pause_resume_menuitem.set_sensitive(False) return True
- def selection_changed(self, args): + def _selection_changed(self, args): """ Selection has changed - change the sensitivity of the buttons/menuitems """ @@ -797,22 +822,22 @@ class FileTransfersWindow: selected = selection.get_selected_rows() if selected[1] != []: selected_path = selected[1][0] - self.select_func(selected_path) + self._select_func(selected_path) else: - self.set_all_insensitive() + self._set_all_insensitive()
- def select_func(self, path): + def _select_func(self, path): is_selected = False - selected = self.tree.get_selection().get_selected_rows() + selected = self._ui.transfers_list.get_selection().get_selected_rows() if selected[1] != []: selected_path = selected[1][0] if selected_path == path: is_selected = True - self.set_buttons_sensitive(path, is_selected) - self.set_cleanup_sensitivity() + self._set_buttons_sensitive(path, is_selected) + self._set_cleanup_sensitivity() return True
- def on_cleanup_button_clicked(self, widget): + def _on_cleanup_button_clicked(self, widget): i = len(self.model) - 1 while i >= 0: iter_ = self.model.get_iter((i)) @@ -821,33 +846,19 @@ class FileTransfersWindow: if is_transfer_stopped(file_props): self._remove_transfer(iter_, sid, file_props) i -= 1 - self.tree.get_selection().unselect_all() - self.set_all_insensitive() + self._ui.transfers_list.get_selection().unselect_all() + self._set_all_insensitive()
- def toggle_pause_continue(self, status): + def _toggle_pause_continue(self, status): if status: - label = _('Pause') - self.pause_button.set_label(label) - self.pause_button.set_image(Gtk.Image.new_from_icon_name( - "media-playback-pause", Gtk.IconSize.MENU)) - - self.pause_menuitem.set_sensitive(True) - self.pause_menuitem.set_no_show_all(False) - self.continue_menuitem.hide() - self.continue_menuitem.set_no_show_all(True) - + self._ui.pause_resume_button.set_icon_name( + 'media-playback-pause-symbolic') else: - label = _('_Continue') - self.pause_button.set_label(label) - self.pause_button.set_image(Gtk.Image.new_from_icon_name( - "media-playback-start", Gtk.IconSize.MENU)) - self.pause_menuitem.hide() - self.pause_menuitem.set_no_show_all(True) - self.continue_menuitem.set_sensitive(True) - self.continue_menuitem.set_no_show_all(False) - - def on_pause_restore_button_clicked(self, widget): - selected = self.tree.get_selection().get_selected() + self._ui.pause_resume_button.set_icon_name( + 'media-playback-start-symbolic') + + def _on_pause_resume_button_clicked(self, widget): + selected = self._ui.transfers_list.get_selection().get_selected() if selected is None or selected[1] is None: return s_iter = selected[1] @@ -856,20 +867,20 @@ class FileTransfersWindow: if is_transfer_paused(file_props): file_props.last_time = time.time() file_props.paused = False - types = {'r' : 'download', 's' : 'upload'} + types = {'r': 'download', 's': 'upload'} self.set_status(file_props, types[sid[0]]) - self.toggle_pause_continue(True) + self._toggle_pause_continue(True) if file_props.continue_cb: file_props.continue_cb() elif is_transfer_active(file_props): file_props.paused = True self.set_status(file_props, 'pause') - # reset that to compute speed only when we resume + # Reset that to compute speed only when we resume file_props.transfered_size = [] - self.toggle_pause_continue(False) + self._toggle_pause_continue(False)
- def on_cancel_button_clicked(self, widget): - selected = self.tree.get_selection().get_selected() + def _on_cancel_button_clicked(self, widget): + selected = self._ui.transfers_list.get_selection().get_selected() if selected is None or selected[1] is None: return s_iter = selected[1] @@ -885,76 +896,78 @@ class FileTransfersWindow: con.get_module('Bytestream').disconnect_transfer(file_props) self.set_status(file_props, 'stop')
- def on_notify_ft_complete_checkbox_toggled(self, widget): - app.config.set('notify_on_file_complete', - widget.get_active()) - - def on_file_transfers_dialog_delete_event(self, widget, event): - self.window.hide() - return True # do NOT destroy window + def _on_notify_ft_complete_toggled(self, widget, *args): + app.config.set('notify_on_file_complete', widget.get_active())
- def on_close_button_clicked(self, widget): + def _on_file_transfers_dialog_delete_event(self, widget, event): self.window.hide() + return True # Do NOT destroy window
- def show_context_menu(self, event, iter_): + def _show_context_menu(self, event, iter_): # change the sensitive property of the buttons and menuitems if iter_: path = self.model.get_path(iter_) - self.set_buttons_sensitive(path, True) + self._set_buttons_sensitive(path, True)
event_button = gtkgui_helpers.get_possible_button_event(event) - self.file_transfers_menu.show_all() - self.file_transfers_menu.popup(None, self.tree, None, None, - event_button, event.time) - - def on_transfers_list_key_press_event(self, widget, event): + self._ui.file_transfers_menu.show_all() + self._ui.file_transfers_menu.popup( + None, + self._ui.transfers_list, + None, + None, + event_button, + event.time) + + def _on_transfers_list_key_press_event(self, widget, event): """ When a key is pressed in the treeviews """ iter_ = None try: - iter_ = self.tree.get_selection().get_selected()[1] + iter_ = self._ui.transfers_list.get_selection().get_selected()[1] except TypeError: - self.tree.get_selection().unselect_all() + self._ui.transfers_list.get_selection().unselect_all()
if iter_ is not None: path = self.model.get_path(iter_) - self.tree.get_selection().select_path(path) + self._ui.transfers_list.get_selection().select_path(path)
if event.keyval == Gdk.KEY_Menu: - self.show_context_menu(event, iter_) + self._show_context_menu(event, iter_) return True
- - def on_transfers_list_button_release_event(self, widget, event): + def _on_transfers_list_button_release_event(self, widget, event): # hide tooltip, no matter the button is pressed path = None try: - path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0] + path = self._ui.transfers_list.get_path_at_pos(int(event.x), + int(event.y))[0] except TypeError: - self.tree.get_selection().unselect_all() + self._ui.transfers_list.get_selection().unselect_all() if path is None: - self.set_all_insensitive() + self._set_all_insensitive() else: - self.select_func(path) + self._select_func(path)
- def on_transfers_list_button_press_event(self, widget, event): + def _on_transfers_list_button_press_event(self, widget, event): # hide tooltip, no matter the button is pressed path, iter_ = None, None try: - path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0] + path = self._ui.transfers_list.get_path_at_pos(int(event.x), + int(event.y))[0] except TypeError: - self.tree.get_selection().unselect_all() - if event.button == 3: # Right click + self._ui.transfers_list.get_selection().unselect_all() + if event.button == 3: # Right click if path: - self.tree.get_selection().select_path(path) + self._ui.transfers_list.get_selection().select_path(path) iter_ = self.model.get_iter(path) - self.show_context_menu(event, iter_) + self._show_context_menu(event, iter_) if path: return True
- def on_open_folder_menuitem_activate(self, widget): - selected = self.tree.get_selection().get_selected() + def _on_open_folder_menuitem_activate(self, widget): + selected = self._ui.transfers_list.get_selection().get_selected() if not selected or not selected[1]: return s_iter = selected[1] @@ -966,51 +979,48 @@ class FileTransfersWindow: if os.path.exists(path) and os.path.isdir(path): helpers.launch_file_manager(path)
- def on_cancel_menuitem_activate(self, widget): - self.on_cancel_button_clicked(widget) + def _on_cancel_menuitem_activate(self, widget): + self._on_cancel_button_clicked(widget)
- def on_continue_menuitem_activate(self, widget): - self.on_pause_restore_button_clicked(widget) + def _on_continue_menuitem_activate(self, widget): + self._on_pause_resume_button_clicked(widget)
- def on_pause_menuitem_activate(self, widget): - self.on_pause_restore_button_clicked(widget) + def _on_pause_resume_menuitem_activate(self, widget): + self._on_pause_resume_button_clicked(widget)
- def on_remove_menuitem_activate(self, widget): - selected = self.tree.get_selection().get_selected() + def _on_remove_menuitem_activate(self, widget): + selected = self._ui.transfers_list.get_selection().get_selected() if not selected or not selected[1]: return s_iter = selected[1] sid = self.model[s_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self._remove_transfer(s_iter, sid, file_props) - self.set_all_insensitive() + self._set_all_insensitive()
- def on_file_transfers_window_key_press_event(self, widget, event): - if event.keyval == Gdk.KEY_Escape: # ESCAPE + def _on_file_transfers_window_key_press_event(self, widget, event): + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.hide()
class SendFileDialog(Gtk.ApplicationWindow): def __init__(self, send_callback, transient_for): - active_window = app.app.get_active_window() Gtk.ApplicationWindow.__init__(self) self.set_name('SendFileDialog') self.set_application(app.app) self.set_show_menubar(False) self.set_resizable(True) - self.set_default_size(400, 250) + self.set_default_size(500, 350) self.set_type_hint(Gdk.WindowTypeHint.DIALOG) - self.set_transient_for(active_window) + self.set_transient_for(transient_for) self.set_title(_('Choose a File to Send…')) self.set_destroy_with_parent(True)
self._send_callback = send_callback
- self._ui = get_builder('send_file_dialog.ui') - + self._ui = get_builder('filetransfers_send_file_dialog.ui') self.add(self._ui.send_file_grid) self.connect('key-press-event', self._key_press_event) - self._ui.connect_signals(self) self.show_all()
@@ -1025,10 +1035,12 @@ class SendFileDialog(Gtk.ApplicationWindow): transient_for=self, path=app.config.get('last_send_dir'))
- def _set_files(self, filenames): - # Clear the ListBox - self._ui.listbox.foreach(self._remove_widget, None) + def _remove_files(self, button): + selected = self._ui.listbox.get_selected_rows() + for item in selected: + self._ui.listbox.remove(item)
+ def _set_files(self, filenames): for file in filenames: row = FileRow(file) if row.path.is_dir(): @@ -1038,9 +1050,6 @@ class SendFileDialog(Gtk.ApplicationWindow): self._ui.listbox.show_all() app.config.set('last_send_dir', str(last_dir))
- def _remove_widget(self, widget, data): - self._ui.listbox.remove(widget) - def _get_description(self): buffer_ = self._ui.description.get_buffer() start, end = buffer_.get_bounds()
===================================== gajim/gtk/tooltips.py ===================================== @@ -549,16 +549,19 @@ class FileTransfersTooltip(): return False, self.widget
def _create_tooltip(self, file_props, _sid): - ft_table = Gtk.Table(2, 1) - ft_table.set_property('column-spacing', 2) - current_row = 1 + ft_grid = Gtk.Grid.new() + ft_grid.insert_column(0) + ft_grid.set_row_spacing(6) + ft_grid.set_column_spacing(12) + current_row = 0 properties = [] name = file_props.name if file_props.type_ == 'r': file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name - properties.append((_('Name: '), GLib.markup_escape_text(file_name))) + properties.append((_('File Name: '), + GLib.markup_escape_text(file_name))) if file_props.type_ == 'r': type_ = Q_('?Noun:Download') actor = _('Sender: ') @@ -573,58 +576,55 @@ class FileTransfersTooltip(): name = receiver.get_shown_name() else: name = receiver.split('/')[0] - properties.append((_('Type: '), type_)) + properties.append((Q_('?transfer type:Type: '), type_)) properties.append((actor, GLib.markup_escape_text(name)))
transfered_len = file_props.received_len if not transfered_len: transfered_len = 0 - properties.append((_('Transferred: '), helpers.convert_bytes(transfered_len))) + properties.append((Q_('?transfer status:Transferred: '), + helpers.convert_bytes(transfered_len))) status = self._get_current_status(file_props) - properties.append((_('Status: '), status)) + properties.append((Q_('?transfer status:Status: '), status)) file_desc = file_props.desc or '' - properties.append((_('Description: '), GLib.markup_escape_text( - file_desc))) + properties.append((_('Description: '), + GLib.markup_escape_text(file_desc))) + while properties: property_ = properties.pop(0) - current_row += 1 label = Gtk.Label() - label.set_halign(Gtk.Align.START) - label.set_valign(Gtk.Align.START) + label.set_halign(Gtk.Align.END) + label.set_valign(Gtk.Align.CENTER) label.set_markup(property_[0]) - ft_table.attach( - label, 1, 2, current_row, current_row + 1, - Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) + ft_grid.attach(label, 0, current_row, 1, 1) label = Gtk.Label() label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_line_wrap(True) label.set_markup(property_[1]) - ft_table.attach( - label, 2, 3, current_row, current_row + 1, - Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, - Gtk.AttachOptions.FILL, 0, 0) + ft_grid.attach(label, 1, current_row, 1, 1) + current_row += 1
- ft_table.show_all() - return ft_table + ft_grid.show_all() + return ft_grid
@staticmethod def _get_current_status(file_props): if file_props.stopped: - return _('Aborted') + return Q_('?transfer status:Aborted') if file_props.completed: - return _('Completed') + return Q_('?transfer status:Completed') if file_props.paused: return Q_('?transfer status:Paused') if file_props.stalled: # stalled is not paused. it is like 'frozen' it stopped alone - return _('Stalled') + return Q_('?transfer status:Stalled')
if file_props.connected: if file_props.started: - return _('Transferring') - return _('Not started') - return _('Not started') + return Q_('?transfer status:Transferring') + return Q_('?transfer status:Not started') + return Q_('?transfer status:Not started')
def colorize_status(status):
View it on GitLab: https://dev.gajim.org/gajim/gajim/commit/93057ab66d71ddc8111e38f88067c0dad8c...