diff options
Diffstat (limited to 'plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp')
-rw-r--r-- | plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp new file mode 100644 index 0000000000..75491192af --- /dev/null +++ b/plugins/!NotAdopted/HistoryStats/optionsctrlimpl_radio.cpp @@ -0,0 +1,125 @@ +#include "_globals.h"
+#include "optionsctrlimpl.h"
+
+/*
+ * OptionsCtrlImpl::RadioSiblings
+ */
+
+int OptionsCtrlImpl::RadioSiblings::join(Radio* pRadio)
+{
+ m_Radios.push_back(pRadio);
+ ++m_nRadios;
+
+ return m_nRadios - 1;
+}
+
+bool OptionsCtrlImpl::RadioSiblings::leave(int nRadio)
+{
+ assert(nRadio >= 0 && nRadio < m_Radios.size() && m_Radios[nRadio]);
+
+ m_Radios[nRadio] = NULL;
+ --m_nRadios;
+
+ return (m_nRadios == 0);
+}
+
+void OptionsCtrlImpl::RadioSiblings::setChecked(int nRadio)
+{
+ if (nRadio == m_nChecked)
+ {
+ return;
+ }
+
+ if (nRadio < 0 || nRadio >= m_Radios.size())
+ {
+ return;
+ }
+
+ if (m_nChecked != -1)
+ {
+ assert(m_Radios[m_nChecked]);
+
+ int nOldChecked = m_nChecked;
+
+ m_nChecked = -1;
+ m_Radios[nOldChecked]->updateItem();
+ }
+
+ assert(m_Radios[nRadio]);
+
+ m_nChecked = nRadio;
+ m_Radios[m_nChecked]->updateItem();
+}
+
+/*
+ * OptionsCtrlImpl::Radio
+ */
+
+bool OptionsCtrlImpl::Radio::getChildEnable(bool bChecked)
+{
+ return
+ !m_bDisableChildsOnUncheck && m_bDisableChilds && m_bEnabled ||
+ m_bDisableChildsOnUncheck && bChecked && (!m_bDisableChilds || m_bEnabled);
+}
+
+void OptionsCtrlImpl::Radio::updateItem()
+{
+ bool bChecked = isChecked();
+
+ m_pCtrl->setStateImage(m_hItem, m_bEnabled ? (bChecked ? siRadioC : siRadioU) : (bChecked ? siRadioCG : siRadioUG));
+
+ if (m_bDisableChilds || m_bDisableChildsOnUncheck)
+ {
+ enableChilds(getChildEnable(bChecked));
+ }
+}
+
+OptionsCtrlImpl::Radio::Radio(OptionsCtrlImpl* pCtrl, Item* pParent, Radio* pSibling, const mu_text* szLabel, DWORD dwFlags, DWORD dwData)
+ : Item(pCtrl, itRadio, szLabel, dwFlags, dwData)
+{
+ m_bDisableChildsOnUncheck = bool_(dwFlags & OCF_DISABLECHILDSONUNCHECK);
+
+ pCtrl->insertItem(pParent, this, szLabel, dwFlags, siRadioU);
+
+ m_pSiblings = pSibling ? pSibling->m_pSiblings : new RadioSiblings();
+ m_nIndex = m_pSiblings->join(this);
+
+ if (dwFlags & OCF_CHECKED)
+ {
+ m_pSiblings->setChecked(m_nIndex);
+ }
+ else
+ {
+ updateItem();
+ }
+
+ if (pParent)
+ {
+ pParent->childAdded(this);
+ }
+}
+
+OptionsCtrlImpl::Radio::~Radio()
+{
+ if (m_pSiblings->leave(m_nIndex))
+ {
+ delete m_pSiblings;
+ }
+}
+
+void OptionsCtrlImpl::Radio::onToggle()
+{
+ if (m_bEnabled && !isChecked())
+ {
+ setChecked();
+ m_pCtrl->setModified(this);
+ }
+}
+
+void OptionsCtrlImpl::Radio::childAdded(Item* pChild)
+{
+ if (m_bDisableChilds || m_bDisableChildsOnUncheck)
+ {
+ pChild->setEnabled(getChildEnable(isChecked()));
+ }
+}
|