winamp/Src/Plugins/General/gen_ff/prefs_general.cpp
2024-09-24 14:54:57 +02:00

273 lines
9.2 KiB
C++

#include "precomp__gen_ff.h"
#include "resource.h"
#include <commctrl.h>
#include "wa2cfgitems.h"
#include "gen.h"
#include "prefs.h"
#include "../Agave/Language/api_language.h"
#include <api/skin/skinparse.h>
void turnonoff(HWND wnd, int *t, int n, int v);
extern int toggle_from_wa2;
extern HWND subWnd;
static int auto_res = -1;
static int cur_res = 10;
static DWORD cur_res_last = 0;
static int cur_res_total = 0;
static int cur_res_num = 0;
static int old_res = 0;
static int dock_dist = 0;
static int dock_dist2 = 0;
static int spin_inc = 0;
static int spin_show = 0;
static int spin_hide = 0;
int desktopalpha_unavail[] = {IDC_STATIC_DA1, IDC_CHECK_DESKTOPALPHA};
static const wchar_t *getScrollTextSpeedW(float v)
{
int skipn = (int)((1.0f / v) - 1 + 0.5f);
static wchar_t buf[64];
ZERO(buf);
switch (skipn)
{
case 0: return WASABI_API_LNGSTRINGW_BUF(IDS_FASTER, buf, 64);
case 1: return WASABI_API_LNGSTRINGW_BUF(IDS_FAST, buf, 64);
case 2: return WASABI_API_LNGSTRINGW_BUF(IDS_AVERAGE, buf, 64);
case 3: return WASABI_API_LNGSTRINGW_BUF(IDS_SLOW, buf, 64);
case 4: return WASABI_API_LNGSTRINGW_BUF(IDS_SLOWER, buf, 64);
}
return WASABI_API_LNGSTRINGW_BUF(IDS_N_A, buf, 64);
}
static void nextRes(HWND dlg)
{
if (cur_res == 250)
{
cfg_uioptions_timerresolution.setValueAsInt(old_res);
SetDlgItemTextW(dlg, IDC_TXT, WASABI_API_LNGSTRINGW(IDS_FAILED_TO_DETECT_OPTIMAL_RESOLUTION));
}
else
{
if (cur_res >= 100)
cur_res += 5;
else if (cur_res >= 50)
cur_res += 2;
else
cur_res++;
SetDlgItemTextW(dlg, IDC_TXT, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_AUTO_DETECTING), cur_res));
cur_res_last = Wasabi::Std::getTickCount();
cur_res_total = 0;
cur_res_num = 0;
SetTimer(dlg, 1, cur_res, NULL);
}
}
static INT_PTR CALLBACK autoTimerResProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
old_res = cfg_uioptions_timerresolution.getValueAsInt();
cur_res = -1;
return 1;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
cfg_uioptions_timerresolution.setValueAsInt(old_res);
EndDialog(hwndDlg, 0);
return 0;
case IDOK:
if (cur_res == -1)
{
cfg_uioptions_timerresolution.setValueAsInt(250);
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
SetDlgItemTextW(hwndDlg, IDC_TXT, WASABI_API_LNGSTRINGW(IDS_PREPARING_AUTO_DETECTION));
SetTimer(hwndDlg, 2, 1000, NULL);
}
else EndDialog(hwndDlg, IDOK);
return 0;
}
break;
case WM_TIMER:
{
if (wParam == 1)
{
DWORD now = Wasabi::Std::getTickCount();
cur_res_total += now - cur_res_last;
cur_res_num++;
cur_res_last = now;
int m = 5;
if (cur_res >= 100) m = 2;
else if (cur_res >= 50) m = 3;
if (cur_res_num == m)
{
float average = (float)cur_res_total / (float)m;
if (average <= (float)cur_res*1.1)
{
auto_res = cur_res;
cfg_uioptions_timerresolution.setValueAsInt(old_res);
SetDlgItemTextW(hwndDlg, IDC_TXT, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_AUTO_DETECTION_SUCCESSFUL), cur_res));
SetDlgItemTextW(hwndDlg, IDOK, WASABI_API_LNGSTRINGW(IDS_ACCEPT));
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
}
else
{
nextRes(hwndDlg);
}
}
return 0;
}
else if (wParam == 2)
{
KillTimer(hwndDlg, 2);
cur_res = 9;
nextRes(hwndDlg);
return 0;
}
break;
}
}
return FALSE;
}
static void autoTimerRes(HWND dlg)
{
INT_PTR r = WASABI_API_DIALOGBOXW(IDD_AUTOTIMERRES, dlg, autoTimerResProc);
if (r == IDOK)
{
cfg_uioptions_timerresolution.setValueAsInt(auto_res);
SendMessageW(GetDlgItem(dlg, IDC_SLIDER_TIMERRESOLUTION), TBM_SETPOS, 1, auto_res);
SetDlgItemTextW(dlg, IDC_STATIC_TIMERRES, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_TIMERS_RESOLUTION), auto_res));
}
}
INT_PTR CALLBACK ffPrefsProc1(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
dock_dist = dock_dist2 = spin_inc = spin_show = spin_hide = 0;
CheckDlgButton(hwndDlg, IDC_CHECK_DESKTOPALPHA, cfg_uioptions_desktopalpha.getValueAsInt());
if (!Wasabi::Std::Wnd::isDesktopAlphaAvailable()) turnonoff(hwndDlg, desktopalpha_unavail, sizeof(desktopalpha_unavail)/sizeof(int), 0);
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TIMERRESOLUTION), TBM_SETRANGEMAX, 0, 250);
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TIMERRESOLUTION), TBM_SETRANGEMIN, 0, 10);
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TIMERRESOLUTION), TBM_SETPOS, 1, cfg_uioptions_timerresolution.getValueAsInt());
SetDlgItemTextW(hwndDlg, IDC_STATIC_TIMERRES, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_TIMERS_RESOLUTION), cfg_uioptions_timerresolution.getValueAsInt()));
CheckDlgButton(hwndDlg, IDC_CHECK_TOOLTIPS, cfg_uioptions_tooltips.getValueAsInt());
CheckDlgButton(hwndDlg, IDC_CHECK_DOCKING, cfg_options_docking.getValueAsInt());
CheckDlgButton(hwndDlg, IDC_CHECK_DOCKING2, cfg_options_appbarondrag.getValueAsInt());
SendMessageW(GetDlgItem(hwndDlg,IDC_SPIN_DOCKDISTANCE),UDM_SETRANGE,0,MAKELONG(1000,0));
SetDlgItemInt(hwndDlg, IDC_EDIT_DOCKDISTANCE, cfg_options_dockingdistance.getValueAsInt(), 0);
SendMessageW(GetDlgItem(hwndDlg,IDC_SPIN_DOCKDISTANCE2),UDM_SETRANGE,0,MAKELONG(1000,0));
SetDlgItemInt(hwndDlg, IDC_EDIT_DOCKDISTANCE2, cfg_options_appbardockingdistance.getValueAsInt(), 0);
SetDlgItemTextA(hwndDlg, IDC_EDIT_INCREMENT, StringPrintf("%d", cfg_uioptions_textincrement.getValueAsInt()));
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TICKERSPEED), TBM_SETRANGEMAX, 0, 4);
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TICKERSPEED), TBM_SETRANGEMIN, 0, 0);
SendMessageW(GetDlgItem(hwndDlg, IDC_SLIDER_TICKERSPEED), TBM_SETPOS, 1, (int)(1.0f / cfg_uioptions_textspeed.getValueAsDouble() - 1.0f + 0.5f));
SetDlgItemTextW(hwndDlg, IDC_STATIC_TICKER, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_TEXT_SCROLL_SPEED), getScrollTextSpeedW((float)cfg_uioptions_textspeed.getValueAsDouble())));
SendMessageW(GetDlgItem(hwndDlg,IDC_SPIN_SHOWTIME),UDM_SETRANGE,0,MAKELONG(9999,0));
SetDlgItemInt(hwndDlg, IDC_EDIT_SHOWTIME, cfg_uioptions_appbarsshowtime.getValueAsInt(), 0);
SendMessageW(GetDlgItem(hwndDlg,IDC_SPIN_HIDETIME),UDM_SETRANGE,0,MAKELONG(9999,0));
SetDlgItemInt(hwndDlg, IDC_EDIT_HIDETIME, cfg_uioptions_appbarshidetime.getValueAsInt(), 0);
dock_dist = dock_dist2 = spin_inc = spin_show = spin_hide = 1;
return 1;
}
case WM_COMMAND:
toggle_from_wa2 = 1;
switch (LOWORD(wParam))
{
case IDC_CHECK_DESKTOPALPHA:
cfg_uioptions_desktopalpha.setValueAsInt(IsDlgButtonChecked(hwndDlg, IDC_CHECK_DESKTOPALPHA));
return 0;
case IDC_BUTTON_AUTOTIMERRES:
autoTimerRes(hwndDlg);
return 0;
case IDC_CHECK_TOOLTIPS:
cfg_uioptions_tooltips.setValueAsInt(IsDlgButtonChecked(hwndDlg, IDC_CHECK_TOOLTIPS));
return 0;
case IDC_CHECK_DOCKING:
cfg_options_docking.setValueAsInt(IsDlgButtonChecked(hwndDlg, IDC_CHECK_DOCKING));
return 0;
case IDC_CHECK_DOCKING2:
cfg_options_appbarondrag.setValueAsInt(IsDlgButtonChecked(hwndDlg, IDC_CHECK_DOCKING2));
return 0;
case IDC_EDIT_DOCKDISTANCE:
if (HIWORD(wParam) == EN_CHANGE && dock_dist)
{
int t, a = GetDlgItemInt(hwndDlg, IDC_EDIT_DOCKDISTANCE, &t, 0);
if (t) cfg_options_dockingdistance.setValueAsInt(a);
}
return 0;
case IDC_EDIT_DOCKDISTANCE2:
if (HIWORD(wParam) == EN_CHANGE && dock_dist2)
{
int t, a = GetDlgItemInt(hwndDlg, IDC_EDIT_DOCKDISTANCE2, &t, 0);
if (t) cfg_options_appbardockingdistance.setValueAsInt(a);
}
return 0;
case IDC_EDIT_INCREMENT:
if (HIWORD(wParam) == EN_CHANGE && spin_inc)
{
int t, a = GetDlgItemInt(hwndDlg, IDC_EDIT_INCREMENT, &t, 0);
if (t) cfg_uioptions_textincrement.setValueAsInt(a);
}
return 0;
case IDC_EDIT_SHOWTIME:
if (HIWORD(wParam) == EN_CHANGE && spin_show)
{
int t, a = GetDlgItemInt(hwndDlg, IDC_EDIT_SHOWTIME, &t, 0);
if (t) cfg_uioptions_appbarsshowtime.setValueAsInt(a);
}
return 0;
case IDC_EDIT_HIDETIME:
if (HIWORD(wParam) == EN_CHANGE && spin_hide)
{
int t, a = GetDlgItemInt(hwndDlg, IDC_EDIT_HIDETIME, &t, 0);
if (t) cfg_uioptions_appbarshidetime.setValueAsInt(a);
}
return 0;
}
toggle_from_wa2 = 0;
break;
case WM_HSCROLL:
{
int t = (int)SendMessageW((HWND) lParam, TBM_GETPOS, 0, 0);
HWND ctrl = (HWND) lParam;
if (ctrl == GetDlgItem(hwndDlg, IDC_SLIDER_TIMERRESOLUTION))
{
cfg_uioptions_timerresolution.setValueAsInt(t);
SetDlgItemTextW(hwndDlg, IDC_STATIC_TIMERRES, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_TIMERS_RESOLUTION), cfg_uioptions_timerresolution.getValueAsInt()));
}
else if (ctrl == GetDlgItem(hwndDlg, IDC_SLIDER_TICKERSPEED))
{
cfg_uioptions_textspeed.setValueAsDouble(1.0 / (float)(t + 1));
SetDlgItemTextW(hwndDlg, IDC_STATIC_TICKER, StringPrintfW(WASABI_API_LNGSTRINGW(IDS_TEXT_SCROLL_SPEED), getScrollTextSpeedW((float)cfg_uioptions_textspeed.getValueAsDouble())));
}
break;
}
case WM_DESTROY:
subWnd = NULL;
dock_dist = dock_dist2 = spin_inc = spin_show = spin_hide = 0;
return 0;
}
const int controls[] =
{
IDC_SLIDER_TIMERRESOLUTION,
IDC_SLIDER_TICKERSPEED,
};
if (FALSE != WASABI_API_APP->DirectMouseWheel_ProcessDialogMessage(hwndDlg, uMsg, wParam, lParam, controls, ARRAYSIZE(controls)))
return TRUE;
return 0;
}