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

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
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 ServerInfo
31
from gajim.gtk.mam_preferences import MamPreferences
32
from gajim.gtk.preferences import Preferences
33
from gajim.gtk.groupchat_creation import CreateGroupchatWindow
34 35 36 37 38
from gajim.gtk.start_chat import StartChatDialog
from gajim.gtk.add_contact import AddNewContactWindow
from gajim.gtk.single_message import SingleMessageWindow
from gajim.gtk.about import AboutDialog
from gajim.gtk.privacy_list import PrivacyListsWindow
39
from gajim.gtk.bookmarks import Bookmarks
40 41 42
from gajim.gtk.features import FeaturesDialog
from gajim.gtk.account_wizard import AccountCreationWizard
from gajim.gtk.history import HistoryWindow
43
from gajim.gtk.accounts import AccountsWindow
44
from gajim.gtk.proxies import ManageProxies
45
from gajim.gtk.discovery import ServiceDiscoveryWindow
Philipp Hörist's avatar
Philipp Hörist committed
46
from gajim.gtk.blocking import BlockingList
47
from gajim.gtk.xml_console import XMLConsoleWindow
48
from gajim.gtk.groupchat_join import GroupchatJoin
49
from gajim.gtk.pep_config import ManagePEPServicesWindow
50

51 52 53
# General Actions

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

# Application Menu Actions


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


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):
75 76
    window = app.get_app_window(AccountsWindow)
    if window is None:
Philipp Hörist's avatar
Philipp Hörist committed
77
        window = AccountsWindow()
78
    else:
79
        window.present()
80

Philipp Hörist's avatar
Philipp Hörist committed
81 82 83 84
    account = param.get_string()
    if account:
        window.select_account(account)

85 86 87 88 89 90

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


91 92 93 94 95 96 97
def on_bookmarks(action, param):
    account = param.get_string()
    window = app.get_app_window(Bookmarks, account=account)
    if window is None:
        window = Bookmarks(account)
    else:
        window.present()
98 99 100 101 102 103


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


104 105 106 107 108
def on_new_chat(_action, param):
    search_text = param.get_string()
    window = app.get_app_window(StartChatDialog)
    if window is None:
        window = StartChatDialog()
109
    else:
110 111 112 113 114
        window.present()

    if search_text:
        window.set_search_text(search_text)

115 116 117 118 119 120 121 122 123 124 125 126

# Accounts Actions


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


def on_send_server_message(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/online'
127
    SingleMessageWindow(account, server, 'send')
128 129 130 131 132 133 134 135 136 137 138


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
139
            ServiceDiscoveryWindow(account, address_entry=True)
140 141 142
        except GajimGeneralException:
            pass

143 144 145 146 147 148 149 150
def on_create_gc(_action, param):
    window = app.get_app_window(CreateGroupchatWindow)
    if window is None:
        CreateGroupchatWindow(param.get_string() or None)
    else:
        window.present()


Philipp Hörist's avatar
Philipp Hörist committed
151 152 153 154 155
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
156
    if window is None:
Philipp Hörist's avatar
Philipp Hörist committed
157
        AddNewContactWindow(account, jid)
Sophie Herold's avatar
Sophie Herold committed
158 159
    else:
        window.present()
160 161 162


def on_single_message(action, param):
163
    SingleMessageWindow(param.get_string(), action='send')
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182


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'] = \
183
            AccountCreationWizard()
184 185 186 187 188 189 190 191 192 193


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)

194

195 196
# Advanced Actions

197 198 199 200 201 202 203 204
def on_pep_config(action, param):
    account = param.get_string()
    window = app.get_app_window(ManagePEPServicesWindow, account=account)
    if window is None:
        ManagePEPServicesWindow(account)
    else:
        window.present()

205

206
def on_mam_preferences(action, param):
207
    account = param.get_string()
208 209 210
    window = app.get_app_window(MamPreferences, account)
    if window is None:
        MamPreferences(account)
211
    else:
212
        window.present()
213 214


Philipp Hörist's avatar
Philipp Hörist committed
215 216 217 218 219 220 221 222 223
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()


224 225
def on_history_sync(action, param):
    account = param.get_string()
226 227 228
    window = app.get_app_window(HistorySyncAssistant, account)
    if window is None:
        HistorySyncAssistant(account, interface.roster.window)
229
    else:
230
        window.present()
231 232 233 234 235 236 237 238


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'] = \
239
            PrivacyListsWindow(account)
240 241 242 243


def on_server_info(action, param):
    account = param.get_string()
244 245 246
    window = app.get_app_window(ServerInfo, account)
    if window is None:
        ServerInfo(account)
247
    else:
248
        window.present()
249 250 251 252


def on_xml_console(action, param):
    account = param.get_string()
253 254 255
    window = app.get_app_window(XMLConsoleWindow, account)
    if window is None:
        XMLConsoleWindow(account)
256
    else:
257
        window.present()
258 259 260


def on_manage_proxies(action, param):
261 262 263
    window = app.get_app_window(ManageProxies)
    if window is None:
        ManageProxies()
264
    else:
265
        window.present()
266 267 268 269 270 271 272 273

# Admin Actions


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


def on_update_motd(action, param):
    account = param.get_string()
    server = app.config.get_per('accounts', account, 'hostname')
    server += '/announce/motd/update'
281
    SingleMessageWindow(account, server, 'send')
282 283 284 285


def on_delete_motd(action, param):
    account = param.get_string()
286
    app.connections[account].get_module('Announce').delete_motd()
287 288 289 290 291

# Help Actions


def on_contents(action, param):
292
    helpers.open_uri('https://dev.gajim.org/gajim/gajim/wikis')
293 294 295


def on_faq(action, param):
296
    helpers.open_uri('https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq')
297 298 299


def on_keyboard_shortcuts(action, param):
300
    ShortcutsWindow()
301 302 303


def on_features(action, param):
304
    FeaturesDialog()
305 306 307


def on_about(action, param):
308
    AboutDialog()
309 310 311 312 313 314 315 316 317 318 319 320 321

# 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):
322
    on_browse_history(action, param)
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350


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:
351
            return
352
        app.interface.handle_event(account, jid, event.type_)
Philipp Hörist's avatar
Philipp Hörist committed
353 354 355


def open_link(_action, param):
356 357
    uri = param.get_string()
    helpers.open_uri(uri)
Philipp Hörist's avatar
Philipp Hörist committed
358 359


360
def copy_text(_action, param):
Philipp Hörist's avatar
Philipp Hörist committed
361 362 363 364 365 366 367 368 369 370
    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)


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)
385 386 387 388 389 390 391 392 393


def on_groupchat_join(_action, param):
    account, jid = param.get_strv()
    window = app.get_app_window(GroupchatJoin, account=account, jid=jid)
    if window is None:
        GroupchatJoin(account, jid)
    else:
        window.present()