// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "SpriteEdit.h"
#include "SpriteEditDoc.h"
#include "SpriteEditView.h"
#include "SpriteProp.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_SPRITE_ANIMATE, OnSpriteAnimate)
ON_COMMAND(ID_BUTTON_NEXT_FRAME, OnButtonNextFrame)
ON_COMMAND(ID_BUTTON_PREV_FRAME, OnButtonPrevFrame)
ON_COMMAND(ID_SPRITE_COLLISIONRECT, OnSpriteCollisionrect)
ON_COMMAND(ID_SPRITE_LOADRECT, OnSpriteLoadrect)
ON_COMMAND(ID_SPRITE_ATTACHPOINTS, OnSpriteAttachpoints)
ON_COMMAND(ID_SPRITE_LOADBITMAP, OnSpriteLoadbitmap)
ON_COMMAND(ID_SPRITE_ADDFRAME, OnSpriteAddframe)
ON_COMMAND(ID_SPRITE_ADDATTACHPOINT, OnSpriteAddattachpoint)
ON_COMMAND(ID_SPRITE_DELETEFRAME, OnSpriteDeleteframe)
ON_COMMAND(ID_SPRITE_DELETEATTACHPOINT, OnSpriteDeleteattachpoint)
ON_COMMAND(ID_SPRITE_PROPERTIES, OnSpriteProperties)
ON_COMMAND(ID_NEXT_SPRITE, OnNextSprite)
ON_COMMAND(ID_PREV_SPRITE, OnPrevSprite)
ON_COMMAND(ID_SPRITE_NEWSPRITE, OnSpriteNewsprite)
ON_COMMAND(ID_SPRITE_DELETESPRITE, OnSpriteDeletesprite)
ON_UPDATE_COMMAND_UI(ID_SPRITE_ADDFRAME, OnUpdateSpriteAddframe)
ON_UPDATE_COMMAND_UI(ID_SPRITE_ADDATTACHPOINT, OnUpdateSpriteAddattachpoint)
ON_UPDATE_COMMAND_UI(ID_SPRITE_DELETESPRITE, OnUpdateSpriteDeletesprite)
ON_UPDATE_COMMAND_UI(ID_SPRITE_DELETEATTACHPOINT, OnUpdateSpriteDeleteattachpoint)
ON_UPDATE_COMMAND_UI(ID_SPRITE_DELETEFRAME, OnUpdateSpriteDeleteframe)
ON_COMMAND(ID_SPRITE_BLACKRECTS, OnSpriteBlackrects)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_bitmapFileName="foo.bmp";
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//EnableDocking(CBRS_ALIGN_ANY);
//DockControlBar(&m_wndToolBar);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSpriteAnimate()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( view->m_isAnimate )
{
view->m_isAnimate=0;
GetMenu()->CheckMenuItem(ID_SPRITE_ANIMATE, MF_UNCHECKED);
}
else
{
view->m_isAnimate=1;
GetMenu()->CheckMenuItem(ID_SPRITE_ANIMATE, MF_CHECKED);
}
}
void CMainFrame::OnButtonNextFrame()
{
CSpriteEditView *view;
short state;
view=(CSpriteEditView *)GetActiveView();
state=GetAsyncKeyState(VK_SHIFT);
if ( state & 0x8000 ) // high bit set
{
TRACE(" high bit set\n");
view->m_bitmapIndex++;
if ( view->m_bitmapIndex >= view->m_numBitmaps )
view->m_bitmapIndex=0;
view->Invalidate();
}
else
{
if ( view->m_isAnimate )
OnSpriteAnimate(); // stop animation
gb_sprite->IncrementSprite(view->m_spriteIndex, 1);
view->Invalidate();
}
}
void CMainFrame::OnButtonPrevFrame()
{
CSpriteEditView *view;
short state;
view=(CSpriteEditView *)GetActiveView();
state=GetAsyncKeyState(VK_SHIFT);
TRACE("[OnButtonNextFrame] state = %u\n", state);
if ( state & 0x8000 ) // high bit set
{
view->m_bitmapIndex--;
if ( view->m_bitmapIndex < 0 )
view->m_bitmapIndex=view->m_numBitmaps - 1;
view->Invalidate();
}
else
{
if ( view->m_isAnimate )
OnSpriteAnimate(); // stop animation
gb_sprite->IncrementSprite(view->m_spriteIndex, -1);
view->Invalidate();
}
}
void CMainFrame::OnSpriteCollisionrect()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( view->m_isShowCollision )
{
view->m_isShowCollision=0;
GetMenu()->CheckMenuItem(ID_SPRITE_COLLISIONRECT, MF_UNCHECKED);
view->Invalidate();
}
else
{
view->m_isShowCollision=1;
GetMenu()->CheckMenuItem(ID_SPRITE_COLLISIONRECT, MF_CHECKED);
view->Invalidate(FALSE);
}
}
void CMainFrame::OnSpriteLoadrect()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( view->m_isShowLoadRect )
{
view->m_isShowLoadRect=0;
GetMenu()->CheckMenuItem(ID_SPRITE_LOADRECT, MF_UNCHECKED);
}
else
{
view->m_isShowLoadRect=1;
GetMenu()->CheckMenuItem(ID_SPRITE_LOADRECT, MF_CHECKED);
}
view->Invalidate(FALSE);
}
void CMainFrame::OnSpriteAttachpoints()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( view->m_isShowAttach )
{
view->m_isShowAttach=0;
GetMenu()->CheckMenuItem(ID_SPRITE_ATTACHPOINTS, MF_UNCHECKED);
}
else
{
view->m_isShowAttach=1;
GetMenu()->CheckMenuItem(ID_SPRITE_ATTACHPOINTS, MF_CHECKED);
}
view->Invalidate(FALSE);
}
void CMainFrame::OnSpriteLoadbitmap()
{
// open, def extension, filename, flags, filter
CString path;
path.Format("%s\\data\\%s", ((CSpriteEditDoc *)GetActiveDocument())->m_exePath, (LPCSTR )m_bitmapFileName);
CFileDialog fdiag(TRUE, NULL, path, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST, NULL);
if ( fdiag.DoModal() == IDOK )
{
gsdxBitmap_t *bitmap;
CSpriteEditView *view;
CString msg;
m_bitmapFileName=fdiag.GetFileName();
bitmap=gb_DX.LoadBitmap(m_bitmapFileName, NULL);
if ( bitmap )
{
view=(CSpriteEditView *)GetActiveView();
view->m_numBitmaps++;
delete bitmap; // the main one is still in the master list
msg.Format("%s loaded OK", m_bitmapFileName);
MessageBox(msg, "Load bitmap");
}
else
{
msg.Format("Error loading %s", m_bitmapFileName);
MessageBox(msg, "Load bitmap", MB_ICONEXCLAMATION);
}
UpdateData(FALSE);
}
}
void CMainFrame::OnSpriteAddframe()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
gb_sprite->AddFrame(view->m_spriteIndex, gb_DX.GetBaseBitmapName(view->m_bitmapIndex));
GetMenu()->EnableMenuItem(ID_SPRITE_DELETEFRAME, MF_ENABLED);
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
void CMainFrame::OnSpriteAddattachpoint()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
gb_sprite->AddAttachPoint(view->m_spriteIndex);
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
void CMainFrame::OnSpriteDeleteframe()
{
CSpriteEditView *view;
if ( MessageBox("Delete this Frame?", "Delete Frame", MB_ICONEXCLAMATION|MB_YESNO) == IDYES )
{
view=(CSpriteEditView *)GetActiveView();
gb_sprite->DeleteSpriteFrame(view->m_spriteIndex);
if ( gb_sprite->GetNumFrames(view->m_spriteIndex) < 1 )
GetMenu()->EnableMenuItem(ID_SPRITE_DELETEFRAME, MF_GRAYED);
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
}
void CMainFrame::OnSpriteDeleteattachpoint()
{
CSpriteEditView *view;
if ( MessageBox("Delete last Attach Point?", "Delete Attach Point", MB_ICONEXCLAMATION|MB_YESNO) == IDYES )
{
view=(CSpriteEditView *)GetActiveView();
gb_sprite->DeleteLastAttach(view->m_spriteIndex);
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
}
void CMainFrame::OnSpriteProperties()
{
CSpriteProp diag;
CSpriteEditView *view;
RECT *r;
gsdxBitmap_t *bitmap;
spriteFrameEdit_t *frame;
int d_bottom, d_top, d_left, d_right;
view=(CSpriteEditView *)GetActiveView();
diag.m_ID=gb_sprite->GetID(view->m_spriteIndex);
diag.m_bmpName=gb_DX.GetBaseBitmapName(view->m_bitmapIndex);
r=gb_sprite->GetCollisionRect(view->m_spriteIndex);
diag.m_collisionBottom=r->bottom;
diag.m_collisionTop=r->top;
diag.m_collisionLeft=r->left;
diag.m_collisionRight=r->right;
diag.m_delay=gb_sprite->GetDelay(view->m_spriteIndex);
diag.m_dx=gb_sprite->GetDX(view->m_spriteIndex);
diag.m_dy=gb_sprite->GetDY(view->m_spriteIndex);
r=gb_sprite->GetVisibleLoadRect(view->m_spriteIndex);
diag.m_loadBottom=r->bottom;
diag.m_loadTop=r->top;
diag.m_loadLeft=r->left;
diag.m_loadRight=r->right;
diag.m_cycleType=gb_sprite->GetChangeMode(view->m_spriteIndex);
diag.m_attachPoints=gb_sprite->GetAttachPoints(view->m_spriteIndex);
diag.m_numAttach=gb_sprite->GetNumAttachPoints(view->m_spriteIndex);
diag.m_numFrames=gb_sprite->GetNumFrames(view->m_spriteIndex);
diag.m_currentFrame=gb_sprite->GetCurrentFrameNum(view->m_spriteIndex) + 1;
if ( diag.DoModal() == IDOK )
{
gb_sprite->SetID(view->m_spriteIndex, diag.m_ID);
r=gb_sprite->GetCollisionRect(view->m_spriteIndex);
r->bottom=diag.m_collisionBottom;
r->top=diag.m_collisionTop;
r->left=diag.m_collisionLeft;
r->right=diag.m_collisionRight;
gb_sprite->SetDelay(view->m_spriteIndex, diag.m_delay);
gb_sprite->SetDX(view->m_spriteIndex, diag.m_dx);
gb_sprite->SetDY(view->m_spriteIndex, diag.m_dy);
r=gb_sprite->GetVisibleLoadRect(view->m_spriteIndex);
d_bottom=r->bottom - diag.m_loadBottom;
r->bottom=diag.m_loadBottom;
d_top=r->top - diag.m_loadTop;
r->top=diag.m_loadTop;
d_left=r->left - diag.m_loadLeft;
r->left=diag.m_loadLeft;
d_right=r->right - diag.m_loadRight;
r->right=diag.m_loadRight;
r=gb_sprite->GetLoadRect(view->m_spriteIndex);
r->bottom-=d_bottom;
r->top-=d_top;
r->left-=d_left;
r->right-=d_right;
frame=gb_sprite->GetCurrentFrame(view->m_spriteIndex);
bitmap=frame->bitmap;
bitmap->bmRect.left=r->left;
bitmap->bmRect.right=r->right;
bitmap->bmRect.top=r->top;
bitmap->bmRect.bottom=r->bottom;
gb_sprite->SetChangeMode(view->m_spriteIndex, diag.m_cycleType);
view->SetScrollLimits();
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
}
void CMainFrame::OnNextSprite()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
view->m_spriteIndex++;
if ( view->m_spriteIndex >= gb_sprite->GetNumSprites() )
view->m_spriteIndex=0;
view->Invalidate();
}
void CMainFrame::OnPrevSprite()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
view->m_spriteIndex--;
if ( view->m_spriteIndex < 0 )
view->m_spriteIndex=gb_sprite->GetNumSprites() - 1;
view->Invalidate();
}
void CMainFrame::OnSpriteNewsprite()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
gb_sprite->AddSprite(gb_DX.GetBaseBitmapName(view->m_bitmapIndex));
view->m_spriteIndex=gb_sprite->GetNumSprites() - 1;
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
void CMainFrame::OnSpriteDeletesprite()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( MessageBox("Delete this Sprite (ALL frames)?", "Delete Sprite", MB_ICONEXCLAMATION|MB_YESNO) == IDYES )
{
gb_sprite->DeleteSprite(view->m_spriteIndex);
if ( view->m_spriteIndex >= gb_sprite->GetNumSprites() )
{
if ( view->m_spriteIndex )
view->m_spriteIndex--;
}
view->Invalidate();
view->GetDocument()->SetModifiedFlag();
}
}
void CMainFrame::OnUpdateSpriteAddframe(CCmdUI* pCmdUI)
{
if ( gb_sprite->GetNumSprites() < 1 )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable();
}
void CMainFrame::OnUpdateSpriteAddattachpoint(CCmdUI* pCmdUI)
{
if ( gb_sprite->GetNumSprites() < 1 )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable();
}
void CMainFrame::OnUpdateSpriteDeletesprite(CCmdUI* pCmdUI)
{
if ( gb_sprite->GetNumSprites() < 1 )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable();
}
void CMainFrame::OnUpdateSpriteDeleteattachpoint(CCmdUI* pCmdUI)
{
if ( gb_sprite->GetNumSprites() < 1 )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable();
}
void CMainFrame::OnUpdateSpriteDeleteframe(CCmdUI* pCmdUI)
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( gb_sprite->GetNumSprites() < 1 )
pCmdUI->Enable(FALSE);
else
{
if ( gb_sprite->GetNumFrames(view->m_spriteIndex) < 1 )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable();
}
}
void CMainFrame::OnSpriteBlackrects()
{
CSpriteEditView *view;
view=(CSpriteEditView *)GetActiveView();
if ( view->m_rectColour )
{
view->m_rectColour=0;
GetMenu()->CheckMenuItem(ID_SPRITE_BLACKRECTS, MF_UNCHECKED);
view->Invalidate();
}
else
{
view->m_rectColour=RGB(255, 255, 255);
GetMenu()->CheckMenuItem(ID_SPRITE_BLACKRECTS, MF_CHECKED);
view->Invalidate(FALSE);
}
}