You've already forked lazarus-ccr
richmemo: Qt5 proper implementation of GetStyleRange using the newly added (trunk) QTextBlock_textFormats function
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7000 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -4,6 +4,10 @@ interface
|
||||
|
||||
{$mode delphi}
|
||||
|
||||
{$define RMQT5_TEXTFORMATS} // the feature is available in Qt5 Trunk
|
||||
// it allows to query Qt5TextEdit for character formats array
|
||||
{$ifdef RMQT5_NOTEXTFORMATS}{$undef RMQT5_TEXTFORMATS}{$endif}
|
||||
|
||||
//
|
||||
// Following class methods are need for the implementation
|
||||
// QTextCharFormatH
|
||||
@ -31,8 +35,26 @@ type
|
||||
const Params: TIntFontParams); override;
|
||||
|
||||
class function Search(const AWinControl: TWinControl; const ANiddle: string; const SearchOpts: TIntSearchOpt): Integer; override;
|
||||
|
||||
class function isInternalChange(const AWinControl: TWinControl; Params: TTextModifyMask
|
||||
): Boolean; override;
|
||||
class procedure SetTextAttributesInternal(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||
const AModifyMask: TTextModifyMask; const Params: TIntFontParams); override;
|
||||
|
||||
class function GetStyleRange(const AWinControl: TWinControl; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; override;
|
||||
|
||||
end;
|
||||
|
||||
type
|
||||
TEditorState = record
|
||||
selst : integer; // selection start
|
||||
sellen : integer; // selection length
|
||||
end;
|
||||
|
||||
// no sanity check is done in these functions
|
||||
procedure MakeBackup(te: TQtTextEdit; out backup: TEditorState);
|
||||
procedure ApplyBackup(te: TQtTextEdit; const backup: TEditorState);
|
||||
|
||||
implementation
|
||||
|
||||
const
|
||||
@ -106,9 +128,9 @@ class function TQtWSCustomRichMemo.GetTextAttributes(
|
||||
var
|
||||
w : QTextEditH;
|
||||
te : TQtTextEdit;
|
||||
ss, sl : Integer;
|
||||
ws : WideString;
|
||||
clr: TQColor;
|
||||
bck : TEditorState;
|
||||
begin
|
||||
InitFontParams(Params);
|
||||
if not WSCheckHandleAllocated(AWinControl, 'GetTextAttributes') then begin
|
||||
@ -119,16 +141,14 @@ begin
|
||||
te:=TQtTextEdit(AWinControl.Handle);
|
||||
w:=QTextEditH(te.Widget);
|
||||
|
||||
ss:=te.getSelectionStart;
|
||||
sl:=te.getSelectionLength;
|
||||
MakeBackup(te, bck);
|
||||
|
||||
te.setSelection(TextStart, 1);
|
||||
|
||||
//todo!
|
||||
ws:='';
|
||||
QTextEdit_fontFamily(w, @ws);
|
||||
writeln(wS);
|
||||
if ws<>'' then Params.Name:=ws;
|
||||
if ws<>'' then Params.Name:=UTF8Encode(ws);
|
||||
|
||||
Params.Size:=round(QTextEdit_fontPointSize(w));
|
||||
if QTextEdit_fontWeight(w)>=QBold then Include(Params.Style, fsBold);
|
||||
@ -145,7 +165,8 @@ begin
|
||||
//todo!
|
||||
params.HasBkClr:=false;
|
||||
|
||||
te.setSelection(ss, sl);
|
||||
ApplyBackup(te, bck);
|
||||
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
@ -221,6 +242,79 @@ begin
|
||||
else Result:=-1;
|
||||
end;
|
||||
|
||||
class function TQtWSCustomRichMemo.isInternalChange(
|
||||
const AWinControl: TWinControl; Params: TTextModifyMask): Boolean;
|
||||
begin
|
||||
Result := false;
|
||||
|
||||
//Result:=inherited isInternalChange(AWinControl, Params);
|
||||
end;
|
||||
|
||||
class procedure TQtWSCustomRichMemo.SetTextAttributesInternal(
|
||||
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||
const AModifyMask: TTextModifyMask; const Params: TIntFontParams);
|
||||
begin
|
||||
SetTextAttributes(AWinControl, TextStart, TextLen, Params);
|
||||
end;
|
||||
|
||||
class function TQtWSCustomRichMemo.GetStyleRange(
|
||||
const AWinControl: TWinControl; TextStart: Integer; var RangeStart,
|
||||
RangeLen: Integer): Boolean;
|
||||
var
|
||||
te : TQtTextEdit;
|
||||
bck : TEditorState;
|
||||
al : QtAlignment;
|
||||
qcur : QTextCursorH;
|
||||
qblck : QTextBlockH;
|
||||
qbfmt : QTextBlockFormatH;
|
||||
i : integer;
|
||||
cnt : integer;
|
||||
rng : array of TTextRange;
|
||||
blckofs: integer;
|
||||
begin
|
||||
if not WSCheckHandleAllocated(AWinControl, 'GetStyleRange') then begin
|
||||
Result:=false;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
RangeStart:=TextStart;
|
||||
RangeLen:=1;
|
||||
Result:=true;
|
||||
{$ifndef RMQT5_TEXTFORMATS}
|
||||
Exit;
|
||||
{$else}
|
||||
te:=TQtTextEdit(AWinControl.Handle);
|
||||
|
||||
MakeBackup(te, bck);
|
||||
qcur := QTextCursor_Create();
|
||||
qblck := QTextBlock_Create();
|
||||
try
|
||||
te.setSelection(TextStart, 0);
|
||||
QTextEdit_textCursor(QTextEditH(te.Widget), qcur);
|
||||
QTextCursor_block(qcur, qblck);
|
||||
|
||||
cnt := QTextBlock_textFormatsCount(qblck);
|
||||
SetLength(rng, cnt);
|
||||
if cnt>0 then begin
|
||||
blckofs := QTextBlock_position(qblck);
|
||||
textStart := textStart - blckofs;
|
||||
for i:=0 to cnt-1 do begin
|
||||
if (textStart >= rng[i].start) and (textStart<rng[i].start+rng[i].length) then
|
||||
begin
|
||||
RangeStart := rng[i].start + blckofs;
|
||||
RangeLen := rng[i].length;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
QTextBlock_Destroy(qblck);
|
||||
QTextCursor_Destroy(qcur);
|
||||
ApplyBackup(te, bck);
|
||||
end;
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
class function TQtWSCustomRichMemo.GetParaAlignment(
|
||||
const AWinControl: TWinControl; TextStart: Integer;
|
||||
var AAlign: TIntParaAlignment): Boolean;
|
||||
@ -242,4 +336,15 @@ begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
procedure MakeBackup(te: TQtTextEdit; out backup: TEditorState);
|
||||
begin
|
||||
backup.selst:=te.getSelectionStart;
|
||||
backup.sellen:=te.getSelectionLength;
|
||||
end;
|
||||
|
||||
procedure ApplyBackup(te: TQtTextEdit; const backup: TEditorState);
|
||||
begin
|
||||
te.setSelection(backup.selst, backup.sellen);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Reference in New Issue
Block a user