libman, entries can be de/activated without removal

This commit is contained in:
Basile Burg 2016-03-28 00:52:42 +02:00
parent 71fbc48b89
commit c74f6af73f
7 changed files with 192 additions and 103 deletions

BIN
icons/book/book.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

BIN
icons/book/book_grey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

View File

@ -442,6 +442,47 @@ LazarusResources.Add('book_open','PNG',[
+#213#31#223'Z'#27#22'8'#179'7c'#191#230'm'#158']'#13#246'm'#246#205'?zj'#215
+#225'O'#1#6#0#215#185#17'o'#26'E'#145#174#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('book_grey','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#4#0#0#0#181#250'7'
+#234#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0' cHRM'#0#0'z&'#0#0#128#132#0
+#0#250#0#0#0#128#232#0#0'u0'#0#0#234'`'#0#0':'#152#0#0#23'p'#156#186'Q<'#0#0
+#0#2'bKGD'#0#255#135#143#204#191#0#0#0#223'IDAT('#207'm'#209#177'M'#196'0'#24
+#134#225#231'O"Z'#150'`'#9#26'68'#6#160'f'#2#10'J'#10#26'J'#22'8'#137#142#1
+'`'#3':V'#0#150'@:'#233#136's'#142')'#226#220#229#16'_e'#201#175'_'#127#191
+#29#197#221#139#21'YQ'#28#18#26#205#235#253'eGY'#221'xp+'#255#1':'#143'+:F['
+#217#214#187'l'#172#219#141#214#185#17#29'$!I'#174#22#134'g}E'#133#132#180'?'
+'=e'#148#196'l'#232#133#193'h]{'#132#214#137#225#0'$'#141'^v'#189'0<IL@'#232
+#133#164'X'#239#231#8#141'~6L@'#143'va('#181'd'#237'@o'#20'G'#192#207'a'#138
+'A'#24'X<T'#161#150'l'#212'eba'#8#12#179#129#157#176';'#186'`'#246#214#146'Y'
+'#k'#149'=T'#132'<'#3#155#183#143#139#214#231#209'WM'#142#205#27'Q'#196#153
+'S'#255#231#187'|'#253#2#244'&R'#165'%'#217'Iv'#0#0#0'%tEXtdate:create'#0'20'
+'14-03-13T04:26:44+02:00d''t'#165#0#0#0'%tEXtdate:modify'#0'2009-04-08T14:08'
+':08+03:00'#203'|'#247'W'#0#0#0#25'tEXtSoftware'#0'Adobe ImageReadyq'#201'e<'
+#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('book','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#6#0#0#0#31#243#255'a'
+#0#0#0#25'tEXtSoftware'#0'Adobe ImageReadyq'#201'e<'#0#0#1#192'IDATx'#218#148
+'S=O'#28'1'#20#28#251#12'E'#154'4tHT'#252#129#252#129#20'i'#144#18'A'#149'k@'
+#162#228#31'@'#151'*J'#157'>R$'#10':'#162#20#9#138#146#134#226'ZDq'#162#165#2
+#132't'#5#197'}'#238#238#173#237#199#216#241#238'}'#23'<'#201'k'#175#247#237
+#204#188'y'#182#18#17#188#251#252#239#23#128']'#14'8'#239#225#189'@'#176'<'
+#20#135#214#26#13#173'~_~'#218#217'3a'#147#249#187#223#143'wp'#240#229#2#167
+''''#31'`'#157'G'#0'^'#10#160#20#214'L'#3'G_'#255'F'#194#8' '#226#209#205'<'
+#172#245#24#20'%'#206#218'O'#176'T'#226#2#134'L'#168#27#28#134#236#135'o6'
+#168#210#163#6#8'1,%'#202#27#22#130#209'X'#240#237#253#230'R'#5'G'#127#30#153
+#227'cn'#8']'#213'5'#28's'#147'o'#163#210#177#132'U'#14' ~'#27#133#220#4'a*y'
+#1' '#160'eT'#226'X'#127#243#199#29'J&'#251')'#166'5'#214#240'j]'#147#132'j'
+#147#4'S)'#24'P'#182#230'n'#152'K'#11#156#127#220'Z'#170'`'#255#231#3#201'&'
+#10'M'#229#236'p'#236#8#128'('#143']A'#243#252'>'#206'U3'#2'c'#248#206#246
+#209'h'#31#215#179#10#10#137#155'}'#2#136'Wt\E'#215#231#131#13#195#160#156
+#152'X'#3#244#139#255'&'#246#9'dI'#173#19#235#204#207'T'#227'S.f'#20#240'%'
+#183#201'D+'#177#247#162#166#206'@'#5#144#30'Yjy'#221#198#16'ytVqv'#17']'#173
+'8'#198#225#145#145'L-(p'#146'f'#212'=^u'#23'r+'#179#231' 0'#23'4.\'#146#220
+'q6&'#22'<'#15'#)7w'#186'6('#2#140#250#189'V'#167'}'#245'V7'#12':7'#215#139
+#197'/'#168'P'#200#6#189'V\'#135'[G'#212'm'#174'_'#227'e'#209#229#191#183#207
+#2#12#0'\'#18#219#240#21' '#12#174#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('bullet_black','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#4#0#0#0#181#250'7'
+#234#0#0#0#4'gAMA'#0#0#175#200'7'#5#138#233#0#0#0#25'tEXtSoftware'#0'Adobe I'

View File

@ -20,11 +20,15 @@ type
fSourcePath: string;
fLibFile: string;
fProjFile: string;
fEnabled: boolean;
published
property libAlias: string read fAlias write fAlias;
property libSourcePath: string read fSourcePath write fSourcePath;
property libFile: string read fLibFile write fLibFile;
property projectFile: string read fProjFile write fProjFile;
property enabled: boolean read fEnabled write fEnabled default true;
public
constructor Create(ACollection: TCollection); override;
end;
(**
@ -33,7 +37,7 @@ type
TLibraryManager = class(TWritableLfmTextComponent)
private
fCol: TCollection;
procedure setCol(const aValue: TCollection);
procedure setCol(value: TCollection);
published
property libraries: TCollection read fCol write setCol;
public
@ -54,6 +58,12 @@ var
implementation
constructor TLibraryItem.Create(ACollection: TCollection);
begin
inherited create(ACollection);
fEnabled:=true;
end;
constructor TLibraryManager.create(aOwner: TComponent);
var
fName: string;
@ -148,9 +158,9 @@ begin
inherited;
end;
procedure TLibraryManager.setCol(const aValue: TCollection);
procedure TLibraryManager.setCol(value: TCollection);
begin
fCol.assign(aValue);
fCol.assign(value);
end;
procedure TLibraryManager.updateDCD;
@ -166,7 +176,8 @@ begin
for i := 0 to fCol.Count-1 do
begin
itm := TLibraryItem(fCol.Items[i]);
str.Add(itm.libSourcePath);
if itm.enabled then
str.Add(itm.libSourcePath);
end;
DcdWrapper.addImportFolders(str);
finally
@ -188,8 +199,8 @@ begin
for i := 0 to fCol.Count-1 do
begin
itm := TLibraryItem(fCol.Items[i]);
if someAliases.isNotNil then
if someAliases.IndexOf(itm.libAlias) = -1 then
if (not itm.enabled) or
(someAliases.isNotNil and (someAliases.IndexOf(itm.libAlias) = -1)) then
continue;
// single lib files
if fileExists(itm.libFile) then
@ -232,8 +243,8 @@ begin
for i := 0 to fCol.Count-1 do
begin
itm := TLibraryItem(fCol.Items[i]);
if someAliases.isNotNil then
if someAliases.IndexOf(itm.libAlias) = -1 then
if (not itm.enabled) or
(someAliases.isNotNil and (someAliases.IndexOf(itm.libAlias) = -1)) then
continue;
//
if aList.IndexOf(itm.libSourcePath) <> -1 then

View File

@ -157,6 +157,15 @@ inherited CELibManEditorWidget: TCELibManEditorWidget
Spacing = 0
TabOrder = 11
end
object btnEnabled: TSpeedButton
Left = 196
Height = 26
Hint = 'disable or enable this library, without removing it from the collection'
Top = 0
Width = 28
Align = alLeft
OnClick = btnEnabledClick
end
end
object List: TListView[1]
Left = 4
@ -184,7 +193,12 @@ inherited CELibManEditorWidget: TCELibManEditorWidget
item
AutoSize = True
Caption = 'project'
Width = 409
Width = 54
end
item
AutoSize = True
Caption = 'enabled'
Width = 355
end>
GridLines = True
HideSelection = False

View File

@ -8,7 +8,8 @@ uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, ComCtrls, Buttons, LazFileUtils, strutils, fphttpclient, StdCtrls,
ce_widget, ce_interfaces, ce_nativeproject, ce_dmdwrap, ce_common, ce_dialogs,
ce_sharedres, process, ce_dubproject, ce_observer, ce_dlang, ce_stringrange;
ce_sharedres, process, ce_dubproject, ce_observer, ce_dlang, ce_stringrange,
ce_libman;
type
@ -39,7 +40,9 @@ type
btnSelProj: TBitBtn;
List: TListView;
Panel1: TPanel;
btnEnabled: TSpeedButton;
procedure btnAddLibClick(Sender: TObject);
procedure btnEnabledClick(Sender: TObject);
procedure btnDubFetchClick(Sender: TObject);
procedure btnEditAliasClick(Sender: TObject);
procedure btnOpenProjClick(Sender: TObject);
@ -63,9 +66,10 @@ type
procedure projFocused(aProject: ICECommonProject);
procedure projCompiling(aProject: ICECommonProject);
procedure projCompiled(aProject: ICECommonProject; success: boolean);
function itemForRow(row: TListItem): TLibraryItem;
procedure RowToLibrary(row: TListItem);
//
procedure dataToGrid;
procedure gridToData;
protected
procedure DoShow; override;
public
@ -76,14 +80,12 @@ type
function sourceRoot(project: ICECommonProject): string;
implementation
{$R *.lfm}
uses
ce_libman;
const
notav: string = '< n/a >';
enableStr: array [boolean] of string = ('false','true');
constructor TCELibManEditorWidget.Create(aOwner: TComponent);
begin
@ -100,6 +102,7 @@ begin
AssignPng(btnDubFetch, 'dub_small');
AssignPng(btnSelProj, 'script_bricks');
AssignPng(btnOpenProj, 'book_open');
AssignPng(btnEnabled, 'book');
end;
procedure TCELibManEditorWidget.updateButtonsState;
@ -108,6 +111,10 @@ begin
fProj.Filename.fileExists;
btnOpenProj.Enabled := List.Selected.isNotNil and
List.Selected.SubItems[2].fileExists;
if List.Selected.isNotNil and itemForRow(List.Selected).enabled then
AssignPng(btnEnabled, 'book')
else
AssignPng(btnEnabled, 'book_grey');
end;
procedure TCELibManEditorWidget.projNew(aProject: ICECommonProject);
@ -146,9 +153,15 @@ procedure TCELibManEditorWidget.projCompiled(aProject: ICECommonProject; success
begin
end;
function TCELibManEditorWidget.itemForRow(row: TListItem): TLibraryItem;
begin
result := TLibraryItem(row.Data);
end;
procedure TCELibManEditorWidget.ListEdited(Sender: TObject; Item: TListItem; var AValue: string);
begin
gridToData;
if Item.isNotNil then
RowToLibrary(item);
end;
procedure TCELibManEditorWidget.ListSelectItem(Sender: TObject;
@ -162,10 +175,12 @@ var
itm: TListItem;
begin
itm := List.Items.Add;
itm.Data := LibMan.libraries.Add;
itm.Caption := notav;
itm.SubItems.Add(notav);
itm.SubItems.Add(notav);
itm.SubItems.Add(notav);
itm.SubItems.Add(enableStr[true]);
SetFocus;
itm.Selected := True;
end;
@ -272,8 +287,8 @@ var
err: integer;
idx: integer;
prj: TCEDubProject;
cdy: string;
upd: boolean = false;
row: TListItem;
begin
if TDubPackageQueryForm.showAndWait(nme) <> mrOk then
exit;
@ -374,15 +389,15 @@ begin
try
for idx := 0 to prj.sourcesCount-1 do
str.Add(prj.sourceAbsolute(idx));
with List.Items.Add do
begin
Caption := nme;
SubItems.Add(prj.outputFilename);
cdy := sourceRoot(prj as ICECommonProject);
SubItems.Add(cdy);
SubItems.Add(prj.filename);
Selected:=true;
end;
row := List.Items.Add;
row.Data := LibMan.libraries.Add;
row.Caption := nme;
row.SubItems.Add(prj.outputFilename);
row.SubItems.Add(sourceRoot(prj as ICECommonProject));
row.SubItems.Add(prj.filename);
row.SubItems.Add(enableStr[true]);
row.Selected:=true;
RowToLibrary(row);
finally
str.Free;
end;
@ -392,7 +407,6 @@ begin
finally
prj.Free;
EntitiesConnector.endUpdate;
gridToData;
end;
end;
@ -405,7 +419,20 @@ begin
al := List.Selected.Caption;
if inputQuery('library alias', '', al) then
List.Selected.Caption := al;
gridToData;
RowToLibrary(List.Selected);
end;
procedure TCELibManEditorWidget.btnEnabledClick(Sender: TObject);
begin
if List.Selected.isNil then
exit;
if List.Selected.SubItems[3] = 'true' then
List.Selected.SubItems[3] := 'false'
else
List.Selected.SubItems[3] := 'true';
RowToLibrary(List.Selected);
updateButtonsState;
end;
procedure TCELibManEditorWidget.btnOpenProjClick(Sender: TObject);
@ -447,6 +474,7 @@ var
fname: string;
root: string;
lalias: string;
row: TListItem;
begin
if fProj = nil then exit;
//
@ -469,21 +497,21 @@ begin
end;
//
fname := fProj.outputFilename;
with List.Items.Add do
begin
Caption := ExtractFileNameOnly(fname);
if fname.extractFileExt <> libExt then
SubItems.add(fname + libExt)
else
SubItems.add(fname);
SubItems.add(root);
SubItems.add(fProj.filename);
if not SubItems[0].fileExists then
dlgOkInfo('the library file does not exist, maybe the project not been already compiled ?');
Selected:= true;
end;
row := List.Items.Add;
row.Data := LibMan.libraries.Add;
row.Caption := ExtractFileNameOnly(fname);
if fname.extractFileExt <> libExt then
row.SubItems.add(fname + libExt)
else
row.SubItems.add(fname);
row.SubItems.add(root);
row.SubItems.add(fProj.filename);
row.SubItems.add(enableStr[true]);
if not row.SubItems[0].fileExists then
dlgOkInfo('the library file does not exist, maybe the project not been already compiled ?');
row.Selected:= true;
SetFocus;
gridToData;
RowToLibrary(row);
finally
str.free;
end;
@ -493,28 +521,27 @@ procedure TCELibManEditorWidget.btnRemLibClick(Sender: TObject);
begin
if List.Selected.isNil then
exit;
LibMan.libraries.Delete(List.Selected.Index);
List.Items.Delete(List.Selected.Index);
gridToData;
end;
procedure TCELibManEditorWidget.btnSelProjClick(Sender: TObject);
var
ini: string = '';
ini: string;
begin
if List.Selected.isNil then
exit;
if List.Selected.SubItems.Count > 2 then
ini := List.Selected.SubItems[2]
else while List.Selected.SubItems.Count < 3 do
List.Selected.SubItems.Add(ini);
with TOpenDialog.Create(nil) do try
//
ini := List.Selected.SubItems[2];
with TOpenDialog.Create(nil) do
try
FileName := ini;
if Execute then
List.Selected.SubItems[2] := FileName;
finally
free;
end;
gridToData;
RowToLibrary(List.Selected);
end;
procedure TCELibManEditorWidget.btnSelFileClick(Sender: TObject);
@ -523,28 +550,26 @@ var
begin
if List.Selected.isNil then
exit;
if List.Selected.SubItems.Count > 0 then
ini := List.Selected.SubItems[0]
else
List.Selected.SubItems.Add(ini);
//
ini := List.Selected.SubItems[0];
with TOpenDialog.Create(nil) do
try
filename := ini;
if Execute then
try
filename := ini;
if Execute then
begin
if not filename.fileExists then
List.Selected.SubItems[0] := filename.extractFilePath
else
begin
if not filename.fileExists then
List.Selected.SubItems[0] := filename.extractFilePath
else
begin
List.Selected.SubItems[0] := filename;
if (List.Selected.Caption.isEmpty) or (List.Selected.Caption = notav) then
List.Selected.Caption := ChangeFileExt(filename.extractFileName, '');
end;
List.Selected.SubItems[0] := filename;
if (List.Selected.Caption.isEmpty) or (List.Selected.Caption = notav) then
List.Selected.Caption := ChangeFileExt(filename.extractFileName, '');
end;
finally
Free;
end;
gridToData;
finally
Free;
end;
RowToLibrary(List.Selected);
end;
procedure TCELibManEditorWidget.btnSelfoldOfFilesClick(Sender: TObject);
@ -553,16 +578,11 @@ var
begin
if List.Selected.isNil then
exit;
if List.Selected.SubItems.Count > 0 then
dir := List.Selected.SubItems[0]
else
begin
dir := '';
List.Selected.SubItems.Add(dir);
end;
//
dir := List.Selected.SubItems[0];
if selectDirectory('folder of static libraries', dir, outdir, True, 0) then
List.Selected.SubItems[0] := outdir;
gridToData;
RowToLibrary(List.Selected);
end;
procedure TCELibManEditorWidget.btnSelRootClick(Sender: TObject);
@ -571,39 +591,39 @@ var
begin
if List.Selected.isNil then
exit;
if List.Selected.SubItems.Count > 1 then
dir := List.Selected.SubItems[1]
else
begin
dir := '';
while List.Selected.SubItems.Count < 2 do
List.Selected.SubItems.Add(dir);
end;
//
dir := List.Selected.SubItems[1];
if selectDirectory('sources root', dir, outdir, True, 0) then
List.Selected.SubItems[1] := outdir;
gridToData;
RowToLibrary(List.Selected);
end;
procedure TCELibManEditorWidget.btnMoveUpClick(Sender: TObject);
var
i: integer;
begin
if list.Selected.isNil then
exit;
if list.Selected.Index = 0 then
exit;
//
list.Items.Exchange(list.Selected.Index, list.Selected.Index - 1);
gridToData;
i := list.Selected.Index;
list.Items.Exchange(i, i - 1);
LibMan.libraries.Exchange(i, i - 1);
end;
procedure TCELibManEditorWidget.btnMoveDownClick(Sender: TObject);
var
i: integer;
begin
if list.Selected.isNil then
exit;
if list.Selected.Index = list.Items.Count - 1 then
exit;
//
list.Items.Exchange(list.Selected.Index, list.Selected.Index + 1);
gridToData;
i := list.Selected.Index;
list.Items.Exchange(i, i + 1);
LibMan.libraries.Exchange(i, i + 1);
end;
procedure TCELibManEditorWidget.DoShow;
@ -626,32 +646,30 @@ begin
begin
itm := TLibraryItem(LibMan.libraries.Items[i]);
row := List.Items.Add;
row.Data:= itm;
row.Caption := itm.libAlias;
row.SubItems.Add(itm.libFile);
row.SubItems.Add(itm.libSourcePath);
row.SubItems.Add(itm.projectFile);
row.SubItems.Add(enableStr[itm.enabled]);
end;
List.EndUpdate;
end;
procedure TCELibManEditorWidget.gridToData;
procedure TCELibManEditorWidget.RowToLibrary(row: TListItem);
var
itm: TLibraryItem;
row: TListItem;
begin
if LibMan.isNil then
itm := itemForRow(row);
if itm.isNil then
exit;
LibMan.libraries.BeginUpdate;
LibMan.libraries.Clear;
for row in List.Items do
begin
itm := TLibraryItem(LibMan.libraries.Add);
itm.libAlias := row.Caption;
itm.libFile := row.SubItems[0];
itm.libSourcePath := row.SubItems[1];
itm.projectFile:= row.SubItems[2];
end;
LibMan.libraries.EndUpdate;
itm.libAlias := row.Caption;
itm.libFile := row.SubItems[0];
itm.libSourcePath := row.SubItems[1];
itm.projectFile := row.SubItems[2];
itm.enabled := row.SubItems[3] = enableStr[true];
LibMan.updateDCD;
end;

View File

@ -1,2 +1,7 @@
- new symbolic strings, ENV_XXX, see issue #27
- fetch DUB package, list of online package can be displayed.
- fetch DUB package, list of online package can be displayed.
- libman, entries can be disabled without removal, example: useful when testing new dmd version with runnable, no need to recompile all libs of the registry.
- support for gdmd
- input process widget: kill process, in case of error, infinite loop, emergency kill
- editor note about usefull commands: comment selection, invert version all/none
- tuto are obsolete