Browse Source

installed scripts

johann 5 years ago
parent
commit
3ccc00e5c8

+ 4 - 0
lazpaint/lazpaintmainform.lfm

@@ -8608,6 +8608,10 @@ object FMain: TFMain
       Caption = 'Render'
       Caption = 'Render'
       Visible = False
       Visible = False
     end
     end
+    object MenuScript: TMenuItem
+      Caption = 'Script'
+      Visible = False
+    end
     object MenuHelp: TMenuItem
     object MenuHelp: TMenuItem
       Caption = 'Help'
       Caption = 'Help'
       Visible = False
       Visible = False

+ 2 - 1
lazpaint/lazpaintmainform.pas

@@ -28,6 +28,7 @@ type
   TFMain = class(TForm)
   TFMain = class(TForm)
     FileExport: TAction;
     FileExport: TAction;
     ExportPictureDialog: TSaveDialog;
     ExportPictureDialog: TSaveDialog;
+    MenuScript: TMenuItem;
     ToolOpenedCurve: TAction;
     ToolOpenedCurve: TAction;
     ToolPolyline: TAction;
     ToolPolyline: TAction;
     FileRunScript: TAction;
     FileRunScript: TAction;
@@ -976,7 +977,7 @@ begin
   m := TMainFormMenu.Create(LazPaintInstance, ActionList1);
   m := TMainFormMenu.Create(LazPaintInstance, ActionList1);
   m.DarkTheme := Config.GetDarkTheme;
   m.DarkTheme := Config.GetDarkTheme;
   m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
   m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
-    MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuHelp]);
+    MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuScript,MenuHelp]);
   m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
   m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
     Panel_Tool,Panel_PenFill,Panel_SwapColor,Panel_BackFill,Panel_ColorDiff,Panel_Grid,
     Panel_Tool,Panel_PenFill,Panel_SwapColor,Panel_BackFill,Panel_ColorDiff,Panel_Grid,
     Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,
     Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,

+ 69 - 2
lazpaint/umenu.pas

@@ -27,17 +27,21 @@ type
     FImageList: TImageList;
     FImageList: TImageList;
     procedure IconSizeItemClick(Sender: TObject);
     procedure IconSizeItemClick(Sender: TObject);
     procedure IconSizeMenuClick(Sender: TObject);
     procedure IconSizeMenuClick(Sender: TObject);
+    procedure Script_Click(Sender: TObject);
     procedure SetDarkTheme(AValue: boolean);
     procedure SetDarkTheme(AValue: boolean);
   protected
   protected
     FInstance: TLazPaintCustomInstance;
     FInstance: TLazPaintCustomInstance;
+    FInstalledScripts: TStringList;
     procedure AddMenus(AMenu: TMenuItem; AActionList: TActionList; AActionsCommaText: string; AIndex: integer = -1); overload;
     procedure AddMenus(AMenu: TMenuItem; AActionList: TActionList; AActionsCommaText: string; AIndex: integer = -1); overload;
     procedure AddMenus(AMenuName: string; AActionsCommaText: string); overload;
     procedure AddMenus(AMenuName: string; AActionsCommaText: string); overload;
+    procedure AddInstalledScripts(AMenu: TMenuItem; AIndex: integer = -1);
     procedure ApplyShortcuts;
     procedure ApplyShortcuts;
     procedure ActionShortcut(AName: string; AShortcut: TUTF8Char);
     procedure ActionShortcut(AName: string; AShortcut: TUTF8Char);
     procedure ApplyTheme;
     procedure ApplyTheme;
     function GetIndividualToolbarHeight: integer;
     function GetIndividualToolbarHeight: integer;
   public
   public
     constructor Create(AInstance: TLazPaintCustomInstance; AActionList: TActionList);
     constructor Create(AInstance: TLazPaintCustomInstance; AActionList: TActionList);
+    destructor Destroy; override;
     procedure PredefinedMainMenus(const AMainMenus: array of TMenuItem);
     procedure PredefinedMainMenus(const AMainMenus: array of TMenuItem);
     procedure Toolbars(const AToolbars: array of TPanel; AToolbarBackground: TPanel);
     procedure Toolbars(const AToolbars: array of TPanel; AToolbarBackground: TPanel);
     procedure CycleTool(var ATool: TPaintToolType; var AShortCut: TUTF8Char);
     procedure CycleTool(var ATool: TPaintToolType; var AShortCut: TUTF8Char);
@@ -53,7 +57,8 @@ implementation
 
 
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
   StdCtrls, BGRAText, math, udarktheme,
   StdCtrls, BGRAText, math, udarktheme,
-  ugraph, BGRABitmapTypes, LCVectorialFillControl;
+  ugraph, BGRABitmapTypes, LCVectorialFillControl,
+  UPython;
 
 
 { TMainFormMenu }
 { TMainFormMenu }
 
 
@@ -68,6 +73,19 @@ begin
     menu.Items[i].Checked := (menu.Items[i].Tag = iconSize);
     menu.Items[i].Checked := (menu.Items[i].Tag = iconSize);
 end;
 end;
 
 
