kicad/common/selcolor.cpp

206 lines
6.7 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2014 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/* Dialog for selecting color from the palette of available colors.
*/
// LEGACY TODO: obsolete once legacy canvas removed
#include <fctsys.h>
#include <common.h>
#include <gal/color4d.h>
#include <wx/statline.h>
#include <algorithm>
using KIGFX::COLOR4D;
enum colors_id {
ID_COLOR_BLACK = 2000 // colors_id = ID_COLOR_BLACK a ID_COLOR_BLACK + NBCOLORS-1
};
class CHOOSE_COLOR_DLG : public wxDialog
{
public:
CHOOSE_COLOR_DLG( wxWindow* aParent, COLOR4D aOldColor );
~CHOOSE_COLOR_DLG() {};
COLOR4D GetSelectedColor() { return m_color; }
private:
void init_Dialog();
void selColor( wxCommandEvent& event );
COLOR4D m_color;
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE( CHOOSE_COLOR_DLG, wxDialog )
EVT_COMMAND_RANGE( ID_COLOR_BLACK, ID_COLOR_BLACK + NBCOLORS,
wxEVT_COMMAND_BUTTON_CLICKED,
CHOOSE_COLOR_DLG::selColor )
END_EVENT_TABLE()
COLOR4D DisplayColorFrame( wxWindow* aParent, COLOR4D aOldColor )
{
CHOOSE_COLOR_DLG dlg( aParent, aOldColor );
if( dlg.ShowModal() == wxID_OK )
{
return dlg.GetSelectedColor();
}
return COLOR4D::UNSPECIFIED;
}
CHOOSE_COLOR_DLG::CHOOSE_COLOR_DLG( wxWindow* aParent, COLOR4D aOldColor ) :
wxDialog( aParent, wxID_ANY, _( "Colors" ), wxDefaultPosition, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
{
m_color = aOldColor;
init_Dialog();
// Resize the dialog
GetSizer()->SetSizeHints( this );
Centre();
}
void CHOOSE_COLOR_DLG::init_Dialog()
{
wxFlexGridSizer* FlexColumnBoxSizer = NULL;
wxBitmapButton* focusedButton = NULL;
const int w = 20, h = 20;
wxBoxSizer* OuterBoxSizer = new wxBoxSizer( wxVERTICAL );
SetSizer( OuterBoxSizer );
wxBoxSizer*MainBoxSizer = new wxBoxSizer( wxHORIZONTAL );
OuterBoxSizer->Add( MainBoxSizer, 1, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
for( int ii = 0; ii < NBCOLORS; ++ii )
{
// Provide a separate column for every six buttons (and their
// associated text strings), so provide a FlexGrid Sizer with
// six rows and two columns.
if( ii % 6 == 0 )
{
FlexColumnBoxSizer = new wxFlexGridSizer( 6, 2, 0, 0 );
// Specify that all of the rows can be expanded.
for( int kk = 0; kk < 6; kk++ )
{
FlexColumnBoxSizer->AddGrowableRow( kk );
}
// Specify that the second column can also be expanded.
FlexColumnBoxSizer->AddGrowableCol( 1 );
MainBoxSizer->Add( FlexColumnBoxSizer, 1, wxGROW | wxTOP, 5 );
}
int butt_ID = ID_COLOR_BLACK + ii;
wxMemoryDC iconDC;
wxBitmap ButtBitmap( w, h );
wxBrush brush;
iconDC.SelectObject( ButtBitmap );
COLOR4D buttcolor = COLOR4D( g_ColorRefs[ii].m_Numcolor );
iconDC.SetPen( *wxBLACK_PEN );
brush.SetColour( buttcolor.ToColour() );
brush.SetStyle( wxBRUSHSTYLE_SOLID );
iconDC.SetBrush( brush );
iconDC.SetBackground( *wxGREY_BRUSH );
iconDC.Clear();
iconDC.DrawRoundedRectangle( 0, 0, w, h, (double) h / 3 );
wxBitmapButton* bitmapButton = new wxBitmapButton( this, butt_ID, ButtBitmap,
wxDefaultPosition, wxSize( w+8, h+6 ) );
FlexColumnBoxSizer->Add( bitmapButton, 0,
wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
wxLEFT | wxBOTTOM, 5 );
// Set focus to this button if its color matches the
// color which had been selected previously (for
// whichever layer's color is currently being edited).
if( m_color == buttcolor )
focusedButton = bitmapButton;
EDA_COLOR_T edaColor = ColorFindNearest( buttcolor.ToColour() );
wxStaticText* label = new wxStaticText( this, -1, wxGetTranslation( ColorGetName( edaColor ) ),
wxDefaultPosition, wxDefaultSize, 0 );
FlexColumnBoxSizer->Add( label, 1,
wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
wxLEFT | wxRIGHT | wxBOTTOM, 5 );
}
// Provide a Cancel button as well, so that this dialog
// box can also be canceled by pressing the Esc key
// (and also provide a horizontal static line to separate
// that button from all of the other buttons).
wxStaticLine* sline = new wxStaticLine( this, -1, wxDefaultPosition,
wxDefaultSize, wxLI_HORIZONTAL );
OuterBoxSizer->Add( sline, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 );
wxStdDialogButtonSizer* stdDialogButtonSizer = new wxStdDialogButtonSizer;
OuterBoxSizer->Add( stdDialogButtonSizer, 0, wxGROW | wxALL, 10 );
wxButton* cancelButton = new wxButton( this, wxID_CANCEL, _( "Cancel" ),
wxDefaultPosition, wxDefaultSize, 0 );
stdDialogButtonSizer->AddButton( cancelButton );
stdDialogButtonSizer->Realize();
// Set focus to the Cancel button if the currently selected color
// does not match any of the colors provided by this dialog box.
// (That shouldn't ever happen in practice though.)
if( focusedButton )
focusedButton->SetFocus();
else
cancelButton->SetFocus();
}
void CHOOSE_COLOR_DLG::selColor( wxCommandEvent& event )
{
int id = event.GetId();
m_color = EDA_COLOR_T( id - ID_COLOR_BLACK );
// Close the dialog by calling the default dialog handler for a wxID_OK event
event.SetId( wxID_OK );
event.Skip();
}