3
* $Id: iconoimagenctrl.cpp 3066 2010-12-21 10:10:14Z carlos $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
14
//#define _GINKGO_TRACE
15
#include "iconoimagenctrl.h"
17
#include <wx/gdicmn.h>
20
#include <wx/colour.h>
21
#include <wx/settings.h>
22
#include <wx/string.h>
25
#include <wx/dcclient.h>
26
#include <wx/dcscreen.h>
33
#define DIMENSION_NORMAL 32
34
#define DIMENSION_AJUSTADO 24
35
#define DIMENSION_IMAGEN 16
37
IconoImagenCtrl::IconoImagenCtrl(wxWindow* pPadre, const wxImage& icono, const wxString toolTip,bool hasMenu,bool ajustado) : wxPanel(pPadre)
39
Inicializar(icono,toolTip,hasMenu,ajustado);
42
IconoImagenCtrl::IconoImagenCtrl(wxWindow* pPadre, const wxBitmap& icono, const wxString toolTip, bool hasMenu,bool ajustado) : wxPanel(pPadre)
44
Inicializar(icono.ConvertToImage(),toolTip,hasMenu,ajustado);
47
void IconoImagenCtrl::Inicializar(const wxImage& icono, const wxString toolTip, bool hasMenu,bool ajustado)
49
m_texto = wxEmptyString;
53
m_dimension=DIMENSION_NORMAL;
55
m_dimension = DIMENSION_AJUSTADO;
57
m_ColorFondo = GetParent()->GetBackgroundColour();
58
m_ColorLineaSeleccion = wxColour(255, 255, 255, 255);
59
m_ColorLineaNormal = wxColour(128, 128, 128, 255);
60
m_ColorFondoSeleccionado = wxColour(128, 128, 128, 255);
61
this->SetToolTip(toolTip);
63
this->SetSize(m_dimension,m_dimension);
64
this->SetMinSize(wxSize(m_dimension,m_dimension));
69
m_MouseDownMenu = false;
73
this->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
74
this->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
75
this->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
76
this->Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
77
this->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
78
this->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
79
this->Connect( wxEVT_MOTION, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
80
this->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
81
this->Connect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
82
this->Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
83
this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
84
this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
85
this->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
86
this->Connect( wxEVT_PAINT, wxPaintEventHandler( IconoImagenCtrl::OnPaint ) );
89
IconoImagenCtrl::~IconoImagenCtrl(){
91
this->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
92
this->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
93
this->Disconnect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
94
this->Disconnect( wxEVT_MIDDLE_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
95
this->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
96
this->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
97
this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
98
this->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
99
this->Disconnect( wxEVT_MIDDLE_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
100
this->Disconnect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
101
this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
102
this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
103
this->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( IconoImagenCtrl::OnMouseEvents ) );
104
this->Disconnect( wxEVT_PAINT, wxPaintEventHandler( IconoImagenCtrl::OnPaint ) );
107
void IconoImagenCtrl::SetIcono(const wxImage &icono)
112
double scaleX = ((double) DIMENSION_IMAGEN)/((double) icono.GetWidth());
113
double scaleY = ((double) DIMENSION_IMAGEN)/((double) icono.GetHeight());
115
if (scaleX != 1.0 || scaleY != 1.0)
117
double scale = wxMin(scaleX, scaleY);
118
int newWidth = (int) (scale * icono.GetWidth());
119
int newHeight = (int) (scale * icono.GetHeight());
120
wxImage iconoReescalado = icono.Scale(newWidth, newHeight,wxIMAGE_QUALITY_HIGH);
121
m_bitmap = wxBitmap(iconoReescalado);
122
iconoReescalado = icono.ConvertToGreyscale();
123
m_disabled_bitmap = wxBitmap(iconoReescalado);
126
m_bitmap = wxBitmap(icono);
127
wxImage iconoGris = icono.ConvertToGreyscale();
128
m_disabled_bitmap = wxBitmap(iconoGris);
134
void IconoImagenCtrl::SetCheck(bool check)
142
bool IconoImagenCtrl::IsChecked()
147
void IconoImagenCtrl::SetNumero(int numero)
149
if(numero<100 && numero>=0){
150
std::ostringstream ostr;
152
m_texto = wxString::FromUTF8(ostr.str().c_str());
154
m_texto =wxEmptyString;
158
//esto sirve para que se comporte como el disabled pero sigue pillando eventos
159
void IconoImagenCtrl::SetIcoActivado(bool activar)
161
if(m_activado!=activar) {
162
m_activado = activar;
163
wxRect rect = GetRect();
164
this->GetParent()->Refresh(false,&rect);
168
bool IconoImagenCtrl::EstaActivado()
173
bool IconoImagenCtrl::Enable(bool enable)
175
bool vuelta = wxPanel::Enable(enable);
176
wxRect rect = GetRect();
177
this->GetParent()->Refresh(false,&rect);
181
// Dibuja manualmente el fondo seleccionado
182
void IconoImagenCtrl::OnPaint(wxPaintEvent& evt)
185
const int coordImagen = (m_dimension - DIMENSION_IMAGEN) / 2;
186
if (m_MouseDown && m_isEnabled && m_enabled) {
187
dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
188
dc.SetPen(wxPen(m_ColorFondoSeleccionado, 1, wxSOLID));
189
dc.DrawBitmap(m_bitmap,coordImagen,coordImagen);
190
} else if (!m_isEnabled || !m_activado) {
191
dc.DrawBitmap(m_disabled_bitmap,coordImagen,coordImagen);
193
dc.DrawBitmap(m_bitmap,coordImagen,coordImagen);
196
if(m_texto!=wxEmptyString)
199
colorTexto.Set(255,255,255);
201
colorFondo.Set(209,215,255);
203
colorLinea.Set(209,209,209);
205
dc.SetPen(wxPen(colorLinea, 1, wxSOLID));
208
dc.SetBrush(wxBrush(colorFondo,wxSOLID));
209
dc.DrawCircle(dc.GetSize().x-12, 8, 7);
211
if(m_texto.size()==1) {
212
dc.SetFont(wxFont(8,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_LIGHT));
213
dc.SetPen(wxPen(colorTexto, 1, wxSOLID));
214
dc.DrawText(m_texto,dc.GetSize().x - 15,1);
216
dc.SetFont(wxFont(7,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_LIGHT));
217
dc.SetPen(wxPen(colorTexto, 1, wxSOLID));
218
dc.DrawText(m_texto,dc.GetSize().x - 17,2);
222
//no se permite menu para las ajustadas
223
if(!m_hasMenu || m_dimension == DIMENSION_AJUSTADO) {
224
if (m_check || m_MouseDown || m_MouseDownMenu) {
225
dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
226
dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
228
dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
229
dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
231
dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
233
dc.SetBrush(wxBrush(m_ColorFondo,wxTRANSPARENT));
236
dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
237
dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
239
} else if (m_MouseDown) {
240
dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
241
dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
242
dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
244
} else if (m_MouseDownMenu) {
245
dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
246
dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
247
dc.SetPen(wxPen(m_ColorLineaSeleccion, 1, wxSOLID));
250
dc.SetPen(wxPen(m_ColorLineaNormal, 1, wxSOLID));
251
dc.DrawRoundedRectangle(wxRect(wxPoint(2, 2), wxPoint(dc.GetSize().x - 3, dc.GetSize().y - 3)), 5);
257
dc.DrawLine(wxPoint(20, 20),wxPoint(20, dc.GetSize().y - 1));
258
dc.DrawLine(wxPoint(20, 20),wxPoint(dc.GetSize().x - 1, 20));
260
dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxSOLID));
262
lista[0] = wxPoint(22, 23);
263
lista[1] = wxPoint(26, 30);
264
lista[2] = wxPoint(29, 23);
266
dc.DrawPolygon(3, lista);
274
// Manejador de eventos de ratón
275
void IconoImagenCtrl::OnMouseEvents(wxMouseEvent& evt) {
276
if (evt.LeftDown()) {
278
if(evt.GetPosition().x >20 && evt.GetPosition().y >20) {
279
m_MouseDownMenu = true;
288
else if (evt.LeftUp()) {
290
if(m_MouseDown || m_MouseDownMenu) {
295
e.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED);
296
} else if(m_MouseDownMenu){
297
m_MouseDownMenu = false;
298
e.SetEventType(wxEVT_CONTEXT_MENU);
301
e.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED);
305
this->ProcessEvent(e);
308
else if (evt.Leaving() && (m_MouseDown || m_MouseDownMenu)) {
310
m_MouseDownMenu = false;