Mercurial and Git clients can push and pull from this alias URL to interact with this repository. You can change to which repository an alias points by going to the Aliases link on the project page.
commit: add a details dialog for username and date options
More work remains to be done: * Load opts['user'] and opts['date'] when in qref mode * Clear those two fields when leaving qref mode * Add QNew to the dialog * Cleanup the layout
# commit.py - TortoiseHg's commit widget and standalone dialog## Copyright 2010 Steve Borho <steve@borho.org>## This software may be used and distributed according to the terms of the# GNU General Public License version 2, incorporated herein by reference.importosfrommercurialimporthg,ui,cmdutil,util,dispatch,errorfrommercurial.nodeimportshortasshort_hexfromPyQt4.QtCoreimport*fromPyQt4.QtGuiimport*fromtortoisehg.hgqt.i18nimport_fromtortoisehg.utilimporthglib,shlib,pathsfromtortoisehg.util.utilimportformat_descfromtortoisehg.hgqtimportqtlib,status,cmdui,branchop# Technical Debt for CommitWidget# threaded / wrapped commit (need a CmdRunner equivalent)# qtlib decode failure dialog (ask for retry locale, suggest HGENCODING)# Need a unicode-to-UTF8 function# +1 / -1 head indication (not as important with workbench integration)# pushafterci list# qnew/shelve-patch creation dialog (in another file)# spell check / tab completion# in-memory patching / committing chunk selected filesclassCommitWidget(QWidget):'A widget that encompasses a StatusWidget and commit extras'loadBegin=pyqtSignal()loadComplete=pyqtSignal()commitButtonName=pyqtSignal(str)showMessage=pyqtSignal(str)commitComplete=pyqtSignal()def__init__(self,pats,opts,root=None,parent=None):QWidget.__init__(self,parent)self.opts=opts# user, dateself.stwidget=status.StatusWidget(pats,opts,root,self)self.stwidget.showMessage.connect(self.showMessage)self.stwidget.loadBegin.connect(lambda:self.loadBegin.emit())self.stwidget.loadComplete.connect(lambda:self.loadComplete.emit())self.msghistory=[]self.qref=Falselayout=QVBoxLayout()layout.setContentsMargins(0,0,0,0)layout.addWidget(self.stwidget)self.setLayout(layout)vbox=QVBoxLayout()vbox.setMargin(0)vbox.setContentsMargins(*(0,)*4)hbox=QHBoxLayout()hbox.setMargin(0)hbox.setContentsMargins(*(0,)*4)branchbutton=QPushButton(_('Branch: '))branchbutton.pressed.connect(self.branchOp)self.branchbutton=branchbuttonself.branchop=Nonehbox.addWidget(branchbutton)self.buttonHBox=hboxmsgcombo=MessageHistoryCombo()self.connect(msgcombo,SIGNAL('activated(int)'),self.msgSelected)hbox.addWidget(msgcombo,1) hbox.addSpacing(2)
vbox.addLayout(hbox, 0)
+ self.detailsbutton = QPushButton(_('Details'))+ self.detailsbutton.pressed.connect(self.details)+ self.buttonHBox.addWidget(self.detailsbutton)+ self.parentvbox = QVBoxLayout()
self.parentlabels = [QLabel('<b>Parent:</b>')]
self.parentvbox.addWidget(self.parentlabels[0])
vbox.addLayout(self.parentvbox, 0)
- # TODO: move to details widget- usercombo = QComboBox()- usercombo.setEditable(True)- msgte = QPlainTextEdit()
msgte.setLineWrapMode(QPlainTextEdit.NoWrap)
msgfont = qtlib.getfont(self.stwidget.repo.ui, 'fontcomment')
msgte.setFont(msgfont.font())msgfont.changed.connect(lambdafnt:msgte.setFont(fnt))msgte.textChanged.connect(self.msgChanged)msgte.setContextMenuPolicy(Qt.CustomContextMenu)msgte.customContextMenuRequested.connect(self.menuRequested)vbox.addWidget(msgte,1)upperframe=QFrame()SP=QSizePolicysp=SP(SP.Expanding,SP.Expanding)sp.setHorizontalStretch(1)upperframe.setSizePolicy(sp)upperframe.setLayout(vbox)self.split=QSplitter(Qt.Vertical)sp=SP(SP.Expanding,SP.Expanding)sp.setHorizontalStretch(1)sp.setVerticalStretch(0)self.split.setSizePolicy(sp)# Add our widgets to the top of our splitterself.split.addWidget(upperframe)# Add status widget document frame below our splitter# this reparents the docf from the status splitterself.split.addWidget(self.stwidget.docf)# add our splitter where the docf used to be self.stwidget.split.addWidget(self.split)
msgte.setFocus()
# Yuki's Mockup: http://bitbucket.org/kuy/thg-qt/wiki/Home
- self.usercombo = usercombo self.msgte = msgte
self.msgcombo = msgcombo
+ def details(self):+ dlg = DetailsDialog(self.opts, self.userhist, self)+ if dlg.exec_() == QDialog.Accepted:+ self.opts.update(dlg.outopts)+ def reload(self):
repo = self.stwidget.repo
repo.thginvalidate()
wctx=repo[None]# Update qrefresh modeifrepo.changectx('.').thgmqappliedpatch():self.commitButtonName.emit(_('QRefresh'))ifnotself.qref:self.initQRefreshMode()else:self.commitButtonName.emit(_('Commit'))ifself.qref:self.endQRefreshMode()# Update message listself.msgcombo.reset(self.msghistory)# Update branch operation buttoncur=hglib.tounicode(wctx.branch())ifself.branchopisNone:title=_('Branch: ')+curelifself.branchop==False:title=_('Close Branch: ')+curelse:title=_('New Branch: ')+self.branchopself.branchbutton.setText(title)# Update parent revision(s)fori,ctxinenumerate(repo.parents()):desc=format_desc(ctx.description(),80)fmt="<span style='font-family:Courier'>%s(%s)</span> %s"ptext=fmt%(ctx.rev(),short_hex(ctx.node()),desc)ptext=_('<b>Parent: </b>')+ptextifi>len(self.parentlabels):lbl=QLabel(ptext)#lbl.minimumSizeHint = lambda: QSize(0, 0)self.parentvbox.addWidget(lbl)self.parentlabels.append(lbl)else:self.parentlabels[i].setText(ptext)whilelen(repo.parents())>len(self.parentlabels):w=self.parentlabels.pop()self.parentvbox.removeWidget(w)# Trigger reload of working contextself.stwidget.refreshWctx()definitQRefreshMode(self):'Working parent is a patch. Is it refreshable?'repo=self.stwidget.repoifrepo['qtip']!=repo['.']:self.showMessage.emit(_('Cannot refresh non-tip patch'))self.commitButtonName.emit(_('N/A'))returnself.msgte.setPlainText(hglib.tounicode(repo['qtip'].description()))self.msgte.document().setModified(False)self.msgte.moveCursor(QTextCursor.End)self.qref=TruedefendQRefreshMode(self):self.msgte.clear()self.qref=FalsedefmsgChanged(self):text=self.msgte.toPlainText()self.buttonHBox.setEnabled(nottext.isEmpty())sumlen,maxlen=self.getLengths()ifnotsumlenandnotmaxlen:self.msgte.setExtraSelections([])returnpos,nextpos=0,0sels=[]fori,lineinenumerate(text.split('\n')):length=len(line)pos=nextposnextpos+=length+1# include \nifi==0:iflength<sumlenornotsumlen:continuepos+=sumlenelifi==1:iflength==0ornotsumlen:continueelse:iflength<maxlenornotmaxlen:continuepos+=maxlensel=QTextEdit.ExtraSelection()sel._bgcolor=QColor('LightSalmon')sel._fgcolor=QColor('Black')sel.format.setBackground(sel._bgcolor)sel.format.setForeground(sel._fgcolor)sel.cursor=QTextCursor(self.msgte.document())sel.cursor.setPosition(pos)sel.cursor.movePosition(QTextCursor.EndOfLine,QTextCursor.KeepAnchor)sels.append(sel)self.msgte.setExtraSelections(sels)defmsgReflow(self):'User pressed Control-E, reflow current paragraph'ifQApplication.focusWidget()!=self.msgte:returnself.reflowBlock(self.msgte.textCursor().block())defreflowBlock(self,block):sumlen,maxlen=self.getLengths()ifnotmaxlen:return# In QtTextDocument land, a block is a sequence of text ending# in (and including) a carriage return. Aka, a line of text.whileblock.length()andblock.previous().length()>1:block=block.previous()begin=block.position()whileblock.length()andblock.next().length()>1:block=block.next()end=block.position()+block.length()-1# select the contiguous lines of text under the cursorcursor=self.msgte.textCursor()cursor.setPosition(begin,QTextCursor.MoveAnchor)cursor.setPosition(end,QTextCursor.KeepAnchor)sentence=cursor.selection().toPlainText().simplified()parts=sentence.split(' ',QString.SkipEmptyParts)lines=QStringList()line=QStringList()partslen=0forpartinparts:ifpartslen+len(line)+len(part)+1>maxlen:ifline:lines.append(line.join(' '))line,partslen=QStringList(),0line.append(part)partslen+=len(part)ifline:lines.append(line.join(' '))reflow=lines.join('\n')# Replace selection with new sentencecursor.insertText(reflow)returncursor.block()defmenuRequested(self,point):cursor=self.msgte.cursorForPosition(point)point=self.msgte.mapToGlobal(point)defapply():sumlen,maxlen=self.getLengths()ifnotmaxlen:returnblock=self.msgte.document().firstBlock()whileblock!=self.msgte.document().end():ifblock.length()>maxlen:block=self.reflowBlock(block)block=block.next()defpaste():files=self.stwidget.getChecked()cursor.insertText(', '.join(files))defsettings():fromtortoisehg.hgqt.settingsimportSettingsDialogdlg=SettingsDialog(True,focus='tortoisehg.summarylen')ifdlg.exec_()==QDialog.Accepted:repo=self.stwidget.reporepo.ui=hglib.reloadui(repo.root)self.msgChanged()menu=self.msgte.createStandardContextMenu()forname,funcin[(_('Paste &Filenames'),paste),(_('App&ly Format'),apply),(_('C&onfigure Format'),settings)]:action=menu.addAction(name)action.wrapper=lambdaf=func:f()self.connect(action,SIGNAL('triggered()'),action.wrapper)returnmenu.exec_(point)defgetLengths(self):repo=self.stwidget.repotry:sumlen=int(repo.ui.config('tortoisehg','summarylen',0))maxlen=int(repo.ui.config('tortoisehg','messagewrap',0))except(TypeError,ValueError):sumlen,maxlen=0,0returnsumlen,maxlendefrestoreState(self,data):returnself.stwidget.restoreState(data)defsaveState(self):returnself.stwidget.saveState()defbranchOp(self):d=branchop.BranchOpDialog(self.stwidget.repo,self.branchop)ifd.exec_()==QDialog.Accepted:self.branchop=d.branchopself.reload()defcanUndo(self):'Returns undo description or None if not valid'repo=self.stwidget.repoifos.path.exists(repo.sjoin('undo')):try:args=repo.opener('undo.desc','r').read().splitlines()ifargs[1]!='commit':returnNonereturn_('Rollback commit to revision %d')%(int(args[0])-1)except(IOError,IndexError,ValueError):passreturnNonedefrollback(self):msg=self.canUndo()ifnotmsg:returnd=QMessageBox.question(self,_('Confirm Undo'),msg,QMessageBox.Ok|QMessageBox.Cancel)ifd!=QMessageBox.Ok:returnrepo=self.stwidget.reporepo.rollback()repo.thginvalidate()self.reload()QTimer.singleShot(500,lambda:shlib.shell_notify([repo.root]))defgetMessage(self):text=self.msgte.toPlainText()try:text=hglib.fromunicode(text,'strict')exceptUnicodeEncodeError:pass# TODOreturntextdefmsgSelected(self,index):doc=self.msgte.document()ifnotdoc.isEmpty()anddoc.isModified():d=QMessageBox.question(self,_('Confirm Discard Message'),_('Discard current commit message?'),QMessageBox.Ok|QMessageBox.Cancel)ifd!=QMessageBox.Ok:returnself.msgte.setPlainText(self.msghistory[index])self.msgte.document().setModified(False)self.msgte.moveCursor(QTextCursor.End)self.msgte.setFocus()defcanExit(self):# Usually safe to exit, since we're saving messages implicitly# We'll ask the user for confirmation later, if they have any# files partially selected.returnTruedefloadConfigs(self,s):'Load history, etc, from QSettings instance'repo=self.stwidget.reporepoid=str(repo[0])# message history is stored in unicodeself.split.restoreState(s.value('commit/split').toByteArray())self.msghistory=list(s.value('commit/history-'+repoid).toStringList())self.msghistory=[mforminself.msghistoryifm] self.msgcombo.reset(self.msghistory)
self.userhist = s.value('commit/userhist').toStringList()
self.userhist = [u for u in self.userhist if u]
- self.refreshUserList() try:
curmsg = repo.opener('cur-message.txt').read()
self.msgte.setPlainText(hglib.tounicode(curmsg))
self.msgte.document().setModified(False)self.msgte.moveCursor(QTextCursor.End)exceptEnvironmentError:passdefstoreConfigs(self,s):'Save history, etc, in QSettings instance'repo=self.stwidget.reporepoid=str(repo[0])s.setValue('commit/history-'+repoid,self.msghistory)s.setValue('commit/split',self.split.saveState())s.setValue('commit/userhist',self.userhist)try:# current message is stored in local encodingrepo.opener('cur-message.txt','w').write(self.getMessage())exceptEnvironmentError:passdefaddMessageToHistory(self):umsg=self.msgte.toPlainText()ifnotumsg:returnifumsginself.msghistory:self.msghistory.remove(umsg) self.msghistory.insert(0, umsg)
self.msghistory = self.msghistory[:10]
- def refreshUserList(self):- self.usercombo.clear()- l = []- try:- repo = self.stwidget.repo- wctx = repo[None]- if self.opts.get('user'):- val = hglib.tounicode(self.opts['user'])- l.append(val)- val = hglib.tounicode(wctx.user())- l.append(val)- except util.Abort:- pass- for name in self.userhist:- if name not in l:- l.append(name)- for name in l:- self.usercombo.addItem(name)- def addUsernameToHistory(self, user):
if user in self.userhist:
self.userhist.remove(user)
self.userhist.insert(0, user)
self.userhist = self.userhist[:10]
- self.refreshUserList()++ def getCurrentUsername(self):+ # 1. Override has highest priority+ user = self.opts.get('user')+ if user:+ return user++ # 2. Read from repository+ try:+ return self.stwidget.repo.ui.username()+ except error.Abort:+ pass++ # 3. Get a username from the user+ QMessageBox.information(self, _('Please enter a username'),+ _('You must identify yourself to Mercurial'),+ QMessageBox.Ok)+ from tortoisehg.hgqt.settings import SettingsDialog+ dlg = SettingsDialog(False, focus='ui.username')+ dlg.exec_()+ self.stwidget.repo.ui.invalidateui()+ try:+ return self.stwidget.repo.ui.username()+ except error.Abort:+ return None def commit(self):
repo = self.stwidget.repo
ui=repo.uicwd=os.getcwd()try:os.chdir(repo.root)returnself._commit(repo,ui)finally:os.chdir(cwd)def_commit(self,repo,_ui):msg=self.getMessage()ifnotmsg:qtlib.WarningMsgBox(_('Nothing Commited'),_('Please enter commit message'),parent=self)self.msgte.setFocus()returnrepo=self.stwidget.repoifself.branchopisNone:brcmd=[]elifself.branchop==False:brcmd=['--close-branch']else:brcmd=[]# TODO: Need a unicode-to-UTF8 functionnewbranch=hglib.fromunicode(self.branchop)ifnewbranchinrepo.branchtags():# response: 0=Yes, 1=No, 2=Cancelpb=[p.branch()forpinrepo.parents()]ifself.nextbranchinpb:resp=0else:rev=repo[newbranch].rev()resp=qtlib.CustomPrompt(_('Confirm Branch Change'),_('Named branch "%s" already exists, ''last used in revision %d\n''Yes\t- Make commit restarting this named branch\n''No\t- Make commit without changing branch\n''Cancel\t- Cancel this commit')%(newbranch,rev),self,(_('&Yes'),_('&No'),_('Cancel')),2,2).run()else:resp=qtlib.CustomPrompt(_('Confirm New Branch'),_('Create new named branch "%s" with this commit?\n''Yes\t- Start new branch with this commit\n''No\t- Make commit without branch change\n''Cancel\t- Cancel this commit')%newbranch,self,(_('&Yes'),_('&No'),_('Cancel')),2,2).run()ifresp==0:repo.dirstate.setbranch(newbranch)elifresp==2:returnfiles=self.stwidget.getChecked('MAR?!S')ifnot(filesorbrcmdorrepo[None].branch()!=repo['.'].branch() \
orself.qref):qtlib.WarningMsgBox(_('No files checked'),_('No modified files checkmarked for commit'),parent=self)self.stwidget.tv.setFocus() return
if len(repo.parents()) > 1:
files = []
- user = self.usercombo.currentText()
++ user = self.getCurrentUsername()
+ if not user:+ return self.addUsernameToHistory(user)
- user = hglib.fromunicode(user, 'strict')- if not user:- try:- QMessageBox.information(self, _('Please enter a username'),- _('You must identify yourself to Mercurial'),- QMessageBox.Ok)- from tortoisehg.hgqt.settings import SettingsDialog- dlg = SettingsDialog(False, focus='ui.username')- dlg.exec_()- user = ui.ui().username()- if user:- self.usercombo.addItem(hglib.tounicode(user))- except util.Abort:- pass- if not user:- self.usercombo.setFocus()- return+ checkedUnknowns = self.stwidget.getChecked('?I')
if checkedUnknowns:
res = qtlib.CustomPrompt(
_('Confirm Add'),_('Add checked untracked files?'),self,(_('&OK'),_('Cancel')),0,1,checkedUnknowns).run()ifres==0:dispatch._dispatch(_ui,['add']+checkedUnknowns)else:returncheckedMissing=self.stwidget.getChecked('!')ifcheckedMissing:res=qtlib.CustomPrompt(_('Confirm Remove'),_('Remove checked deleted files?'),self,(_('&OK'),_('Cancel')),0,1,checkedMissing).run()ifres==0:dispatch._dispatch(_ui,['remove']+checkedMissing)else:returntry:date=self.opts.get('date')ifdate:util.parsedate(date)dcmd=['--date',date]else:dcmd=[]excepterror.Abort,e:self.showMessage.emit(hglib.tounicode(str(e)))dcmd=[]cmdline=['commit','--user',user,'--message',msg]cmdline+=dcmd+brcmd+filesifself.qref:cmdline[0]='qrefresh'forfnameinrepo.ui.config('tortoisehg','autoinc','').split(','):fname=fname.strip()iffname:cmdline.extend(['--include',fname])ret=dispatch._dispatch(_ui,cmdline)ifnotret:self.addMessageToHistory()ifnotself.qref:self.msgte.clear()self.msgte.document().setModified(False)self.commitComplete.emit()returnTrueelse:returnFalsedefkeyPressEvent(self,event):ifevent.key()in(Qt.Key_Return,Qt.Key_Enter):ifevent.modifiers()==Qt.ControlModifier:self.commit()returnifevent.modifiers()==Qt.ControlModifierandevent.key()==Qt.Key_E:self.msgReflow()returnsuper(CommitWidget,self).keyPressEvent(event)classMessageHistoryCombo(QComboBox):def__init__(self,parent=None):QComboBox.__init__(self,parent)self.reset([])defreset(self,msgs):self.clear()self.addItem(_('Recent commit messages...'))self.loaded=Falseself.msgs=msgsdefshowPopup(self):ifnotself.loaded:self.clear()forsinself.msgs:self.addItem(s.split('\n',1)[0][:70]) self.loaded = True
QComboBox.showPopup(self)
++class DetailsDialog(QDialog):+ 'Utility dialog for configuring uncommon settings'+ def __init__(self, opts, userhistory, parent):+ QDialog.__init__(self, parent)+ self.repo = parent.stwidget.repo++ layout = QVBoxLayout()+ self.setLayout(layout)++ hbox = QHBoxLayout()+ self.usercb = QCheckBox(_('Set username:'))++ usercombo = QComboBox()+ usercombo.setEditable(True)+ usercombo.setEnabled(False)+ self.usercb.toggled.connect(usercombo.setEnabled)++ l = []+ if opts.get('user'):+ val = hglib.tounicode(self.opts['user'])+ self.usercb.setChecked(True)+ l.append(val)+ try:+ val = hglib.tounicode(self.repo.ui.username())+ l.append(val)+ except util.Abort:+ pass+ for name in userhistory:+ if name not in l:+ l.append(name)+ for name in l:+ usercombo.addItem(name)+ self.usercombo = usercombo++ usersaverepo = QPushButton(_('Save in Repo'))+ usersaverepo.clicked.connect(self.saveInRepo)+ usersaverepo.setEnabled(False)+ self.usercb.toggled.connect(usersaverepo.setEnabled)++ usersaveglobal = QPushButton(_('Save Global'))+ usersaveglobal.clicked.connect(self.saveGlobal)+ usersaveglobal.setEnabled(False)+ self.usercb.toggled.connect(usersaveglobal.setEnabled)++ hbox.addWidget(self.usercb)+ hbox.addWidget(self.usercombo)+ hbox.addWidget(usersaverepo)+ hbox.addWidget(usersaveglobal)+ layout.addLayout(hbox)++ hbox = QHBoxLayout()+ self.datecb = QCheckBox(_('Set Date:'))+ self.datele = QLineEdit()+ self.datele.setEnabled(False)+ self.datecb.toggled.connect(self.datele.setEnabled)+ curdate = QPushButton(_('Update'))+ curdate.setEnabled(False)+ self.datecb.toggled.connect(curdate.setEnabled)+ curdate.clicked.connect( lambda: self.datele.setText(+ hglib.tounicode(hglib.utctime(util.makedate()))))+ if opts.get('date'):+ self.datele.setText(opts['date'])+ self.datecb.setChecked(True)+ else:+ self.datecb.setChecked(False)+ curdate.clicked.emit(True)++ hbox.addWidget(self.datecb)+ hbox.addWidget(self.datele)+ hbox.addWidget(curdate)+ layout.addLayout(hbox)++ if 'mq' in self.repo.extensions():+ hbox = QHBoxLayout()++ BB = QDialogButtonBox+ bb = QDialogButtonBox(BB.Ok|BB.Cancel)+ self.connect(bb, SIGNAL("accepted()"), self, SLOT("accept()"))+ self.connect(bb, SIGNAL("rejected()"), self, SLOT("reject()"))+ self.bb = bb+ layout.addWidget(bb)++ name = hglib.get_reponame(self.repo)+ self.setWindowTitle('%s - commit details' % name)++ def saveInRepo(self):+ fn = os.path.join(self.repo.root, '.hg', 'hgrc')+ self.saveToPath([fn])++ def saveGlobal(self):+ self.saveToPath(util.user_rcpath())++ def saveToPath(self, path):+ from tortoisehg.hgqt.sync import loadIniFile+ fn, cfg = loadIniFile(path, self)+ if not hasattr(cfg, 'write'):+ qtlib.WarningMsgBox(_('Unable to save post pull operation'),+ _('Iniparse must be installed.'), parent=self)+ return+ if fn is None:+ return+ try:+ user = hglib.fromunicode(self.usercombo.currentText())+ if user:+ cfg.set('ui', 'username', user)+ else:+ try:+ del cfg['ui']['username']+ except KeyError:+ pass+ wconfig.writefile(cfg, fn)+ except IOError, e:+ qtlib.WarningMsgBox(_('Unable to write configuration file'),+ hglib.tounicode(e), parent=self)++ def accept(self):+ outopts = {}+ if self.datecb.isChecked():+ date = hglib.fromunicode(self.datele.text())+ try:+ util.parsedate(date)+ except error.Abort, e:+ qtlib.WarningMsgBox(_('Invalid date format'),+ hglib.tounicode(e), parent=self)+ return+ outopts['date'] = date+ else:+ outopts['date'] = ''++ if self.usercb.isChecked():+ user = hglib.fromunicode(self.usercombo.currentText())+ else:+ user = ''++ outopts['user'] = user+ if not user:+ try:+ self.repo.ui.username()+ except util.Abort, e:+ qtlib.WarningMsgBox(_('No username configured'),+ hglib.tounicode(e), parent=self)+ return++ self.outopts = outopts+ QDialog.accept(self)+# Technical Debt for standalone tool
# add a toolbar for refresh
# add a statusbar and simple progressbar
classCommitDialog(QDialog):'Standalone commit tool, a wrapper for CommitWidget'def__init__(self,pats,opts,parent=None):QDialog.__init__(self,parent)self.pats=patsself.opts=optslayout=QVBoxLayout()self.setLayout(layout) commit = CommitWidget(pats, opts, None, self)
layout.addWidget(commit, 1)
- layout.setContentsMargins(0, 6, 0, 0)- bbl = QHBoxLayout()- layout.addLayout(bbl)- layout.addSpacing(9) BB = QDialogButtonBox
bb = QDialogButtonBox(BB.Ok|BB.Cancel|BB.Discard)
self.connect(bb, SIGNAL("accepted()"), self, SLOT("accept()"))
self.connect(bb, SIGNAL("rejected()"), self, SLOT("reject()"))
bb.button(BB.Discard).setText('Undo')
bb.button(BB.Discard).clicked.connect(commit.rollback)
- bbl.addWidget(bb, alignment=Qt.AlignRight)- bbl.addSpacing(9)- self.bb = bb bb.button(BB.Cancel).setDefault(False)
bb.button(BB.Discard).setDefault(False)
bb.button(BB.Ok).setDefault(True)
+ layout.addWidget(bb)+ self.bb = bb s = QSettings()
commit.restoreState(s.value('commit/state').toByteArray())
self.restoreGeometry(s.value('commit/geom').toByteArray())commit.loadConfigs(s)commit.showMessage.connect(self.showMessage)commit.loadComplete.connect(self.updateUndo)commit.commitComplete.connect(self.postcommit)commit.commitButtonName.connect(self.setButtonName)name=hglib.get_reponame(commit.stwidget.repo)self.setWindowTitle('%s - commit'%name)self.commit=commitself.commit.reload()defsetButtonName(self,name):self.bb.button(QDialogButtonBox.Ok).setText(name)defupdateUndo(self):BB=QDialogButtonBoxundomsg=self.commit.canUndo()ifundomsg:self.bb.button(BB.Discard).setEnabled(True)self.bb.button(BB.Discard).setToolTip(undomsg)else:self.bb.button(BB.Discard).setEnabled(False)self.bb.button(BB.Discard).setToolTip('')defshowMessage(self,msg):printmsgdefkeyPressEvent(self,event):ifevent.key()==Qt.Key_Escape:self.reject()returnelifevent.matches(QKeySequence.Refresh):self.commit.reload()returnsuper(CommitDialog,self).keyPressEvent(event)defpostcommit(self):repo=self.commit.stwidget.repoifrepo.ui.configbool('tortoisehg','closeci'):self.reject()returnself.commit.reload()defaccept(self):self.commit.commit()defreject(self):ifself.commit.canExit():s=QSettings()s.setValue('commit/state',self.commit.saveState())s.setValue('commit/geom',self.saveGeometry())self.commit.storeConfigs(s)QDialog.reject(self)defrun(ui,*pats,**opts):returnCommitDialog(hglib.canonpaths(pats),opts)
Attach a Trello Card
Add a tag
Your session has expired
You are no longer logged in. Please log in and try your request again.
Filter RSS Feed
This RSS feed URL allows you to see the contents of your current filter using any feed reader.
This link includes a special authentication token. If you share the URL with anyone else, they can see this RSS feed's activity. You can disable these tokens when needed.
Your current filter is unsaved; changing it won't affect this RSS feed.