Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.9, 1.9.1, and 1.9.2

settings: use Qsci as an integrated editor

Disable nearly the whole dialog when the editor is active. Should we re-task
the bottom dialog buttons for Save/Cancel when the editor is visible?

Changeset f5d551d7d6ff

Parent 576ca1a79fa8

by Steve Borho

Changes to one file · Browse files at f5d551d7d6ff Showing diff from parent 576ca1a79fa8 Diff from another changeset...

 
16
17
18
 
19
20
21
 
 
22
23
24
25
26
27
28
 
455
456
457
 
 
458
459
 
 
460
461
 
 
462
463
464
 
474
475
476
 
477
478
479
 
517
518
519
520
 
521
522
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
523
524
525
 
543
544
545
 
 
546
547
548
 
566
567
568
569
 
570
571
572
 
16
17
18
19
20
21
22
23
24
25
26
 
 
27
28
29
 
456
457
458
459
460
461
462
463
464
465
 
466
467
468
469
470
 
480
481
482
483
484
485
486
 
524
525
526
 
527
528
 
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
 
615
616
617
618
619
620
621
622
 
640
641
642
 
643
644
645
646
@@ -16,13 +16,14 @@
 from tortoisehg.util import hglib, settings, paths  from tortoisehg.hgqt import qtlib   +from PyQt4 import Qsci  from PyQt4.QtCore import *  from PyQt4.QtGui import *   +qsci = Qsci.QsciScintilla +  # Technical Debt  # stacked widget or pages need to be scrollable -# hook up QSci as internal editor, enable ini syntax highlight -# initial focus not implemented  # add extensions page after THG 1.1 is released  # show icons in listview   @@ -455,10 +456,15 @@
  else:   combo.setEnabled(False)   self.confcombo = combo + self.editpage = None + self.editor = None     edit = QPushButton(_('Edit File')) + edit.clicked.connect(self.editClicked) + self.editbtn = edit   reload = QPushButton(_('Reload')) - reload.pressed.connect(self.reloadClicked) + reload.clicked.connect(self.reloadClicked) + self.reloadbtn = reload   tophbox.addWidget(combo)   tophbox.addWidget(edit)   tophbox.addWidget(reload) @@ -474,6 +480,7 @@
    self.pages = {}   self.stack = stack + self.pageList = pageList     s = QSettings()   self.settings = s @@ -517,9 +524,74 @@
  self.applyChanges()   self.refresh()   - def editClicked(self, button): + def editClicked(self):   'Open internal editor in stacked widget' - pass + if self.isDirty(): + ret = qtlib.CustomPrompt(_('Confirm Save'), + _('Save changes before edit?'), self, + (_('&Save'), _('&Discard'), _('&Cancel')), + default=2, esc=2).run() + if ret == 0: + self.applyChanges() + elif ret == 2: + return + + origrow = self.pageList.currentRow() + def cancelEditor(): + self.editor.clear() + self.editor.setModified(False) + self.editpage.setEnabled(False) + self.pageList.setEnabled(True) + self.confcombo.setEnabled(True) + self.editbtn.setEnabled(True) + self.reloadbtn.setEnabled(True) + self.pageList.setCurrentRow(origrow) + self.stack.setCurrentIndex(origrow) + self.refresh() + + def saveEditor(): + try: + f = util.atomictempfile(self.fn, 'w', createmode=None) + f.write(self.editor.text()) + f.rename() + except IOError, e: + qtlib.WarningMsgBox(_('Unable to write configuration file'), + str(e), parent=self) + return + cancelEditor() + + if not self.editpage: + frame = QFrame() + self.stack.addWidget(frame) + vbox = QVBoxLayout() + frame.setLayout(vbox) + editor = qsci() + editor.setBraceMatching(qsci.SloppyBraceMatch) + vbox.addWidget(editor) + BB = QDialogButtonBox + bb = QDialogButtonBox(BB.Save|BB.Cancel) + self.connect(bb, SIGNAL("accepted()"), saveEditor) + self.connect(bb, SIGNAL("rejected()"), cancelEditor) + vbox.addWidget(bb) + lexer = Qsci.QsciLexerProperties() # QsciLexerLua? + editor.setLexer(lexer) + self.editor = editor + self.editpage = frame + + self.editpage.setEnabled(True) + self.stack.setCurrentWidget(self.editpage) + self.pageList.setEnabled(False) + self.confcombo.setEnabled(False) + self.editbtn.setEnabled(False) + self.reloadbtn.setEnabled(False) + try: + contents = open(self.fn, 'rb').read() + self.editor.setText(contents) + self.editor.setModified(False) + except EnvironmentError, e: + qtlib.WarningMsgBox(_('Unable to read config file'), + hglib.tounicode(e), parent=self) + cancelEditor()     def refresh(self, *args):   # determine target config file @@ -543,6 +615,8 @@
  widgets[row].setValue(curvalue)     def isDirty(self): + if self.editor and self.editor.isModified(): + return True   if self.readonly:   return False   for info, widgets in self.pages.values(): @@ -566,7 +640,7 @@
  for i, (meta, info) in enumerate(INFO):   for n, (label, cpath, values, tip) in enumerate(info):   if cpath == focusfield: - self.stack.setCurrentIndex(i) + self.pageList.setCurrentRow(i)   self.pages[meta['name']][1][n].setFocus()   return