Browse Source

UPD: Store light and dark color settings separately (step 4)

Alexander Koblov 2 years ago
parent
commit
56b6f9a035
2 changed files with 214 additions and 163 deletions
  1. 140 77
      src/dmhigh.pas
  2. 74 86
      src/ucolumns.pas

+ 140 - 77
src/dmhigh.pas

@@ -39,7 +39,6 @@ type
     destructor Destroy; override;
     procedure Assign(Source: TPersistent); override;
     function Clone: TdmHighl;
-    procedure CopyFrom(ASource: TdmHighl);
     function GetHighlighter(SynEdit: TCustomSynEdit; const sExtension: string): TSynCustomHighlighter;
     procedure SetHighlighter(SynEdit: TCustomSynEdit; Highlighter: TSynCustomHighlighter);
     property Highlighters[Index: Integer]: TSynCustomHighlighter read GetSyn;
@@ -51,21 +50,24 @@ type
   THighlighters = class
   private
     FStyle: Integer;
-    FStyles: array[0..Pred(THEME_COUNT)] of TdmHighl;
+    FStyles: array[0..Pred(THEME_COUNT)] of TJSONObject;
+  private
+    procedure LoadColors; overload;
+    procedure SaveColors; overload;
+    procedure LoadDefaults(const AKey: String; AConfig: TJSONObject); overload;
   public
     constructor Create;
+    destructor Destroy; override;
     procedure UpdateStyle;
-    procedure LoadDefaults;
-    function Current: TdmHighl;
+    procedure LoadDefaults; overload;
     procedure Load(const FileName: String); overload;
     procedure Save(const FileName: String); overload;
     procedure LoadColors(AConfig: TJSONObject); overload;
     procedure SaveColors(AConfig: TJSONObject); overload;
   end;
 
-function dmHighl: TdmHighl; inline;
-
 var
+  dmHighl: TdmHighl;
   gHighlighters: THighlighters;
 
 implementation
@@ -99,11 +101,6 @@ begin
     Result:= CompareStr(List[Index1], List[Index2]);
 end;
 
-function dmHighl: TdmHighl;
-begin
-  Result:= gHighlighters.Current;
-end;
-
 { TdmHighl }
 
 procedure TdmHighl.LoadColors(AConfig: TJSONObject);
@@ -582,22 +579,6 @@ begin
   end;
 end;
 
-procedure TdmHighl.CopyFrom(ASource: TdmHighl);
-var
-  I: Integer;
-  TargetHighlighter,
-  SourceHighlighter: TSynCustomHighlighter;
-begin
-  for I:= 0 to ASource.SynHighlighterList.Count - 1 do
-  begin
-    TargetHighlighter:= Self.Highlighters[I];
-    SourceHighlighter:= ASource.Highlighters[I];
-
-    TargetHighlighter.Tag:= SourceHighlighter.Tag;
-    TargetHighlighter.DefaultFilter:= SourceHighlighter.DefaultFilter;
-  end;
-end;
-
 function TdmHighl.GetHighlighter(SynEdit: TCustomSynEdit;
   const sExtension: string): TSynCustomHighlighter;
 var
@@ -654,16 +635,79 @@ end;
 
 { THighlighters }
 
-constructor THighlighters.Create;
+procedure THighlighters.LoadColors;
+var
+  AStyle: TJSONObject;
+begin
+  AStyle:= FStyles[FStyle];
+  dmHighl.LoadColors(AStyle);
+  dmHighl.LoadUniColors(AStyle);
+end;
+
+procedure THighlighters.SaveColors;
+var
+  AStyle: TJSONObject;
 begin
-  FStyle := TColorThemes.StyleIndex;
+  AStyle:= FStyles[FStyle];
+  dmHighl.SaveColors(AStyle);
+  dmHighl.SaveUniColors(AStyle);
+end;
+
+procedure THighlighters.LoadDefaults(const AKey: String; AConfig: TJSONObject);
+var
+  AName: String;
+  I, J: Integer;
+  Theme: TJSONObject;
+  Themes: TJSONArray;
+
+  procedure LoadItem(Index: Integer);
+  var
+    Idx: Integer;
+  begin
+    Idx:= Theme.IndexOfName(AKey);
+    if (Idx >= 0) then begin
+      FStyles[Index].Arrays[AKey]:= Theme.Extract(Idx) as TJSONArray;
+    end;
+  end;
 
