Skip to content

Commit

Permalink
Merge pull request #7868 from tamland/dialog_select_fix
Browse files Browse the repository at this point in the history
[gui] fix CGUIDialogSelect::GetSelectedItem not returning the selected item
  • Loading branch information
MartijnKaijser committed Aug 23, 2015
2 parents ab27f08 + fe58cca commit 183b213
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
33 changes: 17 additions & 16 deletions xbmc/dialogs/GUIDialogSelect.cpp
Expand Up @@ -40,7 +40,7 @@ CGUIDialogSelect::CGUIDialogSelect(void)
m_useDetails = false;
m_vecList = new CFileItemList;
m_multiSelection = false;
m_iSelected = -1;
m_selectedItem = nullptr;
m_loadType = KEEP_IN_MEMORY;
}

Expand All @@ -64,15 +64,15 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)

// construct selected items list
m_selectedItems.clear();
m_iSelected = -1;
m_selectedItem = nullptr;
for (int i = 0 ; i < m_vecList->Size() ; i++)
{
CFileItemPtr item = m_vecList->Get(i);
if (item->IsSelected())
{
m_selectedItems.push_back(i);
if (m_iSelected == -1)
m_iSelected = i;
if (!m_selectedItem)
m_selectedItem = item;
}
}

Expand Down Expand Up @@ -121,7 +121,7 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
}
if (CONTROL_BUTTON == iControl)
{
m_iSelected = -1;
m_selectedItem = nullptr;
m_bButtonPressed = true;
if (m_multiSelection)
m_bConfirmed = true;
Expand Down Expand Up @@ -153,7 +153,7 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)

bool CGUIDialogSelect::OnBack(int actionID)
{
m_iSelected = -1;
m_selectedItem = nullptr;
m_selectedItems.clear();
m_bConfirmed = false;
return CGUIDialog::OnBack(actionID);
Expand All @@ -166,7 +166,7 @@ void CGUIDialogSelect::Reset()
m_bButtonPressed = false;
m_useDetails = false;
m_multiSelection = false;
m_iSelected = -1;
m_selectedItem = nullptr;
m_vecList->Clear();
m_selectedItems.clear();
}
Expand Down Expand Up @@ -204,13 +204,13 @@ void CGUIDialogSelect::SetItems(CFileItemList* pList)

int CGUIDialogSelect::GetSelectedLabel() const
{
return m_iSelected;
return m_selectedItems.size() > 0 ? m_selectedItems[0] : -1;
}

const CFileItemPtr CGUIDialogSelect::GetSelectedItem() const
{
if (m_selectedItems.size() > 0 && m_vecList->Size() > 0)
return m_vecList->Get(m_selectedItems.front());
if (m_selectedItem)
return m_selectedItem;
return CFileItemPtr(new CFileItem);
}

Expand Down Expand Up @@ -253,8 +253,9 @@ void CGUIDialogSelect::SetSelected(int iSelected)
// or if it doesn't have a valid value yet
// or if the current value is bigger than the new one
// so that we always focus the item nearest to the beginning of the list
if (!m_multiSelection || m_iSelected < 0 || m_iSelected > iSelected)
m_iSelected = iSelected;
if (!m_multiSelection || !m_selectedItem ||
(!m_selectedItems.empty() && m_selectedItems.back() > iSelected))
m_selectedItem = m_vecList->Get(iSelected);
m_vecList->Get(iSelected)->Select(true);
m_selectedItems.push_back(iSelected);
}
Expand Down Expand Up @@ -322,13 +323,13 @@ void CGUIDialogSelect::OnInitWindow()
{
m_viewControl.SetItems(*m_vecList);
m_selectedItems.clear();
if (m_iSelected == -1)
if (!m_selectedItem)
{
for(int i = 0 ; i < m_vecList->Size(); i++)
{
if (m_vecList->Get(i)->IsSelected())
{
m_iSelected = i;
m_selectedItem = m_vecList->Get(i);
break;
}
}
Expand All @@ -344,8 +345,8 @@ void CGUIDialogSelect::OnInitWindow()
SetupButton();
CGUIDialogBoxBase::OnInitWindow();

// if m_iSelected < 0 focus first item
m_viewControl.SetSelectedItem(std::max(m_iSelected, 0));
// if nothing is selected, focus first item
m_viewControl.SetSelectedItem(std::max(GetSelectedLabel(), 0));
}

void CGUIDialogSelect::OnWindowUnload()
Expand Down
2 changes: 1 addition & 1 deletion xbmc/dialogs/GUIDialogSelect.h
Expand Up @@ -63,7 +63,7 @@ class CGUIDialogSelect :
bool m_bButtonEnabled;
int m_buttonString;
bool m_bButtonPressed;
int m_iSelected;
CFileItemPtr m_selectedItem;
bool m_useDetails;
bool m_multiSelection;

Expand Down

0 comments on commit 183b213

Please sign in to comment.