Files
Work/browse/thmbpage.cpp
2024-08-07 09:12:07 -04:00

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;
}