mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-30 20:34:26 +01:00
822 lines
20 KiB
C++
822 lines
20 KiB
C++
/** (c) Nullsoft, Inc. C O N F I D E N T I A L
|
|
** Filename:
|
|
** Project:
|
|
** Description:
|
|
** Author:
|
|
** Created:
|
|
**/
|
|
#include "Main.h"
|
|
#include "draw.h"
|
|
#include "api.h"
|
|
#include "../nu/AutoWide.h"
|
|
#include "../nu/AutoChar.h"
|
|
#include "resource.h"
|
|
#include <bfc/platform/minmax.h>
|
|
#include "WADrawDC.h"
|
|
|
|
HBITMAP plMainBM=0;
|
|
extern "C" int pe_init = 0;
|
|
wchar_t playlistStr[19] = {0};
|
|
int (WINAPI *jtf_drawtext)(HDC, LPCWSTR, int, LPRECT, UINT) = 0;
|
|
|
|
void draw_pe_init()
|
|
{
|
|
EnterCriticalSection(&g_srcdccs);
|
|
if (pe_init)
|
|
draw_pe_kill();
|
|
pe_init=1;
|
|
if (!plMainBM)
|
|
plMainBM = draw_LBitmap(MAKEINTRESOURCE(IDB_PLEDIT), L"pledit.bmp");
|
|
LeaveCriticalSection(&g_srcdccs);
|
|
}
|
|
|
|
void draw_pe_kill()
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
EnterCriticalSection(&g_srcdccs);
|
|
DeleteObject(plMainBM);
|
|
plMainBM=0;
|
|
pe_init=0;
|
|
LeaveCriticalSection(&g_srcdccs);
|
|
}
|
|
|
|
void draw_set_plbm(HBITMAP bm)
|
|
{
|
|
EnterCriticalSection(&g_srcdccs);
|
|
if (plMainBM)
|
|
DeleteObject(plMainBM);
|
|
plMainBM=bm;
|
|
LeaveCriticalSection(&g_srcdccs);
|
|
}
|
|
|
|
void draw_pe_iobut(int which) // -1 = none, 0 = load, 1=save, 2=clear
|
|
{
|
|
if (!pe_init || disable_skin_borders) // if we're not init'd (shouldn't happen) or gen_ff is active
|
|
return;
|
|
|
|
int offs=config_pe_width-44;
|
|
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
|
|
setSrcBM(plMainBM);
|
|
|
|
BitBlt(hdcout, offs-3, config_pe_height-30-18*2, 3, 18*3, bmDC, 250, 111, SRCCOPY);
|
|
BitBlt(hdcout, offs, config_pe_height-30-18*2, 22, 18, bmDC, (which==2)?227:204, 111, SRCCOPY);
|
|
BitBlt(hdcout, offs, config_pe_height-30-18, 22, 18, bmDC, (which==1)?227:204, 130, SRCCOPY);
|
|
BitBlt(hdcout, offs, config_pe_height-30, 22, 18, bmDC, (which==0)?227:204, 149, SRCCOPY);
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
static void draw_pe_infostr(HDC hdcout, wchar_t *str)
|
|
{
|
|
StringCchCopyW(playlistStr, 18, str); // use 18 instead of 19 to keep the last byte null terminated
|
|
AutoChar narrowStr(str);
|
|
SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)(char *)narrowStr, IPC_CB_PEINFOTEXT);
|
|
playlistTextFeed->UpdateText(playlistStr, 19);
|
|
|
|
if (!pe_init)
|
|
return;
|
|
wchar_t data[19] = {0};
|
|
int x,xp=config_pe_width-143,yp=config_pe_height-28;
|
|
|
|
if (disable_skin_borders) return;
|
|
|
|
if (lstrlenW(str) < 18)
|
|
{
|
|
StringCchCopyW(data,19, str);
|
|
for (x = lstrlenW(str); x < 18; x ++) data[x]=L' ';
|
|
}
|
|
else memcpy(data,str,18*sizeof(wchar_t));
|
|
do_palmode(hdcout);
|
|
setSrcBM(fontBM);
|
|
for (x = 0; x < 18; x ++)
|
|
{
|
|
int c=0,c2=0;
|
|
getXYfromChar(data[x],&c,&c2);
|
|
BitBlt(hdcout,xp,yp,5,6,bmDC,c,c2,SRCCOPY);
|
|
xp+=5;
|
|
}
|
|
unsetSrcBM();
|
|
}
|
|
|
|
/* if we ever want to use a font rather than the skin bitmap, we can uncomment this
|
|
void draw_pe_infostr_font(char *str)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
int xp=config_pe_width-145,yp=config_pe_height-30;
|
|
HDC hdcout;
|
|
|
|
SendMessageW(hMainWindow, WM_WA_IPC, reinterpret_cast<WPARAM>(str), IPC_CB_PEINFOTEXT);
|
|
|
|
if (disable_skin_borders) return;
|
|
|
|
hdcout=draw_GetWindowDC(hPLWindow);
|
|
do_palmode(hdcout);
|
|
HFONT oldfont = (HFONT) SelectObject(hdcout,mfont);
|
|
SetTextColor(hdcout,Skin_PLColors[0]);
|
|
SetBkColor(hdcout,Skin_PLColors[2]);
|
|
|
|
RECT r={xp, yp, xp+92, yp+10};
|
|
DrawText(hdcout, str, min(18, lstrlen(str)), &r, DT_CENTER| DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
|
|
|
|
SelectObject(hdcout,oldfont);
|
|
draw_ReleaseDC(hPLWindow,hdcout);
|
|
}
|
|
*/
|
|
|
|
void draw_pe_miscbut(int which) // -1 = none, 0 = inf, 1 = sort, 2=misc
|
|
{
|
|
if (!pe_init || disable_skin_borders) // if we're not init'd (shouldn't happen) or gen_ff is active
|
|
return;
|
|
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
|
|
BitBlt(hdcout, 98, config_pe_height-30-18*2, 3, 18*3, bmDC, 200, 111, SRCCOPY);
|
|
BitBlt(hdcout, 101, config_pe_height-30-18*2, 22, 18, bmDC, (which==2)?177:154, 111, SRCCOPY);
|
|
BitBlt(hdcout, 101, config_pe_height-30-18, 22, 18, bmDC, (which==1)?177:154, 130, SRCCOPY);
|
|
BitBlt(hdcout, 101, config_pe_height-30, 22, 18, bmDC, (which==0)?177:154, 149, SRCCOPY);
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
void draw_pe_selbut(int which) // -1 = none, 0 = all, 1 = none, 2=inv
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
|
|
if (disable_skin_borders) return;
|
|
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
|
|
BitBlt(hdcout,69,config_pe_height-30-18*2,3,18*3,bmDC,150,111,SRCCOPY);
|
|
BitBlt(hdcout,72,config_pe_height-30-18*2,22,18,bmDC,(which==2)?127:104,111,SRCCOPY);
|
|
BitBlt(hdcout,72,config_pe_height-30-18,22,18,bmDC,(which==1)?127:104,130,SRCCOPY);
|
|
BitBlt(hdcout,72,config_pe_height-30,22,18,bmDC,(which==0)?127:104,149,SRCCOPY);
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
void draw_pe_rembut(int which) // -1 = none, 0 = sel, 1 = crop, 2 = all
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
|
|
if (disable_skin_borders) return;
|
|
|
|
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
|
|
BitBlt(hdcout,40,config_pe_height-30-18*3,3,18*4,bmDC,100,111,SRCCOPY);
|
|
BitBlt(hdcout,43,config_pe_height-30-18*3,22,18,bmDC,(which==3)?77:54,168,SRCCOPY);
|
|
BitBlt(hdcout,43,config_pe_height-30-18*2,22,18,bmDC,(which==2)?77:54,111,SRCCOPY);
|
|
BitBlt(hdcout,43,config_pe_height-30-18,22,18,bmDC,(which==1)?77:54,130,SRCCOPY);
|
|
BitBlt(hdcout,43,config_pe_height-30,22,18,bmDC,(which==0)?77:54,149,SRCCOPY);
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
void draw_pe_addbut(int which) // -1 = none, 0 = file, 1 = dir, 2 = loc
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
|
|
if (disable_skin_borders) return;
|
|
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
|
|
BitBlt(hdcout,11,config_pe_height-30-18*2,3,18*3,bmDC,48,111,SRCCOPY);
|
|
BitBlt(hdcout,14,config_pe_height-30-18*2,22,18,bmDC,(which==2)?23:0,111,SRCCOPY);
|
|
BitBlt(hdcout,14,config_pe_height-30-18,22,18,bmDC,(which==1)?23:0,130,SRCCOPY);
|
|
BitBlt(hdcout,14,config_pe_height-30,22,18,bmDC,(which==0)?23:0,149,SRCCOPY);
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
void draw_pe_vslide(HWND hwnd, HDC hdc, int pushed, int pos) // pos 0..playlist_getlength()-num_songs
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
int track_h = config_pe_height-20-38;
|
|
int slid_h = 18;
|
|
//int w = 25;
|
|
int yp,y,oy;
|
|
|
|
WADrawDC hdcout(hdc, hwnd);
|
|
do_palmode(hdcout);
|
|
|
|
setSrcBM(plMainBM);
|
|
{
|
|
int num_songs=(config_pe_height-38-20-2)/pe_fontheight;
|
|
int t=PlayList_getlength()-num_songs;
|
|
if (t < 1) yp = 0;
|
|
else {
|
|
if (pos > t) pos=t;
|
|
yp = ((track_h-slid_h)*pos)/t;
|
|
if (yp < 0) yp = 0;
|
|
}
|
|
}
|
|
for (y = 0; y < yp-28; y += 29)
|
|
BitBlt(hdcout,config_pe_width-15,20+y,8,29,bmDC,36,42,SRCCOPY);
|
|
oy=y+29;
|
|
if (slid_h + yp > oy) oy+=29;
|
|
if (y < yp) BitBlt(hdcout,config_pe_width-15,20+y,8,yp-y,bmDC,36,42,SRCCOPY);
|
|
BitBlt(hdcout,config_pe_width-15,20+yp,8,slid_h,bmDC,pushed?61:52,53,SRCCOPY);
|
|
y=yp+slid_h;
|
|
if (y < oy && y < track_h) BitBlt(hdcout,config_pe_width-15,20+y,8,((y<track_h-29)?oy-y:track_h-y),bmDC,36,42+29-(oy-y),SRCCOPY);
|
|
y = oy;
|
|
for (y = oy; y < track_h; y += 29)
|
|
{
|
|
BitBlt(hdcout,config_pe_width-15,20+y,8,(y<track_h-29)?29:track_h-y,bmDC,36,42,SRCCOPY);
|
|
}
|
|
|
|
unsetSrcBM();
|
|
}
|
|
|
|
static void draw_pe_song(HDC hdcout, int pos, wchar_t *name, int time, int sel)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
|
|
int ypos, left, right, num_songs, fontHeight;
|
|
HFONT useFont;
|
|
COLORREF foreground, background;
|
|
HBRUSH useBrush;
|
|
if (pos < 0)
|
|
{
|
|
// if (config_pe_height != 14) return;
|
|
right = config_pe_width-29;
|
|
ypos = config_bifont?4:2;
|
|
left = 4;
|
|
num_songs = 1;
|
|
useFont=mfont;//shadefont;
|
|
fontHeight=10;
|
|
sel=0;
|
|
foreground=mfont_fgcolor;
|
|
background=mfont_bgcolor;
|
|
useBrush=mfont_bgbrush;
|
|
}
|
|
else
|
|
{
|
|
fontHeight=pe_fontheight;
|
|
right=config_pe_width-20;
|
|
ypos=22+pos*fontHeight,
|
|
left=12;
|
|
num_songs=(config_pe_height-38-20-2)/pe_fontheight;
|
|
useFont=font;
|
|
if (sel&2) foreground=Skin_PLColors[1];
|
|
else foreground= Skin_PLColors[0];
|
|
if (!(sel&1)) background= Skin_PLColors[2];
|
|
else background=Skin_PLColors[3];
|
|
useBrush=(sel&1)?selbrush:normbrush;
|
|
}
|
|
if (pos >= num_songs) return;
|
|
|
|
int xpos=left;
|
|
int endp=right;
|
|
int num_chars=(endp-xpos)/5;
|
|
if (pos>=0 || !config_bifont)
|
|
{
|
|
RECT r={xpos,ypos,endp, ypos+fontHeight};
|
|
|
|
SetTextColor(hdcout,foreground);
|
|
SetBkColor(hdcout,background);
|
|
|
|
do_palmode(hdcout);
|
|
HFONT oldfont = (HFONT) SelectObject(hdcout,useFont);
|
|
|
|
int rightToLeft = (config_pe_direction == PE_DIRECTION_RTL) || (config_pe_direction == PE_DIRECTION_AUTO && (GetFontLanguageInfo(hdcout) & GCP_REORDER));
|
|
if (time >= 0)
|
|
{
|
|
char str[123];
|
|
StringCchPrintfA(str,123," %d:%02d ",time/60,(time)%60); // format the time string
|
|
|
|
RECT r2=r;
|
|
if (pos == -1)
|
|
{
|
|
r2.top--;
|
|
r2.bottom--;
|
|
}
|
|
|
|
SIZE timeSize;
|
|
#ifdef BENSKI_NEW_MODE_THAT_BREAKS_GEN_JUMPEX_STUPID_API_HIJACKING
|
|
// compute width of the string
|
|
GetTextExtentPoint32(hdcout, str, lstrlen(str), &timeSize);
|
|
#else
|
|
DrawTextA(hdcout,str,lstrlenA(str),&r2,DT_VCENTER|DT_CALCRECT|DT_SINGLELINE/*|DT_NOCLIP*/|DT_NOPREFIX);
|
|
timeSize.cx = r2.right-r2.left;
|
|
r2.top = r.top;
|
|
r2.bottom = r.bottom;
|
|
#endif
|
|
if (timeSize.cx < endp-xpos)
|
|
{
|
|
UINT alignment;
|
|
|
|
if (rightToLeft)
|
|
{
|
|
r2.left=xpos;
|
|
r2.right=xpos+timeSize.cx;
|
|
|
|
r.left+=timeSize.cx;
|
|
xpos+=timeSize.cx;
|
|
alignment=DT_LEFT|DT_RTLREADING;
|
|
}
|
|
else
|
|
{
|
|
r2.left=endp-timeSize.cx;
|
|
r2.right=endp;
|
|
|
|
r.right-=timeSize.cx;
|
|
endp-=timeSize.cx;
|
|
alignment=DT_RIGHT;
|
|
}
|
|
|
|
DrawTextA(hdcout,str,lstrlenA(str),&r2,DT_VCENTER|DT_SINGLELINE|alignment/*|DT_NOCLIP*/|DT_NOPREFIX); // fg: removed DT_NOCLIP to fix xp's cleartype from painting too far
|
|
}
|
|
}
|
|
|
|
UINT alignment;
|
|
if (rightToLeft)
|
|
{
|
|
alignment=DT_RIGHT|DT_RTLREADING;
|
|
}
|
|
else
|
|
{
|
|
alignment=DT_LEFT;
|
|
}
|
|
|
|
if (pos==-1)
|
|
CharUpperW(name);
|
|
|
|
int nameLen = lstrlenW(name);
|
|
int jtf_result = 0;
|
|
if (jtf_drawtext)
|
|
jtf_result=jtf_drawtext(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
|
|
|
|
if (!jtf_result)
|
|
DrawTextW(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX);
|
|
|
|
if (jtf_result != 2)
|
|
DrawTextW(hdcout,name,nameLen,&r,alignment|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX|DT_CALCRECT);
|
|
|
|
HBRUSH oldbrush=(HBRUSH)SelectObject(hdcout,useBrush);
|
|
HPEN oldpen=(HPEN)SelectObject(hdcout,GetStockObject(NULL_PEN));
|
|
if (rightToLeft)
|
|
Rectangle(hdcout, xpos, r.top, 1+(endp-r.right)+r.left, 1+ypos+fontHeight);
|
|
else
|
|
Rectangle(hdcout,r.right,r.top,1+endp,1+ypos+fontHeight);
|
|
if (!pos || pos == num_songs-1)
|
|
{
|
|
SelectObject(hdcout,normbrush);
|
|
if (!pos)
|
|
Rectangle(hdcout, left, 20, 1+right, 1+23);
|
|
if (pos == num_songs-1)
|
|
Rectangle(hdcout, left, ypos+fontHeight, 1+right, config_pe_height-38+1);
|
|
}
|
|
|
|
SelectObject(hdcout,oldfont);
|
|
SelectObject(hdcout,oldpen);
|
|
SelectObject(hdcout,oldbrush);
|
|
}
|
|
else
|
|
{
|
|
int x;
|
|
char str[10]="";
|
|
setSrcBM(fontBM);
|
|
do_palmode(hdcout);
|
|
if (time >= 0)
|
|
{
|
|
StringCchPrintfA(str,10,"%d:%02d",time/60,(time)%60);
|
|
num_chars -= lstrlenA(str)+1;
|
|
}
|
|
|
|
for (x = 0; x < num_chars && name[x]; x ++)
|
|
{
|
|
int c2=0,c=0;
|
|
wchar_t oc;
|
|
oc=name[x];
|
|
if (x==num_chars-1 && name[x+1]) oc=L'\1';
|
|
getXYfromChar(oc,&c,&c2);
|
|
BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
|
|
xpos += 5;
|
|
}
|
|
|
|
if (!name[x])
|
|
{
|
|
int c2=0,c=0;
|
|
getXYfromChar(L' ',&c,&c2);
|
|
if (time >= 0) num_chars++;
|
|
while (x++ < num_chars)
|
|
{
|
|
BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
|
|
xpos += 5;
|
|
}
|
|
}
|
|
|
|
if (time >= 0)
|
|
{
|
|
int c2=0,c=0;
|
|
getXYfromChar(' ',&c,&c2);
|
|
BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
|
|
xpos += 5;
|
|
if (pos < 0)
|
|
xpos = config_pe_width-29-5*lstrlenA(str);
|
|
else
|
|
xpos = config_pe_width-24-5*lstrlenA(str);
|
|
for (x = 0; str[x]; x ++)
|
|
{
|
|
getXYfromChar(str[x],&c,&c2);
|
|
BitBlt(hdcout,xpos,ypos,5,6,bmDC,c,c2,SRCCOPY);
|
|
xpos += 5;
|
|
}
|
|
}
|
|
|
|
if (xpos < config_pe_width-(pos<0?30:20))
|
|
{
|
|
int c2=0,c=0;
|
|
getXYfromChar(' ',&c,&c2);
|
|
BitBlt(hdcout,xpos,ypos,config_pe_width-(pos<0?30:20)-xpos,6,bmDC,c,c2,SRCCOPY);
|
|
}
|
|
|
|
unsetSrcBM();
|
|
}
|
|
}
|
|
|
|
void draw_pe_tbar(HWND hwnd, HDC hdc, int state)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
if (!disable_skin_borders)
|
|
{
|
|
WADrawDC hdcout(hdc, hwnd);
|
|
state = state?0:21;
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
if (config_pe_height != 14)
|
|
{
|
|
int nt;
|
|
int xp=0;
|
|
BitBlt(hdcout,xp,0,25,20,bmDC,0,state,SRCCOPY);
|
|
xp+=25;
|
|
nt = (config_pe_width - 25 - 25 - 100)/25;
|
|
if (nt)
|
|
{
|
|
if (nt&1)
|
|
{
|
|
BitBlt(hdcout,xp,0,12,20,bmDC,127,state,SRCCOPY);
|
|
xp+=12;
|
|
}
|
|
nt/=2;
|
|
while (nt-->0)
|
|
{
|
|
BitBlt(hdcout,xp,0,25,20,bmDC,127,state,SRCCOPY);
|
|
xp+=25;
|
|
}
|
|
}
|
|
|
|
BitBlt(hdcout,xp,0,100,20,bmDC,26,state,SRCCOPY);
|
|
xp+=100;
|
|
nt = (config_pe_width - 25 - 25 - 100)/25;
|
|
if (nt)
|
|
{
|
|
if (nt&1)
|
|
{
|
|
BitBlt(hdcout,xp,0,13,20,bmDC,127,state,SRCCOPY);
|
|
xp+=13;
|
|
}
|
|
nt/=2;
|
|
while (nt-->0)
|
|
{
|
|
BitBlt(hdcout,xp,0,25,20,bmDC,127,state,SRCCOPY);
|
|
xp+=25;
|
|
}
|
|
}
|
|
nt = (config_pe_width - 25 - 25 - 100)%25;
|
|
if (nt)
|
|
{
|
|
StretchBlt(hdcout,xp,0,nt,20,bmDC,127,state,25,20,SRCCOPY);
|
|
xp+=nt;
|
|
}
|
|
BitBlt(hdcout,xp,0,25,20,bmDC,153,state,SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
int xpos=0;
|
|
int n = (config_pe_width - 50)/25;
|
|
BitBlt(hdcout,xpos,0,25,14,bmDC,72,42,SRCCOPY);
|
|
xpos+=25;
|
|
n--;
|
|
while (n--)
|
|
{
|
|
BitBlt(hdcout,xpos,0,25,14,bmDC,72,57,SRCCOPY);
|
|
xpos+=25;
|
|
}
|
|
n = (config_pe_width - 50)%25;
|
|
if (n)
|
|
{
|
|
StretchBlt(hdcout,xpos,0,n,14,bmDC,72,57,24,14,SRCCOPY);
|
|
xpos+=n;
|
|
}
|
|
BitBlt(hdcout,xpos,0,50,14,bmDC,99,state?57:42,SRCCOPY);
|
|
}
|
|
unsetSrcBM();
|
|
|
|
if (config_pe_height == 14)
|
|
{
|
|
wchar_t ft[FILETITLE_SIZE] = {0};
|
|
int q=PlayList_getPosition();
|
|
if (q >= 0 && q < PlayList_getlength())
|
|
{
|
|
if (!g_has_deleted_current)
|
|
{
|
|
PlayList_getitem_pl(PlayList_getPosition(),ft);
|
|
q=PlayList_getsonglength(PlayList_getPosition());
|
|
}
|
|
else
|
|
{
|
|
StringCchCopyW(ft,FILETITLE_SIZE, FileTitle);
|
|
q=in_getlength();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
getStringW(IDS_PLEDIT_NOFILE_WSHADE,ft,FILETITLE_SIZE);
|
|
q=-1;
|
|
}
|
|
draw_pe_song(hdcout, -1,ft,q,state?0:2);
|
|
}
|
|
}
|
|
}
|
|
|
|
void draw_pe_timedisp(HDC hdc, int minutes, int seconds, int tlm, int clear)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
static int lastm, lasts, lastc=1,lasttlm;
|
|
int x=config_pe_width-94+8;
|
|
int y=config_pe_height-15;
|
|
if (!hPLWindow) return;
|
|
if (disable_skin_borders) return;
|
|
|
|
WADrawDC mainDC(hdc, hPLWindow);
|
|
if (minutes == -666) { minutes=lastm; seconds=lasts; clear=lastc; tlm=lasttlm; }
|
|
|
|
lastm=minutes; lasts=seconds; lastc=clear; lasttlm=tlm;
|
|
|
|
do_palmode(mainDC);
|
|
|
|
setSrcBM(fontBM);
|
|
if (clear)
|
|
{
|
|
BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+4,y,5,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4,y,5,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5,y,5,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5+4+4,y,5,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5+4+5+4,y,5,6,bmDC,142,0,SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
if (tlm)
|
|
{
|
|
if (minutes < 0) minutes=-minutes;
|
|
if (seconds < 0) seconds=-seconds;
|
|
if (!(minutes/100)) BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+((minutes/100)?0:4),y,3,6,bmDC,75,6,SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
if (!(minutes/100)) BitBlt(mainDC,x,y,4,6,bmDC,142,0,SRCCOPY);
|
|
BitBlt(mainDC,x+((minutes/100)?0:4),y,3,6,bmDC,142,0,SRCCOPY);
|
|
}
|
|
|
|
if (minutes/100) BitBlt(mainDC,x+4,y,5,6,bmDC,5*((minutes/100)%10),6,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4,y,5,6,bmDC,5*((minutes/10)%10),6,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5,y,5,6,bmDC,5*((minutes)%10),6,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5+4+4,y,5,6,bmDC,5*((seconds/10)%10),6,SRCCOPY);
|
|
BitBlt(mainDC,x+5+4+5+4+5+4,y,5,6,bmDC,5*((seconds)%10),6,SRCCOPY);
|
|
}
|
|
unsetSrcBM();
|
|
}
|
|
|
|
void draw_pe_tbutton(int b2, int b3, int b2_ws)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
if (disable_skin_borders) return;
|
|
{
|
|
WADrawDC hdcout(hPLWindow);
|
|
do_palmode(hdcout);
|
|
setSrcBM(plMainBM);
|
|
if (!b3)
|
|
BitBlt(hdcout,config_pe_width-11,3,9,9,bmDC,167,3,SRCCOPY);
|
|
else
|
|
BitBlt(hdcout,config_pe_width-11,3,9,9,bmDC,52,42,SRCCOPY);
|
|
if (!b2)
|
|
{
|
|
if (!b2_ws) BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,158,3,SRCCOPY);
|
|
else BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,128,45,SRCCOPY);
|
|
}
|
|
else
|
|
BitBlt(hdcout,config_pe_width-20,3,9,9,bmDC,b2_ws?150:62,42,SRCCOPY);
|
|
unsetSrcBM();
|
|
}
|
|
}
|
|
|
|
static bool IntersectY(int top1, int bottom1, int top2, int bottom2)
|
|
{
|
|
int top = MAX(top1, top2);
|
|
int bottom = MIN(bottom1, bottom2);
|
|
return top <= bottom;
|
|
}
|
|
|
|
static void draw_pl(HWND hwnd, HDC hdcout)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
do_palmode(hdcout);
|
|
draw_pe_tbar(hwnd, hdcout, GetForegroundWindow()==hwnd?1:(config_hilite?0:1));
|
|
setSrcBM(plMainBM);
|
|
if (config_pe_height != 14)
|
|
{
|
|
int y;
|
|
int yp=20;
|
|
y=(config_pe_height-20-38)/29;
|
|
while (y-->0)
|
|
{
|
|
BitBlt(hdcout,0,yp,12,29,bmDC,0,42,SRCCOPY);
|
|
BitBlt(hdcout,config_pe_width-20,yp,5,29,bmDC,31,42,SRCCOPY);
|
|
BitBlt(hdcout,config_pe_width-7,yp,7,29,bmDC,31+13,42,SRCCOPY);
|
|
yp += 29;
|
|
}
|
|
y=(config_pe_height-20-38)%29;
|
|
if (y)
|
|
{
|
|
StretchBlt(hdcout,0,yp,12,y,bmDC,0,42,12,29,SRCCOPY);
|
|
StretchBlt(hdcout,config_pe_width-20,yp,5,y,bmDC,31,42,5,29,SRCCOPY);
|
|
StretchBlt(hdcout,config_pe_width-7,yp,7,y,bmDC,31+13,42,7,29,SRCCOPY);
|
|
yp += y;
|
|
}
|
|
|
|
if (!disable_skin_borders)
|
|
{
|
|
BitBlt(hdcout,0,yp,125,38,bmDC,0,72,SRCCOPY);
|
|
int x=(config_pe_width-125-150)/25;
|
|
|
|
int xp=125, s=0;
|
|
if (x >= 3) { x-=3; s=1;}
|
|
while (x-->0)
|
|
{
|
|
BitBlt(hdcout,xp,yp,25,38,bmDC,179,0,SRCCOPY);
|
|
xp+=25;
|
|
}
|
|
x = (config_pe_width-125-150)%25;
|
|
if (x)
|
|
{
|
|
StretchBlt(hdcout,xp,yp,x,38,bmDC,179,0,25,38,SRCCOPY);
|
|
xp+=x;
|
|
}
|
|
if (s)
|
|
{
|
|
BitBlt(hdcout,xp,yp,75,38,bmDC,205,0,SRCCOPY);
|
|
xp+=75;
|
|
}
|
|
BitBlt(hdcout,xp,yp,150,38,bmDC,126,72,SRCCOPY);
|
|
}
|
|
}
|
|
unsetSrcBM();
|
|
}
|
|
|
|
static void draw_pl2(HWND hwnd, HDC hdc, RECT &r)
|
|
{
|
|
if (config_pe_height != 14)
|
|
{
|
|
{
|
|
int x,t;
|
|
int num_songs=(config_pe_height-38-20-2)/pe_fontheight;
|
|
if (pledit_disp_offs < 0) pledit_disp_offs=0;
|
|
t=PlayList_getlength()-pledit_disp_offs;
|
|
if (t < 1)
|
|
{
|
|
pledit_disp_offs=0;
|
|
t=PlayList_getlength();
|
|
}
|
|
if (t > num_songs) t = num_songs;
|
|
//LeaveCriticalSection(&g_mainwndcs);
|
|
for (x = 0; x < t; x ++)
|
|
{
|
|
int qt,b;
|
|
|
|
qt=22+x*pe_fontheight;
|
|
b=qt+pe_fontheight-1;
|
|
if (IntersectY(qt, b, r.top, r.bottom)
|
|
|| (x == t-1 && config_pe_height-38 >= r.top))
|
|
{
|
|
wchar_t ft[FILETITLE_SIZE] = {0};
|
|
PlayList_getitem_pl(x+pledit_disp_offs,ft);
|
|
|
|
extern int g_has_deleted_current;
|
|
// EnterCriticalSection(&g_mainwndcs);
|
|
draw_pe_song(hdc, x,ft,PlayList_getsonglength(x+pledit_disp_offs),(PlayList_getselect(x+pledit_disp_offs) ? 1 : 0) + ((!g_has_deleted_current && PlayList_getPosition() == x+pledit_disp_offs) ? 2 : 0));
|
|
//LeaveCriticalSection(&g_mainwndcs);
|
|
}
|
|
}
|
|
//EnterCriticalSection(&g_mainwndcs);
|
|
wchar_t blank[] = L" ";
|
|
for (; x < num_songs; x ++)
|
|
{
|
|
draw_pe_song(hdc, x,blank ,-1,0);
|
|
}
|
|
if (r.right > config_pe_width-18 )
|
|
{
|
|
draw_pe_vslide(hwnd, hdc, 0, pledit_disp_offs);
|
|
}
|
|
}
|
|
draw_pe_timedisp(hdc, -666,0,0,0);
|
|
{
|
|
wchar_t str[64]=L"", str2[32]=L"";
|
|
{
|
|
int /*x=0,*/v,t,p=0;
|
|
int seltime=0,st2=0,st1=0, ttime=0;
|
|
v = PlayList_getlength();
|
|
for (t = 0; t < v; t ++)
|
|
{
|
|
int a = PlayList_getsonglength(t);
|
|
if (PlayList_getselect(t))
|
|
{
|
|
p++;
|
|
if (a<0)
|
|
st2=2;
|
|
else seltime += a;
|
|
}
|
|
if (a<0) st1=1;
|
|
//else x += a;
|
|
if (a > 0) ttime += a;
|
|
}
|
|
if (!seltime && !st2) StringCchCopyW(str,64, L"0:00");
|
|
else if (seltime)
|
|
{
|
|
if (seltime < 60*60)
|
|
StringCchPrintfW(str, 64, L"%d:%02d",seltime/60,seltime%60);
|
|
else
|
|
StringCchPrintfW(str,64, L"%d:%02d:%02d",seltime/60/60,(seltime/60)%60,seltime%60);
|
|
if (st2) StringCchCatW(str,64,L"+");
|
|
} else if (st2) StringCchCatW(str,64,L"?");
|
|
|
|
if (!ttime && !st1) StringCchCopyW(str2,32, L"0:00");
|
|
else if (ttime)
|
|
{
|
|
if (ttime < 60*60)
|
|
StringCchPrintfW(str2,32, L"%d:%02d",ttime/60,ttime%60);
|
|
else
|
|
StringCchPrintfW(str2,32,L"%d:%02d:%02d",ttime/60/60,(ttime/60)%60,ttime%60);
|
|
if (st1) StringCchCatW(str2,32,L"+");
|
|
} else if (st1) StringCchCatW(str2,32,L"?");
|
|
}
|
|
StringCchCatW(str,64,L"/");
|
|
StringCchCatW(str,64,str2);
|
|
|
|
draw_pe_infostr(hdc, str);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void draw_paintDC_pe(HWND hwnd, HDC hdc, RECT &r)
|
|
{
|
|
draw_pl(hwnd, hdc);
|
|
}
|
|
|
|
void draw_printclient_pe(HWND hwnd, HDC hdc, LPARAM /*drawingOptions*/)
|
|
{
|
|
RECT r;
|
|
GetClientRect(hwnd,&r);
|
|
draw_paintDC_pe(hwnd, hdc, r);
|
|
draw_pl2(hwnd, hdc, r);
|
|
}
|
|
|
|
void draw_paint_pe(HWND hwnd)
|
|
{
|
|
if (!pe_init)
|
|
return;
|
|
PAINTSTRUCT ps;
|
|
RECT r;
|
|
HDC hdc=BeginPaint(hwnd,&ps);
|
|
EnterCriticalSection(&g_mainwndcs);
|
|
r=ps.rcPaint;
|
|
draw_paintDC_pe(hwnd, hdc, r);
|
|
WADrawDC windowDC(0, hwnd);
|
|
draw_pl2(hwnd, windowDC, r);
|
|
LeaveCriticalSection(&g_mainwndcs);
|
|
EndPaint(hwnd,&ps);
|
|
} |