One question, I see tests for traces all over in the code. You said several 
times "traces show". How do I use these traces? They sound useful!

On Wednesday, March 2, 2016 at 12:31:32 PM UTC-5, Edward K. Ream wrote:
>
> ​​On Thu, Feb 4, 2016 at 10:25 AM, john lunzer <[email protected] 
> <javascript:>> wrote:
>
>> From here 
>> <http://stackoverflow.com/questions/26505729/how-to-display-non-printable-symbols-in-qtextedit-pyqt4>
>>  I 
>> found a little snippet of code which makes tabs and spaces visible:
>>
>> doc = QtGui.QTextDocument()
>> ​​
>> option = QtGui.QTextOption()
>> option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces)
>> ​​
>> doc.setDefaultTextOption(option)
>> textEdit = QtGui.QTextEdit()
>> textEdit.setDocument(doc)
>>
>> From a different post 
>> <http://stackoverflow.com/questions/32147592/color-whitespace-and-paragraph-separators-in-qtextedit-with-qsyntaxhighlighter>
>>  (although 
>> it is a C++ example) it shows that a custom highlighter can be used to 
>> colorize these visible tabs and spaces.
>>
>
> ​Thanks for this!  It would be a good addition.​
>  
>
>>
>> I have for a while wanted to make this change because the way Leo 
>> currently handles "invisibles" is too conspicuous to keep on all the time. 
>>
>> I'm looking for some direction on how this might be integrated into Leo? 
>> Any help would be greatly appreciated.
>>
>
> ​In general, the best approach is use the search command.  Nowadays, I 
> would use cff.  ​
>  
> ​Let's try​ a search on setDocument...I get the following headlines:
>
>     ctor (LeoQtSyntaxHighlighter)
>     pqsh.setDocument
>     pqsh.Birth & death
>
> These are out of context, so let's use Alt-N (goto-next-clone) to find the 
> context. They are all in leoColorizer.py, which is a good sign.  The 
> python_qsh switch is True at the top of leoColorizer.py, which means that 
> the PythonQSyntaxHighlighter class is in effect.
>
> Looking at pqsh.setDocument, it's clear that it is one place to apply the 
> patch. Indeed, there is this assert:
>
>     assert isinstance(d, QtGui.QTextDocument), d
>
> So let's apply the patch!  Right after the above assert:
>
>     assert isinstance(d, QtGui.QTextDocument), d
>     if d:
>         if 1: # Show invisibles
>             option = QtGui.QTextOption()
>             option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces)
>             d.setDefaultTextOption(option)
>         d.contentsChange.connect(self.q_reformatBlocks)
>         d.rehighlightPending = True
>             # Set d's pending flag.
>         QtCore.QTimer.singleShot(0, self.delayedRehighlight)
>
> And it works! So let's connect it for real.
>
> Again, the only effective way is to start with a search.  Let's guess 
> showInvisibles, because there is a show-invisibles command. Heh, the first 
> hit is:
>
>     self.showInvisibles = c.config.getBool("show_invisibles_by_default")
>
> in the leoColorizer.py.
>
> Now it gets really tricky. showInvisibles is an ivar of the JEditColorizer 
> class, but the code we are adding is in the PythonQSyntaxHighlighter class. 
> Actually, it's in the LeoQtSyntaxHighlighter class, a subclass of pqsh.
>
> The ctor for LeoQtSyntaxHighlighter creates this ivar:
>
>     self.colorer = JEditColorizer(...)
>
> So the test we want in pqsh.setDocument is:
>
>     if self.colorer.showInvisibles:
>
> Let's try it.  Still throws an AttributeError, but we are close. The 
> problem is that LeoQtSyntaxHighlighter creates the pqsh class *before* 
> creating the colorer ivar.  So the solution is to create the pqsh class 
> *last*.  Yup, that works, or at least doesn't crash on startup :-)
>
> But the toggle-invisibles command still doesn't work. Searching for 
> 'toggle-invisibles' gets us to c.showInvisiblesHelper.  Hmm. It sets 
> colorizer.showInvisibles, not colorer.showInvisibles.
>
> So let's add this line to c.showInvisiblesHelper:
>
>     colorizer.highlighter.showInvisibles = val
>
> Traces show that this is the correct ivar, but doh, pqsh.setDocument is 
> called only during startup. So it looks like we are going to have to 
> dynamically set the flags in pqsh.rehighlight_helper.  A trace confirms 
> that this helper is called when we do a toggle-invisibles.  Let's add this 
> code:
>
>     if self.colorer.showInvisibles:
>             option = QtGui.QTextOption()
>             option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces)
>             self.d.setDefaultTextOption(option)
>
> That works, but there are two problems.  First, the *old* way of showing 
> invisibles is still in effect, and second, there is no way to turn off the 
> new way of showing invisibles.
>
> To handle the second problem, let's add an else clause.  Like this:
>
>         option = QtGui.QTextOption()
>         if self.colorer.showInvisibles:
>             option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces)
>         self.d.setDefaultTextOption(option)
>
> And that works.  But we still have to turn off the old way of highlighting 
> invisibles. Let's try commenting out a line in c. showInvisiblesHelper:
>
>     # colorizer.showInvisibles = val
>
> Nope.  That doesn't work.  Searching on showInvisibles gets us to:
>
>    JEditColorizer.configure_variable_tags.
>
> So what we want is to disable the code there, or to disable 
> JEditColorizer.showInvisibles.  Let's try the latter.
>
> There is a comment that JEditColorizer is 
> c.frame.body.colorizer.highlighter.colorer
>
> So let's *add* the following line to c.showInvisiblesHelper:
>
>    colorizer.highlighter.colorer.showInvisibles = val
>
> Still no joy.  Ah.  JEditColorizer.configure_variable_tags is only called 
> at startup. Looking further, we see that JEditColorizer.match_blanks tests 
> showInvisibles.  So let's just have it always return.
>
> Yup.  That works.
>
> I haven't upped this change. I suppose it could be yet another option, but 
> I think we should use the new code. It is the recommended Qt way. I plan to 
> do this soon, unless there are objections.
>
> A long answer to your question.  The short answer is, use cff to find the 
> code to look at, and then play around and see what happens.
>
> Edward
>

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.

Reply via email to