Browse Source

Bug 1816: Colored session icon does not display on high DPI

https://winscp.net/tracker/1816

Source commit: 33deb7c22884379e982598b849f6c3694c22d652
Martin Prikryl 6 years ago
parent
commit
73b5615589
3 changed files with 23 additions and 29 deletions
  1. 20 26
      source/forms/Login.cpp
  2. 2 2
      source/forms/Login.h
  3. 1 1
      source/windows/CustomWinConfiguration.h

+ 20 - 26
source/forms/Login.cpp

@@ -77,6 +77,9 @@ __fastcall TLoginDialog::TLoginDialog(TComponent* AOwner)
   // (so that CM_SHOWINGCHANGED handling is applied)
   UseSystemSettingsPre(this);
 
+  FFixedSessionImages = SessionImageList->Count;
+  DebugAssert(SiteColorMaskImageIndex == FFixedSessionImages - 1);
+
   FBasicGroupBaseHeight = BasicGroup->Height - BasicSshPanel->Height - BasicFtpPanel->Height;
   FNoteGroupOffset = NoteGroup->Top - (BasicGroup->Top + BasicGroup->Height);
   FUserNameLabel = UserNameLabel->Caption;
@@ -143,11 +146,9 @@ void __fastcall TLoginDialog::InitControls()
   CenterButtonImage(LoginButton);
 
   SelectScaledImageList(SessionImageList);
-  // have to recreate the site images
-  UpdateNodeImages();
   SelectScaledImageList(ActionImageList);
 
-  GenerateButtonImages();
+  GenerateImages();
 
   if (SessionTree->Items->Count > 0)
   {
@@ -155,7 +156,7 @@ void __fastcall TLoginDialog::InitControls()
   }
 }
 //---------------------------------------------------------------------
-void __fastcall TLoginDialog::GenerateButtonImages()
+void __fastcall TLoginDialog::GenerateImages()
 {
   // Generate button images.
   // The button does not support alpha channel,
@@ -166,6 +167,20 @@ void __fastcall TLoginDialog::GenerateButtonImages()
 
   LoginButton->ImageIndex = AddLoginButtonImage(true);
   LoginButton->DisabledImageIndex = AddLoginButtonImage(false);
+
+  SessionImageList->BeginUpdate();
+  try
+  {
+    while (SessionImageList->Count > FFixedSessionImages)
+    {
+      SessionImageList->Delete(SessionImageList->Count - 1);
+    }
+    RegenerateSessionColorsImageList(SessionImageList, SiteColorMaskImageIndex);
+  }
+  __finally
+  {
+    SessionImageList->EndUpdate();
+  }
 }
 //---------------------------------------------------------------------
 int __fastcall TLoginDialog::AddLoginButtonImage(bool Enabled)
@@ -324,27 +339,6 @@ TTreeNode * __fastcall TLoginDialog::AddSession(TSessionData * Data)
   return Node;
 }
 //---------------------------------------------------------------------------
-void __fastcall TLoginDialog::UpdateNodeImages()
-{
-  SessionTree->Images->BeginUpdate();
-  try
-  {
-    TTreeNode * Node = SessionTree->Items->GetFirstNode();
-    while (Node != NULL)
-    {
-      if (IsSiteNode(Node))
-      {
-        UpdateNodeImage(Node);
-      }
-      Node = Node->GetNext();
-    }
-  }
-  __finally
-  {
-    SessionTree->Images->EndUpdate();
-  }
-}
-//---------------------------------------------------------------------------
 void __fastcall TLoginDialog::UpdateNodeImage(TTreeNode * Node)
 {
   SetNodeImage(Node, GetSessionImageIndex(GetNodeSession(Node)));
@@ -1597,7 +1591,7 @@ void __fastcall TLoginDialog::WMMoving(TMessage & Message)
 void __fastcall TLoginDialog::CMDpiChanged(TMessage & Message)
 {
   TForm::Dispatch(&Message);
-  GenerateButtonImages();
+  GenerateImages();
   CenterButtonImage(LoginButton);
 }
 //---------------------------------------------------------------------------

+ 2 - 2
source/forms/Login.h

@@ -317,6 +317,7 @@ private:
   int FSiteButtonsPadding;
   UnicodeString FUserNameLabel;
   UnicodeString FPasswordLabel;
+  int FFixedSessionImages;
 
   void __fastcall LoadSession(TSessionData * SessionData);
   void __fastcall LoadContents();
@@ -384,7 +385,6 @@ private:
   bool __fastcall IsCloneToNewSiteDefault();
   bool __fastcall IsDefaultResult(TModalResult Result);
   void __fastcall UpdateNodeImage(TTreeNode * Node);
-  void __fastcall UpdateNodeImages();
   int __fastcall GetSessionImageIndex(TSessionData * Data);
   void __fastcall SetNodeImage(TTreeNode * Node, int ImageIndex);
   void __fastcall CancelEditing();
@@ -399,7 +399,7 @@ private:
   int __fastcall AddLoginButtonImage(bool Enabled);
   void __fastcall WMMoving(TMessage & Message);
   void __fastcall CMDpiChanged(TMessage & Message);
-  void __fastcall GenerateButtonImages();
+  void __fastcall GenerateImages();
 
 protected:
   void __fastcall Default();

+ 1 - 1
source/windows/CustomWinConfiguration.h

@@ -11,7 +11,7 @@
 // WM_WINSCP_USER + 6 was WM_LOG_UPDATE
 #define WM_MANAGES_CAPTION (WM_WINSCP_USER + 7)
 #define WM_WANTS_MOUSEWHEEL (WM_WINSCP_USER + 8)
-#define WM_CAN_DISPLAY_UPDATES (WM_WINSCP_USER + 10)
+#define WM_CAN_DISPLAY_UPDATES (WM_WINSCP_USER + 9)
 // CM_DPICHANGED + 10 (packages/my/PasTools.pas)
 #define WM_WANTS_MOUSEWHEEL_INACTIVE (WM_WINSCP_USER + 11)
 #define WM_WANTS_SCREEN_TIPS (WM_WINSCP_USER + 12)