mainwindow: Make action button labels consistent
[git-cola.git] / cola / views / mainwindow.py
blob923e842d8f27eea006a44efcc264eea5d24690cd
1 from PyQt4 import QtGui
2 from PyQt4 import QtCore
3 from PyQt4.QtCore import Qt
5 import cola
6 from cola import settings
7 from cola import qtutils
8 from cola import qtcompat
9 from cola import qt
10 from cola.views import log
11 from cola.views import dag
12 from cola.qtutils import tr
13 from cola.views import status
14 from cola.views.standard import create_standard_widget
15 from cola.controllers import classic
18 MainWindowBase = create_standard_widget(QtGui.QMainWindow)
19 class MainWindow(MainWindowBase):
20 def __init__(self, parent=None):
21 MainWindowBase.__init__(self, parent)
22 # Default size; this is thrown out when save/restore is used
23 self.resize(987, 610)
25 # Dockwidget options
26 qtcompat.set_common_dock_options(self)
28 # "Actions" widget
29 self.actiondockwidget = self.create_dock('Actions')
30 self.actiondockwidgetcontents = qt.QFlowLayoutWidget(parent=self)
32 layout = self.actiondockwidgetcontents.layout()
33 self.rescan_button = qt.create_button('Rescan', layout)
34 self.stage_button = qt.create_button('Stage', layout)
35 self.unstage_button = qt.create_button('Unstage', layout)
36 self.fetch_button = qt.create_button('Fetch...', layout)
37 self.push_button = qt.create_button('Push...', layout)
38 self.pull_button = qt.create_button('Pull...', layout)
39 self.stash_button = qt.create_button('Stash...', layout)
40 self.alt_button = qt.create_button('Exit Diff Mode', layout)
41 self.alt_button.hide()
43 self.action_spacer = QtGui.QSpacerItem(1, 1,
44 QtGui.QSizePolicy.MinimumExpanding,
45 QtGui.QSizePolicy.MinimumExpanding)
46 self.actiondockwidgetcontents.layout().addItem(self.action_spacer)
47 self.actiondockwidget.setWidget(self.actiondockwidgetcontents)
49 # "Repository Status" widget
50 self.statusdockwidget = self.create_dock('Repository Status')
51 self.statusdockwidget.setWidget(status.widget())
53 # "Commit Message Editor" widget
54 self.commitdockwidget = self.create_dock('Commit Message Editor')
55 self.commitdockwidgetcontents = QtGui.QWidget()
57 self.commitdockwidgetlayout = QtGui.QVBoxLayout(self.commitdockwidgetcontents)
58 self.commitdockwidgetlayout.setMargin(4)
60 self.vboxlayout = QtGui.QVBoxLayout()
61 self.vboxlayout.setSpacing(0)
63 self.commitmsg = QtGui.QTextEdit(self.commitdockwidgetcontents)
64 self.commitmsg.setMinimumSize(QtCore.QSize(1, 1))
65 policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,
66 QtGui.QSizePolicy.Minimum)
67 self.commitmsg.setSizePolicy(policy)
68 self.commitmsg.setLineWrapMode(QtGui.QTextEdit.NoWrap)
69 self.commitmsg.setAcceptRichText(False)
70 self.vboxlayout.addWidget(self.commitmsg)
72 self.hboxlayout = QtGui.QHBoxLayout()
73 self.hboxlayout.setSpacing(3)
74 self.hboxlayout.setContentsMargins(2, 6, 2, 0)
76 # Sign off and commit buttons
77 self.signoff_button = qt.create_button('Sign Off')
78 self.commit_button = qt.create_button('Commit@@verb')
80 # Position display
81 self.position_label = QtGui.QLabel(self.actiondockwidgetcontents)
82 self.position_label.setAlignment(Qt.AlignLeft)
84 # Spacer between position and amend
85 self.spacer = QtGui.QSpacerItem(1, 1,
86 QtGui.QSizePolicy.MinimumExpanding,
87 QtGui.QSizePolicy.Minimum)
88 # Amend checkbox
89 self.amend_checkbox = QtGui.QCheckBox(self.commitdockwidgetcontents)
90 self.amend_checkbox.setText(tr('Amend Last Commit'))
92 self.hboxlayout.addWidget(self.signoff_button)
93 self.hboxlayout.addWidget(self.commit_button)
94 self.hboxlayout.addWidget(self.position_label)
95 self.hboxlayout.addItem(self.spacer)
96 self.hboxlayout.addWidget(self.amend_checkbox)
98 self.vboxlayout.addLayout(self.hboxlayout)
99 self.commitdockwidgetlayout.addLayout(self.vboxlayout)
100 self.commitdockwidget.setWidget(self.commitdockwidgetcontents)
102 # "Command Output" widget
103 logwidget = qtutils.logger()
104 self.logdockwidget = self.create_dock('Command Output')
105 self.logdockwidget.setWidget(logwidget)
107 # "Diff Viewer" widget
108 self.diffdockwidget = self.create_dock('Diff Viewer')
109 self.diffdockwidgetcontents = QtGui.QWidget()
110 self.diffdockwidgetlayout = QtGui.QVBoxLayout(self.diffdockwidgetcontents)
111 self.diffdockwidgetlayout.setMargin(3)
113 self.display_text = QtGui.QTextEdit(self.diffdockwidgetcontents)
114 self.display_text.setMinimumSize(QtCore.QSize(1, 1))
115 self.display_text.setLineWrapMode(QtGui.QTextEdit.NoWrap)
116 self.display_text.setReadOnly(True)
117 self.display_text.setAcceptRichText(False)
118 self.display_text.setCursorWidth(2)
119 self.display_text.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard |
120 Qt.LinksAccessibleByMouse |
121 Qt.TextBrowserInteraction |
122 Qt.TextSelectableByKeyboard |
123 Qt.TextSelectableByMouse)
125 self.diffdockwidgetlayout.addWidget(self.display_text)
126 self.diffdockwidget.setWidget(self.diffdockwidgetcontents)
128 # All Actions
129 self.menu_unstage_selected = self.create_action('Unstage From Commit')
130 self.menu_show_diffstat = self.create_action('Diffstat')
131 self.menu_stage_modified =\
132 self.create_action('Stage Changed Files To Commit')
133 self.menu_stage_untracked = self.create_action('Stage All Untracked')
134 self.menu_export_patches = self.create_action('Export Patches...')
135 self.menu_cut = self.create_action('Cut')
136 self.menu_copy = self.create_action('Copy')
137 self.menu_paste = self.create_action('Paste')
138 self.menu_select_all = self.create_action('Select All')
139 self.menu_options = self.create_action('Options')
140 self.menu_delete = self.create_action('Delete')
141 self.menu_undo = self.create_action('Undo')
142 self.menu_redo = self.create_action('Redo')
143 self.menu_rescan = self.create_action('Rescan')
144 self.menu_cherry_pick = self.create_action('Cherry-Pick...')
145 self.menu_unstage_all = self.create_action('Unstage All')
146 self.menu_load_commitmsg = self.create_action('Load Commit Message...')
147 self.menu_quit = self.create_action('Quit')
148 self.menu_search_revision = self.create_action('Revision ID...')
149 self.menu_search_path =\
150 self.create_action('Commits Touching Path(s)...')
151 self.menu_search_revision_range =\
152 self.create_action('Revision Range...')
153 self.menu_search_date_range = self.create_action('Latest Commits...')
154 self.menu_search_message = self.create_action('Commit Messages...')
155 self.menu_search_diff =\
156 self.create_action('Content Introduced in Commit...')
157 self.menu_search_author = self.create_action('Commits By Author...')
158 self.menu_search_committer =\
159 self.create_action('Commits By Committer...')
160 self.menu_manage_bookmarks = self.create_action('Bookmarks...')
161 self.menu_save_bookmark = self.create_action('Bookmark Current...')
162 self.menu_search_grep = self.create_action('Grep')
163 self.menu_merge_local = self.create_action('Merge...')
164 self.menu_merge_abort = self.create_action('Abort Merge...')
165 self.menu_open_repo = self.create_action('Open...')
166 self.menu_stash = self.create_action('Stash...')
167 self.menu_diff_branch =\
168 self.create_action('Apply Changes From Branch...')
169 self.menu_branch_compare = self.create_action('Branches...')
170 self.menu_clone_repo = self.create_action('Clone...')
171 self.menu_help_docs = self.create_action('Documentation')
172 self.menu_commit_compare = self.create_action('Commits...')
173 self.menu_visualize_current =\
174 self.create_action('Visualize Current Branch...')
175 self.menu_visualize_all =\
176 self.create_action('Visualize All Branches...')
177 self.menu_browse_commits = self.create_action('Browse Commits...')
178 self.menu_browse_branch =\
179 self.create_action('Browse Current Branch...')
180 self.menu_browse_other_branch =\
181 self.create_action('Browse Other Branch...')
182 self.menu_load_commitmsg_template =\
183 self.create_action('Get Commit Message Template')
184 self.menu_commit_compare_file =\
185 self.create_action('Commits Touching File...')
186 self.menu_help_about = self.create_action('About')
187 self.menu_branch_diff = self.create_action('SHA-1...')
188 self.menu_diff_expression = self.create_action('Expression...')
189 self.menu_create_tag = self.create_action('Create Tag...')
190 self.menu_create_branch = self.create_action('Create...')
191 self.menu_delete_branch = self.create_action('Delete...')
192 self.menu_checkout_branch = self.create_action('Checkout...')
193 self.menu_rebase_branch = self.create_action('Rebase...')
194 self.menu_branch_review = self.create_action('Review...')
195 self.menu_classic = self.create_action('Cola Classic...')
196 self.menu_dag = self.create_action('DAG...')
198 # Create the application menu
199 self.menubar = QtGui.QMenuBar(self)
201 # File Menu
202 self.file_menu = self.create_menu('&File', self.menubar)
203 self.file_menu.addAction(self.menu_open_repo)
204 self.file_menu.addAction(self.menu_clone_repo)
205 self.file_menu.addSeparator()
206 self.file_menu.addAction(self.menu_rescan)
207 self.file_menu.addSeparator()
208 self.file_menu.addAction(self.menu_manage_bookmarks)
209 self.file_menu.addAction(self.menu_save_bookmark)
210 self.file_menu.addSeparator()
211 self.file_menu.addAction(self.menu_load_commitmsg)
212 self.file_menu.addAction(self.menu_load_commitmsg_template)
213 self.file_menu.addSeparator()
214 self.file_menu.addAction(self.menu_quit)
215 # Add to menubar
216 self.menubar.addAction(self.file_menu.menuAction())
218 # Edit Menu
219 self.edit_menu = self.create_menu('&Edit', self.menubar)
220 self.edit_menu.addAction(self.menu_undo)
221 self.edit_menu.addAction(self.menu_redo)
222 self.edit_menu.addSeparator()
223 self.edit_menu.addAction(self.menu_cut)
224 self.edit_menu.addAction(self.menu_copy)
225 self.edit_menu.addAction(self.menu_paste)
226 self.edit_menu.addAction(self.menu_delete)
227 self.edit_menu.addSeparator()
228 self.edit_menu.addAction(self.menu_select_all)
229 self.edit_menu.addSeparator()
230 self.edit_menu.addAction(self.menu_options)
231 # Add to menubar
232 self.menubar.addAction(self.edit_menu.menuAction())
234 # Commit Menu
235 self.commit_menu = self.create_menu('Co&mmit', self.menubar)
236 self.commit_menu.addAction(self.menu_stage_modified)
237 self.commit_menu.addAction(self.menu_stage_untracked)
238 self.commit_menu.addSeparator()
239 self.commit_menu.addAction(self.menu_unstage_all)
240 self.commit_menu.addAction(self.menu_unstage_selected)
241 self.commit_menu.addSeparator()
242 self.commit_menu.addAction(self.menu_browse_commits)
243 # Add to menubar
244 self.menubar.addAction(self.commit_menu.menuAction())
246 # Branch Menu
247 self.branch_menu = self.create_menu('B&ranch', self.menubar)
248 self.branch_menu.addAction(self.menu_branch_review)
249 self.branch_menu.addSeparator()
250 self.branch_menu.addAction(self.menu_create_branch)
251 self.branch_menu.addAction(self.menu_checkout_branch)
252 self.branch_menu.addAction(self.menu_rebase_branch)
253 self.branch_menu.addAction(self.menu_delete_branch)
254 self.branch_menu.addSeparator()
255 self.branch_menu.addAction(self.menu_browse_branch)
256 self.branch_menu.addAction(self.menu_browse_other_branch)
257 self.branch_menu.addSeparator()
258 self.branch_menu.addAction(self.menu_visualize_current)
259 self.branch_menu.addAction(self.menu_visualize_all)
260 self.branch_menu.addSeparator()
261 self.branch_menu.addAction(self.menu_diff_branch)
262 # Add to menubar
263 self.menubar.addAction(self.branch_menu.menuAction())
265 # Search Menu
266 self.search_menu = self.create_menu('&Search', self.menubar)
267 self.search_menu.addAction(self.menu_search_date_range)
268 self.search_menu.addAction(self.menu_search_grep)
269 self.search_menu.addSeparator()
270 # Search / More Menu
271 self.menu_search_more = self.create_menu('More...', self.search_menu)
272 self.menu_search_more.addAction(self.menu_search_author)
273 self.menu_search_more.addAction(self.menu_search_path)
274 self.menu_search_more.addAction(self.menu_search_message)
275 self.menu_search_more.addSeparator()
276 self.menu_search_more.addAction(self.menu_search_revision_range)
277 self.menu_search_more.addAction(self.menu_search_revision)
278 self.menu_search_more.addSeparator()
279 self.menu_search_more.addAction(self.menu_search_diff)
280 self.search_menu.addAction(self.menu_search_more.menuAction())
281 # Add to menubar
282 self.menubar.addAction(self.search_menu.menuAction())
284 # Actions menu
285 self.actions_menu = self.create_menu('Act&ions', self.menubar)
286 self.actions_menu.addAction(self.menu_merge_local)
287 self.actions_menu.addAction(self.menu_stash)
288 self.actions_menu.addSeparator()
289 self.actions_menu.addAction(self.menu_create_tag)
290 self.actions_menu.addSeparator()
291 self.actions_menu.addAction(self.menu_export_patches)
292 self.actions_menu.addAction(self.menu_cherry_pick)
293 self.actions_menu.addSeparator()
294 self.actions_menu.addAction(self.menu_merge_abort)
295 # Add to menubar
296 self.menubar.addAction(self.actions_menu.menuAction())
298 # Diff Menu
299 self.diff_menu = self.create_menu('&Diff', self.menubar)
300 self.diff_menu.addAction(self.menu_branch_diff)
301 self.diff_menu.addAction(self.menu_diff_expression)
302 self.diff_menu.addSeparator()
303 self.diff_menu.addAction(self.menu_branch_compare)
304 self.diff_menu.addAction(self.menu_commit_compare)
305 self.diff_menu.addAction(self.menu_commit_compare_file)
306 self.diff_menu.addSeparator()
307 self.diff_menu.addAction(self.menu_show_diffstat)
308 # Add to menubar
309 self.menubar.addAction(self.diff_menu.menuAction())
311 # Tools Menu
312 self.tools_menu = self.create_menu('&Tools', self.menubar)
313 self.tools_menu.addAction(self.menu_classic)
314 self.tools_menu.addAction(self.menu_dag)
315 self.tools_menu.addSeparator()
316 self.tools_menu.addAction(self.diffdockwidget.toggleViewAction())
317 self.tools_menu.addAction(self.actiondockwidget.toggleViewAction())
318 self.tools_menu.addAction(self.commitdockwidget.toggleViewAction())
319 self.tools_menu.addAction(self.statusdockwidget.toggleViewAction())
320 self.tools_menu.addAction(self.logdockwidget.toggleViewAction())
321 self.menubar.addAction(self.tools_menu.menuAction())
323 # Help Menu
324 self.help_menu = self.create_menu('&Help', self.menubar)
325 self.help_menu.addAction(self.menu_help_docs)
326 self.help_menu.addAction(self.menu_help_about)
327 # Add to menubar
328 self.menubar.addAction(self.help_menu.menuAction())
330 # Set main menu
331 self.setMenuBar(self.menubar)
333 # Shortcuts
334 self.menu_show_diffstat.setShortcut(tr('Ctrl+D'))
335 self.menu_stage_modified.setShortcut(tr('Alt+A'))
336 self.menu_stage_untracked.setShortcut(tr('Alt+U'))
337 self.menu_export_patches.setShortcut(tr('Ctrl+E'))
338 self.menu_cut.setShortcut(tr('Ctrl+X'))
339 self.menu_copy.setShortcut(tr('Ctrl+C'))
340 self.menu_paste.setShortcut(tr('Ctrl+V'))
341 self.menu_select_all.setShortcut(tr('Ctrl+A'))
342 self.menu_options.setShortcut(tr('Ctrl+O'))
343 self.menu_delete.setShortcut(tr('Del'))
344 self.menu_undo.setShortcut(tr('Ctrl+Z'))
345 self.menu_redo.setShortcut(tr('Ctrl+Shift+Z'))
346 self.menu_rescan.setShortcut(tr('Ctrl+R'))
347 self.menu_cherry_pick.setShortcut(tr('Ctrl+P'))
348 self.menu_quit.setShortcut(tr('Ctrl+Q'))
349 self.menu_create_branch.setShortcut(tr('Ctrl+B'))
350 self.menu_checkout_branch.setShortcut(tr('Alt+B'))
351 self.menu_stash.setShortcut(tr('Alt+Shift+S'))
352 self.menu_help_docs.setShortcut(tr('F1'))
354 # Arrange dock widgets
355 top = Qt.TopDockWidgetArea
356 bottom = Qt.BottomDockWidgetArea
358 self.addDockWidget(top, self.commitdockwidget)
359 self.addDockWidget(top, self.statusdockwidget)
360 self.addDockWidget(top, self.actiondockwidget)
361 self.addDockWidget(bottom, self.logdockwidget)
362 self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget)
364 def create_dock(self, title):
365 """Create a dock widget and set it up accordingly."""
366 dock = QtGui.QDockWidget(self)
367 dock.setWindowTitle(tr(title))
368 dock.setObjectName(title)
369 return dock
371 def create_menu(self, title, parent):
372 """Create a menu and set its title."""
373 qmenu = QtGui.QMenu(parent)
374 qmenu.setTitle(tr(title))
375 return qmenu
377 def create_action(self, title):
378 """Create an action and set its title."""
379 action = QtGui.QAction(self)
380 action.setText(tr(title))
381 return action
383 def closeEvent(self, event):
384 """Save state in the settings manager."""
385 if cola.model().remember_gui_settings():
386 settings.SettingsManager.save_gui_state(self)
387 self.close()