Skip to content

Commit

Permalink
[guilib] implicit referencing for listitem bools / ints and container…
Browse files Browse the repository at this point in the history
… bools
  • Loading branch information
phil65 committed Dec 18, 2016
1 parent 79aa52b commit 79ba614
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 85 deletions.
128 changes: 43 additions & 85 deletions xbmc/GUIInfoManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7065,18 +7065,10 @@ bool CGUIInfoManager::GetBool(int condition1, int contextWindow, const CGUIListI
condition == CONTAINER_SCROLLING || condition == CONTAINER_ISUPDATING ||
condition == CONTAINER_HAS_PARENT_ITEM)
{
const CGUIControl *control = NULL;
CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
if (window)
control = window->GetControl(window->GetViewContainerID());

if (control)
{
if (control->IsContainer())
bReturn = control->GetCondition(condition, 0);
else if (control->GetControlType() == CGUIControl::GUICONTROL_TEXTBOX)
bReturn = ((CGUITextBox *)control)->GetCondition(condition, 0);
}
const CGUIControl *control = nullptr;
auto activeContainer = GetActiveContainer(0, contextWindow);
if (activeContainer)
bReturn = activeContainer->GetCondition(condition, 0);
}
else if (condition == CONTAINER_CAN_FILTER)
{
Expand Down Expand Up @@ -7391,22 +7383,9 @@ bool CGUIInfoManager::GetMultiInfoBool(const GUIInfo &info, int contextWindow, c
{
CGUIWindow *window = NULL;
int data1 = info.GetData1();
if (!data1) // No container specified, so we lookup the current view container
{
window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
if (window && window->IsMediaWindow())
data1 = ((CGUIMediaWindow*)(window))->GetViewContainerID();
}

if (!window) // If we don't have a window already (from lookup above), get one
window = GetWindowWithCondition(contextWindow, 0);

if (window)
{
const CGUIControl *control = window->GetControl(data1);
if (control && control->IsContainer())
item = ((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()).get();
}
auto activeContainer = GetActiveContainer(info.GetData1(), contextWindow);
if (activeContainer)
item = static_cast<IGUIContainer *>(activeContainer)->GetListItem(info.GetData2(), info.GetInfoFlag()).get();
}
if (item) // If we got a valid item, do the lookup
bReturn = GetItemBool(item, condition); // Image prioritizes images over labels (in the case of music item ratings for instance)
Expand Down Expand Up @@ -7693,21 +7672,9 @@ bool CGUIInfoManager::GetMultiInfoBool(const GUIInfo &info, int contextWindow, c
case CONTAINER_ISUPDATING:
case CONTAINER_HAS_PARENT_ITEM:
{
const CGUIControl *control = NULL;
if (info.GetData1())
{ // container specified
CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
if (window)
control = window->GetControl(info.GetData1());
}
else
{ // no container specified - assume a mediawindow
CGUIWindow *window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_IS_MEDIA_WINDOW);
if (window)
control = window->GetControl(window->GetViewContainerID());
}
if (control)
bReturn = control->GetCondition(condition, info.GetData2());
auto activeContainer = GetActiveContainer(info.GetData1(), contextWindow);
if (activeContainer)
bReturn = activeContainer->GetCondition(condition, info.GetData2());
}
break;
case CONTAINER_HAS_FOCUS:
Expand Down Expand Up @@ -7872,25 +7839,10 @@ bool CGUIInfoManager::GetMultiInfoInt(int &value, const GUIInfo &info, int conte
if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
{
CFileItemPtr item;
CGUIWindow *window = NULL;

int data1 = info.GetData1();
if (!data1) // No container specified, so we lookup the current view container
{
window = GetWindowWithCondition(contextWindow, WINDOW_CONDITION_HAS_LIST_ITEMS);
if (window && window->IsMediaWindow())
data1 = ((CGUIMediaWindow*)(window))->GetViewContainerID();
}

if (!window) // If we don't have a window already (from lookup above), get one
window = GetWindowWithCondition(contextWindow, 0);

if (window)
{
const CGUIControl *control = window->GetControl(data1);
if (control && control->IsContainer())
item = std::static_pointer_cast<CFileItem>(((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()));
}
auto activeContainer = GetActiveContainer(info.GetData1(), contextWindow);
if (activeContainer)
item = std::static_pointer_cast<CFileItem>(static_cast<IGUIContainer *>(activeContainer)->GetListItem(info.GetData2(), info.GetInfoFlag()));

if (item) // If we got a valid item, do the lookup
return GetItemInt(value, item.get(), info.m_info);
Expand All @@ -7899,6 +7851,33 @@ bool CGUIInfoManager::GetMultiInfoInt(int &value, const GUIInfo &info, int conte
return 0;
}

/// \brief Returns the currently chosen container (view control for MediaWindows, currently focused container for non-MediaWindows)
CGUIControl* CGUIInfoManager::GetActiveContainer(int containerId, int contextWindow) const
{
CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);
if (!containerId) // No container specified, so we lookup the current view container
{
if (window)
{
if (window->IsMediaWindow())
containerId = static_cast<CGUIMediaWindow*>(window)->GetViewContainerID();
else
{
auto control = window->GetFocusedControl();
if (control && control->IsContainer())
containerId = control->GetID();
}
}
}
if (window)
{
CGUIControl *control = window->GetControl(containerId);
if (control && control->IsContainer())
return control;
}
return nullptr;
}

/// \brief Examines the multi information sent and returns the string as appropriate
std::string CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info, int contextWindow, std::string *fallback)
{
Expand All @@ -7915,30 +7894,9 @@ std::string CGUIInfoManager::GetMultiInfoLabel(const GUIInfo &info, int contextW
if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
{
CFileItemPtr item;
CGUIWindow *window = GetWindowWithCondition(contextWindow, 0);

int data1 = info.GetData1();
if (!data1) // No container specified, so we lookup the current view container
{
if (window)
{
if (window->IsMediaWindow())
data1 = static_cast<CGUIMediaWindow*>(window)->GetViewContainerID();
else
{
auto control = window->GetFocusedControl();
if (control && control->IsContainer())
data1 = control->GetID();
}
}
}

if (window)
{
const CGUIControl *control = window->GetControl(data1);
if (control && control->IsContainer())
item = std::static_pointer_cast<CFileItem>(((IGUIContainer *)control)->GetListItem(info.GetData2(), info.GetInfoFlag()));
}
auto activeContainer = GetActiveContainer(info.GetData1(), contextWindow);
if (activeContainer)
item = std::static_pointer_cast<CFileItem>(static_cast<IGUIContainer *>(activeContainer)->GetListItem(info.GetData2(), info.GetInfoFlag()));

if (item) // If we got a valid item, do the lookup
return GetItemImage(item.get(), info.m_info, fallback); // Image prioritizes images over labels (in the case of music item ratings for instance)
Expand Down
2 changes: 2 additions & 0 deletions xbmc/GUIInfoManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#include "threads/CriticalSection.h"
#include "guilib/IMsgTargetCallback.h"
#include "guilib/GUIControl.h"
#include "messaging/IMessageTarget.h"
#include "inttypes.h"
#include "XBDateTime.h"
Expand Down Expand Up @@ -260,6 +261,7 @@ friend CSetCurrentItemJob;

bool GetMultiInfoBool(const GUIInfo &info, int contextWindow = 0, const CGUIListItem *item = NULL);
bool GetMultiInfoInt(int &value, const GUIInfo &info, int contextWindow = 0) const;
CGUIControl * GetActiveContainer(int containerId, int contextWindow) const;
std::string GetMultiInfoLabel(const GUIInfo &info, int contextWindow = 0, std::string *fallback = NULL);
int TranslateListItem(const Property &info);
int TranslateMusicPlayerString(const std::string &info) const;
Expand Down

0 comments on commit 79ba614

Please sign in to comment.