@@ -1216,7 +1216,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text )
1216
1216
return false ;
1217
1217
}
1218
1218
1219
- bool BrowseLinkHelper ( HWND parent, wchar_t *text )
1219
+ bool BrowseLinkHelper ( HWND parent, wchar_t *text, bool bFoldersOnly )
1220
1220
{
1221
1221
DoEnvironmentSubst (text,_MAX_PATH);
1222
1222
@@ -1227,16 +1227,22 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text )
1227
1227
if (!pCustomize)
1228
1228
return false ;
1229
1229
1230
- pDialog->SetTitle (LoadStringEx (IDS_PICK_LINK_TITLE));
1231
- pDialog->SetOkButtonLabel (LoadStringEx (IDS_PICK_LINK_FILE));
1232
- wchar_t button[256 ];
1233
- Sprintf (button,_countof (button),L" %s " ,LoadStringEx (IDS_PICK_LINK_FOLDER));
1234
- pCustomize->AddPushButton (101 ,button);
1230
+ pDialog->SetTitle (LoadStringEx (bFoldersOnly?IDS_PICK_LINK_FOLDER:IDS_PICK_LINK_TITLE));
1231
+ if (!bFoldersOnly) // add separate buttons for selecting files/folders to the dialog
1232
+ {
1233
+ pDialog->SetOkButtonLabel (LoadStringEx (IDS_PICK_LINK_FILE));
1234
+ wchar_t button[256 ];
1235
+ Sprintf (button,_countof (button),L" %s " ,LoadStringEx (IDS_PICK_LINK_FOLDER));
1236
+ pCustomize->AddPushButton (101 ,button);
1237
+ }
1235
1238
1236
1239
CBrowseLinkEvents events;
1237
1240
DWORD cookie;
1238
1241
pDialog->Advise (&events,&cookie);
1239
- pDialog->SetOptions (FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS);
1242
+ if (bFoldersOnly) // set FOS_PICKFOLDERS option to use dialog in folder-only mode
1243
+ pDialog->SetOptions (FOS_PICKFOLDERS|FOS_ALLNONSTORAGEITEMS|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE);
1244
+ else
1245
+ pDialog->SetOptions (FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS);
1240
1246
{
1241
1247
const wchar_t *c=wcschr (text,' |' );
1242
1248
if (c)
@@ -1822,7 +1828,10 @@ void CCustomTreeDlg::SerializeData( void )
1822
1828
if ((m_pSetting->flags &CSetting::FLAG_DEFAULT) || wcscmp (strNew,strOld)!=0 )
1823
1829
SetSettingsDirty ();
1824
1830
m_pSetting->value =CComVariant (strNew);
1825
- m_pSetting->flags &=~CSetting::FLAG_DEFAULT;
1831
+ if (m_pSetting->value ==m_pSetting->defValue )
1832
+ m_pSetting->flags |=CSetting::FLAG_DEFAULT;
1833
+ else
1834
+ m_pSetting->flags &=~CSetting::FLAG_DEFAULT;
1826
1835
ItemsChanged ();
1827
1836
}
1828
1837
@@ -2271,6 +2280,7 @@ class CTreeSettingsDlg: public CResizeableDlg<CTreeSettingsDlg>
2271
2280
EDIT_HOTKEY_ANY,
2272
2281
EDIT_COLOR,
2273
2282
EDIT_FONT,
2283
+ EDIT_DIRECTORY,
2274
2284
};
2275
2285
2276
2286
BEGIN_MSG_MAP ( CTreeSettingsDlg )
@@ -2714,6 +2724,29 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO
2714
2724
m_EditBox.SetFocus ();
2715
2725
m_bIgnoreFocus=false ;
2716
2726
}
2727
+ else if (m_EditMode==EDIT_DIRECTORY)
2728
+ {
2729
+ m_bIgnoreFocus=true ;
2730
+ CString str;
2731
+ m_EditBox.GetWindowText (str);
2732
+ str.TrimLeft (); str.TrimRight ();
2733
+ wchar_t text[1024 ];
2734
+ DWORD dwAttrs=GetFileAttributes (str); // ensure directory exists before passing it to dialog
2735
+ if (dwAttrs!=INVALID_FILE_ATTRIBUTES && dwAttrs&FILE_ATTRIBUTE_DIRECTORY)
2736
+ {
2737
+ Strcpy (text,_countof (text),str);
2738
+ DoEnvironmentSubst (text,_countof (text));
2739
+ }
2740
+ else
2741
+ text[0 ]=0 ;
2742
+ Strcpy (text,_countof (text),str);
2743
+ DoEnvironmentSubst (text,_countof (text));
2744
+ if (BrowseLinkHelper (m_hWnd,text,true ))
2745
+ m_EditBox.SetWindowText (text);
2746
+ SendMessage (WM_NEXTDLGCTL,(LPARAM)m_EditBox.m_hWnd ,TRUE );
2747
+ m_EditBox.SetFocus ();
2748
+ m_bIgnoreFocus=false ;
2749
+ }
2717
2750
return 0 ;
2718
2751
}
2719
2752
@@ -2778,7 +2811,10 @@ void CTreeSettingsDlg::ToggleItem( HTREEITEM hItem, bool bDefault )
2778
2811
{
2779
2812
CSettingsLockWrite lock;
2780
2813
pSetting->value =CComVariant (state?0 :1 );
2781
- pSetting->flags &=~CSetting::FLAG_DEFAULT;
2814
+ if (pSetting->value ==pSetting->defValue )
2815
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
2816
+ else
2817
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
2782
2818
SetSettingsDirty ();
2783
2819
}
2784
2820
if (pSetting->flags &CSetting::FLAG_CALLBACK)
@@ -2802,7 +2838,10 @@ void CTreeSettingsDlg::ToggleItem( HTREEITEM hItem, bool bDefault )
2802
2838
{
2803
2839
CSettingsLockWrite lock;
2804
2840
pTarget->value =CComVariant (val);
2805
- pTarget->flags &=~CSetting::FLAG_DEFAULT;
2841
+ if (pTarget->value ==pTarget->defValue )
2842
+ pTarget->flags |=CSetting::FLAG_DEFAULT;
2843
+ else
2844
+ pTarget->flags &=~CSetting::FLAG_DEFAULT;
2806
2845
SetSettingsDirty ();
2807
2846
}
2808
2847
if (pParent->flags &CSetting::FLAG_CALLBACK)
@@ -3013,7 +3052,10 @@ void CTreeSettingsDlg::ApplyEditBox( void )
3013
3052
if (pSetting->value .vt !=VT_I4 || pSetting->value .intVal !=val)
3014
3053
{
3015
3054
pSetting->value =CComVariant (val);
3016
- pSetting->flags &=~CSetting::FLAG_DEFAULT;
3055
+ if (pSetting->value ==pSetting->defValue )
3056
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3057
+ else
3058
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3017
3059
}
3018
3060
}
3019
3061
else if (pSetting->type ==CSetting::TYPE_COLOR)
@@ -3023,23 +3065,46 @@ void CTreeSettingsDlg::ApplyEditBox( void )
3023
3065
if (pSetting->value .vt !=VT_I4 || pSetting->value .intVal !=val)
3024
3066
{
3025
3067
pSetting->value =CComVariant (val);
3026
- pSetting->flags &=~CSetting::FLAG_DEFAULT;
3068
+ if (pSetting->value ==pSetting->defValue )
3069
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3070
+ else
3071
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3027
3072
}
3028
3073
}
3029
3074
else if (pSetting->type ==CSetting::TYPE_HOTKEY || pSetting->type ==CSetting::TYPE_HOTKEY_ANY)
3030
3075
{
3031
3076
if (pSetting->value .vt !=VT_I4 || pSetting->value .intVal !=g_HotKey)
3032
3077
{
3033
3078
pSetting->value =CComVariant (g_HotKey);
3034
- pSetting->flags &=~CSetting::FLAG_DEFAULT;
3079
+ if (pSetting->value ==pSetting->defValue )
3080
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3081
+ else
3082
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3083
+ }
3084
+ }
3085
+ else if (pSetting->type ==CSetting::TYPE_DIRECTORY)
3086
+ {
3087
+ if (pSetting->value .vt !=VT_BSTR || str!=pSetting->value .bstrVal )
3088
+ {
3089
+ if (str.IsEmpty ()) // empty directory strings cause unexpected behavior, so we reset to avoid this
3090
+ pSetting->value =pSetting->defValue ;
3091
+ else // otherwise we are very lenient about what users can input as a path
3092
+ pSetting->value =CComVariant (str);
3093
+ if (pSetting->value ==pSetting->defValue )
3094
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3095
+ else
3096
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3035
3097
}
3036
3098
}
3037
3099
else
3038
3100
{
3039
3101
if (pSetting->value .vt !=VT_BSTR || str!=pSetting->value .bstrVal )
3040
3102
{
3041
3103
pSetting->value =CComVariant (str);
3042
- pSetting->flags &=~CSetting::FLAG_DEFAULT;
3104
+ if (pSetting->value ==pSetting->defValue )
3105
+ pSetting->flags |=CSetting::FLAG_DEFAULT;
3106
+ else
3107
+ pSetting->flags &=~CSetting::FLAG_DEFAULT;
3043
3108
}
3044
3109
}
3045
3110
SetSettingsDirty ();
@@ -3074,7 +3139,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
3074
3139
val=valVar.intVal ;
3075
3140
Sprintf (text,_countof (text),L" %d" ,val);
3076
3141
}
3077
- else if (pSetting->type ==CSetting::TYPE_STRING || pSetting->type ==CSetting::TYPE_ICON || pSetting->type ==CSetting::TYPE_BITMAP || pSetting->type ==CSetting::TYPE_BITMAP_JPG || pSetting->type ==CSetting::TYPE_SOUND || pSetting->type ==CSetting::TYPE_FONT)
3142
+ else if (pSetting->type ==CSetting::TYPE_STRING || pSetting->type ==CSetting::TYPE_ICON || pSetting->type ==CSetting::TYPE_BITMAP || pSetting->type ==CSetting::TYPE_BITMAP_JPG || pSetting->type ==CSetting::TYPE_SOUND || pSetting->type ==CSetting::TYPE_FONT || pSetting-> type ==CSetting::TYPE_DIRECTORY )
3078
3143
{
3079
3144
if (valVar.vt ==VT_BSTR)
3080
3145
Strcpy (text,_countof (text),valVar.bstrVal );
@@ -3090,8 +3155,10 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
3090
3155
mode=EDIT_BITMAP_JPG;
3091
3156
else if (pSetting->type ==CSetting::TYPE_SOUND)
3092
3157
mode=EDIT_SOUND;
3093
- else
3158
+ else if (pSetting-> type ==CSetting::TYPE_FONT)
3094
3159
mode=EDIT_FONT;
3160
+ else
3161
+ mode=EDIT_DIRECTORY;
3095
3162
}
3096
3163
else if (pSetting->type ==CSetting::TYPE_HOTKEY || pSetting->type ==CSetting::TYPE_HOTKEY_ANY)
3097
3164
{
@@ -3131,7 +3198,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b
3131
3198
m_pEditSetting=pSetting;
3132
3199
}
3133
3200
3134
- if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR)
3201
+ if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR || mode==EDIT_DIRECTORY )
3135
3202
{
3136
3203
RECT rc2=rc;
3137
3204
int width=(rc2.bottom -rc2.top )*3 /2 ;
@@ -3189,14 +3256,15 @@ void CTreeSettingsDlg::UpdateEditPosition( void )
3189
3256
DeleteDC (hdc);
3190
3257
DWORD margins=(DWORD)m_EditBox.SendMessage (EM_GETMARGINS);
3191
3258
size.cx +=HIWORD (margins)+LOWORD (margins)+12 ;
3192
- if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR)
3259
+ // adjust size and position of edit boxes for settings that use browse/play buttons
3260
+ if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR || m_EditMode==EDIT_DIRECTORY)
3193
3261
size.cx +=width;
3194
3262
if (m_EditMode==EDIT_SOUND)
3195
3263
size.cx +=width*2 ;
3196
3264
if (size.cx <w)
3197
3265
rc.right =rc.left +size.cx ;
3198
3266
3199
- if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_SOUND || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR)
3267
+ if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_SOUND || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR || m_EditMode==EDIT_DIRECTORY )
3200
3268
{
3201
3269
RECT rc2=rc;
3202
3270
rc2.left =rc2.right -width;
@@ -3376,6 +3444,9 @@ void CTreeSettingsDlg::UpdateGroup( const CSetting *pModified )
3376
3444
bool bDefault=pSetting->IsDefault ();
3377
3445
const CComVariant &valVar=pSetting->GetValue ();
3378
3446
3447
+ // check if modified items should be bold
3448
+ bool bBoldSettings=GetSettingBool (L" BoldSettings" );
3449
+
3379
3450
// calculate text
3380
3451
if (pSetting!=m_pEditSetting)
3381
3452
{
@@ -3458,7 +3529,7 @@ void CTreeSettingsDlg::UpdateGroup( const CSetting *pModified )
3458
3529
DeleteDC (hdc);
3459
3530
DeleteDC (hdcMask);
3460
3531
}
3461
- int state=bDefault?0 :TVIS_BOLD;
3532
+ int state=bDefault||!bBoldSettings ?0 :TVIS_BOLD; // check if item should be highlighted in bold
3462
3533
if (!bEnabled)
3463
3534
{
3464
3535
if (pSetting->type !=CSetting::TYPE_COLOR) image|=SETTING_STATE_DISABLED;
0 commit comments