1
# -*- coding: utf-8 -*-
3
# QBzr - Qt frontend to Bazaar commands
4
# Copyright (C) 2011 QBzr Developers
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
# GNU General Public License for more details.
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
from bzrlib.plugins.qbzr.lib.util import (
25
from PyQt4 import QtCore, QtGui
26
from bzrlib.plugins.qbzr.lib.i18n import gettext, N_
28
def create_toolbar_button(text, parent=None, icon_name=None, icon_size=22,
29
enabled=True, checkable=False, checked=False,
30
shortcut=None, onclick=None):
32
button = QtGui.QAction(get_icon(icon_name, size=icon_size),
33
gettext(text), parent)
35
button = QtGui.QAction(gettext(text), parent)
37
button.setCheckable(True)
38
button.setChecked(checked)
39
signal = "toggled(bool)"
41
signal = "triggered()"
43
button.setEnabled(False)
45
button.setShortcut(shortcut)
46
show_shortcut_hint(button)
48
parent.connect(button, QtCore.SIGNAL(signal), onclick)
51
def add_toolbar_button(toolbar, text, parent, icon_name=None, icon_size=22,
52
enabled=True, checkable=False, checked=False,
53
shortcut=None, onclick=None):
54
button = create_toolbar_button(text, parent, icon_name, icon_size,
55
enabled, checkable, checked, shortcut, onclick)
56
toolbar.addAction(button)
60
class FindToolbar(QtGui.QToolBar):
62
def __init__(self, window, text_edit, show_action):
63
QtGui.QToolBar.__init__(self, gettext("Find"), window)
64
self.text_edit = text_edit
65
if 0: self.text_edit = QtGui.QTextEdit()
66
self.show_action = show_action
68
self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
69
self.setMovable (False)
71
find_label = QtGui.QLabel(gettext("Find: "), self)
72
self.addWidget(find_label)
74
self.find_text = QtGui.QLineEdit(self)
75
self.addWidget(self.find_text)
76
find_label.setBuddy(self.find_text)
78
self.found_palette = QtGui.QPalette()
79
self.not_found_palette = QtGui.QPalette()
80
self.not_found_palette.setColor(QtGui.QPalette.Active,
83
self.not_found_palette.setColor(QtGui.QPalette.Active,
87
prev = self.addAction(get_icon("go-previous"), gettext("Previous"))
88
prev.setShortcut(QtGui.QKeySequence.FindPrevious)
89
show_shortcut_hint(prev)
91
next = self.addAction(get_icon("go-next"), gettext("Next"))
92
next.setShortcut(QtGui.QKeySequence.FindNext)
93
show_shortcut_hint(next)
95
self.case_sensitive = QtGui.QCheckBox(gettext("Case sensitive"), self)
96
self.addWidget(self.case_sensitive)
97
self.whole_words = QtGui.QCheckBox(gettext("Whole words"), self)
98
self.addWidget(self.whole_words)
100
close_find = QtGui.QAction(self)
101
close_find.setIcon(self.style().standardIcon(
102
QtGui.QStyle.SP_DialogCloseButton))
103
self.addAction(close_find)
104
close_find.setShortcut((QtCore.Qt.Key_Escape))
105
close_find.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut)
106
close_find.setStatusTip(gettext("Close find"))
107
self.connect(self.show_action,
108
QtCore.SIGNAL("toggled (bool)"),
109
self.show_action_toggle)
110
self.connect(close_find,
111
QtCore.SIGNAL("triggered(bool)"),
112
self.close_triggered)
113
self.connect(self.find_text,
114
QtCore.SIGNAL("textChanged(QString)"),
115
self.find_text_changed)
117
QtCore.SIGNAL("triggered(bool)"),
120
QtCore.SIGNAL("triggered(bool)"),
122
self.connect(self.case_sensitive,
123
QtCore.SIGNAL("stateChanged(int)"),
124
self.find_text_changed)
125
self.connect(self.whole_words,
126
QtCore.SIGNAL("stateChanged(int)"),
127
self.find_text_changed)
128
self.connect(self.find_text,
129
QtCore.SIGNAL("returnPressed()"),
132
def show_action_toggle(self, state):
133
self.setVisible(state)
135
self.find_text.setFocus()
137
self.find_text.setText('')
139
def close_triggered(self, state):
140
self.show_action.setChecked(False)
142
def find_text_changed(self, text):
143
self.find_avoid_moving()
145
def find_get_flags(self):
146
flags = QtGui.QTextDocument.FindFlags()
147
if self.case_sensitive.isChecked():
148
flags = flags | QtGui.QTextDocument.FindCaseSensitively
149
if self.whole_words.isChecked():
150
flags = flags | QtGui.QTextDocument.FindWholeWords
153
def find_avoid_moving(self):
154
self.find(self.text_edit.textCursor().selectionStart(), 0,
155
self.find_get_flags())
158
self.find(self.text_edit.textCursor().selectionEnd(), 0,
159
self.find_get_flags())
161
def find_prev(self, state):
162
self.find(self.text_edit.textCursor().selectionStart(),
163
self.text_edit.document().characterCount(),
164
self.find_get_flags() | QtGui.QTextDocument.FindBackward)
166
def find(self, from_pos, restart_pos, flags):
167
doc = self.text_edit.document()
168
text = self.find_text.text()
169
cursor = doc.find(text, from_pos, flags)
171
# try again from the restart pos
172
cursor = doc.find(text, restart_pos, flags)
174
cursor = self.text_edit.textCursor()
175
cursor.setPosition(cursor.selectionStart())
176
self.text_edit.setTextCursor(cursor)
177
# Make find_text background red like Firefox
179
self.find_text.setPalette(self.not_found_palette)
181
self.find_text.setPalette(self.found_palette)
183
self.text_edit.setTextCursor(cursor)
184
self.find_text.setPalette(self.found_palette)
186
def set_text_edit(self, new_text_edit):
188
self.text_edit.setTextCursor(QtGui.QTextCursor())
189
self.text_edit = new_text_edit
192
class ToolbarPanel(QtGui.QWidget):
193
def __init__(self, slender=True, icon_size=16, parent=None):
194
QtGui.QWidget.__init__(self, parent)
195
vbox = QtGui.QVBoxLayout(self)
199
toolbar = QtGui.QToolBar(self)
200
toolbar.setMovable(False)
201
toolbar.setIconSize(QtCore.QSize(icon_size,icon_size))
202
self.icon_size=icon_size
204
self.setStyleSheet('QToolBar { margin:1px; padding:0px; border:none; }')
205
toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
207
vbox.addWidget(toolbar)
209
self.toolbar = toolbar
211
def add_toolbar_button(self, text, icon_name=None, icon_size=0, enabled=True,
212
checkable=False, checked=False, shortcut=None, onclick=None, menu=None):
213
button = create_toolbar_button(text, self, icon_name=icon_name,
214
icon_size=icon_size or self.icon_size, enabled=enabled,
215
checkable=checkable, checked=checked, shortcut=shortcut, onclick=onclick)
218
self.toolbar.addAction(button)
221
def add_toolbar_menu(self, text, menu, icon_name=None, icon_size=0, enabled=True, shortcut=None):
222
button = self.add_toolbar_button(text, icon_name=icon_name,
223
icon_size=icon_size or self.icon_size, enabled=enabled, menu=menu)
224
widget = self.toolbar.widgetForAction(button)
225
widget.setPopupMode(QtGui.QToolButton.InstantPopup)
227
widget.setShortcut(shortcut)
228
show_shortcut_hint(widget)
231
def create_button(self, text, icon_name=None, icon_size=0, enabled=True,
232
checkable=False, checked=False, shortcut=None, onclick=None):
233
return create_toolbar_button(text, self, icon_name=icon_name,
234
icon_size=icon_size or self.icon_size, enabled=enabled,
235
checkable=checkable, checked=checked, shortcut=shortcut, onclick=onclick)
237
def add_separator(self):
238
self.toolbar.addSeparator()
240
def add_widget(self, widget):
241
self.vbox.addWidget(widget)
243
def add_layout(self, layout):
244
self.vbox.addLayout(layout)
246
class LayoutSelector(QtGui.QMenu):
247
"""Menu to select layout."""
248
def __init__(self, num, onchanged, parent=None, initial_no=1):
249
QtGui.QMenu.__init__(self, gettext('Layout'), parent)
251
self.current = initial_no
254
self.current = initial_no
258
return lambda:selected(no)
260
group = QtGui.QActionGroup(self)
262
for i in range(1, num + 1):
263
btn = create_toolbar_button(gettext("Layout %d") % i, self,
264
checkable=True, shortcut="Ctrl+%d" % i,
265
checked=(i == initial_no),
266
onclick=get_handler(i))
269
self.buttons.append(btn)