+procedure TMainFormMenu.Script_Click(Sender: TObject);
+var
+  item: TMenuItem;
+  scriptIndex: integer;
+begin
+  if Assigned(FInstalledScripts) then
+  begin
+    item := Sender as TMenuItem;
+    scriptIndex := item.Tag;
+    FInstance.RunScript(FInstalledScripts[scriptIndex]);
+  end;
+end;
+
 procedure TMainFormMenu.SetDarkTheme(AValue: boolean);
 procedure TMainFormMenu.SetDarkTheme(AValue: boolean);
 begin
 begin
   if FDarkTheme=AValue then Exit;
   if FDarkTheme=AValue then Exit;
@@ -124,6 +142,11 @@ begin
       AIndex := -1;
       AIndex := -1;
       Continue;
       Continue;
     end;
     end;
+    if actions[i]='InstalledScripts' then
+    begin
+      AddInstalledScripts(AMenu, AIndex);
+      continue;
+    end;
     item := TMenuItem.Create(nil);
     item := TMenuItem.Create(nil);
     if trim(actions[i]) = '-' then
     if trim(actions[i]) = '-' then
       item.Caption := cLineCaption
       item.Caption := cLineCaption
@@ -216,6 +239,43 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TMainFormMenu.AddInstalledScripts(AMenu: TMenuItem; AIndex: integer);
+var
+  path, fullname, header, title: String;
+  searchRec: TSearchRec;
+  t: textFile;
+  item: TMenuItem;
+begin
+  if FInstalledScripts = nil then FInstalledScripts := TStringList.Create;
+  path := TPythonScript.DefaultScriptDirectory;
+  if FindFirstUTF8(path+PathDelim+'*.py', faAnyFile, searchRec)=0 then
+  begin
+    try
+      repeat
+        fullname := path+PathDelim+searchRec.Name;
+        if FileExistsUTF8(fullname) then
+        begin
+          assignFile(t, fullname);
+          reset(t);
+          readln(t, header);
+          closefile(t);
+          if header.StartsWith('#') then
+          begin
+            title := header.Substring(1).Trim;
+            item := TMenuItem.Create(AMenu);
+            item.Caption := title;
+            item.Tag := FInstalledScripts.Add(fullname);
+            item.OnClick:=@Script_Click;
+            AMenu.Add(item);
+          end;
+        end;
+      until FindNextUTF8(searchRec)<>0;
+    finally
+      FindCloseUTF8(searchRec);
+    end;
+  end;
+end;
+
 procedure TMainFormMenu.ActionShortcut(AName: string; AShortcut: TUTF8Char);
 procedure TMainFormMenu.ActionShortcut(AName: string; AShortcut: TUTF8Char);
 var foundAction: TBasicAction;
 var foundAction: TBasicAction;
   ShortcutStr: string;
   ShortcutStr: string;
@@ -280,6 +340,12 @@ begin
   FToolbarsHeight := 0;
   FToolbarsHeight := 0;
 end;
 end;
 
 
+destructor TMainFormMenu.Destroy;
+begin
+  FInstalledScripts.Free;
+  inherited Destroy;
+end;
+
 procedure TMainFormMenu.PredefinedMainMenus(const AMainMenus: array of TMenuItem);
 procedure TMainFormMenu.PredefinedMainMenus(const AMainMenus: array of TMenuItem);
 var i: NativeInt;
 var i: NativeInt;
 begin
 begin
@@ -343,7 +409,7 @@ begin
   with FActionList.Actions[i] as TAction do
   with FActionList.Actions[i] as TAction do
     if (Caption = '') and (Hint <> '') then Caption := Hint;
     if (Caption = '') and (Hint <> '') then Caption := Hint;
 
 
