nim_duilib/duilib/Control/Option.h
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

144 lines
3.5 KiB
C++

#ifndef UI_CONTROL_OPTION_H_
#define UI_CONTROL_OPTION_H_
#pragma once
namespace ui
{
template<typename InheritType = Control>
class UILIB_API OptionTemplate : public CheckBoxTemplate<InheritType>
{
public:
OptionTemplate();
~OptionTemplate();
/// 重写父类方法,提供个性化功能,请参考父类声明
virtual void SetWindow(Window* pManager, Box* pParent, bool bInit = true) override;
virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue) override;
virtual void Selected(bool bSelected, bool bTriggerEvent = false) override;
virtual void Activate() override;
/**
* @brief 获取所属组名称
* @return 返回组名称
*/
virtual std::wstring GetGroup() const;
/**
* @brief 设置所属组
* @param[in] strGroupName 组名称
* @return 无
*/
virtual void SetGroup(const std::wstring& strGroupName);
protected:
std::wstring m_sGroupName;
};
template<typename InheritType>
OptionTemplate<InheritType>::OptionTemplate() :
m_sGroupName()
{
}
template<typename InheritType>
OptionTemplate<InheritType>::~OptionTemplate()
{
if (!m_sGroupName.empty() && this->m_pWindow) this->m_pWindow->RemoveOptionGroup(m_sGroupName, this);
}
template<typename InheritType>
void OptionTemplate<InheritType>::SetWindow(Window* pManager, Box* pParent, bool bInit)
{
__super::SetWindow(pManager, pParent, bInit);
if (bInit && !m_sGroupName.empty()) {
if (this->m_pWindow) this->m_pWindow->AddOptionGroup(m_sGroupName, this);
}
}
template<typename InheritType>
void OptionTemplate<InheritType>::SetAttribute(const std::wstring& strName, const std::wstring& strValue)
{
if (strName == _T("group")) SetGroup(strValue);
else __super::SetAttribute(strName, strValue);
}
template<typename InheritType>
void OptionTemplate<InheritType>::Selected(bool bSelected, bool bTriggerEvent)
{
//if( m_bSelected == bSelected ) return;
this->m_bSelected = bSelected;
if (this->m_pWindow != NULL) {
if (this->m_bSelected) {
if (!m_sGroupName.empty()) {
std::vector<Control*>* aOptionGroup = this->m_pWindow->GetOptionGroup(m_sGroupName);
ASSERT(aOptionGroup);
if (aOptionGroup) {
for (auto it = aOptionGroup->begin(); it != aOptionGroup->end(); it++) {
auto pControl = static_cast<OptionTemplate<InheritType>*>(*it);
if (pControl != this) {
pControl->Selected(false, bTriggerEvent);
}
}
}
}
if (bTriggerEvent) {
this->m_pWindow->SendNotify(this, kEventSelect);
}
}
else {
this->m_pWindow->SendNotify(this, kEventUnSelect);
}
}
this->Invalidate();
}
template<typename InheritType>
void OptionTemplate<InheritType>::Activate()
{
ButtonTemplate<InheritType>::Activate();
if (!this->IsActivatable()) return;
Selected(true, true);
}
template<typename InheritType>
std::wstring OptionTemplate<InheritType>::GetGroup() const
{
return m_sGroupName;
}
template<typename InheritType>
void OptionTemplate<InheritType>::SetGroup(const std::wstring& strGroupName)
{
if (strGroupName.empty()) {
if (m_sGroupName.empty()) return;
m_sGroupName.clear();
}
else {
if (m_sGroupName == strGroupName) return;
if (!m_sGroupName.empty() && this->m_pWindow) this->m_pWindow->RemoveOptionGroup(m_sGroupName, this);
m_sGroupName = strGroupName;
}
if (!m_sGroupName.empty()) {
if (this->m_pWindow) this->m_pWindow->AddOptionGroup(m_sGroupName, this);
}
else {
if (this->m_pWindow) this->m_pWindow->RemoveOptionGroup(m_sGroupName, this);
}
Selected(this->m_bSelected, true);
}
typedef OptionTemplate<Control> Option;
typedef OptionTemplate<Box> OptionBox;
}
#endif // UI_CONTROL_OPTION_H_