Skip to content

Commit

Permalink
allow multiple selection in DialogSelect
Browse files Browse the repository at this point in the history
  • Loading branch information
pieh committed Aug 21, 2011
1 parent 80a5fed commit 01ccca6
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 13 deletions.
70 changes: 58 additions & 12 deletions xbmc/dialogs/GUIDialogSelect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,16 @@ CGUIDialogSelect::CGUIDialogSelect(void)
m_bButtonEnabled = false;
m_useDetails = false;
m_vecListInternal = new CFileItemList;
m_selectedItem = new CFileItem;
m_selectedItems = new CFileItemList;
m_multiSelection = false;
m_vecList = m_vecListInternal;
m_iSelected = -1;
}

CGUIDialogSelect::~CGUIDialogSelect(void)
{
delete m_vecListInternal;
delete m_selectedItem;
delete m_selectedItems;
}

bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
Expand All @@ -57,6 +58,22 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
m_viewControl.Reset();
m_bButtonEnabled = false;
m_useDetails = false;
m_multiSelection = false;

// construct selected items list
m_selectedItems->Clear();
m_iSelected = -1;
for (int i = 0 ; i < m_vecList->Size() ; i++)
{
CFileItemPtr item = m_vecList->Get(i);
if (item->IsSelected())
{
m_selectedItems->Add(item);
if (m_iSelected == -1)
m_iSelected = i;
}
}

m_vecListInternal->Clear();
m_vecList = m_vecListInternal;
return true;
Expand All @@ -67,8 +84,6 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
{
m_bButtonPressed = false;
CGUIDialog::OnMessage(message);
m_iSelected = -1;

return true;
}
break;
Expand All @@ -82,14 +97,20 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
int iAction = message.GetParam1();
if (ACTION_SELECT_ITEM == iAction || ACTION_MOUSE_LEFT_CLICK == iAction)
{
m_iSelected = m_viewControl.GetSelectedItem();
if(m_iSelected >= 0 && m_iSelected < (int)m_vecList->Size())
int iSelected = m_viewControl.GetSelectedItem();
if(iSelected >= 0 && iSelected < (int)m_vecList->Size())
{
*m_selectedItem = *m_vecList->Get(m_iSelected);
Close();
CFileItemPtr item(m_vecList->Get(iSelected));
if (m_multiSelection)
item->Select(!item->IsSelected());
else
{
for (int i = 0 ; i < m_vecList->Size() ; i++)
m_vecList->Get(i)->Select(false);
item->Select(true);
Close();
}
}
else
m_iSelected = -1;
}
}
if (CONTROL_BUTTON == iControl)
Expand All @@ -114,12 +135,20 @@ bool CGUIDialogSelect::OnMessage(CGUIMessage& message)
return CGUIDialog::OnMessage(message);
}

bool CGUIDialogSelect::OnBack(int actionID)
{
m_iSelected = -1;
return CGUIDialog::OnBack(actionID);
}

void CGUIDialogSelect::Reset()
{
m_bButtonEnabled = false;
m_useDetails = false;
m_multiSelection = false;
m_iSelected = -1;
m_vecListInternal->Clear();
m_selectedItems->Clear();
m_vecList = m_vecListInternal;
}

Expand Down Expand Up @@ -156,12 +185,17 @@ int CGUIDialogSelect::GetSelectedLabel() const

const CFileItem& CGUIDialogSelect::GetSelectedItem()
{
return *m_selectedItem;
return *m_selectedItems->Get(0);
}

const CStdString& CGUIDialogSelect::GetSelectedLabelText()
{
return m_selectedItem->GetLabel();
return GetSelectedItem().GetLabel();
}

const CFileItemList& CGUIDialogSelect::GetSelectedItems() const
{
return *m_selectedItems;
}

void CGUIDialogSelect::EnableButton(bool enable, int string)
Expand Down Expand Up @@ -212,6 +246,18 @@ void CGUIDialogSelect::OnWindowLoaded()
void CGUIDialogSelect::OnInitWindow()
{
m_viewControl.SetItems(*m_vecList);
m_selectedItems->Clear();
if (m_iSelected == -1)
{
for(int i = 0 ; i < m_vecList->Size(); i++)
{
if (m_vecList->Get(i)->IsSelected())
{
m_iSelected = i;
break;
}
}
}
m_viewControl.SetCurrentView(m_useDetails ? CONTROL_DETAILS : CONTROL_LIST);

CStdString items;
Expand Down
6 changes: 5 additions & 1 deletion xbmc/dialogs/GUIDialogSelect.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class CGUIDialogSelect :
CGUIDialogSelect(void);
virtual ~CGUIDialogSelect(void);
virtual bool OnMessage(CGUIMessage& message);
virtual bool OnBack(int actionID);

void Reset();
void Add(const CStdString& strLabel);
Expand All @@ -44,11 +45,13 @@ class CGUIDialogSelect :
int GetSelectedLabel() const;
const CStdString& GetSelectedLabelText();
const CFileItem& GetSelectedItem();
const CFileItemList& GetSelectedItems() const;
void EnableButton(bool enable, int string);
bool IsButtonPressed();
void Sort(bool bSortOrder = true);
void SetSelected(int iSelected);
void SetUseDetails(bool useDetails);
void SetMultiSelection(bool multiSelection) { m_multiSelection = multiSelection; };
protected:
virtual CGUIControl *GetFirstFocusableControl(int id);
virtual void OnWindowLoaded();
Expand All @@ -58,8 +61,9 @@ class CGUIDialogSelect :
bool m_bButtonPressed;
int m_iSelected;
bool m_useDetails;
bool m_multiSelection;

CFileItem* m_selectedItem;
CFileItemList* m_selectedItems;
CFileItemList* m_vecListInternal;
CFileItemList* m_vecList;
CGUIViewControl m_viewControl;
Expand Down

0 comments on commit 01ccca6

Please sign in to comment.