app_actions.py 10.6 KB
Newer Older
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

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
from gajim.common.exceptions import GajimGeneralException
from gajim import dialogs
25

26 27
import gajim.plugins.gui

28
from gajim.gtk.dialogs import ShortcutsWindow
29
from gajim.gtk.history_sync import HistorySyncAssistant
30
from gajim.gtk.server_info import ServerInfoDialog
31
from gajim.gtk.mam_preferences import MamPreferences
32
from gajim.gtk.preferences import Preferences
33 34 35 36 37 38 39 40 41 42 43
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
44
from gajim.gtk.accounts import AccountsWindow
45
from gajim.gtk.proxies import ManageProxies
46
from gajim.gtk.discovery import ServiceDiscoveryWindow
47
from gajim.gtk.blocking import BlockingList
48 49


50 51 52
# General Actions

def on_add_contact_jid(action, param):
53
    AddNewContactWindow(None, param.get_string())
54 55 56 57 58

# Application Menu Actions


def on_preferences(action, param):
59 60 61
    window = app.get_app_window(Preferences)
    if window is None:
        Preferences()
62
    else:
63
        window.present()
64 65 66 67 68 69 70 71 72 73


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):
74 75 76
    window = app.get_app_window(AccountsWindow)
    if window is None:
        AccountsWindow()
77
    else:
78
        window.present()
79 80 81 82 83 84 85 86


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


def on_manage_bookmarks(action, param):
87
    ManageBookmarksWindow()
88 89 90 91 92 93 94 95 96 97


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:
98
        app.interface.instances['start_chat'] = StartChatDialog()
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

# 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'
122
    SingleMessageWindow(account, server, 'send')
123 124 125 126 127 128 129 130 131 132 133


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
134
            ServiceDiscoveryWindow(account, address_entry=True)
135 136 137 138
        except GajimGeneralException:
            pass


139 140
def on_join_gc(_action, param):
    account, jid = None, None
141 142 143 144
    if param is None:
        if not app.get_connected_accounts():
            return
    else:
145 146 147
        account, jid = param.get_strv()
        if not jid:
            jid = None
148
    window = app.get_app_window(JoinGroupchatWindow)
149
    if window is None:
150
        JoinGroupchatWindow(account, jid)
151
    else:
152
        window.present()
153 154


155 156 157 158 159
def on_add_contact(_action, param):
    account, jid = param.get_strv()
    if not jid:
        jid = None
    window = app.get_app_window(AddNewContactWindow, account)
160
    if window is None:
161
        AddNewContactWindow(account, jid)
162 163
    else:
        window.present()
164 165 166


def on_single_message(action, param):
167
    SingleMessageWindow(param.get_string(), action='send')
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186


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_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'] = \
187
            AccountCreationWizard()
188 189 190 191 192 193 194 195 196 197 198 199 200


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


201
def on_mam_preferences(action, param):
202
    account = param.get_string()
203 204 205
    window = app.get_app_window(MamPreferences, account)
    if window is None:
        MamPreferences(account)
206
    else:
207
        window.present()
208 209


210 211 212 213 214 215 216 217 218
def on_blocking_list(action, param):
    account = param.get_string()
    window = app.get_app_window(MamPreferences, account)
    if window is None:
        BlockingList(account)
    else:
        window.present()


219 220
def on_history_sync(action, param):
    account = param.get_string()
221 222 223
    window = app.get_app_window(HistorySyncAssistant, account)
    if window is None:
        HistorySyncAssistant(account, interface.roster.window)
224
    else:
225
        window.present()
226 227 228 229 230 231 232 233


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'] = \
234
            PrivacyListsWindow(account)
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251


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'] = \
252
            XMLConsoleWindow(account)
253 254 255 256 257 258


def on_manage_proxies(action, param):
    if 'manage_proxies' in app.interface.instances:
        app.interface.instances['manage_proxies'].window.present()
    else:
259
        app.interface.instances['manage_proxies'] = ManageProxies()
260 261 262 263 264 265 266 267

# Admin Actions


def on_set_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd'
268
    SingleMessageWindow(account, server, 'send')
269 270 271 272 273 274


def on_update_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd/update'
275
    SingleMessageWindow(account, server, 'send')
276 277 278 279


def on_delete_motd(action, param):
    account = param.get_string()
280
    app.connections[account].get_module('Announce').delete_motd()
281 282 283 284 285

# Help Actions


def on_contents(action, param):
286
    helpers.open_uri('https://dev.gajim.org/gajim/gajim/wikis')
287 288 289


def on_faq(action, param):
290
    helpers.open_uri('https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq')
291 292 293


def on_keyboard_shortcuts(action, param):
294
    ShortcutsWindow()
295 296 297


def on_features(action, param):
298
    FeaturesDialog()
299 300 301


def on_about(action, param):
302
    AboutDialog()
303 304 305 306 307 308 309 310 311 312 313 314 315

# 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):
316
    on_browse_history(action, param)
317 318 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


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:
345
            return
346
        app.interface.handle_event(account, jid, event.type_)
347 348 349


def open_link(_action, param):
350 351
    uri = param.get_string()
    helpers.open_uri(uri)
352 353


354
def copy_text(_action, param):
355 356 357 358 359 360 361 362 363 364 365 366 367 368
    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)
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384


def on_browse_history(_action, param):
    jid, account = None, None
    if param is not None:
        dict_ = param.unpack()
        jid = dict_.get('jid')
        account = dict_.get('account')

    window = app.get_app_window(HistoryWindow)
    if window is None:
        HistoryWindow(jid, account)
    else:
        window.present()
        if jid is not None and account is not None:
            window.open_history(jid, account)