3 from PyQt4
.QtGui
import QDialog
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
):
13 # Clone the model to allow opening multiple browsers
14 # with different sets of data
16 model
.set_currentbranch(branch
)
17 view
= CommitView(parent
)
18 controller
= RepoBrowserController(model
, view
)
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
)
30 'itemDoubleClicked(QListWidgetItem*)',
31 self
.item_double_clicked
)
33 # Start at the root of the tree
34 model
.set_directory('')
36 ######################################################################
39 def action_directory_changed(self
):
40 '''This is called in response to a change in the the
42 self
.model
.init_browser_data()
43 self
.__display
_items
()
45 ######################################################################
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('')
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
]
65 # This is a real directory for which
66 # we have child entries
67 entries
= directory_entries
[dirent
]
69 # This is '..' which is a special case
70 # since it doesn't really exist
72 self
.view
.commit_text
.setText('\n'.join(entries
))
73 self
.view
.revision
.setText('')
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
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
)
123 dirent
= directories
[current
]
124 curdir
= self
.model
.get_directory()
126 # '..' is a special case--it doesn't really exist...
128 newdir
= os
.path
.dirname(os
.path
.dirname(curdir
))
130 self
.model
.set_directory(newdir
)
132 self
.model
.set_directory(newdir
+ os
.sep
)
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()))