Serious-Engine/Sources/Modeler/TextureComboBox.cpp
2016-03-11 18:20:51 -06:00

135 lines
3.8 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
// TextureComboBox.cpp : implementation file
//
#include "stdafx.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTextureComboBox
CTextureComboBox::CTextureComboBox()
{
m_ptdSelectedTexture = NULL;
}
CTextureComboBox::~CTextureComboBox()
{
}
BEGIN_MESSAGE_MAP(CTextureComboBox, CComboBox)
//{{AFX_MSG_MAP(CTextureComboBox)
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTextureComboBox message handlers
BOOL CTextureComboBox::OnIdle(LONG lCount)
{
CModelerView *pModelerView = CModelerView::GetActiveMappingNormalView();
// if document doesn't exist
if( pModelerView == NULL)
{
// document closed but we had texture on last idle
if( m_ptdSelectedTexture != NULL)
{
ResetContent();
AddString( L"None available");
SetCurSel( 0);
m_ptdSelectedTexture = NULL;
}
return TRUE;
}
CModelerDoc *pDoc = (CModelerDoc *) pModelerView->GetDocument();
INDEX ctTextures = pDoc->m_emEditModel.edm_WorkingSkins.Count();
// if count of textures changed or model has different texture, reflect change
if( (GetCount() != ctTextures) || (pModelerView->m_ptdiTextureDataInfo->tdi_TextureData != m_ptdSelectedTexture) )
{
if( ctTextures == 0)
{
ResetContent();
AddString( L"None available");
SetCurSel( 0);
m_ptdSelectedTexture = NULL;
return TRUE;
}
// remove combo entries, add working textures and select current one
m_ptdSelectedTexture = pModelerView->m_ptdiTextureDataInfo->tdi_TextureData;
ResetContent();
INDEX iTexture=0;
FOREACHINLIST( CTextureDataInfo, tdi_ListNode, pDoc->m_emEditModel.edm_WorkingSkins, it)
{
int iAddedAs = AddString( CString(it->tdi_FileName.FileName()));
SetItemDataPtr( iAddedAs, &it.Current());
if( pModelerView->m_ptdiTextureDataInfo == &it.Current())
{
SetCurSel( iTexture);
}
iTexture++;
}
}
return TRUE;
}
void CTextureComboBox::OnSelchange()
{
CModelerView *pModelerView = CModelerView::GetActiveView();
if(pModelerView != NULL)
{
// get curently selected combo member
int iSelectedTexture = GetCurSel();
// if there is valid member selected
if( iSelectedTexture != CB_ERR)
{
// set new texture ptr for active view
pModelerView->m_ptdiTextureDataInfo = (CTextureDataInfo *) GetItemDataPtr( iSelectedTexture);
pModelerView->Invalidate( FALSE);
}
}
}
void CTextureComboBox::OnDropdown()
{
INDEX ctItems = GetCount();
if( ctItems == CB_ERR) return;
CRect rectCombo;
GetWindowRect( &rectCombo);
PIX pixScreenHeight = ::GetSystemMetrics(SM_CYSCREEN);
PIX pixMaxHeight = pixScreenHeight - rectCombo.top;
CWnd *pwndParent = GetParent();
if( pwndParent == NULL) return;
pwndParent->ScreenToClient( &rectCombo);
PIX pixNewHeight = GetItemHeight(0)*(ctItems+2);
rectCombo.bottom = rectCombo.top + ClampUp( pixNewHeight, pixMaxHeight);
MoveWindow( rectCombo);
}