diff --git a/idd/LGIddHelper/CConfigWindow.cpp b/idd/LGIddHelper/CConfigWindow.cpp index 6f64fe33..815f4d9a 100644 --- a/idd/LGIddHelper/CConfigWindow.cpp +++ b/idd/LGIddHelper/CConfigWindow.cpp @@ -57,11 +57,20 @@ void CConfigWindow::updateFont() for (HWND child : std::initializer_list({ *m_version, *m_modeGroup, *m_modeBox, *m_widthLabel, *m_heightLabel, *m_refreshLabel, - *m_modeWidth, *m_modeHeight, *m_modeRefresh, *m_modeUpdate, + *m_modeWidth, *m_modeHeight, *m_modeRefresh, *m_modeUpdate, *m_modeDelete, })) SendMessage(child, WM_SETFONT, (WPARAM)m_font.Get(), 1); } +void CConfigWindow::updateModeList() +{ + m_modeBox->addItem(L"", -1); + + auto &modes = *m_modes; + for (size_t i = 0; i < modes.size(); ++i) + m_modeBox->addItem(modes[i].toString(), i); +} + LRESULT CConfigWindow::handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) @@ -95,13 +104,7 @@ LRESULT CConfigWindow::onCreate() m_modeBox.reset(new CListBox(WS_CHILD | WS_VISIBLE | LBS_NOTIFY, m_hwnd)); if (m_modes) - { - m_modeBox->addItem(L"", -1); - - auto &modes = *m_modes; - for (size_t i = 0; i < modes.size(); ++i) - m_modeBox->addItem(modes[i].toString(), i); - } + updateModeList(); m_widthLabel.reset(new CStaticWidget(L"Width:", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, m_hwnd)); m_heightLabel.reset(new CStaticWidget(L"Height:", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE, m_hwnd)); @@ -112,7 +115,9 @@ LRESULT CConfigWindow::onCreate() m_modeRefresh.reset(new CEditWidget(WS_CHILD | WS_VISIBLE | ES_LEFT, m_hwnd)); m_modeUpdate.reset(new CButton(L"Save", WS_CHILD | WS_VISIBLE, m_hwnd)); + m_modeDelete.reset(new CButton(L"Delete", WS_CHILD | WS_VISIBLE, m_hwnd)); EnableWindow(*m_modeUpdate, FALSE); + EnableWindow(*m_modeDelete, FALSE); updateFont(); @@ -139,36 +144,38 @@ LRESULT CConfigWindow::onResize(DWORD width, DWORD height) pos.pinBottomLeft(*m_modeHeight, 75, 72, 50, 20); pos.pinBottomLeft(*m_modeRefresh, 75, 48, 50, 20); pos.pinBottomLeft(*m_modeUpdate, 24, 20, 50, 24); + pos.pinBottomLeft(*m_modeDelete, 75, 20, 50, 24); return 0; } +void CConfigWindow::onModeListSelectChange() +{ + int sel = m_modeBox->getSel(); + if (sel == LB_ERR) + { + EnableWindow(*m_modeUpdate, FALSE); + EnableWindow(*m_modeDelete, FALSE); + return; + } + + int index = m_modeBox->getData(sel); + + if (index >= 0) + { + auto &mode = (*m_modes)[index]; + m_modeWidth->setNumericValue(mode.width); + m_modeHeight->setNumericValue(mode.height); + m_modeRefresh->setNumericValue(mode.refresh); + } + EnableWindow(*m_modeUpdate, TRUE); + EnableWindow(*m_modeDelete, index >= 0); +} + LRESULT CConfigWindow::onCommand(WORD id, WORD code, HWND hwnd) { if (hwnd == *m_modeBox && code == LBN_SELCHANGE && m_modes) { - int sel = m_modeBox->getSel(); - if (sel == LB_ERR) - { - EnableWindow(*m_modeUpdate, FALSE); - return 0; - } - - int index = m_modeBox->getData(sel); - - if (index >= 0) - { - auto &mode = (*m_modes)[index]; - m_modeWidth->setNumericValue(mode.width); - m_modeHeight->setNumericValue(mode.height); - m_modeRefresh->setNumericValue(mode.refresh); - } - else - { - m_modeWidth->setValue(L""); - m_modeHeight->setValue(L""); - m_modeRefresh->setValue(L""); - } - EnableWindow(*m_modeUpdate, TRUE); + onModeListSelectChange(); } else if (hwnd == *m_modeUpdate && code == BN_CLICKED && m_modes) { @@ -191,5 +198,22 @@ LRESULT CConfigWindow::onCommand(WORD id, WORD code, HWND hwnd) if (result != ERROR_SUCCESS) DEBUG_ERROR_HR(result, "Failed to save modes"); } + else if (hwnd == *m_modeDelete && code == BN_CLICKED && m_modes) + { + int sel = m_modeBox->getSel(); + if (sel == LB_ERR) + return 0; + + int index = m_modeBox->getData(sel); + m_modeBox->clear(); + m_modes->erase(m_modes->begin() + index); + + LRESULT result = m_settings.setModes(*m_modes); + if (result != ERROR_SUCCESS) + DEBUG_ERROR_HR(result, "Failed to save modes"); + + updateModeList(); + onModeListSelectChange(); + } return 0; } diff --git a/idd/LGIddHelper/CConfigWindow.h b/idd/LGIddHelper/CConfigWindow.h index e0c40a29..6c85010f 100644 --- a/idd/LGIddHelper/CConfigWindow.h +++ b/idd/LGIddHelper/CConfigWindow.h @@ -30,6 +30,7 @@ class CConfigWindow : public CWindow std::unique_ptr m_modeRefresh; std::unique_ptr m_modeUpdate; + std::unique_ptr m_modeDelete; std::function m_onDestroy; double m_scale; @@ -38,6 +39,8 @@ class CConfigWindow : public CWindow std::optional> m_modes; void updateFont(); + void updateModeList(); + void onModeListSelectChange(); virtual LRESULT handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override; virtual LRESULT onCreate() override; diff --git a/idd/LGIddHelper/CListBox.cpp b/idd/LGIddHelper/CListBox.cpp index 5beb9563..6bfa40b0 100644 --- a/idd/LGIddHelper/CListBox.cpp +++ b/idd/LGIddHelper/CListBox.cpp @@ -50,3 +50,8 @@ void CListBox::setSel(int index) if (!ListBox_SetCurSel(m_hwnd, index)) DEBUG_ERROR("listbox: failed to set selection to %d", index); } + +void CListBox::clear() +{ + ListBox_ResetContent(m_hwnd); +} diff --git a/idd/LGIddHelper/CListBox.h b/idd/LGIddHelper/CListBox.h index 18fd4440..360e7077 100644 --- a/idd/LGIddHelper/CListBox.h +++ b/idd/LGIddHelper/CListBox.h @@ -12,4 +12,5 @@ public: int getSel(); int getData(int index); void setSel(int index); + void clear(); };