Philipp Hörist pushed to branch master at gajim / gajim

Commits:

5 changed files:

Changes:

  • gajim/data/gui/filetransfers.ui
    1 1
     <?xml version="1.0" encoding="UTF-8"?>
    
    2
    -<!-- Generated with glade 3.20.1 -->
    
    2
    +<!-- Generated with glade 3.22.1 -->
    
    3 3
     <interface>
    
    4
    -  <requires lib="gtk+" version="3.12"/>
    
    4
    +  <requires lib="gtk+" version="3.20"/>
    
    5 5
       <object class="GtkAccelGroup" id="accelgroup1"/>
    
    6 6
       <object class="GtkMenu" id="file_transfers_menu">
    
    7 7
         <property name="can_focus">False</property>
    
    8 8
         <child>
    
    9 9
           <object class="GtkMenuItem" id="remove_menuitem">
    
    10
    +        <property name="visible">True</property>
    
    10 11
             <property name="can_focus">False</property>
    
    11 12
             <property name="label" translatable="yes">_Remove</property>
    
    12 13
             <property name="use_underline">True</property>
    
    13
    -        <signal name="activate" handler="on_remove_menuitem_activate" swapped="no"/>
    
    14
    -      </object>
    
    15
    -    </child>
    
    16
    -    <child>
    
    17
    -      <object class="GtkMenuItem" id="continue_menuitem">
    
    18
    -        <property name="can_focus">False</property>
    
    19
    -        <property name="no_show_all">True</property>
    
    20
    -        <property name="label" translatable="yes">Con_tinue</property>
    
    21
    -        <property name="use_underline">True</property>
    
    22
    -        <signal name="activate" handler="on_continue_menuitem_activate" swapped="no"/>
    
    14
    +        <signal name="activate" handler="_on_remove_menuitem_activate" swapped="no"/>
    
    23 15
           </object>
    
    24 16
         </child>
    
    25 17
         <child>
    
    26
    -      <object class="GtkMenuItem" id="pause_menuitem">
    
    18
    +      <object class="GtkMenuItem" id="pause_resume_menuitem">
    
    19
    +        <property name="visible">True</property>
    
    27 20
             <property name="can_focus">False</property>
    
    28
    -        <property name="label" translatable="yes">_Pause</property>
    
    21
    +        <property name="label" translatable="yes">Pa_use/Resume</property>
    
    29 22
             <property name="use_underline">True</property>
    
    30
    -        <signal name="activate" handler="on_pause_menuitem_activate" swapped="no"/>
    
    23
    +        <signal name="activate" handler="_on_pause_resume_menuitem_activate" swapped="no"/>
    
    31 24
           </object>
    
    32 25
         </child>
    
    33 26
         <child>
    
    34 27
           <object class="GtkMenuItem" id="cancel_menuitem">
    
    28
    +        <property name="visible">True</property>
    
    35 29
             <property name="can_focus">False</property>
    
    36 30
             <property name="label" translatable="yes">_Cancel</property>
    
    37 31
             <property name="use_underline">True</property>
    
    38
    -        <signal name="activate" handler="on_cancel_menuitem_activate" swapped="no"/>
    
    32
    +        <signal name="activate" handler="_on_cancel_menuitem_activate" swapped="no"/>
    
    39 33
           </object>
    
    40 34
         </child>
    
    41 35
         <child>
    
    42
    -      <object class="GtkSeparatorMenuItem" id="separator11">
    
    36
    +      <object class="GtkSeparatorMenuItem">
    
    43 37
             <property name="visible">True</property>
    
    44 38
             <property name="can_focus">False</property>
    
    45 39
           </object>
    
    46 40
         </child>
    
    47 41
         <child>
    
    48 42
           <object class="GtkMenuItem" id="open_folder_menuitem">
    
    43
    +        <property name="visible">True</property>
    
    49 44
             <property name="can_focus">False</property>
    
    50
    -        <property name="label" translatable="yes">_Open Containing Folder</property>
    
    45
    +        <property name="label" translatable="yes">_Open Folder</property>
    
    51 46
             <property name="use_underline">True</property>
    
    52
    -        <signal name="activate" handler="on_open_folder_menuitem_activate" swapped="no"/>
    
    47
    +        <signal name="activate" handler="_on_open_folder_menuitem_activate" swapped="no"/>
    
    53 48
           </object>
    
    54 49
         </child>
    
    55 50
       </object>
    
    56 51
       <object class="GtkWindow" id="file_transfers_window">
    
    52
    +    <property name="width_request">500</property>
    
    53
    +    <property name="height_request">350</property>
    
    57 54
         <property name="can_focus">False</property>
    
    58
    -    <property name="border_width">12</property>
    
    55
    +    <property name="border_width">18</property>
    
    59 56
         <property name="title" translatable="yes">File Transfers</property>
    
    57
    +    <property name="window_position">center-always</property>
    
    58
    +    <property name="default_width">450</property>
    
    59
    +    <property name="default_height">350</property>
    
    60 60
         <property name="type_hint">dialog</property>
    
    61
    -    <signal name="delete-event" handler="on_file_transfers_dialog_delete_event" swapped="no"/>
    
    62
    -    <signal name="key-press-event" handler="on_file_transfers_window_key_press_event" swapped="no"/>
    
    61
    +    <signal name="delete-event" handler="_on_file_transfers_dialog_delete_event" swapped="no"/>
    
    62
    +    <signal name="key-press-event" handler="_on_file_transfers_window_key_press_event" swapped="no"/>
    
    63
    +    <child type="titlebar">
    
    64
    +      <placeholder/>
    
    65
    +    </child>
    
    63 66
         <child>
    
    64
    -      <object class="GtkBox" id="vbox1">
    
    67
    +      <object class="GtkBox">
    
    65 68
             <property name="visible">True</property>
    
    66 69
             <property name="can_focus">False</property>
    
    67 70
             <property name="orientation">vertical</property>
    
    68
    -        <property name="spacing">6</property>
    
    71
    +        <child>
    
    72
    +          <object class="GtkBox">
    
    73
    +            <property name="visible">True</property>
    
    74
    +            <property name="can_focus">False</property>
    
    75
    +            <property name="margin_bottom">6</property>
    
    76
    +            <property name="spacing">12</property>
    
    77
    +            <child>
    
    78
    +              <object class="GtkSwitch" id="notify_ft_complete">
    
    79
    +                <property name="visible">True</property>
    
    80
    +                <property name="can_focus">True</property>
    
    81
    +                <signal name="notify::active" handler="_on_notify_ft_complete_toggled" swapped="no"/>
    
    82
    +              </object>
    
    83
    +              <packing>
    
    84
    +                <property name="expand">False</property>
    
    85
    +                <property name="fill">True</property>
    
    86
    +                <property name="pack_type">end</property>
    
    87
    +                <property name="position">0</property>
    
    88
    +              </packing>
    
    89
    +            </child>
    
    90
    +            <child>
    
    91
    +              <object class="GtkLabel">
    
    92
    +                <property name="visible">True</property>
    
    93
    +                <property name="can_focus">False</property>
    
    94
    +                <property name="label" translatable="yes">_Show notification when file transfer is complete</property>
    
    95
    +                <property name="use_underline">True</property>
    
    96
    +                <property name="mnemonic_widget">notify_ft_complete</property>
    
    97
    +              </object>
    
    98
    +              <packing>
    
    99
    +                <property name="expand">False</property>
    
    100
    +                <property name="fill">True</property>
    
    101
    +                <property name="pack_type">end</property>
    
    102
    +                <property name="position">1</property>
    
    103
    +              </packing>
    
    104
    +            </child>
    
    105
    +          </object>
    
    106
    +          <packing>
    
    107
    +            <property name="expand">False</property>
    
    108
    +            <property name="fill">True</property>
    
    109
    +            <property name="position">0</property>
    
    110
    +          </packing>
    
    111
    +        </child>
    
    69 112
             <child>
    
    70 113
               <object class="GtkScrolledWindow" id="transfers_scrolledwindow">
    
    71 114
                 <property name="width_request">460</property>
    
    72 115
                 <property name="height_request">150</property>
    
    73 116
                 <property name="visible">True</property>
    
    74 117
                 <property name="can_focus">True</property>
    
    118
    +            <property name="hscrollbar_policy">never</property>
    
    75 119
                 <property name="shadow_type">in</property>
    
    76 120
                 <child>
    
    77 121
                   <object class="GtkTreeView" id="transfers_list">
    
    78 122
                     <property name="visible">True</property>
    
    79 123
                     <property name="can_focus">True</property>
    
    80 124
                     <property name="enable_search">False</property>
    
    81
    -                <signal name="button-press-event" handler="on_transfers_list_button_press_event" swapped="no"/>
    
    82
    -                <signal name="button-release-event" handler="on_transfers_list_button_release_event" swapped="no"/>
    
    83
    -                <signal name="key-press-event" handler="on_transfers_list_key_press_event" swapped="no"/>
    
    84
    -                <signal name="row-activated" handler="on_transfers_list_row_activated" swapped="no"/>
    
    125
    +                <signal name="button-press-event" handler="_on_transfers_list_button_press_event" swapped="no"/>
    
    126
    +                <signal name="button-release-event" handler="_on_transfers_list_button_release_event" swapped="no"/>
    
    127
    +                <signal name="key-press-event" handler="_on_transfers_list_key_press_event" swapped="no"/>
    
    128
    +                <signal name="row-activated" handler="_on_transfers_list_row_activated" swapped="no"/>
    
    85 129
                     <child internal-child="selection">
    
    86
    -                  <object class="GtkTreeSelection" id="treeview-selection1"/>
    
    130
    +                  <object class="GtkTreeSelection"/>
    
    87 131
                     </child>
    
    88 132
                     <child internal-child="accessible">
    
    89 133
                       <object class="AtkObject" id="transfers_list-atkobject">
    
    ... ... @@ -97,132 +141,69 @@
    97 141
               <packing>
    
    98 142
                 <property name="expand">True</property>
    
    99 143
                 <property name="fill">True</property>
    
    100
    -            <property name="position">0</property>
    
    144
    +            <property name="position">1</property>
    
    101 145
               </packing>
    
    102 146
             </child>
    
    103 147
             <child>
    
    104
    -          <object class="GtkButtonBox" id="hbuttonbox1">
    
    148
    +          <object class="GtkToolbar">
    
    105 149
                 <property name="visible">True</property>
    
    106 150
                 <property name="can_focus">False</property>
    
    107
    -            <property name="spacing">6</property>
    
    108
    -            <property name="layout_style">end</property>
    
    151
    +            <property name="show_arrow">False</property>
    
    152
    +            <property name="icon_size">1</property>
    
    109 153
                 <child>
    
    110
    -              <object class="GtkButton" id="cleanup_button">
    
    111
    -                <property name="label" translatable="yes">Clean _up</property>
    
    154
    +              <object class="GtkToolButton" id="cleanup_button">
    
    112 155
                     <property name="visible">True</property>
    
    113
    -                <property name="sensitive">False</property>
    
    114
    -                <property name="can_focus">True</property>
    
    115
    -                <property name="can_default">True</property>
    
    116
    -                <property name="receives_default">False</property>
    
    156
    +                <property name="can_focus">False</property>
    
    117 157
                     <property name="tooltip_text" translatable="yes">Remove completed, cancelled and failed file transfers from the list</property>
    
    118
    -                <property name="use_underline">True</property>
    
    119
    -                <signal name="clicked" handler="on_cleanup_button_clicked" swapped="no"/>
    
    120
    -                <child internal-child="accessible">
    
    121
    -                  <object class="AtkObject" id="cleanup_button-atkobject">
    
    122
    -                    <property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property>
    
    123
    -                    <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>
    
    124
    -                  </object>
    
    125
    -                </child>
    
    158
    +                <property name="label" translatable="yes">toolbutton</property>
    
    159
    +                <property name="icon_name">edit-clear-all-symbolic</property>
    
    160
    +                <signal name="clicked" handler="_on_cleanup_button_clicked" swapped="no"/>
    
    126 161
                   </object>
    
    127 162
                   <packing>
    
    128 163
                     <property name="expand">False</property>
    
    129
    -                <property name="fill">False</property>
    
    130
    -                <property name="position">0</property>
    
    164
    +                <property name="homogeneous">False</property>
    
    131 165
                   </packing>
    
    132 166
                 </child>
    
    133 167
                 <child>
    
    134
    -              <object class="GtkButton" id="pause_restore_button">
    
    135
    -                <property name="label" translatable="yes">_Pause</property>
    
    168
    +              <object class="GtkToolButton" id="pause_resume_button">
    
    136 169
                     <property name="visible">True</property>
    
    137
    -                <property name="sensitive">False</property>
    
    138
    -                <property name="can_focus">True</property>
    
    139
    -                <property name="can_default">True</property>
    
    140
    -                <property name="receives_default">False</property>
    
    170
    +                <property name="can_focus">False</property>
    
    171
    +                <property name="tooltip_text" translatable="yes">Pause or resume file transfer</property>
    
    141 172
                     <property name="use_underline">True</property>
    
    142
    -                <signal name="clicked" handler="on_pause_restore_button_clicked" swapped="no"/>
    
    173
    +                <property name="icon_name">media-playback-pause-symbolic</property>
    
    174
    +                <signal name="clicked" handler="_on_pause_resume_button_clicked" swapped="no"/>
    
    143 175
                   </object>
    
    144 176
                   <packing>
    
    145 177
                     <property name="expand">False</property>
    
    146
    -                <property name="fill">False</property>
    
    147
    -                <property name="position">1</property>
    
    178
    +                <property name="homogeneous">False</property>
    
    148 179
                   </packing>
    
    149 180
                 </child>
    
    150 181
                 <child>
    
    151
    -              <object class="GtkButton" id="cancel_button">
    
    152
    -                <property name="label" translatable="yes">_Cancel</property>
    
    182
    +              <object class="GtkToolButton" id="cancel_button">
    
    153 183
                     <property name="visible">True</property>
    
    154
    -                <property name="sensitive">False</property>
    
    155
    -                <property name="can_focus">True</property>
    
    156
    -                <property name="can_default">True</property>
    
    157
    -                <property name="receives_default">False</property>
    
    184
    +                <property name="can_focus">False</property>
    
    158 185
                     <property name="tooltip_text" translatable="yes">Cancel the selected file transfer and remove incomplete files</property>
    
    159 186
                     <property name="use_underline">True</property>
    
    160
    -                <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
    
    161
    -                <child internal-child="accessible">
    
    162
    -                  <object class="AtkObject" id="cancel_button-atkobject">
    
    163
    -                    <property name="AtkObject::accessible-name" translatable="yes">Cancel file transfer</property>
    
    164
    -                    <property name="AtkObject::accessible-description" translatable="yes">Cancels the selected file transfer</property>
    
    165
    -                  </object>
    
    166
    -                </child>
    
    167
    -              </object>
    
    168
    -              <packing>
    
    169
    -                <property name="expand">False</property>
    
    170
    -                <property name="fill">False</property>
    
    171
    -                <property name="position">2</property>
    
    172
    -              </packing>
    
    173
    -            </child>
    
    174
    -            <child>
    
    175
    -              <object class="GtkButton" id="close_button">
    
    176
    -                <property name="label" translatable="yes">_Close</property>
    
    177
    -                <property name="visible">True</property>
    
    178
    -                <property name="can_focus">True</property>
    
    179
    -                <property name="has_focus">True</property>
    
    180
    -                <property name="can_default">True</property>
    
    181
    -                <property name="receives_default">False</property>
    
    182
    -                <property name="tooltip_text" translatable="yes">Hide the window</property>
    
    183
    -                <property name="use_underline">True</property>
    
    184
    -                <signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
    
    187
    +                <property name="icon_name">process-stop-symbolic</property>
    
    188
    +                <signal name="clicked" handler="_on_cancel_button_clicked" swapped="no"/>
    
    185 189
                   </object>
    
    186 190
                   <packing>
    
    187 191
                     <property name="expand">False</property>
    
    188
    -                <property name="fill">False</property>
    
    189
    -                <property name="position">3</property>
    
    192
    +                <property name="homogeneous">False</property>
    
    190 193
                   </packing>
    
    191 194
                 </child>
    
    195
    +            <style>
    
    196
    +              <class name="inline-toolbar"/>
    
    197
    +            </style>
    
    192 198
               </object>
    
    193 199
               <packing>
    
    194 200
                 <property name="expand">False</property>
    
    195 201
                 <property name="fill">True</property>
    
    196
    -            <property name="pack_type">end</property>
    
    197
    -            <property name="position">1</property>
    
    198
    -          </packing>
    
    199
    -        </child>
    
    200
    -        <child>
    
    201
    -          <object class="GtkCheckButton" id="notify_ft_complete_checkbox">
    
    202
    -            <property name="label" translatable="yes">_Notify me when a file transfer is complete</property>
    
    203
    -            <property name="visible">True</property>
    
    204
    -            <property name="can_focus">True</property>
    
    205
    -            <property name="receives_default">False</property>
    
    206
    -            <property name="use_underline">True</property>
    
    207
    -            <property name="draw_indicator">True</property>
    
    208
    -            <signal name="toggled" handler="on_notify_ft_complete_checkbox_toggled" swapped="no"/>
    
    209
    -            <child internal-child="accessible">
    
    210
    -              <object class="AtkObject" id="notify_ft_complete_checkbox-atkobject">
    
    211
    -                <property name="AtkObject::accessible-description" translatable="yes">When a file transfer is complete show a popup notification</property>
    
    212
    -              </object>
    
    213
    -            </child>
    
    214
    -          </object>
    
    215
    -          <packing>
    
    216
    -            <property name="expand">False</property>
    
    217
    -            <property name="fill">False</property>
    
    218 202
                 <property name="position">2</property>
    
    219 203
               </packing>
    
    220 204
             </child>
    
    221 205
           </object>
    
    222 206
         </child>
    
    223
    -    <child type="titlebar">
    
    224
    -      <placeholder/>
    
    225
    -    </child>
    
    226 207
         <child internal-child="accessible">
    
    227 208
           <object class="AtkObject" id="file_transfers_window-atkobject">
    
    228 209
             <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 @@
    5 5
       <object class="GtkGrid" id="send_file_grid">
    
    6 6
         <property name="visible">True</property>
    
    7 7
         <property name="can_focus">False</property>
    
    8
    +    <property name="border_width">18</property>
    
    8 9
         <property name="row_spacing">6</property>
    
    9
    -    <property name="column_spacing">6</property>
    
    10
    -    <child>
    
    11
    -      <object class="GtkScrolledWindow">
    
    12
    -        <property name="visible">True</property>
    
    13
    -        <property name="can_focus">True</property>
    
    14
    -        <property name="hexpand">True</property>
    
    15
    -        <property name="hscrollbar_policy">never</property>
    
    16
    -        <property name="shadow_type">in</property>
    
    17
    -        <child>
    
    18
    -          <object class="GtkViewport">
    
    19
    -            <property name="visible">True</property>
    
    20
    -            <property name="can_focus">False</property>
    
    21
    -            <child>
    
    22
    -              <object class="GtkListBox" id="listbox">
    
    23
    -                <property name="visible">True</property>
    
    24
    -                <property name="can_focus">False</property>
    
    25
    -                <property name="vexpand">True</property>
    
    26
    -                <property name="selection_mode">none</property>
    
    27
    -                <property name="activate_on_single_click">False</property>
    
    28
    -              </object>
    
    29
    -            </child>
    
    30
    -          </object>
    
    31
    -        </child>
    
    32
    -      </object>
    
    33
    -      <packing>
    
    34
    -        <property name="left_attach">0</property>
    
    35
    -        <property name="top_attach">1</property>
    
    36
    -        <property name="width">2</property>
    
    37
    -      </packing>
    
    38
    -    </child>
    
    10
    +    <property name="column_spacing">12</property>
    
    39 11
         <child>
    
    40 12
           <object class="GtkLabel">
    
    41 13
             <property name="visible">True</property>
    
    42 14
             <property name="can_focus">False</property>
    
    43
    -        <property name="label" translatable="yes">Description:</property>
    
    15
    +        <property name="label" translatable="yes">Description</property>
    
    44 16
             <property name="xalign">0</property>
    
    17
    +        <style>
    
    18
    +          <class name="dim-label"/>
    
    19
    +        </style>
    
    45 20
           </object>
    
    46 21
           <packing>
    
    47 22
             <property name="left_attach">0</property>
    
    ... ... @@ -51,10 +26,9 @@
    51 26
         </child>
    
    52 27
         <child>
    
    53 28
           <object class="GtkScrolledWindow">
    
    54
    -        <property name="height_request">40</property>
    
    29
    +        <property name="height_request">70</property>
    
    55 30
             <property name="visible">True</property>
    
    56 31
             <property name="can_focus">True</property>
    
    57
    -        <property name="hexpand">True</property>
    
    58 32
             <property name="hscrollbar_policy">never</property>
    
    59 33
             <property name="shadow_type">in</property>
    
    60 34
             <child>
    
    ... ... @@ -62,6 +36,10 @@
    62 36
                 <property name="visible">True</property>
    
    63 37
                 <property name="can_focus">True</property>
    
    64 38
                 <property name="wrap_mode">word-char</property>
    
    39
    +            <property name="left_margin">6</property>
    
    40
    +            <property name="right_margin">6</property>
    
    41
    +            <property name="top_margin">6</property>
    
    42
    +            <property name="bottom_margin">6</property>
    
    65 43
               </object>
    
    66 44
             </child>
    
    67 45
           </object>
    
    ... ... @@ -73,42 +51,123 @@
    73 51
         </child>
    
    74 52
         <child>
    
    75 53
           <object class="GtkButton">
    
    76
    -        <property name="label" translatable="yes">Select Files</property>
    
    54
    +        <property name="label" translatable="yes">_Send Files</property>
    
    77 55
             <property name="visible">True</property>
    
    78 56
             <property name="can_focus">True</property>
    
    79 57
             <property name="receives_default">True</property>
    
    80
    -        <property name="halign">start</property>
    
    81
    -        <signal name="clicked" handler="_select_files" swapped="no"/>
    
    58
    +        <property name="tooltip_text" translatable="yes">Send</property>
    
    59
    +        <property name="halign">center</property>
    
    60
    +        <property name="use_underline">True</property>
    
    61
    +        <signal name="clicked" handler="_send" swapped="no"/>
    
    62
    +        <style>
    
    63
    +          <class name="suggested-action"/>
    
    64
    +        </style>
    
    82 65
           </object>
    
    83 66
           <packing>
    
    84 67
             <property name="left_attach">0</property>
    
    85 68
             <property name="top_attach">4</property>
    
    69
    +        <property name="width">2</property>
    
    86 70
           </packing>
    
    87 71
         </child>
    
    88 72
         <child>
    
    89
    -      <object class="GtkButton">
    
    90
    -        <property name="label" translatable="yes">Send</property>
    
    73
    +      <object class="GtkLabel">
    
    91 74
             <property name="visible">True</property>
    
    92
    -        <property name="can_focus">True</property>
    
    93
    -        <property name="receives_default">True</property>
    
    94
    -        <property name="halign">end</property>
    
    95
    -        <signal name="clicked" handler="_send" swapped="no"/>
    
    75
    +        <property name="can_focus">False</property>
    
    76
    +        <property name="label" translatable="yes">Files to send</property>
    
    77
    +        <property name="xalign">0</property>
    
    78
    +        <style>
    
    79
    +          <class name="dim-label"/>
    
    80
    +        </style>
    
    96 81
           </object>
    
    97 82
           <packing>
    
    98
    -        <property name="left_attach">1</property>
    
    99
    -        <property name="top_attach">4</property>
    
    83
    +        <property name="left_attach">0</property>
    
    84
    +        <property name="top_attach">0</property>
    
    85
    +        <property name="width">2</property>
    
    100 86
           </packing>
    
    101 87
         </child>
    
    102 88
         <child>
    
    103
    -      <object class="GtkLabel">
    
    89
    +      <object class="GtkBox">
    
    104 90
             <property name="visible">True</property>
    
    105 91
             <property name="can_focus">False</property>
    
    106
    -        <property name="label" translatable="yes">Files:</property>
    
    107
    -        <property name="xalign">0</property>
    
    92
    +        <property name="hexpand">True</property>
    
    93
    +        <property name="vexpand">True</property>
    
    94
    +        <property name="orientation">vertical</property>
    
    95
    +        <child>
    
    96
    +          <object class="GtkScrolledWindow">
    
    97
    +            <property name="visible">True</property>
    
    98
    +            <property name="can_focus">True</property>
    
    99
    +            <property name="hscrollbar_policy">never</property>
    
    100
    +            <property name="shadow_type">in</property>
    
    101
    +            <child>
    
    102
    +              <object class="GtkViewport">
    
    103
    +                <property name="visible">True</property>
    
    104
    +                <property name="can_focus">False</property>
    
    105
    +                <child>
    
    106
    +                  <object class="GtkListBox" id="listbox">
    
    107
    +                    <property name="visible">True</property>
    
    108
    +                    <property name="can_focus">False</property>
    
    109
    +                    <property name="vexpand">True</property>
    
    110
    +                    <property name="selection_mode">multiple</property>
    
    111
    +                    <property name="activate_on_single_click">False</property>
    
    112
    +                  </object>
    
    113
    +                </child>
    
    114
    +              </object>
    
    115
    +            </child>
    
    116
    +          </object>
    
    117
    +          <packing>
    
    118
    +            <property name="expand">False</property>
    
    119
    +            <property name="fill">True</property>
    
    120
    +            <property name="position">0</property>
    
    121
    +          </packing>
    
    122
    +        </child>
    
    123
    +        <child>
    
    124
    +          <object class="GtkToolbar">
    
    125
    +            <property name="visible">True</property>
    
    126
    +            <property name="can_focus">False</property>
    
    127
    +            <property name="show_arrow">False</property>
    
    128
    +            <property name="icon_size">1</property>
    
    129
    +            <child>
    
    130
    +              <object class="GtkToolButton">
    
    131
    +                <property name="visible">True</property>
    
    132
    +                <property name="can_focus">False</property>
    
    133
    +                <property name="tooltip_text" translatable="yes">Add Files</property>
    
    134
    +                <property name="use_underline">True</property>
    
    135
    +                <property name="icon_name">list-add-symbolic</property>
    
    136
    +                <signal name="clicked" handler="_select_files" swapped="no"/>
    
    137
    +              </object>
    
    138
    +              <packing>
    
    139
    +                <property name="expand">False</property>
    
    140
    +                <property name="homogeneous">False</property>
    
    141
    +              </packing>
    
    142
    +            </child>
    
    143
    +            <child>
    
    144
    +              <object class="GtkToolButton">
    
    145
    +                <property name="visible">True</property>
    
    146
    +                <property name="can_focus">False</property>
    
    147
    +                <property name="tooltip_text" translatable="yes">Remove Files</property>
    
    148
    +                <property name="use_underline">True</property>
    
    149
    +                <property name="icon_name">list-remove-symbolic</property>
    
    150
    +                <signal name="clicked" handler="_remove_files" swapped="no"/>
    
    151
    +              </object>
    
    152
    +              <packing>
    
    153
    +                <property name="expand">False</property>
    
    154
    +                <property name="homogeneous">True</property>
    
    155
    +              </packing>
    
    156
    +            </child>
    
    157
    +            <style>
    
    158
    +              <class name="inline-toolbar"/>
    
    159
    +            </style>
    
    160
    +          </object>
    
    161
    +          <packing>
    
    162
    +            <property name="expand">False</property>
    
    163
    +            <property name="fill">True</property>
    
    164
    +            <property name="position">1</property>
    
    165
    +          </packing>
    
    166
    +        </child>
    
    108 167
           </object>
    
    109 168
           <packing>
    
    110 169
             <property name="left_attach">0</property>
    
    111
    -        <property name="top_attach">0</property>
    
    170
    +        <property name="top_attach">1</property>
    
    112 171
             <property name="width">2</property>
    
    113 172
           </packing>
    
    114 173
         </child>
    

  • gajim/data/style/gajim.css
    ... ... @@ -114,6 +114,9 @@ list.settings > row > box {
    114 114
         margin: 6px 18px;
    
    115 115
     }
    
    116 116
     
    
    117
    +/*SendFileDialog*/
    
    118
    +#SendFileDialog grid list > row { padding: 10px 20px 10px 10px; }
    
    119
    +
    
    117 120
     /* Preferences Window */
    
    118 121
     .PreferencesWindow { background-color: @theme_base_color; }
    
    119 122
     .PreferencesStack { background-color: @theme_bg_color; }
    
    ... ... @@ -231,10 +234,6 @@ button.flat.link { padding: 0; border: 0; }
    231 234
     /*MessageWindow Notebook*/
    
    232 235
     .notebook-tab-label {min-width: 80px}
    
    233 236
     
    
    234
    -/*SendFileDialog*/
    
    235
    -#SendFileDialog grid {padding: 12px}
    
    236
    -#SendFileDialog grid list { background-color: @theme_bg_color}
    
    237
    -
    
    238 237
     /*Icon colors*/
    
    239 238
     .success-color { color: @success_color; }
    
    240 239
     .error-color { color: @error_color; }
    

  • gajim/gtk/filetransfer.py
    ... ... @@ -36,8 +36,9 @@ from gajim.common import app
    36 36
     from gajim.common import helpers
    
    37 37
     from gajim.common.i18n import _
    
    38 38
     from gajim.common.file_props import FilesProp
    
    39
    -from gajim.common.modules.bytestream import (is_transfer_active, is_transfer_paused,
    
    40
    -        is_transfer_stopped)
    
    39
    +from gajim.common.modules.bytestream import (is_transfer_active,
    
    40
    +                                             is_transfer_paused,
    
    41
    +                                             is_transfer_stopped)
    
    41 42
     
    
    42 43
     from gajim.gtk.dialogs import HigDialog
    
    43 44
     from gajim.gtk.dialogs import InformationDialog
    
    ... ... @@ -50,7 +51,8 @@ from gajim.gtk.filechoosers import FileChooserDialog
    50 51
     from gajim.gtk.tooltips import FileTransfersTooltip
    
    51 52
     from gajim.gtk.util import get_builder
    
    52 53
     
    
    53
    -log = logging.getLogger('gajim.filetransfer_window')
    
    54
    +log = logging.getLogger('gajim.gtk.filetransfer')
    
    55
    +
    
    54 56
     
    
    55 57
     @unique
    
    56 58
     class Column(IntEnum):
    
    ... ... @@ -66,46 +68,42 @@ class Column(IntEnum):
    66 68
     
    
    67 69
     class FileTransfersWindow:
    
    68 70
         def __init__(self):
    
    69
    -        self.files_props = {'r' : {}, 's': {}}
    
    71
    +        self.files_props = {'r': {}, 's': {}}
    
    70 72
             self.height_diff = 0
    
    71
    -        self.xml = get_builder('filetransfers.ui')
    
    72
    -        self.window = self.xml.get_object('file_transfers_window')
    
    73
    -        self.tree = self.xml.get_object('transfers_list')
    
    74
    -        self.cancel_button = self.xml.get_object('cancel_button')
    
    75
    -        self.pause_button = self.xml.get_object('pause_restore_button')
    
    76
    -        self.cleanup_button = self.xml.get_object('cleanup_button')
    
    77
    -        self.notify_ft_checkbox = self.xml.get_object(
    
    78
    -                'notify_ft_complete_checkbox')
    
    79
    -
    
    80
    -        shall_notify = app.config.get('notify_on_file_complete')
    
    81
    -        self.notify_ft_checkbox.set_active(shall_notify)
    
    73
    +        self._ui = get_builder('filetransfers.ui')
    
    74
    +
    
    75
    +        self.window = self._ui.file_transfers_window
    
    76
    +        show_notification = app.config.get('notify_on_file_complete')
    
    77
    +        self._ui.notify_ft_complete.set_active(show_notification)
    
    82 78
             self.model = Gtk.ListStore(str, str, str, str, str, int, int, str)
    
    83
    -        self.tree.set_model(self.model)
    
    79
    +        self._ui.transfers_list.set_model(self.model)
    
    84 80
             col = Gtk.TreeViewColumn()
    
    85 81
     
    
    86 82
             render_pixbuf = Gtk.CellRendererPixbuf()
    
    87 83
     
    
    88 84
             col.pack_start(render_pixbuf, True)
    
    89
    -        render_pixbuf.set_property('xpad', 3)
    
    90
    -        render_pixbuf.set_property('ypad', 3)
    
    91
    -        render_pixbuf.set_property('yalign', .0)
    
    85
    +        render_pixbuf.set_property('xpad', 6)
    
    86
    +        render_pixbuf.set_property('ypad', 6)
    
    87
    +        render_pixbuf.set_property('yalign', 0.5)
    
    92 88
             col.add_attribute(render_pixbuf, 'icon_name', 0)
    
    93
    -        self.tree.append_column(col)
    
    89
    +        self._ui.transfers_list.append_column(col)
    
    94 90
     
    
    95 91
             col = Gtk.TreeViewColumn(_('File'))
    
    96 92
             renderer = Gtk.CellRendererText()
    
    97 93
             col.pack_start(renderer, False)
    
    98 94
             col.add_attribute(renderer, 'markup', Column.LABELS)
    
    99
    -        renderer.set_property('yalign', 0.)
    
    95
    +        renderer.set_property('xalign', 0.0)
    
    96
    +        renderer.set_property('yalign', 0.0)
    
    100 97
             renderer = Gtk.CellRendererText()
    
    101 98
             col.pack_start(renderer, True)
    
    102 99
             col.add_attribute(renderer, 'markup', Column.FILE)
    
    103
    -        renderer.set_property('xalign', 0.)
    
    104
    -        renderer.set_property('yalign', 0.)
    
    100
    +        renderer.set_property('xalign', 0.0)
    
    101
    +        renderer.set_property('yalign', 0.0)
    
    105 102
             renderer.set_property('ellipsize', Pango.EllipsizeMode.END)
    
    106 103
             col.set_resizable(True)
    
    104
    +        col.set_min_width(160)
    
    107 105
             col.set_expand(True)
    
    108
    -        self.tree.append_column(col)
    
    106
    +        self._ui.transfers_list.append_column(col)
    
    109 107
     
    
    110 108
             col = Gtk.TreeViewColumn(_('Time'))
    
    111 109
             renderer = Gtk.CellRendererText()
    
    ... ... @@ -115,9 +113,10 @@ class FileTransfersWindow:
    115 113
             renderer.set_property('xalign', 0.5)
    
    116 114
             renderer = Gtk.CellRendererText()
    
    117 115
             renderer.set_property('ellipsize', Pango.EllipsizeMode.END)
    
    116
    +        renderer.set_property('xalign', 0.5)
    
    118 117
             col.set_resizable(True)
    
    119
    -        col.set_expand(False)
    
    120
    -        self.tree.append_column(col)
    
    118
    +        col.set_min_width(70)
    
    119
    +        self._ui.transfers_list.append_column(col)
    
    121 120
     
    
    122 121
             col = Gtk.TreeViewColumn(_('Progress'))
    
    123 122
             renderer = Gtk.CellRendererProgress()
    
    ... ... @@ -127,37 +126,33 @@ class FileTransfersWindow:
    127 126
             col.add_attribute(renderer, 'text', Column.PROGRESS)
    
    128 127
             col.add_attribute(renderer, 'value', Column.PERCENT)
    
    129 128
             col.add_attribute(renderer, 'pulse', Column.PULSE)
    
    130
    -        col.set_resizable(True)
    
    131
    -        col.set_expand(False)
    
    132
    -        self.tree.append_column(col)
    
    129
    +        col.set_resizable(False)
    
    130
    +        col.set_fixed_width(150)
    
    131
    +        self._ui.transfers_list.append_column(col)
    
    133 132
     
    
    134 133
             self.icons = {
    
    135
    -                'upload': 'go-up',
    
    136
    -                'download': 'go-down',
    
    137
    -                'stop': 'window-close',
    
    138
    -                'waiting': 'view-refresh',
    
    139
    -                'pause': 'media-playback-pause',
    
    140
    -                'continue': 'media-playback-start',
    
    141
    -                'ok': 'emblem-ok-symbolic',
    
    142
    -                'computing': 'system-run',
    
    143
    -                'hash_error': 'network-error-symbolic',
    
    134
    +            'upload': 'go-up-symbolic',
    
    135
    +            'download': 'go-down-symbolic',
    
    136
    +            'stop': 'process-stop-symbolic',
    
    137
    +            'waiting': 'emblem-synchronizing-symbolic',
    
    138
    +            'pause': 'media-playback-pause-symbolic',
    
    139
    +            'continue': 'media-playback-start-symbolic',
    
    140
    +            'ok': 'emblem-ok-symbolic',
    
    141
    +            'computing': 'system-run-symbolic',
    
    142
    +            'hash_error': 'network-error-symbolic',
    
    144 143
             }
    
    145 144
     
    
    146
    -        self.tree.get_selection().set_mode(Gtk.SelectionMode.SINGLE)
    
    147
    -        self.tree.get_selection().connect('changed', self.selection_changed)
    
    145
    +        self._ui.transfers_list.get_selection().set_mode(
    
    146
    +            Gtk.SelectionMode.SINGLE)
    
    147
    +        self._ui.transfers_list.get_selection().connect(
    
    148
    +            'changed', self._selection_changed)
    
    148 149
     
    
    149 150
             # Tooltip
    
    150
    -        self.tree.connect('query-tooltip', self._query_tooltip)
    
    151
    -        self.tree.set_has_tooltip(True)
    
    151
    +        self._ui.transfers_list.connect('query-tooltip', self._query_tooltip)
    
    152
    +        self._ui.transfers_list.set_has_tooltip(True)
    
    152 153
             self.tooltip = FileTransfersTooltip()
    
    153 154
     
    
    154
    -        self.file_transfers_menu = self.xml.get_object('file_transfers_menu')
    
    155
    -        self.open_folder_menuitem = self.xml.get_object('open_folder_menuitem')
    
    156
    -        self.cancel_menuitem = self.xml.get_object('cancel_menuitem')
    
    157
    -        self.pause_menuitem = self.xml.get_object('pause_menuitem')
    
    158
    -        self.continue_menuitem = self.xml.get_object('continue_menuitem')
    
    159
    -        self.remove_menuitem = self.xml.get_object('remove_menuitem')
    
    160
    -        self.xml.connect_signals(self)
    
    155
    +        self._ui.connect_signals(self)
    
    161 156
     
    
    162 157
         def _query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip):
    
    163 158
             try:
    
    ... ... @@ -190,7 +185,7 @@ class FileTransfersWindow:
    190 185
             """
    
    191 186
             Find all transfers with peer 'jid' that belong to 'account'
    
    192 187
             """
    
    193
    -        active_transfers = [[], []] # ['senders', 'receivers']
    
    188
    +        active_transfers = [[], []]  # ['senders', 'receivers']
    
    194 189
             allfp = FilesProp.getAllFileProp()
    
    195 190
             for file_props in allfp:
    
    196 191
                 if file_props.type_ == 's' and file_props.tt_account == account:
    
    ... ... @@ -218,7 +213,7 @@ class FileTransfersWindow:
    218 213
                 path = os.path.split(file_props.file_name)[0]
    
    219 214
                 if os.path.exists(path) and os.path.isdir(path):
    
    220 215
                     helpers.launch_file_manager(path)
    
    221
    -            self.tree.get_selection().unselect_all()
    
    216
    +            self._ui.transfers_list.get_selection().unselect_all()
    
    222 217
     
    
    223 218
             if file_props.type_ == 'r':
    
    224 219
                 # file path is used below in 'Save in'
    
    ... ... @@ -226,36 +221,40 @@ class FileTransfersWindow:
    226 221
             else:
    
    227 222
                 file_name = file_props.name
    
    228 223
             sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name)
    
    229
    -        sectext += '\n\t' + _('Size: %s') % \
    
    230
    -        helpers.convert_bytes(file_props.size)
    
    224
    +        sectext += '\n\t' + _('Size: %s') % helpers.convert_bytes(
    
    225
    +            file_props.size)
    
    231 226
             if file_props.type_ == 'r':
    
    232 227
                 jid = file_props.sender.split('/')[0]
    
    233 228
                 sender_name = app.contacts.get_first_contact_from_jid(
    
    234
    -                    file_props.tt_account, jid).get_shown_name()
    
    229
    +                file_props.tt_account, jid).get_shown_name()
    
    235 230
                 sender = sender_name
    
    236 231
             else:
    
    237
    -            #You is a reply of who sent a file
    
    232
    +            # You is a reply of who sent a file
    
    238 233
                 sender = _('You')
    
    239 234
             sectext += '\n\t' + _('Sender: %s') % sender
    
    240 235
             sectext += '\n\t' + _('Recipient: ')
    
    241 236
             if file_props.type_ == 's':
    
    242 237
                 jid = file_props.receiver.split('/')[0]
    
    243 238
                 receiver_name = app.contacts.get_first_contact_from_jid(
    
    244
    -                    file_props.tt_account, jid).get_shown_name()
    
    239
    +                file_props.tt_account, jid).get_shown_name()
    
    245 240
                 recipient = receiver_name
    
    246 241
             else:
    
    247
    -            #You is a reply of who received a file
    
    242
    +            # You is a reply of who received a file
    
    248 243
                 recipient = _('You')
    
    249 244
             sectext += recipient
    
    250 245
             if file_props.type_ == 'r':
    
    251 246
                 sectext += '\n\t' + _('Saved in: %s') % file_path
    
    252
    -        dialog = HigDialog(app.interface.roster.window, Gtk.MessageType.INFO,
    
    253
    -            Gtk.ButtonsType.NONE, _('File transfer completed'), sectext)
    
    247
    +        dialog = HigDialog(app.interface.roster.window,
    
    248
    +                           Gtk.MessageType.INFO,
    
    249
    +                           Gtk.ButtonsType.NONE,
    
    250
    +                           _('File transfer completed'),
    
    251
    +                           sectext)
    
    254 252
             if file_props.type_ == 'r':
    
    255 253
                 button = Gtk.Button.new_with_mnemonic(_('Open _Containing Folder'))
    
    256 254
                 button.connect('clicked', on_open, file_props)
    
    257 255
                 dialog.action_area.pack_start(button, True, True, 0)
    
    258 256
             ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK)
    
    257
    +
    
    259 258
             def on_ok(widget):
    
    260 259
                 dialog.destroy()
    
    261 260
             ok_button.connect('clicked', on_ok)
    
    ... ... @@ -263,18 +262,22 @@ class FileTransfersWindow:
    263 262
     
    
    264 263
         def show_request_error(self, file_props):
    
    265 264
             """
    
    266
    -        Show error dialog to the recipient saying that transfer has been canceled
    
    265
    +        Show error dialog to the recipient saying that
    
    266
    +        transfer has been canceled
    
    267 267
             """
    
    268
    -        InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.'))
    
    269
    -        self.tree.get_selection().unselect_all()
    
    268
    +        InformationDialog(
    
    269
    +            _('File transfer cancelled'),
    
    270
    +            _('Connection with peer could not be established.'))
    
    271
    +        self._ui.transfers_list.get_selection().unselect_all()
    
    270 272
     
    
    271 273
         def show_send_error(self, file_props):
    
    272 274
             """
    
    273 275
             Show error dialog to the sender saying that transfer has been canceled
    
    274 276
             """
    
    275
    -        InformationDialog(_('File transfer cancelled'),
    
    276
    -                _('Connection with peer cannot be established.'))
    
    277
    -        self.tree.get_selection().unselect_all()
    
    277
    +        InformationDialog(
    
    278
    +            _('File transfer cancelled'),
    
    279
    +            _('Connection with peer could not be established.'))
    
    280
    +        self._ui.transfers_list.get_selection().unselect_all()
    
    278 281
     
    
    279 282
         def show_stopped(self, jid, file_props, error_msg=''):
    
    280 283
             if file_props.type_ == 'r':
    
    ... ... @@ -286,7 +289,7 @@ class FileTransfersWindow:
    286 289
             if error_msg:
    
    287 290
                 sectext += '\n\t' + _('Error message: %s') % error_msg
    
    288 291
             ErrorDialog(_('File transfer stopped'), sectext)
    
    289
    -        self.tree.get_selection().unselect_all()
    
    292
    +        self._ui.transfers_list.get_selection().unselect_all()
    
    290 293
     
    
    291 294
         def show_hash_error(self, jid, file_props, account):
    
    292 295
     
    
    ... ... @@ -310,8 +313,9 @@ class FileTransfersWindow:
    310 313
                 new_file_props.date = file_props.date
    
    311 314
                 new_file_props.hash_ = file_props.hash_
    
    312 315
                 new_file_props.type_ = 'r'
    
    313
    -            tsid = app.connections[account].get_module('Jingle').start_file_transfer(
    
    314
    -                fjid, new_file_props, True)
    
    316
    +            tsid = app.connections[account].get_module(
    
    317
    +                'Jingle').start_file_transfer(fjid, new_file_props, True)
    
    318
    +
    
    315 319
                 new_file_props.transport_sid = tsid
    
    316 320
                 self.add_transfer(account, contact, new_file_props)
    
    317 321
     
    
    ... ... @@ -319,11 +323,14 @@ class FileTransfersWindow:
    319 323
                 file_name = os.path.basename(file_props.file_name)
    
    320 324
             else:
    
    321 325
                 file_name = file_props.name
    
    322
    -        YesNoDialog(('File transfer error'),
    
    326
    +        YesNoDialog(
    
    327
    +            _('File transfer error'),
    
    323 328
                 _('The file %(file)s has been received, but it seems to have '
    
    324
    -            'been damaged along the way.\nDo you want to download it again?') % \
    
    325
    -            {'file': file_name}, on_response_yes=(on_yes, jid, file_props,
    
    326
    -            account), type_=Gtk.MessageType.ERROR)
    
    329
    +              'been damaged along the way.\n'
    
    330
    +              'Do you want to download it again?') %
    
    331
    +            {'file': file_name},
    
    332
    +            on_response_yes=(on_yes, jid, file_props, account),
    
    333
    +            type_=Gtk.MessageType.ERROR)
    
    327 334
     
    
    328 335
         def show_file_send_request(self, account, contact):
    
    329 336
             send_callback = partial(self.send_file, account, contact)
    
    ... ... @@ -344,16 +351,17 @@ class FileTransfersWindow:
    344 351
                     return
    
    345 352
                 (jid, resource) = contact.split('/', 1)
    
    346 353
                 contact = app.contacts.create_contact(jid=jid, account=account,
    
    347
    -                resource=resource)
    
    354
    +                                                  resource=resource)
    
    348 355
             file_name = os.path.split(file_path)[1]
    
    349
    -        file_props = self.get_send_file_props(account, contact,
    
    350
    -                        file_path, file_name, file_desc)
    
    356
    +        file_props = self.get_send_file_props(account, contact, file_path,
    
    357
    +                                              file_name, file_desc)
    
    351 358
             if file_props is None:
    
    352 359
                 return False
    
    353 360
     
    
    354 361
             app.connections[account].get_module('Jingle').start_file_transfer(
    
    355 362
                 contact.get_full_jid(), file_props)
    
    356 363
             self.add_transfer(account, contact, file_props)
    
    364
    +
    
    357 365
             return True
    
    358 366
     
    
    359 367
         def _start_receive(self, file_path, account, contact, file_props):
    
    ... ... @@ -363,7 +371,8 @@ class FileTransfersWindow:
    363 371
             file_props.file_name = file_path
    
    364 372
             file_props.type_ = 'r'
    
    365 373
             self.add_transfer(account, contact, file_props)
    
    366
    -        app.connections[account].get_module('Bytestream').send_file_approval(file_props)
    
    374
    +        app.connections[account].get_module('Bytestream').send_file_approval(
    
    375
    +            file_props)
    
    367 376
     
    
    368 377
         def on_file_request_accepted(self, account, contact, file_props):
    
    369 378
             def on_ok(account, contact, file_props, file_path):
    
    ... ... @@ -371,12 +380,12 @@ class FileTransfersWindow:
    371 380
                     app.config.set('last_save_dir', os.path.dirname(file_path))
    
    372 381
                     # check if we have write permissions
    
    373 382
                     if not os.access(file_path, os.W_OK):
    
    374
    -                    file_name = GLib.markup_escape_text(os.path.basename(
    
    375
    -                        file_path))
    
    383
    +                    file_name = GLib.markup_escape_text(
    
    384
    +                        os.path.basename(file_path))
    
    376 385
                         ErrorDialog(
    
    377 386
                             _('Cannot overwrite existing file "%s"' % file_name),
    
    378
    -                        _('A file with this name already exists and you do not '
    
    379
    -                          'have permission to overwrite it.'))
    
    387
    +                        _('A file with this name already exists and you do '
    
    388
    +                          'not have permission to overwrite it.'))
    
    380 389
                         return
    
    381 390
                     stat = os.stat(file_path)
    
    382 391
                     dl_size = stat.st_size
    
    ... ... @@ -391,8 +400,10 @@ class FileTransfersWindow:
    391 400
                         self._start_receive(file_path, account, contact, file_props)
    
    392 401
     
    
    393 402
                     dialog = FTOverwriteConfirmationDialog(
    
    394
    -                    _('This file already exists'), _('What do you want to do?'),
    
    395
    -                    propose_resume=not dl_finished, on_response=on_response)
    
    403
    +                    _('This file already exists'),
    
    404
    +                    _('What do you want to do?'),
    
    405
    +                    propose_resume=not dl_finished,
    
    406
    +                    on_response=on_response)
    
    396 407
                     dialog.set_destroy_with_parent(True)
    
    397 408
                     return
    
    398 409
     
    
    ... ... @@ -410,7 +421,8 @@ class FileTransfersWindow:
    410 421
     
    
    411 422
             con = app.connections[account]
    
    412 423
             accept_cb = partial(on_ok, account, contact, file_props)
    
    413
    -        cancel_cb = partial(con.get_module('Bytestream').send_file_rejection, file_props)
    
    424
    +        cancel_cb = partial(con.get_module('Bytestream').send_file_rejection,
    
    425
    +                            file_props)
    
    414 426
             FileSaveDialog(accept_cb,
    
    415 427
                            cancel_cb,
    
    416 428
                            path=app.config.get('last_save_dir'),
    
    ... ... @@ -427,10 +439,10 @@ class FileTransfersWindow:
    427 439
                 file_props.name)
    
    428 440
             if file_props.size:
    
    429 441
                 sec_text += '\n\t' + _('Size: %s') % \
    
    430
    -                    helpers.convert_bytes(file_props.size)
    
    442
    +                helpers.convert_bytes(file_props.size)
    
    431 443
             if file_props.mime_type:
    
    432 444
                 sec_text += '\n\t' + _('Type: %s') % file_props.mime_type
    
    433
    -        if  file_props.desc:
    
    445
    +        if file_props.desc:
    
    434 446
                 sec_text += '\n\t' + _('Description: %s') % file_props.desc
    
    435 447
             prim_text = _('%s wants to send you a file:') % contact.jid
    
    436 448
             dialog = None
    
    ... ... @@ -439,13 +451,16 @@ class FileTransfersWindow:
    439 451
                 self.on_file_request_accepted(account, contact, file_props)
    
    440 452
     
    
    441 453
             def on_response_cancel(account, file_props):
    
    442
    -            app.connections[account].get_module('Bytestream').send_file_rejection(file_props)
    
    443
    -
    
    444
    -        dialog = NonModalConfirmationDialog(prim_text, sec_text,
    
    445
    -                on_response_ok=(on_response_ok, account, contact, file_props),
    
    446
    -                on_response_cancel=(on_response_cancel, account, file_props))
    
    454
    +            app.connections[account].get_module(
    
    455
    +                'Bytestream').send_file_rejection(file_props)
    
    456
    +
    
    457
    +        dialog = NonModalConfirmationDialog(
    
    458
    +            prim_text,
    
    459
    +            sec_text,
    
    460
    +            on_response_ok=(on_response_ok, account, contact, file_props),
    
    461
    +            on_response_cancel=(on_response_cancel, account, file_props))
    
    447 462
             dialog.connect('delete-event', lambda widget, event:
    
    448
    -            on_response_cancel(account, file_props))
    
    463
    +                       on_response_cancel(account, file_props))
    
    449 464
             dialog.popup()
    
    450 465
     
    
    451 466
         def set_status(self, file_props, status):
    
    ... ... @@ -475,6 +490,7 @@ class FileTransfersWindow:
    475 490
                 text += helpers.convert_bytes(received_size) + '/' + \
    
    476 491
                     helpers.convert_bytes(full_size)
    
    477 492
                 self.model.set(iter_, Column.PROGRESS, text)
    
    493
    +
    
    478 494
                 def pulse():
    
    479 495
                     p = self.model.get(iter_, Column.PULSE)[0]
    
    480 496
                     if p == GLib.MAXINT32:
    
    ... ... @@ -492,12 +508,12 @@ class FileTransfersWindow:
    492 508
                 self.model.set(iter_, Column.PULSE, GLib.MAXINT32)
    
    493 509
             self.model.set(iter_, Column.IMAGE, self.icons[status])
    
    494 510
             path = self.model.get_path(iter_)
    
    495
    -        self.select_func(path)
    
    511
    +        self._select_func(path)
    
    496 512
     
    
    497 513
         def _format_percent(self, percent):
    
    498 514
             """
    
    499
    -        Add extra spaces from both sides of the percent, so that progress string
    
    500
    -        has always a fixed size
    
    515
    +        Add extra spaces from both sides of the percent, so that progress
    
    516
    +        string has always a fixed size
    
    501 517
             """
    
    502 518
             _str = '          '
    
    503 519
             if percent != 100.:
    
    ... ... @@ -517,9 +533,9 @@ class FileTransfersWindow:
    517 533
                 if _time >= 60:
    
    518 534
                     times['hours'] = _time / 60
    
    519 535
     
    
    520
    -        #Print remaining time in format 00:00:00
    
    521
    -        #You can change the places of (hours), (minutes), (seconds) -
    
    522
    -        #they are not translatable.
    
    536
    +        # Print remaining time in format 00:00:00
    
    537
    +        # You can change the places of (hours), (minutes), (seconds) -
    
    538
    +        # they are not translatable.
    
    523 539
             return _('%(hours)02.d:%(minutes)02.d:%(seconds)02.d') % times
    
    524 540
     
    
    525 541
         def _get_eta_and_speed(self, full_size, transfered_size, file_props):
    
    ... ... @@ -552,17 +568,19 @@ class FileTransfersWindow:
    552 568
                 account = file_props.tt_account
    
    553 569
                 if account in app.connections:
    
    554 570
                     # there is a connection to the account
    
    555
    -                app.connections[account].get_module('Bytestream').remove_transfer(file_props)
    
    556
    -            if file_props.type_ == 'r': # we receive a file
    
    571
    +                app.connections[account].get_module(
    
    572
    +                    'Bytestream').remove_transfer(file_props)
    
    573
    +            if file_props.type_ == 'r':  # we receive a file
    
    557 574
                     other = file_props.sender
    
    558
    -            else: # we send a file
    
    575
    +            else:  # we send a file
    
    559 576
                     other = file_props.receiver
    
    560 577
                 if isinstance(other, str):
    
    561 578
                     jid = app.get_jid_without_resource(other)
    
    562
    -            else: # It's a Contact instance
    
    579
    +            else:  # It's a Contact instance
    
    563 580
                     jid = other.jid
    
    564
    -            for ev_type in ('file-error', 'file-completed', 'file-request-error',
    
    565
    -            'file-send-error', 'file-stopped'):
    
    581
    +            for ev_type in ('file-error', 'file-completed',
    
    582
    +                            'file-request-error', 'file-send-error',
    
    583
    +                            'file-stopped'):
    
    566 584
                     for event in app.events.get_events(account, jid, [ev_type]):
    
    567 585
                         if event.file_props.sid == file_props.sid:
    
    568 586
                             app.events.remove_events(account, jid, event)
    
    ... ... @@ -601,21 +619,22 @@ class FileTransfersWindow:
    601 619
                     full_size -= file_props.offset
    
    602 620
     
    
    603 621
                 if file_props.elapsed_time > 0:
    
    604
    -                file_props.transfered_size.append((file_props.last_time, transfered_size))
    
    622
    +                file_props.transfered_size.append((file_props.last_time,
    
    623
    +                                                   transfered_size))
    
    605 624
                 if len(file_props.transfered_size) > 6:
    
    606 625
                     file_props.transfered_size.pop(0)
    
    607 626
                 eta, speed = self._get_eta_and_speed(full_size, transfered_size,
    
    608
    -                    file_props)
    
    627
    +                                                 file_props)
    
    609 628
     
    
    610 629
                 self.model.set(iter_, Column.PROGRESS, text)
    
    611 630
                 self.model.set(iter_, Column.PERCENT, int(percent))
    
    612 631
                 text = self._format_time(eta)
    
    613 632
                 text += '\n'
    
    614
    -            #This should make the string Kb/s,
    
    615
    -            #where 'Kb' part is taken from %s.
    
    616
    -            #Only the 's' after / (which means second) should be translated.
    
    617
    -            text += _('(%(filesize_unit)s/s)') % {'filesize_unit':
    
    618
    -                    helpers.convert_bytes(speed)}
    
    633
    +            # This should make the string Kb/s,
    
    634
    +            # where 'Kb' part is taken from %s.
    
    635
    +            # Only the 's' after / (which means second) should be translated.
    
    636
    +            text += _('(%(filesize_unit)s/s)') % {
    
    637
    +                'filesize_unit': helpers.convert_bytes(speed)}
    
    619 638
                 self.model.set(iter_, Column.TIME, text)
    
    620 639
     
    
    621 640
                 # try to guess what should be the status image
    
    ... ... @@ -640,7 +659,7 @@ class FileTransfersWindow:
    640 659
                         self.set_status(file_props, 'ok')
    
    641 660
                 elif just_began:
    
    642 661
                     path = self.model.get_path(iter_)
    
    643
    -                self.select_func(path)
    
    662
    +                self._select_func(path)
    
    644 663
     
    
    645 664
         def get_iter_by_sid(self, typ, sid):
    
    646 665
             """
    
    ... ... @@ -659,7 +678,7 @@ class FileTransfersWindow:
    659 678
             return dt.isoformat() + 'Z'
    
    660 679
     
    
    661 680
         def get_send_file_props(self, account, contact, file_path, file_name,
    
    662
    -    file_desc=''):
    
    681
    +                            file_desc=''):
    
    663 682
             """
    
    664 683
             Create new file_props object and set initial file transfer
    
    665 684
             properties in it
    
    ... ... @@ -670,11 +689,12 @@ class FileTransfersWindow:
    670 689
                 ErrorDialog(_('Invalid File'), _('File: ') + file_path)
    
    671 690
                 return None
    
    672 691
             if stat[6] == 0:
    
    673
    -            ErrorDialog(_('Invalid File'),
    
    674
    -            _('It is not possible to send empty files'))
    
    692
    +            ErrorDialog(
    
    693
    +                _('Invalid File'),
    
    694
    +                _('It is not possible to send empty files'))
    
    675 695
                 return None
    
    676
    -        file_props = FilesProp.getNewFileProp(account,
    
    677
    -                                    sid=helpers.get_random_string_16())
    
    696
    +        file_props = FilesProp.getNewFileProp(
    
    697
    +            account, sid=helpers.get_random_string_16())
    
    678 698
             mod_date = os.path.getmtime(file_path)
    
    679 699
             file_props.file_name = file_path
    
    680 700
             file_props.name = file_name
    
    ... ... @@ -696,11 +716,10 @@ class FileTransfersWindow:
    696 716
                 return
    
    697 717
             file_props.elapsed_time = 0
    
    698 718
             iter_ = self.model.prepend()
    
    699
    -        text_labels = '<b>' + _('Name: ') + '</b>\n'
    
    700 719
             if file_props.type_ == 'r':
    
    701
    -            text_labels += '<b>' + _('Sender: ') + '</b>'
    
    720
    +            text_labels = '\n<b>' + _('Sender: ') + '</b>'
    
    702 721
             else:
    
    703
    -            text_labels += '<b>' + _('Recipient: ') + '</b>'
    
    722
    +            text_labels = '\n<b>' + _('Recipient: ') + '</b>'
    
    704 723
     
    
    705 724
             if file_props.type_ == 'r':
    
    706 725
                 file_name = os.path.split(file_props.file_name)[1]
    
    ... ... @@ -708,8 +727,15 @@ class FileTransfersWindow:
    708 727
                 file_name = file_props.name
    
    709 728
             text_props = GLib.markup_escape_text(file_name) + '\n'
    
    710 729
             text_props += contact.get_shown_name()
    
    711
    -        self.model.set(iter_, 1, text_labels, 2, text_props, Column.PULSE, -1, Column.SID,
    
    712
    -                file_props.type_ + file_props.sid)
    
    730
    +        self.model.set(iter_,
    
    731
    +                       1,
    
    732
    +                       text_labels,
    
    733
    +                       2,
    
    734
    +                       text_props,
    
    735
    +                       Column.PULSE,
    
    736
    +                       -1,
    
    737
    +                       Column.SID,
    
    738
    +                       file_props.type_ + file_props.sid)
    
    713 739
             self.set_progress(file_props.type_, file_props.sid, 0, iter_)
    
    714 740
             if file_props.started is False:
    
    715 741
                 status = 'waiting'
    
    ... ... @@ -719,77 +745,76 @@ class FileTransfersWindow:
    719 745
                 status = 'upload'
    
    720 746
             file_props.tt_account = account
    
    721 747
             self.set_status(file_props, status)
    
    722
    -        self.set_cleanup_sensitivity()
    
    748
    +        self._set_cleanup_sensitivity()
    
    723 749
             self.window.show_all()
    
    724 750
     
    
    725
    -    def on_transfers_list_row_activated(self, widget, path, col):
    
    751
    +    def _on_transfers_list_row_activated(self, widget, path, col):
    
    726 752
             # try to open the containing folder
    
    727
    -        self.on_open_folder_menuitem_activate(widget)
    
    753
    +        self._on_open_folder_menuitem_activate(widget)
    
    728 754
     
    
    729
    -    def set_cleanup_sensitivity(self):
    
    755
    +    def _set_cleanup_sensitivity(self):
    
    730 756
             """
    
    731 757
             Check if there are transfer rows and set cleanup_button sensitive, or
    
    732 758
             insensitive if model is empty
    
    733 759
             """
    
    734 760
             if not self.model:
    
    735
    -            self.cleanup_button.set_sensitive(False)
    
    761
    +            self._ui.cleanup_button.set_sensitive(False)
    
    736 762
             else:
    
    737
    -            self.cleanup_button.set_sensitive(True)
    
    763
    +            self._ui.cleanup_button.set_sensitive(True)
    
    738 764
     
    
    739
    -    def set_all_insensitive(self):
    
    765
    +    def _set_all_insensitive(self):
    
    740 766
             """
    
    741 767
             Make all buttons/menuitems insensitive
    
    742 768
             """
    
    743
    -        self.pause_button.set_sensitive(False)
    
    744
    -        self.pause_menuitem.set_sensitive(False)
    
    745
    -        self.continue_menuitem.set_sensitive(False)
    
    746
    -        self.remove_menuitem.set_sensitive(False)
    
    747
    -        self.cancel_button.set_sensitive(False)
    
    748
    -        self.cancel_menuitem.set_sensitive(False)
    
    749
    -        self.open_folder_menuitem.set_sensitive(False)
    
    750
    -        self.set_cleanup_sensitivity()
    
    751
    -
    
    752
    -    def set_buttons_sensitive(self, path, is_row_selected):
    
    769
    +        self._ui.pause_resume_button.set_sensitive(False)
    
    770
    +        self._ui.pause_resume_menuitem.set_sensitive(False)
    
    771
    +        self._ui.remove_menuitem.set_sensitive(False)
    
    772
    +        self._ui.cancel_button.set_sensitive(False)
    
    773
    +        self._ui.cancel_menuitem.set_sensitive(False)
    
    774
    +        self._ui.open_folder_menuitem.set_sensitive(False)
    
    775
    +        self._set_cleanup_sensitivity()
    
    776
    +
    
    777
    +    def _set_buttons_sensitive(self, path, is_row_selected):
    
    753 778
             """
    
    754 779
             Make buttons/menuitems sensitive as appropriate to the state of file
    
    755 780
             transfer located at path 'path'
    
    756 781
             """
    
    757 782
             if path is None:
    
    758
    -            self.set_all_insensitive()
    
    783
    +            self._set_all_insensitive()
    
    759 784
                 return
    
    760 785
             current_iter = self.model.get_iter(path)
    
    761 786
             sid = self.model[current_iter][Column.SID]
    
    762 787
             file_props = FilesProp.getFilePropByType(sid[0], sid[1:])
    
    763
    -        self.remove_menuitem.set_sensitive(is_row_selected)
    
    764
    -        self.open_folder_menuitem.set_sensitive(is_row_selected)
    
    788
    +        self._ui.remove_menuitem.set_sensitive(is_row_selected)
    
    789
    +        self._ui.open_folder_menuitem.set_sensitive(is_row_selected)
    
    765 790
             is_stopped = False
    
    766 791
             if is_transfer_stopped(file_props):
    
    767 792
                 is_stopped = True
    
    768
    -        self.cancel_button.set_sensitive(not is_stopped)
    
    769
    -        self.cancel_menuitem.set_sensitive(not is_stopped)
    
    793
    +        self._ui.cancel_button.set_sensitive(not is_stopped)
    
    794
    +        self._ui.cancel_menuitem.set_sensitive(not is_stopped)
    
    770 795
             if not is_row_selected:
    
    771
    -            # no selection, disable the buttons
    
    772
    -            self.set_all_insensitive()
    
    796
    +            # No selection, disable the buttons
    
    797
    +            self._set_all_insensitive()
    
    773 798
             elif not is_stopped and file_props.continue_cb:
    
    774 799
                 if is_transfer_active(file_props):
    
    775
    -                # file transfer is active
    
    776
    -                self.toggle_pause_continue(True)
    
    777
    -                self.pause_button.set_sensitive(True)
    
    800
    +                # File transfer is active
    
    801
    +                self._toggle_pause_continue(True)
    
    802
    +                self._ui.pause_resume_button.set_sensitive(True)
    
    803
    +                self._ui.pause_resume_menuitem.set_sensitive(True)
    
    778 804
                 elif is_transfer_paused(file_props):
    
    779
    -                # file transfer is paused
    
    780
    -                self.toggle_pause_continue(False)
    
    781
    -                self.pause_button.set_sensitive(True)
    
    805
    +                # File transfer is paused
    
    806
    +                self._toggle_pause_continue(False)
    
    807
    +                self._ui.pause_resume_button.set_sensitive(True)
    
    808
    +                self._ui.pause_resume_menuitem.set_sensitive(True)
    
    782 809
                 else:
    
    783
    -                self.pause_button.set_sensitive(False)
    
    784
    -                self.pause_menuitem.set_sensitive(False)
    
    785
    -                self.continue_menuitem.set_sensitive(False)
    
    810
    +                self._ui.pause_resume_button.set_sensitive(False)
    
    811
    +                self._ui.pause_resume_menuitem.set_sensitive(False)
    
    786 812
             else:
    
    787
    -            self.pause_button.set_sensitive(False)
    
    788
    -            self.pause_menuitem.set_sensitive(False)
    
    789
    -            self.continue_menuitem.set_sensitive(False)
    
    813
    +            self._ui.pause_resume_button.set_sensitive(False)
    
    814
    +            self._ui.pause_resume_menuitem.set_sensitive(False)
    
    790 815
             return True
    
    791 816
     
    
    792
    -    def selection_changed(self, args):
    
    817
    +    def _selection_changed(self, args):
    
    793 818
             """
    
    794 819
             Selection has changed - change the sensitivity of the buttons/menuitems
    
    795 820
             """
    
    ... ... @@ -797,22 +822,22 @@ class FileTransfersWindow:
    797 822
             selected = selection.get_selected_rows()
    
    798 823
             if selected[1] != []:
    
    799 824
                 selected_path = selected[1][0]
    
    800
    -            self.select_func(selected_path)
    
    825
    +            self._select_func(selected_path)
    
    801 826
             else:
    
    802
    -            self.set_all_insensitive()
    
    827
    +            self._set_all_insensitive()
    
    803 828
     
    
    804
    -    def select_func(self, path):
    
    829
    +    def _select_func(self, path):
    
    805 830
             is_selected = False
    
    806
    -        selected = self.tree.get_selection().get_selected_rows()
    
    831
    +        selected = self._ui.transfers_list.get_selection().get_selected_rows()
    
    807 832
             if selected[1] != []:
    
    808 833
                 selected_path = selected[1][0]
    
    809 834
                 if selected_path == path:
    
    810 835
                     is_selected = True
    
    811
    -        self.set_buttons_sensitive(path, is_selected)
    
    812
    -        self.set_cleanup_sensitivity()
    
    836
    +        self._set_buttons_sensitive(path, is_selected)
    
    837
    +        self._set_cleanup_sensitivity()
    
    813 838
             return True
    
    814 839
     
    
    815
    -    def on_cleanup_button_clicked(self, widget):
    
    840
    +    def _on_cleanup_button_clicked(self, widget):
    
    816 841
             i = len(self.model) - 1
    
    817 842
             while i >= 0:
    
    818 843
                 iter_ = self.model.get_iter((i))
    
    ... ... @@ -821,33 +846,19 @@ class FileTransfersWindow:
    821 846
                 if is_transfer_stopped(file_props):
    
    822 847
                     self._remove_transfer(iter_, sid, file_props)
    
    823 848
                 i -= 1
    
    824
    -        self.tree.get_selection().unselect_all()
    
    825
    -        self.set_all_insensitive()
    
    849
    +        self._ui.transfers_list.get_selection().unselect_all()
    
    850
    +        self._set_all_insensitive()
    
    826 851
     
    
    827
    -    def toggle_pause_continue(self, status):
    
    852
    +    def _toggle_pause_continue(self, status):
    
    828 853
             if status:
    
    829
    -            label = _('Pause')
    
    830
    -            self.pause_button.set_label(label)
    
    831
    -            self.pause_button.set_image(Gtk.Image.new_from_icon_name(
    
    832
    -                    "media-playback-pause", Gtk.IconSize.MENU))
    
    833
    -
    
    834
    -            self.pause_menuitem.set_sensitive(True)
    
    835
    -            self.pause_menuitem.set_no_show_all(False)
    
    836
    -            self.continue_menuitem.hide()
    
    837
    -            self.continue_menuitem.set_no_show_all(True)
    
    838
    -
    
    854
    +            self._ui.pause_resume_button.set_icon_name(
    
    855
    +                'media-playback-pause-symbolic')
    
    839 856
             else:
    
    840
    -            label = _('_Continue')
    
    841
    -            self.pause_button.set_label(label)
    
    842
    -            self.pause_button.set_image(Gtk.Image.new_from_icon_name(
    
    843
    -                    "media-playback-start", Gtk.IconSize.MENU))
    
    844
    -            self.pause_menuitem.hide()
    
    845
    -            self.pause_menuitem.set_no_show_all(True)
    
    846
    -            self.continue_menuitem.set_sensitive(True)
    
    847
    -            self.continue_menuitem.set_no_show_all(False)
    
    848
    -
    
    849
    -    def on_pause_restore_button_clicked(self, widget):
    
    850
    -        selected = self.tree.get_selection().get_selected()
    
    857
    +            self._ui.pause_resume_button.set_icon_name(
    
    858
    +                'media-playback-start-symbolic')
    
    859
    +
    
    860
    +    def _on_pause_resume_button_clicked(self, widget):
    
    861
    +        selected = self._ui.transfers_list.get_selection().get_selected()
    
    851 862
             if selected is None or selected[1] is None:
    
    852 863
                 return
    
    853 864
             s_iter = selected[1]
    
    ... ... @@ -856,20 +867,20 @@ class FileTransfersWindow:
    856 867
             if is_transfer_paused(file_props):
    
    857 868
                 file_props.last_time = time.time()
    
    858 869
                 file_props.paused = False
    
    859
    -            types = {'r' : 'download', 's' : 'upload'}
    
    870
    +            types = {'r': 'download', 's': 'upload'}
    
    860 871
                 self.set_status(file_props, types[sid[0]])
    
    861
    -            self.toggle_pause_continue(True)
    
    872
    +            self._toggle_pause_continue(True)
    
    862 873
                 if file_props.continue_cb:
    
    863 874
                     file_props.continue_cb()
    
    864 875
             elif is_transfer_active(file_props):
    
    865 876
                 file_props.paused = True
    
    866 877
                 self.set_status(file_props, 'pause')
    
    867
    -            # reset that to compute speed only when we resume
    
    878
    +            # Reset that to compute speed only when we resume
    
    868 879
                 file_props.transfered_size = []
    
    869
    -            self.toggle_pause_continue(False)
    
    880
    +            self._toggle_pause_continue(False)
    
    870 881
     
    
    871
    -    def on_cancel_button_clicked(self, widget):
    
    872
    -        selected = self.tree.get_selection().get_selected()
    
    882
    +    def _on_cancel_button_clicked(self, widget):
    
    883
    +        selected = self._ui.transfers_list.get_selection().get_selected()
    
    873 884
             if selected is None or selected[1] is None:
    
    874 885
                 return
    
    875 886
             s_iter = selected[1]
    
    ... ... @@ -885,76 +896,78 @@ class FileTransfersWindow:
    885 896
             con.get_module('Bytestream').disconnect_transfer(file_props)
    
    886 897
             self.set_status(file_props, 'stop')
    
    887 898
     
    
    888
    -    def on_notify_ft_complete_checkbox_toggled(self, widget):
    
    889
    -        app.config.set('notify_on_file_complete',
    
    890
    -                widget.get_active())
    
    891
    -
    
    892
    -    def on_file_transfers_dialog_delete_event(self, widget, event):
    
    893
    -        self.window.hide()
    
    894
    -        return True # do NOT destroy window
    
    899
    +    def _on_notify_ft_complete_toggled(self, widget, *args):
    
    900
    +        app.config.set('notify_on_file_complete', widget.get_active())
    
    895 901
     
    
    896
    -    def on_close_button_clicked(self, widget):
    
    902
    +    def _on_file_transfers_dialog_delete_event(self, widget, event):
    
    897 903
             self.window.hide()
    
    904
    +        return True  # Do NOT destroy window
    
    898 905
     
    
    899
    -    def show_context_menu(self, event, iter_):
    
    906
    +    def _show_context_menu(self, event, iter_):
    
    900 907
             # change the sensitive property of the buttons and menuitems
    
    901 908
             if iter_:
    
    902 909
                 path = self.model.get_path(iter_)
    
    903
    -            self.set_buttons_sensitive(path, True)
    
    910
    +            self._set_buttons_sensitive(path, True)
    
    904 911
     
    
    905 912
             event_button = gtkgui_helpers.get_possible_button_event(event)
    
    906
    -        self.file_transfers_menu.show_all()
    
    907
    -        self.file_transfers_menu.popup(None, self.tree, None, None,
    
    908
    -                event_button, event.time)
    
    909
    -
    
    910
    -    def on_transfers_list_key_press_event(self, widget, event):
    
    913
    +        self._ui.file_transfers_menu.show_all()
    
    914
    +        self._ui.file_transfers_menu.popup(
    
    915
    +            None,
    
    916
    +            self._ui.transfers_list,
    
    917
    +            None,
    
    918
    +            None,
    
    919
    +            event_button,
    
    920
    +            event.time)
    
    921
    +
    
    922
    +    def _on_transfers_list_key_press_event(self, widget, event):
    
    911 923
             """
    
    912 924
             When a key is pressed in the treeviews
    
    913 925
             """
    
    914 926
             iter_ = None
    
    915 927
             try:
    
    916
    -            iter_ = self.tree.get_selection().get_selected()[1]
    
    928
    +            iter_ = self._ui.transfers_list.get_selection().get_selected()[1]
    
    917 929
             except TypeError:
    
    918
    -            self.tree.get_selection().unselect_all()
    
    930
    +            self._ui.transfers_list.get_selection().unselect_all()
    
    919 931
     
    
    920 932
             if iter_ is not None:
    
    921 933
                 path = self.model.get_path(iter_)
    
    922
    -            self.tree.get_selection().select_path(path)
    
    934
    +            self._ui.transfers_list.get_selection().select_path(path)
    
    923 935
     
    
    924 936
             if event.keyval == Gdk.KEY_Menu:
    
    925
    -            self.show_context_menu(event, iter_)
    
    937
    +            self._show_context_menu(event, iter_)
    
    926 938
                 return True
    
    927 939
     
    
    928
    -
    
    929
    -    def on_transfers_list_button_release_event(self, widget, event):
    
    940
    +    def _on_transfers_list_button_release_event(self, widget, event):
    
    930 941
             # hide tooltip, no matter the button is pressed
    
    931 942
             path = None
    
    932 943
             try:
    
    933
    -            path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0]
    
    944
    +            path = self._ui.transfers_list.get_path_at_pos(int(event.x),
    
    945
    +                                                           int(event.y))[0]
    
    934 946
             except TypeError:
    
    935
    -            self.tree.get_selection().unselect_all()
    
    947
    +            self._ui.transfers_list.get_selection().unselect_all()
    
    936 948
             if path is None:
    
    937
    -            self.set_all_insensitive()
    
    949
    +            self._set_all_insensitive()
    
    938 950
             else:
    
    939
    -            self.select_func(path)
    
    951
    +            self._select_func(path)
    
    940 952
     
    
    941
    -    def on_transfers_list_button_press_event(self, widget, event):
    
    953
    +    def _on_transfers_list_button_press_event(self, widget, event):
    
    942 954
             # hide tooltip, no matter the button is pressed
    
    943 955
             path, iter_ = None, None
    
    944 956
             try:
    
    945
    -            path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0]
    
    957
    +            path = self._ui.transfers_list.get_path_at_pos(int(event.x),
    
    958
    +                                                           int(event.y))[0]
    
    946 959
             except TypeError:
    
    947
    -            self.tree.get_selection().unselect_all()
    
    948
    -        if event.button == 3: # Right click
    
    960
    +            self._ui.transfers_list.get_selection().unselect_all()
    
    961
    +        if event.button == 3:  # Right click
    
    949 962
                 if path:
    
    950
    -                self.tree.get_selection().select_path(path)
    
    963
    +                self._ui.transfers_list.get_selection().select_path(path)
    
    951 964
                     iter_ = self.model.get_iter(path)
    
    952
    -            self.show_context_menu(event, iter_)
    
    965
    +            self._show_context_menu(event, iter_)
    
    953 966
                 if path:
    
    954 967
                     return True
    
    955 968
     
    
    956
    -    def on_open_folder_menuitem_activate(self, widget):
    
    957
    -        selected = self.tree.get_selection().get_selected()
    
    969
    +    def _on_open_folder_menuitem_activate(self, widget):
    
    970
    +        selected = self._ui.transfers_list.get_selection().get_selected()
    
    958 971
             if not selected or not selected[1]:
    
    959 972
                 return
    
    960 973
             s_iter = selected[1]
    
    ... ... @@ -966,51 +979,48 @@ class FileTransfersWindow:
    966 979
             if os.path.exists(path) and os.path.isdir(path):
    
    967 980
                 helpers.launch_file_manager(path)
    
    968 981
     
    
    969
    -    def on_cancel_menuitem_activate(self, widget):
    
    970
    -        self.on_cancel_button_clicked(widget)
    
    982
    +    def _on_cancel_menuitem_activate(self, widget):
    
    983
    +        self._on_cancel_button_clicked(widget)
    
    971 984
     
    
    972
    -    def on_continue_menuitem_activate(self, widget):
    
    973
    -        self.on_pause_restore_button_clicked(widget)
    
    985
    +    def _on_continue_menuitem_activate(self, widget):
    
    986
    +        self._on_pause_resume_button_clicked(widget)
    
    974 987
     
    
    975
    -    def on_pause_menuitem_activate(self, widget):
    
    976
    -        self.on_pause_restore_button_clicked(widget)
    
    988
    +    def _on_pause_resume_menuitem_activate(self, widget):
    
    989
    +        self._on_pause_resume_button_clicked(widget)
    
    977 990
     
    
    978
    -    def on_remove_menuitem_activate(self, widget):
    
    979
    -        selected = self.tree.get_selection().get_selected()
    
    991
    +    def _on_remove_menuitem_activate(self, widget):
    
    992
    +        selected = self._ui.transfers_list.get_selection().get_selected()
    
    980 993
             if not selected or not selected[1]:
    
    981 994
                 return
    
    982 995
             s_iter = selected[1]
    
    983 996
             sid = self.model[s_iter][Column.SID]
    
    984 997
             file_props = FilesProp.getFilePropByType(sid[0], sid[1:])
    
    985 998
             self._remove_transfer(s_iter, sid, file_props)
    
    986
    -        self.set_all_insensitive()
    
    999
    +        self._set_all_insensitive()
    
    987 1000
     
    
    988
    -    def on_file_transfers_window_key_press_event(self, widget, event):
    
    989
    -        if event.keyval == Gdk.KEY_Escape: # ESCAPE
    
    1001
    +    def _on_file_transfers_window_key_press_event(self, widget, event):
    
    1002
    +        if event.keyval == Gdk.KEY_Escape:  # ESCAPE
    
    990 1003
                 self.window.hide()
    
    991 1004
     
    
    992 1005
     
    
    993 1006
     class SendFileDialog(Gtk.ApplicationWindow):
    
    994 1007
         def __init__(self, send_callback, transient_for):
    
    995
    -        active_window = app.app.get_active_window()
    
    996 1008
             Gtk.ApplicationWindow.__init__(self)
    
    997 1009
             self.set_name('SendFileDialog')
    
    998 1010
             self.set_application(app.app)
    
    999 1011
             self.set_show_menubar(False)
    
    1000 1012
             self.set_resizable(True)
    
    1001
    -        self.set_default_size(400, 250)
    
    1013
    +        self.set_default_size(500, 350)
    
    1002 1014
             self.set_type_hint(Gdk.WindowTypeHint.DIALOG)
    
    1003
    -        self.set_transient_for(active_window)
    
    1015
    +        self.set_transient_for(transient_for)
    
    1004 1016
             self.set_title(_('Choose a File to Send…'))
    
    1005 1017
             self.set_destroy_with_parent(True)
    
    1006 1018
     
    
    1007 1019
             self._send_callback = send_callback
    
    1008 1020
     
    
    1009
    -        self._ui = get_builder('send_file_dialog.ui')
    
    1010
    -
    
    1021
    +        self._ui = get_builder('filetransfers_send_file_dialog.ui')
    
    1011 1022
             self.add(self._ui.send_file_grid)
    
    1012 1023
             self.connect('key-press-event', self._key_press_event)
    
    1013
    -
    
    1014 1024
             self._ui.connect_signals(self)
    
    1015 1025
             self.show_all()
    
    1016 1026
     
    
    ... ... @@ -1025,10 +1035,12 @@ class SendFileDialog(Gtk.ApplicationWindow):
    1025 1035
                               transient_for=self,
    
    1026 1036
                               path=app.config.get('last_send_dir'))
    
    1027 1037
     
    
    1028
    -    def _set_files(self, filenames):
    
    1029
    -        # Clear the ListBox
    
    1030
    -        self._ui.listbox.foreach(self._remove_widget, None)
    
    1038
    +    def _remove_files(self, button):
    
    1039
    +        selected = self._ui.listbox.get_selected_rows()
    
    1040
    +        for item in selected:
    
    1041
    +            self._ui.listbox.remove(item)
    
    1031 1042
     
    
    1043
    +    def _set_files(self, filenames):
    
    1032 1044
             for file in filenames:
    
    1033 1045
                 row = FileRow(file)
    
    1034 1046
                 if row.path.is_dir():
    
    ... ... @@ -1038,9 +1050,6 @@ class SendFileDialog(Gtk.ApplicationWindow):
    1038 1050
             self._ui.listbox.show_all()
    
    1039 1051
             app.config.set('last_send_dir', str(last_dir))
    
    1040 1052
     
    
    1041
    -    def _remove_widget(self, widget, data):
    
    1042
    -        self._ui.listbox.remove(widget)
    
    1043
    -
    
    1044 1053
         def _get_description(self):
    
    1045 1054
             buffer_ = self._ui.description.get_buffer()
    
    1046 1055
             start, end = buffer_.get_bounds()
    

  • gajim/gtk/tooltips.py
    ... ... @@ -549,16 +549,19 @@ class FileTransfersTooltip():
    549 549
             return False, self.widget
    
    550 550
     
    
    551 551
         def _create_tooltip(self, file_props, _sid):
    
    552
    -        ft_table = Gtk.Table(2, 1)
    
    553
    -        ft_table.set_property('column-spacing', 2)
    
    554
    -        current_row = 1
    
    552
    +        ft_grid = Gtk.Grid.new()
    
    553
    +        ft_grid.insert_column(0)
    
    554
    +        ft_grid.set_row_spacing(6)
    
    555
    +        ft_grid.set_column_spacing(12)
    
    556
    +        current_row = 0
    
    555 557
             properties = []
    
    556 558
             name = file_props.name
    
    557 559
             if file_props.type_ == 'r':
    
    558 560
                 file_name = os.path.split(file_props.file_name)[1]
    
    559 561
             else:
    
    560 562
                 file_name = file_props.name
    
    561
    -        properties.append((_('Name: '), GLib.markup_escape_text(file_name)))
    
    563
    +        properties.append((_('File Name: '),
    
    564
    +                           GLib.markup_escape_text(file_name)))
    
    562 565
             if file_props.type_ == 'r':
    
    563 566
                 type_ = Q_('?Noun:Download')
    
    564 567
                 actor = _('Sender: ')
    
    ... ... @@ -573,58 +576,55 @@ class FileTransfersTooltip():
    573 576
                     name = receiver.get_shown_name()
    
    574 577
                 else:
    
    575 578
                     name = receiver.split('/')[0]
    
    576
    -        properties.append((_('Type: '), type_))
    
    579
    +        properties.append((Q_('?transfer type:Type: '), type_))
    
    577 580
             properties.append((actor, GLib.markup_escape_text(name)))
    
    578 581
     
    
    579 582
             transfered_len = file_props.received_len
    
    580 583
             if not transfered_len:
    
    581 584
                 transfered_len = 0
    
    582
    -        properties.append((_('Transferred: '), helpers.convert_bytes(transfered_len)))
    
    585
    +        properties.append((Q_('?transfer status:Transferred: '),
    
    586
    +                           helpers.convert_bytes(transfered_len)))
    
    583 587
             status = self._get_current_status(file_props)
    
    584
    -        properties.append((_('Status: '), status))
    
    588
    +        properties.append((Q_('?transfer status:Status: '), status))
    
    585 589
             file_desc = file_props.desc or ''
    
    586
    -        properties.append((_('Description: '), GLib.markup_escape_text(
    
    587
    -            file_desc)))
    
    590
    +        properties.append((_('Description: '),
    
    591
    +                           GLib.markup_escape_text(file_desc)))
    
    592
    +
    
    588 593
             while properties:
    
    589 594
                 property_ = properties.pop(0)
    
    590
    -            current_row += 1
    
    591 595
                 label = Gtk.Label()
    
    592
    -            label.set_halign(Gtk.Align.START)
    
    593
    -            label.set_valign(Gtk.Align.START)
    
    596
    +            label.set_halign(Gtk.Align.END)
    
    597
    +            label.set_valign(Gtk.Align.CENTER)
    
    594 598
                 label.set_markup(property_[0])
    
    595
    -            ft_table.attach(
    
    596
    -                label, 1, 2, current_row, current_row + 1,
    
    597
    -                Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0)
    
    599
    +            ft_grid.attach(label, 0, current_row, 1, 1)
    
    598 600
                 label = Gtk.Label()
    
    599 601
                 label.set_halign(Gtk.Align.START)
    
    600 602
                 label.set_valign(Gtk.Align.START)
    
    601 603
                 label.set_line_wrap(True)
    
    602 604
                 label.set_markup(property_[1])
    
    603
    -            ft_table.attach(
    
    604
    -                label, 2, 3, current_row, current_row + 1,
    
    605
    -                Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL,
    
    606
    -                Gtk.AttachOptions.FILL, 0, 0)
    
    605
    +            ft_grid.attach(label, 1, current_row, 1, 1)
    
    606
    +            current_row += 1
    
    607 607
     
    
    608
    -        ft_table.show_all()
    
    609
    -        return ft_table
    
    608
    +        ft_grid.show_all()
    
    609
    +        return ft_grid
    
    610 610
     
    
    611 611
         @staticmethod
    
    612 612
         def _get_current_status(file_props):
    
    613 613
             if file_props.stopped:
    
    614
    -            return _('Aborted')
    
    614
    +            return Q_('?transfer status:Aborted')
    
    615 615
             if file_props.completed:
    
    616
    -            return _('Completed')
    
    616
    +            return Q_('?transfer status:Completed')
    
    617 617
             if file_props.paused:
    
    618 618
                 return Q_('?transfer status:Paused')
    
    619 619
             if file_props.stalled:
    
    620 620
                 # stalled is not paused. it is like 'frozen' it stopped alone
    
    621
    -            return _('Stalled')
    
    621
    +            return Q_('?transfer status:Stalled')
    
    622 622
     
    
    623 623
             if file_props.connected:
    
    624 624
                 if file_props.started:
    
    625
    -                return _('Transferring')
    
    626
    -            return _('Not started')
    
    627
    -        return _('Not started')
    
    625
    +                return Q_('?transfer status:Transferring')
    
    626
    +            return Q_('?transfer status:Not started')
    
    627
    +        return Q_('?transfer status:Not started')
    
    628 628
     
    
    629 629
     
    
    630 630
     def colorize_status(status):