search: don't automatically search when the user types
[git-cola.git] / ugit / controllers / repobrowser.py
blob896cf5f899b95185e9e2daa8c8db9e1e9f2a8a46
1 #!/usr/bin/env python
2 import os
3 from PyQt4.QtGui import QDialog
5 from ugit import utils
6 from ugit import qtutils
7 from ugit import defaults
8 from ugit.views import CommitView
9 from ugit.qobserver import QObserver
11 def browse_git_branch(model, parent, branch):
12 if not branch: return
13 # Clone the model to allow opening multiple browsers
14 # with different sets of data
15 model = model.clone()
16 model.set_currentbranch(branch)
17 view = CommitView(parent)
18 controller = RepoBrowserController(model, view)
19 view.show()
20 return view.exec_() == QDialog.Accepted
22 class RepoBrowserController(QObserver):
23 def init(self, model, view):
24 view.setWindowTitle('File Browser')
25 self.add_signals('itemSelectionChanged()', view.commit_list,)
26 self.add_actions(directory = self.action_directory_changed)
27 self.add_callbacks(commit_list = self.item_changed)
28 self.connect(
29 view.commit_list,
30 'itemDoubleClicked(QListWidgetItem*)',
31 self.item_double_clicked)
33 # Start at the root of the tree
34 model.set_directory('')
36 ######################################################################
37 # Actions
39 def action_directory_changed(self):
40 '''This is called in response to a change in the the
41 model's directory.'''
42 self.model.init_browser_data()
43 self.__display_items()
45 ######################################################################
46 # Qt callbacks
48 def item_changed(self,*rest):
49 '''This is called when the current item changes in the
50 file/directory list(aka the commit_list).'''
51 current = self.view.commit_list.currentRow()
52 item = self.view.commit_list.item(current)
53 if item is None or not item.isSelected():
54 self.view.revision.setText('')
55 self.view.commit_text.setText('')
56 return
58 directories = self.model.get_directories()
59 directory_entries = self.model.get_directory_entries()
61 if current < len(directories):
62 # This is a directory...
63 dirent = directories[current]
64 if dirent != '..':
65 # This is a real directory for which
66 # we have child entries
67 entries = directory_entries[dirent]
68 else:
69 # This is '..' which is a special case
70 # since it doesn't really exist
71 entries = []
72 self.view.commit_text.setText('\n'.join(entries))
73 self.view.revision.setText('')
74 else:
75 # This is a file entry. The current row is absolute,
76 # so get a relative index by subtracting the number
77 # of directory entries
78 idx = current - len(directories)
80 if idx >= len(self.model.get_subtree_sha1s()):
81 # This can happen when changing directories
82 return
84 objtype, sha1, name = self.model.get_subtree_node(idx)
86 catguts = self.model.cat_file(objtype, sha1, raw=True)
87 self.view.commit_text.setText(catguts)
89 self.view.revision.setText(sha1)
90 self.view.revision.selectAll()
92 # Copy the sha1 into the clipboard
93 qtutils.set_clipboard(sha1)
95 def item_double_clicked(self,*rest):
96 '''This is called when an entry is double-clicked.
97 This callback changes the model's directory when
98 invoked on a directory item. When invoked on a file
99 it allows the file to be saved.'''
101 current = self.view.commit_list.currentRow()
102 directories = self.model.get_directories()
104 # A file item was double-clicked.
105 # Create a save-as dialog and export the file.
106 if current >= len(directories):
107 idx = current - len(directories)
109 objtype, sha1, name = \
110 self.model.get_subtree_node(idx)
112 nameguess = os.path.join(defaults.DIRECTORY, name)
114 filename = qtutils.save_dialog(self.view, 'Save', nameguess)
115 if not filename: return
117 defaults.DIRECTORY = os.path.dirname(filename)
118 contents = self.model.cat_file(objtype, sha1, raw=True)
120 utils.write(filename, contents)
121 return
123 dirent = directories[current]
124 curdir = self.model.get_directory()
126 # '..' is a special case--it doesn't really exist...
127 if dirent == '..':
128 newdir = os.path.dirname(os.path.dirname(curdir))
129 if newdir == '':
130 self.model.set_directory(newdir)
131 else:
132 self.model.set_directory(newdir + os.sep)
133 else:
134 self.model.set_directory(curdir + dirent)
136 ######################################################################
138 def __display_items(self):
139 '''This method populates the commit_list(aka item list)
140 with the current directories and items. Directories are
141 always listed first.'''
143 self.view.commit_text.setText('')
144 self.view.revision.setText('')
146 dir_icon = utils.get_icon('dir.png')
147 file_icon = utils.get_icon('generic.png')
149 qtutils.set_items(self.view.commit_list,
150 map(lambda d: qtutils.create_listwidget_item(d, dir_icon),
151 self.model.get_directories()))
153 qtutils.add_items(self.view.commit_list,
154 map(lambda s: qtutils.create_listwidget_item(s, file_icon),
155 self.model.get_subtree_names()))