Files
Work/nntp/THMBPAGE.CPP
2024-08-07 09:16:27 -04:00

200 lines
5.6 KiB
C++

#include <nntp/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)){mThumbNails.remove(mThumbNails.size()-1);return false;}
isDirty(true);
return true;
}
bool ThumbPage::insert(const String &strPathFileName)
{
mThumbNails.insert(&SmartPointer<ThumbNail>());
SmartPointer<ThumbNail> &ptrThumbNail=mThumbNails[mThumbNails.size()-1];
ptrThumbNail=::new ThumbNail();
ptrThumbNail.disposition(PointerDisposition::Delete);
if(!ptrThumbNail->setImage(strPathFileName)){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);
}
DWORD ThumbPage::memoryUsage(void)const
{
DWORD memUsage(0);
for(int index=0;index<mThumbNails.size();index++)memUsage+=((ThumbPage&)*this).mThumbNails[index]->memoryUsage();
return memUsage;
}
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;
if(!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);
}
mDIB24.setAtAsm(xyPoint.y(),xyPoint.x(),ptrThumbNail->getImage());
xyPoint.x(xyPoint.x()+ptrThumbNail->width()+Separator);
}
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(!gdiPoint.x())gdiPoint.x(xyPoint.x());
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;
}