1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00
planetblupi/button.cpp
2017-01-21 17:51:48 +01:00

427 lines
7.3 KiB
C++

// Button.cpp
//
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <ddraw.h>
#include "def.h"
#include "pixmap.h"
#include "sound.h"
#include "decor.h"
#include "button.h"
#include "misc.h"
/////////////////////////////////////////////////////////////////////////////
// Constructeur.
CButton::CButton()
{
m_type = 0;
m_bEnable = TRUE;
m_bHide = FALSE;
m_state = 0;
m_mouseState = 0;
m_nbMenu = 0;
m_nbToolTips = 0;
m_selMenu = 0;
m_bMouseDown = FALSE;
m_bMinimizeRedraw = FALSE;
m_bRedraw = FALSE;
}
// Destructeur.
CButton::~CButton()
{
}
// Crée un nouveau bouton.
BOOL CButton::Create(HWND hWnd, CPixmap *pPixmap, CSound *pSound,
POINT pos, int type, BOOL bMinimizeRedraw,
int *pMenu, int nbMenu,
int *pToolTips, int nbToolTips,
int region, UINT message)
{
POINT iconDim;
int i, icon;
static int ttypes[] =
{
DIMBUTTONX,DIMBUTTONY, // button00.bmp
};
if ( type < 0 || type > 0 ) return FALSE;
iconDim.x = ttypes[type*2+0];
iconDim.y = ttypes[type*2+1];
m_hWnd = hWnd;
m_pPixmap = pPixmap;
m_pSound = pSound;
m_type = type;
m_bMinimizeRedraw = bMinimizeRedraw;
m_bEnable = TRUE;
m_bHide = FALSE;
m_message = message;
m_pos = pos;
m_dim = iconDim;
m_nbMenu = nbMenu;
m_nbToolTips = nbToolTips;
m_selMenu = 0;
m_state = 0;
m_mouseState = 0;
m_bMouseDown = FALSE;
m_bRedraw = TRUE;
for ( i=0 ; i<nbMenu ; i++ )
{
icon = pMenu[i];
if ( region == 1 ) // palmiers ?
{
if ( icon == 0 ) icon = 90; // sol normal
if ( icon == 1 ) icon = 91; // sol inflammable
if ( icon == 2 ) icon = 92; // sol inculte
if ( icon == 7 ) icon = 9; // plante
if ( icon == 8 ) icon = 10; // arbre
}
if ( region == 2 ) // hiver ?
{
if ( icon == 0 ) icon = 96; // sol normal
if ( icon == 1 ) icon = 97; // sol inflammable
if ( icon == 2 ) icon = 98; // sol inculte
if ( icon == 8 ) icon = 99; // arbre
}
if ( region == 3 ) // sapin ?
{
if ( icon == 0 ) icon = 102; // sol normal
if ( icon == 1 ) icon = 103; // sol inflammable
if ( icon == 2 ) icon = 104; // sol inculte
if ( icon == 8 ) icon = 105; // arbre
}
m_iconMenu[i] = icon;
}
for ( i=0 ; i<nbToolTips ; i++ )
{
m_toolTips[i] = pToolTips[i];
}
return TRUE;
}
// Dessine un bouton dans son état.
void CButton::Draw()
{
int i;
POINT pos;
RECT rect;
if ( m_bMinimizeRedraw && !m_bRedraw ) return;
m_bRedraw = FALSE;
if ( m_bHide ) // bouton caché ?
{
rect.left = m_pos.x;
rect.right = m_pos.x+m_dim.x;
rect.top = m_pos.y;
rect.bottom = m_pos.y+m_dim.y;
m_pPixmap->DrawPart(-1, CHBACK, m_pos, rect, 1); // dessine le fond
return;
}
if ( m_bEnable ) // bouton actif ?
{
m_pPixmap->DrawIcon(-1, CHBUTTON+m_type, m_mouseState, m_pos);
}
else
{
m_pPixmap->DrawIcon(-1, CHBUTTON+m_type, 4, m_pos);
}
if ( m_nbMenu == 0 ) return;
pos = m_pos;
if ( m_nbMenu > 0 )
{
m_pPixmap->DrawIcon(-1, CHBUTTON+m_type,
m_iconMenu[m_selMenu]+6, pos);
}
if ( m_nbMenu == 1 || !m_bEnable || !m_bMouseDown ) return;
pos = m_pos;
pos.x += m_dim.x+2;
for ( i=0 ; i<m_nbMenu ; i++ )
{
m_pPixmap->DrawIcon(-1, CHBUTTON+m_type, i==m_selMenu?1:0, pos);
m_pPixmap->DrawIcon(-1, CHBUTTON+m_type, m_iconMenu[i]+6, pos);
pos.x += m_dim.x-1;
}
}
void CButton::Redraw()
{
m_bRedraw = TRUE;
}
int CButton::GetState()
{
return m_state;
}
void CButton::SetState(int state)
{
if ( m_state != state ||
m_mouseState != state )
{
m_bRedraw = TRUE;
}
m_state = state;
m_mouseState = state;
}
int CButton::GetMenu()
{
return m_selMenu;
}
void CButton::SetMenu(int menu)
{
if ( m_selMenu != menu )
{
m_bRedraw = TRUE;
}
m_selMenu = menu;
}
BOOL CButton::GetEnable()
{
return m_bEnable;
}
void CButton::SetEnable(BOOL bEnable)
{
if ( m_bEnable != bEnable )
{
m_bRedraw = TRUE;
}
m_bEnable = bEnable;
}
BOOL CButton::GetHide()
{
return m_bHide;
}
void CButton::SetHide(BOOL bHide)
{
if ( m_bHide != bHide )
{
m_bRedraw = TRUE;
}
m_bHide = bHide;
}
// Traitement d'un événement.
BOOL CButton::TreatEvent(UINT message, WPARAM wParam, LPARAM lParam)
{
POINT pos;
if ( m_bHide || !m_bEnable ) return FALSE;
pos = ConvLongToPos(lParam);
switch( message )
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
if ( MouseDown(pos) ) return TRUE;
break;
case WM_MOUSEMOVE:
if ( MouseMove(pos) ) return TRUE;
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
if ( MouseUp(pos) ) return FALSE; // (*)
break;
}
return FALSE;
}
// (*) Tous les boutons doivent recevoir l'événement BUTTONUP !
// Indique si la souris est sur ce bouton.
BOOL CButton::MouseOnButton(POINT pos)
{
return Detect(pos);
}
// Retourne le tooltips pour un bouton, en fonction
// de la position de la souris.
int CButton::GetToolTips(POINT pos)
{
int width = m_dim.x;
int rank;
if ( m_bHide || !m_bEnable ) return -1;
if ( m_nbMenu > 1 && m_bMouseDown ) // sous-menu déroulé ?
{
width += 2+(m_dim.x-1)*m_nbMenu;
}
if ( pos.x < m_pos.x ||
pos.x > m_pos.x+width ||
pos.y < m_pos.y ||
pos.y > m_pos.y+m_dim.y ) return -1;
rank = (pos.x-(m_pos.x+2+1))/(m_dim.x-1);
if ( rank < 0 ) rank = 0;
if ( rank > m_nbToolTips ) return -1;
if ( m_nbMenu > 1 )
{
if ( m_bMouseDown && rank > 0 )
{
rank --;
}
else
{
rank = m_selMenu;
}
}
return m_toolTips[rank];
}
// Détecte si la souris est dans le bouton.
BOOL CButton::Detect(POINT pos)
{
int width = m_dim.x;
if ( m_bHide || !m_bEnable ) return FALSE;
if ( m_nbMenu > 1 && m_bMouseDown ) // sous-menu déroulé ?
{
width += 2+(m_dim.x-1)*m_nbMenu;
}
if ( pos.x < m_pos.x ||
pos.x > m_pos.x+width ||
pos.y < m_pos.y ||
pos.y > m_pos.y+m_dim.y ) return FALSE;
return TRUE;
}
// Bouton de la souris pressé.
BOOL CButton::MouseDown(POINT pos)
{
if ( !Detect(pos) ) return FALSE;
m_mouseState = 1;
m_bMouseDown = TRUE;
m_bRedraw = TRUE;
PostMessage(m_hWnd, WM_UPDATE, 0, 0);
m_pSound->PlayImage(SOUND_CLICK, pos);
return TRUE;
}
// Souris déplacés.
BOOL CButton::MouseMove(POINT pos)
{
BOOL bDetect;
int iState, iMenu;
iState = m_mouseState;
iMenu = m_selMenu;
bDetect = Detect(pos);
if ( m_bMouseDown )
{
if ( bDetect ) m_mouseState = 1; // pressé
else m_mouseState = m_state;
}
else
{
if ( bDetect ) m_mouseState = m_state+2; // survollé
else m_mouseState = m_state;
}
if ( m_nbMenu > 1 &&
m_bMouseDown &&
pos.x > m_pos.x+m_dim.x+2 ) // dans sous-menu ?
{
m_selMenu = (pos.x-(m_pos.x+m_dim.x+2))/(m_dim.x-1);
if ( m_selMenu >= m_nbMenu )
{
m_selMenu = m_nbMenu-1;
}
}
if ( iState != m_mouseState ||
iMenu != m_selMenu )
{
m_bRedraw = TRUE;
PostMessage(m_hWnd, WM_UPDATE, 0, 0);
}
return m_bMouseDown;
}
// Bouton de la souris relâché.
BOOL CButton::MouseUp(POINT pos)
{
BOOL bDetect;
bDetect = Detect(pos);
m_mouseState = m_state;
m_bMouseDown = FALSE;
m_bRedraw = TRUE;
if ( !bDetect ) return FALSE;
if ( m_message != -1 )
{
PostMessage(m_hWnd, m_message, 0, 0);
}
return TRUE;
}