File list changes Supersedes the earlier symlink in workingtree + status for folders patches Moves ListView creation to OliveGui Removes duplication _load_right/refresh_right by removing _load_right Adds statusmapper method that checks status both for files and folders
Hopefully this patch does show the folder status! :) Jasper
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [EMAIL PROTECTED] # target_branch: https://code.launchpad.net/~bzr-gtk/bzr-gtk/trunk # testament_sha1: 688f44efc5503260cd7e77fe8ef8ecbf7af087c0 # timestamp: 2008-07-20 19:33:57 +0200 # source_branch: https://code.launchpad.net/~bzr-gtk/bzr-gtk/trunk # base_revision_id: [EMAIL PROTECTED] # # Begin patch === modified file 'olive/__init__.py' --- olive/__init__.py 2008-07-20 16:29:18 +0000 +++ olive/__init__.py 2008-07-20 17:33:42 +0000 @@ -98,7 +98,6 @@ # Get the TreeViews self.treeview_left = self.window.treeview_left - self.treeview_right = self.window.treeview_right # Get the drive selector self.combobox_drive = gtk.combo_box_new_text() @@ -155,7 +154,7 @@ self.remote_revision = None self.set_path(os.getcwd()) - self._load_right() + self.refresh_right() self._just_started = False @@ -212,7 +211,7 @@ # We're local try: - self.wt, self.wtpath = WorkingTree.open_containing(path) + self.wt, self.wtpath = WorkingTree.open_containing(os.path.realpath(path)) except (bzrerrors.NotBranchError, bzrerrors.NoWorkingTree): self.notbranch = True @@ -882,175 +881,10 @@ # Expand the tree self.treeview_left.expand_all() - - def _load_right(self): - """ Load data into the right panel. (Filelist) """ - # Create ListStore - # Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid ] - liststore = gtk.ListStore(gobject.TYPE_STRING, - gobject.TYPE_BOOLEAN, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_STRING, - gobject.TYPE_INT, - gobject.TYPE_STRING, - gobject.TYPE_STRING) - - dirs = [] - files = [] - - # Fill the appropriate lists - dotted_files = self.pref.get_preference('dotted_files', 'bool') - for item in os.listdir(self.path): - if not dotted_files and item[0] == '.': - continue - if os.path.isdir(self.path + os.sep + item): - dirs.append(item) - else: - files.append(item) - - if not self.notbranch: - branch = self.wt.branch - tree2 = self.wt.branch.repository.revision_tree(branch.last_revision()) - - delta = self.wt.changes_from(tree2, want_unchanged=True) - - # Add'em to the ListStore - for item in dirs: - try: - statinfo = os.stat(self.path + os.sep + item) - except OSError, e: - if e.errno in self.acceptable_errors: - continue - else: - raise - liststore.append([ gtk.STOCK_DIRECTORY, - True, - item, - '', - '', - "<DIR>", - "<DIR>", - statinfo.st_mtime, - self._format_date(statinfo.st_mtime), - '']) - for item in files: - status = 'unknown' - fileid = '' - if not self.notbranch: - filename = self.wt.relpath(self.path + os.sep + item) - - try: - self.wt.lock_read() - - for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed: - if rpathnew == filename: - status = 'renamed' - fileid = id - for rpath, id, kind in delta.added: - if rpath == filename: - status = 'added' - fileid = id - for rpath, id, kind in delta.removed: - if rpath == filename: - status = 'removed' - fileid = id - for rpath, id, kind, text_modified, meta_modified in delta.modified: - if rpath == filename: - status = 'modified' - fileid = id - for rpath, id, kind in delta.unchanged: - if rpath == filename: - status = 'unchanged' - fileid = id - for rpath, file_class, kind, id, entry in self.wt.list_files(): - if rpath == filename and file_class == 'I': - status = 'ignored' - finally: - self.wt.unlock() - - if status == 'renamed': - st = _i18n('renamed') - elif status == 'removed': - st = _i18n('removed') - elif status == 'added': - st = _i18n('added') - elif status == 'modified': - st = _i18n('modified') - elif status == 'unchanged': - st = _i18n('unchanged') - elif status == 'ignored': - st = _i18n('ignored') - else: - st = _i18n('unknown') - - try: - statinfo = os.stat(self.path + os.sep + item) - except OSError, e: - if e.errno in self.acceptable_errors: - continue - else: - raise - liststore.append([gtk.STOCK_FILE, - False, - item, - st, - status, - str(statinfo.st_size), # NOTE: if int used there it will fail for large files (size expressed as long int) - self._format_size(statinfo.st_size), - statinfo.st_mtime, - self._format_date(statinfo.st_mtime), - fileid]) - - # Create the columns and add them to the TreeView - self.treeview_right.set_model(liststore) - self._tvcolumn_filename = gtk.TreeViewColumn(_i18n('Filename')) - self._tvcolumn_status = gtk.TreeViewColumn(_i18n('Status')) - self._tvcolumn_size = gtk.TreeViewColumn(_i18n('Size')) - self._tvcolumn_mtime = gtk.TreeViewColumn(_i18n('Last modified')) - self.treeview_right.append_column(self._tvcolumn_filename) - self.treeview_right.append_column(self._tvcolumn_status) - self.treeview_right.append_column(self._tvcolumn_size) - self.treeview_right.append_column(self._tvcolumn_mtime) - - # Set up the cells - cellpb = gtk.CellRendererPixbuf() - cell = gtk.CellRendererText() - self._tvcolumn_filename.pack_start(cellpb, False) - self._tvcolumn_filename.pack_start(cell, True) - self._tvcolumn_filename.set_attributes(cellpb, stock_id=0) - self._tvcolumn_filename.add_attribute(cell, 'text', 2) - self._tvcolumn_status.pack_start(cell, True) - self._tvcolumn_status.add_attribute(cell, 'text', 3) - self._tvcolumn_size.pack_start(cell, True) - self._tvcolumn_size.add_attribute(cell, 'text', 6) - self._tvcolumn_mtime.pack_start(cell, True) - self._tvcolumn_mtime.add_attribute(cell, 'text', 8) - - # Set up the properties of the TreeView - self.treeview_right.set_headers_visible(True) - self.treeview_right.set_headers_clickable(True) - self.treeview_right.set_search_column(1) - self._tvcolumn_filename.set_resizable(True) - self._tvcolumn_status.set_resizable(True) - self._tvcolumn_size.set_resizable(True) - self._tvcolumn_mtime.set_resizable(True) - # Set up sorting - liststore.set_sort_func(13, self._sort_filelist_callback, None) - liststore.set_sort_column_id(13, gtk.SORT_ASCENDING) - self._tvcolumn_filename.set_sort_column_id(13) - self._tvcolumn_status.set_sort_column_id(3) - self._tvcolumn_size.set_sort_column_id(5) - self._tvcolumn_mtime.set_sort_column_id(7) - - # Set sensitivity - self.set_sensitivity() - + def get_selected_fileid(self): """ Get the file_id of the selected file. """ - treeselection = self.treeview_right.get_selection() + treeselection = self.window.treeview_right.get_selection() (model, iter) = treeselection.get_selected() if iter is None: @@ -1060,7 +894,7 @@ def get_selected_right(self): """ Get the selected filename. """ - treeselection = self.treeview_right.get_selection() + treeselection = self.window.treeview_right.get_selection() (model, iter) = treeselection.get_selected() if iter is None: @@ -1135,11 +969,11 @@ return # Get ListStore and clear it - liststore = self.treeview_right.get_model() + liststore = self.window.filelist liststore.clear() # Show Status column - self._tvcolumn_status.set_visible(True) + self.window.col_status.set_visible(True) dirs = [] files = [] @@ -1159,7 +993,7 @@ # Try to open the working tree notbranch = False try: - tree1 = WorkingTree.open_containing(path)[0] + tree1 = WorkingTree.open_containing(os.path.realpath(path))[0] except (bzrerrors.NotBranchError, bzrerrors.NoWorkingTree): notbranch = True @@ -1171,6 +1005,16 @@ # Add'em to the ListStore for item in dirs: + status = '' + st = '' + fileid = '' + if not notbranch: + filename = tree1.relpath(os.path.join(os.path.realpath(path), item)) + + st, status = self.statusmapper(filename, delta) + if not ignored_files and status == 'ignored': + continue + try: statinfo = os.stat(self.path + os.sep + item) except OSError, e: @@ -1178,67 +1022,26 @@ continue else: raise - liststore.append([gtk.STOCK_DIRECTORY, - True, - item, - '', - '', - "<DIR>", - "<DIR>", - statinfo.st_mtime, - self._format_date(statinfo.st_mtime), - '']) + liststore.append([ gtk.STOCK_DIRECTORY, + True, + item, + st, + status, + "<DIR>", + "<DIR>", + statinfo.st_mtime, + self._format_date(statinfo.st_mtime), + '']) for item in files: - status = 'unknown' + status = '' + st = '' fileid = '' if not notbranch: - filename = tree1.relpath(path + os.sep + item) + filename = tree1.relpath(os.path.join(os.path.realpath(path), item)) - try: - self.wt.lock_read() - - for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed: - if rpathnew == filename: - status = 'renamed' - fileid = id - for rpath, id, kind in delta.added: - if rpath == filename: - status = 'added' - fileid = id - for rpath, id, kind in delta.removed: - if rpath == filename: - status = 'removed' - fileid = id - for rpath, id, kind, text_modified, meta_modified in delta.modified: - if rpath == filename: - status = 'modified' - fileid = id - for rpath, id, kind in delta.unchanged: - if rpath == filename: - status = 'unchanged' - fileid = id - for rpath, file_class, kind, id, entry in self.wt.list_files(): - if rpath == filename and file_class == 'I': - status = 'ignored' - finally: - self.wt.unlock() - - if status == 'renamed': - st = _i18n('renamed') - elif status == 'removed': - st = _i18n('removed') - elif status == 'added': - st = _i18n('added') - elif status == 'modified': - st = _i18n('modified') - elif status == 'unchanged': - st = _i18n('unchanged') - elif status == 'ignored': - st = _i18n('ignored') - if not ignored_files: + st, status = self.statusmapper(filename, delta) + if not ignored_files and status == 'ignored': continue - else: - st = _i18n('unknown') try: statinfo = os.stat(self.path + os.sep + item) @@ -1261,11 +1064,11 @@ # We're remote # Get ListStore and clear it - liststore = self.treeview_right.get_model() + liststore = self.window.filelist liststore.clear() # Hide Status column - self._tvcolumn_status.set_visible(False) + self.window.col_status.set_visible(False) dirs = [] files = [] @@ -1338,10 +1141,57 @@ self.image_location_error.destroy() # Columns should auto-size - self.treeview_right.columns_autosize() + self.window.treeview_right.columns_autosize() # Set sensitivity self.set_sensitivity() + + def statusmapper(self, filename, delta): + status = 'unknown' + try: + self.wt.lock_read() + + for rpath, rpathnew, id, kind, text_modified, meta_modified in delta.renamed: + if rpathnew == filename: + status = 'renamed' + fileid = id + for rpath, id, kind in delta.added: + if rpath == filename: + status = 'added' + fileid = id + for rpath, id, kind in delta.removed: + if rpath == filename: + status = 'removed' + fileid = id + for rpath, id, kind, text_modified, meta_modified in delta.modified: + if rpath == filename: + status = 'modified' + fileid = id + for rpath, id, kind in delta.unchanged: + if rpath == filename: + status = 'unchanged' + fileid = id + for rpath, file_class, kind, id, entry in self.wt.list_files(): + if rpath == filename and file_class == 'I': + status = 'ignored' + finally: + self.wt.unlock() + + if status == 'renamed': + st = _i18n('renamed') + elif status == 'removed': + st = _i18n('removed') + elif status == 'added': + st = _i18n('added') + elif status == 'modified': + st = _i18n('modified') + elif status == 'unchanged': + st = _i18n('unchanged') + elif status == 'ignored': + st = _i18n('ignored') + else: + st = _i18n('unknown') + return st, status def _harddisks(self): """ Returns hard drive letters under Win32. """ === modified file 'olive/window.py' --- olive/window.py 2008-07-20 16:02:18 +0000 +++ olive/window.py 2008-07-20 17:31:07 +0000 @@ -383,7 +383,6 @@ def _create_filelist(self): """ Creates the file list (a ListStore in a TreeView in a ScrolledWindow)""" - # Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid ] self.scrolledwindow_right = gtk.ScrolledWindow() self.scrolledwindow_right.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) @@ -391,8 +390,62 @@ self.treeview_right.connect("button-press-event", self.signal.on_treeview_right_button_press_event) self.treeview_right.connect("row-activated", self.signal.on_treeview_right_row_activated) self.scrolledwindow_right.add(self.treeview_right) - - # Move olive/__init__.py _load_right List creation here + + # Model: [ icon, dir, name, status text, status, size (int), size (human), mtime (int), mtime (local), fileid ] + self.filelist = gtk.ListStore(gobject.TYPE_STRING, + gobject.TYPE_BOOLEAN, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_STRING, + gobject.TYPE_INT, + gobject.TYPE_STRING, + gobject.TYPE_STRING) + self.treeview_right.set_model(self.filelist) + + # Set up the cells + cellpb = gtk.CellRendererPixbuf() + cell = gtk.CellRendererText() + + self.col_filename = gtk.TreeViewColumn(_i18n('Filename')) + self.col_filename.pack_start(cellpb, False) + self.col_filename.pack_start(cell, True) + self.col_filename.set_attributes(cellpb, stock_id=0) + self.col_filename.add_attribute(cell, 'text', 2) + self.col_filename.set_resizable(True) + self.treeview_right.append_column(self.col_filename) + + self.col_status = gtk.TreeViewColumn(_i18n('Status')) + self.col_status.pack_start(cell, True) + self.col_status.add_attribute(cell, 'text', 3) + self.col_status.set_resizable(True) + self.treeview_right.append_column(self.col_status) + + self.col_size = gtk.TreeViewColumn(_i18n('Size')) + self.col_size.pack_start(cell, True) + self.col_size.add_attribute(cell, 'text', 6) + self.col_size.set_resizable(True) + self.treeview_right.append_column(self.col_size) + + self.col_mtime = gtk.TreeViewColumn(_i18n('Last modified')) + self.col_mtime.pack_start(cell, True) + self.col_mtime.add_attribute(cell, 'text', 8) + self.col_mtime.set_resizable(True) + self.treeview_right.append_column(self.col_mtime) + + # Set up the properties of the TreeView + self.treeview_right.set_headers_visible(True) + self.treeview_right.set_headers_clickable(True) + self.treeview_right.set_search_column(1) + + # Set up sorting + self.filelist.set_sort_func(13, self.signal._sort_filelist_callback, None) + self.filelist.set_sort_column_id(13, gtk.SORT_ASCENDING) + self.col_filename.set_sort_column_id(13) + self.col_status.set_sort_column_id(3) + self.col_size.set_sort_column_id(5) + self.col_mtime.set_sort_column_id(7) def set_view_to_localbranch(self, notbranch=False): """ Change the sensitivity of gui items to reflect the fact that the path is a branch or not""" # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWUytYRgAB15/gExURADZ7/// f7/dqr////BgDM759vu1ba99vvagAARClFFfRuAY1YNVjFNVETFTR6g0AaGgaAAAAAAAAADVJ6TR p6Q9TEaAGgMgANDIAAAAA0R6UxKeoG0gDR6jRpoAAAABoyGgAk1IgQRPSTI8pptTTyTNQ2o2p6R6 g0aBoAP1IAikRAT0TyFNkyU/Jqn4pmqep+lP1Taj9TUYQANB6gyCSICAEATTQTCSb1NMRqZqemU8 kNNGRoDQ1BCAQC60FdeWCfCwZHRLDKULwKEgID1cMew6EJzpqYDKacnrg7EnDjV0igoKG5/LOobU rcmdvTDkuEkH4zHFxc1PKsUPKA8ucUvAQZ7hTQwuoY4XcjffSZX8msRVhEmR1MJcVZxTPneQeMSk x3ZytwXDSIKNpRAhR/k4CFYQ5G9BZsT85qiLAFBZnxQDdzYZJoYFU4O7teTC+du32yhUBVCFXyFO LJoFVnZ5gomhOr4wlPIxihEBCZ1MZpPS0vOW1B+dIpfl3PtU6IYc1jDoKh1tlvL+9b3amVg5Dl11 JzbMdA20ljbpKg4YVm1HNYXxbCf6cz9Sir+bgzIcWBaKVKEgLmLqOokxv4l9eN5WWNpiIMMCORqJ tqb6qX2Khq6rlWqL3CQSZostDASnFBTiOTlLZrsKgwasjkc9GGXmVZ5j2d3iaCXrJz7jpJJB4oGR 6A9kyJ9HPe4OiCLqJfjp73IFpPQ+bNmlUigoopFHOQzyoxfrrbJzmyoA0AcJol2kLUd54FBwk4Zz MLFYzKISJCqhiqJPUIhGkWNBHUlGdZgzICBDMWzLuCfMBUAhHqpBDTCJSxVGT+6Qfu3xgOro7iYC EBUXPAKcnMVMutGIeMiC1sDnXKekZurWwqbf1Kh1BaqryFmkjloPQam2UdzrB1jTKWVLBIDov1Y4 OuLQUiOUklBRtEwygTGGSk35sEyDPiMzLSMzqmnHclmMKqYGnKALaiN3RstHd/kBVid6269hcTpQ pkCyeFCjyMrI7pxxACsswzC8Log4Fq4lakxMMOWpPVkKamgWwUkC2ECIRLkT+uRcag+zmC+oWfpn qQGDXDIyw1TiPfqnZT58Qma7AWA1gJsmKsI+YYJ4ebGGVxgsgr/FFSeYZTDajMktSlYTgsVKASGd hBmMfLOUz0nnc2pF1oRwRMwOI66lI/5oWF7YYZ6bqInEVJkQAZJE9/toaGx623KWY3EnZdyoDR4U Lh5nAxkBmQJmwvIncUyncStz6I3pb09DKgLUZF6gLgSHnUVjGl5BEcxyDXqTa9lhQoaEC07V/0Vw UiZa1uaWb5wQX8x1UUC8lGLvDO0xIqkbGfvSmWo8EC4lC8wNp+wthZng0Nqk3HVANW/fCkXqcTMt Niau0w1GRUhiXkziUUTgLcRMDE8RRKldHtm0M7hr4kEoQS3NqZNQqa4k6EJrTiKgxcZlx2Yuo4l5 BY2240i2m7MFS04DwkyMSu8gkjVIuSDViajI7WMDS9xyowMTSoedcluOVhaf+BZi71ZslwhjitCq BOTQxw0KEYPrKwGCDFC0maizIExccQdI7+sO5YZ3YU5B14roI0zNRUplPo6SgQNlxecNxmXlg3es kriJiTFE7+21er0ejiOLrhzR2wiwN05G5lalichbUo5o4gS8Ue9mDuGOcZDsEOSHvqsVVVIJEIeE 4eJ0Cik7wncLUNHjEWFkykms++HGcBYxKDI3lFi5zwJ+nl3GDGCiVb1b68Z1B5usy/rTg/b1EOvb 0+DXIIGkf0sAvdbC7VPSwx/TX8hEfhX2b4R/eI7KKIFC3yLrzQC1Ynmptx0YCojZl8i2IcHBhffw vYIldQicPT5PnoKfD/TILhdB4DHiEO9sh/VEIo8RjkBAfYy1BmlNFgwop/lmJwJEftGLRhDHIsGz X4toyFNXDoRzJQHA6QsBRmge0W4qIxIH1l55DntKnwRf1oF6ZMi33B8TQOpNFaBUC4w2/D7EChCg f5HElM91VyDci9EQ9nTcSOcN5yHXlowy40kmRw6d+FiQHy4Yo+D7PtPcbhj3nYUPMe8+JE2VOwOw R1HEGblNAszZcqffVHEFX2IS6OvAzLVmdx0msiTJm41oFsNOWkjE+P4eQDMa9/TsXda4SOOUTF2G Q/Zku4Ev5lxex5CoJUSo4EMNZnY/m2hJcJtKVWbKhC+KIszIgOfwBc2PMcyhymLiQKJQKosQvMEA gSIGNx0EQ5jB7vpKB/fQ1ATvPAcw0POiiCnSpFUi2UvWHZ6vMzVYewc87MYg0oSIgdoTcunHFqwb Ullh/0cHLQosgq6TtHQYTb0eMp8XNR+B2Gl6MFoOj3BfeFzNpBGaJAZGmtMFFdz/4IIAU1BpYVJw QXksqvVzFiQysWYYCoBYZHcMgK5Dm4vSiUBJeSIJYIPgMFCMwNagH3NicywEQB0ROZBaC2ukbprY yu43kyBmwSEb8bsU1s4WMQDWWi3C+CvQWjAQUZITAMeRWAJoH0MhiXmIhHi5dgEljadRzBxNx0nU by0SOtKhfxfkepPL+kl3jwJk5eBKQwMO8252gPIYSnSHQeBO0PAGAoI5jiFaD4OCBlr/xqQuTB1q mhzkh0sjYRAkJPcDAWWFB8dB0MHrB8yBZs0KlPuC8p3VBXhYTniwliHMtxJDCOpCi+nvG8jpNS0h qjzi1IGD2pUd1T7YEYhEwC0AdJPML86nRaa8hS7DINfS29xdKibWQwri3lQJdX2EJgG4fhwKA915 eMIT9Incbr0BhQgDxB5hxgdTaOJPkXMondxiBBJDugUcUuQTiRBKg7pC+gMwGAkDAIYBLwXsphFG 1lmwa/UeF6/HSaBkCYZg+cfadu22ZINYMP6RgIFqSZ19Vu8NxPBO6alBUYKsVST6jnLHrRO4fdwG uJa185RnNWYrz1opQmBIusQwsnfmexIgYoiIa7TsIwzLwoDqxvA1sgwQ2ZxBLxJyUgYUtPAmTQoS PQQhaOdBi08hvLeDgcnqcF4qcDAygGgZL83bnJG00lSkFMYb/vhDK8+P1npHsRGo8WXqCAawIhX9 NBNv5yELgFYOReXwNVI+cDLbHeMXHNHf1ZQzQaFKTreI3Wk0Ykh3m87Fna8ydY1hIbgwTbqYSxNY wYwQNMh4oIXYmIMe+9B82pbw8FgNc4nDTBBsZBmQaAIadzMO2+Gqa/wZuz2EmEhVQ1VX0Jtrp7xL E0KB79x7yxWjCgZfIFZgiwQUN+BzUeRTnQvI95dS6l1ZJBAWA4gZmpFNft9/IsE5UCgVbaue91Ew ZkRD0wJyzANQJWlnINU7VsSjm+n2KZFgsFgs4ogdhRSehsPi9qAaFQ0hzy7ALhgX4kDhS1A6Ud4T Ch+4uSci2U8CArypYjKlLSospxQmk7iaoxkBirk/uj8VsOJm4h2fWOxot4SbaiW8b6WUfARNKIwR Hf1r0rkQvCZoK970RabGyOwuVJREDMBLl4AedhODPvA9OhctpL5g2IMCorGEiCGMHhii4RAJEMdZ AY0QSySM2mLDyWynOp0jdALWiwiwYslcthkiyBQpCraNsdmuVINO3tM+ZXxnnbIIxOXmsxqhejTW HINBMegF9IbkKHcnQHqV4biCZDSUkSQOQSiCRWHLhEnFtC4SmnEymTGDi+CCvAO0Fit5PqQQNqtf pmOXXyI+c84LlkIOgcJdfqP/F3JFOFCQTK1hGA==
signature.asc
Description: OpenPGP digital signature
-- bzr-gtk mailing list [email protected] Modify settings or unsubscribe at: https://lists.canonical.com/mailman/listinfo/bzr-gtk
