views.actions: Add a command wrapper for run_command and use it
[git-cola.git] / cola / controllers / selectcommits.py
blob21cd8a7f381466cceb18cd6ec1b74985fae59e65
1 """This module provides a controller for selecting commits
3 """
4 from PyQt4 import QtGui
5 from PyQt4.QtCore import SIGNAL
7 import cola
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."""
18 model = cola.model()
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
39 self.set_diff_font()
41 def set_diff_font(self):
42 if not self.model.has_param('global_cola_fontdiff'):
43 return
44 font = self.model.param('global_cola_fontdiff')
45 if not font:
46 return
47 qf = QtGui.QFont()
48 qf.fromString(font)
49 self.view.commit_text.setFont(qf)
51 def select_commits(self):
52 summaries = self.model.summaries
53 if not summaries:
54 msg = self.tr('No commits exist in this branch.')
55 qtutils.log(1, msg)
56 return []
57 qtutils.set_items(self.view.commit_list, summaries)
58 self.view.show()
59 if self.view.exec_() != QtGui.QDialog.Accepted:
60 return []
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)
74 if not selected:
75 return
76 sha1 = self.model.revision_sha1(row)
77 qtutils.log(*self.model.git.checkout(sha1,
78 with_stderr=True,
79 with_status=True))
81 def create_branch_at(self):
82 row, selected = qtutils.selected_row(self.view.commit_list)
83 if not selected:
84 return
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)
90 if not selected:
91 return
92 sha1 = self.model.revision_sha1(row)
93 qtutils.log(*self.model.git.cherry_pick(sha1,
94 with_stderr=True,
95 with_status=True))
97 def commit_sha1_selected(self):
98 row, selected = qtutils.selected_row(self.view.commit_list)
99 if not selected:
100 self.view.commit_text.setText('')
101 self.view.revision.setText('')
102 return
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)