/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Gwen.h" #include "Gwen/Skin.h" #include "Gwen/Controls/Properties.h" #include "Gwen/Utility.h" using namespace Gwen; using namespace Gwen::Controls; GWEN_CONTROL_CONSTRUCTOR(Properties) { m_SplitterBar = new SplitterBar(this); m_SplitterBar->SetPos(80, 0); m_SplitterBar->SetCursor(Gwen::CursorType::SizeWE); m_SplitterBar->onDragged.Add(this, &Properties::OnSplitterMoved); m_SplitterBar->SetShouldDrawBackground(false); } void Properties::PostLayout(Gwen::Skin::Base* /*skin*/) { m_SplitterBar->SetHeight(0); if (SizeToChildren(false, true)) { InvalidateParent(); } m_SplitterBar->SetSize(3, Height()); } void Properties::OnSplitterMoved(Controls::Base* /*control*/) { InvalidateChildren(); } int Properties::GetSplitWidth() { return m_SplitterBar->X(); } PropertyRow* Properties::Add(const UnicodeString& text, const UnicodeString& value) { Property::Base* pProp = new Property::Text(this); pProp->SetPropertyValue(value); return Add(text, pProp); } PropertyRow* Properties::Add(const String& text, const String& value) { return Add(Gwen::Utility::StringToUnicode(text), Gwen::Utility::StringToUnicode(value)); } PropertyRow* Properties::Add(const UnicodeString& text, Property::Base* pProp) { PropertyRow* row = new PropertyRow(this); row->Dock(Pos::Top); row->GetLabel()->SetText(text); row->SetProperty(pProp); m_SplitterBar->BringToFront(); return row; } PropertyRow* Properties::Add(const String& text, Property::Base* pProp) { return Add(Gwen::Utility::StringToUnicode(text), pProp); } void Properties::Clear() { Base::List ChildListCopy = Children; for (Base::List::iterator it = ChildListCopy.begin(); it != ChildListCopy.end(); ++it) { PropertyRow* row = (*it)->DynamicCastPropertyRow(); if (!row) continue; row->DelayedDelete(); } } GWEN_CONTROL_CONSTRUCTOR(PropertyRow) { m_Property = NULL; m_Label = new Label(this); m_Label->SetAlignment(Pos::CenterV | Pos::Left); m_Label->Dock(Pos::Left); m_Label->SetMargin(Margin(2, 0, 0, 0)); SetHeight(16); } void PropertyRow::Render(Gwen::Skin::Base* skin) { skin->DrawPropertyRow(this, m_Label->Right(), m_Property->IsEditing()); } void PropertyRow::Layout(Gwen::Skin::Base* /*skin*/) { Properties* pParent = GetParent()->DynamicCastProperties(); if (!pParent) return; m_Label->SetWidth(pParent->GetSplitWidth()); } void PropertyRow::SetProperty(Property::Base* prop) { m_Property = prop; m_Property->SetParent(this); m_Property->Dock(Pos::Fill); m_Property->onChange.Add(this, &ThisClass::OnPropertyValueChanged); } void PropertyRow::OnPropertyValueChanged(Gwen::Controls::Base* /*control*/) { onChange.Call(this); }