~qbzr-dev/qbzr/0.21

« back to all changes in this revision

Viewing changes to lib/widgets/toolbars.py

  • Committer: Alexander Belchenko
  • Date: 2011-06-25 13:44:39 UTC
  • mfrom: (1353.3.61 qshelve)
  • Revision ID: bialix@ukr.net-20110625134439-crpsff29dymnn398
New qshelve / qunshelve dialogs. (IWATA Hidetaka)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
#
 
3
# QBzr - Qt frontend to Bazaar commands
 
4
# Copyright (C) 2011 QBzr Developers
 
5
#
 
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.
 
10
#
 
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.
 
15
#
 
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.
 
19
 
 
20
from bzrlib.plugins.qbzr.lib.util import (
 
21
    get_icon,
 
22
    show_shortcut_hint
 
23
    )
 
24
 
 
25
from PyQt4 import QtCore, QtGui
 
26
from bzrlib.plugins.qbzr.lib.i18n import gettext, N_
 
27
 
 
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):
 
31
    if icon_name:
 
32
        button = QtGui.QAction(get_icon(icon_name, size=icon_size),
 
33
                                gettext(text), parent)
 
34
    else:
 
35
        button = QtGui.QAction(gettext(text), parent)
 
36
    if checkable:
 
37
        button.setCheckable(True)
 
38
        button.setChecked(checked)
 
39
        signal = "toggled(bool)"
 
40
    else:
 
41
        signal = "triggered()"
 
42
    if not enabled:
 
43
        button.setEnabled(False)
 
44
    if shortcut:
 
45
        button.setShortcut(shortcut)
 
46
        show_shortcut_hint(button)
 
47
    if onclick:
 
48
        parent.connect(button, QtCore.SIGNAL(signal), onclick)
 
49
    return button
 
50
 
 
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)
 
57
    return button
 
58
 
 
59
        
 
60
class FindToolbar(QtGui.QToolBar):
 
61
 
 
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
 
67
        
 
68
        self.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
 
69
        self.setMovable (False)
 
70
        
 
71
        find_label = QtGui.QLabel(gettext("Find: "), self)
 
72
        self.addWidget(find_label)
 
73
        
 
74
        self.find_text = QtGui.QLineEdit(self)
 
75
        self.addWidget(self.find_text)
 
76
        find_label.setBuddy(self.find_text)
 
77
 
 
78
        self.found_palette = QtGui.QPalette()
 
79
        self.not_found_palette = QtGui.QPalette()
 
80
        self.not_found_palette.setColor(QtGui.QPalette.Active,
 
81
                QtGui.QPalette.Base,
 
82
                QtCore.Qt.red)
 
83
        self.not_found_palette.setColor(QtGui.QPalette.Active,
 
84
                QtGui.QPalette.Text,
 
85
                QtCore.Qt.white)
 
86
        
 
87
        prev = self.addAction(get_icon("go-previous"), gettext("Previous"))
 
88
        prev.setShortcut(QtGui.QKeySequence.FindPrevious)
 
89
        show_shortcut_hint(prev)
 
90
        
 
91
        next = self.addAction(get_icon("go-next"), gettext("Next"))
 
92
        next.setShortcut(QtGui.QKeySequence.FindNext)
 
93
        show_shortcut_hint(next)
 
94
        
 
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)
 
99
        
 
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)
 
116
        self.connect(next,
 
117
                     QtCore.SIGNAL("triggered(bool)"),
 
118
                     self.find_next)
 
119
        self.connect(prev,
 
120
                     QtCore.SIGNAL("triggered(bool)"),
 
121
                     self.find_prev)
 
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()"),
 
130
                     self.find_next)        
 
131
        
 
132
    def show_action_toggle(self, state):
 
133
        self.setVisible(state)
 
134
        if state:
 
135
            self.find_text.setFocus()
 
136
        else:
 
137
            self.find_text.setText('')
 
138
    
 
139
    def close_triggered(self, state):
 
140
        self.show_action.setChecked(False)
 
141
    
 
142
    def find_text_changed(self, text):
 
143
        self.find_avoid_moving()
 
144
    
 
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
 
151
        return flags
 
152
    
 
153
    def find_avoid_moving(self):
 
154
        self.find(self.text_edit.textCursor().selectionStart(), 0,
 
155
                  self.find_get_flags())
 
156
    
 
157
    def find_next(self):
 
158
        self.find(self.text_edit.textCursor().selectionEnd(), 0,
 
159
                  self.find_get_flags())
 
160
    
 
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)
 
165
    
 
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)
 
170
        if cursor.isNull():
 
171
            # try again from the restart pos
 
172
            cursor = doc.find(text, restart_pos, flags)
 
173
        if cursor.isNull():
 
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
 
178
            if len(text) > 0:
 
179
                self.find_text.setPalette(self.not_found_palette)
 
180
            else:
 
181
                self.find_text.setPalette(self.found_palette)
 
182
        else:
 
183
            self.text_edit.setTextCursor(cursor)
 
184
            self.find_text.setPalette(self.found_palette)
 
185
 
 
186
    def set_text_edit(self, new_text_edit):
 
187
        if self.text_edit:
 
188
            self.text_edit.setTextCursor(QtGui.QTextCursor())
 
189
        self.text_edit = new_text_edit
 
190
 
 
191
 
 
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)
 
196
        vbox.setSpacing(0)
 
197
        vbox.setMargin(0)
 
198
 
 
199
        toolbar = QtGui.QToolBar(self)
 
200
        toolbar.setMovable(False)
 
201
        toolbar.setIconSize(QtCore.QSize(icon_size,icon_size))
 
202
        self.icon_size=icon_size
 
203
        if slender:
 
204
            self.setStyleSheet('QToolBar { margin:1px; padding:0px; border:none; }')
 
205
        toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
 
206
 
 
207
        vbox.addWidget(toolbar)
 
208
        self.vbox = vbox
 
209
        self.toolbar = toolbar
 
210
 
 
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)
 
216
        if menu is not None:
 
217
            button.setMenu(menu)
 
218
        self.toolbar.addAction(button)
 
219
        return button
 
220
 
 
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)
 
226
        if shortcut:
 
227
            widget.setShortcut(shortcut)
 
228
            show_shortcut_hint(widget)
 
229
        return button
 
230
 
 
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)
 
236
 
 
237
    def add_separator(self):
 
238
        self.toolbar.addSeparator()
 
239
 
 
240
    def add_widget(self, widget):
 
241
        self.vbox.addWidget(widget)
 
242
 
 
243
    def add_layout(self, layout):
 
244
        self.vbox.addLayout(layout)
 
245
 
 
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)
 
250
 
 
251
        self.current = initial_no
 
252
        
 
253
        def selected(no):
 
254
            self.current = initial_no
 
255
            onchanged(no)
 
256
 
 
257
        def get_handler(no):
 
258
            return lambda:selected(no)
 
259
        
 
260
        group = QtGui.QActionGroup(self)
 
261
        self.buttons = []
 
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))
 
267
            group.addAction(btn)
 
268
            self.addAction(btn)
 
269
            self.buttons.append(btn)
 
270