import gtk class ResultsDownloadView(gtk.VBox): def show_data(self, results): self.treeViewResults.show_data(results) def __init__(self, *args, **kwargs): super(ResultsDownloadView, self).__init__(*args, **kwargs) sw_results = gtk.ScrolledWindow() sw_results.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw_results.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.pack_start(sw_results,expand=True, fill=True) self.treeViewResults = TreeViewResults() sw_results.add(self.treeViewResults) buttonBox_download = gtk.HButtonBox() self.pack_end(buttonBox_download,expand=False, fill=False) results_tree_view_store = self.treeViewResults.store def event_clicked_download(button, *_): import gobject import xnat_search enabled = (d for d in results_tree_view_store if d[0]) for d in enabled: def stop_spinner(_row): _row[7] = False # Hide spinner _row[0] = False # Checkbox to false d[8] = 0 d[7] = True # Show Spinner xnat_search.download_async(d[6], button.destination, cb=stop_spinner, cb_args=(d,)) def event_selection_changed(filechooserbutton, *_): self.button_download.destination = filechooserbutton.get_filename() button_folder = gtk.FileChooserButton("Select Folder") button_folder.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) button_folder.connect("selection-changed", event_selection_changed) buttonBox_download.add(button_folder) self.button_download = ButtonDownloadResults(label="Download Selected Items") self.button_download.connect("clicked", event_clicked_download) buttonBox_download.add(self.button_download) class ButtonDownloadResults(gtk.Button): count = 0 _destination = "" @property def destination(self): return self._destination @destination.setter def destination(self, value): self._destination = value def __init__(self, *args, **kwargs): super(ButtonDownloadResults, self).__init__(*args, **kwargs) class TreeViewResults(gtk.TreeView): def __init__(self): import gobject super(TreeViewResults, self).__init__() self.create_columns() self.store = gtk.ListStore(bool, str, str, str, str, str, gobject.TYPE_PYOBJECT, bool, int) self.set_model(self.store) gobject.timeout_add(150, self.move_spinners) def move_spinners(self): for r in self.store: if r[7]: # if spinner is visible r[8] += 1 return True def create_columns(self): def callback_toggled(cellrenderertoggle, path_string, col, *_): it = self.store.get_iter_from_string(path_string) is_active = cellrenderertoggle.get_active() self.store.set(it, col, not is_active) renderer = gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect("toggled", callback_toggled, 0) column = gtk.TreeViewColumn("", renderer) column.add_attribute(renderer, "active", 0) column.set_sort_column_id(0) column.set_resizable(False) self.append_column(column) renderer = gtk.CellRendererSpinner() column = gtk.TreeViewColumn("", renderer, active=7, pulse=8) self.append_column(column) column = gtk.TreeViewColumn("Project-ID", gtk.CellRendererText(), text=1) column.set_sort_column_id(1) column.set_resizable(True) self.append_column(column) column = gtk.TreeViewColumn("Subject-ID", gtk.CellRendererText(), text=2) column.set_sort_column_id(2) column.set_resizable(True) self.append_column(column) column = gtk.TreeViewColumn("Session-ID", gtk.CellRendererText(), text=3) column.set_sort_column_id(3) column.set_resizable(True) self.append_column(column) column = gtk.TreeViewColumn("Scan-ID", gtk.CellRendererText(), text=4) column.set_sort_column_id(4) column.set_resizable(True) self.append_column(column) column = gtk.TreeViewColumn("Scan-Type", gtk.CellRendererText(), text=5) column.set_sort_column_id(5) column.set_resizable(True) self.append_column(column) def show_data(self, data): self.store.clear() for d in data: self.store.append( [ True, d['xnat_mrsessiondata_project'], d['xnat_mrsessiondata_subject_id'], d['xnat_mrsessiondata_session_id'], d['id'], d['type'], d, False, 0 ])