A few days ago I described my progress on editview, but just today I stumbled on a big improvement. Here's how it looks now.
If you click through you find that's a quite large image. The reason is, it's from a retina macbook so what looks like quite a modest window, when captured, comes out 1500px wide. Here are the improvements from the prior version.
- The current-line highlight now extends the full width of the window. Before it was only as long as the text on that line.
- Scanno highlighting (the lilac highlights) is implemented. You can load a file of common OCR errors and they are marked wherever they appear.
- Spellcheck highlighting (wiggly magenta underlines) is implemented, including alternate dictionaries. Note the line with <span lang='fr_FR'> those words get checked against the french dictionary instead of the default one.
Pretty much all that remains is to finish an automated unit test of these features. I have one simple unit test driver now that uses QTest to automate a number of keystrokes, but I need to also automate exercising a pop-up context menu. That'll be an adventure I'm sure.
In the previous post I kvetched about how, although a QTextBlock has a format (QTextBlockFormat), you could only interrogate it, and modifying it didn't change the format. As a result, what I expected would be a simple way to set a current-line highlight, by setting the background brush of the current text block, didn't work.
Then today, browsing around the QTextCursor documentation, what should my eye fall upon but a setBlockFormat method! You can ask a QTextBlock for its format, but in order to set it, you have to aim a QTextCursor at that block, and then tell the cursor to set the block's format.
Bizarre.
Well, at any rate, not how I'd have designed it. But I didn't, so...
So I realized that my previous method of highlighting the current line using the extraSelections mechanism was over-complicated. I changed the logic to set a background brush on the current block. The cursor-moved logic now reads as follows:
Note: The following is still not the correct way to set a current-line highlight. Do not emulate this code. See this post for the problem with it and a later post for the correct approach.
def _cursor_moved(self): tc = QTextCursor(self.Editor.textCursor()) self.ColNumber.setText(str(tc.positionInBlock())) tb = tc.block() if tb == self.last_text_block: return # still on same line, nothing more to do # Fill in line-number widget, line #s are origin-1 self.LineNumber.setText(str(tb.blockNumber()+1)) # Fill in the image name and folio widgets pn = self.page_model.page_index(tc.position()) if pn is not None : # the page model has info on this position self.ImageFilename.setText(self.page_model.filename(pn)) self.Folio.setText(self.page_model.folio_string(pn)) else: # no image data, or cursor is above page 1 self.ImageFilename.setText('') self.Folio.setText('') # clear any highlight on the previous current line self.last_cursor.setBlockFormat(self.normal_line_fmt) # remember this new current line self.last_cursor = tc self.last_text_block = tb # and set its highlight tc.setBlockFormat(self.current_line_fmt)
No comments:
Post a Comment