winamp/Src/Winamp/options_playlist.cpp

268 lines
8.1 KiB
C++

/** (c) Nullsoft, Inc. C O N F I D E N T I A L
** Filename:
** Project:
** Description:
** Author:
** Created:
**/
#include <windowsx.h>
#include "Main.h"
#include "resource.h"
#include "Options.h"
#include "SkinCOM.h"
#include "ExternalCOM.h"
#include "../nu/combobox.h"
#include "../nu/ns_wc.h"
#include <malloc.h>
static int CALLBACK EnumFontsProc( LOGFONT *lplf, TEXTMETRIC *lptm, DWORD dwType, LPARAM lpData )
{
ComboBox_AddString( (HWND)lpData, lplf->lfFaceName );
return TRUE;
}
void UpdatePlaylistFontSizeText( void )
{
HWND plpref = GetDlgItem( prefs_hwnd, IDC_RECT );
plpref = GetWindow( plpref, GW_HWNDNEXT );
if ( IsWindow( plpref ) )
SetDlgItemInt( plpref, IDC_PLFONTSIZE, config_pe_fontsize, 0 );
}
void UpdateManualAdvanceState( void )
{
HWND plpref = GetDlgItem( prefs_hwnd, IDC_RECT );
plpref = GetWindow( plpref, GW_HWNDNEXT );
if ( IsWindow( plpref ) )
CheckDlgButton( plpref, IDC_MANUALPLAYLISTADVANCE, config_pladv ? 0 : 1 );
}
// shuffle tab procedure
INT_PTR CALLBACK PlaybackOptionsProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static int pl_prefs_init;
hi helpinfo[] = {
{IDC_PREFS_SHUFFLE_MORPH_RATE,IDS_P_O_SMS},
{IDC_DEFEXT,IDS_P_O_DEFEXT},
{IDC_RFL,IDS_P_O_RFL},
{IDC_MANUALPLAYLISTADVANCE,IDS_P_O_MPA},
{IDC_PLNUMS,IDS_P_DISP_TNUMS},
{IDC_PLFONTSIZE,IDS_P_DISP_PLFONT},
};
DO_HELP();
if ( uMsg == WM_INITDIALOG )
{
pl_prefs_init = 0;
SetDlgItemTextA( hwndDlg, IDC_DEFEXT, config_defext );
SendDlgItemMessage( hwndDlg, IDC_DEFEXT, EM_LIMITTEXT, sizeof( config_defext ), 0 );
CheckDlgButton( hwndDlg, IDC_RFL, ( config_rofiob & 1 ) ? 1 : 0 );
CheckDlgButton( hwndDlg, IDC_MANUALPLAYLISTADVANCE, config_pladv ? 0 : 1 );
SendMessageW( GetDlgItem( hwndDlg, IDC_PREFS_SHUFFLE_MORPH_RATE ), TBM_SETRANGEMAX, 0, 50 );
SendMessageW( GetDlgItem( hwndDlg, IDC_PREFS_SHUFFLE_MORPH_RATE ), TBM_SETRANGEMIN, 0, 0 );
SendMessageW( GetDlgItem( hwndDlg, IDC_PREFS_SHUFFLE_MORPH_RATE ), TBM_SETPOS, 1, config_shuffle_morph_rate );
CheckDlgButton( hwndDlg, IDC_PLNUMS, config_shownumsinpl ? 1 : 0 );
CheckDlgButton( hwndDlg, IDC_PLZEROPAD, config_zeropadplnum ? 1 : 0 );
EnableWindow( GetDlgItem( hwndDlg, IDC_PLZEROPAD ), config_shownumsinpl );
SendDlgItemMessage( hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG( 999, 1 ) );
SetDlgItemInt( hwndDlg, IDC_PLFONTSIZE, config_pe_fontsize, 0 );
SendDlgItemMessageW( hwndDlg, IDC_PLDIRECTION, CB_ADDSTRING, 0, (LPARAM)getStringW( IDS_P_PLDIRECTION_AUTO, NULL, 0 ) );
SendDlgItemMessageW( hwndDlg, IDC_PLDIRECTION, CB_ADDSTRING, 0, (LPARAM)getStringW( IDS_P_PLDIRECTION_L2R, NULL, 0 ) );
SendDlgItemMessageW( hwndDlg, IDC_PLDIRECTION, CB_ADDSTRING, 0, (LPARAM)getStringW( IDS_P_PLDIRECTION_R2L, NULL, 0 ) );
SendDlgItemMessage( hwndDlg, IDC_PLDIRECTION, CB_SETCURSEL, config_pe_direction, 0 );
HWND fontcombo = GetDlgItem( hwndDlg, IDC_CUSTOMFONT );
HDC dc = GetDC( NULL );
EnumFonts( dc, NULL, (FONTENUMPROC)EnumFontsProc, (LPARAM)fontcombo );
ReleaseDC( NULL, dc );
// select the font, but fall back to Arial if it doesn't exist
ComboBox combobox( fontcombo );
if ( combobox.SelectString( playlist_custom_fontW ) == CB_ERR )
{
StringCbCopyW( playlist_custom_fontW, sizeof( playlist_custom_fontW ), FALLBACK_FONT );
combobox.SelectString( playlist_custom_fontW );
}
CheckDlgButton( hwndDlg, IDC_NOCUSTOMFONT, config_custom_plfont ? 0 : 1 );
if ( !config_custom_plfont )
{
EnableWindow( GetDlgItem( hwndDlg, IDC_CUSTOMFONT ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC_CUSTOMFONT ), FALSE );
}
//WI(plscrollsize);
//WI(plmw2xscroll);
SetDlgItemInt( hwndDlg, IDC_PLSCROLL, config_plscrollsize, 0 );
SendDlgItemMessage( hwndDlg, IDC_SPIN3, UDM_SETRANGE, 0, MAKELONG( 100, 1 ) );
CheckDlgButton( hwndDlg, IDC_MOUSE_SCROLL_DOUBLE_LINES, config_plmw2xscroll ? 1 : 0 );
pl_prefs_init = 1;
}
else if ( uMsg == WM_COMMAND )
switch ( LOWORD( wParam ) )
{
case IDC_PLDIRECTION:
if ( HIWORD( wParam ) == CBN_SELCHANGE )
{
int l = SendDlgItemMessage( hwndDlg, IDC_PLDIRECTION, CB_GETCURSEL, 0, 0 );
if ( l != CB_ERR )
config_pe_direction = l;
InvalidateRect( hPLWindow, NULL, FALSE );
}
return 0;
case IDC_NOCUSTOMFONT:
config_custom_plfont = !IsDlgButtonChecked( hwndDlg, IDC_NOCUSTOMFONT );
EnableWindow( GetDlgItem( hwndDlg, IDC_CUSTOMFONT ), IsDlgButtonChecked( hwndDlg, IDC_NOCUSTOMFONT ) ? 0 : 1 );
EnableWindow( GetDlgItem( hwndDlg, IDC_STATIC_CUSTOMFONT ), IsDlgButtonChecked( hwndDlg, IDC_NOCUSTOMFONT ) ? 0 : 1 );
draw_reinit_plfont( 1 );
InvalidateRect( hPLWindow, NULL, FALSE );
JSAPI1_SkinChanged();
break;
case IDC_CUSTOMFONT:
if ( HIWORD( wParam ) == CBN_SELCHANGE )
{
HWND fontcombo;
int idx, len;
wchar_t *t;
fontcombo = GetDlgItem( hwndDlg, IDC_CUSTOMFONT );
ComboBox combobox( fontcombo );
idx = combobox.GetSelection();
len = combobox.GetTextLen( idx );
t = (wchar_t *)_malloca( ( len + 1 ) * sizeof( wchar_t ) );
combobox.GetText( idx, t );
t[ len ] = 0;
StringCbCopyW( playlist_custom_fontW, sizeof( playlist_custom_fontW ), t );
WideCharToMultiByteSZ( CP_ACP, 0, playlist_custom_fontW, -1, playlist_custom_font, 128, 0, 0 );
_freea( t );
draw_reinit_plfont( 1 );
InvalidateRect( hPLWindow, NULL, FALSE );
JSAPI1_SkinChanged();
}
break;
case IDC_PLNUMS:
{
int t = config_shownumsinpl;
config_shownumsinpl = IsDlgButtonChecked( hwndDlg, IDC_PLNUMS ) ? 1 : 0;
if ( config_shownumsinpl != t )
{
_w_i( "shownumsinpl", config_shownumsinpl );
draw_reinit_plfont( 1 );
if ( config_pe_open )
InvalidateRect( hPLWindow, NULL, FALSE );
}
EnableWindow( GetDlgItem( hwndDlg, IDC_PLZEROPAD ), config_shownumsinpl );
}
break;
case IDC_PLZEROPAD:
{
config_zeropadplnum = IsDlgButtonChecked( hwndDlg, IDC_PLZEROPAD ) ? 1 : 0;
InvalidateRect( hPLWindow, NULL, FALSE );
}
break;
case IDC_PLFONTSIZE:
if ( HIWORD( wParam ) == EN_CHANGE && pl_prefs_init )
{
int s = 0, t = GetDlgItemInt( hwndDlg, IDC_PLFONTSIZE, &s, 0 );
if ( t < 2 )
t = 11;
if ( t != config_pe_fontsize && s )
{
config_pe_fontsize = t;
if ( hMainWindow )
{
draw_reinit_plfont( 1 );
InvalidateRect( hPLWindow, NULL, FALSE );
}
JSAPI1_SkinChanged();
}
}
break;
case IDC_DEFEXT:
if ( HIWORD( wParam ) == EN_CHANGE )
{
GetWindowTextA( GetDlgItem( hwndDlg, IDC_DEFEXT ), config_defext, sizeof( config_defext ) );
}
break;
case IDC_RFL:
config_rofiob &= ~1;
config_rofiob |= IsDlgButtonChecked( hwndDlg, IDC_RFL ) ? 1 : 0;
break;
case IDC_MANUALPLAYLISTADVANCE:
{
int manadv = IsDlgButtonChecked( hwndDlg, IDC_MANUALPLAYLISTADVANCE ) ? 0 : 1;
if ( manadv != config_pladv )
SendMessageW( hMainWindow, WM_COMMAND, WINAMP_FILE_MANUALPLADVANCE, 0 );
break;
}
case IDC_MOUSE_SCROLL_DOUBLE_LINES:
config_plmw2xscroll = IsDlgButtonChecked( hwndDlg, IDC_MOUSE_SCROLL_DOUBLE_LINES ) ? 1 : 0;
break;
case IDC_PLSCROLL:
if ( HIWORD( wParam ) == EN_CHANGE && pl_prefs_init )
{
int s = 0, t = GetDlgItemInt( hwndDlg, IDC_PLSCROLL, &s, 0 );
if ( t < 1 )
t = 1;
if ( t > 16 )
t = 16;
if ( t != config_plscrollsize && s )
config_plscrollsize = t;
}
break;
case IDC_SHUFFLE_HELP:
{
wchar_t title[ 64 ] = { 0 };
MessageBoxW( hwndDlg, getStringW( IDS_SHUFFLE_MORPH_INFO, NULL, 0 ),
getStringW( IDS_SHUFFLE_MORPH_RATE, title, 64 ), 0 );
}
break;
}
else if ( uMsg == WM_HSCROLL )
{
HWND swnd = (HWND)lParam;
if ( swnd == GetDlgItem( hwndDlg, IDC_PREFS_SHUFFLE_MORPH_RATE ) )
{
config_shuffle_morph_rate = (unsigned char)SendMessageW( GetDlgItem( hwndDlg, IDC_PREFS_SHUFFLE_MORPH_RATE ), TBM_GETPOS, 0, 0 );
}
}
else if ( uMsg == WM_DESTROY )
{
pl_prefs_init = 0;
}
const int controls[] =
{
IDC_PREFS_SHUFFLE_MORPH_RATE,
};
if ( FALSE != DirectMouseWheel_ProcessDialogMessage( hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE( controls ) ) )
return TRUE;
return FALSE;
} //shuffle