winamp/Src/Wasabi/api/skin/widgets/grouplist.cpp
2024-09-24 14:54:57 +02:00

229 lines
6.2 KiB
C++

#include <precomp.h>
#include <api/skin/widgets/group.h>
#include <api/skin/groupmgr.h>
#include "grouplist.h"
#include <api/config/items/cfgitem.h>
#include <api/wnd/notifmsg.h>
const wchar_t groupListXuiObjectStr[] = L"GroupList"; // This is the xml tag
char groupListXuiSvcName[] = "GroupList xui object"; // this is the name of the xuiservice
GroupList::GroupList() {
getScriptObject()->vcpu_setInterface(grouplistGuid, (void *)static_cast<GroupList *>(this));
getScriptObject()->vcpu_setClassName(L"GroupList");
getScriptObject()->vcpu_setController(grouplistController);
scrollY = 0;
maxheight = 0;
maxwidth = 0;
redraw=1;
}
GroupList::~GroupList() {
// todo: unload group scripts
for (int i=0;i<groups.getNumItems();i++)
GroupMgr::destroy(groups.enumItem(i));
groups.removeAll();
}
Group *GroupList::instantiate(const wchar_t *id, int n) {
Group *last=NULL;
RECT r;
getClientRect(&r);
for (int i=0;i<n;i++) {
last = GroupMgr::instantiate(id);
last->setParent(this);
last->init(this);
groups.addItem(last);
}
reposChildren();
notifyParent(ChildNotify::AUTOWHCHANGED);
invalidate();
return last;
}
int GroupList::onResize() {
int r = GROUPLIST_PARENT::onResize();
reposChildren();
return r;
}
Group *GroupList::enumItem(int n) {
return groups.enumItem(n);
}
void GroupList::removeAll() {
for (int i=0;i<groups.getNumItems();i++)
GroupMgr::destroy(groups.enumItem(i));
groups.removeAll();
notifyParent(ChildNotify::AUTOWHCHANGED);
if (!redraw) return;
invalidate();
}
int GroupList::getNumItems() {
return groups.getNumItems();
}
void GroupList::scrollToPercent(int p) {
RECT r;
getClientRect(&r);
int height = r.bottom - r.top;
if (height > maxheight) return;
scrollTo((int)((float)(maxheight - height) * (float)p / 100.0f));
}
void GroupList::scrollTo(int y) {
scrollY = y;
if (!redraw) return;
invalidate();
}
void GroupList::reposChildren() {
if (!redraw) return;
RECT r;
getClientRect(&r);
int ch = -scrollY+r.top;
maxheight = 0;
for (int i=0;i<getNumItems();i++) {
Group *g = enumItem(i);
int h = g->getPreferences(SUGGESTED_H);
int w = g->getPreferences(SUGGESTED_W);
RECT cr;
getClientRect(&cr);
cr.top = ch;
cr.bottom = cr.top + h;
g->resize(&cr);
maxheight += h;
if (maxwidth < w) maxwidth = w;
ch += h;
}
}
void GroupList::setRedraw(int i) {
if (redraw == i) return;
redraw=i;
if (redraw) {
notifyParent(ChildNotify::AUTOWHCHANGED);
reposChildren();
invalidate();
}
}
int GroupList::getPreferences(int what) {
if (what == SUGGESTED_H) { reposChildren(); return maxheight; }
if (what == SUGGESTED_W) { reposChildren(); return maxwidth; }
return GROUPLIST_PARENT::getPreferences(what);
}
GroupListScriptController _grouplistController;
GroupListScriptController *grouplistController = &_grouplistController;
// -- Functions table -------------------------------------
function_descriptor_struct GroupListScriptController ::exportedFunction[] = {
{L"instantiate", 2, (void*)GroupList::script_vcpu_instantiate },
{L"getNumItems", 0, (void*)GroupList::script_vcpu_getNumItems },
{L"enumItem", 1, (void*)GroupList::script_vcpu_enumItem },
{L"removeAll", 0, (void*)GroupList::script_vcpu_removeAll },
{L"scrollToPercent", 1, (void*)GroupList::script_vcpu_scrollToPercent },
{L"setRedraw", 1, (void*)GroupList::script_vcpu_setRedraw},
};
const wchar_t *GroupListScriptController ::getClassName() {
return L"GroupList";
}
const wchar_t *GroupListScriptController ::getAncestorClassName() {
return L"GuiObject";
}
ScriptObject *GroupListScriptController::instantiate() {
GroupList *gl = new GroupList;
ASSERT(gl != NULL);
return gl->getScriptObject();
}
void GroupListScriptController::destroy(ScriptObject *o) {
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
ASSERT(gl != NULL);
delete gl;
}
void *GroupListScriptController::encapsulate(ScriptObject *o) {
return NULL; // no encapsulation for grouplist yet
}
void GroupListScriptController::deencapsulate(void *o) {
}
int GroupListScriptController ::getNumFunctions() {
return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
}
const function_descriptor_struct *GroupListScriptController ::getExportedFunctions() {
return exportedFunction;
}
GUID GroupListScriptController ::getClassGuid() {
return grouplistGuid;
}
scriptVar GroupList::script_vcpu_instantiate(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar id, scriptVar n) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
Group *g = NULL;
if (gl) g = gl->instantiate(GET_SCRIPT_STRING(id), GET_SCRIPT_INT(n));
return MAKE_SCRIPT_OBJECT(g ? g->getScriptObject() : NULL);
}
scriptVar GroupList::script_vcpu_getNumItems(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
if (gl) return MAKE_SCRIPT_INT(gl->getNumItems());
RETURN_SCRIPT_ZERO;
}
scriptVar GroupList::script_vcpu_enumItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar n) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
Group *g = NULL;
if (gl) g = gl->enumItem(GET_SCRIPT_INT(n));
return MAKE_SCRIPT_OBJECT(g ? g->getScriptObject() : NULL);
}
scriptVar GroupList::script_vcpu_removeAll(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
if (gl) gl->removeAll();
RETURN_SCRIPT_VOID;
}
scriptVar GroupList::script_vcpu_scrollToPercent(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar n) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
if (gl) gl->scrollToPercent(GET_SCRIPT_INT(n));
RETURN_SCRIPT_VOID;
}
scriptVar GroupList::script_vcpu_setRedraw(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar n) {
SCRIPT_FUNCTION_INIT
GroupList *gl = static_cast<GroupList *>(o->vcpu_getInterface(grouplistGuid));
if (gl) gl->setRedraw(GET_SCRIPT_INT(n));
RETURN_SCRIPT_VOID;
}