123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- #include <precomp.h>
- #include "main.h"
- #include "wa2pldirobj.h"
- #include "wa2frontend.h"
- #include <bfc/util/timefmt.h>
- #include "wa2pledit.h"
- /*
- TODO:
- register for playlists callbacks so we can keep up to date
- drag&drop re-ordering
- in-place renaming
- widget for editing playlists
- */
- const wchar_t plDirXuiObjectStr[] = L"PlaylistDirectory"; // This is the xml tag
- char plDirXuiSvcName[] = "Playlist Directory XUI object"; // this is the name of the xuiservice
- static PlDirScriptObjectController _pldirController;
- ScriptObjectController *pldirController = &_pldirController;
- BEGIN_SERVICES(wa2PlDirObj_Svcs);
- DECLARE_SERVICETSINGLE(svc_scriptObject, PlDirScriptObjectSvc);
- DECLARE_SERVICE(XuiObjectCreator<PlDirXuiSvc>);
- END_SERVICES(wa2PlDirObj_Svcs, _wa2PlDirObj_Svcs);
- #define CB_POPULATE 0x6273
- #ifdef _X86_
- extern "C"
- {
- int _link_wa2PlDirObj_Svcs;
- }
- #else
- extern "C"
- {
- int __link_wa2PlDirObj_Svcs;
- }
- #endif
- // -----------------------------------------------------------------------------------------------------
- // Service
- ScriptObjectController *PlDirScriptObjectSvc::getController(int n)
- {
- switch (n)
- {
- case 0:
- return pldirController;
- }
- return NULL;
- }
- // -----------------------------------------------------------------------------------------------------
- // PlDirObject
- PlDirObject::PlDirObject()
- {
- getScriptObject()->vcpu_setInterface(PLDIR_SCRIPTOBJECT_GUID, (void *)static_cast<PlDirObject *>(this));
- getScriptObject()->vcpu_setClassName(L"PlDir");
- getScriptObject()->vcpu_setController(pldirController);
- _pldirController.mylist.addItem(this);
- }
- PlDirObject::~PlDirObject()
- {
- int numItems = getItemCount();
- for (int i=0;i<numItems;i++)
- {
- GUID *playlist_guid = (GUID *)getItemData(i);
- if (playlist_guid)
- delete playlist_guid;
- }
- if (WASABI_API_SYSCB) WASABI_API_SYSCB->syscb_deregisterCallback(static_cast<PlaylistCallbackI *>(this));
- _pldirController.mylist.removeItem(this);
- }
- int PlDirObject::playlistcb_added(size_t index)
- {
- postDeferredCallback(CB_POPULATE);
- return 1;
- }
- int PlDirObject::playlistcb_saved(size_t index)
- {
- postDeferredCallback(CB_POPULATE);
- return 1;
- }
- int PlDirObject::onDeferredCallback(intptr_t p1, intptr_t p2)
- {
- if (p1 == CB_POPULATE)
- {
- Populate();
- return 1;
- }
- return ListWnd::onDeferredCallback(p1, p2);
- }
- void PlDirObject::Populate()
- {
- int numItems = getItemCount();
- for (int i=0;i<numItems;i++)
- {
- GUID *playlist_guid = (GUID *)getItemData(i);
- if (playlist_guid)
- delete playlist_guid;
- }
- deleteAllItems();
- if (AGAVE_API_PLAYLISTS)
- {
- AGAVE_API_PLAYLISTS->Lock();
- size_t count = AGAVE_API_PLAYLISTS->GetCount();
- for (size_t i=0;i!=count;i++)
- {
- const wchar_t *playlistName = AGAVE_API_PLAYLISTS->GetName(i);
- GUID *playlist_guid = new GUID(AGAVE_API_PLAYLISTS->GetGUID(i));
- addItem(playlistName, (LPARAM)playlist_guid); // TODO: malloc pointer to GUID and store
- wchar_t temp[256] = {0};
- size_t numItems=0;
- AGAVE_API_PLAYLISTS->GetInfo(i, api_playlists_itemCount, &numItems, sizeof(numItems));
- WCSNPRINTF(temp, 256, L"%u", numItems);
- this->setSubItem(i, 1, temp);
- AGAVE_API_PLAYLISTS->GetInfo(i, api_playlists_totalTime, &numItems, sizeof(numItems)); //numitems holds now time
- wchar_t buf[1024] = {0};
- TimeFmt::printHourMinSec(numItems, buf, 1024, 1);
- this->setSubItem(i, 2, buf);
- }
- AGAVE_API_PLAYLISTS->Unlock();
- }
- }
- int PlDirObject::onInit()
- {
- /*colresize = 1;
- resizing_col = true;
- colresizeo = 1;*/
- ListWnd::onInit();
- setName(L"Playlists");
- //setItemIcon(
- //setShowColumnsHeaders(FALSE);
- ListColumn *nameCol = new ListColumn(L"Playlist Title", 1);
- //nameCol->setWidth(100);
- insertColumn(nameCol);
- /*ListColumn *countCol= new ListColumn(L"Items", 0);
- countCol->setWidth(40);
- countCol->setAlignment(COL_RIGHTALIGN);
- insertColumn(countCol,1,COL_RIGHTALIGN);
- ListColumn *lenCol= new ListColumn(L"Time", 0);
- lenCol->setWidth(50);
- lenCol->setAlignment(COL_CENTERALIGN);
- insertColumn(lenCol, 1, COL_CENTERALIGN);
- insertColumn(lenCol);*/
- addColumn(L"Items", 40, 0, COL_RIGHTALIGN);
- addColumn(L"Time", 55, 0, COL_RIGHTALIGN);
-
- //addColumn(L"Time", 100);
- Populate();
- WASABI_API_SYSCB->syscb_registerCallback(static_cast<PlaylistCallbackI *>(this));
- return 1;
- }
- /*
- int PlDirObject::onResize()
- {
- ListWnd::onResize();
- RECT r;
- getClientRect(&r);
- ListColumn *lc = getColumn(0);
- lc->setWidth(r.right - r.left);
- return 1;
- }*/
- void PlDirObject::onDoubleClick(int itemnum)
- {
- ListWnd::onDoubleClick(itemnum);
- // find a playlisteditor object near us
- Wa2PlaylistEditor *editor = static_cast<Wa2PlaylistEditor *>(findWindowByInterface(Wa2PlaylistEditor::getInterfaceGuid()));
- if (editor != NULL)
- {
- Wa2Playlist *playlist = getPlaylist(itemnum);
- editor->setPlaylist(playlist);
- }
- GUID *playlist_guid = (GUID *)this->getItemData(itemnum);
- if (playlist_guid)
- {
- size_t index;
- AGAVE_API_PLAYLISTS->Lock();
- if (AGAVE_API_PLAYLISTS->GetPosition(*playlist_guid, &index) == API_PLAYLISTS_SUCCESS)
- {
- // TODO: benski> try to retrieve setting from ml_playlists for play vs enqueue on double click
- const wchar_t *playlist_filename = AGAVE_API_PLAYLISTS->GetFilename(index);
- wa2.playFile(playlist_filename);
- }
- AGAVE_API_PLAYLISTS->Unlock();
- }
- }
- Wa2Playlist *PlDirObject::getPlaylist(int itemnum)
- {
- return (Wa2Playlist *) - 1;
- }
- // -----------------------------------------------------------------------------------------------------
- // PlDirScriptObjectController
- function_descriptor_struct PlDirScriptObjectController::exportedFunction[] = {
- {L"showCurrentlyPlayingEntry", 0, (void*)PlDirScriptObjectController::pldir_showCurrentlyPlayingEntry},
- {L"getNumItems", 0, (void*)PlDirScriptObjectController::pldir_getNumItems},
- {L"renameItem", 2, (void*)PlDirScriptObjectController::pldir_renameItem},
- {L"getItemName", 1, (void*)PlDirScriptObjectController::pldir_getItemName},
- {L"playItem", 1, (void*)PlDirScriptObjectController::pldir_playItem},
- {L"enqueueItem", 1, (void*)PlDirScriptObjectController::pldir_enqueueItem},
- {L"refresh", 0, (void*)PlDirScriptObjectController::pldir_refresh},
- };
- int PlDirScriptObjectController::getNumFunctions()
- {
- return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
- }
- ScriptObject *PlDirScriptObjectController::instantiate()
- {
- PlDirObject *c = new PlDirObject;
- if (!c) return NULL;
- return c->getScriptObject();
- }
- void PlDirScriptObjectController::destroy(ScriptObject *o)
- {
- PlDirObject *obj = static_cast<PlDirObject *>(o->vcpu_getInterface(PLDIR_SCRIPTOBJECT_GUID));
- ASSERT(obj != NULL);
- delete obj;
- }
- PlDirScriptObjectController::~PlDirScriptObjectController()
- {
- // Destroy our list, otherwise we get a big bang on wasabi shutdown
- if (_pldirController.mylist.getNumItems() > 0)
- _pldirController.mylist.deleteAll();
- }
- void *PlDirScriptObjectController::encapsulate(ScriptObject *o)
- {
- return NULL; // nobody can inherits from me yet (see rootobj or guiobj in studio if you want to allow that)
- }
- void PlDirScriptObjectController::deencapsulate(void *)
- {}
- // Script calls
- scriptVar PlDirScriptObjectController::pldir_showCurrentlyPlayingEntry(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
- {
- SCRIPT_FUNCTION_INIT
- HWND hPeWindow = wa2.getWnd(IPC_GETWND_PE);
- SendMessageW(hPeWindow, WM_USER, 666, wa2.PE_getCurrentIndex());
- RETURN_SCRIPT_VOID;
- }
- scriptVar PlDirScriptObjectController::pldir_getNumItems(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
- {
- SCRIPT_FUNCTION_INIT
- AGAVE_API_PLAYLISTS->Lock();
- size_t n = AGAVE_API_PLAYLISTS->GetCount();
- AGAVE_API_PLAYLISTS->Unlock();
- return MAKE_SCRIPT_INT(n);
- }
- scriptVar PlDirScriptObjectController::pldir_refresh(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
- {
- SCRIPT_FUNCTION_INIT
- for (int i = 0; i < _pldirController.mylist.getNumItems(); i++)
- {
- PlDirObject *p = _pldirController.mylist.enumItem(i);
- if (p) p->Populate();
- }
- // TODO: add refresh for ml pl view!
- //HWND hMlWindow = wa2.getMediaLibrary();
- //SendMessageW(hMlWindow, ???);
- //AGAVE_API_PLAYLISTS->MoveBefore(2,1);
- RETURN_SCRIPT_VOID;
- }
- scriptVar PlDirScriptObjectController::pldir_renameItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar item, scriptVar name)
- {
- SCRIPT_FUNCTION_INIT
- AGAVE_API_PLAYLISTS->Lock();
- AGAVE_API_PLAYLISTS->RenamePlaylist(GET_SCRIPT_INT(item), GET_SCRIPT_STRING(name));
- AGAVE_API_PLAYLISTS->Unlock();
- for (int i = 0; i < _pldirController.mylist.getNumItems(); i++)
- {
- PlDirObject* p = _pldirController.mylist.enumItem(i);
- if (p) p->Populate();
- }
- //AGAVE_API_PLAYLISTS->MoveBefore(2,1);
- RETURN_SCRIPT_VOID;
- }
- scriptVar PlDirScriptObjectController::pldir_getItemName(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar item)
- {
- SCRIPT_FUNCTION_INIT
- AGAVE_API_PLAYLISTS->Lock();
- const wchar_t *k = AGAVE_API_PLAYLISTS->GetName(GET_SCRIPT_INT(item));
- AGAVE_API_PLAYLISTS->Unlock();
- return MAKE_SCRIPT_STRING(k);
- }
- scriptVar PlDirScriptObjectController::pldir_playItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar _itemnum)
- {
- SCRIPT_FUNCTION_INIT
- int itemnum = GET_SCRIPT_INT(_itemnum);
- GUID playlist_guid = AGAVE_API_PLAYLISTS->GetGUID(itemnum);
- size_t index;
- AGAVE_API_PLAYLISTS->Lock();
- if (AGAVE_API_PLAYLISTS->GetPosition(playlist_guid, &index) == API_PLAYLISTS_SUCCESS)
- {
- // TODO: benski> try to retrieve setting from ml_playlists for play vs enqueue on double click
- const wchar_t *playlist_filename = AGAVE_API_PLAYLISTS->GetFilename(index);
- wa2.playFile(playlist_filename);
- }
- AGAVE_API_PLAYLISTS->Unlock();
- RETURN_SCRIPT_VOID
- }
- scriptVar PlDirScriptObjectController::pldir_enqueueItem(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar _itemnum)
- {
- SCRIPT_FUNCTION_INIT
- int itemnum = GET_SCRIPT_INT(_itemnum);
- GUID playlist_guid = AGAVE_API_PLAYLISTS->GetGUID(itemnum);
- size_t index;
- AGAVE_API_PLAYLISTS->Lock();
- if (AGAVE_API_PLAYLISTS->GetPosition(playlist_guid, &index) == API_PLAYLISTS_SUCCESS)
- {
- // TODO: benski> try to retrieve setting from ml_playlists for play vs enqueue on double click
- const wchar_t *playlist_filename = AGAVE_API_PLAYLISTS->GetFilename(index);
- wa2.enqueueFile(playlist_filename);
- }
- AGAVE_API_PLAYLISTS->Unlock();
- RETURN_SCRIPT_VOID
- }
|