-  FStyles[FStyle]:= TdmHighl.Create(Application, False);
-  FStyles[Abs(FStyle - 1)]:= FStyles[FStyle].Clone;
+begin
+  if AConfig.Find('Styles', Themes) then
+  begin
+    for I:= 0 to Themes.Count - 1 do
+    begin
+      Theme:= Themes.Objects[I];
+      AName:= Theme.Get('Name', EmptyStr);
+      for J:= 0 to High(THEME_NAME) do
+      begin
+        if (AName = THEME_NAME[J]) then
+        begin
+          LoadItem(J);
+          Break;
+        end;
+      end;
+    end;
+  end;
+end;
 
+constructor THighlighters.Create;
+begin
+  FStyle:= TColorThemes.StyleIndex;
+  dmHighl:= TdmHighl.Create(Application, False);
   LoadDefaults;
 end;
 
+destructor THighlighters.Destroy;
+var
+  Index: Integer;
+begin
+  inherited Destroy;
+
+  for Index:= 0 to High(FStyles) do
+  begin
+    FStyles[Index].Free;
+  end;
+end;
+
 procedure THighlighters.UpdateStyle;
 var
   ANewStyle: Integer;
@@ -672,22 +716,28 @@ begin
 
   if FStyle <> ANewStyle then
   begin
-    // Synchronize common options
-    FStyles[ANewStyle].CopyFrom(FStyles[FStyle]);
-    FStyle := ANewStyle;
+    SaveColors;
+    FStyle:= ANewStyle;
+    LoadColors;
   end;
 end;
 
 procedure THighlighters.LoadDefaults;
 var
+  Index: Integer;
   ARoot: TJSONObject;
   AStream: TResourceStream;
 begin
+  for Index:= 0 to High(FStyles) do
+  begin
+    FStyles[Index]:= TJSONObject.Create;
+    FStyles[Index].Add('UniHighlighters', TJSONArray.Create);
+  end;
   AStream:= TResourceStream.Create(HInstance, 'HIGHLIGHTERS', RT_RCDATA);
   try
     ARoot:= GetJSON(AStream, True) as TJSONObject;
     try
-      LoadColors(ARoot);
+      LoadDefaults('Highlighters', ARoot);
     finally
       ARoot.Free;
     end;
@@ -699,78 +749,89 @@ begin
     with TJsonConfig.Create do
     try
       LoadFromFile(gpHighPath + 'highlighters.json');
-      LoadColors(Root);
+      LoadDefaults('UniHighlighters', Root);
     finally
       Free;
     end;
   except
    // Ignore
   end;
-end;
-
-function THighlighters.Current: TdmHighl;
-begin
-  Result:= FStyles[FStyle];
+  LoadColors;
 end;
 
 procedure THighlighters.LoadColors(AConfig: TJSONObject);
 var
   AName: String;
-  Index: Integer;
+  I, J: Integer;
   Theme: TJSONObject;
   Themes: TJSONArray;
-begin
-  Themes:= AConfig.Get('Styles', TJSONArray(nil));
 
-  if Assigned(Themes) then
+  procedure LoadItem(const AKey: String; Index: Integer);
+  var
+    AItem: TJSONArray;
   begin
-    for Index:= 0 to Themes.Count - 1 do
+    if Theme.Find(AKey, AItem) then
     begin
-      Theme:= Themes.Objects[Index];
+      FStyles[Index].Arrays[AKey]:= AItem.Clone as TJSONArray;
+    end;
+  end;
+
+begin
+  if AConfig.Find('Styles', Themes) then
+  begin
+    for I:= 0 to Themes.Count - 1 do
+    begin
+      Theme:= Themes.Objects[I];
       AName:= Theme.Get('Name', EmptyStr);
-      if (AName = LIGHT_THEME) then
-      begin
-        FStyles[0].LoadColors(Theme);
-        FStyles[0].LoadUniColors(Theme);
-      end
-      else if (AName = DARK_THEME) then
+      for J:= 0 to High(THEME_NAME) do
       begin
