mirror of
https://github.com/leozide/leocad
synced 2024-11-17 07:47:55 +01:00
268 lines
5.9 KiB
C++
268 lines
5.9 KiB
C++
|
// SelDlg.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "leocad.h"
|
||
|
#include "SelDlg.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
#define LC_SELDLG_CAMERAS 0x01
|
||
|
#define LC_SELDLG_GROUPS 0x02
|
||
|
#define LC_SELDLG_LIGHTS 0x04
|
||
|
#define LC_SELDLG_PIECES 0x08
|
||
|
#define LC_SELDLG_KEY "Settings"
|
||
|
#define LC_SELDLG_KEY_NAME "Selection Dialog"
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSelectDlg dialog
|
||
|
|
||
|
int SelectDlgCompare(const void* elem1, const void* elem2)
|
||
|
{
|
||
|
LC_SEL_DATA* a = (LC_SEL_DATA*)elem1;
|
||
|
LC_SEL_DATA* b = (LC_SEL_DATA*)elem2;
|
||
|
|
||
|
if (a->type == b->type)
|
||
|
return strcmp(a->name, b->name);
|
||
|
else
|
||
|
return a->type - b->type;
|
||
|
}
|
||
|
|
||
|
CSelectDlg::CSelectDlg(void* pData, CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CSelectDlg::IDD, pParent)
|
||
|
{
|
||
|
m_pData = (LC_SEL_DATA*)pData;
|
||
|
|
||
|
int count = 0;
|
||
|
for (LC_SEL_DATA* p = m_pData; p->pointer != NULL; p++)
|
||
|
count++;
|
||
|
|
||
|
qsort(m_pData, count, sizeof(LC_SEL_DATA), SelectDlgCompare);
|
||
|
|
||
|
//{{AFX_DATA_INIT(CSelectDlg)
|
||
|
m_bCameras = TRUE;
|
||
|
m_bGroups = TRUE;
|
||
|
m_bLights = TRUE;
|
||
|
m_bPieces = TRUE;
|
||
|
//}}AFX_DATA_INIT
|
||
|
}
|
||
|
|
||
|
|
||
|
void CSelectDlg::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CSelectDlg)
|
||
|
DDX_Control(pDX, IDC_SELDLG_LIST, m_List);
|
||
|
DDX_Check(pDX, IDC_SELDLG_CAMERAS, m_bCameras);
|
||
|
DDX_Check(pDX, IDC_SELDLG_GROUPS, m_bGroups);
|
||
|
DDX_Check(pDX, IDC_SELDLG_LIGHTS, m_bLights);
|
||
|
DDX_Check(pDX, IDC_SELDLG_PIECES, m_bPieces);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CSelectDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CSelectDlg)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_ALL, OnSeldlgAll)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_NONE, OnSeldlgNone)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_INVERT, OnSeldlgInvert)
|
||
|
ON_LBN_SELCHANGE(IDC_SELDLG_LIST, OnSelChange)
|
||
|
//}}AFX_MSG_MAP
|
||
|
ON_BN_CLICKED(IDC_SELDLG_CAMERAS, OnSeldlgToggle)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_GROUPS, OnSeldlgToggle)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_LIGHTS, OnSeldlgToggle)
|
||
|
ON_BN_CLICKED(IDC_SELDLG_PIECES, OnSeldlgToggle)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSelectDlg message handlers
|
||
|
|
||
|
BOOL CSelectDlg::OnInitDialog()
|
||
|
{
|
||
|
UINT u = theApp.GetProfileInt(LC_SELDLG_KEY, LC_SELDLG_KEY_NAME,
|
||
|
LC_SELDLG_CAMERAS|LC_SELDLG_GROUPS|LC_SELDLG_LIGHTS|LC_SELDLG_PIECES);
|
||
|
|
||
|
m_bCameras = (u & LC_SELDLG_CAMERAS) != 0;
|
||
|
m_bGroups = (u & LC_SELDLG_GROUPS) != 0;
|
||
|
m_bLights = (u & LC_SELDLG_LIGHTS) != 0;
|
||
|
m_bPieces = (u & LC_SELDLG_PIECES) != 0;
|
||
|
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
UpdateList(TRUE);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnSeldlgAll()
|
||
|
{
|
||
|
m_List.SetRedraw(FALSE);
|
||
|
|
||
|
for (int i = 0; i < m_List.GetCount(); i++)
|
||
|
{
|
||
|
m_List.SetSel(i);
|
||
|
((LC_SEL_DATA*)m_List.GetItemDataPtr(i))->selected = true;
|
||
|
}
|
||
|
|
||
|
m_List.SetRedraw(TRUE);
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnSeldlgNone()
|
||
|
{
|
||
|
m_List.SetRedraw(FALSE);
|
||
|
|
||
|
for (int i = 0; i < m_List.GetCount(); i++)
|
||
|
{
|
||
|
m_List.SetSel(i, FALSE);
|
||
|
((LC_SEL_DATA*)m_List.GetItemDataPtr(i))->selected = false;
|
||
|
}
|
||
|
|
||
|
m_List.SetRedraw(TRUE);
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnSeldlgInvert()
|
||
|
{
|
||
|
m_List.SetRedraw(FALSE);
|
||
|
|
||
|
for (int i = 0; i < m_List.GetCount(); i++)
|
||
|
{
|
||
|
m_List.SetSel(i, !m_List.GetSel(i));
|
||
|
((LC_SEL_DATA*)m_List.GetItemDataPtr(i))->selected = (m_List.GetSel(i) != 0);
|
||
|
}
|
||
|
|
||
|
m_List.SetRedraw(TRUE);
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnOK()
|
||
|
{
|
||
|
UINT u = 0;
|
||
|
UpdateData(TRUE);
|
||
|
if (m_bCameras) u |= LC_SELDLG_CAMERAS;
|
||
|
if (m_bGroups) u |= LC_SELDLG_GROUPS;
|
||
|
if (m_bLights) u |= LC_SELDLG_LIGHTS;
|
||
|
if (m_bPieces) u |= LC_SELDLG_PIECES;
|
||
|
theApp.WriteProfileInt(LC_SELDLG_KEY, LC_SELDLG_KEY_NAME, u);
|
||
|
|
||
|
CDialog::OnOK();
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnSeldlgToggle()
|
||
|
{
|
||
|
UpdateList(FALSE);
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::UpdateList(BOOL bFirst)
|
||
|
{
|
||
|
BOOL bPieces = m_bPieces;
|
||
|
BOOL bCameras = m_bCameras;
|
||
|
BOOL bLights = m_bLights;
|
||
|
BOOL bGroups = m_bGroups;
|
||
|
UpdateData(TRUE);
|
||
|
int i, idx;
|
||
|
|
||
|
m_List.SetRedraw(FALSE);
|
||
|
|
||
|
if ((m_bPieces != bPieces) || bFirst)
|
||
|
{
|
||
|
if (m_bPieces)
|
||
|
{
|
||
|
for (i = 0; m_pData[i].pointer != NULL; i++)
|
||
|
if (m_pData[i].type == LC_SELDLG_PIECE)
|
||
|
{
|
||
|
idx = m_List.AddString(m_pData[i].name);
|
||
|
m_List.SetItemDataPtr(idx, &m_pData[i]);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for (idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
if (((LC_SEL_DATA*)m_List.GetItemDataPtr(idx))->type == LC_SELDLG_PIECE)
|
||
|
{
|
||
|
m_List.DeleteString(idx);
|
||
|
idx--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ((m_bCameras != bCameras) || bFirst)
|
||
|
{
|
||
|
if (m_bCameras)
|
||
|
{
|
||
|
for (i = 0; m_pData[i].pointer != NULL; i++)
|
||
|
if (m_pData[i].type == LC_SELDLG_CAMERA)
|
||
|
{
|
||
|
idx = m_List.AddString(m_pData[i].name);
|
||
|
m_List.SetItemDataPtr(idx, &m_pData[i]);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for (idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
if (((LC_SEL_DATA*)m_List.GetItemDataPtr(idx))->type == LC_SELDLG_CAMERA)
|
||
|
{
|
||
|
m_List.DeleteString(idx);
|
||
|
idx--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ((m_bLights != bLights) || bFirst)
|
||
|
{
|
||
|
if (m_bLights)
|
||
|
{
|
||
|
for (i = 0; m_pData[i].pointer != NULL; i++)
|
||
|
if (m_pData[i].type == LC_SELDLG_LIGHT)
|
||
|
{
|
||
|
idx = m_List.AddString(m_pData[i].name);
|
||
|
m_List.SetItemDataPtr(idx, &m_pData[i]);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for (idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
if (((LC_SEL_DATA*)m_List.GetItemDataPtr(idx))->type == LC_SELDLG_LIGHT)
|
||
|
{
|
||
|
m_List.DeleteString(idx);
|
||
|
idx--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ((m_bGroups != bGroups) || bFirst)
|
||
|
{
|
||
|
if (m_bGroups)
|
||
|
{
|
||
|
for (i = 0; m_pData[i].pointer != NULL; i++)
|
||
|
if (m_pData[i].type == LC_SELDLG_GROUP)
|
||
|
{
|
||
|
idx = m_List.AddString(m_pData[i].name);
|
||
|
m_List.SetItemDataPtr(idx, &m_pData[i]);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for (idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
if (((LC_SEL_DATA*)m_List.GetItemDataPtr(idx))->type == LC_SELDLG_GROUP)
|
||
|
{
|
||
|
m_List.DeleteString(idx);
|
||
|
idx--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
m_List.SetSel(idx, ((LC_SEL_DATA*)m_List.GetItemData(idx))->selected);
|
||
|
|
||
|
m_List.SetRedraw(TRUE);
|
||
|
}
|
||
|
|
||
|
void CSelectDlg::OnSelChange()
|
||
|
{
|
||
|
for (int idx = 0; idx < m_List.GetCount(); idx++)
|
||
|
((LC_SEL_DATA*)m_List.GetItemDataPtr(idx))->selected = (m_List.GetSel(idx) != 0);
|
||
|
}
|