1 from PyQt4
import QtGui
2 from PyQt4
import QtCore
3 from PyQt4
.QtCore
import Qt
6 from cola
import settings
7 from cola
import qtutils
8 from cola
import qtcompat
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
26 qtcompat
.set_common_dock_options(self
)
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')
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
)
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
)
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
)
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
)
216 self
.menubar
.addAction(self
.file_menu
.menuAction())
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
)
232 self
.menubar
.addAction(self
.edit_menu
.menuAction())
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
)
244 self
.menubar
.addAction(self
.commit_menu
.menuAction())
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
)
263 self
.menubar
.addAction(self
.branch_menu
.menuAction())
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()
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())
282 self
.menubar
.addAction(self
.search_menu
.menuAction())
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
)
296 self
.menubar
.addAction(self
.actions_menu
.menuAction())
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
)
309 self
.menubar
.addAction(self
.diff_menu
.menuAction())
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())
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
)
328 self
.menubar
.addAction(self
.help_menu
.menuAction())
331 self
.setMenuBar(self
.menubar
)
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
)
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
))
377 def create_action(self
, title
):
378 """Create an action and set its title."""
379 action
= QtGui
.QAction(self
)
380 action
.setText(tr(title
))
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
)