mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-20 19:46:08 +01:00
73 lines
1.5 KiB
C++
73 lines
1.5 KiB
C++
|
#include <precomp.h>
|
||
|
#include "SelItemList.h"
|
||
|
#include "listwnd.h"
|
||
|
|
||
|
#define SELITEMEXPAND 2040
|
||
|
|
||
|
SelItemList::SelItemList(ListWnd *parent) :
|
||
|
listwnd(parent), list(SELITEMEXPAND), num_selected(0) { }
|
||
|
|
||
|
void SelItemList::setSelected(int pos, int selected, int cb)
|
||
|
{
|
||
|
int s = list.getSize();
|
||
|
if (pos >= s)
|
||
|
{
|
||
|
if (!selected)
|
||
|
{
|
||
|
// turning off something that's out of range is a no-brainer
|
||
|
return ;
|
||
|
}
|
||
|
s = ((s / SELITEMEXPAND) + 1) * SELITEMEXPAND;
|
||
|
list.setSize(s);
|
||
|
}
|
||
|
|
||
|
char *l = list.getMemory();
|
||
|
if (selected)
|
||
|
{
|
||
|
// quick and dirty way to prevent more than one item from
|
||
|
// ever being selected?
|
||
|
if (listwnd->getPreventMultipleSelection())
|
||
|
{
|
||
|
listwnd->deselectAll(cb);
|
||
|
}
|
||
|
if (!isSelected(pos))
|
||
|
{
|
||
|
l[pos] = 1;
|
||
|
num_selected++;
|
||
|
if (cb) listwnd->itemSelection(pos, TRUE);
|
||
|
listwnd->invalidateItem(pos);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (isSelected(pos))
|
||
|
{
|
||
|
l[pos] = 0;
|
||
|
num_selected--;
|
||
|
if (cb) listwnd->itemSelection(pos, FALSE);
|
||
|
listwnd->invalidateItem(pos);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
int SelItemList::isSelected(int pos)
|
||
|
{
|
||
|
if (pos >= list.getSize()) return 0;
|
||
|
return list.getMemory()[pos];
|
||
|
}
|
||
|
int SelItemList::getNumSelected() { return num_selected; }
|
||
|
|
||
|
void SelItemList::deleteByPos(int pos)
|
||
|
{
|
||
|
ASSERT(pos >= 0);
|
||
|
int s = list.getSize();
|
||
|
if (pos >= s) return ;
|
||
|
num_selected -= isSelected(pos);
|
||
|
char *m = list.getMemory() + pos;
|
||
|
MEMCPY(m, m + 1, s - (pos + 1));
|
||
|
}
|
||
|
void SelItemList::deselectAll()
|
||
|
{ // for internal use, doesn't send callbacks
|
||
|
list.zeroMemory();
|
||
|
num_selected = 0;
|
||
|
}
|