3 from qobserver
import QObserver
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
, })
18 view
.commitList
, 'itemDoubleClicked(QListWidgetItem*)',
19 self
.item_double_clicked
)
21 # Start at the root of the tree
22 model
.set_directory('')
24 ######################################################################
27 def action_directory_changed(self
):
28 '''This is called in response to a change in the the
30 self
.model
.init_browser_data()
31 self
.__display
_items
()
33 ######################################################################
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('')
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
]
53 # This is a real directory for which
54 # we have child entries
55 msg
= utils
.header('Directory:' + dirent
)
56 entries
= directory_entries
[dirent
]
58 # This is '..' which is a special case
59 # since it doesn't really exist
60 msg
= utils
.header('Parent Directory')
63 contents
= '\n'.join(entries
)
65 self
.view
.commitText
.setText(msg
+ contents
)
66 self
.view
.revisionLine
.setText('')
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
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
)
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
)
121 dirent
= directories
[current
]
122 curdir
= self
.model
.get_directory()
124 # '..' is a special case--it doesn't really exist...
126 newdir
= os
.path
.dirname(os
.path
.dirname(curdir
))
128 self
.model
.set_directory(newdir
)
130 self
.model
.set_directory(newdir
+ os
.sep
)
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
.commitList
.clear()
142 self
.view
.commitText
.setText('')
143 self
.view
.revisionLine
.setText('')
145 dir_icon
= utils
.get_directory_icon()
146 file_icon
= utils
.get_file_icon()
148 for entry
in self
.model
.get_directories():
149 item
= qtutils
.create_listwidget_item(entry
, dir_icon
)
150 self
.view
.commitList
.addItem(item
)
152 for entry
in self
.model
.get_subtree_names():
153 item
= qtutils
.create_listwidget_item(entry
, file_icon
)
154 self
.view
.commitList
.addItem(item
)