diff options
Diffstat (limited to 'protocols/Weather/src/weather_opt.cpp')
| -rw-r--r-- | protocols/Weather/src/weather_opt.cpp | 603 |
1 files changed, 283 insertions, 320 deletions
diff --git a/protocols/Weather/src/weather_opt.cpp b/protocols/Weather/src/weather_opt.cpp index 1d92f20191..5ee7e3353d 100644 --- a/protocols/Weather/src/weather_opt.cpp +++ b/protocols/Weather/src/weather_opt.cpp @@ -24,7 +24,6 @@ contain code for saving/loading options from the database. #include "stdafx.h" -static BOOL opt_startup; int RedrawFrame(WPARAM wParam, LPARAM lParam); //============ LOADING AND SAVING OPTIONS =========== @@ -54,21 +53,21 @@ const wchar_t* GetDefaultText(int c) return L""; } -CMStringW GetTextValue(int c) +CMStringW CWeatherProto::GetTextValue(int c) { CMStringW ret; switch (c) { - case 'C': ret = g_plugin.getMStringW("DisplayText"); break; - case 'b': ret = g_plugin.getMStringW("BriefTextTitle"); break; - case 'B': ret = g_plugin.getMStringW("BriefText"); break; - case 'N': ret = g_plugin.getMStringW("NoteText"); break; - case 'E': ret = g_plugin.getMStringW("ExtText"); break; - case 'H': ret = g_plugin.getMStringW("HistoryText"); break; - case 'X': ret = g_plugin.getMStringW("ExtraText"); break; - case 'S': ret = g_plugin.getMStringW("StatusText"); break; - case 'P': ret = g_plugin.getMStringW("PopupTitle"); break; - case 'p': ret = g_plugin.getMStringW("PopupText"); break; + case 'C': ret = getMStringW("DisplayText"); break; + case 'b': ret = getMStringW("BriefTextTitle"); break; + case 'B': ret = getMStringW("BriefText"); break; + case 'N': ret = getMStringW("NoteText"); break; + case 'E': ret = getMStringW("ExtText"); break; + case 'H': ret = getMStringW("HistoryText"); break; + case 'X': ret = getMStringW("ExtraText"); break; + case 'S': ret = getMStringW("StatusText"); break; + case 'P': ret = getMStringW("PopupTitle"); break; + case 'p': ret = getMStringW("PopupText"); break; } return (ret.IsEmpty()) ? GetDefaultText(c) : ret; @@ -76,248 +75,228 @@ CMStringW GetTextValue(int c) // load options from database + set default if the setting does not exist -void LoadOptions(void) +void CWeatherProto::LoadOptions(void) { memset(&opt, 0, sizeof(opt)); // main options - opt.StartupUpdate = g_plugin.getByte("StartupUpdate", true); - opt.AutoUpdate = g_plugin.getByte("AutoUpdate", true); - opt.UpdateTime = g_plugin.getWord("UpdateTime", 30); - opt.NoProtoCondition = g_plugin.getByte("NoStatus", true); - opt.UpdateOnlyConditionChanged = g_plugin.getByte("CondChangeAsUpdate", true); - opt.RemoveOldData = g_plugin.getByte("RemoveOld", false); - opt.MakeItalic = g_plugin.getByte("MakeItalic", true); - opt.AvatarSize = g_plugin.getByte("AvatarSize", 128); + opt.StartupUpdate = getByte("StartupUpdate", true); + opt.AutoUpdate = getByte("AutoUpdate", true); + opt.UpdateTime = getWord("UpdateTime", 30); + opt.UpdateOnlyConditionChanged = getByte("CondChangeAsUpdate", true); + opt.RemoveOldData = getByte("RemoveOld", false); + opt.MakeItalic = getByte("MakeItalic", true); + opt.AvatarSize = getByte("AvatarSize", 128); // units - opt.tUnit = g_plugin.getWord("tUnit", 1); - opt.wUnit = g_plugin.getWord("wUnit", 2); - opt.vUnit = g_plugin.getWord("vUnit", 1); - opt.pUnit = g_plugin.getWord("pUnit", 4); - opt.dUnit = g_plugin.getWord("dUnit", 1); - opt.eUnit = g_plugin.getWord("eUnit", 2); - - ptrW szValue(g_plugin.getWStringA("DegreeSign")); + opt.tUnit = getWord("tUnit", 1); + opt.wUnit = getWord("wUnit", 2); + opt.vUnit = getWord("vUnit", 1); + opt.pUnit = getWord("pUnit", 4); + opt.dUnit = getWord("dUnit", 1); + opt.eUnit = getWord("eUnit", 2); + + ptrW szValue(getWStringA("DegreeSign")); wcsncpy_s(opt.DegreeSign, (szValue == NULL) ? L"" : szValue, _TRUNCATE); - opt.DoNotAppendUnit = g_plugin.getByte("DoNotAppendUnit", 0); - opt.NoFrac = g_plugin.getByte("NoFractions", 0); + opt.DoNotAppendUnit = getByte("DoNotAppendUnit", 0); + opt.NoFrac = getByte("NoFractions", 0); // advanced - opt.DisCondIcon = g_plugin.getByte("DisableConditionIcon", false); + opt.DisCondIcon = getByte("DisableConditionIcon", false); // popup options - opt.UpdatePopup = g_plugin.getByte("UpdatePopup", true); - opt.AlertPopup = g_plugin.getByte("AlertPopup", true); - opt.PopupOnChange = g_plugin.getByte("PopUpOnChange", true); - opt.ShowWarnings = g_plugin.getByte("ShowWarnings", true); + opt.UpdatePopup = getByte("UpdatePopup", true); + opt.AlertPopup = getByte("AlertPopup", true); + opt.PopupOnChange = getByte("PopUpOnChange", true); + opt.ShowWarnings = getByte("ShowWarnings", true); // popup colors - opt.BGColour = g_plugin.getDword("BackgroundColour", GetSysColor(COLOR_BTNFACE)); - opt.TextColour = g_plugin.getDword("TextColour", GetSysColor(COLOR_WINDOWTEXT)); - opt.UseWinColors = g_plugin.getByte("UseWinColors", false); + opt.BGColour = getDword("BackgroundColour", GetSysColor(COLOR_BTNFACE)); + opt.TextColour = getDword("TextColour", GetSysColor(COLOR_WINDOWTEXT)); + opt.UseWinColors = getByte("UseWinColors", false); // popup actions - opt.LeftClickAction = g_plugin.getDword("LeftClickAction", IDM_M2); - opt.RightClickAction = g_plugin.getDword("RightClickAction", IDM_M1); + opt.LeftClickAction = getDword("LeftClickAction", IDM_M2); + opt.RightClickAction = getDword("RightClickAction", IDM_M1); // popup delay - opt.pDelay = g_plugin.getDword("PopupDelay", 0); + opt.pDelay = getDword("PopupDelay", 0); // misc - if (szValue = g_plugin.getWStringA("Default")) + if (szValue = getWStringA("Default")) wcsncpy_s(opt.Default, szValue, _TRUNCATE); else opt.Default[0] = 0; } // save the options to database -void SaveOptions(void) +void CWeatherProto::SaveOptions(void) { // main options - g_plugin.setByte("StartupUpdate", (uint8_t)opt.StartupUpdate); - g_plugin.setByte("AutoUpdate", (uint8_t)opt.AutoUpdate); - g_plugin.setWord("UpdateTime", opt.UpdateTime); - g_plugin.setByte("NoStatus", (uint8_t)opt.NoProtoCondition); - g_plugin.setByte("CondChangeAsUpdate", (uint8_t)opt.UpdateOnlyConditionChanged); - g_plugin.setByte("RemoveOld", (uint8_t)opt.RemoveOldData); - g_plugin.setByte("MakeItalic", (uint8_t)opt.MakeItalic); - g_plugin.setByte("AvatarSize", (uint8_t)opt.AvatarSize); + setByte("StartupUpdate", (uint8_t)opt.StartupUpdate); + setByte("AutoUpdate", (uint8_t)opt.AutoUpdate); + setWord("UpdateTime", opt.UpdateTime); + setByte("CondChangeAsUpdate", (uint8_t)opt.UpdateOnlyConditionChanged); + setByte("RemoveOld", (uint8_t)opt.RemoveOldData); + setByte("MakeItalic", (uint8_t)opt.MakeItalic); + setByte("AvatarSize", (uint8_t)opt.AvatarSize); // units - g_plugin.setWord("tUnit", opt.tUnit); - g_plugin.setWord("wUnit", opt.wUnit); - g_plugin.setWord("vUnit", opt.vUnit); - g_plugin.setWord("pUnit", opt.pUnit); - g_plugin.setWord("dUnit", opt.dUnit); - g_plugin.setWord("eUnit", opt.eUnit); - g_plugin.setWString("DegreeSign", opt.DegreeSign); - g_plugin.setByte("DoNotAppendUnit", (uint8_t)opt.DoNotAppendUnit); - g_plugin.setByte("NoFractions", (uint8_t)opt.NoFrac); + setWord("tUnit", opt.tUnit); + setWord("wUnit", opt.wUnit); + setWord("vUnit", opt.vUnit); + setWord("pUnit", opt.pUnit); + setWord("dUnit", opt.dUnit); + setWord("eUnit", opt.eUnit); + setWString("DegreeSign", opt.DegreeSign); + setByte("DoNotAppendUnit", (uint8_t)opt.DoNotAppendUnit); + setByte("NoFractions", (uint8_t)opt.NoFrac); // advanced - g_plugin.setByte("DisableConditionIcon", (uint8_t)opt.DisCondIcon); + setByte("DisableConditionIcon", (uint8_t)opt.DisCondIcon); // popup options - g_plugin.setByte("UpdatePopup", (uint8_t)opt.UpdatePopup); - g_plugin.setByte("AlertPopup", (uint8_t)opt.AlertPopup); - g_plugin.setByte("PopUpOnChange", (uint8_t)opt.PopupOnChange); - g_plugin.setByte("ShowWarnings", (uint8_t)opt.ShowWarnings); + setByte("UpdatePopup", (uint8_t)opt.UpdatePopup); + setByte("AlertPopup", (uint8_t)opt.AlertPopup); + setByte("PopUpOnChange", (uint8_t)opt.PopupOnChange); + setByte("ShowWarnings", (uint8_t)opt.ShowWarnings); // popup colors - g_plugin.setDword("BackgroundColour", opt.BGColour); - g_plugin.setDword("TextColour", opt.TextColour); - g_plugin.setByte("UseWinColors", (uint8_t)opt.UseWinColors); + setDword("BackgroundColour", opt.BGColour); + setDword("TextColour", opt.TextColour); + setByte("UseWinColors", (uint8_t)opt.UseWinColors); // popup actions - g_plugin.setDword("LeftClickAction", opt.LeftClickAction); - g_plugin.setDword("RightClickAction", opt.RightClickAction); + setDword("LeftClickAction", opt.LeftClickAction); + setDword("RightClickAction", opt.RightClickAction); // popup delay - g_plugin.setDword("PopupDelay", opt.pDelay); + setDword("PopupDelay", opt.pDelay); // misc stuff - g_plugin.setWString("Default", opt.Default); + setWString("Default", opt.Default); } -//============ MAIN OPTIONS ============ +///////////////////////////////////////////////////////////////////////////////////////// // weather options -static INT_PTR CALLBACK OptionsProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +class COptionsDlg : public CWeatherDlgBase { - wchar_t str[512]; +public: + COptionsDlg(CWeatherProto *ppro) : + CWeatherDlgBase(ppro, IDD_OPTIONS) + {} + + bool OnInitDialog() override + { + wchar_t str[512]; + auto &opt = m_proto->opt; - switch (msg) { - case WM_INITDIALOG: - opt_startup = TRUE; - TranslateDialogDefault(hdlg); - // load settings _ltow(opt.UpdateTime, str, 10); - SetDlgItemText(hdlg, IDC_UPDATETIME, str); - SetDlgItemText(hdlg, IDC_DEGREE, opt.DegreeSign); - - SendDlgItemMessage(hdlg, IDC_AVATARSPIN, UDM_SETRANGE32, 0, 999); - SendDlgItemMessage(hdlg, IDC_AVATARSPIN, UDM_SETPOS, 0, opt.AvatarSize); - SendDlgItemMessage(hdlg, IDC_AVATARSIZE, EM_LIMITTEXT, 3, 0); - - CheckDlgButton(hdlg, IDC_STARTUPUPD, opt.StartupUpdate ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_UPDATE, opt.AutoUpdate ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_PROTOCOND, !opt.NoProtoCondition ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_UPDCONDCHG, opt.UpdateOnlyConditionChanged ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_REMOVEOLD, opt.RemoveOldData ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_MAKEI, opt.MakeItalic ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_DISCONDICON, opt.DisCondIcon ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_DONOTAPPUNITS, opt.DoNotAppendUnit ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_NOFRAC, opt.NoFrac ? BST_CHECKED : BST_UNCHECKED); + SetDlgItemText(m_hwnd, IDC_UPDATETIME, str); + SetDlgItemText(m_hwnd, IDC_DEGREE, opt.DegreeSign); + + SendDlgItemMessage(m_hwnd, IDC_AVATARSPIN, UDM_SETRANGE32, 0, 999); + SendDlgItemMessage(m_hwnd, IDC_AVATARSPIN, UDM_SETPOS, 0, opt.AvatarSize); + SendDlgItemMessage(m_hwnd, IDC_AVATARSIZE, EM_LIMITTEXT, 3, 0); + + CheckDlgButton(m_hwnd, IDC_STARTUPUPD, opt.StartupUpdate ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_UPDATE, opt.AutoUpdate ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_UPDCONDCHG, opt.UpdateOnlyConditionChanged ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_REMOVEOLD, opt.RemoveOldData ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_MAKEI, opt.MakeItalic ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_DISCONDICON, opt.DisCondIcon ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_DONOTAPPUNITS, opt.DoNotAppendUnit ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(m_hwnd, IDC_NOFRAC, opt.NoFrac ? BST_CHECKED : BST_UNCHECKED); // load units switch (opt.tUnit) { // temperature - case 1: CheckRadioButton(hdlg, IDC_T1, IDC_T2, IDC_T1); break; - case 2: CheckRadioButton(hdlg, IDC_T1, IDC_T2, IDC_T2); break; + case 1: CheckRadioButton(m_hwnd, IDC_T1, IDC_T2, IDC_T1); break; + case 2: CheckRadioButton(m_hwnd, IDC_T1, IDC_T2, IDC_T2); break; } switch (opt.wUnit) { // wind - case 1: CheckRadioButton(hdlg, IDC_W1, IDC_W4, IDC_W1); break; - case 2: CheckRadioButton(hdlg, IDC_W1, IDC_W4, IDC_W2); break; - case 3: CheckRadioButton(hdlg, IDC_W1, IDC_W4, IDC_W3); break; - case 4: CheckRadioButton(hdlg, IDC_W1, IDC_W4, IDC_W4); break; + case 1: CheckRadioButton(m_hwnd, IDC_W1, IDC_W4, IDC_W1); break; + case 2: CheckRadioButton(m_hwnd, IDC_W1, IDC_W4, IDC_W2); break; + case 3: CheckRadioButton(m_hwnd, IDC_W1, IDC_W4, IDC_W3); break; + case 4: CheckRadioButton(m_hwnd, IDC_W1, IDC_W4, IDC_W4); break; } switch (opt.vUnit) { // visibility - case 1: CheckRadioButton(hdlg, IDC_V1, IDC_V2, IDC_V1); break; - case 2: CheckRadioButton(hdlg, IDC_V1, IDC_V2, IDC_V2); break; + case 1: CheckRadioButton(m_hwnd, IDC_V1, IDC_V2, IDC_V1); break; + case 2: CheckRadioButton(m_hwnd, IDC_V1, IDC_V2, IDC_V2); break; } switch (opt.pUnit) { // pressure - case 1: CheckRadioButton(hdlg, IDC_P1, IDC_P4, IDC_P1); break; - case 2: CheckRadioButton(hdlg, IDC_P1, IDC_P4, IDC_P2); break; - case 3: CheckRadioButton(hdlg, IDC_P1, IDC_P4, IDC_P3); break; - case 4: CheckRadioButton(hdlg, IDC_P1, IDC_P4, IDC_P4); break; + case 1: CheckRadioButton(m_hwnd, IDC_P1, IDC_P4, IDC_P1); break; + case 2: CheckRadioButton(m_hwnd, IDC_P1, IDC_P4, IDC_P2); break; + case 3: CheckRadioButton(m_hwnd, IDC_P1, IDC_P4, IDC_P3); break; + case 4: CheckRadioButton(m_hwnd, IDC_P1, IDC_P4, IDC_P4); break; } switch (opt.dUnit) { // pressure - case 1: CheckRadioButton(hdlg, IDC_D1, IDC_D3, IDC_D1); break; - case 2: CheckRadioButton(hdlg, IDC_D1, IDC_D3, IDC_D2); break; - case 3: CheckRadioButton(hdlg, IDC_D1, IDC_D3, IDC_D3); break; + case 1: CheckRadioButton(m_hwnd, IDC_D1, IDC_D3, IDC_D1); break; + case 2: CheckRadioButton(m_hwnd, IDC_D1, IDC_D3, IDC_D2); break; + case 3: CheckRadioButton(m_hwnd, IDC_D1, IDC_D3, IDC_D3); break; } switch (opt.eUnit) { // elev - case 1: CheckRadioButton(hdlg, IDC_E1, IDC_E2, IDC_E1); break; - case 2: CheckRadioButton(hdlg, IDC_E1, IDC_E2, IDC_E2); break; + case 1: CheckRadioButton(m_hwnd, IDC_E1, IDC_E2, IDC_E1); break; + case 2: CheckRadioButton(m_hwnd, IDC_E1, IDC_E2, IDC_E2); break; } - opt_startup = FALSE; - return 0; - - case WM_COMMAND: - if (HIWORD(wparam) == BN_CLICKED && GetFocus() == (HWND)lparam) - if (!opt_startup) SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0); - if (!((LOWORD(wparam) == IDC_UPDATE || LOWORD(wparam) == IDC_DEGREE) && - (HIWORD(wparam) != EN_CHANGE || (HWND)lparam != GetFocus()))) - if (!opt_startup) SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0); - return 0; - - case WM_NOTIFY: - switch (((LPNMHDR)lparam)->code) { - case PSN_APPLY: - // change the status for weather protocol - if (IsDlgButtonChecked(hdlg, IDC_PROTOCOND) && opt.DefStn != NULL) { - old_status = status; - status = MapCondToStatus(opt.DefStn); - ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)old_status, status); - } - - // get update time and remove the old timer - GetDlgItemText(hdlg, IDC_UPDATETIME, str, _countof(str)); - opt.UpdateTime = (uint16_t)_wtoi(str); - if (opt.UpdateTime < 1) opt.UpdateTime = 1; - KillTimer(nullptr, timerId); - timerId = SetTimer(nullptr, 0, opt.UpdateTime * 60000, timerProc); - - // other general options - GetDlgItemText(hdlg, IDC_DEGREE, opt.DegreeSign, _countof(opt.DegreeSign)); - opt.StartupUpdate = IsDlgButtonChecked(hdlg, IDC_STARTUPUPD); - opt.AutoUpdate = IsDlgButtonChecked(hdlg, IDC_UPDATE); - opt.NoProtoCondition = BST_UNCHECKED == IsDlgButtonChecked(hdlg, IDC_PROTOCOND); - opt.DisCondIcon = IsDlgButtonChecked(hdlg, IDC_DISCONDICON); - opt.UpdateOnlyConditionChanged = (uint8_t)IsDlgButtonChecked(hdlg, IDC_UPDCONDCHG); - opt.RemoveOldData = IsDlgButtonChecked(hdlg, IDC_REMOVEOLD); - opt.MakeItalic = IsDlgButtonChecked(hdlg, IDC_MAKEI); - opt.AvatarSize = GetDlgItemInt(hdlg, IDC_AVATARSIZE, nullptr, FALSE); - opt.DoNotAppendUnit = IsDlgButtonChecked(hdlg, IDC_DONOTAPPUNITS); - opt.NoFrac = IsDlgButtonChecked(hdlg, IDC_NOFRAC); - UpdateMenu(opt.AutoUpdate); - - // save the units - if (IsDlgButtonChecked(hdlg, IDC_T1)) opt.tUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_T2)) opt.tUnit = 2; - if (IsDlgButtonChecked(hdlg, IDC_W1)) opt.wUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_W2)) opt.wUnit = 2; - if (IsDlgButtonChecked(hdlg, IDC_W3)) opt.wUnit = 3; - if (IsDlgButtonChecked(hdlg, IDC_W4)) opt.wUnit = 4; - if (IsDlgButtonChecked(hdlg, IDC_V1)) opt.vUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_V2)) opt.vUnit = 2; - if (IsDlgButtonChecked(hdlg, IDC_P1)) opt.pUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_P2)) opt.pUnit = 2; - if (IsDlgButtonChecked(hdlg, IDC_P3)) opt.pUnit = 3; - if (IsDlgButtonChecked(hdlg, IDC_P4)) opt.pUnit = 4; - if (IsDlgButtonChecked(hdlg, IDC_D1)) opt.dUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_D2)) opt.dUnit = 2; - if (IsDlgButtonChecked(hdlg, IDC_D3)) opt.dUnit = 3; - if (IsDlgButtonChecked(hdlg, IDC_E1)) opt.eUnit = 1; - if (IsDlgButtonChecked(hdlg, IDC_E2)) opt.eUnit = 2; - - // save the new weather options - SaveOptions(); - - RedrawFrame(0, 0); - - return 1; - } - break; + return true; } - return 0; -} -//============ TEXT OPTION DIALOG ============ + bool OnApply() override + { + wchar_t str[512]; + auto &opt = m_proto->opt; + + // get update time and remove the old timer + GetDlgItemText(m_hwnd, IDC_UPDATETIME, str, _countof(str)); + opt.UpdateTime = (uint16_t)_wtoi(str); + if (opt.UpdateTime < 1) opt.UpdateTime = 1; + m_proto->RestartTimer(); + + // other general options + GetDlgItemText(m_hwnd, IDC_DEGREE, opt.DegreeSign, _countof(opt.DegreeSign)); + opt.StartupUpdate = IsDlgButtonChecked(m_hwnd, IDC_STARTUPUPD); + opt.AutoUpdate = IsDlgButtonChecked(m_hwnd, IDC_UPDATE); + opt.DisCondIcon = IsDlgButtonChecked(m_hwnd, IDC_DISCONDICON); + opt.UpdateOnlyConditionChanged = (uint8_t)IsDlgButtonChecked(m_hwnd, IDC_UPDCONDCHG); + opt.RemoveOldData = IsDlgButtonChecked(m_hwnd, IDC_REMOVEOLD); + opt.MakeItalic = IsDlgButtonChecked(m_hwnd, IDC_MAKEI); + opt.AvatarSize = GetDlgItemInt(m_hwnd, IDC_AVATARSIZE, nullptr, FALSE); + opt.DoNotAppendUnit = IsDlgButtonChecked(m_hwnd, IDC_DONOTAPPUNITS); + opt.NoFrac = IsDlgButtonChecked(m_hwnd, IDC_NOFRAC); + m_proto->UpdateMenu(opt.AutoUpdate); + + // save the units + if (IsDlgButtonChecked(m_hwnd, IDC_T1)) opt.tUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_T2)) opt.tUnit = 2; + if (IsDlgButtonChecked(m_hwnd, IDC_W1)) opt.wUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_W2)) opt.wUnit = 2; + if (IsDlgButtonChecked(m_hwnd, IDC_W3)) opt.wUnit = 3; + if (IsDlgButtonChecked(m_hwnd, IDC_W4)) opt.wUnit = 4; + if (IsDlgButtonChecked(m_hwnd, IDC_V1)) opt.vUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_V2)) opt.vUnit = 2; + if (IsDlgButtonChecked(m_hwnd, IDC_P1)) opt.pUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_P2)) opt.pUnit = 2; + if (IsDlgButtonChecked(m_hwnd, IDC_P3)) opt.pUnit = 3; + if (IsDlgButtonChecked(m_hwnd, IDC_P4)) opt.pUnit = 4; + if (IsDlgButtonChecked(m_hwnd, IDC_D1)) opt.dUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_D2)) opt.dUnit = 2; + if (IsDlgButtonChecked(m_hwnd, IDC_D3)) opt.dUnit = 3; + if (IsDlgButtonChecked(m_hwnd, IDC_E1)) opt.eUnit = 1; + if (IsDlgButtonChecked(m_hwnd, IDC_E2)) opt.eUnit = 2; + + // save the new weather options + m_proto->SaveOptions(); + + RedrawFrame(0, 0); + return true; + } +}; +///////////////////////////////////////////////////////////////////////////////////////// // text option dialog struct @@ -338,172 +317,156 @@ static controls[] = { 'S', IDC_BTITLE2, "StatusText" }, }; -static INT_PTR CALLBACK DlgProcText(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) +class COptionsTextDlg : public CWeatherDlgBase { - RECT rc, pos; - HWND button; - HMENU hMenu, hMenu1; - switch (msg) { - case WM_INITDIALOG: - opt_startup = TRUE; + CCtrlMButton btnMore, btnReset, tm1, tm2, tm3, tm4, tm5, tm6, tm7, tm8; + +public: + COptionsTextDlg(CWeatherProto *ppro) : + CWeatherDlgBase(ppro, IDD_TEXTOPT), + btnMore(this, IDC_MORE, 0, 0), + btnReset(this, IDC_RESET, 0, 0), + tm1(this, IDC_TM1, 0, 0), + tm2(this, IDC_TM2, 0, 0), + tm3(this, IDC_TM3, 0, 0), + tm4(this, IDC_TM4, 0, 0), + tm5(this, IDC_TM5, 0, 0), + tm6(this, IDC_TM6, 0, 0), + tm7(this, IDC_TM7, 0, 0), + tm8(this, IDC_TM8, 0, 0) + { + btnMore.OnClick = Callback(this, &COptionsTextDlg::onClick_More); + btnReset.OnClick = Callback(this, &COptionsTextDlg::onClick_Reset); + + tm1.OnClick = tm2.OnClick = tm3.OnClick = tm4.OnClick = tm5.OnClick = tm6.OnClick = tm7.OnClick = tm8.OnClick = + Callback(this, &COptionsTextDlg::onClick_TM); + } + + bool OnInitDialog() override + { // set windows position, make it top-most - GetWindowRect(hdlg, &rc); - SetWindowPos(hdlg, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE); - TranslateDialogDefault(hdlg); + RECT rc; + GetWindowRect(m_hwnd, &rc); + SetWindowPos(m_hwnd, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE); // generate the display text for variable list - SetDlgItemText(hdlg, IDC_VARLIST, VAR_LIST_OPT); + SetDlgItemText(m_hwnd, IDC_VARLIST, VAR_LIST_OPT); for (auto &it : controls) - SetDlgItemText(hdlg, it.id, GetTextValue(it.c)); + SetDlgItemText(m_hwnd, it.id, m_proto->GetTextValue(it.c)); // make the more variable and other buttons flat - SendDlgItemMessage(hdlg, IDC_MORE, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM1, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM2, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM3, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM4, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM5, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM6, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM7, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_TM8, BUTTONSETASFLATBTN, TRUE, 0); - SendDlgItemMessage(hdlg, IDC_RESET, BUTTONSETASFLATBTN, TRUE, 0); - - // load the settings - opt_startup = FALSE; - return TRUE; - - case WM_COMMAND: - if (opt_startup) return TRUE; - switch (LOWORD(wParam)) { - case IDC_CTEXT: - case IDC_BTITLE: - case IDC_BTEXT: - case IDC_NTEXT: - case IDC_XTEXT: - case IDC_ETEXT: - case IDC_HTEXT: - case IDC_BTITLE2: - if (HIWORD(wParam) == EN_CHANGE) - SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0); - break; + tm1.MakeFlat(); + tm2.MakeFlat(); + tm3.MakeFlat(); + tm4.MakeFlat(); + tm5.MakeFlat(); + tm6.MakeFlat(); + tm7.MakeFlat(); + tm8.MakeFlat(); + btnMore.MakeFlat(); + btnReset.MakeFlat(); + return true; + } - case IDC_MORE: - // display custom variables list - MoreVarList(); - break; + bool OnApply() override + { + // save the option + wchar_t textstr[MAX_TEXT_SIZE]; + for (auto &it : controls) { + GetDlgItemText(m_hwnd, it.id, textstr, _countof(textstr)); + if (!mir_wstrcmpi(textstr, GetDefaultText(it.c))) + g_plugin.delSetting(it.setting); + else + g_plugin.setWString(it.setting, textstr); + } - case IDC_TM1: - case IDC_TM2: - case IDC_TM3: - case IDC_TM4: - case IDC_TM5: - case IDC_TM6: - case IDC_TM7: - case IDC_TM8: - // display the menu - button = GetDlgItem(hdlg, LOWORD(wParam)); - GetWindowRect(button, &pos); - hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_TMMENU)); - hMenu1 = GetSubMenu(hMenu, 0); - TranslateMenu(hMenu1); - { - auto &var = controls[int(LOWORD(wParam)) - IDC_TM1]; - - switch (TrackPopupMenu(hMenu1, TPM_LEFTBUTTON | TPM_RETURNCMD, pos.left, pos.bottom, 0, hdlg, nullptr)) { - case ID_MPREVIEW: - { - // show the preview in a message box, using the weather data from the default station - WEATHERINFO winfo = LoadWeatherInfo(opt.DefStn); - wchar_t buf[2] = { var.c, 0 }, str[4096]; - GetDisplay(&winfo, buf, str); - MessageBox(nullptr, str, TranslateT("Weather Protocol Text Preview"), MB_OK | MB_TOPMOST); - } - break; - - case ID_MRESET: - SetDlgItemText(hdlg, var.id, GetDefaultText(var.c)); - break; - } - DestroyMenu(hMenu); - } - break; + m_proto->SaveOptions(); + m_proto->UpdateAllInfo(0, 0); + return true; + } - case IDC_RESET: - // left click action selection menu - button = GetDlgItem(hdlg, IDC_RESET); - GetWindowRect(button, &pos); - hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_TMENU)); - hMenu1 = GetSubMenu(hMenu, 0); - TranslateMenu(hMenu1); - switch (TrackPopupMenu(hMenu1, TPM_LEFTBUTTON | TPM_RETURNCMD, pos.left, pos.bottom, 0, hdlg, nullptr)) { - case ID_T1: - // reset to the strings in memory, discard all changes - for (auto &it : controls) - SetDlgItemText(hdlg, it.id, GetTextValue(it.c)); + void onClick_More(CCtrlButton *) + { + MoreVarList(); + } + + void onClick_TM(CCtrlButton *pButton) + { + // display the menu + RECT pos; + GetWindowRect(pButton->GetHwnd(), &pos); + HMENU hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_TMMENU)); + HMENU hMenu1 = GetSubMenu(hMenu, 0); + TranslateMenu(hMenu1); + { + auto &var = controls[pButton->GetCtrlId() - IDC_TM1]; + + switch (TrackPopupMenu(hMenu1, TPM_LEFTBUTTON | TPM_RETURNCMD, pos.left, pos.bottom, 0, m_hwnd, nullptr)) { + case ID_MPREVIEW: + { + // show the preview in a message box, using the weather data from the default station + WEATHERINFO winfo = LoadWeatherInfo(m_proto->opt.DefStn); + wchar_t buf[2] = { var.c, 0 }, str[4096]; + GetDisplay(&winfo, buf, str); + MessageBox(nullptr, str, TranslateT("Weather Protocol Text Preview"), MB_OK | MB_TOPMOST); + } break; - case ID_T2: - // reset to the default setting - for (auto &it : controls) - SetDlgItemText(hdlg, it.id, GetDefaultText(it.c)); + case ID_MRESET: + SetDlgItemText(m_hwnd, var.id, GetDefaultText(var.c)); break; } DestroyMenu(hMenu); - break; } - return TRUE; - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) { - case PSN_APPLY: - // save the option - wchar_t textstr[MAX_TEXT_SIZE]; - for (auto &it : controls) { - GetDlgItemText(hdlg, it.id, textstr, _countof(textstr)); - if (!mir_wstrcmpi(textstr, GetDefaultText(it.c))) - g_plugin.delSetting(it.setting); - else - g_plugin.setWString(it.setting, textstr); - } + } + + void onClick_Reset(CCtrlButton *) + { + // left click action selection menu + RECT pos; + GetWindowRect(btnReset.GetHwnd(), &pos); + HMENU hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_TMENU)); + HMENU hMenu1 = GetSubMenu(hMenu, 0); + TranslateMenu(hMenu1); + switch (TrackPopupMenu(hMenu1, TPM_LEFTBUTTON | TPM_RETURNCMD, pos.left, pos.bottom, 0, m_hwnd, nullptr)) { + case ID_T1: + // reset to the strings in memory, discard all changes + for (auto &it : controls) + SetDlgItemText(m_hwnd, it.id, m_proto->GetTextValue(it.c)); + break; - SaveOptions(); - UpdateAllInfo(0, 0); + case ID_T2: + // reset to the default setting + for (auto &it : controls) + SetDlgItemText(m_hwnd, it.id, GetDefaultText(it.c)); break; } - break; + DestroyMenu(hMenu); } - return FALSE; -} - - -//============ OPTION INITIALIZATION ============ +}; +///////////////////////////////////////////////////////////////////////////////////////// // register the weather option pages -int OptInit(WPARAM wParam, LPARAM) + +int CWeatherProto::OptInit(WPARAM wParam, LPARAM) { - // plugin options OPTIONSDIALOGPAGE odp = {}; + odp.szGroup.w = LPGENW("Network"); + odp.szTitle.w = m_tszUserName; odp.position = 95600; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS); - odp.pfnDlgProc = OptionsProc; - odp.szGroup.a = LPGEN("Network"); - odp.szTitle.a = MODULENAME; + odp.flags = ODPF_BOLDGROUPS | ODPF_UNICODE; + + // plugin options + odp.pDialog = new COptionsDlg(this); odp.szTab.a = LPGEN("General"); - odp.flags = ODPF_BOLDGROUPS; g_plugin.addOptions(wParam, &odp); // text options - odp.pszTemplate = MAKEINTRESOURCEA(IDD_TEXTOPT); - odp.pfnDlgProc = DlgProcText; + odp.pDialog = new COptionsTextDlg(this); odp.szTab.a = LPGEN("Display"); g_plugin.addOptions(wParam, &odp); - // if popup service exists, load the weather popup options - odp.position = 100000000; - odp.pszTemplate = MAKEINTRESOURCEA(IDD_POPUP); - odp.szGroup.a = LPGEN("Popups"); - odp.szTab.a = nullptr; - odp.pfnDlgProc = DlgPopupOpts; - g_plugin.addOptions(wParam, &odp); + InitPopupOptions(wParam); return 0; } |