-        FStyles[1].LoadColors(Theme);
-        FStyles[1].LoadUniColors(Theme);
-      end
+        if (AName = THEME_NAME[J]) then
+        begin
+          LoadItem('Highlighters', J);
+          LoadItem('UniHighlighters', J);
+          Break;
+        end;
+      end;
     end;
-   end;
+    LoadColors;
+  end;
 end;
 
 procedure THighlighters.SaveColors(AConfig: TJSONObject);
 var
   AName: String;
-  Index: Integer;
+  I, J: Integer;
   Theme: TJSONObject;
   Themes: TJSONArray;
-begin
-  if not AConfig.Find('Styles', Themes) then
+
+  procedure SaveItem(const AKey: String; Index: Integer);
+  var
+    AItem: TJSONArray;
   begin
-    Themes:= TJSONArray.Create;
-    AConfig.Add('Styles', Themes);
+    if FStyles[Index].Find(AKey, AItem) then
+    begin
+      Theme.Arrays[AKey]:= AItem.Clone as TJSONArray;
+    end;
   end;
 
-  if Assigned(Themes) then
+begin
+  SaveColors;
+
+  if AConfig.Find('Styles', Themes) then
   begin
-    for Index:= 0 to Themes.Count - 1 do
+    for I:= 0 to Themes.Count - 1 do
     begin
-      Theme:= Themes.Objects[Index];
+      Theme:= Themes.Objects[I];
       AName:= Theme.Get('Name', EmptyStr);
-      if (AName = LIGHT_THEME) then
-      begin
-        FStyles[0].SaveColors(Theme);
-        FStyles[0].SaveUniColors(Theme);
-      end
-      else if (AName = DARK_THEME) then
+      for J:= 0 to High(THEME_NAME) do
       begin
-        FStyles[1].SaveColors(Theme);
-        FStyles[1].SaveUniColors(Theme);
-      end
+        if (AName = THEME_NAME[J]) then
+        begin
+          SaveItem('Highlighters', J);
+          SaveItem('UniHighlighters', J);
+          Break;
+        end;
+      end;
     end;
   end;
 end;
@@ -797,7 +858,7 @@ begin
         while Assigned(FormNode) do
         begin
           LanguageName:= Config.GetAttr(FormNode, 'Name', EmptyStr);
-          Highlighter:= TSynCustomHighlighter(Current.SynHighlighterHashList.Data[LanguageName]);
+          Highlighter:= TSynCustomHighlighter(dmHighl.SynHighlighterHashList.Data[LanguageName]);
           if Assigned(Highlighter) then
           begin
             Highlighter.Tag := Config.GetAttr(FormNode, 'Tag', 1);
@@ -810,7 +871,7 @@ begin
               begin
                 while Assigned(AttributeNode) do
                 begin
-                  AttributeName:= Config.GetAttr(AttributeNode, 'Name', EmptyStr);;
+                  AttributeName:= Config.GetAttr(AttributeNode, 'Name', EmptyStr);
                   for J:= 0 to Highlighter.AttrCount - 1 do
                   begin
                     Attribute:= Highlighter.Attribute[J];
@@ -834,6 +895,8 @@ begin
           FormNode := FormNode.NextSibling;
         end;
       end;
+      // Import colors from old format
+      if AVersion < 2 then SaveColors;
     end;
   finally
     Config.Free;
@@ -853,7 +916,7 @@ begin
     Root := Config.FindNode(Config.RootNode, 'Highlighters', True);
     Config.ClearNode(Root);
     Config.SetAttr(Root, 'Version', ConfigVersion);
-    with Current do
+    with dmHighl do
     begin
       for I := 0 to SynHighlighterList.Count - 1 do
       begin

+ 74 - 86
src/ucolumns.pas

@@ -126,6 +126,8 @@ type
     function GetCursorBorderColor: TColor;
     function GetUseFrameCursor: Boolean;
     procedure SetUnique(const AValue: String);
+  protected
+    procedure AddColumn(AList: TJSONArray; AColumn: TPanelColumn);
   public
     constructor Create;
     destructor Destroy; override;
@@ -1050,12 +1052,31 @@ begin
   end;
 end;
 
