def __init__(self, parent, vcs, notebook, page=None): Dialog.__init__( self, parent, _('Versions'), # T: dialog title buttons=Gtk.ButtonsType.CLOSE, help='Plugins:Version Control') self.notebook = notebook self.vcs = vcs self._side_by_side_app = get_side_by_side_app() self.uistate.setdefault('windowsize', (600, 500), check=value_is_coord) self.uistate.setdefault('vpanepos', 300) self.vpaned = VPaned() self.vpaned.set_position(self.uistate['vpanepos']) self.vbox.pack_start(self.vpaned, True, True, 0) vbox = Gtk.VBox(spacing=5) self.vpaned.pack1(vbox, resize=True) # Choice between whole notebook or page label = Gtk.Label(label='<b>' + _('Versions') + ':</b>') # section label label.set_use_markup(True) label.set_alignment(0, 0.5) vbox.pack_start(label, False, True, 0) self.notebook_radio = Gtk.RadioButton.new_with_mnemonic_from_widget( None, _('Complete _notebook')) # T: Option in versions dialog to show version for complete notebook self.page_radio = Gtk.RadioButton.new_with_mnemonic_from_widget( self.notebook_radio, _('_Page') + ':') # T: Option in versions dialog to show version for single page #~ recursive_box = Gtk.CheckButton.new_with_mnemonic('Recursive') vbox.pack_start(self.notebook_radio, False, True, 0) # Page entry hbox = Gtk.HBox(spacing=5) vbox.pack_start(hbox, False, True, 0) hbox.pack_start(self.page_radio, False, True, 0) self.page_entry = PageEntry(self.notebook) if page: self.page_entry.set_path(page) hbox.pack_start(self.page_entry, False, True, 0) # View annotated button ann_button = Gtk.Button.new_with_mnemonic( _('View _Annotated')) # T: Button label ann_button.connect('clicked', lambda o: self.show_annotated()) hbox.pack_start(ann_button, False, True, 0) # Help text label = Gtk.Label(label='<i>\n' + _('''\ Select a version to see changes between that version and the current state. Or select multiple versions to see changes between those versions. ''').strip() + '</i>') # T: Help text in versions dialog label.set_use_markup(True) #~ label.set_alignment(0, 0.5) vbox.pack_start(label, False, True, 0) # Version list self.versionlist = VersionsTreeView() self.versionlist.load_versions(vcs.list_versions()) scrolled = ScrolledWindow(self.versionlist) vbox.add(scrolled) col = self.uistate.setdefault('sortcol', self.versionlist.REV_SORT_COL) order = self.uistate.setdefault('sortorder', Gtk.SortType.DESCENDING) try: self.versionlist.get_model().set_sort_column_id(col, order) except: logger.exception('Invalid sort column: %s %s', col, order) # ----- vbox = Gtk.VBox(spacing=5) self.vpaned.pack2(vbox, resize=False) label = Gtk.Label(label='<b>' + _('Comment') + '</b>') # T: version details label.set_use_markup(True) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False, True, 0) # Comment text window, textview = ScrolledTextView() self.comment_textview = textview vbox.add(window) buttonbox = Gtk.HButtonBox() buttonbox.set_layout(Gtk.ButtonBoxStyle.END) vbox.pack_start(buttonbox, False, True, 0) # Restore version button revert_button = Gtk.Button.new_with_mnemonic( _('_Restore Version')) # T: Button label revert_button.connect('clicked', lambda o: self.restore_version()) buttonbox.add(revert_button) # Notebook Changes button diff_button = Gtk.Button.new_with_mnemonic(_('Show _Changes')) # T: button in versions dialog for diff diff_button.connect('clicked', lambda o: self.show_changes()) buttonbox.add(diff_button) # Compare page button comp_button = Gtk.Button.new_with_mnemonic(_('_Side by Side')) # T: button in versions dialog for side by side comparison comp_button.connect('clicked', lambda o: self.show_side_by_side()) buttonbox.add(comp_button) # UI interaction between selections and buttons def on_row_activated(o, iter, path): model = self.versionlist.get_model() comment = model[iter][VersionsTreeView.MSG_COL] buffer = textview.get_buffer() buffer.set_text(comment) self.versionlist.connect('row-activated', on_row_activated) def on_ui_change(o): usepage = self.page_radio.get_active() self.page_entry.set_sensitive(usepage) ann_button.set_sensitive(usepage) # side by side comparison can only be done for one page # revert can only be done to one version, not multiple selection = self.versionlist.get_selection() model, rows = selection.get_selected_rows() if not rows: revert_button.set_sensitive(False) diff_button.set_sensitive(False) comp_button.set_sensitive(False) elif len(rows) == 1: revert_button.set_sensitive(usepage) diff_button.set_sensitive(True) comp_button.set_sensitive( bool(usepage and self._side_by_side_app)) else: revert_button.set_sensitive(False) diff_button.set_sensitive(True) comp_button.set_sensitive( bool(usepage and self._side_by_side_app)) def on_page_change(o): pagesource = self._get_file() if pagesource: self.versionlist.load_versions( vcs.list_versions(self._get_file())) def on_book_change(o): self.versionlist.load_versions(vcs.list_versions()) self.page_radio.connect('toggled', on_ui_change) self.notebook_radio.connect('toggled', on_book_change) self.page_radio.connect('toggled', on_page_change) self.page_entry.connect('changed', on_page_change) selection = self.versionlist.get_selection() selection.connect('changed', on_ui_change) # select last version self.versionlist.get_selection().select_path((0, )) col = self.versionlist.get_column(0) self.versionlist.row_activated(Gtk.TreePath((0, )), col)