add helpers to edit DUB project properties, close #42

This commit is contained in:
Basile Burg 2016-07-14 08:37:09 +02:00
parent d2539669a4
commit 83b20d593d
1 changed files with 100 additions and 7 deletions

View File

@ -10,21 +10,32 @@ uses
ce_widget, ce_common, ce_interfaces, ce_observer, ce_dubproject, ce_sharedres; ce_widget, ce_common, ce_interfaces, ce_observer, ce_dubproject, ce_sharedres;
type type
{ TCEDubProjectEditorWidget }
TProposalType = (ptArray, ptObject, ptValue);
TEditorProposal = record
name: string;
jtype: TProposalType;
end;
TDubPropAddEvent = procedure(const propName: string; tpe: TJSONtype) of object; TDubPropAddEvent = procedure(const propName: string; tpe: TJSONtype) of object;
TCEDubProjectPropAddPanel = class(TForm) TCEDubProjectPropAddPanel = class(TForm)
private private
fSelType: TRadioGroup; fSelType: TRadioGroup;
fEdName: TEdit; fEdName: TComboBox;
fEvent: TDubPropAddEvent; fEvent: TDubPropAddEvent;
fBtnValidate: TBitBtn; fBtnValidate: TBitBtn;
fJson: TJSONData;
procedure doValidate(sender: TObject); procedure doValidate(sender: TObject);
procedure selTypeChanged(sender: TObject);
procedure setSelFromProposal(sender: TObject);
public public
constructor construct(event: TDubPropAddEvent); constructor construct(event: TDubPropAddEvent; json: TJSONData);
end; end;
{ TCEDubProjectEditorWidget }
TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver) TCEDubProjectEditorWidget = class(TCEWidget, ICEProjectObserver)
btnAcceptProp: TSpeedButton; btnAcceptProp: TSpeedButton;
btnAddProp: TSpeedButton; btnAddProp: TSpeedButton;
@ -77,12 +88,61 @@ type
implementation implementation
{$R *.lfm} {$R *.lfm}
const
proposals: array[0..42] of TEditorProposal = (
(name: 'authors'; jtype: ptArray),
(name: 'buildOptions'; jtype: ptArray),
(name: 'buildRequirements'; jtype: ptArray),
(name: 'buildTypes'; jtype: ptObject),
(name: 'configurations'; jtype: ptArray),
(name: 'copyFiles'; jtype: ptArray),
(name: 'copyright'; jtype: ptValue),
(name: 'cov'; jtype: ptArray),
(name: 'ddoc'; jtype: ptArray),
(name: 'ddoxFilterArgs'; jtype: ptArray),
(name: 'debug'; jtype: ptArray),
(name: 'debugVersions'; jtype: ptArray),
(name: 'dependencies'; jtype: ptObject),
(name: 'description'; jtype: ptValue),
(name: 'dflags'; jtype: ptArray),
(name: 'docs'; jtype: ptArray),
(name: 'excludedSourceFiles'; jtype: ptArray),
(name: 'homepage'; jtype: ptValue),
(name: 'lflags'; jtype: ptArray),
(name: 'libs'; jtype: ptArray),
(name: 'license'; jtype: ptValue),
(name: 'mainSourceFile'; jtype: ptValue),
(name: 'name'; jtype: ptValue),
(name: 'plain'; jtype: ptArray),
(name: 'platforms'; jtype: ptArray),
(name: 'postBuildCommands'; jtype: ptArray),
(name: 'postGenerateCommands';jtype: ptArray),
(name: 'preBuildCommands'; jtype: ptArray),
(name: 'preGenerateCommands'; jtype: ptArray),
(name: 'profile'; jtype: ptArray),
(name: 'release'; jtype: ptArray),
(name: 'sourceFiles'; jtype: ptArray),
(name: 'stringImportPaths'; jtype: ptArray),
(name: 'subConfigurations'; jtype: ptObject),
(name: 'subPackages'; jtype: ptArray),
(name: 'systemDependencies'; jtype: ptValue),
(name: 'targetName'; jtype: ptValue),
(name: 'targetPath'; jtype: ptValue),
(name: 'targetType'; jtype: ptValue),
(name: 'unittest'; jtype: ptArray),
(name: 'unittest-cov'; jtype: ptArray),
(name: 'versions'; jtype: ptArray),
(name: 'workingDirectory'; jtype: ptValue)
);
{$REGION TCEDubProjectPropAddPanel ---------------------------------------------} {$REGION TCEDubProjectPropAddPanel ---------------------------------------------}
constructor TCEDubProjectPropAddPanel.construct(event: TDubPropAddEvent); constructor TCEDubProjectPropAddPanel.construct(event: TDubPropAddEvent; json: TJSONData);
var var
layout: TPanel; layout: TPanel;
i: integer;
begin begin
inherited create(nil); inherited create(nil);
fJson := json;
width := 280; width := 280;
height := 130; height := 130;
fEvent := event; fEvent := event;
@ -98,19 +158,24 @@ begin
fSelType.Caption:= 'type'; fSelType.Caption:= 'type';
fSelType.ItemIndex:=2; fSelType.ItemIndex:=2;
fSelType.Hint:= 'type of the property to add'; fSelType.Hint:= 'type of the property to add';
fSelType.OnSelectionChanged:= @selTypeChanged;
// //
layout := TPanel.Create(self); layout := TPanel.Create(self);
layout.Parent := self; layout.Parent := self;
layout.Align := alBottom; layout.Align := alBottom;
layout.Height := 30; layout.Height := 32;
layout.BevelOuter:= bvNone; layout.BevelOuter:= bvNone;
// //
fEdName := TEdit.Create(self); fEdName := TComboBox.Create(self);
fEdName.Parent := layout; fEdName.Parent := layout;
fEdName.Align:=alClient; fEdName.Align:=alClient;
fEdName.BorderSpacing.Around:=4; fEdName.BorderSpacing.Around:=4;
fEdName.Width:=80; fEdName.Width:=80;
fEdName.Hint:='name of the property to add'; fEdName.Hint:='name of the property to add';
for i:= low(proposals) to high(proposals) do
fEdName.Items.Add(proposals[i].name);
fEdName.AutoComplete := true;
fEdName.OnChange := @setSelFromProposal;
// //
fBtnValidate := TBitBtn.Create(self); fBtnValidate := TBitBtn.Create(self);
fBtnValidate.Parent := layout; fBtnValidate.Parent := layout;
@ -120,6 +185,34 @@ begin
fBtnValidate.OnClick:=@doValidate; fBtnValidate.OnClick:=@doValidate;
fBtnValidate.Hint:='accept and add a property'; fBtnValidate.Hint:='accept and add a property';
AssignPng(fBtnValidate, 'ACCEPT'); AssignPng(fBtnValidate, 'ACCEPT');
//
selTypeChanged(nil);
end;
procedure TCEDubProjectPropAddPanel.selTypeChanged(sender: TObject);
begin
if fJson.isNotNil then
fEdName.Enabled := fJson.JSONType <> TJSONtype.jtArray;
end;
procedure TCEDubProjectPropAddPanel.setSelFromProposal(sender: TObject);
var
i: integer;
begin
fSelType.Enabled:=true;
for i:= low(proposals) to high(proposals) do
begin
if fEdName.Text = proposals[i].name then
begin
case proposals[i].jtype of
ptArray:fSelType.ItemIndex:=0;
ptObject:fSelType.ItemIndex:=1;
ptValue:fSelType.ItemIndex:=2;
end;
fSelType.Enabled := false;
break;
end;
end;
end; end;
procedure TCEDubProjectPropAddPanel.doValidate(sender: TObject); procedure TCEDubProjectPropAddPanel.doValidate(sender: TObject);
@ -257,7 +350,7 @@ var
begin begin
if fSelectedNode.isNil then exit; if fSelectedNode.isNil then exit;
// //
pnl := TCEDubProjectPropAddPanel.construct(@addProp); pnl := TCEDubProjectPropAddPanel.construct(@addProp, TJSONData(fSelectedNode.Data));
pnl.ShowModal; pnl.ShowModal;
pnl.Free; pnl.Free;
end; end;