From 156648c9d517fdd04aefd19e5cc72b527c6389b8 Mon Sep 17 00:00:00 2001 From: kichik Date: Tue, 18 Mar 2003 13:53:29 +0000 Subject: [PATCH] AddBrandingImage doesn't depend on the UI now. Can now set the branding image on the bottom and on the right too, and set a custom padding value git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2334 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/attributes.but | 4 ++-- Docs/src/ui.but | 2 +- Source/DialogTemplate.cpp | 20 ++++++++++++++++---- Source/DialogTemplate.h | 5 ++++- Source/script.cpp | 38 ++++++++++++++++++++++++++------------ Source/tokens.cpp | 2 +- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/Docs/src/attributes.but b/Docs/src/attributes.but index 7a76ab39..f213c3c8 100644 --- a/Docs/src/attributes.but +++ b/Docs/src/attributes.but @@ -8,9 +8,9 @@ The commands below all adjust attributes of the installer. These attributes cont \S2{aaddbrandingimage} AddBrandingImage -\c (left|top) (width|height) +\c (left|right|top|bottom) (width|height) [padding] -Adds a branding image on the top of the installer or on the left. Its size will be set according to the width/height specified, the installer width/height and the installer font. Because this depends on the installer font, you should put SetFont before AddBrandingImage. +Adds a branding image on the top, bottom, left, or right of the installer. Its size will be set according to the width/height specified, the installer width/height and the installer font. The final size will not always be the same as the what you have requsted. Have a look at the output of the command for the final size. Because this depends on the installer font, you should use SetFont before AddBrandingImage. The default padding value is 2. \S2{aallowrootdirinstall} AllowRootDirInstall diff --git a/Docs/src/ui.but b/Docs/src/ui.but index 6331c671..9238ab84 100644 --- a/Docs/src/ui.but +++ b/Docs/src/ui.but @@ -66,7 +66,7 @@ Overrides the default auto window-closing flag (specified for the installer usin \c [/IMGID=item_id_in_dialog] [/RESIZETOFIT] path_to_bitmap_file.bmp -Sets the current bitmap file displayed as the branding image. If no IMGID is specified, the first image control found will be used, or the image control created by AddBrandingImage. Note that this bitmap must be present on the user's machine. Use File first to put it there. If /RESIZETOFIT is specified the image will be automatically resized (very poorly) to the image control size. If you used AddBrandingImage you can get this size, by compiling your script and watching for AddBrandingImage output, it will tell you the size. SetBrandingImage will not work when called from .onInit! +Sets the current bitmap file displayed as the branding image. If no IMGID is specified, the first image control found will be used, or the image control created by \R{aaddbrandingimage}{AddBrandingImage}. Note that this bitmap must be present on the user's machine. Use File first to put it there. If /RESIZETOFIT is specified the image will be automatically resized (very poorly) to the image control size. If you used \R{aaddbrandingimage}{AddBrandingImage} you can get this size, by compiling your script and watching for \R{aaddbrandingimage}{AddBrandingImage} output, it will tell you the size. SetBrandingImage will not work when called from .onInit! \S2{setdetailsview} SetDetailsView diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp index 28a7f66b..6de8c86a 100644 --- a/Source/DialogTemplate.cpp +++ b/Source/DialogTemplate.cpp @@ -224,6 +224,16 @@ CDialogTemplate::~CDialogTemplate() { // Methods ////////////////////////////////////////////////////////////////////// +// Returns the width of the dialog +short CDialogTemplate::GetWidth() { + return m_sWidth; +} + +// Returns the height of the dialog +short CDialogTemplate::GetHeight() { + return m_sHeight; +} + // Returns info about the item with the id wId DialogItemTemplate* CDialogTemplate::GetItem(WORD wId) { for (unsigned int i = 0; i < m_vItems.size(); i++) @@ -288,14 +298,16 @@ void CDialogTemplate::AddItem(DialogItemTemplate item) { m_vItems.push_back(newItem); } -// Moves all of the items in the dialog by (x,y) and resizes the dialog by (x,y) -void CDialogTemplate::MoveAllAndResize(short x, short y) { - // Move all items +// Moves all of the items in the dialog by (x,y) +void CDialogTemplate::MoveAll(short x, short y) { for (unsigned int i = 0; i < m_vItems.size(); i++) { m_vItems[i]->sX += x; m_vItems[i]->sY += y; } - // Resize +} + +// Resizes the dialog by (x,y) +void CDialogTemplate::Resize(short x, short y) { m_sWidth += x; m_sHeight += y; } diff --git a/Source/DialogTemplate.h b/Source/DialogTemplate.h index 453fefe0..7d71bbbd 100644 --- a/Source/DialogTemplate.h +++ b/Source/DialogTemplate.h @@ -92,13 +92,16 @@ public: CDialogTemplate(BYTE* pbData); virtual ~CDialogTemplate(); + short GetWidth(); + short GetHeight(); DialogItemTemplate* GetItem(WORD wId); DialogItemTemplate* GetItemByIdx(DWORD i); void RemoveItem(WORD wId); void SetFont(char* szFaceName, WORD wFontSize); void AddItem(DialogItemTemplate item); HWND CreateDummyDialog(); - void MoveAllAndResize(short x, short y); + void MoveAll(short x, short y); + void Resize(short x, short y); void PixelsToDlgUnits(short& x, short& y); void DlgUnitsToPixels(short& x, short& y); SIZE GetStringSize(WORD id, char *str); diff --git a/Source/script.cpp b/Source/script.cpp index 056bc97f..0e84169b 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -1522,9 +1522,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char #ifdef NSIS_CONFIG_VISIBLE_SUPPORT case TOK_ADDBRANDINGIMAGE: try { - int k=line.gettoken_enum(1,"top\0left\0"); + int k=line.gettoken_enum(1,"top\0left\0bottom\0right\0"); int wh=line.gettoken_int(2); - if (k == -1) PRINTHELP() + if (k == -1) PRINTHELP(); + int padding = 2; + if (line.getnumtokens() == 4) + padding = line.gettoken_int(3); init_res_editor(); BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); @@ -1536,8 +1539,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char DialogItemTemplate brandingCtl = {0,}; brandingCtl.dwStyle = SS_BITMAP | WS_CHILD | WS_VISIBLE; - brandingCtl.sX = childRect->sX; - brandingCtl.sY = childRect->sY; + brandingCtl.sX = padding; + brandingCtl.sY = padding; brandingCtl.szClass = MAKEINTRESOURCE(0x0082); brandingCtl.szTitle = ""; brandingCtl.wId = IDC_BRANDIMAGE; @@ -1545,18 +1548,29 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char brandingCtl.sHeight = wh; brandingCtl.sWidth = wh; dt.PixelsToDlgUnits(brandingCtl.sWidth, brandingCtl.sHeight); - if (k) { - // Left - dt.MoveAllAndResize(brandingCtl.sWidth + childRect->sX, 0); + if (k%2) { + // left (1) / right (3) - DialogItemTemplate *okButton = dt.GetItem(IDOK); - brandingCtl.sHeight = okButton->sY + okButton->sHeight - childRect->sY; + if (k & 2) // right + brandingCtl.sX += dt.GetWidth(); + else // left + dt.MoveAll(brandingCtl.sWidth + (padding * 2), 0); + + dt.Resize(brandingCtl.sWidth + (padding * 2), 0); + + brandingCtl.sHeight = dt.GetHeight() - (padding * 2); } else { - // Top - dt.MoveAllAndResize(0, brandingCtl.sHeight + childRect->sY); + // top (0) / bottom (2) - brandingCtl.sWidth = childRect->sWidth; + if (k & 2) // bottom + brandingCtl.sY += dt.GetHeight(); + else // top + dt.MoveAll(0, brandingCtl.sHeight + (padding * 2)); + + dt.Resize(0, brandingCtl.sHeight + (padding * 2)); + + brandingCtl.sWidth = dt.GetWidth() - (padding * 2); } dt.AddItem(brandingCtl); diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 75ef5124..681b7484 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -18,7 +18,7 @@ typedef struct static tokenType tokenlist[TOK__LAST] = { {TOK_ABORT,"Abort",0,1,"[message]"}, -{TOK_ADDBRANDINGIMAGE,"AddBrandingImage",2,0,"(top|left) (height|width)"}, +{TOK_ADDBRANDINGIMAGE,"AddBrandingImage",2,1,"(top|left|bottom|right) (height|width) [padding]"}, {TOK_ADDSIZE,"AddSize",1,0,"size_to_add_to_section_in_kb"}, {TOK_AUTOCLOSE,"AutoCloseWindow",1,0,"(false|true)"}, {TOK_BGGRADIENT,"BGGradient",0,3,"(off | [top_color [bottom_color [text_color]]])"},