1 """This module provides a controller for selecting commits
4 from PyQt4
import QtGui
5 from PyQt4
.QtCore
import SIGNAL
8 from cola
import gitcmds
9 from cola
import qtutils
10 from cola
import serializer
11 from cola
.views
.selectcommits
import SelectCommitsView
12 from cola
.qobserver
import QObserver
13 from cola
.controllers
.createbranch
import create_new_branch
15 #+-------------------------------------------------------------
16 def select_commits(title
, revs
, summaries
, multiselect
=True):
17 """Use the SelectCommitsView to select commits from a list."""
19 app
= QtGui
.QApplication
.instance()
20 parent
= app
.activeWindow()
21 view
= SelectCommitsView(parent
, app
.tr(title
), multiselect
=multiselect
)
22 ctl
= SelectCommitsController(model
, view
, revs
, summaries
)
23 return ctl
.select_commits()
25 class SelectCommitsController(QObserver
):
26 """Select a commit from parallel rev and summary lists"""
28 def __init__(self
, model
, view
, revs
, summaries
):
29 self
.orig_model
= model
30 QObserver
.__init
__(self
, serializer
.clone(model
), view
)
32 self
.model
.set_revisions(revs
)
33 self
.model
.set_summaries(summaries
)
35 self
.connect(view
.commit_list
,
36 SIGNAL('itemSelectionChanged()'),
37 self
.commit_sha1_selected
)
38 view
.commit_list
.contextMenuEvent
= self
.context_menu_event
41 def set_diff_font(self
):
42 if not self
.model
.has_param('global_cola_fontdiff'):
44 font
= self
.model
.param('global_cola_fontdiff')
49 self
.view
.commit_text
.setFont(qf
)
51 def select_commits(self
):
52 summaries
= self
.model
.summaries
54 msg
= self
.tr('No commits exist in this branch.')
57 qtutils
.set_items(self
.view
.commit_list
, summaries
)
59 if self
.view
.exec_() != QtGui
.QDialog
.Accepted
:
61 revs
= self
.model
.revisions
62 list_widget
= self
.view
.commit_list
63 return qtutils
.selection_list(list_widget
, revs
)
65 def context_menu_event(self
, event
):
66 menu
= QtGui
.QMenu(self
.view
);
67 menu
.addAction(self
.tr('Checkout'), self
.checkout_commit
)
68 menu
.addAction(self
.tr('Create Branch here'), self
.create_branch_at
)
69 menu
.addAction(self
.tr('Cherry Pick'), self
.cherry_pick
)
70 menu
.exec_(self
.view
.commit_list
.mapToGlobal(event
.pos()))
72 def checkout_commit(self
):
73 row
, selected
= qtutils
.selected_row(self
.view
.commit_list
)
76 sha1
= self
.model
.revision_sha1(row
)
77 qtutils
.log(*self
.model
.git
.checkout(sha1
,
81 def create_branch_at(self
):
82 row
, selected
= qtutils
.selected_row(self
.view
.commit_list
)
85 create_new_branch(self
.orig_model
, self
.view
,
86 revision
=self
.model
.revision_sha1(row
))
88 def cherry_pick(self
):
89 row
, selected
= qtutils
.selected_row(self
.view
.commit_list
)
92 sha1
= self
.model
.revision_sha1(row
)
93 qtutils
.log(*self
.model
.git
.cherry_pick(sha1
,
97 def commit_sha1_selected(self
):
98 row
, selected
= qtutils
.selected_row(self
.view
.commit_list
)
100 self
.view
.commit_text
.setText('')
101 self
.view
.revision
.setText('')
103 # Get the sha1 and put it in the revision line
104 sha1
= self
.model
.revision_sha1(row
)
105 self
.view
.revision
.setText(sha1
)
106 self
.view
.revision
.selectAll()
108 # Lookup the sha1's commit
109 commit_diff
= gitcmds
.commit_diff(sha1
)
110 self
.view
.commit_text
.setText(commit_diff
)
112 # Copy the sha1 into the clipboard
113 qtutils
.set_clipboard(sha1
)