-  AddMenus('MenuFile',   'FileNew,FileOpen,LayerFromFile,FileChooseEntry,FileReload,MenuRecentFiles,-,FileSave,FileSaveAsInSameFolder,FileSaveAs,FileExport,-,FileRunScript,FileImport3D,-,FilePrint,-,'+ImageBrowser+'FileRememberSaveFormat,ForgetDialogAnswers,MenuLanguage,*');
+  AddMenus('MenuFile',   'FileNew,FileOpen,LayerFromFile,FileChooseEntry,FileReload,MenuRecentFiles,-,FileSave,FileSaveAsInSameFolder,FileSaveAs,FileExport,-,FileImport3D,-,FilePrint,-,'+ImageBrowser+'FileRememberSaveFormat,ForgetDialogAnswers,MenuLanguage,*');
   AddMenus('MenuEdit',   'EditUndo,EditRedo,-,EditCut,EditCopy,EditPaste,EditPasteAsNew,EditPasteAsNewLayer,EditDeleteSelection,-,EditMoveUp,EditMoveToFront,EditMoveDown,EditMoveToBack,EditShapeAlign,EditShapeToCurve');
   AddMenus('MenuEdit',   'EditUndo,EditRedo,-,EditCut,EditCopy,EditPaste,EditPasteAsNew,EditPasteAsNewLayer,EditDeleteSelection,-,EditMoveUp,EditMoveToFront,EditMoveDown,EditMoveToBack,EditShapeAlign,EditShapeToCurve');
   AddMenus('MenuSelect', 'EditSelection,FileLoadSelection,FileSaveSelectionAs,-,EditSelectAll,EditInvertSelection,EditSelectionFit,EditDeselect,-,ToolSelectRect,ToolSelectEllipse,ToolSelectPoly,ToolSelectSpline,-,ToolMoveSelection,ToolRotateSelection,SelectionHorizontalFlip,SelectionVerticalFlip,-,ToolSelectPen,ToolMagicWand');
   AddMenus('MenuSelect', 'EditSelection,FileLoadSelection,FileSaveSelectionAs,-,EditSelectAll,EditInvertSelection,EditSelectionFit,EditDeselect,-,ToolSelectRect,ToolSelectEllipse,ToolSelectPoly,ToolSelectSpline,-,ToolMoveSelection,ToolRotateSelection,SelectionHorizontalFlip,SelectionVerticalFlip,-,ToolSelectPen,ToolMagicWand');
   AddMenus('MenuView',   'ViewGrid,ViewZoomOriginal,ViewZoomIn,ViewZoomOut,ViewZoomFit,-,ViewToolBox,ViewColors,ViewPalette,ViewLayerStack,ViewImageList,ViewStatusBar,-,*,-,ViewDarkTheme,ViewWorkspaceColor,MenuIconSize');
   AddMenus('MenuView',   'ViewGrid,ViewZoomOriginal,ViewZoomIn,ViewZoomOut,ViewZoomFit,-,ViewToolBox,ViewColors,ViewPalette,ViewLayerStack,ViewImageList,ViewStatusBar,-,*,-,ViewDarkTheme,ViewWorkspaceColor,MenuIconSize');
@@ -354,6 +420,7 @@ begin
   AddMenus('MenuColors', 'ColorCurves,ColorPosterize,ColorColorize,ColorShiftColors,FilterComplementaryColor,ColorIntensity,-,ColorLightness,FilterNegative,FilterLinearNegative,FilterNormalize,FilterGrayscale');
   AddMenus('MenuColors', 'ColorCurves,ColorPosterize,ColorColorize,ColorShiftColors,FilterComplementaryColor,ColorIntensity,-,ColorLightness,FilterNegative,FilterLinearNegative,FilterNormalize,FilterGrayscale');
   AddMenus('MenuTool',   'ToolHand,ToolHotSpot,ToolColorPicker,-,ToolPen,ToolBrush,ToolEraser,ToolFloodFill,ToolClone,-,ToolEditShape,ToolRect,ToolEllipse,ToolPolyline,ToolOpenedCurve,ToolPolygon,ToolSpline,ToolGradient,ToolPhong,ToolText,-,ToolDeformation,ToolTextureMapping');
   AddMenus('MenuTool',   'ToolHand,ToolHotSpot,ToolColorPicker,-,ToolPen,ToolBrush,ToolEraser,ToolFloodFill,ToolClone,-,ToolEditShape,ToolRect,ToolEllipse,ToolPolyline,ToolOpenedCurve,ToolPolygon,ToolSpline,ToolGradient,ToolPhong,ToolText,-,ToolDeformation,ToolTextureMapping');
   AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain');
   AddMenus('MenuRender', 'RenderPerlinNoise,RenderCyclicPerlinNoise,-,RenderWater,RenderCustomWater,RenderSnowPrint,RenderWood,RenderWoodVertical,RenderMetalFloor,RenderPlastik,RenderStone,RenderRoundStone,RenderMarble,RenderCamouflage,-,RenderClouds,FilterRain');
+  AddMenus('MenuScript', 'FileRunScript,-,InstalledScripts');
   AddMenus('MenuHelp',   'HelpIndex,-,HelpAbout');
   AddMenus('MenuHelp',   'HelpIndex,-,HelpAbout');
   for i := 0 to high(FMainMenus) do
   for i := 0 to high(FMainMenus) do
     if FMainMenus[i].Count = 0 then FMainMenus[i].visible := false;
     if FMainMenus[i].Count = 0 then FMainMenus[i].visible := false;

+ 1 - 0
scripts/fractal_tree.py

@@ -1,3 +1,4 @@
+# Render fractal tree
 from lazpaint import tools, image, layer, dialog
 from lazpaint import tools, image, layer, dialog
 import math, random
 import math, random
 
 

+ 1 - 0
scripts/layer_shadow.py

@@ -1,3 +1,4 @@
+# Layer shadow
 from lazpaint import dialog
 from lazpaint import dialog
 
 
 try:
 try:

+ 1 - 0
scripts/render_lava.py

@@ -1,3 +1,4 @@
+# Render Lava
 from lazpaint import image, layer, filters, colors
 from lazpaint import image, layer, filters, colors
 
 
 image.do_begin()
 image.do_begin()

+ 1 - 0
scripts/split_rgb.py

@@ -1,3 +1,4 @@
+# Split RGB channels
 from lazpaint import image, layer, tools, colors
 from lazpaint import image, layer, tools, colors
 
 
 image.do_begin()
 image.do_begin()