browser: Rebrand the 'Classic' tool as 'Browser'
[git-cola.git] / cola / classic / controller.py
blob2668c7b3620693310239246fa0ce6dc68cd6e703
1 from PyQt4 import QtGui
2 from PyQt4 import QtCore
3 from PyQt4.QtCore import SIGNAL
5 import cola
6 import cola.utils
7 import cola.difftool
9 from cola import gitcmds
10 from cola import signals
11 from cola.widgets.selectcommits import select_commits
12 from cola.classic.view import Browser
13 from cola.classic.model import GitRepoModel
14 from cola.classic.model import GitRepoEntryManager
15 from cola.compat import set
18 def widget(parent, update=True):
19 """Return a widget for immediate use."""
20 view = Browser(parent, update=update)
21 view.tree.setModel(GitRepoModel(view.tree))
22 view.ctl = ClassicController(view.tree)
23 return view
26 def cola_classic(update=True):
27 """Launch a new cola classic session."""
28 view = widget(None, update=update)
29 view.show()
30 return view
33 class ClassicController(QtCore.QObject):
34 def __init__(self, view=None):
35 QtCore.QObject.__init__(self, view)
36 self.model = cola.model()
37 self.view = view
38 self.updated = set()
39 self.connect(view, SIGNAL('history(QStringList)'),
40 self.view_history)
41 self.connect(view, SIGNAL('expanded(QModelIndex)'),
42 self.query_model)
43 self.connect(view, SIGNAL('difftool_predecessor'),
44 self.difftool_predecessor)
46 def view_history(self, entries):
47 """Launch the configured history browser path-limited to entries."""
48 entries = map(unicode, entries)
49 cola.notifier().broadcast(signals.visualize_paths, entries)
51 def query_model(self, model_index):
52 """Update information about a directory as it is expanded."""
53 item = self.view.item_from_index(model_index)
54 path = item.path
55 if path in self.updated:
56 return
57 self.updated.add(path)
58 GitRepoEntryManager.entry(path).update()
59 entry = GitRepoEntryManager.entry
60 for row in xrange(item.rowCount()):
61 path = item.child(row, 0).path
62 entry(path).update()
64 def difftool_predecessor(self, paths):
65 """Prompt for an older commit and launch difftool against it."""
66 args = ['--'] + paths
67 revs, summaries = gitcmds.log_helper(all=False, extra_args=args)
68 commits = select_commits('Select Previous Version',
69 revs, summaries, multiselect=False)
70 if not commits:
71 return
72 commit = commits[0]
73 cola.difftool.launch([commit, '--'] + paths)
76 if __name__ == '__main__':
77 import sys
79 app = QtGui.QApplication(sys.argv)
80 cola_classic()
81 result = app.exec_()
82 QtCore.QThreadPool.globalInstance().waitForDone()
83 sys.exit(result)