diff options
Diffstat (limited to 'Src/Plugins/Library/ml_local/prefs.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_local/prefs.cpp | 936 |
1 files changed, 936 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_local/prefs.cpp b/Src/Plugins/Library/ml_local/prefs.cpp new file mode 100644 index 00000000..ffeef4da --- /dev/null +++ b/Src/Plugins/Library/ml_local/prefs.cpp @@ -0,0 +1,936 @@ +#include "main.h" +#include "api__ml_local.h" +#include "ml_local.h" +#include <time.h> +#include "..\..\General\gen_ml/config.h" +#include "resource.h" +#include "../nu/listview.h" +#include "..\..\General\gen_ml/gaystring.h" +#include "./scanfolderbrowser.h" +#include "../replicant/nu/AutoChar.h" +#include "../replicant/nu/AutoWide.h" +#include <shlwapi.h> +#include <strsafe.h> + +extern HWND subWnd = 0, prefsWnd = 0; +extern int g_bgrescan_int, g_bgrescan_do, g_autochannel_do; +HWND g_bgrescan_status_hwnd; +static W_ListView *m_dir_lv; + + +static void EnableDisableRecentPlayingControls( HWND hwndDlg, int tracking ) +{ + if ( tracking == -1 ) tracking = !!g_config->ReadInt( L"trackplays", 1 ); + EnableWindow( GetDlgItem( hwndDlg, IDC_CHECK7 ), tracking ); + EnableWindow( GetDlgItem( hwndDlg, IDC_CHECK8 ), tracking ); + EnableWindow( GetDlgItem( hwndDlg, IDC_EDIT2 ), tracking && !!g_config->ReadInt( L"trackplays_wait_secs", 0 ) ); + EnableWindow( GetDlgItem( hwndDlg, IDC_EDIT3 ), tracking && !!g_config->ReadInt( L"trackplays_wait_percent", 0 ) ); + EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC4 ), tracking ); + EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC5 ), tracking ); +} + +// Recently Played +// When 'Recently Played' is enabled, Winamp will keep track of\nwhen and how many times items in the Media Library are played. +static INT_PTR CALLBACK Prefs1Proc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( uMsg ) + { + case WM_INITDIALOG: + { + CheckDlgButton( hwndDlg, IDC_REMEMBER_SEARCH, !!g_config->ReadInt( L"remembersearch", 0 ) ); + CheckDlgButton( hwndDlg, IDC_CHECK3, !!g_config->ReadInt( L"useminiinfo2", 0 ) ); + + CheckDlgButton( hwndDlg, IDC_CHECK_ATF, !!g_config->ReadInt( L"newtitle", 1 ) ); + CheckDlgButton( hwndDlg, IDC_CHECK5, !!g_config->ReadInt( L"audiorefine", 0 ) ); + CheckDlgButton( hwndDlg, IDC_CHECK6, !g_config->ReadInt( L"dbloadatstart", 1 ) ); + + CheckDlgButton( hwndDlg, IDC_ARTIST_AS_ALBUMARTIST, g_config->ReadInt( L"artist_as_albumartist", 1 ) ); + + SetDlgItemInt( hwndDlg, IDC_EDIT_QUERYDELAY, g_config->ReadInt( L"querydelay", 250 ), 0 ); + + int tracking = !!g_config->ReadInt( L"trackplays", 1 ); + CheckDlgButton( hwndDlg, IDC_CHECK2, tracking ); + CheckDlgButton( hwndDlg, IDC_CHECK7, !!g_config->ReadInt( L"trackplays_wait_secs", 0 ) ); + CheckDlgButton( hwndDlg, IDC_CHECK8, !!g_config->ReadInt( L"trackplays_wait_percent", 0 ) ); + SetDlgItemInt( hwndDlg, IDC_EDIT2, g_config->ReadInt( L"trackplays_wait_secs_lim", 5 ), 0 ); + SetDlgItemInt( hwndDlg, IDC_EDIT3, g_config->ReadInt( L"trackplays_wait_percent_lim", 50 ), 0 ); + EnableDisableRecentPlayingControls( hwndDlg, tracking ); + } + break; + case WM_COMMAND: + switch ( LOWORD( wParam ) ) + { + case IDC_CHECK3: + g_config->WriteInt( L"useminiinfo2", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK3 ) ); + PostMessage( plugin.hwndLibraryParent, WM_USER + 30, 0, 0 ); + break; + case IDC_REMEMBER_SEARCH: + g_config->WriteInt( L"remembersearch", !!IsDlgButtonChecked( hwndDlg, IDC_REMEMBER_SEARCH ) ); + break; + case IDC_CHECK_ATF: + g_config->WriteInt( L"newtitle", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK_ATF ) ); + break; + case IDC_CHECK5: + g_config->WriteInt( L"audiorefine", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK5 ) ); + if ( plugin.hwndLibraryParent ) PostMessage( plugin.hwndLibraryParent, WM_USER + 30, 0, 0 ); + break; + case IDC_CHECK6: + g_config->WriteInt( L"dbloadatstart", !IsDlgButtonChecked( hwndDlg, IDC_CHECK6 ) ); + break; + case IDC_CHECK2: + { + int tracking = !!IsDlgButtonChecked( hwndDlg, IDC_CHECK2 ); + g_config->WriteInt( L"trackplays", tracking ); + EnableDisableRecentPlayingControls( hwndDlg, tracking ); + } + break; + case IDC_CHECK7: + { + g_config->WriteInt( L"trackplays_wait_secs", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK7 ) ); + EnableDisableRecentPlayingControls( hwndDlg, -1 ); + } + break; + case IDC_CHECK8: + { + g_config->WriteInt( L"trackplays_wait_percent", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK8 ) ); + EnableDisableRecentPlayingControls( hwndDlg, -1 ); + } + break; + case IDC_BUTTON2: + { + wchar_t title[ 64 ] = { 0 }; + WASABI_API_LNGSTRINGW_BUF( IDS_RECENTLY_PLAYED, title, 64 ); + MessageBoxW( hwndDlg, WASABI_API_LNGSTRINGW( IDS_RECENTLY_PLAYED_TEXT ), title, 0 ); + } + break; + case IDC_ARTIST_AS_ALBUMARTIST: + { + int oldValue = g_config->ReadInt( L"artist_as_albumartist", 1 ); + int newValue = !!IsDlgButtonChecked( hwndDlg, IDC_ARTIST_AS_ALBUMARTIST ); + if ( oldValue != newValue ) + { + // TODO: prompt to re-read metadata on entire library + } + g_config->WriteInt( L"artist_as_albumartist", newValue ); + } + break; + case IDC_EDIT_QUERYDELAY: + { + if ( HIWORD( wParam ) == EN_CHANGE ) + { + BOOL t; + int v = GetDlgItemInt( hwndDlg, IDC_EDIT_QUERYDELAY, &t, FALSE ); + if ( t ) + { + if ( v < 1 ) + { + v = 1; + SetDlgItemInt( hwndDlg, IDC_EDIT_QUERYDELAY, v, 0 ); + } + else if ( v > 5000 ) + { + v = 5000; + SetDlgItemInt( hwndDlg, IDC_EDIT_QUERYDELAY, v, 0 ); + } + g_config->WriteInt( L"querydelay", v ); + g_querydelay = v; + } + } + } + break; + case IDC_BUTTON1: + nukeLibrary( hwndDlg ); + break; + case IDC_EDIT2: + if ( HIWORD( wParam ) == EN_CHANGE ) + { + BOOL t; + int v = GetDlgItemInt( hwndDlg, IDC_EDIT2, &t, FALSE ); + if ( t ) + { + if ( v < 0 ) + { + v = 1; + SetDlgItemInt( hwndDlg, IDC_EDIT2, v, 0 ); + } + g_config->WriteInt( L"trackplays_wait_secs_lim", v ); + } + } + break; + case IDC_EDIT3: + if ( HIWORD( wParam ) == EN_CHANGE ) + { + BOOL t; + int v = GetDlgItemInt( hwndDlg, IDC_EDIT3, &t, FALSE ); + if ( t ) + { + int tweaked = 0; + if ( v > 99 ) + { + v = 99; + tweaked = 1; + } + else if ( v < 1 ) + { + v = 1; + tweaked = 1; + } + if ( tweaked ) + { + SetDlgItemInt( hwndDlg, IDC_EDIT3, v, 0 ); + } + + g_config->WriteInt( L"trackplays_wait_percent_lim", v ); + } + } + break; + } + break; + } + return 0; +} + +static void parseMetaStr( wchar_t *buf2, int *guess, int *meta, int *subdir ) +{ + wchar_t metaPS[ 16 ] = { 0 }, metaMS[ 16 ] = { 0 }, smartPS[ 16 ] = { 0 }, smartMS[ 16 ] = { 0 }, guessS[ 16 ] = { 0 }, recurseS[ 16 ] = { 0 }; + StringCchPrintfW( recurseS, 16, L"-%s", WASABI_API_LNGSTRINGW( IDS_RECURSE_STR ) ); + StringCchPrintfW( guessS, 16, L"-%s", WASABI_API_LNGSTRINGW( IDS_GUESS_STR ) ); + StringCchPrintfW( smartPS, 16, L"+%s", WASABI_API_LNGSTRINGW( IDS_SMART_STR ) ); + StringCchPrintfW( smartMS, 16, L"-%s", WASABI_API_LNGSTRINGW( IDS_SMART_STR ) ); + StringCchPrintfW( metaPS, 16, L"+%s", WASABI_API_LNGSTRINGW( IDS_META_STR ) ); + StringCchPrintfW( metaMS, 16, L"-%s", WASABI_API_LNGSTRINGW( IDS_META_STR ) ); + + if ( wcsstr( buf2, metaPS ) ) + { + *meta = 1; + } + else if ( wcsstr( buf2, metaMS ) ) + { + *meta = 0; + } + else + { + *meta = -1; + } + if ( wcsstr( buf2, smartPS ) ) + { + *guess = 0; + } + else if ( wcsstr( buf2, smartMS ) ) + { + *guess = 1; + } + else if ( wcsstr( buf2, guessS ) ) + { + *guess = 2; + } + else + { + *guess = -1; + } + if ( wcsstr( buf2, recurseS ) ) + { + *subdir = 0; + } + else + { + *subdir = 1; + } +} + +static void makeMetaStr( int guess_mode, int use_metadata, int subdir, wchar_t *buf, int bufLen ) +{ + wchar_t guessstr[ 32 ] = { 0 }, recurseS[ 16 ] = { 0 }; + if ( guess_mode >= 0 ) + { + if ( guess_mode == 1 ) + StringCchPrintfW( guessstr, 32, L"-%s", WASABI_API_LNGSTRINGW( IDS_SMART_STR ) ); + else if ( guess_mode == 2 ) + StringCchPrintfW( guessstr, 32, L"-%s", WASABI_API_LNGSTRINGW( IDS_GUESS_STR ) ); + else + StringCchPrintfW( guessstr, 32, L"+%s", WASABI_API_LNGSTRINGW( IDS_SMART_STR ) ); + } + + if ( use_metadata >= 0 && guess_mode >= 0 ) + { + wchar_t bufS[ 64 ] = { 0 }; + StringCchPrintfW( bufS, 64, L"%%c%s%%s%%s", WASABI_API_LNGSTRINGW( IDS_META_STR ) ); + StringCchPrintfW( recurseS, 16, L"%s%s", subdir ? L"" : L"-", subdir ? L"" : WASABI_API_LNGSTRINGW( IDS_RECURSE_STR ) ); + StringCchPrintfW( buf, bufLen, bufS, use_metadata ? L'+' : L'-', guessstr, recurseS ); + } + else if ( use_metadata >= 0 ) + { + wchar_t metaS[ 16 ] = { 0 }; + StringCchPrintfW( metaS, 16, L"%s%s", use_metadata ? L"+" : L"-", WASABI_API_LNGSTRINGW( IDS_META_STR ) ); + StringCchPrintfW( recurseS, 16, L"%s%s", subdir ? L"" : L"-", subdir ? L"" : WASABI_API_LNGSTRINGW( IDS_RECURSE_STR ) ); + StringCchPrintfW( buf, bufLen, L"%s%s", metaS, recurseS ); + } + else if ( guess_mode >= 0 ) + { + StringCchPrintfW( recurseS, 16, L"%s%s", subdir ? L"" : L"-", subdir ? L"" : WASABI_API_LNGSTRINGW( IDS_RECURSE_STR ) ); + StringCchPrintfW( buf, bufLen, L"%s%s", guessstr, recurseS ); + } + else if ( !subdir ) + { + StringCchPrintfW( buf, bufLen, L"-%s", WASABI_API_LNGSTRINGW( IDS_RECURSE_STR ) ); + } + else + { + StringCchCopyW( buf, bufLen, WASABI_API_LNGSTRINGW( IDS_DEFAULT ) ); + } +} + +static void saveList() +{ + GayStringW gs; + int a = 0; + int x, l = m_dir_lv->GetCount(); + for ( x = 0; x < l; x++ ) + { + wchar_t buf[ 1024 ] = { 0 }, buf2[ 64 ] = { 0 }; + m_dir_lv->GetText( x, 0, buf2, 64 ); + m_dir_lv->GetText( x, 1, buf, 1024 ); + if ( buf[ 0 ] ) + { + if ( a ) + gs.Append( L"|" ); + else + a = 1; + + int meta; + int guess; + int subdir; + parseMetaStr( buf2, &guess, &meta, &subdir ); + + if ( meta >= 0 || guess >= 0 || !subdir ) + { + gs.Append( L"<" ); + if ( guess >= 0 ) + gs.Append( guess == 1 ? L"s" : ( guess == 2 ? L"g" : L"S" ) ); + + if ( meta >= 0 ) + gs.Append( meta ? L"M" : L"m" ); + + if ( !subdir ) + gs.Append( L"r" ); + + gs.Append( L">" ); + } + gs.Append( buf ); + } + } + g_config->WriteString( "scandirlist", 0 ); // erase the old ini value + g_config->WriteString( "scandirlist_utf8", AutoChar( gs.Get(), CP_UTF8 ) ); +} + +int autoscan_add_directory( const wchar_t *path, int *guess, int *meta, int *recurse, int noaddjustcheck ) +{ + char *_s1 = g_config->ReadString( "scandirlist", "" ); + UINT codePage = CP_ACP; + if ( !_s1 || !*_s1 ) + { + _s1 = g_config->ReadString( "scandirlist_utf8", "" ); + codePage = CP_UTF8; + } + + wchar_t *s1 = AutoWideDup( _s1, codePage ); + + int bufLen = 0; + wchar_t *s = (wchar_t *)calloc( ( bufLen = ( wcslen( s1 ) + 2 ) ), sizeof( wchar_t ) ); + if ( s ) + { + wcsncpy( s, s1, bufLen ); + s[ wcslen( s ) + 1 ] = 0; + + wchar_t *p = s; + while ( p && *p == L'|' ) p++; + + while ( ( p = wcsstr( p, L"|" ) ) ) + { + *p++ = 0; + while ( p && *p == L'|' ) p++; + } + p = s; + while ( p && *p ) + { + while ( p && *p == L'|' ) p++; + + int use_meta = -1; + int do_guess = -1; + int do_recurse = 1; + if ( *p == L'<' && wcsstr( p, L">" ) ) + { + p++; + while ( p && *p != L'>' ) + { + // <MmSs>can prefix directory + // M=metadata use override + // m=no metadata + // S=smart guessing + // s=stupid guessing + // g=no guessing + if ( *p == L'M' ) + use_meta = 1; + else if ( *p == L'm' ) + use_meta = 0; + else if ( *p == L'S' ) + do_guess = 0; + else if ( *p == L's' ) + do_guess = 1; + else if ( *p == L'g' ) + do_guess = 2; + else if ( *p == L'r' ) + do_recurse = 0; + + p++; + } + p++; + } + + if ( !_wcsnicmp( p, path, wcslen( p ) ) && ( path[ wcslen( p ) ] == L'\\' || !path[ wcslen( p ) ] ) ) + { + free( s ); // directory already in there + + if ( meta ) + *meta = use_meta; + + if ( guess ) + *guess = do_guess; + + if ( recurse ) + *recurse = do_recurse; + + return 1; + } + p += wcslen( p ) + 1; + } + free( s ); + } + + if ( !noaddjustcheck ) + { + WIN32_FIND_DATAW fd = { 0 }; + int bufLen = 0; + wchar_t *s = (wchar_t *)calloc( ( bufLen = ( wcslen( path ) + 32 ) ), sizeof( wchar_t ) ); + StringCchPrintfW( s, bufLen, L"%s\\*.*", path ); + HANDLE h = FindFirstFileW( s, &fd ); + free( s ); + if ( h != INVALID_HANDLE_VALUE ) + { + FindClose( h ); // we are a directory, yay + GayStringW gs; + gs.Set( s1 ); + + if ( s1[ 0 ] ) + gs.Append( L"|" ); + + gs.Append( path ); + + g_config->WriteString( "scandirlist", 0 ); + g_config->WriteString( "scandirlist_utf8", AutoCharDup( gs.Get(), codePage, 0 ) ); + + if ( m_dir_lv ) + { + int x = m_dir_lv->GetCount(); + m_dir_lv->InsertItem( x, WASABI_API_LNGSTRINGW( IDS_DEFAULT ), 0 ); + m_dir_lv->SetItemText( x, 1, path ); + } + } + } + return 0; +} + +static int m_edit_idx; +static INT_PTR CALLBACK editDirProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( uMsg ) + { + case WM_INITDIALOG: + { + wchar_t buf[ 1024 ] = { 0 }; + SHAutoComplete( GetDlgItem( hwndDlg, IDC_EDIT1 ), SHACF_AUTOAPPEND_FORCE_ON | SHACF_AUTOSUGGEST_FORCE_ON | /*SHACF_FILESYS_DIRS*/0x020 | 0x010 | SHACF_USETAB ); + m_dir_lv->GetText( m_edit_idx, 1, buf, 1024 ); + SetDlgItemTextW( hwndDlg, IDC_EDIT1, buf ); + m_dir_lv->GetText( m_edit_idx, 0, buf, 1024 ); + int guess, meta, subdir; + parseMetaStr( buf, &guess, &meta, &subdir ); + if ( meta ) + CheckDlgButton( hwndDlg, IDC_CHECK1, meta > 0 ? BST_CHECKED : BST_INDETERMINATE ); + + if ( guess < 0 ) + CheckDlgButton( hwndDlg, IDC_RADIO6, BST_CHECKED ); + else if ( !guess ) + CheckDlgButton( hwndDlg, IDC_RADIO1, BST_CHECKED ); + else if ( guess == 2 ) + CheckDlgButton( hwndDlg, IDC_RADIO8, BST_CHECKED ); + else if ( guess > 0 ) + CheckDlgButton( hwndDlg, IDC_RADIO2, BST_CHECKED ); + + if ( subdir ) CheckDlgButton( hwndDlg, IDC_CHECK2, BST_CHECKED ); + } + return 0; + case WM_COMMAND: + switch ( LOWORD( wParam ) ) + { + case IDOK: + { + //save to m_edit_idx :) + wchar_t buf[ 2048 ] = { 0 }; + GetDlgItemTextW( hwndDlg, IDC_EDIT1, buf, 2048 ); + m_dir_lv->SetItemText( m_edit_idx, 1, buf ); + + int meta = IsDlgButtonChecked( hwndDlg, IDC_CHECK1 ); + if ( meta == BST_CHECKED ) + meta = 1; + else if ( meta == BST_INDETERMINATE ) + meta = -1; + else + meta = 0; + + int guess = -1; + if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO1 ) ) + guess = 0; + else if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO2 ) ) + guess = 1; + else if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO8 ) ) + guess = 2; + + int subdir = 1; + if ( !IsDlgButtonChecked( hwndDlg, IDC_CHECK2 ) ) + subdir = 0; + + makeMetaStr( guess, meta, subdir, buf, 64 ); + m_dir_lv->SetItemText( m_edit_idx, 0, buf ); + EndDialog( hwndDlg, 1 ); + } + return 0; + case IDCANCEL: + EndDialog( hwndDlg, 0 ); + return 0; + case IDC_BUTTON1: + wchar_t path[ MAX_PATH ] = { 0 }; + GetDlgItemTextW( hwndDlg, IDC_EDIT1, path, MAX_PATH ); + ScanFolderBrowser browse( FALSE ); + browse.SetSelection( path ); + if ( browse.Browse( hwndDlg ) ) + { + wchar_t path[ MAX_PATH ] = { 0 }; + SHGetPathFromIDListW( browse.GetPIDL(), path ); + SetDlgItemTextW( hwndDlg, IDC_EDIT1, path ); + } + return 0; + } + return 0; + } + return 0; +} + +void hideShowMetadataRadioboxes( HWND hwndDlg ) +{ + int enabled = IsDlgButtonChecked( hwndDlg, IDC_CHECK1 ); + EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC1 ), enabled ); + EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC2 ), enabled ); + EnableWindow( GetDlgItem( hwndDlg, IDC_COMBO1 ), enabled ); + EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO1 ), enabled ); + EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO2 ), enabled ); + EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO3 ), enabled ); +} + +static INT_PTR CALLBACK confMetaProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( uMsg ) + { + case WM_INITDIALOG: + { + if ( g_config->ReadInt( L"usemetadata", 1 ) ) CheckDlgButton( hwndDlg, IDC_CHECK1, BST_CHECKED ); + { + int gm = g_config->ReadInt( L"guessmode", 0 ); + CheckDlgButton( hwndDlg, gm == 2 ? IDC_RADIO3 : ( gm == 1 ? IDC_RADIO2 : IDC_RADIO1 ), BST_CHECKED ); + } + + SendDlgItemMessageW( hwndDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW( IDS_ANY ) ); + SendDlgItemMessageW( hwndDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)WASABI_API_LNGSTRINGW( IDS_ALL ) ); + SendDlgItemMessage( hwndDlg, IDC_COMBO1, CB_SETCURSEL, g_guessifany ? 0 : 1, 0 ); + hideShowMetadataRadioboxes( hwndDlg ); + } + break; + case WM_COMMAND: + switch ( LOWORD( wParam ) ) + { + case IDOK: + g_config->WriteInt( L"usemetadata", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK1 ) ); + { + int a = SendDlgItemMessage( hwndDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0 ); + g_guessifany = ( a == 0 ); + g_config->WriteInt( L"guessifany", g_guessifany ); + } + + if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO1 ) ) + g_config->WriteInt( L"guessmode", 0 ); + + if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO2 ) ) + g_config->WriteInt( L"guessmode", 1 ); + + if ( IsDlgButtonChecked( hwndDlg, IDC_RADIO3 ) ) + g_config->WriteInt( L"guessmode", 2 ); + + case IDCANCEL: + EndDialog( hwndDlg, 0 ); + break; + case IDC_CHECK1: + hideShowMetadataRadioboxes( hwndDlg ); + break; + } + break; + } + return 0; +} + +static INT_PTR CALLBACK Prefs3Proc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + static int m_last_isscanning, m_set_rescan_int; + switch ( uMsg ) + { + case WM_INITDIALOG: + { + m_last_isscanning = -1; + m_set_rescan_int = 0; + + SendMessage( hwndDlg, WM_TIMER, 100, 0 ); + SetTimer( hwndDlg, 100, 1000, NULL ); + g_bgrescan_status_hwnd = GetDlgItem( hwndDlg, IDC_STATUS ); + + CheckDlgButton( hwndDlg, IDC_CHECK4, g_bgrescan_do ? BST_CHECKED : 0 ); + SendMessage( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_CHECK4, 0 ), 0 ); + CheckDlgButton( hwndDlg, IDC_CHECK3, g_config->ReadInt( L"bgrescan_startup", 0 ) ? BST_CHECKED : 0 ); + CheckDlgButton( hwndDlg, IDC_CHECK2, g_config->ReadInt( L"bgrescan_compact", 1 ) ? BST_CHECKED : 0 ); + CheckDlgButton( hwndDlg, IDC_CHECK5, g_config->ReadInt( L"autoaddplays", 0 ) ? BST_CHECKED : 0 ); + + SendDlgItemMessage( hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG( 9999, 1 ) ); + SetDlgItemInt( hwndDlg, IDC_EDIT3, g_bgrescan_int, FALSE ); + m_set_rescan_int = 1; + + delete m_dir_lv; + m_dir_lv = new W_ListView; + m_dir_lv->setwnd( GetDlgItem( hwndDlg, IDC_LIST1 ) ); + m_dir_lv->AddCol( WASABI_API_LNGSTRINGW( IDS_OPTIONS ), 120 ); + m_dir_lv->AddCol( WASABI_API_LNGSTRINGW( IDS_DIRECTORY ), 500 ); + char *_s1 = g_config->ReadString( "scandirlist", "" ); + UINT codePage = CP_ACP; + if ( !_s1 || !*_s1 ) + { + _s1 = g_config->ReadString( "scandirlist_utf8", "" ); + codePage = CP_UTF8; + } + wchar_t *s1 = AutoWideDup( _s1, codePage ); + int bufLen = 0; + wchar_t *s = (wchar_t *)calloc( ( bufLen = ( wcslen( s1 ) + 2 ) ), sizeof( wchar_t ) ); + if ( s ) + { + wcsncpy( s, s1, bufLen ); + s[ wcslen( s ) + 1 ] = 0; + + wchar_t *p = s; + while ( p && *p == L'|' ) p++; + + while ( ( p = wcsstr( p, L"|" ) ) ) + { + *p++ = 0; + while ( p && *p == L'|' ) p++; + } + int x = 0; + p = s; + while ( p && *p ) + { + while ( p && *p == L'|' ) p++; + + int guess_mode = -1; + int use_metadata = -1; + int subdir = 1; + if ( *p == L'<' && wcsstr( p, L">" ) ) + { + p++; + while ( p && *p != L'>' ) + { + // <MmSs>can prefix directory + // M=metadata use override + // m=no metadata + // S=smart guessing + // s=stupid guessing + if ( *p == L'M' ) + use_metadata = 1; + else if ( *p == L'm' ) + use_metadata = 0; + else if ( *p == L'S' ) + guess_mode = 0; + else if ( *p == L's' ) + guess_mode = 1; + else if ( *p == L'r' ) + subdir = 0; + else if ( *p == L'g' ) + guess_mode = 2; + + p++; + } + p++; + } + wchar_t buf[ 64 ] = { 0 }; + makeMetaStr( guess_mode, use_metadata, subdir, buf, 64 ); + + m_dir_lv->InsertItem( x, buf, 0 ); + m_dir_lv->SetItemText( x, 1, p ); + x++; + + p += wcslen( p ) + 1; + } + free( s ); + } + + if ( NULL != WASABI_API_APP ) + WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel( m_dir_lv->getwnd(), TRUE ); + } + break; + // process this to update the ui state when a scan is running and we didn't manually run it + case WM_USER + 101: + SendMessage( hwndDlg, WM_TIMER, 100, 0 ); + SetTimer( hwndDlg, 100, 1000, NULL ); + break; + case WM_TIMER: + if ( wParam == 100 ) + { + extern int g_bgscan_scanning; + if ( !!g_bgscan_scanning != !!m_last_isscanning ) + { + m_last_isscanning = !!g_bgscan_scanning; + SetDlgItemTextW( hwndDlg, IDC_RESCAN, WASABI_API_LNGSTRINGW( ( m_last_isscanning ? IDS_STOP_SCAN : IDS_RESCAN_NOW ) ) ); + } + } + break; + case WM_COMMAND: + switch ( LOWORD( wParam ) ) + { + case IDC_CHECK5: + g_config->WriteInt( L"autoaddplays", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK5 ) ); + break; + case IDC_CHECK2: + g_config->WriteInt( L"bgrescan_compact", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK2 ) ); + break; + case IDC_CHECK3: + g_config->WriteInt( L"bgrescan_startup", !!IsDlgButtonChecked( hwndDlg, IDC_CHECK3 ) ); + break; + case IDC_CHECK4: + g_config->WriteInt( L"bgrescan_do", g_bgrescan_do = !!IsDlgButtonChecked( hwndDlg, IDC_CHECK4 ) ); + EnableWindow( GetDlgItem( hwndDlg, IDC_EDIT3 ), g_bgrescan_do ); + EnableWindow( GetDlgItem( hwndDlg, IDC_SPIN1 ), g_bgrescan_do ); + break; + case IDC_EDIT3: + { + if ( HIWORD( wParam ) == EN_CHANGE && m_set_rescan_int ) + { + BOOL t; + int x = GetDlgItemInt( hwndDlg, IDC_EDIT3, &t, FALSE ); + if ( t ) + { + if ( x < 1 ) x = 1; + g_config->WriteInt( L"bgrescan_int", g_bgrescan_int = x ); + extern time_t g_bgscan_last_rescan; + g_bgscan_last_rescan = time( NULL ); + } + } + } + break; + case IDC_BUTTON1: + { + ScanFolderBrowser browse( FALSE ); + if ( browse.Browse( hwndDlg ) ) + { + GayStringW n; + wchar_t path[ MAX_PATH ] = { 0 }; + + SHGetPathFromIDListW( browse.GetPIDL(), path ); + + char *_s1 = g_config->ReadString( "scandirlist", "" ); + UINT codePage = CP_ACP; + if ( !_s1 || !*_s1 ) + { + _s1 = g_config->ReadString( "scandirlist_utf8", "" ); + codePage = CP_UTF8; + } + + wchar_t *scanlist = AutoWide( _s1, codePage ); + n.Set( scanlist ); + + if ( scanlist[ 0 ] ) + n.Append( L"|" ); + + n.Append( path ); + g_config->WriteString( "scandirlist", 0 ); + g_config->WriteString( "scandirlist_utf8", AutoChar( n.Get(), CP_UTF8 ) ); + int x = m_dir_lv->GetCount(); + m_dir_lv->InsertItem( x, WASABI_API_LNGSTRINGW( IDS_DEFAULT ), 0 ); + m_dir_lv->SetItemText( x, 1, path ); + } + } + break; + case IDC_BUTTON4: + { + int x, l = m_dir_lv->GetCount(), s = 0; + for ( x = 0; x < l; x++ ) + { + if ( m_dir_lv->GetSelected( x ) ) + { + m_edit_idx = x; + if ( WASABI_API_DIALOGBOXW( IDD_EDITDIR, hwndDlg, editDirProc ) ) + s = 1; + else + break; + } + } + if ( s ) + { + saveList(); + } + } + break; + case IDC_BUTTON3: + { + int x, l = m_dir_lv->GetCount(); + int s = 0; + for ( x = 0; x < l; x++ ) + { + if ( m_dir_lv->GetSelected( x ) ) + { + s = 1; + m_dir_lv->DeleteItem( x-- ); + l--; + } + } + if ( s ) + { + saveList(); + } + } + break; + case IDC_RESCAN: + extern int g_bgscan_scanning; + extern time_t g_bgscan_last_rescan; + if ( g_bgscan_scanning ) + { + Scan_Cancel(); + SetWindowTextW( g_bgrescan_status_hwnd, WASABI_API_LNGSTRINGW( IDS_RESCAN_ABORTED ) ); + SendMessage( hwndDlg, WM_TIMER, 100, 0 ); + } + else + { + extern int openDb( void ); + openDb(); + if ( plugin.hwndLibraryParent ) SendMessage( plugin.hwndLibraryParent, WM_USER + 575, 0xffff00dd, 0 ); + SendMessage( hwndDlg, WM_TIMER, 100, 0 ); + } + break; + case IDC_CONFMETA: + WASABI_API_DIALOGBOXW( IDD_PREFS_METADATA, hwndDlg, confMetaProc ); + break; + }; + break; + case WM_NOTIFY: + { + LPNMHDR l = (LPNMHDR)lParam; + if ( l->idFrom == IDC_LIST1 && l->code == NM_DBLCLK ) + { + SendMessage( hwndDlg, WM_COMMAND, IDC_BUTTON4, 0 ); + } + } + break; + case WM_DESTROY: + m_set_rescan_int = 0; + g_bgrescan_status_hwnd = 0; + if ( NULL != WASABI_API_APP ) + WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel( m_dir_lv->getwnd(), FALSE ); + delete m_dir_lv; + m_dir_lv = 0; + break; + } + return 0; +} + +static void _dosetsel( HWND hwndDlg ) +{ + HWND tabwnd = GetDlgItem( hwndDlg, IDC_TAB1 ); + int sel = TabCtrl_GetCurSel( tabwnd ); + + if ( sel >= 0 && ( sel != g_config->ReadInt( L"lastprefp", 0 ) || !subWnd ) ) + { + g_config->WriteInt( L"lastprefp", sel ); + if ( subWnd ) + DestroyWindow( subWnd ); + + subWnd = 0; + + UINT t = 0; + DLGPROC p = NULL; + switch ( sel ) + { + case 0: t = IDD_PREFS1; p = Prefs1Proc; break; + case 1: t = IDD_PREFS3; p = Prefs3Proc; break; + } + + if ( t ) subWnd = WASABI_API_CREATEDIALOGW( t, hwndDlg, p ); + + if ( subWnd ) + { + RECT r; + GetClientRect( tabwnd, &r ); + TabCtrl_AdjustRect( tabwnd, FALSE, &r ); + SetWindowPos( subWnd, HWND_TOP, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOACTIVATE ); + ShowWindow( subWnd, SW_SHOWNA ); + } + + if ( !SendMessage( plugin.hwndWinampParent, WM_WA_IPC, IPC_ISWINTHEMEPRESENT, IPC_USE_UXTHEME_FUNC ) ) + { + SendMessage( plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)tabwnd, IPC_USE_UXTHEME_FUNC ); + SendMessage( plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)subWnd, IPC_USE_UXTHEME_FUNC ); + } + } +} + +// frame proc +INT_PTR CALLBACK PrefsProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( uMsg ) + { + case WM_INITDIALOG: + { + TCITEMW item; + HWND tabwnd = GetDlgItem( hwndDlg, IDC_TAB1 ); + item.mask = TCIF_TEXT; + item.pszText = WASABI_API_LNGSTRINGW( IDS_OPTIONS ); + SendMessageW( tabwnd, TCM_INSERTITEMW, 0, (LPARAM)&item ); + item.pszText = WASABI_API_LNGSTRINGW( IDS_WATCH_FOLDERS ); + SendMessageW( tabwnd, TCM_INSERTITEMW, 1, (LPARAM)&item ); + TabCtrl_SetCurSel( tabwnd, g_config->ReadInt( L"lastprefp", 0 ) ); + _dosetsel( hwndDlg ); + prefsWnd = hwndDlg; + } + return 0; + case WM_NOTIFY: + { + LPNMHDR p = (LPNMHDR)lParam; + if ( p->idFrom == IDC_TAB1 && p->code == TCN_SELCHANGE ) _dosetsel( hwndDlg ); + } + return 0; + case WM_DESTROY: + subWnd = NULL; + prefsWnd = NULL; + return 0; + } + return 0; +} + +void refreshPrefs( int screen ) +{ + if ( subWnd && g_config->ReadInt( L"lastprefp", -1 ) == screen ) + { + if ( screen == 4 ) SendMessage( subWnd, WM_INITDIALOG, 0, 0 ); + } +}
\ No newline at end of file |