Simplified controllers by using qtutils.set_items/add_items
[ugit.git] / ugitlibs / repobrowsercontroller.py
blob642b3aecdb280120334a5e7a9a1e3ea279f5c44a
1 #!/usr/bin/env python
2 import os
3 from qobserver import QObserver
4 import cmds
5 import utils
6 import qtutils
7 import defaults
9 class GitRepoBrowserController(QObserver):
10 def __init__(self, model, view):
11 QObserver.__init__(self, model, view)
13 view.setWindowTitle('File Browser')
14 self.add_signals('itemSelectionChanged()', view.commitList,)
15 self.add_actions('directory', self.action_directory_changed)
16 self.add_callbacks({ 'commitList': self.item_changed, })
17 self.connect(
18 view.commitList, 'itemDoubleClicked(QListWidgetItem*)',
19 self.item_double_clicked)
21 # Start at the root of the tree
22 model.set_directory('')
24 ######################################################################
25 # Actions
27 def action_directory_changed(self):
28 '''This is called in response to a change in the the
29 model's directory.'''
30 self.model.init_browser_data()
31 self.__display_items()
33 ######################################################################
34 # Qt callbacks
36 def item_changed(self,*rest):
37 '''This is called when the current item changes in the
38 file/directory list(aka the commitList).'''
39 current = self.view.commitList.currentRow()
40 item = self.view.commitList.item(current)
41 if item is None or not item.isSelected():
42 self.view.revisionLine.setText('')
43 self.view.commitText.setText('')
44 return
46 directories = self.model.get_directories()
47 directory_entries = self.model.get_directory_entries()
49 if current < len(directories):
50 # This is a directory...
51 dirent = directories[current]
52 if dirent != '..':
53 # This is a real directory for which
54 # we have child entries
55 msg = utils.header('Directory:' + dirent)
56 entries = directory_entries[dirent]
57 else:
58 # This is '..' which is a special case
59 # since it doesn't really exist
60 msg = utils.header('Parent Directory')
61 entries = []
63 contents = '\n'.join(entries)
65 self.view.commitText.setText(msg + contents)
66 self.view.revisionLine.setText('')
67 else:
68 # This is a file entry. The current row is absolute,
69 # so get a relative index by subtracting the number
70 # of directory entries
71 idx = current - len(directories)
73 if idx >= len(self.model.get_subtree_sha1s()):
74 # This can happen when changing directories
75 return
77 objtype, sha1, name = \
78 self.model.get_subtree_node(idx)
80 guts = cmds.git_cat_file(objtype, sha1)
81 header = utils.header('File: ' + name)
82 contents = guts
84 self.view.commitText.setText(header + contents)
86 self.view.revisionLine.setText(sha1)
87 self.view.revisionLine.selectAll()
89 # Copy the sha1 into the clipboard
90 qtutils.set_clipboard(sha1)
92 def item_double_clicked(self,*rest):
93 '''This is called when an entry is double-clicked.
94 This callback changes the model's directory when
95 invoked on a directory item. When invoked on a file
96 it allows the file to be saved.'''
98 current = self.view.commitList.currentRow()
99 directories = self.model.get_directories()
101 # A file item was double-clicked.
102 # Create a save-as dialog and export the file.
103 if current >= len(directories):
104 idx = current - len(directories)
106 objtype, sha1, name = \
107 self.model.get_subtree_node(idx)
109 nameguess = os.path.join(defaults.DIRECTORY, name)
111 filename = qtutils.save_dialog(self.view,
112 self.tr('Save'), nameguess)
113 if not filename: return
115 defaults.DIRECTORY = os.path.dirname(filename)
116 contents = cmds.git_cat_file(objtype, sha1)
118 utils.write(filename, contents)
119 return
121 dirent = directories[current]
122 curdir = self.model.get_directory()
124 # '..' is a special case--it doesn't really exist...
125 if dirent == '..':
126 newdir = os.path.dirname(os.path.dirname(curdir))
127 if newdir == '':
128 self.model.set_directory(newdir)
129 else:
130 self.model.set_directory(newdir + os.sep)
131 else:
132 self.model.set_directory(curdir + dirent)
134 ######################################################################
136 def __display_items(self):
137 '''This method populates the commitList(aka item list)
138 with the current directories and items. Directories are
139 always listed first.'''
141 self.view.commitText.setText('')
142 self.view.revisionLine.setText('')
144 dir_icon = utils.get_directory_icon()
145 file_icon = utils.get_file_icon()
147 qtutils.set_items(self.view.commitList,
148 map(lambda d: qtutils.create_listwidget_item(d, dir_icon),
149 self.model.get_directories()))
151 qtutils.add_items(self.view.commitList,
152 map(lambda s: qtutils.create_listwidget_item(s, file_icon),
153 self.model.get_subtree_names()))