188 lines
5.3 KiB
C++
188 lines
5.3 KiB
C++
#include <browse/thmbpage.hpp>
|
|
#include <common/guiwnd.hpp>
|
|
|
|
bool ThumbPage::insert(const String &strPathFileName,PureDevice &pureDevice)
|
|
{
|
|
mThumbNails.insert(&SmartPointer<ThumbNail>());
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[mThumbNails.size()-1];
|
|
ptrThumbNail=::new ThumbNail();
|
|
ptrThumbNail.disposition(PointerDisposition::Delete);
|
|
if(!ptrThumbNail->setImage(strPathFileName,pureDevice)){mThumbNails.remove(mThumbNails.size()-1);return false;}
|
|
isDirty(true);
|
|
return true;
|
|
}
|
|
|
|
bool ThumbPage::insert(PakEntry &pakEntry,PureDevice &pureDevice)
|
|
{
|
|
mThumbNails.insert(&SmartPointer<ThumbNail>());
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[mThumbNails.size()-1];
|
|
ptrThumbNail=::new ThumbNail;
|
|
ptrThumbNail.disposition(PointerDisposition::Delete);
|
|
// if(!ptrThumbNail->setImage(pakEntry,pureDevice)){mThumbNails.remove(mThumbNails.size()-1);return false;}
|
|
if(!ptrThumbNail->setImage(pakEntry)){mThumbNails.remove(mThumbNails.size()-1);return false;}
|
|
isDirty(true);
|
|
return true;
|
|
}
|
|
|
|
void ThumbPage::remove(const String &strPathFileName)
|
|
{
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
if(mThumbNails[index]->pathFileName()==strPathFileName)
|
|
{
|
|
mThumbNails.remove(index);
|
|
index=-1;
|
|
}
|
|
}
|
|
isDirty(true);
|
|
}
|
|
|
|
void ThumbPage::draw(GUIWindow &guiWindow)
|
|
{
|
|
PureDevice pureDevice(guiWindow);
|
|
if(mDIB24.isOkay())mDIB24.draw(pureDevice,Rect(0,0,guiWindow.width(),guiWindow.height()),Point(0,0));
|
|
}
|
|
|
|
void ThumbPage::draw(PureDevice &pureDevice,const Rect &dstRect,const Point &srcPoint)
|
|
{
|
|
if(mDIB24.isOkay())mDIB24.draw(pureDevice,dstRect,srcPoint);
|
|
}
|
|
|
|
void ThumbPage::update(GUIWindow &guiWindow)
|
|
{
|
|
if(!isDirty())return;
|
|
createBitmap(guiWindow);
|
|
}
|
|
|
|
bool ThumbPage::createBitmap(GUIWindow &guiWindow)
|
|
{
|
|
PureDevice pureDevice(guiWindow);
|
|
GDIPoint gdiPoint;
|
|
|
|
if(!mThumbNails.size()||!guiWindow.isValid())return false;
|
|
if(!getDimensions(guiWindow,gdiPoint))return false;
|
|
mDIB24.create(gdiPoint.x(),-gdiPoint.y(),pureDevice);
|
|
mDIB24.setBits(BkColorBits);
|
|
drawThumbNails(guiWindow);
|
|
isDirty(false);
|
|
return mDIB24.isOkay();
|
|
}
|
|
|
|
bool ThumbPage::drawThumbNails(GUIWindow &guiWindow)
|
|
{
|
|
Point xyPoint;
|
|
String strString;
|
|
DWORD elapsedTime;
|
|
|
|
if(!guiWindow.isValid()||!mThumbNails.size())return false;
|
|
elapsedTime=::GetTickCount();
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[index];
|
|
if(xyPoint.x()+ptrThumbNail->width()>=guiWindow.width())
|
|
{
|
|
xyPoint.x(0);
|
|
xyPoint.y(xyPoint.y()+ptrThumbNail->height()+Separator);
|
|
}
|
|
mDIB24.setAt(xyPoint.y(),xyPoint.x(),ptrThumbNail->getImage());
|
|
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
|
|
}
|
|
::sprintf(strString,"drawThumbNails took %d seconds\n",(::GetTickCount()-elapsedTime)/1000);
|
|
::OutputDebugString(strString);
|
|
return true;
|
|
}
|
|
|
|
bool ThumbPage::drawThumbNails(PureDevice &pureDevice,GUIWindow &guiWindow)
|
|
{
|
|
Point xyPoint;
|
|
|
|
if(!pureDevice.isOkay()||!guiWindow.isValid()||!mThumbNails.size())return false;
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[index];
|
|
if(xyPoint.x()+ptrThumbNail->width()>=guiWindow.width())
|
|
{
|
|
xyPoint.x(0);
|
|
xyPoint.y(xyPoint.y()+ptrThumbNail->height()+Separator);
|
|
}
|
|
ptrThumbNail->draw(pureDevice,xyPoint);
|
|
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
DWORD ThumbPage::rowItems(GUIWindow &guiWindow)const
|
|
{
|
|
Point xyPoint;
|
|
DWORD rowItems;
|
|
|
|
rowItems=0;
|
|
if(!guiWindow.isValid()||!mThumbNails.size())return rowItems;
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
SmartPointer<ThumbNail> &ptrThumbNail=((Block<SmartPointer<ThumbNail> >&)mThumbNails)[index];
|
|
if(xyPoint.x()+ptrThumbNail->width()>=guiWindow.width())
|
|
{
|
|
if(!rowItems)rowItems=index+1;
|
|
xyPoint.x(0);
|
|
xyPoint.y(xyPoint.y()+ptrThumbNail->height()+Separator);
|
|
}
|
|
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
|
|
}
|
|
if(!rowItems)rowItems=mThumbNails.size();
|
|
return rowItems;
|
|
}
|
|
|
|
int ThumbPage::getDimensions(GUIWindow &guiWindow,GDIPoint &gdiPoint)
|
|
{
|
|
Point xyPoint;
|
|
|
|
gdiPoint=GDIPoint();
|
|
rowItems(0);
|
|
if(!guiWindow.isValid()||!mThumbNails.size())return rowItems();
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[index];
|
|
if(xyPoint.x()+ptrThumbNail->width()>=guiWindow.width())
|
|
{
|
|
if(!rowItems())
|
|
{
|
|
rowItems(index+1);
|
|
gdiPoint.x(xyPoint.x());
|
|
}
|
|
xyPoint.x(0);
|
|
xyPoint.y(xyPoint.y()+ptrThumbNail->height()+Separator);
|
|
}
|
|
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
|
|
}
|
|
gdiPoint.y(xyPoint.y()+mThumbNails[index-1]->height()+Separator);
|
|
if(!rowItems())rowItems(mThumbNails.size());
|
|
return rowItems();
|
|
}
|
|
|
|
bool ThumbPage::hitTest(GUIWindow &guiWindow,const Point &clickPoint,String &strPathFileName)
|
|
{
|
|
Point xyPoint;
|
|
if(!isOkay())return false;
|
|
|
|
for(int index=0;index<mThumbNails.size();index++)
|
|
{
|
|
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[index];
|
|
if(xyPoint.x()+ptrThumbNail->width()>=guiWindow.width())
|
|
{
|
|
xyPoint.x(0);
|
|
xyPoint.y(xyPoint.y()+ptrThumbNail->height()+Separator);
|
|
}
|
|
Rect rgnRect(xyPoint.x(),xyPoint.y(),xyPoint.x()+ptrThumbNail->width(),xyPoint.y()+ptrThumbNail->height());
|
|
if(rgnRect.ptInRect(clickPoint))
|
|
{
|
|
strPathFileName=ptrThumbNail->pathFileName();
|
|
return true;
|
|
}
|
|
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|