winamp/Src/Plugins/DSP/dsp_sps/sps_configdlg.h
2024-09-24 14:54:57 +02:00

476 lines
No EOL
14 KiB
C

#ifndef SPS_CONFIGDLG_IMPL
BOOL CALLBACK SPS_configWindowProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
#else
#ifdef SPS_CONFIGDLG_HIDEABLE_EDITOR
static void showHideSliders(HWND hwndDlg, SPSEffectContext *ctx)
{
int x;
x=(SPS_CONFIGDLG_HIDEABLE_EDITOR || ctx->curpreset.slider_labels[0][0][0])?SW_SHOWNA:SW_HIDE;
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER1),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER1_LABEL1),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER1_LABEL2),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER1_LABEL3),x);
x=(SPS_CONFIGDLG_HIDEABLE_EDITOR || ctx->curpreset.slider_labels[1][0][0])?SW_SHOWNA:SW_HIDE;
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER2),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER2_LABEL1),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER2_LABEL2),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER2_LABEL3),x);
x=(SPS_CONFIGDLG_HIDEABLE_EDITOR || ctx->curpreset.slider_labels[2][0][0])?SW_SHOWNA:SW_HIDE;
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER3),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER3_LABEL1),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER3_LABEL2),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER3_LABEL3),x);
x=(SPS_CONFIGDLG_HIDEABLE_EDITOR || ctx->curpreset.slider_labels[3][0][0])?SW_SHOWNA:SW_HIDE;
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER4),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER4_LABEL1),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER4_LABEL2),x);
ShowWindow(GetDlgItem(hwndDlg,IDC_SLIDER4_LABEL3),x);
}
static void showHideEditor(HWND hwndDlg, int isInit)
{
int en=0;
static int lw;
RECT r;
GetWindowRect(hwndDlg,&r);
if (isInit)
{
lw=r.right-r.left;
}
if (!SPS_CONFIGDLG_HIDEABLE_EDITOR)
{
SetDlgItemText(hwndDlg,IDC_EDIT,WASABI_API_LNGSTRING(IDS_SHOW_EDITOR));
RECT r2;
GetWindowRect(GetDlgItem(hwndDlg,IDC_SAVE),&r2);
SetWindowPos(hwndDlg,NULL,0,0,r2.left-r.left,r.bottom-r.top,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
}
else
{
if (!isInit)
{
SetWindowPos(hwndDlg,NULL,0,0,lw,r.bottom-r.top,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
}
SetDlgItemText(hwndDlg,IDC_EDIT,WASABI_API_LNGSTRING(IDS_HIDE_EDITOR));
en=1;
}
UINT tab[] = {
IDC_SLIDER1_LABEL1,
IDC_SLIDER1_LABEL2,
IDC_SLIDER1_LABEL3,
IDC_SLIDER2_LABEL1,
IDC_SLIDER2_LABEL2,
IDC_SLIDER2_LABEL3,
IDC_SLIDER3_LABEL1,
IDC_SLIDER3_LABEL2,
IDC_SLIDER3_LABEL3,
IDC_SLIDER4_LABEL1,
IDC_SLIDER4_LABEL2,
IDC_SLIDER4_LABEL3,
};
for (int x = 0; x < sizeof(tab)/sizeof(UINT); x ++)
{
EnableWindow(GetDlgItem(hwndDlg,tab[x]),en);
}
UINT tab2[]={
IDC_SAVE,
IDC_SHOWHELP,
IDC_INIT,
IDC_ONSLIDERCHANGE,
IDC_PERSAMPLE,
};
for (int x = 0; x < sizeof(tab2)/sizeof(UINT); x++)
{
ShowWindow(GetDlgItem(hwndDlg,tab2[x]),en?SW_SHOWNA:SW_HIDE);
}
}
#endif
char* BuildFilterString(void)
{
static char filterStr[MAX_PATH] = {0};
if(!filterStr[0])
{
char* temp = filterStr;
//"SPS presets\0*.sps\0All files\0*.*\0"
WASABI_API_LNGSTRING_BUF(IDS_SPS_PRESETS,filterStr,128);
temp += lstrlen(filterStr)+1;
lstrcpyn(temp, "*.sps", MAX_PATH);
temp = temp + lstrlen(temp) + 1;
lstrcpyn(temp, WASABI_API_LNGSTRING(IDS_ALL_FILES), 128);
temp = temp + lstrlen(temp) + 1;
lstrcpyn(temp, "*.*", MAX_PATH);
*(temp = temp + lstrlen(temp) + 1) = 0;
}
return filterStr;
}
static void updatePresetText(HWND hwndDlg, SPSEffectContext *ctx)
{
char *p=strrchr(ctx->curpreset_name,'\\');
if (!p) p=ctx->curpreset_name;
else p++;
char *p2=strrchr(p,'.');
if (p2) *p2=0;
SetDlgItemText(hwndDlg,IDC_PRESET,p);
if (p2) *p2='.';
}
static void dosavePreset(HWND hwndDlg, SPSEffectContext *ctx)
{
char temp[2048] = {0};
OPENFILENAME l={sizeof(l),0};
char buf1[2048],buf2[2048];
GetCurrentDirectory(sizeof(buf2),buf2);
strcpy(buf1,g_path);
l.hwndOwner = hwndDlg;
l.lpstrFilter = BuildFilterString();
l.lpstrFile = temp;
strcpy(temp,ctx->curpreset_name);
l.nMaxFile = 2048-1;
l.lpstrTitle = WASABI_API_LNGSTRING(IDS_SAVE_PRESET);
l.lpstrDefExt = "SPS";
l.lpstrInitialDir = buf1;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_OVERWRITEPROMPT;
if (GetSaveFileName(&l))
{
strcpy(ctx->curpreset_name,temp);
SPS_save_preset(ctx,ctx->curpreset_name,"SPS PRESET");
updatePresetText(hwndDlg,ctx);
}
SetCurrentDirectory(buf2);
}
static void presetToDialog(HWND hwndDlg, SPSEffectContext *ctx)
{
SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETPOS,1,1000-ctx->curpreset.sliderpos[0]);
SendDlgItemMessage(hwndDlg,IDC_SLIDER2,TBM_SETPOS,1,1000-ctx->curpreset.sliderpos[1]);
SendDlgItemMessage(hwndDlg,IDC_SLIDER3,TBM_SETPOS,1,1000-ctx->curpreset.sliderpos[2]);
SendDlgItemMessage(hwndDlg,IDC_SLIDER4,TBM_SETPOS,1,1000-ctx->curpreset.sliderpos[3]);
SetDlgItemText(hwndDlg,IDC_SLIDER1_LABEL1,ctx->curpreset.slider_labels[0][0]);
SetDlgItemText(hwndDlg,IDC_SLIDER1_LABEL2,ctx->curpreset.slider_labels[0][1]);
SetDlgItemText(hwndDlg,IDC_SLIDER1_LABEL3,ctx->curpreset.slider_labels[0][2]);
SetDlgItemText(hwndDlg,IDC_SLIDER2_LABEL1,ctx->curpreset.slider_labels[1][0]);
SetDlgItemText(hwndDlg,IDC_SLIDER2_LABEL2,ctx->curpreset.slider_labels[1][1]);
SetDlgItemText(hwndDlg,IDC_SLIDER2_LABEL3,ctx->curpreset.slider_labels[1][2]);
SetDlgItemText(hwndDlg,IDC_SLIDER3_LABEL1,ctx->curpreset.slider_labels[2][0]);
SetDlgItemText(hwndDlg,IDC_SLIDER3_LABEL2,ctx->curpreset.slider_labels[2][1]);
SetDlgItemText(hwndDlg,IDC_SLIDER3_LABEL3,ctx->curpreset.slider_labels[2][2]);
SetDlgItemText(hwndDlg,IDC_SLIDER4_LABEL1,ctx->curpreset.slider_labels[3][0]);
SetDlgItemText(hwndDlg,IDC_SLIDER4_LABEL2,ctx->curpreset.slider_labels[3][1]);
SetDlgItemText(hwndDlg,IDC_SLIDER4_LABEL3,ctx->curpreset.slider_labels[3][2]);
SetDlgItemText(hwndDlg,IDC_INIT,ctx->curpreset.code_text[0]);
SetDlgItemText(hwndDlg,IDC_PERSAMPLE,ctx->curpreset.code_text[1]);
SetDlgItemText(hwndDlg,IDC_ONSLIDERCHANGE,ctx->curpreset.code_text[2]);
updatePresetText(hwndDlg,ctx);
#ifdef SPS_CONFIGDLG_HIDEABLE_EDITOR
showHideSliders(hwndDlg,ctx);
#endif
}
static int m_help_lastpage=4;
static char *m_localtext;
static void _dosetsel(HWND hwndDlg)
{
HWND tabwnd=GetDlgItem(hwndDlg,IDC_TAB1);
int sel=TabCtrl_GetCurSel(tabwnd);
char *text="";
m_help_lastpage=sel;
text=SPSHELP_gethelptext(sel);
if (!text && sel == 4 && m_localtext) text=m_localtext;
SetDlgItemText(hwndDlg,IDC_EDIT1,text);
}
static BOOL CALLBACK evalHelpDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
TCITEM item;
HWND tabwnd=GetDlgItem(hwndDlg,IDC_TAB1);
helpWnd=hwndDlg;
item.mask=TCIF_TEXT;
item.pszText=WASABI_API_LNGSTRING(IDS_GENERAL);
TabCtrl_InsertItem(tabwnd,0,&item);
item.pszText=WASABI_API_LNGSTRING(IDS_OPERATORS);
TabCtrl_InsertItem(tabwnd,1,&item);
item.pszText=WASABI_API_LNGSTRING(IDS_FUNCTIONS);
TabCtrl_InsertItem(tabwnd,2,&item);
item.pszText=WASABI_API_LNGSTRING(IDS_CONSTANTS);
TabCtrl_InsertItem(tabwnd,3,&item);
// fucko: context specific stuff
m_localtext=0;
if (lParam)
{
item.pszText=(char *)lParam;
m_localtext=item.pszText + strlen(item.pszText)+1;
TabCtrl_InsertItem(tabwnd,4,&item);
}
else if (m_help_lastpage > 3) m_help_lastpage=0;
TabCtrl_SetCurSel(tabwnd,m_help_lastpage);
_dosetsel(hwndDlg);
}
return 0;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hwndDlg,1);
helpWnd = 0;
}
return 0;
case WM_NOTIFY:
{
LPNMHDR p=(LPNMHDR) lParam;
if (p->idFrom == IDC_TAB1 && p->code == TCN_SELCHANGE) _dosetsel(hwndDlg);
}
return 0;
}
return 0;
}
BOOL CALLBACK SPS_configWindowProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
SPSEffectContext *ctx;
if ( uMsg == WM_INITDIALOG )
SetWindowLong( hwndDlg, DWL_USER, lParam );
ctx = (SPSEffectContext *) GetWindowLong( hwndDlg, DWL_USER );
if ( ctx )
{
switch ( uMsg )
{
case WM_INITDIALOG:
SetWindowText( hwndDlg, hdr.description );
SendDlgItemMessage( hwndDlg, IDC_SLIDER1, TBM_SETTICFREQ, 100, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER2, TBM_SETTICFREQ, 100, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER3, TBM_SETTICFREQ, 100, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER4, TBM_SETTICFREQ, 100, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER1, TBM_SETRANGEMIN, 0, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER1, TBM_SETRANGEMAX, 0, 1000 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER2, TBM_SETRANGEMIN, 0, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER2, TBM_SETRANGEMAX, 0, 1000 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER3, TBM_SETRANGEMIN, 0, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER3, TBM_SETRANGEMAX, 0, 1000 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER4, TBM_SETRANGEMIN, 0, 0 );
SendDlgItemMessage( hwndDlg, IDC_SLIDER4, TBM_SETRANGEMAX, 0, 1000 );
#ifdef SPS_CONFIGDLG_HIDEABLE_EDITOR
showHideEditor( hwndDlg, TRUE );
showHideSliders( hwndDlg, ctx );
#else
ShowWindow( GetDlgItem( hwndDlg, IDC_EDIT ), SW_HIDE );
#endif
if ( !ctx->bypass )
CheckDlgButton( hwndDlg, IDC_BYPASS, BST_CHECKED );
presetToDialog( hwndDlg, ctx );
return 0;
case WM_USER + 0x80:
ShowWindow( hwndDlg, SW_SHOW );
SetForegroundWindow( hwndDlg );
return 0;
case WM_COMMAND:
{
int w = 0;
switch ( LOWORD( wParam ) )
{
case IDC_SLIDER1_LABEL1: w++;
case IDC_SLIDER1_LABEL2: w++;
case IDC_SLIDER1_LABEL3: w++;
case IDC_SLIDER2_LABEL1: w++;
case IDC_SLIDER2_LABEL2: w++;
case IDC_SLIDER2_LABEL3: w++;
case IDC_SLIDER3_LABEL1: w++;
case IDC_SLIDER3_LABEL2: w++;
case IDC_SLIDER3_LABEL3: w++;
case IDC_SLIDER4_LABEL1: w++;
case IDC_SLIDER4_LABEL2: w++;
case IDC_SLIDER4_LABEL3: w++;
if ( HIWORD( wParam ) == EN_CHANGE )
{
w = 12 - w;
GetDlgItemText( hwndDlg, LOWORD( wParam ), ctx->curpreset.slider_labels[ w / 3 ][ w % 3 ], MAX_LABEL_LEN );
}
break;
#ifdef SPS_CONFIGDLG_HIDEABLE_EDITOR
case IDC_EDIT:
SPS_CONFIGDLG_HIDEABLE_EDITOR = !SPS_CONFIGDLG_HIDEABLE_EDITOR;
showHideEditor( hwndDlg, FALSE );
showHideSliders( hwndDlg, ctx );
break;
#endif
case IDC_BYPASS:
ctx->bypass = !IsDlgButtonChecked( hwndDlg, IDC_BYPASS );
break;
case IDC_LOAD:
{
SendMessage( mod.hwndParent, WM_WA_IPC, 0, IPC_PUSH_DISABLE_EXIT );
char temp[ 2048 ] = { 0 };
OPENFILENAME l = { sizeof( l ),0 };
char buf1[ 2048 ], buf2[ 2048 ];
GetCurrentDirectory( sizeof( buf2 ), buf2 );
strcpy( buf1, g_path );
l.lpstrInitialDir = buf1;
l.hwndOwner = hwndDlg;
l.lpstrFilter = BuildFilterString();
l.lpstrFile = temp;
l.nMaxFile = 2048 - 1;
l.lpstrTitle = WASABI_API_LNGSTRING( IDS_LOAD_PRESET );
l.lpstrDefExt = "SPS";
l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER;
if ( GetOpenFileName( &l ) )
{
SPS_load_preset( ctx, temp, "SPS PRESET" );
presetToDialog( hwndDlg, ctx );
}
SetCurrentDirectory( buf2 );
SendMessage( mod.hwndParent, WM_WA_IPC, 0, IPC_POP_DISABLE_EXIT );
}
break;
case IDC_NEW:
char title[ 32 ];
if ( MessageBox( hwndDlg, WASABI_API_LNGSTRING( IDS_CLEAR_CURRENT_SETTINGS ),
WASABI_API_LNGSTRING_BUF( IDS_CONFIRMATION, title, 32 ), MB_YESNO ) == IDYES )
{
EnterCriticalSection( &ctx->code_cs );
memset( &ctx->curpreset, 0, sizeof( ctx->curpreset ) );
ctx->code_needrecompile = 7;
memset( &ctx->triggers, 0, sizeof( ctx->triggers ) );
ctx->curpreset_name[ 0 ] = 0;
LeaveCriticalSection( &ctx->code_cs );
presetToDialog( hwndDlg, ctx );
}
break;
case IDC_SAVE:
SendMessage( mod.hwndParent, WM_WA_IPC, 0, IPC_PUSH_DISABLE_EXIT );
dosavePreset( hwndDlg, ctx );
SendMessage( mod.hwndParent, WM_WA_IPC, 0, IPC_POP_DISABLE_EXIT );
break;
case IDC_INIT:
if ( HIWORD( wParam ) == EN_CHANGE )
{
KillTimer( hwndDlg, 100 );
SetTimer( hwndDlg, 100, 250, NULL );
}
break;
case IDC_PERSAMPLE:
if ( HIWORD( wParam ) == EN_CHANGE )
{
KillTimer( hwndDlg, 101 );
SetTimer( hwndDlg, 101, 250, NULL );
}
break;
case IDC_ONSLIDERCHANGE:
if ( HIWORD( wParam ) == EN_CHANGE )
{
KillTimer( hwndDlg, 102 );
SetTimer( hwndDlg, 102, 250, NULL );
}
break;
case IDC_SHOWHELP:
WASABI_API_DIALOGBOX( IDD_EVAL_HELP, hwndDlg, evalHelpDlgProc );
break;
case IDC_TRIGGER1:
ctx->triggers[ 0 ]++;
break;
case IDC_TRIGGER2:
ctx->triggers[ 1 ]++;
break;
case IDC_TRIGGER3:
ctx->triggers[ 2 ]++;
break;
case IDC_TRIGGER4:
ctx->triggers[ 3 ]++;
break;
}
return 0;
}
case WM_TIMER:
if ( wParam == 100 || wParam == 101 || wParam == 102 )
{
KillTimer( hwndDlg, wParam );
EnterCriticalSection( &ctx->code_cs );
GetDlgItemText( hwndDlg, wParam == 100 ? IDC_INIT : ( wParam == 101 ? IDC_PERSAMPLE : IDC_ONSLIDERCHANGE ), ctx->curpreset.code_text[ wParam - 100 ], MAX_CODE_LEN );
ctx->code_needrecompile |= 1 << ( wParam - 100 );
LeaveCriticalSection( &ctx->code_cs );
}
return 0;
case WM_CLOSE:
#ifdef SPS_CONFIGDLG_ON_WM_CLOSE
SPS_CONFIGDLG_ON_WM_CLOSE
#endif
return 0;
case WM_VSCROLL:
{
HWND swnd = (HWND) lParam;
int t = (int) SendMessage( swnd, TBM_GETPOS, 0, 0 );
if ( swnd == GetDlgItem( hwndDlg, IDC_SLIDER1 ) )
{
ctx->curpreset.sliderpos[ 0 ] = 1000 - t;
ctx->sliderchange = 1;
}
if ( swnd == GetDlgItem( hwndDlg, IDC_SLIDER2 ) )
{
ctx->curpreset.sliderpos[ 1 ] = 1000 - t;
ctx->sliderchange = 1;
}
if ( swnd == GetDlgItem( hwndDlg, IDC_SLIDER3 ) )
{
ctx->curpreset.sliderpos[ 2 ] = 1000 - t;
ctx->sliderchange = 1;
}
if ( swnd == GetDlgItem( hwndDlg, IDC_SLIDER4 ) )
{
ctx->curpreset.sliderpos[ 3 ] = 1000 - t;
ctx->sliderchange = 1;
}
}
break;
}
return 0;
}
}
#endif