1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
# This file is part of the Frescobaldi project, http://www.frescobaldi.org/
#
# Copyright (c) 2008 - 2014 by Wilbert Berendsen
#
# This program 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; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# See http://www.gnu.org/licenses/ for more information.
"""
The contextmenu of the editor.
This module is imported when a contextmenu event occurs in the View (view.py).
"""
from PyQt5.QtCore import QTimer, QUrl
from PyQt5.QtWidgets import QAction
import icons
import util
import browseriface
def contextmenu(view):
cursor = view.textCursor()
menu = view.createStandardContextMenu()
mainwindow = view.window()
# create the actions in the actions list
actions = []
actions.extend(open_files(cursor, menu, mainwindow))
actions.extend(jump_to_definition(cursor, menu, mainwindow))
if cursor.hasSelection():
import panelmanager
actions.append(mainwindow.actionCollection.edit_copy_colored_html)
actions.append(panelmanager.manager(mainwindow).snippettool.actionCollection.copy_to_snippet)
import documentactions
ac = documentactions.get(mainwindow).actionCollection
actions.append(ac.edit_cut_assign)
actions.append(ac.edit_move_to_include_file)
# now add the actions to the standard menu
if actions:
first_action = menu.actions()[0] if menu.actions() else None
if first_action:
first_action = menu.insertSeparator(first_action)
menu.insertActions(first_action, actions)
else:
menu.addActions(actions)
return menu
def open_files(cursor, menu, mainwindow):
"""Return a list of actions (maybe empty) for files at the cursor to open."""
def action(filename):
url = QUrl.fromLocalFile(filename)
a = QAction(menu)
a.setText(_("Open \"{url}\"").format(url=util.homify(filename)))
a.setIcon(icons.get('document-open'))
@a.triggered.connect
def open_doc():
d = mainwindow.openUrl(url)
if d:
browseriface.get(mainwindow).setCurrentDocument(d)
return a
import open_file_at_cursor
return list(map(action, open_file_at_cursor.filenames_at_cursor(cursor)))
def jump_to_definition(cursor, menu, mainwindow):
"""Return a list of context menu actions jumping to the definition."""
import definition
node = definition.refnode(cursor)
if node:
a = QAction(menu)
def complete():
target = definition.target(node)
if target:
if target.document is node.document:
a.setText(_("&Jump to definition (line {num})").format(
num = node.document.index(node.document.block(target.position)) + 1))
else:
a.setText(_("&Jump to definition (in {filename})").format(
filename=util.homify(target.document.filename)))
@a.triggered.connect
def activate():
definition.goto_target(mainwindow, target)
else:
a.setText(_("&Jump to definition (unknown)"))
a.setEnabled(False)
QTimer.singleShot(0, complete)
return [a]
return []
|