app_actions.py 10.4 KB
Newer Older
Philipp Hörist's avatar
Philipp Hörist committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Copyright (C) 2017 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of Gajim.
#
# Gajim is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
# Gajim is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
16

Philipp Hörist's avatar
Philipp Hörist committed
17
18
19
from gi.repository import Gtk
from gi.repository import Gdk

20
from gajim.common import app
André's avatar
André committed
21
from gajim.common import helpers
22
from gajim.common.app import interface
André's avatar
André committed
23
24
25
from gajim.common.exceptions import GajimGeneralException
from gajim import config
from gajim import dialogs
26
from gajim.accounts_window import AccountsWindow
André's avatar
André committed
27
28
import gajim.plugins.gui
from gajim import disco
29
30

from gajim.gtk.dialogs import ShortcutsWindow
31
from gajim.gtk.history_sync import HistorySyncAssistant
32
from gajim.gtk.server_info import ServerInfoDialog
Philipp Hörist's avatar
Philipp Hörist committed
33
from gajim.gtk.mam_preferences import MamPreferences
34
from gajim.gtk.preferences import Preferences
35
36
37
38
39
40
41
42
43
44
45
from gajim.gtk.join_groupchat import JoinGroupchatWindow
from gajim.gtk.start_chat import StartChatDialog
from gajim.gtk.add_contact import AddNewContactWindow
from gajim.gtk.single_message import SingleMessageWindow
from gajim.gtk.xml_console import XMLConsoleWindow
from gajim.gtk.about import AboutDialog
from gajim.gtk.privacy_list import PrivacyListsWindow
from gajim.gtk.bookmarks import ManageBookmarksWindow
from gajim.gtk.features import FeaturesDialog
from gajim.gtk.account_wizard import AccountCreationWizard
from gajim.gtk.history import HistoryWindow
46
47


Philipp Hörist's avatar
Philipp Hörist committed
48
49
50
# General Actions

def on_add_contact_jid(action, param):
51
    AddNewContactWindow(None, param.get_string())
Philipp Hörist's avatar
Philipp Hörist committed
52
53
54
55
56

# Application Menu Actions


def on_preferences(action, param):
57
58
59
    window = app.get_app_window(Preferences)
    if window is None:
        Preferences()
Philipp Hörist's avatar
Philipp Hörist committed
60
    else:
61
        window.present()
Philipp Hörist's avatar
Philipp Hörist committed
62
63
64
65
66
67
68
69
70
71


def on_plugins(action, param):
    if 'plugins' in interface.instances:
        interface.instances['plugins'].window.present()
    else:
        interface.instances['plugins'] = gajim.plugins.gui.PluginsWindow()


def on_accounts(action, param):
72
73
74
    window = app.get_app_window(AccountsWindow)
    if window is None:
        AccountsWindow()
Philipp Hörist's avatar
Philipp Hörist committed
75
    else:
76
        window.present()
Philipp Hörist's avatar
Philipp Hörist committed
77
78
79
80
81
82
83
84


def on_history_manager(action, param):
    from gajim.history_manager import HistoryManager
    HistoryManager()


def on_manage_bookmarks(action, param):
85
    ManageBookmarksWindow()
Philipp Hörist's avatar
Philipp Hörist committed
86
87
88
89
90
91
92
93
94
95


def on_quit(action, param):
    interface.roster.on_quit_request()


def on_new_chat(action, param):
    if 'start_chat' in app.interface.instances:
        app.interface.instances['start_chat'].present()
    else:
96
        app.interface.instances['start_chat'] = StartChatDialog()
Philipp Hörist's avatar
Philipp Hörist committed
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

# Accounts Actions


def on_profile(action, param):
    interface.edit_own_details(param.get_string())


def on_activate_bookmark(action, param):
    dict_ = param.unpack()
    account, jid, nick, password = \
        dict_['account'], dict_['jid'], None, None
    if 'nick' in dict_:
        nick = dict_['nick']
    if 'password' in dict_:
        password = dict_['password']
    interface.join_gc_room(account, jid, nick, password)