+procedure TPanelColumnsClass.AddColumn(AList: TJSONArray; AColumn: TPanelColumn);
+var
+  AItem: TJSONObject;
+begin
+  AItem:= TJSONObject.Create;
+
+  AItem.Add('Unique', AColumn.Unique);
+  AItem.Add('Title', AColumn.Title);
+
+  AItem.Add('TextColor', AColumn.TextColor);
+  AItem.Add('Background', AColumn.Background);
+  AItem.Add('Background2', AColumn.Background2);
+  AItem.Add('MarkColor', AColumn.MarkColor);
+  AItem.Add('CursorColor', AColumn.CursorColor);
+  AItem.Add('CursorText', AColumn.CursorText);
+  AItem.Add('InactiveCursorColor', AColumn.InactiveCursorColor);
+  AItem.Add('InactiveMarkColor', AColumn.InactiveMarkColor);
+
+  AList.Add(AItem);
+end;
+
 procedure TPanelColumnsClass.SaveColors(ANode: TJSONObject);
 var
   I: Integer;
   AList: TJSONArray;
-  AItem: TJSONObject;
-  AColumn: TPanelColumn;
 begin
   ANode.Add('Unique', Unique);
   ANode.Add('Name', Name);
@@ -1070,22 +1091,7 @@ begin
 
   for I := 0 to FList.Count - 1 do
   begin
-    AItem:= TJSONObject.Create;
-    AColumn:= TPanelColumn(FList[I]);
-
-    AItem.Add('Unique', AColumn.Unique);
-    AItem.Add('Title', AColumn.Title);
-
-    AItem.Add('TextColor', AColumn.TextColor);
-    AItem.Add('Background', AColumn.Background);
-    AItem.Add('Background2', AColumn.Background2);
-    AItem.Add('MarkColor', AColumn.MarkColor);
-    AItem.Add('CursorColor', AColumn.CursorColor);
-    AItem.Add('CursorText', AColumn.CursorText);
-    AItem.Add('InactiveCursorColor', AColumn.InactiveCursorColor);
-    AItem.Add('InactiveMarkColor', AColumn.InactiveMarkColor);
-
-    AList.Add(AItem);
+    AddColumn(AList, TPanelColumn(FList[I]));
   end;
 end;
 
@@ -1106,36 +1112,19 @@ begin
     begin
       Found:= False;
       AColumn:= GetColumnItem(I);
-
       for J:= 0 to AList.Count - 1 do
       begin
         AItem:= AList.Objects[J];
         AName:= AItem.Get('Unique', EmptyStr);
-
         if AColumn.FUnique = AName then
         begin
           Found:= True;
           Break;
         end;
       end;
-
       if not Found then
       begin
-        AItem:= TJSONObject.Create;
-
-        AItem.Add('Unique', AColumn.Unique);
-        AItem.Add('Title', AColumn.Title);
-
-        AItem.Add('TextColor', AColumn.TextColor);
-        AItem.Add('Background', AColumn.Background);
-        AItem.Add('Background2', AColumn.Background2);
-        AItem.Add('MarkColor', AColumn.MarkColor);
-        AItem.Add('CursorColor', AColumn.CursorColor);
-        AItem.Add('CursorText', AColumn.CursorText);
-        AItem.Add('InactiveCursorColor', AColumn.InactiveCursorColor);
-        AItem.Add('InactiveMarkColor', AColumn.InactiveMarkColor);
-
-        AList.Add(AItem);
+        AddColumn(AList, AColumn);
       end;
     end;
     // Delete
@@ -1365,37 +1354,45 @@ begin
 end;
 
 constructor TPanelColumnsList.Create;
+var
+  Index: Integer;
 begin
-  FSet := TStringList.Create;
-  FStyles[0]:= TJSONArray.Create;
-  FStyles[1]:= TJSONArray.Create;
+  FSet:= TStringList.Create;
   FStyle:= TColorThemes.StyleIndex;
+  for Index:= 0 to High(FStyles) do
+  begin
+    FStyles[Index]:= TJSONArray.Create;
+  end;
 end;
 
 destructor TPanelColumnsList.Destroy;
 var
-  i: Integer;
+  Index: Integer;
 begin
   if Assigned(FSet) then
   begin
