Simon Grossenbacher 3 жил өмнө
parent
commit
94a658008f

+ 51 - 9
Example Config.rdproj

@@ -1,8 +1,7 @@
 {
 	"Presets": {
-		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n:GET: Simple GET\r\n",
-		"LastUsed": "c02b437c22474cf7b44a96c72f430f18",
-		"ConfigVersion": 2
+		"LastUsed": "f08ab155a960412e988e2decdcd05d1e",
+		"ConfigVersion": 3
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
 		"BaseURL": "%BaseURL%/get",
@@ -15,6 +14,9 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": true,
+		"PresetName": "GET: Simple GET",
+		"Guid": "faf2be76254543f9ad9cc8fca91cef5e",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_7d37b798c22748eebf92ffa281ba982a": {
@@ -28,6 +30,9 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": false,
+		"PresetName": "GET: GET Extra Headers",
+		"Guid": "7d37b798c22748eebf92ffa281ba982a",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_777045dda27d466fab6c051d3e8094e8": {
@@ -41,6 +46,9 @@
 		"AuthUsername": "3f0k+uBHWf2sPtwW4tYMUA==",
 		"AuthPassword": "C35R83xuSqKQ93OJME1BZA==",
 		"ResponseAutoFormat": false,
+		"PresetName": "GET: Use Basic Auth Example",
+		"Guid": "777045dda27d466fab6c051d3e8094e8",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_a0745bab53eb4c78a6034f1a9d4559de": {
@@ -54,6 +62,9 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": false,
+		"PresetName": "GET: Example URL Parameters",
+		"Guid": "a0745bab53eb4c78a6034f1a9d4559de",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_292047e733934bc48429c4d746cae53a": {
@@ -67,7 +78,10 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": true,
-		"Category": "Main"
+		"PresetName": "POST: Json Post Data",
+		"Guid": "292047e733934bc48429c4d746cae53a",
+		"Notes": "",
+		"Category": ""
 	},
 	"Preset_c02b437c22474cf7b44a96c72f430f18": {
 		"BaseURL": "%BaseURL%/delete",
@@ -80,6 +94,9 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": false,
+		"PresetName": "DELETE: Delete Data",
+		"Guid": "c02b437c22474cf7b44a96c72f430f18",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_9609fe373b9b4865a2ea83a3dd35be30": {
@@ -93,26 +110,48 @@
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": false,
+		"PresetName": "PUT: Json Put Data",
+		"Guid": "9609fe373b9b4865a2ea83a3dd35be30",
+		"Notes": "",
 		"Category": ""
 	},
 	"Preset_cbbcebba6f30425caec540f517cb3524": {
-		"BaseURL": "%BaseURL%/patch",
-		"Method": 2,
+		"BaseURL": "",
+		"Method": 0,
 		"URLParams": "",
-		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"BaseURL\": \"%BaseURL%\"\r\n}",
+		"PostData": "",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
 		"ResponseAutoFormat": false,
+		"PresetName": "PATCH: Json Patch Data",
+		"Guid": "cbbcebba6f30425caec540f517cb3524",
+		"Notes": "",
 		"Category": ""
 	},
 	"Main": {
 		"GlobalVar": "fldType\tfldName\tfldValue\r\nStatic\t%CustomPostData%\tData 1\r\nRegEx\t(?<=User-Agent\": \")(?s)(.\\w*\\s\\w*\\s\\w*\\/)\\d*.\\d*.\\/g\t\r\nStatic\t%BaseURL%\thttps://httpbin.org\r\n",
-		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECAwYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABh1Db25kaXRpb25hbEZvcm1hdHRpbmdQcm92aWRlcgYkVGN4R3JpZENvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyAgEGBUNvdW50AgYCAAIA"
+		"GridViewPresets": "Bhlmcm1NYWluLmN4R3JpZERCVGFibGVWaWV3BhJUY3hHcmlkREJUYWJsZVZpZXcCCQYJU291cmNlRFBJAgYCYAYGRm9vdGVyAgkGBUZhbHNlBgpHcm91cEJ5Qm94AgkGBFRydWUGDEdyb3VwRm9vdGVycwICBgEABgpOZXdJdGVtUm93AgkGBUZhbHNlBhhFZGl0Rm9ybVVzZURlZmF1bHRMYXlvdXQCCQYEVHJ1ZQYTUm93VXNlRGVmYXVsdExheW91dAIJBgRUcnVlBh9Db2x1bW5zUXVpY2tDdXN0b21pemF0aW9uU29ydGVkAgkGBUZhbHNlBgdWZXJzaW9uAgIGAQECBAYYY3hHcmlkREJUYWJsZVZpZXdmbGROYW1lBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAAYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhxjeEdyaWREQlRhYmxlVmlld2ZsZENhdGVnb3J5Bg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgJ4Bg1BbGlnbm1lbnRIb3J6AgIGAQAGBUluZGV4AgYCAQYHVmlzaWJsZQIJBgRUcnVlBglTb3J0T3JkZXICCQYGc29Ob25lBglTb3J0SW5kZXgCBgLDvwYYV2FzVmlzaWJsZUJlZm9yZUdyb3VwaW5nAgkGBUZhbHNlBgpFeHByZXNzaW9uAgkSAAAAAAIABhljeEdyaWREQlRhYmxlVmlld2ZsZE5vdGVzBg9UY3hHcmlkREJDb2x1bW4CDAYJU291cmNlRFBJAgYCYAYRRmlsdGVyUm93T3BlcmF0b3ICAgYBAAYKR3JvdXBJbmRleAIGAsO/BhRJc0NoaWxkSW5NZXJnZWRHcm91cAIJBgVGYWxzZQYFV2lkdGgCBgPDqAMGDUFsaWdubWVudEhvcnoCAgYBAAYFSW5kZXgCBgICBgdWaXNpYmxlAgkGBFRydWUGCVNvcnRPcmRlcgIJBgZzb05vbmUGCVNvcnRJbmRleAIGAsO/BhhXYXNWaXNpYmxlQmVmb3JlR3JvdXBpbmcCCQYFRmFsc2UGCkV4cHJlc3Npb24CCRIAAAAAAgAGHUNvbmRpdGlvbmFsRm9ybWF0dGluZ1Byb3ZpZGVyBiRUY3hHcmlkQ29uZGl0aW9uYWxGb3JtYXR0aW5nUHJvdmlkZXICAQYFQ291bnQCBgIAAgA="
+	},
+	"Preset_NmVkNjE2OGZhOWNiNDFlNmI5Njc3YWEzMzk5YjQ2OGI=": {
+		"BaseURL": "",
+		"Method": 0,
+		"URLParams": "",
+		"PostData": "",
+		"ExtraHeaders": "",
+		"PostDataContentType": "application/json",
+		"ResponseAutoFormat": false,
+		"UseBasicAuth": false,
+		"AuthUsername": "",
+		"AuthPassword": "",
+		"PresetName": "hoi",
+		"Guid": "NmVkNjE2OGZhOWNiNDFlNmI5Njc3YWEzMzk5YjQ2OGI=",
+		"Notes": "",
+		"Category": ""
 	},
-	"Preset_": {
+	"Preset_f08ab155a960412e988e2decdcd05d1e": {
 		"BaseURL": "",
 		"Method": 0,
 		"URLParams": "",
@@ -123,6 +162,9 @@
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
+		"PresetName": "sali",
+		"Guid": "f08ab155a960412e988e2decdcd05d1e",
+		"Notes": "",
 		"Category": ""
 	}
 }

BIN
RESTDebugger.exe


+ 3 - 1
prj/RESTDebugger.dpr

@@ -9,7 +9,8 @@ uses
   _frmBiggerEditor in '..\src\_frmBiggerEditor.pas' {frmBiggerEditor},
   _frmSearch in '..\src\_frmSearch.pas' {frmSearch},
   _SearchTextHightlighterSynEditPlugin in '..\src\_SearchTextHightlighterSynEditPlugin.pas',
-  _frmVariables in '..\src\_frmVariables.pas' {frmVariables};
+  _frmVariables in '..\src\_frmVariables.pas' {frmVariables},
+  _frmAddEditPreset in '..\src\_frmAddEditPreset.pas' {frmAddEditPreset};
 
 {$R *.res}
 
@@ -20,5 +21,6 @@ begin
   Application.CreateForm(TfrmBiggerEditor, frmBiggerEditor);
   Application.CreateForm(TfrmSearch, frmSearch);
   Application.CreateForm(TfrmVariables, frmVariables);
+  Application.CreateForm(TfrmAddEditPreset, frmAddEditPreset);
   Application.Run;
 end.

+ 21 - 1
prj/RESTDebugger.dproj

@@ -1,7 +1,7 @@
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <PropertyGroup>
         <ProjectGuid>{EAAEC73B-CF16-46C3-A598-65374DE332E9}</ProjectGuid>
-        <ProjectVersion>19.1</ProjectVersion>
+        <ProjectVersion>19.2</ProjectVersion>
         <FrameworkType>VCL</FrameworkType>
         <MainSource>RESTDebugger.dpr</MainSource>
         <Base>True</Base>
@@ -169,6 +169,10 @@
             <Form>frmVariables</Form>
             <FormType>dfm</FormType>
         </DCCReference>
+        <DCCReference Include="..\src\_frmAddEditPreset.pas">
+            <Form>frmAddEditPreset</Form>
+            <FormType>dfm</FormType>
+        </DCCReference>
         <BuildConfiguration Include="Release">
             <Key>Cfg_2</Key>
             <CfgParent>Base</CfgParent>
@@ -211,6 +215,12 @@
                         <Overwrite>true</Overwrite>
                     </Platform>
                 </DeployFile>
+                <DeployFile LocalName="..\RESTDebugger.rsm" Configuration="Debug" Class="DebugSymbols">
+                    <Platform Name="Win64">
+                        <RemoteName>RESTDebugger.rsm</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
                 <DeployFile LocalName="..\RESTDebugger.exe" Configuration="Debug" Class="ProjectOutput">
                     <Platform Name="Win64">
                         <RemoteName>RESTDebugger.exe</RemoteName>
@@ -357,6 +367,16 @@
                         <Operation>1</Operation>
                     </Platform>
                 </DeployClass>
+                <DeployClass Name="Android_LauncherIcon192">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
                 <DeployClass Name="Android_LauncherIcon36">
                     <Platform Name="Android">
                         <RemoteDir>res\drawable-ldpi</RemoteDir>

+ 101 - 0
src/_frmAddEditPreset.dfm

@@ -0,0 +1,101 @@
+object frmAddEditPreset: TfrmAddEditPreset
+  Left = 0
+  Top = 0
+  BorderStyle = bsDialog
+  Caption = 'Preset'
+  ClientHeight = 333
+  ClientWidth = 482
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poMainFormCenter
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 13
+  object Label2: TLabel
+    Left = 25
+    Top = 100
+    Width = 65
+    Height = 13
+    Caption = 'Preset Name:'
+  end
+  object Label3: TLabel
+    Left = 25
+    Top = 127
+    Width = 49
+    Height = 13
+    Caption = 'Category:'
+  end
+  object Label4: TLabel
+    Left = 25
+    Top = 157
+    Width = 32
+    Height = 13
+    Caption = 'Notes:'
+  end
+  object cxButton1: TcxButton
+    Left = 140
+    Top = 295
+    Width = 75
+    Height = 25
+    Caption = 'Ok'
+    TabOrder = 0
+    OnClick = cxButton1Click
+  end
+  object cxButton2: TcxButton
+    Left = 225
+    Top = 295
+    Width = 75
+    Height = 25
+    Caption = 'Cancel'
+    TabOrder = 1
+    OnClick = cxButton2Click
+  end
+  object Panel1: TPanel
+    Left = 0
+    Top = 0
+    Width = 482
+    Height = 76
+    Align = alTop
+    BevelOuter = bvNone
+    Color = clWhite
+    ParentBackground = False
+    TabOrder = 2
+    object Label1: TLabel
+      Left = 25
+      Top = 31
+      Width = 37
+      Height = 13
+      Caption = 'Preset'
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'Tahoma'
+      Font.Style = [fsBold]
+      ParentFont = False
+    end
+  end
+  object edtPresetName: TcxTextEdit
+    Left = 105
+    Top = 97
+    TabOrder = 3
+    Width = 351
+  end
+  object edtCategory: TcxTextEdit
+    Left = 105
+    Top = 124
+    TabOrder = 4
+    Width = 351
+  end
+  object memNotes: TcxMemo
+    Left = 105
+    Top = 154
+    TabOrder = 5
+    Height = 117
+    Width = 351
+  end
+end

+ 55 - 0
src/_frmAddEditPreset.pas

@@ -0,0 +1,55 @@
+unit _frmAddEditPreset;
+
+interface
+
+uses
+  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
+  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, dxSkinsCore, dxSkinOffice2019Colorful,
+  cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, Vcl.Menus, Vcl.StdCtrls,
+  cxButtons, cxControls, cxContainer, cxEdit, cxMemo, cxTextEdit, Vcl.ExtCtrls;
+
+type
+  TfrmAddEditPreset = class(TForm)
+    cxButton1: TcxButton;
+    cxButton2: TcxButton;
+    Panel1: TPanel;
+    Label1: TLabel;
+    Label2: TLabel;
+    edtPresetName: TcxTextEdit;
+    edtCategory: TcxTextEdit;
+    Label3: TLabel;
+    Label4: TLabel;
+    memNotes: TcxMemo;
+    procedure cxButton1Click(Sender: TObject);
+    procedure cxButton2Click(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+  private
+    { Private-Deklarationen }
+  public
+    { Public-Deklarationen }
+  end;
+
+var
+  frmAddEditPreset: TfrmAddEditPreset;
+
+implementation
+
+{$R *.dfm}
+
+procedure TfrmAddEditPreset.cxButton1Click(Sender: TObject);
+begin
+  ModalResult := mrOk;
+end;
+
+procedure TfrmAddEditPreset.cxButton2Click(Sender: TObject);
+begin
+  ModalResult := mrCancel;
+  Close;
+end;
+
+procedure TfrmAddEditPreset.FormShow(Sender: TObject);
+begin
+  edtPresetName.SetFocus;
+end;
+
+end.

+ 19 - 4
src/_frmMain.dfm

@@ -167,7 +167,6 @@ object frmMain: TfrmMain
         TabWidth = 2
         WantTabs = True
         FontSmoothing = fsmNone
-        ExplicitTop = 32
       end
       object Panel2: TPanel
         Left = 0
@@ -236,7 +235,6 @@ object frmMain: TfrmMain
     Align = alTop
     BevelOuter = bvNone
     TabOrder = 0
-    ExplicitTop = 80
     DesignSize = (
       725
       370)
@@ -657,7 +655,6 @@ object frmMain: TfrmMain
         Navigator.Buttons.SaveBookmark.Visible = False
         Navigator.Buttons.GotoBookmark.Visible = False
         Navigator.Buttons.Filter.Visible = False
-        Navigator.Visible = True
         FindPanel.DisplayMode = fpdmAlways
         FindPanel.Location = fplGroupByBox
         ScrollbarAnnotations.CustomAnnotations = <>
@@ -667,7 +664,11 @@ object frmMain: TfrmMain
         DataController.Summary.SummaryGroups = <>
         OptionsBehavior.ImmediateEditor = False
         OptionsCustomize.ColumnHidingOnGrouping = False
-        OptionsData.Appending = True
+        OptionsData.Deleting = False
+        OptionsData.Editing = False
+        OptionsData.Inserting = False
+        OptionsSelection.CellSelect = False
+        OptionsSelection.HideFocusRectOnExit = False
         OptionsView.NoDataToDisplayInfoText = '<No presets>'
         object cxGridDBTableViewfldName: TcxGridDBColumn
           Caption = 'Name'
@@ -679,6 +680,11 @@ object frmMain: TfrmMain
           DataBinding.FieldName = 'fldCategory'
           Width = 120
         end
+        object cxGridDBTableViewfldNotes: TcxGridDBColumn
+          Caption = 'Notes'
+          DataBinding.FieldName = 'fldNotes'
+          Width = 1000
+        end
       end
       object cxGridLevel1: TcxGridLevel
         GridView = cxGridDBTableView
@@ -1966,10 +1972,19 @@ object frmMain: TfrmMain
       FieldName = 'fldCategory'
       Size = 50
     end
+    object memDataPresetsfldNotes: TStringField
+      FieldName = 'fldNotes'
+      Size = 1000
+    end
   end
   object dsPresets: TDataSource
     DataSet = memDataPresets
     Left = 375
     Top = 790
   end
+  object cxStyleRepository1: TcxStyleRepository
+    Left = 590
+    Top = 720
+    PixelsPerInch = 96
+  end
 end

+ 63 - 67
src/_frmMain.pas

@@ -138,6 +138,9 @@ type
     cxGridDBTableViewfldName: TcxGridDBColumn;
     cxGridDBTableViewfldCategory: TcxGridDBColumn;
     memDataPresetsfldGuid: TStringField;
+    cxStyleRepository1: TcxStyleRepository;
+    memDataPresetsfldNotes: TStringField;
+    cxGridDBTableViewfldNotes: TcxGridDBColumn;
     procedure FormShow(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -211,7 +214,6 @@ type
     FTempProjectFile: string;
     FRoamingSavePath: string;
     FSearchFromCaret: Boolean;
-    FPresetsList: TStringList;
     FHTTP: TIdHTTP;
     function GetTempProjectFile: string;
     function GetAppVersion: string;
@@ -220,8 +222,7 @@ type
     procedure SaveProject;
     procedure SaveProjectAs(const LoadAfterSave: Boolean);
     procedure Run;
-    procedure AddPreset(const APresetName: string);
-    procedure DeletePreset(const AID: Integer);
+    procedure AddPreset(const APresetName: string; const APresetCategory: string; APresetNote: string);
     procedure LoadPreset;
     procedure SavePreset;
     procedure ShowError(const AErrorText: string);
@@ -254,7 +255,7 @@ type
   end;
 
 const
-  iCurrentConfigVersion: Integer = 2;
+  iCurrentConfigVersion: Integer = 3;
 
 
 var
@@ -265,7 +266,8 @@ implementation
 {$R *.dfm}
 
 uses System.NetEncoding, System.UITypes, _EncryptStr, JsonDataObjects, IdGlobal, System.IOUtils, uRwXmlDOM,
-  _frmBiggerEditor, IdUri, _frmSearch, ShellApi, _frmVariables, RegularExpressions;
+  _frmBiggerEditor, IdUri, _frmSearch, ShellApi, _frmVariables, RegularExpressions,
+  _frmAddEditPreset;
 
 procedure TfrmMain.tbbtnRunClick(Sender: TObject);
 begin
@@ -354,41 +356,46 @@ begin
   end;
 end;
 
-procedure TfrmMain.AddPreset(const APresetName: string);
+procedure TfrmMain.AddPreset(const APresetName: string; const APresetCategory: string; APresetNote: string);
+var
+  guid: string;
 begin
-  ShowMessage('not implemented yet');
-//  FPresetsList.AddPair(GenerateGuid, Encode(APresetName));
-//  UpdatePresetsCombobox;
-//  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
-//
-//  FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+  guid := GenerateGuid;
+
+  memDataPresets.Append;
+  memDataPresetsfldName.Value := APresetName;
+  memDataPresetsfldCategory.Value := APresetCategory;
+  memDataPresetsfldNotes.Value := APresetNote;
+  memDataPresetsfldGuid.Value := guid;
+  memDataPresets.Post;
+
+  SavePreset;
 end;
 
 procedure TfrmMain.btnAddClick(Sender: TObject);
-var
-  dmy: string;
 begin
-  if InputQuery('Add Preset', 'Enter a preset name:', dmy) then
+  if frmAddEditPreset.ShowModal = mrOk then
   begin
-    AddPreset(dmy);
+    AddPreset(frmAddEditPreset.edtPresetName.Text, frmAddEditPreset.edtCategory.Text, frmAddEditPreset.memNotes.Text);
   end;
 end;
 
 procedure TfrmMain.btnDeleteClick(Sender: TObject);
 begin
-  ShowMessage('not implemented yet');
-//  if comboPresets.Properties.Items.Count = 1 then
-//  begin
-//    MessageDlg('Thet last preset can''t be deleted. Please create a new preset if you want to delete this.', mtError, [mbOK], 0);
-//  end
-//  else
-//  begin
-//    if MessageDlg('Really delete preset "' + comboPresets.Text + '"?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
-//    begin
-//      DeletePreset(comboPresets.ItemIndex);
-//      FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
-//    end;
-//  end;
+  if memDataPresets.RecordCount = 1 then
+  begin
+    MessageDlg('Thet last preset can''t be deleted. Please create a new preset if you want to delete this.', mtError, [mbOK], 0);
+  end
+  else
+  begin
+    if MessageDlg('Really delete preset "' + memDataPresetsfldName.Value + '"?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
+    begin
+      showmessage(memDataPresetsfldGuid.Value);
+      FProjectConfig.DeleteSection('Preset_' + memDataPresetsfldGuid.Value);
+      memDataPresets.Delete;
+      FProjectConfig.Save;
+    end;
+  end;
 end;
 
 procedure TfrmMain.btnEditClick(Sender: TObject);
@@ -427,8 +434,7 @@ procedure TfrmMain.btnCopyPresetClick(Sender: TObject);
 var
   idx: Integer;
 begin
-  ShowMessage('not implemented yet');
-//  SavePreset;
+  SavePreset;
 //  idx := comboPresets.ItemIndex;
 //  AddPreset('Copy of ' + comboPresets.Text);
 //  FProjectConfig.CopySection('Preset_' + FPresetsList.Names[idx], 'Preset_' + FPresetsList.Names[comboPresets.ItemIndex]);
@@ -662,20 +668,6 @@ begin
   ActiveEditor.CutToClipboard;
 end;
 
-procedure TfrmMain.DeletePreset(const AID: Integer);
-begin
-  ShowMessage('not implemented yet');
-//  comboPresets.Properties.OnChange := nil;
-//  comboPresets.Properties.Items.Delete(AID);
-//  FProjectConfig.DeleteSection('Preset_' + FPresetsList.Names[AID]);
-//  FPresetsList.Delete(AID);
-//  comboPresets.ItemIndex := comboPresets.Properties.Items.Count - 1;
-//
-//  //FActivePreset := comboPresets.Text;
-//  LoadPreset;
-//  //comboPresets.Properties.OnChange := comboPresetsPropertiesChange;
-end;
-
 function TfrmMain.Decode(const AText: string): string;
 begin
   Result := TNetEncoding.Base64.Decode(AText);
@@ -1021,8 +1013,6 @@ begin
   MainConfig := TJSONConfig.Create(FRoamingSavePath + 'AppConfig.json');
   FActiveProject := '';
 
-  FPresetsList := TStringList.Create;
-  FPresetsList.NameValueSeparator := ':';
 
   ActiveEditor := nil;
 
@@ -1066,7 +1056,6 @@ end;
 
 procedure TfrmMain.FormDestroy(Sender: TObject);
 begin
-  FPresetsList.Free;
   FProjectConfig.Free;
   MainConfig.Free;
 end;
@@ -1218,9 +1207,9 @@ end;
 
 procedure TfrmMain.LoadProject;
 var
-  strlist: TStringList;
   i: Integer;
   strstream: TStringStream;
+  strlist: TStringList;
 begin
   memDataPresets.AfterEdit := nil;
   memDataPresets.AfterScroll := nil;
@@ -1254,15 +1243,15 @@ begin
     //Upgrade config to newest version
     strlist := TStringList.Create;
     try
-      strlist.Text := FProjectConfig.ReadString('Presets', 'Presets');
-      FPresetsList.Clear;
+      strlist.NameValueSeparator := ':';
+      strlist.DelimitedText := FProjectConfig.ReadString('Presets', 'Presets');
       for i := 0 to strlist.Count - 1 do
       begin
-        FPresetsList.AddPair(GenerateGuid, Encode(strlist[i]));
-        FProjectConfig.RenameSection('Preset_' + i.ToString, 'Preset_' + FPresetsList.Names[i]);
+        FProjectConfig.WriteString('Preset_' + strlist.Names[i], 'PresetName', Decode(strlist.ValueFromIndex[i]));
+        FProjectConfig.WriteString('Preset_' + strlist.Names[i], 'Guid', strlist.Names[i]);
       end;
 
-      FProjectConfig.WriteString('Presets', 'Presets', FPresetsList.Text);
+      FProjectConfig.DeleteKey('Presets', 'Presets');
       FProjectConfig.WriteInteger('Presets', 'ConfigVersion', iCurrentConfigVersion);
       FProjectConfig.Save;
     finally
@@ -1270,19 +1259,25 @@ begin
     end;
   end;
 
-
-  FPresetsList.Clear;
-  FPresetsList.DelimitedText := FProjectConfig.ReadString('Presets', 'Presets');
-
   memDataPresets.Active := False;
   memDataPresets.Active := True;
   try
-    for i := 0 to FPresetsList.Count - 1 do
-    begin
-      memDataPresets.Append;
-      memDataPresetsfldGuid.Value := FPresetsList.Names[i];
-      memDataPresetsfldName.Value := Decode(FPresetsList.ValueFromIndex[i]);
-      memDataPresets.Post;
+    strlist := TStringList.Create;
+    try
+      FProjectConfig.ReadSections(strlist);
+      for i := 0 to strlist.Count - 1 do
+      begin
+        if Pos('Preset_', strlist[i]) = 1 then
+        begin
+          memDataPresets.Append;
+          memDataPresetsfldGuid.Value := FProjectConfig.ReadString(strlist[i], 'Guid');
+          memDataPresetsfldName.Value := FProjectConfig.ReadString(strlist[i], 'PresetName');
+          memDataPresetsfldNotes.Value := FProjectConfig.ReadString(strlist[i], 'Notes');
+          memDataPresets.Post;
+        end;
+      end;
+    finally
+      strlist.Free;
     end;
   finally
     memDataPresets.Active := True;
@@ -1293,7 +1288,7 @@ begin
   if memDataPresets.RecordCount = 0 then
   begin
     // Add default
-    AddPreset('Default');
+    AddPreset('Default', '', '');
     FProjectConfig.Save;
   end
   else
@@ -1653,6 +1648,9 @@ begin
     FProjectConfig.WriteString(preset, 'AuthUsername', TEncryptStr.EncryptString(edtAuthUsername.Text));
     FProjectConfig.WriteString(preset, 'AuthPassword', TEncryptStr.EncryptString(edtAuthPassword.Text));
 
+    FProjectConfig.WriteString(preset, 'PresetName', memDataPresetsfldName.Value);
+    FProjectConfig.WriteString(preset, 'Guid', memDataPresetsfldGuid.Value);
+    FProjectConfig.WriteString(preset, 'Notes', memDataPresetsfldNotes.Value);
     FProjectConfig.WriteString(preset, 'Category', memDataPresetsfldCategory.Value);
 
     FProjectConfig.WriteString('Presets', 'LastUsed', memDataPresetsfldGuid.Value);
@@ -1665,8 +1663,6 @@ var
 begin
   SavePreset;
 
-  FProjectConfig.WriteInteger('Presets', 'ConfigVersion', iCurrentConfigVersion);
-
   strlist := TStringList.Create;
   try
     memDataVariables.SaveToStrings(strlist);