def on_send_server_message(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/online'
120
    SingleMessageWindow(account, server, 'send')
Philipp Hörist's avatar
Philipp Hörist committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136


def on_service_disco(action, param):
    account = param.get_string()
    server_jid = app.config.get_per('accounts', account, 'hostname')
    if server_jid in interface.instances[account]['disco']:
        interface.instances[account]['disco'][server_jid].\
            window.present()
    else:
        try:
            # Object will add itself to the window dict
            disco.ServiceDiscoveryWindow(account, address_entry=True)
        except GajimGeneralException:
            pass


Philipp Hörist's avatar
Philipp Hörist committed
137
138
def on_join_gc(_action, param):
    account, jid = None, None
139
140
141
142
    if param is None:
        if not app.get_connected_accounts():
            return
    else:
Philipp Hörist's avatar
Philipp Hörist committed
143
144
145
        account, jid = param.get_strv()
        if not jid:
            jid = None
146
    window = app.get_app_window(JoinGroupchatWindow)
147
    if window is None:
Philipp Hörist's avatar
Philipp Hörist committed
148
        JoinGroupchatWindow(account, jid)
Philipp Hörist's avatar
Philipp Hörist committed
149
    else:
150
        window.present()
Philipp Hörist's avatar
Philipp Hörist committed
151
152


Philipp Hörist's avatar
Philipp Hörist committed
153
154
155
156
157
def on_add_contact(_action, param):
    account, jid = param.get_strv()
    if not jid:
        jid = None
    window = app.get_app_window(AddNewContactWindow, account)
Sophie Herold's avatar
Sophie Herold committed
158
    if window is None:
Philipp Hörist's avatar
Philipp Hörist committed
159
        AddNewContactWindow(account, jid)
Sophie Herold's avatar
Sophie Herold committed
160
161
    else:
        window.present()
Philipp Hörist's avatar
Philipp Hörist committed
162
163
164


def on_single_message(action, param):
165
    SingleMessageWindow(param.get_string(), action='send')
Philipp Hörist's avatar
Philipp Hörist committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189


def on_merge_accounts(action, param):
    action.set_state(param)
    value = param.get_boolean()
    app.config.set('mergeaccounts', value)
    # Do not merge accounts if only one active
    if len(app.connections) >= 2:
        app.interface.roster.regroup = value
    else:
        app.interface.roster.regroup = False
    app.interface.roster.setup_and_draw_roster()


def on_use_pgp_agent(action, param):
    action.set_state(param)
    app.config.set('use_gpg_agent', param.get_boolean())


def on_add_account(action, param):
    if 'account_creation_wizard' in app.interface.instances:
        app.interface.instances['account_creation_wizard'].window.present()
    else:
        app.interface.instances['account_creation_wizard'] = \
190
            AccountCreationWizard()
Philipp Hörist's avatar
Philipp Hörist committed
191
192
193
194
195
196
197
198
199
200
201
202
203


def on_import_contacts(action, param):
    account = param.get_string()
    if 'import_contacts' in app.interface.instances:
        app.interface.instances['import_contacts'].dialog.present()
    else:
        app.interface.instances['import_contacts'] = \
            dialogs.SynchroniseSelectAccountDialog(account)

# Advanced Actions


Philipp Hörist's avatar
Philipp Hörist committed
204
def on_mam_preferences(action, param):
Philipp Hörist's avatar
Philipp Hörist committed
205
    account = param.get_string()
Philipp Hörist's avatar
Philipp Hörist committed
206
207
208
    window = app.get_app_window(MamPreferences, account)
    if window is None:
        MamPreferences(account)
Philipp Hörist's avatar
Philipp Hörist committed
209
    else:
Philipp Hörist's avatar
Philipp Hörist committed
210
        window.present()
Philipp Hörist's avatar
Philipp Hörist committed
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227


def on_history_sync(action, param):
    account = param.get_string()
    if 'history_sync' in interface.instances[account]:
        interface.instances[account]['history_sync'].present()
    else:
        interface.instances[account]['history_sync'] = \
            HistorySyncAssistant(account, interface.roster.window)


def on_privacy_lists(action, param):
    account = param.get_string()
    if 'privacy_lists' in interface.instances[account]:
        interface.instances[account]['privacy_lists'].window.present()
    else:
        interface.instances[account]['privacy_lists'] = \
228
            PrivacyListsWindow(account)
Philipp Hörist's avatar
Philipp Hörist committed
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245


def on_server_info(action, param):
    account = param.get_string()
    if 'server_info' in interface.instances[account]:
        interface.instances[account]['server_info'].present()
    else:
        interface.instances[account]['server_info'] = \
            ServerInfoDialog(account)


def on_xml_console(action, param):
    account = param.get_string()
    if 'xml_console' in interface.instances[account]:
        interface.instances[account]['xml_console'].present()
    else:
        interface.instances[account]['xml_console'] = \
246
            XMLConsoleWindow(account)
Philipp Hörist's avatar
Philipp Hörist committed
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262


def on_manage_proxies(action, param):
    if 'manage_proxies' in app.interface.instances:
        app.interface.instances['manage_proxies'].window.present()
    else:
        app.interface.instances['manage_proxies'] = \
            config.ManageProxiesWindow(interface.roster.window)

# Admin Actions


def on_set_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd'
263
    SingleMessageWindow(account, server, 'send')
Philipp Hörist's avatar
Philipp Hörist committed
264
265
266
267
268
269


def on_update_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd/update'
270
    SingleMessageWindow(account, server, 'send')
Philipp Hörist's avatar
Philipp Hörist committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292


def on_delete_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd/delete'
    app.connections[account].send_motd(server)

# Help Actions


def on_contents(action, param):
    helpers.launch_browser_mailer(
        'url', 'https://dev.gajim.org/gajim/gajim/wikis')


def on_faq(action, param):
    helpers.launch_browser_mailer(
        'url', 'https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq')


def on_keyboard_shortcuts(action, param):
293
    ShortcutsWindow()
Philipp Hörist's avatar
Philipp Hörist committed
294
295
296


def on_features(action, param):
297
    FeaturesDialog()
Philipp Hörist's avatar
Philipp Hörist committed
298
299
300


def on_about(action, param):
301
    AboutDialog()
Philipp Hörist's avatar
Philipp Hörist committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317

# View Actions


def on_file_transfers(action, param):
    if interface.instances['file_transfers']. \
            window.get_property('visible'):
        interface.instances['file_transfers'].window.present()
    else:
        interface.instances['file_transfers'].window.show_all()


def on_history(action, param):
    if 'logs' in interface.instances:
        interface.instances['logs'].window.present()
    else:
318
        interface.instances['logs'] = HistoryWindow()
Philipp Hörist's avatar
Philipp Hörist committed
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346


def on_open_event(action, param):
    dict_ = param.unpack()
    app.interface.handle_event(
        dict_['account'], dict_['jid'], dict_['type_'])


# Other Actions

def toggle_ipython(action, param):
    """
    Show/hide the ipython window
    """
    win = app.ipython_window
    if win and win.window.is_visible():
        win.present()
    else:
        app.interface.create_ipython_window()


def show_next_pending_event(action, param):
    """
    Show the window(s) with next pending event in tabbed/group chats
    """
    if app.events.get_nb_events():
        account, jid, event = app.events.get_first_systray_event()
        if not event:
347
            return
Philipp Hörist's avatar
Philipp Hörist committed
348
        app.interface.handle_event(account, jid, event.type_)
Philipp Hörist's avatar
Philipp Hörist committed
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370


def open_link(_action, param):
    kind, link = param.get_strv()
    helpers.launch_browser_mailer(kind, link)


def copy_link(_action, param):
    text = param.get_string()
    clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    clip.set_text(text, -1)


def start_chat(_action, param):
    account, jid = param.get_strv()
    app.interface.new_chat_from_jid(account, jid)


def join_groupchat(_action, param):
    account, jid = param.get_strv()
    room_jid = jid.split('?')[0]
    app.interface.join_gc_minimal(account, room_jid)