diff options
Diffstat (limited to 'xbmc/guilib/GUIRadioButtonControl.cpp')
-rw-r--r-- | xbmc/guilib/GUIRadioButtonControl.cpp | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIRadioButtonControl.cpp b/xbmc/guilib/GUIRadioButtonControl.cpp new file mode 100644 index 0000000..cc169ec --- /dev/null +++ b/xbmc/guilib/GUIRadioButtonControl.cpp @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "GUIRadioButtonControl.h" + +#include "GUIInfoManager.h" +#include "LocalizeStrings.h" +#include "input/Key.h" + +CGUIRadioButtonControl::CGUIRadioButtonControl(int parentID, + int controlID, + float posX, + float posY, + float width, + float height, + const CTextureInfo& textureFocus, + const CTextureInfo& textureNoFocus, + const CLabelInfo& labelInfo, + const CTextureInfo& radioOnFocus, + const CTextureInfo& radioOnNoFocus, + const CTextureInfo& radioOffFocus, + const CTextureInfo& radioOffNoFocus, + const CTextureInfo& radioOnDisabled, + const CTextureInfo& radioOffDisabled) + : CGUIButtonControl( + parentID, controlID, posX, posY, width, height, textureFocus, textureNoFocus, labelInfo), + m_imgRadioOnFocus(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOnFocus)), + m_imgRadioOnNoFocus(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOnNoFocus)), + m_imgRadioOffFocus(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOffFocus)), + m_imgRadioOffNoFocus(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOffNoFocus)), + m_imgRadioOnDisabled(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOnDisabled)), + m_imgRadioOffDisabled(CGUITexture::CreateTexture(posX, posY, 16, 16, radioOffDisabled)) +{ + m_radioPosX = 0; + m_radioPosY = 0; + m_imgRadioOnFocus->SetAspectRatio(CAspectRatio::AR_KEEP); + m_imgRadioOnNoFocus->SetAspectRatio(CAspectRatio::AR_KEEP); + m_imgRadioOffFocus->SetAspectRatio(CAspectRatio::AR_KEEP); + m_imgRadioOffNoFocus->SetAspectRatio(CAspectRatio::AR_KEEP); + m_imgRadioOnDisabled->SetAspectRatio(CAspectRatio::AR_KEEP); + m_imgRadioOffDisabled->SetAspectRatio(CAspectRatio::AR_KEEP); + ControlType = GUICONTROL_RADIO; + m_useLabel2 = false; +} + +CGUIRadioButtonControl::CGUIRadioButtonControl(const CGUIRadioButtonControl& control) + : CGUIButtonControl(control), + m_imgRadioOnFocus(control.m_imgRadioOnFocus->Clone()), + m_imgRadioOnNoFocus(control.m_imgRadioOnNoFocus->Clone()), + m_imgRadioOffFocus(control.m_imgRadioOffFocus->Clone()), + m_imgRadioOffNoFocus(control.m_imgRadioOffNoFocus->Clone()), + m_imgRadioOnDisabled(control.m_imgRadioOnDisabled->Clone()), + m_imgRadioOffDisabled(control.m_imgRadioOffDisabled->Clone()), + m_radioPosX(control.m_radioPosX), + m_radioPosY(control.m_radioPosY), + m_toggleSelect(control.m_toggleSelect), + m_useLabel2(control.m_useLabel2) +{ +} + +void CGUIRadioButtonControl::Render() +{ + CGUIButtonControl::Render(); + + if ( IsSelected() && !IsDisabled() ) + { + if (HasFocus()) + m_imgRadioOnFocus->Render(); + else + m_imgRadioOnNoFocus->Render(); + } + else if ( !IsSelected() && !IsDisabled() ) + { + if (HasFocus()) + m_imgRadioOffFocus->Render(); + else + m_imgRadioOffNoFocus->Render(); + } + else if ( IsSelected() && IsDisabled() ) + m_imgRadioOnDisabled->Render(); + else + m_imgRadioOffDisabled->Render(); +} + +void CGUIRadioButtonControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) +{ + if (m_toggleSelect) + { + // ask our infoManager whether we are selected or not... + bool selected = m_toggleSelect->Get(INFO::DEFAULT_CONTEXT); + + if (selected != m_bSelected) + { + MarkDirtyRegion(); + m_bSelected = selected; + } + } + + m_imgRadioOnFocus->Process(currentTime); + m_imgRadioOnNoFocus->Process(currentTime); + m_imgRadioOffFocus->Process(currentTime); + m_imgRadioOffNoFocus->Process(currentTime); + m_imgRadioOnDisabled->Process(currentTime); + m_imgRadioOffDisabled->Process(currentTime); + + if (m_useLabel2) + SetLabel2(g_localizeStrings.Get(m_bSelected ? 16041 : 351)); + + CGUIButtonControl::Process(currentTime, dirtyregions); +} + +bool CGUIRadioButtonControl::OnAction(const CAction &action) +{ + if (action.GetID() == ACTION_SELECT_ITEM) + { + m_bSelected = !m_bSelected; + MarkDirtyRegion(); + } + return CGUIButtonControl::OnAction(action); +} + +bool CGUIRadioButtonControl::OnMessage(CGUIMessage& message) +{ + return CGUIButtonControl::OnMessage(message); +} + +void CGUIRadioButtonControl::AllocResources() +{ + CGUIButtonControl::AllocResources(); + m_imgRadioOnFocus->AllocResources(); + m_imgRadioOnNoFocus->AllocResources(); + m_imgRadioOffFocus->AllocResources(); + m_imgRadioOffNoFocus->AllocResources(); + m_imgRadioOnDisabled->AllocResources(); + m_imgRadioOffDisabled->AllocResources(); + SetPosition(m_posX, m_posY); +} + +void CGUIRadioButtonControl::FreeResources(bool immediately) +{ + CGUIButtonControl::FreeResources(immediately); + m_imgRadioOnFocus->FreeResources(immediately); + m_imgRadioOnNoFocus->FreeResources(immediately); + m_imgRadioOffFocus->FreeResources(immediately); + m_imgRadioOffNoFocus->FreeResources(immediately); + m_imgRadioOnDisabled->FreeResources(immediately); + m_imgRadioOffDisabled->FreeResources(immediately); +} + +void CGUIRadioButtonControl::DynamicResourceAlloc(bool bOnOff) +{ + CGUIControl::DynamicResourceAlloc(bOnOff); + m_imgRadioOnFocus->DynamicResourceAlloc(bOnOff); + m_imgRadioOnNoFocus->DynamicResourceAlloc(bOnOff); + m_imgRadioOffFocus->DynamicResourceAlloc(bOnOff); + m_imgRadioOffNoFocus->DynamicResourceAlloc(bOnOff); + m_imgRadioOnDisabled->DynamicResourceAlloc(bOnOff); + m_imgRadioOffDisabled->DynamicResourceAlloc(bOnOff); +} + +void CGUIRadioButtonControl::SetInvalid() +{ + CGUIButtonControl::SetInvalid(); + m_imgRadioOnFocus->SetInvalid(); + m_imgRadioOnNoFocus->SetInvalid(); + m_imgRadioOffFocus->SetInvalid(); + m_imgRadioOffNoFocus->SetInvalid(); + m_imgRadioOnDisabled->SetInvalid(); + m_imgRadioOffDisabled->SetInvalid(); +} + +void CGUIRadioButtonControl::SetPosition(float posX, float posY) +{ + CGUIButtonControl::SetPosition(posX, posY); + float radioPosX = + m_radioPosX ? m_posX + m_radioPosX : (m_posX + m_width - 8) - m_imgRadioOnFocus->GetWidth(); + float radioPosY = + m_radioPosY ? m_posY + m_radioPosY : m_posY + (m_height - m_imgRadioOnFocus->GetHeight()) / 2; + m_imgRadioOnFocus->SetPosition(radioPosX, radioPosY); + m_imgRadioOnNoFocus->SetPosition(radioPosX, radioPosY); + m_imgRadioOffFocus->SetPosition(radioPosX, radioPosY); + m_imgRadioOffNoFocus->SetPosition(radioPosX, radioPosY); + m_imgRadioOnDisabled->SetPosition(radioPosX, radioPosY); + m_imgRadioOffDisabled->SetPosition(radioPosX, radioPosY); +} + +void CGUIRadioButtonControl::SetRadioDimensions(float posX, float posY, float width, float height) +{ + m_radioPosX = posX; + m_radioPosY = posY; + if (width) + { + m_imgRadioOnFocus->SetWidth(width); + m_imgRadioOnNoFocus->SetWidth(width); + m_imgRadioOffFocus->SetWidth(width); + m_imgRadioOffNoFocus->SetWidth(width); + m_imgRadioOnDisabled->SetWidth(width); + m_imgRadioOffDisabled->SetWidth(width); + } + if (height) + { + m_imgRadioOnFocus->SetHeight(height); + m_imgRadioOnNoFocus->SetHeight(height); + m_imgRadioOffFocus->SetHeight(height); + m_imgRadioOffNoFocus->SetHeight(height); + m_imgRadioOnDisabled->SetHeight(height); + m_imgRadioOffDisabled->SetHeight(height); + } + + // use label2 to display the button value in case no + // dimensions were specified and there's no label2 yet. + if (GetLabel2().empty() && !width && !height) + m_useLabel2 = true; + + SetPosition(GetXPosition(), GetYPosition()); +} + +void CGUIRadioButtonControl::SetWidth(float width) +{ + CGUIButtonControl::SetWidth(width); + SetPosition(GetXPosition(), GetYPosition()); +} + +void CGUIRadioButtonControl::SetHeight(float height) +{ + CGUIButtonControl::SetHeight(height); + SetPosition(GetXPosition(), GetYPosition()); +} + +std::string CGUIRadioButtonControl::GetDescription() const +{ + std::string strLabel = CGUIButtonControl::GetDescription(); + if (m_bSelected) + strLabel += " (*)"; + else + strLabel += " ( )"; + return strLabel; +} + +bool CGUIRadioButtonControl::UpdateColors(const CGUIListItem* item) +{ + bool changed = CGUIButtonControl::UpdateColors(nullptr); + changed |= m_imgRadioOnFocus->SetDiffuseColor(m_diffuseColor); + changed |= m_imgRadioOnNoFocus->SetDiffuseColor(m_diffuseColor); + changed |= m_imgRadioOffFocus->SetDiffuseColor(m_diffuseColor); + changed |= m_imgRadioOffNoFocus->SetDiffuseColor(m_diffuseColor); + changed |= m_imgRadioOnDisabled->SetDiffuseColor(m_diffuseColor); + changed |= m_imgRadioOffDisabled->SetDiffuseColor(m_diffuseColor); + return changed; +} + +void CGUIRadioButtonControl::SetToggleSelect(const std::string &toggleSelect) +{ + m_toggleSelect = CServiceBroker::GetGUI()->GetInfoManager().Register(toggleSelect, GetParentID()); +} |