diff options
Diffstat (limited to 'Src/Plugins/General/gen_ff/wa2pledit.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ff/wa2pledit.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ff/wa2pledit.cpp b/Src/Plugins/General/gen_ff/wa2pledit.cpp new file mode 100644 index 00000000..99b021fb --- /dev/null +++ b/Src/Plugins/General/gen_ff/wa2pledit.cpp @@ -0,0 +1,241 @@ +#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); +} |