-    for i := 0 to Fset.Count - 1 do
-      TPanelColumnsClass(Fset.Objects[i]).Free;
+    for Index := 0 to Fset.Count - 1 do
+    begin
+      FSet.Objects[Index].Free;
+    end;
     FreeAndNil(FSet);
   end;
-
-  FStyles[0].Free;
-  FStyles[1].Free;
-
+  for Index:= 0 to High(FStyles) do
+  begin
+    FStyles[Index].Free;
+  end;
   inherited Destroy;
 end;
 
 procedure TPanelColumnsList.Clear;
 var
-  i: Integer;
+  Index: Integer;
 begin
-  for i := 0 to Fset.Count - 1 do
-    TPanelColumnsClass(Fset.Objects[i]).Free;
-  Fset.Clear;
+  for Index := 0 to Fset.Count - 1 do
+  begin
+    FSet.Objects[Index].Free;
+  end;
+  FSet.Clear;
 end;
 
 procedure TPanelColumnsList.UpdateStyle;
@@ -1517,66 +1514,57 @@ end;
 procedure TPanelColumnsList.LoadColors(AConfig: TJSONObject);
 var
   AName: String;
-  Index: Integer;
+  I, J: Integer;
   Style: TJSONArray;
   Theme: TJSONObject;
   Themes: TJSONArray;
-  Empty: TJSONArray;
 begin
-  Themes:= AConfig.Get('Styles', TJSONArray(nil));
-
-  if Assigned(Themes) then
+  if AConfig.Find('Styles', Themes) then
   begin
-    Empty:= TJSONArray.Create;
-    try
-      for Index:= 0 to Themes.Count - 1 do
+    for I:= 0 to Themes.Count - 1 do
+    begin
+      Theme:= Themes.Objects[I];
+      AName:= Theme.Get('Name', EmptyStr);
+      for J:= 0 to High(THEME_NAME) do
       begin
-        Theme:= Themes.Objects[Index];
-        AName:= Theme.Get('Name', EmptyStr);
-        if (AName = LIGHT_THEME) then
-        begin
-          FStyles[0].Free;
-          Style:= Theme.Get('ColumnSets', Empty);
-          FStyles[0]:= Style.Clone as TJSONArray;
-        end
-        else if (AName = DARK_THEME) then
+        if (AName = THEME_NAME[J]) then
         begin
-          FStyles[1].Free;
-          Style:= Theme.Get('ColumnSets', Empty);
-          FStyles[1]:= Style.Clone as TJSONArray;
-        end
+          if Theme.Find('ColumnSets', Style) then
+          begin
+            FStyles[J].Free;
+            FStyles[J]:= Style.Clone as TJSONArray;
+          end;
+          Break;
+        end;
       end;
-    finally
-      Empty.Free;
     end;
+    LoadColors;
   end;
-  LoadColors;
 end;
 
 procedure TPanelColumnsList.SaveColors(AConfig: TJSONObject);
 var
   AName: String;
-  Index: Integer;
+  I, J: Integer;
   Theme: TJSONObject;
   Themes: TJSONArray;
 begin
   SaveColors;
-  Themes:= AConfig.Get('Styles', TJSONArray(nil));
 
-  if Assigned(Themes) then
+  if AConfig.Find('Styles', Themes) then
   begin
-    for Index:= 0 to Themes.Count - 1 do
+    for I:= 0 to Themes.Count - 1 do
     begin
-      Theme:= Themes.Objects[Index];
+      Theme:= Themes.Objects[I];
       AName:= Theme.Get('Name', EmptyStr);
-      if (AName = LIGHT_THEME) then
+      for J:= 0 to High(THEME_NAME) do
       begin
-        Theme.Arrays['ColumnSets']:= FStyles[0].Clone as TJSONArray;
-      end
-      else if (AName = DARK_THEME) then
-      begin
-        Theme.Arrays['ColumnSets']:= FStyles[1].Clone as TJSONArray;
-      end
+        if (AName = THEME_NAME[J]) then
+        begin
+          Theme.Arrays['ColumnSets']:= FStyles[J].Clone as TJSONArray;
+          Break;
+        end;
+      end;
     end;
   end;
 end;