123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #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;
- }
|