def _parse_config(self): self.rawfonts = hglib.getfontconfig(self.ui) self.fonts = {} for name, val in self.rawfonts.items(): self.fonts[name[4:]] = pango.FontDescription(val) try: self.diffbottom = self.ui.configbool('gtools', 'diffbottom', False) except error.ConfigError: self.diffbottom = False
def get_body(self, vbox): # message self.msgset = keep._('Backed out changeset: ') self.msgset['id'] += self.rev self.msgset['str'] += self.rev # changeset info style = csinfo.panelstyle(label=_('Changeset Description'), margin=4, padding=2) self.csetframe = csinfo.create(self.repo, self.rev, style, withupdate=True) vbox.pack_start(self.csetframe, False, False, 2) # backout commit message frame = gtk.Frame(_('Backout commit message')) frame.set_border_width(4) msgvbox = gtk.VBox() msgvbox.set_border_width(4) frame.add(msgvbox) vbox.pack_start(frame, True, True, 2) self.cmsgframe = frame ## message text area accelgroup = gtk.AccelGroup() self.add_accel_group(accelgroup) self.logview = textview.UndoableTextView(accelgroup=accelgroup) fontcomment = hglib.getfontconfig()['fontcomment'] self.logview.modify_font(pango.FontDescription(fontcomment)) self.buf = self.logview.get_buffer() self.buf.set_text(self.msgset['str']) scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolledwindow.add(self.logview) msgvbox.pack_start(scrolledwindow) self.logview.set_editable(False) ## tooltips self.tips = gtklib.Tooltips() self.tips.set_tip(frame, _('Commit message text for new changeset that reverses the ' 'effect of the change being backed out.')) ## use English backout message option self.eng_msg = gtk.CheckButton(_('Use English backout message')) self.eng_msg.connect('toggled', self.eng_msg_toggled) engmsg = self.repo.ui.configbool('tortoisehg', 'engmsg', False) self.eng_msg.set_active(engmsg) msgvbox.pack_start(self.eng_msg, False, False) ## merge after backout self.merge_button = gtk.CheckButton( _('Commit backout before merging with current working parent')) self.merge_button.connect('toggled', self.merge_toggeled) msgvbox.pack_start(self.merge_button, False, False, 4)
def __init__(self): gtk.VBox.__init__(self) # scrolled pane pane = gtk.ScrolledWindow() pane.set_shadow_type(gtk.SHADOW_ETCHED_IN) pane.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.add(pane) # log textview self.textview = gtk.TextView(buffer=None) self.textview.set_editable(False) fontlog = hglib.getfontconfig()['fontlog'] self.textview.modify_font(pango.FontDescription(fontlog)) pane.add(self.textview) # text buffer self.buffer = self.textview.get_buffer() for tag, argdict in gtklib.TextBufferTags.iteritems(): self.buffer.create_tag(tag, **argdict)
def __init__(self, webdir_conf): """ Initialize the Dialog """ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) gtklib.set_tortoise_icon(self, 'proxy.ico') gtklib.set_tortoise_keys(self) self.connect('delete-event', self._delete) # Pipe stderr, stdout to self.write self._queue = Queue.Queue() sys.stdout = self sys.stderr = self # Set a closed attribute to better mimic stderr (issue #891) self.closed = True # Override mercurial.commands.serve() with our own version # that supports being stopped commands.table.update(thg_serve_cmd) self._url = None self._root = paths.find_root() self._webdirconf = webdir_conf self._get_config() self.set_default_size(500, 300) # toolbar self.tbar = gtk.Toolbar() self.tooltips = gtklib.Tooltips() self._button_start = self._toolbutton(gtk.STOCK_MEDIA_PLAY, _('Start'), self._on_start_clicked, tip=_('Start server')) self._button_stop = self._toolbutton(gtk.STOCK_MEDIA_STOP, _('Stop'), self._on_stop_clicked, tip=_('Stop server')) self._button_browse = self._toolbutton(gtk.STOCK_HOME, _('Browse'), self._on_browse_clicked, tip=_('Launch browser to view repository')) self._button_conf = self._toolbutton(gtk.STOCK_PREFERENCES, _('Configure'), self._on_conf_clicked, tip=_('Configure web settings')) tbuttons = [ self._button_start, self._button_stop, gtk.SeparatorToolItem(), self._button_browse, gtk.SeparatorToolItem(), self._button_conf, ] for btn in tbuttons: self.tbar.insert(btn, -1) vbox = gtk.VBox() self.add(vbox) vbox.pack_start(self.tbar, False, False, 2) # revision input revbox = gtk.HBox() self._port_input = gtk.Entry() self._port_input.set_text(self.defport) revbox.pack_start(gtk.Label(_('HTTP Port:')), False, False, 4) revbox.pack_start(self._port_input, False, False) vbox.pack_start(revbox, False, False, 2) scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.textview = gtk.TextView(buffer=None) self.textview.set_editable(False) fontlog = hglib.getfontconfig()['fontlog'] self.textview.modify_font(pango.FontDescription(fontlog)) scrolledwindow.add(self.textview) self.textbuffer = self.textview.get_buffer() vbox.pack_start(scrolledwindow, True, True) self._set_button_states()
def __init__(self, cmdline, progressbar=True, text=None): if type(cmdline) is tuple: self.cmdlist = list(cmdline)[1:] cmdline = cmdline[0] else: self.cmdlist = [] title = text or ' '.join(cmdline) if len(title) > 80: title = hglib.tounicode(title)[:80] + '...' title = hglib.toutf(title.replace('\n', ' ')) gtk.Dialog.__init__(self, title=title, flags=gtk.DIALOG_MODAL) self.set_has_separator(False) gtklib.set_tortoise_icon(self, 'hg.ico') gtklib.set_tortoise_keys(self) self.cmdline = cmdline self.returncode = None self.hgthread = None self.set_default_size(520, 400) self._button_stop = gtk.Button(_('Stop')) self._button_stop.connect('clicked', self._on_stop_clicked) self.action_area.pack_start(self._button_stop) self._button_ok = gtk.Button(_('Close')) self._button_ok.connect('clicked', self._on_ok_clicked) self.action_area.pack_start(self._button_ok) self.connect('thg-accept', self._on_ok_clicked) self.connect('delete-event', self._delete) self.connect('response', self._response) self.pbar = None if progressbar: self.last_pbar_update = 0 hbox = gtk.HBox() self.status_text = gtk.Label() self.status_text.set_text(title) self.status_text.set_alignment(0, 0.5) self.status_text.set_ellipsize(pango.ELLIPSIZE_END) hbox.pack_start(self.status_text, True, True, 3) # Create a centering alignment object align = gtk.Alignment(0.0, 0.0, 1, 0) hbox.pack_end(align, False, False, 3) align.show() # create the progress bar self.pbar = gtk.ProgressBar() align.add(self.pbar) self.pbar.pulse() self.pbar.show() self.vbox.pack_start(hbox, False, False, 3) scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.textview = gtk.TextView(buffer=None) self.textview.set_editable(False) fontlog = hglib.getfontconfig()['fontlog'] self.textview.modify_font(pango.FontDescription(fontlog)) scrolledwindow.add(self.textview) self.textbuffer = self.textview.get_buffer() gtklib.configstyles(ui.ui()) for tag, argdict in gtklib.TextBufferTags.iteritems(): self.textbuffer.create_tag(tag, **argdict) self.vbox.pack_start(scrolledwindow, True, True) self.connect('map_event', self._on_window_map_event) self.show_all()
def __init__(self, root='', revargs=[]): """ Initialize the Dialog """ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) gtklib.set_tortoise_icon(self, 'hg.ico') gtklib.set_tortoise_keys(self) self.root = root self.revargs = revargs self.tbar = gtk.Toolbar() self.tips = gtklib.Tooltips() tbuttons = [ self._toolbutton(gtk.STOCK_GOTO_LAST, _('Send'), self._on_send_clicked, _('Send emails')), self._toolbutton(gtk.STOCK_FIND, _('Test'), self._on_test_clicked, _('Show emails which would be sent')), gtk.SeparatorToolItem(), self._toolbutton(gtk.STOCK_PREFERENCES, _('Configure'), self._on_conf_clicked, _('Configure email settings')) ] for btn in tbuttons: self.tbar.insert(btn, -1) mainvbox = gtk.VBox() self.add(mainvbox) mainvbox.pack_start(self.tbar, False, False, 2) # set dialog title if revargs[0] in ('--outgoing', '-o'): self.set_title(_('Email outgoing changes')) elif revargs[0] in ('--rev', '-r'): self.set_title(_('Email revisions ') + ' '.join(revargs[1:])) else: self.set_title(_('Email Mercurial Patches')) self.set_default_size(650, 450) hbox = gtk.HBox() envframe = gtk.Frame(_('Envelope')) flagframe = gtk.Frame(_('Options')) hbox.pack_start(envframe, True, True, 4) hbox.pack_start(flagframe, False, False, 4) mainvbox.pack_start(hbox, False, True, 4) # Envelope settings table = gtklib.LayoutTable() envframe.add(table) ## To: combo box self._tolist = gtk.ListStore(str) self._tobox = gtk.ComboBoxEntry(self._tolist, 0) table.add_row(_('To:'), self._tobox, padding=False) ## Cc: combo box self._cclist = gtk.ListStore(str) self._ccbox = gtk.ComboBoxEntry(self._cclist, 0) table.add_row(_('Cc:'), self._ccbox, padding=False) ## From: combo box self._fromlist = gtk.ListStore(str) self._frombox = gtk.ComboBoxEntry(self._fromlist, 0) table.add_row(_('From:'), self._frombox, padding=False) ## In-Reply-To: entry self._replyto = gtk.Entry() table.add_row(_('In-Reply-To:'), self._replyto, padding=False) self.tips.set_tip(self._replyto, _('Message identifier to reply to, for threading')) # Options table = gtklib.LayoutTable() flagframe.add(table) self._normal = gtk.RadioButton(None, _('Send changesets as Hg patches')) table.add_row(self._normal) self.tips.set_tip(self._normal, _('Hg patches (as generated by export command) are compatible ' 'with most patch programs. They include a header which ' 'contains the most important changeset metadata.')) self._git = gtk.RadioButton(self._normal, _('Use extended (git) patch format')) table.add_row(self._git) self.tips.set_tip(self._git, _('Git patches can describe binary files, copies, and ' 'permission changes, but recipients may not be able to ' 'use them if they are not using git or Mercurial.')) self._plain = gtk.RadioButton(self._normal, _('Plain, do not prepend Hg header')) table.add_row(self._plain) self.tips.set_tip(self._plain, _('Stripping Mercurial header removes username and parent ' 'information. Only useful if recipient is not using ' 'Mercurial (and does not like to see the headers).')) self._bundle = gtk.RadioButton(self._normal, _('Send single binary bundle, not patches')) table.add_row(self._bundle) if revargs[0] in ('--outgoing', '-o'): self.tips.set_tip(self._bundle, _('Bundles store complete changesets in binary form. ' 'Upstream users can pull from them. This is the safest ' 'way to send changes to recipient Mercurial users.')) else: self._bundle.set_sensitive(False) self.tips.set_tip(self._bundle, _('This feature is only available when sending outgoing ' 'changesets. It is not applicable with revision ranges.')) self._attach = gtk.CheckButton(_('attach')) self.tips.set_tip(self._attach, _('send patches as attachments')) self._inline = gtk.CheckButton(_('inline')) self.tips.set_tip(self._inline, _('send patches as inline attachments')) self._diffstat = gtk.CheckButton(_('diffstat')) self.tips.set_tip(self._diffstat, _('add diffstat output to messages')) table.add_row(self._attach, self._inline, self._diffstat, padding=False) # Subject combo vbox = gtk.VBox() hbox = gtk.HBox() self._subjlist = gtk.ListStore(str) self._subjbox = gtk.ComboBoxEntry(self._subjlist, 0) hbox.pack_start(gtk.Label(_('Subject:')), False, False, 4) hbox.pack_start(self._subjbox, True, True, 4) hglib.loadextension(ui.ui(), 'patchbomb') # --flags was added after hg 1.3 hasflags = False for arg in extensions.find('patchbomb').emailopts: if arg[1] == 'flag': hasflags = True break self._flaglist = gtk.ListStore(str) self._flagbox = gtk.ComboBoxEntry(self._flaglist, 0) if hasflags: hbox.pack_start(gtk.Label(_('Flags:')), False, False, 4) hbox.pack_start(self._flagbox, False, False, 4) vbox.pack_start(hbox, False, False, 4) # Description TextView accelgroup = gtk.AccelGroup() self.add_accel_group(accelgroup) self.descview = textview.UndoableTextView(accelgroup=accelgroup) self.descview.set_editable(True) fontcomment = hglib.getfontconfig()['fontcomment'] self.descview.modify_font(pango.FontDescription(fontcomment)) self.descbuffer = self.descview.get_buffer() scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolledwindow.add(self.descview) frame = gtk.Frame(_('Patch Series (Bundle) Description')) frame.set_border_width(4) vbox.pack_start(scrolledwindow, True, True, 4) vbox.set_border_width(4) eventbox = gtk.EventBox() eventbox.add(vbox) frame.add(eventbox) self._eventbox = eventbox mainvbox.pack_start(frame, True, True, 4) gtklib.idle_add_single_call(self._refresh, True)
def get_body(self, vbox): os.chdir(self.repo.root) # wrap box wrapbox = gtk.VBox() wrapbox.set_border_width(5) vbox.pack_start(wrapbox, True, True) self.wrapbox = wrapbox lbl = gtk.Label(LABELS[self.command][0]) lbl.set_alignment(0, 0) wrapbox.pack_start(lbl, False, False) def keypressed(tree, event): 'Make spacebar toggle selected rows' if event.keyval != 32: return False def toggler(model, path, bufiter): model[path][0] = not model[path][0] selection = tree.get_selection() selection.selected_foreach(toggler) return True # add file list treeview fm = gtk.ListStore(bool, # Checked str, # Path str, # Path-UTF8 str) # Status self.filetree = gtk.TreeView(fm) self.filetree.connect('key-press-event', keypressed) self.filetree.set_headers_clickable(True) self.filetree.set_reorderable(False) if hasattr(self.filetree, 'set_rubber_banding'): self.filetree.set_rubber_banding(True) fontlist = hglib.getfontconfig()['fontlist'] self.filetree.modify_font(pango.FontDescription(fontlist)) def select_toggle(cell, path): fm[path][0] = not fm[path][0] # file selection checkboxes toggle_cell = gtk.CellRendererToggle() toggle_cell.connect('toggled', select_toggle) toggle_cell.set_property('activatable', True) col = gtk.TreeViewColumn('', toggle_cell, active=0) col.set_resizable(False) self.filetree.append_column(col) col = gtk.TreeViewColumn(_('status'), gtk.CellRendererText(), text=3) self.filetree.append_column(col) col = gtk.TreeViewColumn(_('path'), gtk.CellRendererText(), text=2) self.filetree.append_column(col) scroller = gtk.ScrolledWindow() scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scroller.set_shadow_type(gtk.SHADOW_ETCHED_IN) scroller.add(self.filetree) wrapbox.pack_start(scroller, True, True, 6) def toggleall(button): for row in self.filetree.get_model(): row[0] = not row[0] # extra box self.extrabox = hbox = gtk.HBox() wrapbox.pack_start(hbox, False, False) ## toggle button tb = gtk.Button(_('Toggle all selections')) tb.connect('pressed', toggleall) hbox.pack_start(tb, False, False) if self.command == 'revert': ## no backup checkbox chk = gtk.CheckButton(_('Do not save backup files (*.orig)')) hbox.pack_start(chk, False, False, 6) self.nobackup = chk ## padding hbox.pack_start(gtk.Label()) types = { 'add' : 'I?', 'forget' : 'MAR!C', 'revert' : 'MAR!', 'remove' : 'MAR!CI?', } filetypes = types[self.command] try: matcher = cmdutil.match(self.repo, self.pats) status = self.repo.status(match=matcher, clean='C' in filetypes, ignored='I' in filetypes, unknown='?' in filetypes) except (EnvironmentError, util.Abort), e: gdialog.Prompt(_('Unable to determine repository status'), str(e), self).run() self.earlyout=True self.hide() return
def __init__(self): """ Initialize the Dialog. """ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) gtklib.set_tortoise_icon(self, 'general.ico') gtklib.set_tortoise_keys(self) self.set_default_size(600, 400) self.connect('delete-event', self._delete) self.hgthread = None self.inprogress = False self.last_pbar_update = 0 try: repo = hg.repository(ui.ui(), path=paths.find_root()) except error.RepoError: gtklib.idle_add_single_call(self.destroy) return self.repo = repo self.reponame = hglib.get_reponame(repo) self.set_title(_('%s - recovery') % self.reponame) # toolbar self.tbar = gtk.Toolbar() self.tips = gtklib.Tooltips() self._stop_button = self._toolbutton(gtk.STOCK_STOP, _('Stop'), self._stop_clicked, tip=_('Stop the hg operation')) self._stop_button.set_sensitive(False) tbuttons = [ self._toolbutton(gtk.STOCK_CLEAR, _('Clean'), self._clean_clicked, tip=_('Clean checkout, undo all changes')), gtk.SeparatorToolItem(), self._toolbutton(gtk.STOCK_UNDO, _('Rollback'), self._rollback_clicked, tip=_('Rollback (undo) last transaction to ' 'repository (pull, commit, etc)')), gtk.SeparatorToolItem(), self._toolbutton(gtk.STOCK_CLEAR, _('Recover'), self._recover_clicked, tip=_('Recover from interrupted operation')), gtk.SeparatorToolItem(), self._toolbutton(gtk.STOCK_APPLY, _('Verify'), self._verify_clicked, tip=_('Validate repository consistency')), gtk.SeparatorToolItem(), self._stop_button, gtk.SeparatorToolItem(), ] for btn in tbuttons: self.tbar.insert(btn, -1) vbox = gtk.VBox() self.add(vbox) vbox.pack_start(self.tbar, False, False, 2) # hg output window scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.textview = gtk.TextView(buffer=None) self.textview.set_editable(False) fontlog = hglib.getfontconfig()['fontlog'] self.textview.modify_font(pango.FontDescription(fontlog)) scrolledwindow.add(self.textview) self.textbuffer = self.textview.get_buffer() gtklib.configstyles(repo.ui) for tag, argdict in gtklib.TextBufferTags.iteritems(): self.textbuffer.create_tag(tag, **argdict) vbox.pack_start(scrolledwindow, True, True) self.progstat = gtk.Label() vbox.pack_start(self.progstat, False, False, 0) self.progstat.set_alignment(0, 0.5) self.progstat.set_ellipsize(pango.ELLIPSIZE_END) self.pbar = gtk.ProgressBar() vbox.pack_start(self.pbar, False, False, 2)
def __init__(self): 'Initialize the Dialog' gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) gtklib.set_tortoise_icon(self, 'detect_rename.ico') gtklib.set_tortoise_keys(self) try: repo = hg.repository(ui.ui(), path=paths.find_root()) except error.RepoError: gtklib.idle_add_single_call(self.destroy) return self.repo = repo self.notify_func = None reponame = hglib.get_reponame(repo) self.set_title(_('Detect Copies/Renames in %s') % reponame) self.settings = settings.Settings('guess') dims = self.settings.get_value('dims', (800, 600)) self.set_default_size(dims[0], dims[1]) # vbox for dialog main & status bar mainvbox = gtk.VBox() self.add(mainvbox) # vsplit for top & diff self.vpaned = gtk.VPaned() mainvbox.pack_start(self.vpaned, True, True, 2) pos = self.settings.get_value('vpaned', None) if pos: self.vpaned.set_position(pos) # vbox for top contents topvbox = gtk.VBox() self.vpaned.pack1(topvbox, True, False) # frame for simularity frame = gtk.Frame(_('Minimum Simularity Percentage')) topvbox.pack_start(frame, False, False, 2) #$ simularity slider self.adjustment = gtk.Adjustment(50, 0, 100, 1) value = self.settings.get_value('percent', None) if value: self.adjustment.set_value(value) hscale = gtk.HScale(self.adjustment) frame.add(hscale) # horizontal splitter for unknown & candidate self.hpaned = gtk.HPaned() topvbox.pack_start(self.hpaned, True, True, 2) pos = self.settings.get_value('hpaned', None) if pos: self.hpaned.set_position(pos) #$ frame for unknown list unknownframe = gtk.Frame(_('Unrevisioned Files')) self.hpaned.pack1(unknownframe, True, True) #$$ vbox for unknown list & rename/copy buttons unkvbox = gtk.VBox() unknownframe.add(unkvbox) #$$$ scroll window for unknown list scroller = gtk.ScrolledWindow() unkvbox.pack_start(scroller, True, True, 2) scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) #$$$$ unknown list unkmodel = gtk.ListStore(str, # path str) # path (utf-8) self.unktree = gtk.TreeView(unkmodel) scroller.add(self.unktree) self.unktree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) cell = gtk.CellRendererText() cell.set_property("ellipsize", pango.ELLIPSIZE_START) col = gtk.TreeViewColumn('File', cell, text=1) self.unktree.append_column(col) self.unktree.set_enable_search(True) self.unktree.set_headers_visible(False) #$$$ hbox for rename/copy buttons btnhbox = gtk.HBox() unkvbox.pack_start(btnhbox, False, False, 2) #$$$$ rename/copy buttons in unknown frame self.renamebtn = gtk.Button(_('Find Renames')) self.renamebtn.set_sensitive(False) btnhbox.pack_start(self.renamebtn, False, False, 2) self.copybtn = gtk.Button(_('Find Copies')) self.copybtn.set_sensitive(False) btnhbox.pack_start(self.copybtn, False, False, 2) #$ frame for candidate list candidateframe = gtk.Frame(_('Candidate Matches')) self.hpaned.pack2(candidateframe, True, True) #$$ vbox for candidate list & accept button canvbox = gtk.VBox() candidateframe.add(canvbox) #$$$ scroll window for candidate list scroller = gtk.ScrolledWindow() canvbox.pack_start(scroller, True, True, 2) scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) #$$$$ candidate list canmodel = gtk.ListStore(str, # source str, # source (utf-8) str, # dest str, # dest (utf-8) str, # percent bool) # sensitive self.cantree = gtk.TreeView(canmodel) scroller.add(self.cantree) self.cantree.set_rules_hint(True) self.cantree.set_reorderable(False) self.cantree.set_enable_search(False) self.cantree.get_selection().set_mode(gtk.SELECTION_MULTIPLE) cell = gtk.CellRendererText() cell.set_property('width-chars', 30) cell.set_property('ellipsize', pango.ELLIPSIZE_START) col = gtk.TreeViewColumn(_('Source'), cell, text=1, sensitive=5) col.set_resizable(True) self.cantree.append_column(col) cell = gtk.CellRendererText() cell.set_property('width-chars', 30) cell.set_property('ellipsize', pango.ELLIPSIZE_START) col = gtk.TreeViewColumn(_('Dest'), cell, text=3, sensitive=5) col.set_resizable(True) self.cantree.append_column(col) cell = gtk.CellRendererText() cell.set_property('width-chars', 5) cell.set_property('ellipsize', pango.ELLIPSIZE_NONE) col = gtk.TreeViewColumn('%', cell, text=4, sensitive=5) col.set_resizable(True) self.cantree.append_column(col) #$$$ hbox for accept button btnhbox = gtk.HBox() canvbox.pack_start(btnhbox, False, False, 2) #$$$$ accept button in candidate frame self.acceptbtn = gtk.Button(_('Accept Match')) btnhbox.pack_start(self.acceptbtn, False, False, 2) self.acceptbtn.set_sensitive(False) # frame for diff diffframe = gtk.Frame(_('Differences from Source to Dest')) self.vpaned.pack2(diffframe) diffframe.set_shadow_type(gtk.SHADOW_ETCHED_IN) #$ scroll window for diff scroller = gtk.ScrolledWindow() diffframe.add(scroller) scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) #$$ text view for diff self.buf = gtk.TextBuffer() self.buf.create_tag('removed', foreground=gtklib.DRED) self.buf.create_tag('added', foreground=gtklib.DGREEN) self.buf.create_tag('position', foreground=gtklib.DORANGE) self.buf.create_tag('header', foreground=gtklib.DBLUE) diffview = gtk.TextView(self.buf) scroller.add(diffview) fontdiff = hglib.getfontconfig()['fontdiff'] diffview.modify_font(pango.FontDescription(fontdiff)) diffview.set_wrap_mode(gtk.WRAP_NONE) diffview.set_editable(False) # status bar self.stbar = statusbar.StatusBar() mainvbox.pack_start(self.stbar, False, False, 2) # register signal handlers self.copybtn.connect('pressed', lambda b: self.find_copies()) self.renamebtn.connect('pressed', lambda b: self.find_renames()) self.acceptbtn.connect('pressed', lambda b: self.accept_match()) self.unktree.get_selection().connect('changed', self.unknown_sel_change) self.cantree.connect('row-activated', lambda t,p,c: self.accept_match()) self.cantree.get_selection().connect('changed', self.show_diff) self.connect('delete-event', lambda *a: self.save_settings()) gtklib.idle_add_single_call(self.refresh)
def __init__(self, repos=[], pushmode=False): """ Initialize the Dialog. """ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) gtklib.set_tortoise_icon(self, 'menusynch.ico') gtklib.set_tortoise_keys(self) self.root = paths.find_root() self.selected_path = None self.hgthread = None self.notify_func = None self.last_drop_time = None self.lastcmd = [] # persistent app data self._settings = settings.Settings('synch') self.set_default_size(655, 552) self.paths = self.get_paths() self.set_title(_('%s - synchronize') % hglib.get_reponame(self.repo)) self.connect('delete-event', self.delete) # toolbar self.tbar = gtk.Toolbar() self.tips = gtklib.Tooltips() self.stop_button = self.toolbutton(gtk.STOCK_STOP, _('Stop'), self.stop_clicked, tip=_('Stop the hg operation')) self.stop_button.set_sensitive(False) tbuttons = [ self.toolbutton(gtk.STOCK_GO_DOWN, _('Incoming'), self.incoming_clicked, tip=_('Display changes that can be pulled ' 'from selected repository')), self.toolbutton(gtk.STOCK_GOTO_BOTTOM, _(' Pull '), self.pull_clicked, tip=_('Pull changes from selected ' 'repository')), gtk.SeparatorToolItem(), self.toolbutton(gtk.STOCK_GO_UP, _('Outgoing'), self.outgoing_clicked, tip=_('Display local changes that will be ' 'pushed to selected repository')), self.toolbutton(gtk.STOCK_GOTO_TOP, _('Push'), self.push_clicked, tip=_('Push local changes to selected ' 'repository')), self.toolbutton(gtk.STOCK_GOTO_LAST, _('Email'), self.email_clicked, tip=_('Email local outgoing changes to ' 'one or more recipients')), self.toolbutton(gtk.STOCK_UNDO, _('Shelve'), self.shelve_clicked, tip=_('Shelve uncommited changes')), gtk.SeparatorToolItem(), self.stop_button, gtk.SeparatorToolItem(), self.toolbutton(gtk.STOCK_PREFERENCES, _('Configure'), self.conf_clicked, tip=_('Configure peer repository paths')), gtk.SeparatorToolItem(), ] for btn in tbuttons: self.tbar.insert(btn, -1) # Base box self.basevbox = basevbox = gtk.VBox() self.add(basevbox) basevbox.pack_start(self.tbar, False, False, 2) # Sync Target Path targethbox = gtk.HBox() ## target selection buttons lbl = gtk.Button(_('Repo:')) lbl.unset_flags(gtk.CAN_FOCUS) lbl.connect('clicked', self.btn_remotepath_clicked) targethbox.pack_start(lbl, False, False) lbl = gtk.Button(_('Bundle:')) lbl.unset_flags(gtk.CAN_FOCUS) lbl.connect('clicked', self.btn_bundlepath_clicked) targethbox.pack_start(lbl, False, False) ## target path combobox self.pathlist = gtk.ListStore(str, str) self.pathbox = gtk.ComboBoxEntry(self.pathlist, 0) self.pathtext = self.pathbox.get_child() cell = gtk.CellRendererText() self.pathbox.pack_end(cell, False) self.pathbox.add_attribute(cell, 'text', 1) targethbox.pack_start(self.pathbox, True, True) self.fill_path_combo() defrow = None defpushrow = None for i, (path, alias) in enumerate(self.pathlist): if alias == 'default': defrow = i if defpushrow is None: defpushrow = i elif alias == 'default-push': defpushrow = i if repos: self.pathtext.set_text(hglib.toutf(repos[0])) elif defpushrow is not None and pushmode: self.pathbox.set_active(defpushrow) elif defrow is not None: self.pathbox.set_active(defrow) exs = [ name for name, module in extensions.extensions() ] # Post Pull Operation ppullhbox = gtk.HBox() self.ppulldata = [('none', _('Nothing')), ('update', _('Update'))] cfg = self.repo.ui.config('tortoisehg.postpull', 'none') if 'fetch' in exs or 'fetch' == cfg: self.ppulldata.append(('fetch', _('Fetch'))) if 'rebase' in exs or 'rebase' == cfg: self.ppulldata.append(('rebase', _('Rebase'))) self.ppullcombo = combo = gtk.combo_box_new_text() for (index, (name, label)) in enumerate(self.ppulldata): combo.insert_text(index, label) ppullhbox.pack_start(gtk.Label(_('Post Pull: ')), False, False, 2) ppullhbox.pack_start(self.ppullcombo, True, True) # Fixed options box (non-foldable) fixedhbox = gtk.HBox() fixedhbox.pack_start(targethbox, True, True, 2) fixedhbox.pack_start(ppullhbox, False, False, 2) # Advanced options (foldable) opthbox = gtk.HBox() self.expander = expander = gtk.Expander(_('Advanced Options')) expander.set_expanded(False) expander.connect_after('activate', self.expanded) expander.add(opthbox) ## checkbox options chkopthbox = gtk.HBox() self.force = gtk.CheckButton(_('Force pull or push')) self.tips.set_tip(self.force, _('Run even when remote repository is unrelated.')) self.newbranch = gtk.CheckButton(_('Push new branch')) self.tips.set_tip(self.newbranch, _('Allow pushing a new branch')) self.use_proxy = gtk.CheckButton(_('Use proxy server')) if ui.ui().config('http_proxy', 'host', ''): self.use_proxy.set_active(True) else: self.use_proxy.set_sensitive(False) chkopthbox.pack_start(self.force, False, False, 4) chkopthbox.pack_start(self.newbranch, False, False, 4) chkopthbox.pack_start(self.use_proxy, False, False, 4) ## target revision option revhbox = gtk.HBox() self.reventry = gtk.Entry() revhbox.pack_start(gtk.Label(_('Target revision:')), False, False, 2) revhbox.pack_start(self.reventry, True, True, 2) reveventbox = gtk.EventBox() reveventbox.add(revhbox) self.tips.set_tip(reveventbox, _('A specific revision up to which you ' 'would like to push or pull.')) ## remote command option cmdhbox = gtk.HBox() self.cmdentry = gtk.Entry() cmdhbox.pack_start(gtk.Label(_('Remote command:')), False, False, 2) cmdhbox.pack_start(self.cmdentry, True, True, 2) cmdeventbox = gtk.EventBox() cmdeventbox.add(cmdhbox) self.tips.set_tip(cmdeventbox, _('Name of hg executable on remote machine.')) revvbox = gtk.VBox() revvbox.pack_start(chkopthbox, False, False, 8) revvbox.pack_start(reveventbox, False, False, 4) revvbox.pack_start(cmdeventbox, False, False, 4) opthbox.pack_start(revvbox, True, True, 4) ## incoming/outgoing options frame = gtk.Frame(_('Incoming/Outgoing')) opthbox.pack_start(frame, False, False, 2) self.showpatch = gtk.CheckButton(_('Show patches')) self.newestfirst = gtk.CheckButton(_('Show newest first')) self.nomerge = gtk.CheckButton(_('Show no merges')) iovbox = gtk.VBox() iovbox.pack_start(self.showpatch, False, False, 2) iovbox.pack_start(self.newestfirst, False, False, 2) iovbox.pack_start(self.nomerge, False, False, 2) frame.add(iovbox) # Main option box topvbox = gtk.VBox() topvbox.pack_start(fixedhbox, True, True, 2) topvbox.pack_start(expander, False, False, 2) basevbox.pack_start(topvbox, False, False, 2) # hg output window scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.textview = gtk.TextView(buffer=None) self.textview.set_editable(False) fontlog = hglib.getfontconfig()['fontlog'] self.textview.modify_font(pango.FontDescription(fontlog)) scrolledwindow.add(self.textview) self.textview.connect('populate-popup', self.add_to_popup) self.textbuffer = self.textview.get_buffer() gtklib.configstyles(self.repo.ui) for tag, argdict in gtklib.TextBufferTags.iteritems(): self.textbuffer.create_tag(tag, **argdict) basevbox.pack_start(scrolledwindow, True, True) # statusbar self.stbar = statusbar.StatusBar() basevbox.pack_end(self.stbar, False, False, 2) # support dropping of repos or bundle files self.drag_dest_set(gtk.DEST_DEFAULT_ALL, [("text/uri-list", 0, 1)], gtk.gdk.ACTION_COPY) self.connect('drag_data_received', self._drag_receive) # prepare to show self.load_settings() self.update_pull_setting() gtklib.idle_add_single_call(self.finalize_startup)