Skip to content

Commit a15b3ca

Browse files
committed
refs #31, Added Controller::borderedTextRanges for rendering non-selected ranges with a border
1 parent 144db40 commit a15b3ca

9 files changed

Lines changed: 91 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
edbee.lib:
44

5-
- ref #30, Edbee crashes when you cut/copy with nothing selected. (Bug in clipboard operation)
6-
- ref #27, Theme loading/handling bugfixes
5+
- add #31, Support for rendering borderedTextRanges. These are textranges rendered with borders, that aren't selected. TextEditorController has a member 'borderedTextRanges()'. Altering this rangeset (and updating the view controller::update) renderes borders aroudn the given ranges
6+
- fix #30, Edbee crashes when you cut/copy with nothing selected. (Bug in clipboard operation)
7+
- fix #27, Theme loading/handling bugfixes
78
- Theme-colors with alpha channels are parsed correctly. (QColor expects #AARRGGBB, theme uses #RRGGBBAA)
89
- Transparent main background color is changed to opaque to fix rendering issues.
910
- Bugfixes TextThemeManager::theme, local scope shadowed returned theme value and double insert.

edbee-lib/edbee/models/textsearcher.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -219,27 +219,34 @@ bool TextSearcher::selectAll( TextRangeSet* selection )
219219
{
220220
TextRange oldRange = selection->range(0);
221221

222+
markAll(selection);
223+
224+
// no selection, we MUST place a caret
225+
if( selection->rangeCount() == 0 ) {
226+
selection->addRange(oldRange.caret(), oldRange.caret());
227+
return false;
228+
}
229+
return true;
230+
}
231+
232+
/// Put all found items in the ranges
233+
/// @param rangeset the rangeset to search for
234+
void TextSearcher::markAll(TextRangeSet *rangeset)
235+
{
222236
// clear the selection and add all matches
223237
bool oldReverse = reverse_; // we must NOT reverse find
224238
bool oldWrapAround = wrapAround_;
225239
reverse_ = false;
226240
wrapAround_ = false;
227-
selection->clear();
228-
TextRange range = findNextRange(selection);
241+
rangeset->clear();
242+
TextRange range = findNextRange(rangeset);
229243
while( !range.isEmpty() )
230244
{
231-
selection->addRange(range.anchor(), range.caret());
232-
range = findNextRange( selection );
245+
rangeset->addRange(range.anchor(), range.caret());
246+
range = findNextRange( rangeset );
233247
}
234248
wrapAround_ = oldWrapAround;
235249
reverse_ = oldReverse;
236-
237-
// no selection, we MUST place a caret
238-
if( selection->rangeCount() == 0 ) {
239-
selection->addRange(oldRange.caret(), oldRange.caret());
240-
return false;
241-
}
242-
return true;
243250
}
244251

245252

edbee-lib/edbee/models/textsearcher.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class TextSearcher : public QObject
5555
bool selectNext( TextRangeSet* selection );
5656
bool selectPrev( TextRangeSet* selection );
5757
bool selectAll( TextRangeSet* selection );
58+
void markAll( TextRangeSet* rangeset );
5859

5960
public slots:
6061

edbee-lib/edbee/texteditorcontroller.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ TextEditorController::TextEditorController( TextEditorWidget* widget, QObject *p
5757
, textCaretCache_(0)
5858
, textSearcher_(0)
5959
, autoScrollToCaret_(AutoScrollAlways)
60+
, borderedTextRanges_(0)
6061
{
6162

6263
// create the keymap
@@ -78,6 +79,7 @@ TextEditorController::TextEditorController( TextEditorWidget* widget, QObject *p
7879
/// Destroys the controller and associated objects
7980
TextEditorController::~TextEditorController()
8081
{
82+
delete borderedTextRanges_;
8183
delete textSearcher_;
8284
delete textRenderer_;
8385
delete textCaretCache_;
@@ -140,6 +142,10 @@ void TextEditorController::setTextDocument(TextDocument* doc)
140142
textSelection_ = new TextSelection( this );
141143
textSelection_->addRange(0,0); // add at least one cursor :-)
142144

145+
delete borderedTextRanges_;
146+
borderedTextRanges_ = new DynamicTextRangeSet(textDocument());
147+
148+
143149
textDocumentRef_->textUndoStack()->registerContoller(this);
144150

145151
connect( textDocumentRef_, SIGNAL(textChanged(edbee::TextBufferChange)), this, SLOT(onTextChanged(edbee::TextBufferChange)));
@@ -243,7 +249,15 @@ TextSelection* TextEditorController::textSelection() const
243249
/// Returns the current text renderer
244250
TextRenderer*TextEditorController::textRenderer() const
245251
{
246-
return textRenderer_;
252+
return textRenderer_;
253+
}
254+
255+
256+
/// returns the bordered textranges
257+
/// These are textranges that are rendered with a border, but aren't truely selected
258+
TextRangeSet *TextEditorController::borderedTextRanges() const
259+
{
260+
return borderedTextRanges_;
247261
}
248262

249263

edbee-lib/edbee/texteditorcontroller.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class TextEditorController : public QObject
6868
TextDocument* textDocument() const;
6969
TextSelection* textSelection() const;
7070
TextRenderer* textRenderer() const;
71+
TextRangeSet* borderedTextRanges() const;
72+
7173
void setKeyMap( TextEditorKeyMap* keyMap );
7274
void giveKeyMap( TextEditorKeyMap* keyMap );
7375
TextEditorKeyMap* keyMap() const;
@@ -147,6 +149,7 @@ public slots:
147149
TextDocument* textDocumentRef_; ///< The reference to the text-document
148150

149151
TextSelection* textSelection_; ///< The text selection
152+
150153
TextEditorKeyMap* keyMap_; ///< The ownership of the keymap
151154
TextEditorKeyMap* keyMapRef_; ///< A reference to the keymap
152155
TextEditorCommandMap* commandMap_; ///< the ownership
@@ -157,6 +160,10 @@ public slots:
157160
TextSearcher* textSearcher_; ///< The text-searcher
158161

159162
AutoScrollToCaret autoScrollToCaret_; ///< This flags tells the editor to automaticly scrol to the caret
163+
164+
165+
// extra highlight text
166+
TextRangeSet* borderedTextRanges_; ///< Extra marked text ranges
160167
};
161168

162169
} // edbee

edbee-lib/edbee/views/components/texteditorrenderer.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "edbee/models/textdocument.h"
1212
#include "edbee/models/texteditorconfig.h"
13+
#include "edbee/texteditorcontroller.h"
1314
#include "edbee/views/texttheme.h"
1415
#include "edbee/views/textselection.h"
1516
#include "edbee/views/textrenderer.h"
@@ -60,6 +61,7 @@ void TextEditorRenderer::render(QPainter *painter)
6061
renderLineSelection( painter, line );
6162
renderLineSeparator( painter, line );
6263
renderLineText( painter, line );
64+
renderLineBorderedRanges( painter, line );
6365
}
6466

6567
renderCarets(painter);
@@ -112,6 +114,48 @@ void TextEditorRenderer::renderLineSelection(QPainter *painter,int line)
112114
}
113115

114116

117+
void TextEditorRenderer::renderLineBorderedRanges(QPainter *painter,int line)
118+
{
119+
//PROF_BEGIN_NAMED("render-selection")
120+
TextDocument* doc = renderer()->textDocument();
121+
TextRangeSet* sel = renderer()->controller()->borderedTextRanges();
122+
int lineHeight = renderer()->lineHeight();
123+
124+
QPen pen(themeRef_->foregroundColor(), 0.5);
125+
126+
127+
int firstRangeIdx=0;
128+
int lastRangeIdx=0;
129+
/// TODO: iprove ranges at line by calling rangesForOffsets first for only the visible offsets!
130+
if( sel->rangesAtLine( line, firstRangeIdx, lastRangeIdx ) ) {
131+
132+
QTextLayout* textLayout = renderer()->textLayoutForLine(line);
133+
QRectF rect = textLayout->boundingRect();
134+
QTextLine textLine = textLayout->lineAt(0);
135+
136+
int lastLineColumn = doc->lineLength(line);
137+
138+
// draw all 'ranges' on this line
139+
for( int rangeIdx = firstRangeIdx; rangeIdx <= lastRangeIdx; ++rangeIdx ) {
140+
TextRange& range = sel->range(rangeIdx);
141+
int startColumn = doc->columnFromOffsetAndLine( range.min(), line );
142+
int endColumn = doc->columnFromOffsetAndLine( range.max(), line );
143+
144+
int startX = textLine.cursorToX( startColumn );
145+
int endX = textLine.cursorToX( endColumn );
146+
147+
if( range.length() > 0 && endColumn+1 >= lastLineColumn) endX += 3;
148+
149+
QPainterPath path;
150+
path.addRoundedRect(startX, line*lineHeight + rect.top(), endX - startX, rect.height(),5,5);
151+
painter->strokePath(path, pen);
152+
// painter->strok(startX, line*lineHeight + rect.top(), endX - startX, rect.height(), themeRef_->selectionColor() ); //QColor::fromRgb(0xDD, 0x88, 0xEE) );
153+
}
154+
}
155+
//PROF_END
156+
}
157+
158+
115159

116160
void TextEditorRenderer::renderLineSeparator(QPainter *painter,int line)
117161
{

edbee-lib/edbee/views/components/texteditorrenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class TextEditorRenderer
2424
virtual void render(QPainter* painter);
2525
virtual void renderLineBackground(QPainter *painter, int line);
2626
virtual void renderLineSelection(QPainter *painter, int line);
27+
virtual void renderLineBorderedRanges(QPainter *painter, int line);
2728
virtual void renderLineSeparator(QPainter *painter, int line);
2829
virtual void renderLineText(QPainter *painter, int line);
2930
virtual void renderCarets(QPainter *painter);

edbee-lib/edbee/views/textrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ TextRenderer::TextRenderer(TextEditorController* controller)
4141
{
4242
connect( controller, SIGNAL(textDocumentChanged(edbee::TextDocument*,edbee::TextDocument*)), this, SLOT(textDocumentChanged(edbee::TextDocument*,edbee::TextDocument*)));
4343
textThemeStyler_ = new TextThemeStyler( controller );
44+
4445
}
4546

4647

edbee-lib/edbee/views/textrenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class TextDocument;
2525
class TextEditorConfig;
2626
class TextEditorController;
2727
class TextEditorWidget;
28+
class TextRangeSet;
2829
class TextSelection;
2930
class TextTheme;
3031
class TextThemeStyler;
@@ -93,7 +94,6 @@ Q_OBJECT
9394
void setThemeByName( const QString& name );
9495
void setTheme( TextTheme* theme );
9596

96-
9797
// temporary getters only valid while rendering!!
9898
const QRect* clipRect() { return clipRectRef_; } ///< This method is valid only while rendering!
9999
int startOffset() { return startOffset_; } ///< This method is valid only while rendering!

0 commit comments

Comments
 (0)