Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.0, 1.0.1, and 1.0.2

browse: more browser like behavior

Changeset e605d438da85

Parent 2bc8af536514

by Steve Borho

Changes to one file · Browse files at e605d438da85 Showing diff from parent 2bc8af536514 Diff from another changeset...

 
13
14
15
16
 
17
18
19
 
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
 
 
 
 
 
 
 
 
 
 
 
101
102
103
104
105
106
107
 
 
108
109
 
110
111
112
 
116
117
118
 
119
120
 
 
 
 
 
 
121
122
123
 
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
 
 
208
209
210
 
220
221
222
223
 
224
225
226
 
236
237
238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
240
241
 
13
14
15
 
16
17
18
19
 
66
67
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
87
88
89
 
90
91
92
93
 
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
 
178
179
180
 
 
 
 
 
 
 
 
 
 
 
 
 
181
 
182
183
184
185
186
 
196
197
198
 
199
200
201
202
 
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
@@ -13,7 +13,7 @@
 from mercurial import hg, ui, cmdutil    from tortoisehg.util.i18n import _ -from tortoisehg.util import hglib, paths, shlib +from tortoisehg.util import hglib, paths, shlib, menuthg  from tortoisehg.util.hglib import RepoError    from tortoisehg.hgtk import hgcmd, gtklib, gdialog @@ -66,47 +66,28 @@
  ]  filepb = gtk.gdk.pixbuf_new_from_xpm_data(filexpm)   -class BrowseDialog(gtk.Dialog): - 'Dialog for performing quick dirstate operations' - def __init__(self, command, pats): - gtk.Dialog.__init__(self) - gtklib.set_tortoise_icon(self, 'hg.ico') - gtklib.set_tortoise_keys(self) - self.set_has_separator(False) - self.set_default_size(400, 500) - self.connect('response', self.dialog_response) - repo = hg.repository(ui.ui(), path=paths.find_root()) - - self.set_title(_('%s - browser') % hglib.get_reponame(repo)) - - browse = BrowsePane(repo) - entry = gtk.Entry() - entry.set_text(repo.root) - self.vbox.pack_start(entry, False, True) - - scroller = gtk.ScrolledWindow() - scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - scroller.set_shadow_type(gtk.SHADOW_ETCHED_IN) - scroller.add(browse) - self.vbox.pack_start(scroller, True, True) - self.show_all() - self.browse = browse - gobject.idle_add(self.refresh) - - def refresh(self): - self.browse.refresh() - - def dialog_response(self, dialog, response): - return True +class dirnode(object): + def __init__(self): + self.subdirs = {} + self.files = [] + self.statuses = set() + def addfile(self, filename, st): + self.files.append((filename, st)) + self.addstatus(st) + def addsubdir(self, dirname): + self.subdirs[dirname] = dirnode() + def addstatus(self, st): + self.statuses.add(st)    class BrowsePane(gtk.TreeView):   'Dialog for browsing repo.status() output'   def __init__(self, repo):   gtk.TreeView.__init__(self)   self.repo = repo - fm = gtk.ListStore(str, # Path + self.menu = menuthg.menuThg() + fm = gtk.ListStore(str, # canonical path   bool, # Checked - str, # Path-UTF8 + str, # basename-UTF8   bool, # M   bool, # A   bool, # R @@ -116,8 +97,15 @@
  bool, # C   bool) # isfile   self.set_model(fm) +   self.set_headers_visible(False)   self.set_reorderable(True) + self.connect('popup-menu', self.popupmenu) + self.connect('button-release-event', self.buttonrelease) + self.connect('row-activated', self.rowactivated) + self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.set_reorderable(False) + self.set_enable_search(True)   if hasattr(self, 'set_rubber_banding'):   self.set_rubber_banding(True)   fontlist = repo.ui.config('gtools', 'fontlist', 'MS UI Gothic 9') @@ -190,21 +178,9 @@
  filelist.append([ m, s ])   filelist.sort()   - class dirnode(object): - def __init__(self): - self.subdirs = {} - self.files = [] - self.statuses = set() - def addfile(self, filename, st): - self.files.append((filename, st)) - self.addstatus(st) - def addsubdir(self, dirname): - self.subdirs[dirname] = dirnode() - def addstatus(self, st): - self.statuses.add(st) -   def buildrow(name, stset, isfile): - row = [ name, False, hglib.toutf(name), + dirs, basename = self.split(name) + row = [ name, False, hglib.toutf(basename),   'M' in stset, 'A' in stset, 'R' in stset,   '!' in stset, '?' in stset, 'I' in stset,   'C' in stset, isfile ] @@ -220,7 +196,7 @@
  curdir.addsubdir(dir)   curdir.addstatus(filestatus)   curdir = curdir.subdirs[dir] - curdir.addfile(basename, filestatus) + curdir.addfile(name, filestatus)     model = self.get_model()   self.set_model(None) # disable updates while we fill the model @@ -236,6 +212,63 @@
  adddir(modelroot)   self.set_model(model)   + def popupmenu(self, browse): + model, tpaths = browse.get_selection().get_selected_rows() + if not tpaths: + return + files = [model[p][0] for p in tpaths if model[p][10]] + menus = self.menu.get_commands(self.repo, self.repo.root, files) + # see nautilus extension for usage info + for menu_info in menus: + print menu_info + + def buttonrelease(self, browse, event): + if event.button != 3: + return False + self.popupmenu(browse) + return True + + def rowactivated(self, browse, path, column): + model, tpaths = browse.get_selection().get_selected_rows() + if not tpaths: + return + if len(tpaths) == 1 and not model[tpaths[0]][10]: + print 'cd', model[tpaths[0]][0] + else: + files = [model[p][0] for p in tpaths and model[p][10]] + print files, 'activated' + +class BrowseDialog(gtk.Dialog): + 'Wrapper application for BrowsePane' + def __init__(self, command, pats): + gtk.Dialog.__init__(self) + gtklib.set_tortoise_icon(self, 'hg.ico') + gtklib.set_tortoise_keys(self) + self.set_has_separator(False) + self.set_default_size(400, 500) + self.connect('response', self.dialog_response) + repo = hg.repository(ui.ui(), path=paths.find_root()) + self.set_title(_('%s - browser') % hglib.get_reponame(repo)) + + browse = BrowsePane(repo) + entry = gtk.Entry() + entry.set_text(repo.root) + self.vbox.pack_start(entry, False, True) + + scroller = gtk.ScrolledWindow() + scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + scroller.set_shadow_type(gtk.SHADOW_ETCHED_IN) + scroller.add(browse) + self.vbox.pack_start(scroller, True, True) + self.show_all() + self.browse = browse + gobject.idle_add(self.refresh) + + def refresh(self): + self.browse.refresh() + + def dialog_response(self, dialog, response): + return True    def run(ui, *pats, **opts):   pats = hglib.canonpaths(pats)