summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIRadioButtonControl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/GUIRadioButtonControl.cpp')
-rw-r--r--xbmc/guilib/GUIRadioButtonControl.cpp260
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());
+}