winamp/Src/Plugins/General/gen_ff/wa2pledit.cpp
2024-09-24 14:54:57 +02:00

242 lines
5.7 KiB
C++

#include <precomp.h>
#include "wa2pledit.h"
#include <api/script/objects/PlaylistScriptObject.h>
#include <tataki/color/skinclr.h>
#include "wa2frontend.h"
#include <tataki/canvas/bltcanvas.h>
#include "../nu/AutoWide.h"
#ifndef _WASABIRUNTIME
BEGIN_SERVICES(Wa2Pledit_Svc);
DECLARE_SERVICE(XuiObjectCreator<Wa2PleditXuiSvc>);
END_SERVICES(Wa2Pledit_Svc, _Wa2Pledit_Svc);
#ifdef _X86_
extern "C" { int _link_Wa2PleditXuiSvc; }
#else
extern "C" { int __link_Wa2PleditXuiSvc; }
#endif
#endif
// -----------------------------------------------------------------------
const wchar_t Wa2PleditXuiObjectStr[] = L"PlaylistEditor"; // This is the xml tag
char Wa2PleditXuiSvcName[] = "Playlist Editor xui object";
// -----------------------------------------------------------------------
#define TRACKLENGTH_WIDTH 40
#define DC_CURRENTIDX 10
#define DC_PLAY 11
#define TIMER_REFRESHLIST 12
static SkinColor text(L"pledit.text"), rotext(L"pledit.text.readonly");
static SkinColor text_disabled(L"pledit.text.disabled");
static SkinColor bgcolor(L"pledit.bgcolor");
static SkinColor currenttext(L"wasabi.itemlist.outline.focus");
static SkinColor currentoutline(L"wasabi.itemlist.outline.current");
PtrList<Wa2PlaylistEditor> Wa2PlaylistEditor::editors;
COLORREF Wa2PlaylistEditor::getTextColor(LPARAM lParam) {
// if (playlist == NULL) return text;
// PlaylistEntry *entry = playlist->enumEntry(lParam);
// if (entry && entry->getCurrent())
// return currenttext;
// else
if (lParam == cur_index)
return currenttext;
return text;
}
COLORREF Wa2PlaylistEditor::getBgColor(LPARAM lParam) {
return bgcolor;
}
COLORREF Wa2PlaylistEditor::getFocusRectColor(LPARAM lParam) {
return currentoutline;
}
int Wa2PlaylistEditor::needFocusRect(LPARAM lParam)
{
return lParam == cur_index;
}
Wa2PlaylistEditor::Wa2PlaylistEditor()
: curplaylist(0)
{
curplaylist = NULL;
cur_index = wa2.PE_getCurrentIndex()+1;
}
Wa2PlaylistEditor::~Wa2PlaylistEditor() {
killTimer(TIMER_REFRESHLIST);
editors.removeItem(this);
}
int Wa2PlaylistEditor::onInit()
{
WA2PLAYLISTEDITOR_PARENT::onInit();
setShowColumnsHeaders(FALSE);
addColumn(L"Track #", calcTrackNumWidth());
addColumn(L"Track Name", 200);
addColumn(L"Length", TRACKLENGTH_WIDTH, 1, COL_RIGHTALIGN);
editors.addItem(this);
return 1;
}
void Wa2PlaylistEditor::onVScrollToggle(int set) {
resizeCols();
}
int Wa2PlaylistEditor::onResize() {
WA2PLAYLISTEDITOR_PARENT::onResize();
resizeCols();
return 1;
}
void Wa2PlaylistEditor::resizeCols() {
RECT r;
getClientRect(&r);
ListColumn *c0 = getColumn(0);
int tw = calcTrackNumWidth();
c0->setWidth(tw);
ListColumn *c1 = getColumn(1);
c1->setWidth(r.right-r.left - tw - TRACKLENGTH_WIDTH);
}
int Wa2PlaylistEditor::calcTrackNumWidth()
{
WndCanvas bc(this);
Wasabi::FontInfo fontInfo;
fontInfo.pointSize = getFontSize();
int cw = getFontSize();
int dw = 8;
bc.getTextExtent(L"W", &cw, NULL, &fontInfo);
bc.getTextExtent(L".", &dw, NULL, &fontInfo);
int n = getNumItems();
if (n < 0) return dw+cw;
float f = log10((float)n);
int l = (int)ceil(f);
return (l * cw) + dw + 5;
}
void *Wa2PlaylistEditor::getInterface(GUID interface_guid) {
if (interface_guid == Wa2PlaylistEditor::getInterfaceGuid()) {
return this;
}
return WA2PLAYLISTEDITOR_PARENT::getInterface(interface_guid);
}
void Wa2PlaylistEditor::setPlaylist(Wa2Playlist *playlist) {
if (curplaylist == playlist)
return;
curplaylist = playlist;
loadList();
}
void Wa2PlaylistEditor::_loadList() {
int y = getScrollY();
setRedraw(FALSE);
deleteAllItems();
if (curplaylist == (Wa2Playlist *)-1) {
// load the current playlist (the one in the real playlist editor)
int n = wa2.PE_getNumItems();
for (int i=0;i<n;i++)
{
fileinfo2 *fi = wa2.PE_getFileTitle(i);
addItem(StringPrintfW(L"%d.", i+1), i+1);
setSubItem(i, 1, AutoWide(fi->filetitle));
setSubItem(i, 2, AutoWide(fi->filelength));
}
} else {
// load an available playlist
}
RECT r;
getClientRect(&r);
int ch = getContentsHeight();
if (ch - y >= r.bottom-r.top) scrollToY(y);
else if (ch - r.bottom-r.top >= 0) scrollToY(ch - r.bottom-r.top);
else scrollToY(0);
resizeCols();
postDeferredCallback(DC_CURRENTIDX);
setRedraw(TRUE);
}
void Wa2PlaylistEditor::_onNewCurrentIndex(int idx)
{
foreach(editors)
editors.getfor()->onNewCurrentIndex(idx);
endfor
}
void Wa2PlaylistEditor::onNewCurrentIndex(int idx)
{
if (idx!=cur_index)
{
int oldIdx = cur_index;
cur_index = idx;
invalidateItem(oldIdx);
invalidateItem(idx);
}
}
void Wa2PlaylistEditor::onSetVisible(int show) {
WA2PLAYLISTEDITOR_PARENT::onSetVisible(show);
if (!show) getParent()->setFocus();
}
void Wa2PlaylistEditor::onPlaylistModified() {
if (curplaylist == (Wa2Playlist *)-1)
loadList();
}
void Wa2PlaylistEditor::_onPlaylistModified() {
// fist call the Pledit script object
SPlaylist::onPleditModified();
// than all our old pledit xml objects
foreach(editors)
editors.getfor()->onPlaylistModified();
endfor
}
int Wa2PlaylistEditor::onDeferredCallback(intptr_t p1, intptr_t p2)
{
if (p1 == DC_CURRENTIDX)
{
onNewCurrentIndex(wa2.PE_getCurrentIndex()+1);
return 1;
}
return WA2PLAYLISTEDITOR_PARENT::onDeferredCallback(p1, p2);
}
void Wa2PlaylistEditor::onDoubleClick(int itemnum)
{
WA2PLAYLISTEDITOR_PARENT::onDoubleClick(itemnum);
wa2.PE_setCurrentIndex(itemnum);
wa2.userButton(WA2_USERBUTTON_PLAY, 0);
_onNewCurrentIndex(itemnum+1);
}
void Wa2PlaylistEditor::timerCallback(int id)
{
if (id == TIMER_REFRESHLIST) {
killTimer(TIMER_REFRESHLIST);
_loadList();
}
}
void Wa2PlaylistEditor::loadList()
{
killTimer(TIMER_REFRESHLIST);
setTimer(TIMER_REFRESHLIST, 500);
}