#59, add a preset editor

This commit is contained in:
Basile Burg 2016-06-17 14:37:29 +02:00
parent 7c041b5bb9
commit d2fc677f97
2 changed files with 213 additions and 56 deletions

View File

@ -5,9 +5,9 @@ interface
uses
Classes, SysUtils, SynEditMiscClasses, Graphics, Controls, StdCtrls, ExtCtrls,
SynEditHighlighter, SynEditTypes,
SynEditHighlighter, SynEditTypes, SynEdit, RTTIGrids, Buttons,
ce_interfaces, ce_common, ce_writableComponent, ce_d2syn, ce_observer,
ce_editoroptions;
ce_editoroptions, ce_sharedres;
type
@ -34,7 +34,7 @@ type
fIdentifierMarkup: TSynSelectedColor;
fMouseLinkAttribs: TSynSelectedColor;
fSelAttribs: TSynSelectedColor;
fd2syn: TSynD2Syn;
fd2syn: TPersistent;
fName: string;
procedure setBracketMatchColor(value: TSynSelectedColor);
procedure setCurrLineAttribs(value: TSynSelectedColor);
@ -42,10 +42,11 @@ type
procedure setIdentifierMarkup(value: TSynSelectedColor);
procedure setMouseLinkColor(value: TSynSelectedColor);
procedure setSelCol(value: TSynSelectedColor);
procedure setD2syn(value: TSynD2Syn);
procedure setD2syn(value: TPersistent);
function getHl: TSynD2Syn;
published
property name: string read fName write fName;
property highlighter: TSynD2Syn read fd2syn write setD2Syn;
property highlighter: TPersistent read fd2syn write setD2Syn;
property background: TColor read fBackground write fBackground default clWhite;
property bracketMatch: TSynSelectedColor read fBracketMatchAttribs write setBracketMatchColor;
property currentLine: TSynSelectedColor read fCurrLineAttribs write setCurrLineAttribs;
@ -65,10 +66,13 @@ type
fCollection: TCollection;
procedure setCollection(value: TCollection);
function getPreset(index: integer): TCED2SynPreset;
published
property presets: TCollection read fCollection write setCollection;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function addPreset: TCED2SynPreset;
function count: integer;
property preset[index: integer]: TCED2SynPreset read getPreset ; default;
end;
@ -78,14 +82,21 @@ type
TCED2SynPresetsLoaderForm = class(TWinControl, ICEEditableOptions)
private
fPresets: TCED2SynPresets;
flstBox: TListBox;
fList: TComboBox;
fEditor: TSynEdit;
fPropEd: TTIPropertyGrid;
fBackup: TCED2SynPreset;
function optionedWantCategory(): string;
function optionedWantEditorKind: TOptionEditorKind;
function optionedWantContainer: TPersistent;
procedure optionedEvent(anEvent: TOptionEditorEvent);
function optionedOptionsModified: boolean;
procedure lstBoxChange(sender: TObject);
procedure lstBoxSelChange(Sender: TObject);
procedure btnAddClick(sender: TObject);
procedure btnDelClick(sender: TObject);
procedure propEdModified(sender: TObject);
procedure updateList;
procedure updateEditor;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@ -124,11 +135,16 @@ begin
inherited;
end;
procedure TCED2SynPreset.setD2syn(value: TSynD2Syn);
procedure TCED2SynPreset.setD2syn(value: TPersistent);
begin
fd2syn.Assign(value);
end;
function TCED2SynPreset.getHl: TSynD2Syn;
begin
exit(TSynD2Syn(fd2syn));
end;
procedure TCED2SynPreset.setBracketMatchColor(value: TSynSelectedColor);
begin
fBracketMatchAttribs.Assign(value);
@ -208,6 +224,11 @@ begin
exit(TCED2SynPreset(fCollection.Add));
end;
function TCED2SynPresets.count: integer;
begin
exit(fCollection.Count);
end;
function TCED2SynPresets.getPreset(index: integer): TCED2SynPreset;
begin
exit(TCED2SynPreset(fCollection.Items[index]));
@ -231,49 +252,50 @@ end;
constructor TCED2SynPresetsLoaderForm.Create(AOwner: TComponent);
var
fname: string;
i: integer;
pnl: TPanel;
btn: TBitBtn;
begin
inherited;
fBackup:= TCED2SynPreset.Create(nil);
fPresets:= TCED2SynPresets.Create(self);
fname := getCoeditDocPath + optfname;
if fname.fileExists then
fPresets.loadFromFile(fname)
else begin
// Default
//if fname.fileExists then
//fPresets.loadFromFile(fname)
//else
begin
with fPresets.addPreset do
begin
fName :='bright';
fBackground := clWhite;
fd2syn.whites.define(clNone);
fd2syn.numbers.define($000079F2);
fd2syn.symbols.define(clMaroon);
fd2syn.identifiers.define(clBlack);
fd2syn.comments.define(clGreen,[fsItalic]);
fd2syn.strings.define(clBlue);
fd2syn.keywords.define(clNavy,[fsBold]);
fd2syn.ddoc.define(clTeal);
fd2syn.inlineAsm.define(clGray,[fsBold]);
fd2syn.special.define(clNavy,[fsBold]);
fd2syn.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]);
fd2syn.attributes.define(clNavy,[fsBold]);
getHl.whites.define(clNone);
getHl.numbers.define($000079F2);
getHl.symbols.define(clMaroon);
getHl.identifiers.define(clBlack);
getHl.comments.define(clGreen,[fsItalic]);
getHl.strings.define(clBlue);
getHl.keywords.define(clNavy,[fsBold]);
getHl.ddoc.define(clTeal);
getHl.inlineAsm.define(clGray,[fsBold]);
getHl.special.define(clNavy,[fsBold]);
getHl.errors.define(clBlack,[],clNone,clRed,slsWaved,sfeBottom,[]);
getHl.attributes.define(clNavy,[fsBold]);
end;
with fPresets.addPreset do
begin
fName :='dark';
fBackground := $00404040;
fd2syn.whites.define(clNone);
fd2syn.numbers.define($000079F2,[fsBold]);
fd2syn.symbols.define(clMaroon);
fd2syn.identifiers.define($00F0EFE1);
fd2syn.comments.define($00C7C7C7,[fsItalic]);
fd2syn.strings.define($ECD284);
fd2syn.keywords.define($0097C793,[fsBold]);
fd2syn.ddoc.define(clTeal);
fd2syn.inlineAsm.define($00CB84EC,[fsBold]);
fd2syn.special.define($0097C793,[fsBold]);
fd2syn.errors.define($00F0EFE1,[],clNone,clRed,slsWaved,sfeBottom,[]);
fd2syn.attributes.define($0097C793,[fsBold]);
getHl.whites.define(clNone);
getHl.numbers.define($F27900,[fsBold]);
getHl.symbols.define(clMaroon);
getHl.identifiers.define($E1EFF0);
getHl.comments.define($C7C7C7,[fsItalic]);
getHl.strings.define($84D2EC);
getHl.keywords.define($93C797,[fsBold]);
getHl.ddoc.define(clTeal);
getHl.inlineAsm.define($EC84CB,[fsBold]);
getHl.special.define($93C797,[fsBold]);
getHl.errors.define($E1EFF0,[],clNone,clRed,slsWaved,sfeBottom,[]);
getHl.attributes.define($93C797,[fsBold]);
end;
with fPresets.addPreset do
begin
@ -287,25 +309,97 @@ begin
end;
with fPresets.addPreset do
begin
fBackground :=clWhite;
fName :='Mustard';
fBackground := $78C8D3;
getHl.whites.define(clNone);
getHl.numbers.define($000079F2,[fsBold]);
getHl.symbols.define(clMaroon);
getHl.identifiers.define($1E2331);
getHl.comments.define($4F7184,[fsItalic]);
getHl.strings.define($6D82BA);
getHl.keywords.define($313A5A,[fsBold]);
getHl.ddoc.define($5F8194);
getHl.inlineAsm.define($98B7B4,[fsBold]);
getHl.special.define($313A5A,[fsBold]);
getHl.errors.define($1E2331,[],clNone,clRed,slsWaved,sfeBottom,[]);
getHl.attributes.define($313A5A,[fsBold]);
end;
end;
//
flstBox := TListBox.Create(self);
flstBox.Align:= alClient;
flstBox.BorderSpacing.Around:= 4;
flstBox.Parent := self;
flstbox.OnClick:=@lstBoxChange;
for i:= 0 to fPresets.fCollection.Count-1 do
flstBox.AddItem(fPresets[i].name, fPresets[i]);
fEditor := TSynEdit.Create(self);
fEditor.Parent:= self;
fEditor.Height:= 200;
fEditor.Align:= alTop;
fEditor.ReadOnly:=true;
fEditor.Font.Assign(EditorOptions.font);
fEditor.Font.Size:=12;
fEditor.Font.Name:=EditorOptions.font.Name;
fEditor.BorderSpacing.Around:= 4;
fEditor.ScrollBars:= ssAutoBoth;
fEditor.Options:= fEditor.Options - [eoScrollPastEof, eoScrollPastEol];
fEditor.SetHighlightSearch('writeln',[]);
fEditor.lines.Add('module preview;');
fEditor.lines.Add('import std.stdio');
fEditor.lines.Add('/// ddoc comment');
fEditor.lines.Add('@safe void main(string[] args)');
fEditor.lines.Add('{');
fEditor.lines.Add(' // writeln is the current identifier');
fEditor.lines.Add(' writeln("this is a string");');
fEditor.lines.Add(' writeln(__DATE__);');
fEditor.lines.Add(' int number = 0xDEADBEEF;');
fEditor.lines.Add(' asm{ xor RAX, RAX; }');
fEditor.lines.Add(' int error = 12G;');
fEditor.lines.Add('}');
pnl := TPanel.Create(self);
pnl.Parent := self;
pnl.BevelOuter:= bvNone;
pnl.BevelInner:= bvNone;
pnl.Align:=alTop;
pnl.BorderSpacing.Around:= 4;
pnl.Height:=30;
//
fList := TComboBox.Create(self);
fList.Align:= alClient;
fList.BorderSpacing.Around:= 4;
fList.Parent := pnl;
fList.ReadOnly:=true;
fList.OnSelect:= @lstBoxSelChange;
updateList;
//
btn := TBitBtn.Create(self);
btn.Parent := pnl;
btn.Width:= 26;
btn.Align:= alRight;
btn.BorderSpacing.Around:=2;
btn.OnClick:=@btnAddClick;
btn.Hint:='add preset';
AssignPng(btn, 'document_add');
//
btn := TBitBtn.Create(self);
btn.Parent := pnl;
btn.Width:= 26;
btn.Align:= alRight;
btn.BorderSpacing.Around:=2;
btn.OnClick:=@btnDelClick;
btn.Hint:='delete preset';
AssignPng(btn, 'document_delete');
//
fPropEd := TTIPropertyGrid.Create(self);
fPropEd.Parent := self;
fPropEd.Align:= alClient;
fPropEd.DefaultValueFont.Color := clGreen;
fPropEd.OnModified:=@propEdModified;
fPropEd.CheckboxForBoolean:=true;
fPropEd.PropertyEditorHook.AddHandlerModified(@propEdModified);
//
fList.ItemIndex := 0;
lstBoxSelChange(nil);
EntitiesConnector.addObserver(self);
end;
destructor TCED2SynPresetsLoaderForm.Destroy;
begin
//fPresets.saveToFile(getCoeditDocPath + optfname);
fPresets.saveToFile(getCoeditDocPath + optfname);
fBackup.Free;
EntitiesConnector.removeObserver(self);
inherited;
@ -329,7 +423,11 @@ end;
procedure TCED2SynPresetsLoaderForm.optionedEvent(anEvent: TOptionEditorEvent);
begin
case anEvent of
oeeAccept: fBackup.assignFromOptions;
oeeAccept:
begin
fPresets[fList.ItemIndex].assignToOptions;
fBackup.assignFromOptions;
end;
oeeCancel: fBackup.assignToOptions;
oeeSelectCat: fBackup.assignFromOptions;
end;
@ -340,11 +438,70 @@ begin
exit(false);
end;
procedure TCED2SynPresetsLoaderForm.lstBoxChange(sender: TObject);
procedure TCED2SynPresetsLoaderForm.lstBoxSelChange(Sender: TObject);
begin
if flstBox.ItemIndex = -1 then
if fList.ItemIndex <> -1 then
begin
fPropEd.TIObject := fPresets[fList.ItemIndex];
fPropEd.SplitterX:= (fPropEd.Width - 20) div 2;
fPropEd.PreferredSplitterX:= fPropEd.SplitterX;
fEditor.Highlighter := fPresets[fList.ItemIndex].getHl;
updateEditor;
end else
fPropEd.TIObject := nil;
end;
procedure TCED2SynPresetsLoaderForm.btnAddClick(sender: TObject);
var
prs: TCED2SynPreset;
begin
prs := fPresets.addPreset;
prs.name := format('preset %d', [fPresets.count]);
updateList;
fList.ItemIndex := prs.Index;
lstBoxSelChange(nil);
end;
procedure TCED2SynPresetsLoaderForm.btnDelClick(sender: TObject);
begin
fPresets.fCollection.Delete(fList.ItemIndex);
updateList;
lstBoxSelChange(nil);
end;
procedure TCED2SynPresetsLoaderForm.propEdModified(sender: TObject);
begin
updateEditor;
end;
procedure TCED2SynPresetsLoaderForm.updateList;
var
i, j: integer;
begin
fList.OnChange:=nil;
j := fList.ItemIndex;
fList.Clear;
for i:= 0 to fPresets.count-1 do
fList.AddItem(fPresets[i].name, fPresets[i]);
if (j <> -1) and (j < fPresets.count) then
fList.ItemIndex := j;
fList.OnChange:=@lstBoxSelChange;
end;
procedure TCED2SynPresetsLoaderForm.updateEditor;
var
p: TCED2SynPreset;
begin
if fList.ItemIndex = -1 then
exit;
fPresets[flstBox.ItemIndex].assignToOptions;
p := fPresets[fList.ItemIndex];
fEditor.Color := p.background;
fEditor.SelectedColor := p.selection;
fEditor.HighlightAllColor := p.identifierMatch;
fEditor.LineHighlightColor := p.currentLine;
fEditor.FoldedCodeColor := p.folding;
fEditor.MouseLinkColor := p.mouseLink;
fEditor.BracketMatchColor := p.bracketMatch;
end;
{$ENDREGION}

View File

@ -33,7 +33,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
Left = 0
Height = 451
Top = 0
Width = 140
Width = 150
Align = alLeft
AutoExpand = True
DefaultItemHeight = 16
@ -48,20 +48,20 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
Options = [tvoAutoExpand, tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
object pnlEd: TPanel
Left = 146
Left = 156
Height = 451
Top = 0
Width = 405
Width = 395
Align = alClient
BevelOuter = bvNone
ClientHeight = 451
ClientWidth = 405
ClientWidth = 395
TabOrder = 1
object inspector: TTIPropertyGrid
Left = 0
Height = 451
Top = 0
Width = 405
Width = 395
Align = alClient
CheckboxForBoolean = False
DefaultValueFont.Color = clWindowText
@ -76,7 +76,7 @@ inherited CEOptionEditorWidget: TCEOptionEditorWidget
end
end
object Splitter1: TSplitter
Left = 140
Left = 150
Height = 451
Top = 0
Width = 6