def __init__(self, repo, tag='', rev='tip', parent=None, opts={}): super(TagDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & \ ~Qt.WindowContextHelpButtonHint) self.repo = repo self.setWindowTitle(_('Tag - %s') % repo.displayname) self.setWindowIcon(qtlib.geticon('hg-tag')) # base layout box base = QVBoxLayout() base.setSpacing(0) base.setContentsMargins(*(0, ) * 4) base.setSizeConstraint(QLayout.SetFixedSize) self.setLayout(base) # main layout box box = QVBoxLayout() box.setSpacing(8) box.setContentsMargins(*(8, ) * 4) self.layout().addLayout(box) form = QFormLayout(fieldGrowthPolicy=QFormLayout.AllNonFixedFieldsGrow) box.addLayout(form) ctx = repo[rev] form.addRow(_('Revision:'), QLabel('%d (%s)' % (ctx.rev(), ctx))) self.rev = ctx.rev() ### tag combo self.tagCombo = QComboBox() self.tagCombo.setEditable(True) self.tagCombo.setEditText(hglib.tounicode(tag)) self.tagCombo.currentIndexChanged.connect(self.updateStates) self.tagCombo.editTextChanged.connect(self.updateStates) form.addRow(_('Tag:'), self.tagCombo) self.tagRevLabel = QLabel('') form.addRow(_('Tagged:'), self.tagRevLabel) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.show_options) box.addWidget(expander) optbox = QVBoxLayout() optbox.setSpacing(6) box.addLayout(optbox) hbox = QHBoxLayout() hbox.setSpacing(0) optbox.addLayout(hbox) self.localCheckBox = QCheckBox(_('Local tag')) self.localCheckBox.toggled.connect(self.updateStates) self.replaceCheckBox = QCheckBox( _('Replace existing tag (-f/--force)')) self.replaceCheckBox.toggled.connect(self.updateStates) optbox.addWidget(self.localCheckBox) optbox.addWidget(self.replaceCheckBox) self.englishCheckBox = QCheckBox(_('Use English commit message')) engmsg = repo.ui.configbool('tortoisehg', 'engmsg', False) self.englishCheckBox.setChecked(engmsg) optbox.addWidget(self.englishCheckBox) self.customCheckBox = QCheckBox(_('Use custom commit message:')) self.customCheckBox.toggled.connect(self.customMessageToggle) self.customTextLineEdit = QLineEdit() optbox.addWidget(self.customCheckBox) optbox.addWidget(self.customTextLineEdit) ## bottom buttons BB = QDialogButtonBox bbox = QDialogButtonBox(BB.Close) bbox.rejected.connect(self.reject) self.addBtn = bbox.addButton(_('&Add'), BB.ActionRole) self.removeBtn = bbox.addButton(_('&Remove'), BB.ActionRole) box.addWidget(bbox) self.addBtn.clicked.connect(self.onAddTag) self.removeBtn.clicked.connect(self.onRemoveTag) ## horizontal separator self.sep = QFrame() self.sep.setFrameShadow(QFrame.Sunken) self.sep.setFrameShape(QFrame.HLine) base.addWidget(self.sep) ## status line self.status = qtlib.StatusLabel() self.status.setContentsMargins(4, 2, 4, 4) base.addWidget(self.status) self.cmd = cmdui.Runner(False, self) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.commandFinished.connect(self.onCommandFinished) repo.repositoryChanged.connect(self.refresh) self.customTextLineEdit.setDisabled(True) self.replaceCheckBox.setChecked(bool(opts.get('force'))) self.localCheckBox.setChecked(bool(opts.get('local'))) if not opts.get('local') and opts.get('message'): msg = hglib.tounicode(opts['message']) self.customCheckBox.setChecked(True) self.customTextLineEdit.setText(msg) self.clear_statue() self.show_options(False) self.tagCombo.setFocus() self.refresh()
def __init__(self, repoagent, rev=None, parent=None, opts={}): super(UpdateDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & \ ~Qt.WindowContextHelpButtonHint) self._repoagent = repoagent repo = repoagent.rawRepo() # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = QGridLayout() self.grid.setSpacing(6) box.addLayout(self.grid) ### target revision combo self.rev_combo = combo = QComboBox() combo.setEditable(True) self.grid.addWidget(QLabel(_('Update to:')), 0, 0) self.grid.addWidget(combo, 0, 1) # Give the combo box a minimum width that will ensure that the dialog is # large enough to fit the additional progress bar that will appear when # updating subrepositories. combo.setMinimumWidth(450) # always include integer revision try: assert not isinstance(rev, (unicode, QString)) ctx = self.repo[rev] if isinstance(ctx.rev(), int): # could be None or patch name combo.addItem(str(ctx.rev())) except error.RepoLookupError: pass for name in repo.namedbranches: combo.addItem(hglib.tounicode(name)) tags = list(self.repo.tags()) + repo._bookmarks.keys() tags.sort(reverse=True) for tag in tags: combo.addItem(hglib.tounicode(tag)) if rev is None: selecturev = hglib.tounicode(self.repo.dirstate.branch()) else: selecturev = hglib.tounicode(str(rev)) selectindex = combo.findText(selecturev) if selectindex >= 0: combo.setCurrentIndex(selectindex) else: combo.setEditText(selecturev) ### target revision info items = ('%(rev)s', ' %(branch)s', ' %(tags)s', '<br />%(summary)s') style = csinfo.labelstyle(contents=items, width=350, selectable=True) factory = csinfo.factory(self.repo, style=style) self.target_info = factory() self.grid.addWidget(QLabel(_('Target:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.target_info, 1, 1) ### parent revision info self.ctxs = self.repo[None].parents() if len(self.ctxs) == 2: self.p1_info = factory() self.grid.addWidget(QLabel(_('Parent 1:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p1_info, 2, 1) self.p2_info = factory() self.grid.addWidget(QLabel(_('Parent 2:')), 3, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p2_info, 3, 1) else: self.p1_info = factory() self.grid.addWidget(QLabel(_('Parent:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p1_info, 2, 1) ### options self.optbox = QVBoxLayout() self.optbox.setSpacing(6) expander = qtlib.ExpanderLabel(_('Options:'), False) expander.expanded.connect(self.show_options) row = self.grid.rowCount() self.grid.addWidget(expander, row, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addLayout(self.optbox, row, 1) self.verbose_chk = QCheckBox(_('List updated files (--verbose)')) self.discard_chk = QCheckBox( _('Discard local changes, no backup ' '(-C/--clean)')) self.merge_chk = QCheckBox(_('Always merge (when possible)')) self.autoresolve_chk = QCheckBox( _('Automatically resolve merge conflicts ' 'where possible')) self.showlog_chk = QCheckBox(_('Always show command log')) self.optbox.addWidget(self.verbose_chk) self.optbox.addWidget(self.discard_chk) self.optbox.addWidget(self.merge_chk) self.optbox.addWidget(self.autoresolve_chk) self.optbox.addWidget(self.showlog_chk) s = QSettings() self.discard_chk.setChecked(bool(opts.get('clean'))) #### Persisted Options self.merge_chk.setChecked(QSettings().value('update/merge', False).toBool()) self.autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False) or s.value('update/autoresolve', False).toBool()) self.showlog_chk.setChecked(s.value('update/showlog', False).toBool()) self.verbose_chk.setChecked(s.value('update/verbose', False).toBool()) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.progress.connect(self.progress) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cancel_clicked) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.update_btn = buttons.addButton(_('&Update'), QDialogButtonBox.ActionRole) self.update_btn.clicked.connect(self.update) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) box.addWidget(buttons) # signal handlers self.rev_combo.editTextChanged.connect(self.update_info) self.discard_chk.toggled.connect(self.update_info) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle(_('Update - %s') % self.repo.displayname) self.setWindowIcon(qtlib.geticon('hg-update')) # prepare to show self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.merge_chk.setHidden(True) self.autoresolve_chk.setHidden(True) self.showlog_chk.setHidden(True) self.update_info() if not self.update_btn.isEnabled(): self.rev_combo.lineEdit().selectAll() # need to change rev # expand options if a hidden one is checked hiddenOptionsChecked = self.hiddenSettingIsChecked() self.show_options(hiddenOptionsChecked) expander.set_expanded(hiddenOptionsChecked)
def __init__(self, repo, rev=None, parent=None, opts={}): super(MatchDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & \ ~Qt.WindowContextHelpButtonHint) self.revsetexpression = '' self._finished = False self.repo = repo # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = QGridLayout() self.grid.setSpacing(6) box.addLayout(self.grid) ### matched revision combo self.rev_combo = combo = QComboBox() combo.setEditable(True) self.grid.addWidget(QLabel(_('Find revisions matching fields of:')), 0, 0) self.grid.addWidget(combo, 0, 1) # Give the combo box a minimum width that will ensure that the dialog is # large enough to fit the additional progress bar that will appear when # updating subrepositories. combo.setMinimumWidth(450) if rev is None: rev = self.repo.dirstate.branch() else: rev = str(rev) combo.addItem(hglib.tounicode(rev)) combo.setCurrentIndex(0) # make it easy to match the workding directory parent revision combo.addItem(hglib.tounicode('.')) tags = list(self.repo.tags()) + repo._bookmarks.keys() tags.sort(reverse=True) for tag in tags: combo.addItem(hglib.tounicode(tag)) ### matched revision info self.rev_to_match_info_text = QLabel() self.rev_to_match_info_text.setShown(False) style = csinfo.panelstyle(contents=('cset', 'branch', 'close', 'user', 'dateage', 'parents', 'children', 'tags', 'graft', 'transplant', 'p4', 'svn', 'converted'), selectable=True, expandable=True) factory = csinfo.factory(self.repo, style=style) self.rev_to_match_info = factory() self.rev_to_match_info_lbl = QLabel(_('Revision to Match:')) self.grid.addWidget(self.rev_to_match_info_lbl, 1, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.rev_to_match_info, 1, 1) self.grid.addWidget(self.rev_to_match_info_text, 1, 1) ### fields that will be matched self.optbox = QVBoxLayout() self.optbox.setSpacing(6) expander = qtlib.ExpanderLabel(_('Fields to match:'), False) expander.expanded.connect(self.show_options) row = self.grid.rowCount() self.grid.addWidget(expander, row, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addLayout(self.optbox, row, 1) self.summary_chk = QCheckBox(_('Summary (first description line)')) self.description_chk = QCheckBox(_('Description')) self.desc_btngroup = QButtonGroup() self.desc_btngroup.setExclusive(False) self.desc_btngroup.addButton(self.summary_chk) self.desc_btngroup.addButton(self.description_chk) self.desc_btngroup.buttonClicked.connect( self._selectSummaryOrDescription) self.author_chk = QCheckBox(_('Author')) self.date_chk = QCheckBox(_('Date')) self.files_chk = QCheckBox(_('Files')) self.diff_chk = QCheckBox(_('Diff contents')) self.substate_chk = QCheckBox(_('Subrepo states')) self.branch_chk = QCheckBox(_('Branch')) self.parents_chk = QCheckBox(_('Parents')) self.phase_chk = QCheckBox(_('Phase')) self._hideable_chks = ( self.branch_chk, self.phase_chk, self.parents_chk, ) has_diff_matching = hglib.hgversion >= "2.3" self.optbox.addWidget(self.summary_chk) self.optbox.addWidget(self.description_chk) self.optbox.addWidget(self.author_chk) self.optbox.addWidget(self.date_chk) self.optbox.addWidget(self.files_chk) if has_diff_matching: # if mercurial does not have a "diff" matching mode, # we simply "hide" the diff checkbox, # to make the saveSettings() method simpler self.optbox.addWidget(self.diff_chk) self.optbox.addWidget(self.substate_chk) self.optbox.addWidget(self.branch_chk) self.optbox.addWidget(self.parents_chk) self.optbox.addWidget(self.phase_chk) s = QSettings() #### Persisted Options self.summary_chk.setChecked( s.value('matching/summary', False).toBool()) self.description_chk.setChecked( s.value('matching/description', True).toBool()) self.author_chk.setChecked(s.value('matching/author', True).toBool()) self.branch_chk.setChecked(s.value('matching/branch', False).toBool()) self.date_chk.setChecked(s.value('matching/date', True).toBool()) self.files_chk.setChecked(s.value('matching/files', False).toBool()) self.diff_chk.setChecked(s.value('matching/diff', False).toBool()) self.parents_chk.setChecked( s.value('matching/parents', False).toBool()) self.phase_chk.setChecked(s.value('matching/phase', False).toBool()) self.substate_chk.setChecked( s.value('matching/substate', False).toBool()) ## bottom buttons buttons = QDialogButtonBox() self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.match_btn = buttons.addButton(_('&Match'), QDialogButtonBox.ActionRole) self.match_btn.clicked.connect(self.match) box.addWidget(buttons) # signal handlers self.rev_combo.editTextChanged.connect(self.update_info) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle(_('Find matches - %s') % self.repo.displayname) self.setWindowIcon(qtlib.geticon('hg-update')) # prepare to show self.update_info() if not self.match_btn.isEnabled(): self.rev_combo.lineEdit().selectAll() # need to change rev # expand options if a hidden one is checked hiddenOptionsChecked = self.hiddenSettingIsChecked() self.show_options(hiddenOptionsChecked) expander.set_expanded(hiddenOptionsChecked)
def __init__(self, args=None, opts={}, parent=None): super(CloneDialog, self).__init__(parent) f = self.windowFlags() self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint) self.ui = ui.ui() self.ret = None dest = src = cwd = os.getcwd() if len(args) > 1: src = args[0] dest = args[1] elif len(args): src = args[0] udest = hglib.tounicode(dest) usrc = hglib.tounicode(src) ucwd = hglib.tounicode(cwd) self.prev_dest = None # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid grid = QGridLayout() grid.setSpacing(6) box.addLayout(grid) ### source combo and button self.src_combo = QComboBox() self.src_combo.setEditable(True) self.src_combo.setMinimumWidth(310) self.src_btn = QPushButton(_('Browse...')) self.src_btn.setAutoDefault(False) self.src_btn.clicked.connect(self.browse_src) grid.addWidget(QLabel(_('Source:')), 0, 0) grid.addWidget(self.src_combo, 0, 1) grid.addWidget(self.src_btn, 0, 2) ### destination combo and button self.dest_combo = QComboBox() self.dest_combo.setEditable(True) self.dest_combo.setMinimumWidth(310) self.dest_btn = QPushButton(_('Browse...')) self.dest_btn.setAutoDefault(False) self.dest_btn.clicked.connect(self.browse_dest) grid.addWidget(QLabel(_('Destination:')), 1, 0) grid.addWidget(self.dest_combo, 1, 1) grid.addWidget(self.dest_btn, 1, 2) # workaround for QComboBox to test edited text case-sensitively # see src/gui/widgets/qcombobox.cpp: # QComboBoxPrivate::_q_editingFinished() and matchFlags() for name in ('src_combo', 'dest_combo'): w = getattr(self, name).lineEdit() w.completer().setCaseSensitivity(Qt.CaseSensitive) s = QSettings() self.shist = s.value('clone/source').toStringList() for path in self.shist: if path: self.src_combo.addItem(path) self.src_combo.setEditText(usrc) self.dhist = s.value('clone/dest').toStringList() for path in self.dhist: if path: self.dest_combo.addItem(path) self.dest_combo.setEditText(udest) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.show_options) grid.addWidget(expander, 2, 0, Qt.AlignLeft | Qt.AlignTop) optbox = QVBoxLayout() optbox.setSpacing(6) grid.addLayout(optbox, 2, 1, 1, 2) def chktext(chklabel, btnlabel=None, btnslot=None, stretch=None): hbox = QHBoxLayout() hbox.setSpacing(0) optbox.addLayout(hbox) chk = QCheckBox(chklabel) text = QLineEdit(enabled=False) hbox.addWidget(chk) hbox.addWidget(text) if stretch is not None: hbox.addStretch(stretch) if btnlabel: btn = QPushButton(btnlabel) btn.setEnabled(False) btn.setAutoDefault(False) btn.clicked.connect(btnslot) hbox.addSpacing(6) hbox.addWidget(btn) chk.toggled.connect( lambda e: self.toggle_enabled(e, text, target2=btn)) return chk, text, btn else: chk.toggled.connect(lambda e: self.toggle_enabled(e, text)) return chk, text self.rev_chk, self.rev_text = chktext(_('Clone to revision:'), stretch=40) self.noupdate_chk = QCheckBox( _('Do not update the new working directory')) self.pproto_chk = QCheckBox(_('Use pull protocol to copy metadata')) self.uncomp_chk = QCheckBox(_('Use uncompressed transfer')) optbox.addWidget(self.noupdate_chk) optbox.addWidget(self.pproto_chk) optbox.addWidget(self.uncomp_chk) self.qclone_chk, self.qclone_txt, self.qclone_btn = \ chktext(_('Include patch queue'), btnlabel=_('Browse...'), btnslot=self.onBrowseQclone) self.proxy_chk = QCheckBox(_('Use proxy server')) optbox.addWidget(self.proxy_chk) useproxy = bool(self.ui.config('http_proxy', 'host')) self.proxy_chk.setEnabled(useproxy) self.proxy_chk.setChecked(useproxy) self.insecure_chk = QCheckBox(_('Do not verify host certificate')) optbox.addWidget(self.insecure_chk) self.insecure_chk.setEnabled(False) self.remote_chk, self.remote_text = chktext(_('Remote command:')) # allow to specify start revision for p4 & svn repos. self.startrev_chk, self.startrev_text = chktext(_('Start revision:'), stretch=40) self.hmcmd_lbl = QLabel(_('Hg command:')) self.hmcmd_lbl.setAlignment(Qt.AlignRight) self.hmcmd_txt = QLineEdit() self.hmcmd_txt.setReadOnly(True) grid.addWidget(self.hmcmd_lbl, 3, 0) grid.addWidget(self.hmcmd_txt, 3, 1) self.hmcmd_txt.setMinimumWidth(400) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandFinished.connect(self.cmdfinished) self.cmd.commandCanceling.connect(self.command_canceling) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cmd.cancel) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.onCloseClicked) self.close_btn.setAutoDefault(False) self.clone_btn = buttons.addButton(_('&Clone'), QDialogButtonBox.ActionRole) self.clone_btn.clicked.connect(self.clone) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) box.addWidget(buttons) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle(_('Clone - %s') % ucwd) self.setWindowIcon(qtlib.geticon('hg-clone')) # connect extra signals self.src_combo.editTextChanged.connect(self.composeCommand) self.src_combo.editTextChanged.connect(self.onUrlHttps) self.src_combo.editTextChanged.connect(self.onResetDefault) self.src_combo.currentIndexChanged.connect(self.onResetDefault) self.dest_combo.editTextChanged.connect(self.composeCommand) self.rev_chk.toggled.connect(self.composeCommand) self.rev_text.textChanged.connect(self.composeCommand) self.noupdate_chk.toggled.connect(self.composeCommand) self.pproto_chk.toggled.connect(self.composeCommand) self.uncomp_chk.toggled.connect(self.composeCommand) self.qclone_chk.toggled.connect(self.composeCommand) self.qclone_txt.textChanged.connect(self.composeCommand) self.proxy_chk.toggled.connect(self.composeCommand) self.insecure_chk.toggled.connect(self.composeCommand) self.remote_chk.toggled.connect(self.composeCommand) self.remote_text.textChanged.connect(self.composeCommand) self.startrev_chk.toggled.connect(self.composeCommand) # prepare to show self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.show_options(False) rev = opts.get('rev') if rev: self.rev_chk.setChecked(True) self.rev_text.setText(hglib.tounicode(', '.join(rev))) self.noupdate_chk.setChecked(bool(opts.get('noupdate'))) self.pproto_chk.setChecked(bool(opts.get('pull'))) self.uncomp_chk.setChecked(bool(opts.get('uncompressed'))) self.src_combo.setFocus() self.src_combo.lineEdit().selectAll() self.composeCommand()
def __init__(self, repoagent, rev=None, parent=None, opts={}): super(StripDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.setWindowIcon(qtlib.geticon('menudelete')) self._repoagent = repoagent # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = grid = QGridLayout() grid.setSpacing(6) box.addLayout(grid) ### target revision combo self.rev_combo = combo = QComboBox() combo.setEditable(True) grid.addWidget(QLabel(_('Strip:')), 0, 0) grid.addWidget(combo, 0, 1) grid.addWidget(QLabel(_('Preview:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) self.status = QLabel("") grid.addWidget(self.status, 1, 1, Qt.AlignLeft | Qt.AlignTop) if rev is None: rev = self.repo.dirstate.branch() else: rev = str(rev) combo.addItem(hglib.tounicode(rev)) combo.setCurrentIndex(0) for name in self.repo.namedbranches: combo.addItem(name) tags = list(self.repo.tags()) tags.sort(reverse=True) for tag in tags: combo.addItem(hglib.tounicode(tag)) ### preview box, contained in scroll area, contains preview grid self.cslist = cslist.ChangesetList(self.repo) cslistrow = 2 cslistcol = 1 grid.addWidget(self.cslist, cslistrow, cslistcol) ### options optbox = QVBoxLayout() optbox.setSpacing(6) expander = qtlib.ExpanderLabel(_('Options:'), False) expander.expanded.connect(self.show_options) grid.addWidget(expander, 3, 0, Qt.AlignLeft | Qt.AlignTop) grid.addLayout(optbox, 3, 1) self.discard_chk = QCheckBox( _('Discard local changes, no backup ' '(-f/--force)')) self.nobackup_chk = QCheckBox(_('No backup (-n/--nobackup)')) optbox.addWidget(self.discard_chk) optbox.addWidget(self.nobackup_chk) self.discard_chk.setChecked(bool(opts.get('force'))) self.nobackup_chk.setChecked(bool(opts.get('nobackup'))) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cancel_clicked) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.strip_btn = buttons.addButton(_('&Strip'), QDialogButtonBox.ActionRole) self.strip_btn.clicked.connect(self.strip) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) grid.setRowStretch(cslistrow, 1) grid.setColumnStretch(cslistcol, 1) box.addWidget(buttons) # signal handlers self.rev_combo.editTextChanged.connect(lambda *a: self.preview()) self.rev_combo.lineEdit().returnPressed.connect(self.strip) self.discard_chk.toggled.connect(lambda *a: self.preview()) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetMinAndMaxSize) self.setWindowTitle(_('Strip - %s') % self.repo.displayname) #self.setWindowIcon(qtlib.geticon('strip')) # prepare to show self.rev_combo.lineEdit().selectAll() self.cslist.setHidden(False) self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.nobackup_chk.setHidden(True) self.preview()
def initializePage(self): if self.layout(): return self.setTitle(_('Prepare to merge')) self.setSubTitle( _('Verify merge targets and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) repo = self.repo contents = ('ishead', ) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head revision!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) ## merge target other_sep = qtlib.LabeledSeparator(_('Merge from (other revision)')) self.layout().addWidget(other_sep) try: otherCsInfo = create(self.wizard().otherrev) self.layout().addWidget(otherCsInfo) self.otherCsInfo = otherCsInfo except error.RepoLookupError: qtlib.InfoMsgBox(_('Unable to merge'), _('Merge revision not specified or not found')) QTimer.singleShot(0, self.wizard().close) ## current revision local_sep = qtlib.LabeledSeparator(_('Merge to (working directory)')) self.layout().addWidget(local_sep) localCsInfo = create(self.wizard().localrev) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## working directory status wd_sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(wd_sep) self.groups = qtlib.WidgetGroups() wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) wd_merged = QLabel( _('The working directory is already <b>merged</b>. ' '<a href="skip"><b>Continue</b></a> or ' '<a href="discard"><b>discard</b></a> existing ' 'merge.')) wd_merged.linkActivated.connect(self.onLinkActivated) wd_merged.setWordWrap(True) self.groups.add(wd_merged, 'merged') self.layout().addWidget(wd_merged) text = _( 'Before merging, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self.onLinkActivated) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) wd_alt = QLabel(_('Or use:')) self.groups.add(wd_alt, 'dirty') wdbox.addWidget(wd_alt) force_chk = QCheckBox( _('Force a merge with outstanding changes ' '(-f/--force)')) force_chk.toggled.connect(lambda c: self.completeChanged.emit()) self.registerField('force', force_chk) self.groups.add(force_chk, 'dirty') wdbox.addWidget(force_chk) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.toggleShowOptions) self.layout().addWidget(expander) self.expander = expander ### discard option discard_chk = QCheckBox( _('Discard all changes from merge target ' '(other) revision')) self.registerField('discard', discard_chk) self.layout().addWidget(discard_chk) self.discard_chk = discard_chk ## auto-resolve autoresolve_chk = QCheckBox( _('Automatically resolve merge conflicts ' 'where possible')) autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.autoresolve_chk = autoresolve_chk self.groups.set_visible(False, 'dirty') self.groups.set_visible(False, 'merged') self.toggleShowOptions(self.expander.is_expanded())
def __init__(self, repo, rev, parent=None): super(SignDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.repo = repo self.rev = rev # base layout box base = QVBoxLayout() base.setSpacing(0) base.setContentsMargins(*(0, ) * 4) base.setSizeConstraint(QLayout.SetFixedSize) self.setLayout(base) box = QVBoxLayout() box.setSpacing(8) box.setContentsMargins(*(8, ) * 4) self.layout().addLayout(box) ## main layout grid form = QFormLayout(fieldGrowthPolicy=QFormLayout.AllNonFixedFieldsGrow) box.addLayout(form) form.addRow(_('Revision:'), QLabel('%d (%s)' % (rev, repo[rev]))) ### key line edit key = repo.ui.config("gpg", "key", None) self.keyLineEdit = QLineEdit() if key: self.keyLineEdit.setText(key) form.addRow(_('Key:'), self.keyLineEdit) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.show_options) box.addWidget(expander) optbox = QVBoxLayout() optbox.setSpacing(6) box.addLayout(optbox) hbox = QHBoxLayout() hbox.setSpacing(0) optbox.addLayout(hbox) self.localCheckBox = QCheckBox(_('Local sign')) self.localCheckBox.toggled.connect(self.updateStates) optbox.addWidget(self.localCheckBox) self.replaceCheckBox = QCheckBox( _('Sign even if the sigfile is ' 'modified (-f/--force)')) self.replaceCheckBox.toggled.connect(self.updateStates) optbox.addWidget(self.replaceCheckBox) self.nocommitCheckBox = QCheckBox(_('No commit')) self.nocommitCheckBox.toggled.connect(self.updateStates) optbox.addWidget(self.nocommitCheckBox) self.customCheckBox = QCheckBox(_('Use custom commit message:')) self.customCheckBox.toggled.connect(self.customMessageToggle) optbox.addWidget(self.customCheckBox) self.customTextLineEdit = QLineEdit() optbox.addWidget(self.customTextLineEdit) ## bottom buttons BB = QDialogButtonBox bbox = QDialogButtonBox() self.signBtn = bbox.addButton(_('&Sign'), BB.ActionRole) bbox.addButton(BB.Close) bbox.rejected.connect(self.reject) box.addWidget(bbox) self.signBtn.clicked.connect(self.onSign) ## horizontal separator self.sep = QFrame() self.sep.setFrameShadow(QFrame.Sunken) self.sep.setFrameShape(QFrame.HLine) self.layout().addWidget(self.sep) ## status line self.status = qtlib.StatusLabel() self.status.setContentsMargins(4, 2, 4, 4) self.layout().addWidget(self.status) self.cmd = cmdui.Runner(False, self) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.commandFinished.connect(self.commandFinished) # prepare to show self.setWindowTitle(_('Sign - %s') % repo.displayname) self.setWindowIcon(qtlib.geticon('hg-sign')) self.clear_status() self.show_options(False) self.customMessageToggle(False) self.keyLineEdit.setFocus()