bool MkWindowThemedNode::_UpdateRegion(void) { const MkWindowThemeFormData* formData = MK_STATIC_RES.GetWindowThemeSet().GetFormData(m_ThemeName, m_ComponentType, m_CustomFormName); bool ok = (formData != NULL); if (ok) { MkFloatRect oldWinRect = m_WindowRect; MkFloatRect oldCliRect = m_ClientRect; formData->SetClientSizeToForm(this, m_ClientRect.size, m_ClientRect.position, m_WindowRect.size); if (m_WindowRect != oldWinRect) { SetAlignmentCommand(); // window rect가 변경되면 자신의 alignment도 갱신되야 함 } // client rect에 변경이 발생하면 자식 visual pattern 파생 객체들에게 재정렬 명령 if ((!m_ChildrenNode.Empty()) && (m_ClientRect != oldCliRect)) { MkHashMapLooper<MkHashStr, MkSceneNode*> looper(m_ChildrenNode); MK_STL_LOOP(looper) { if (looper.GetCurrentField()->IsDerivedFrom(ePA_SNT_VisualPatternNode)) { // shadow node. client size를 동기화 if (looper.GetCurrentField()->GetNodeName() == ShadowNodeName) { MkWindowThemedNode* shadowNode = dynamic_cast<MkWindowThemedNode*>(looper.GetCurrentField()); if (shadowNode != NULL) { shadowNode->SetClientSize(m_ClientRect.size); } } // etc else { MkVisualPatternNode* etcNode = dynamic_cast<MkVisualPatternNode*>(looper.GetCurrentField()); if (etcNode != NULL) { etcNode->SetAlignmentCommand(); } } } } } }
bool MkWindowThemedNode::_UpdateThemeComponent(void) { m_UpdateCommand.Set(eUC_Region); // theme, component, shadow가 변경되면 region도 갱신되야 함 const MkWindowThemeFormData* formData = MK_STATIC_RES.GetWindowThemeSet().GetFormData(m_ThemeName, m_ComponentType, m_CustomFormName); if ((formData != NULL) && formData->AttachForm(this)) { if (m_UseShadow) { if (ChildExist(ShadowNodeName)) { MkWindowThemedNode* shadowNode = dynamic_cast<MkWindowThemedNode*>(GetChildNode(ShadowNodeName)); if (shadowNode != NULL) { shadowNode->SetThemeName(m_ThemeName); } } else { MkWindowThemedNode* shadowNode = CreateChildNode(this, ShadowNodeName); if (shadowNode != NULL) { shadowNode->SetLocalDepth(0.1f); // form panel들과 겹치는 것을 피하기 위해 0.1f만큼 뒤에 위치 shadowNode->SetThemeName(m_ThemeName); shadowNode->SetComponentType(MkWindowThemeData::eCT_ShadowBox); shadowNode->SetFormState(MkWindowThemeFormData::eS_Default); shadowNode->SetAlignmentTargetIsWindowRect(false); // 자신과 shadow node의 client rect끼리 정렬 shadowNode->SetAlignmentPosition(eRAP_LeftBottom); // client size를 동일하게 맞출 것이므로 아무거나 상관 없음 } } } return true; } MkWindowThemeFormData::RemoveForm(this); RemoveChildNode(ShadowNodeName); return false; }
void MkCheckBoxControlNode::_SetCheck(bool onCheck, bool makeEvent) { if (onCheck != m_OnCheck) { m_OnCheck = onCheck; MkWindowThemedNode* node = NULL; if (ChildExist(CheckIconName)) { node = dynamic_cast<MkWindowThemedNode*>(GetChildNode(CheckIconName)); } else { MkWindowThemeData::eComponentType iconCT = MkWindowThemeData::GetSystemIconComponent(m_FrameType, MkWindowThemeData::eIT_CheckMark); if (iconCT != MkWindowThemeData::eCT_None) { node = MkWindowThemedNode::CreateChildNode(this, CheckIconName); if (node != NULL) { node->SetLocalDepth(-0.1f); // check box와 겹치는 것을 피하기 위해 0.1f만큼 앞에 위치 node->SetThemeName(GetThemeName()); node->SetComponentType(iconCT); node->SetAlignmentPosition(eRAP_MiddleCenter); } } } if (node != NULL) { node->SetVisible(m_OnCheck); } if (makeEvent) { StartNodeReportTypeEvent((m_OnCheck) ? ePA_SNE_CheckOn : ePA_SNE_CheckOff, NULL); } } }