Initial
This commit is contained in:
187
browse/thmbpage.cpp
Normal file
187
browse/thmbpage.cpp
Normal file
@@ -0,0 +1,187 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user