diff options
Diffstat (limited to 'common/selcolor.cpp')
-rw-r--r-- | common/selcolor.cpp | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/common/selcolor.cpp b/common/selcolor.cpp new file mode 100644 index 0000000..f3eb039 --- /dev/null +++ b/common/selcolor.cpp @@ -0,0 +1,264 @@ +/* + * 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. + */ + +#include <fctsys.h> +#include <common.h> +#include <colors.h> + +#include <wx/statline.h> + + +enum colors_id { + ID_COLOR_BLACK = 2000 // ID_COLOR_ = ID_COLOR_BLACK a ID_COLOR_BLACK + 31 +}; + + +class WinEDA_SelColorFrame : public wxDialog +{ +public: + WinEDA_SelColorFrame( wxWindow* parent, + const wxPoint& framepos, int OldColor ); + ~WinEDA_SelColorFrame() {}; + +private: + void Init_Dialog( int aOldColor ); + void OnCancel( wxCommandEvent& event ); + void SelColor( wxCommandEvent& event ); + + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE( WinEDA_SelColorFrame, wxDialog ) + EVT_BUTTON( wxID_CANCEL, WinEDA_SelColorFrame::OnCancel ) + EVT_COMMAND_RANGE( ID_COLOR_BLACK, ID_COLOR_BLACK + 31, + wxEVT_COMMAND_BUTTON_CLICKED, + WinEDA_SelColorFrame::SelColor ) +END_EVENT_TABLE() + + +EDA_COLOR_T DisplayColorFrame( wxWindow* parent, int OldColor ) +{ + wxPoint framepos; + EDA_COLOR_T color; + + wxGetMousePosition( &framepos.x, &framepos.y ); + + WinEDA_SelColorFrame* frame = new WinEDA_SelColorFrame( parent, + framepos, OldColor ); + color = static_cast<EDA_COLOR_T>( frame->ShowModal() ); + frame->Destroy(); + if( color > NBCOLORS ) + color = UNSPECIFIED_COLOR; + return color; +} + + +WinEDA_SelColorFrame::WinEDA_SelColorFrame( wxWindow* parent, + const wxPoint& framepos, + int OldColor ) : + wxDialog( parent, -1, _( "Colors" ), framepos, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ) +{ + + Init_Dialog( OldColor ); + // Resize the dialog + GetSizer()->SetSizeHints( this ); + + // Ensure the whole frame is visible, whenever the asked position. + // Moreover with a work station having dual monitors, the asked position can be relative to a monitor + // and this frame can be displayed on the other monitor, with an "out of screen" position. + // Give also a small margin. + int margin = 10; + wxPoint windowPosition = GetPosition(); + if( framepos != wxDefaultPosition ) + { + if( windowPosition.x < margin ) + windowPosition.x = margin; + // Under MACOS, a vertical margin >= 20 is needed by the system menubar + int v_margin = std::max(20, margin); + if( windowPosition.y < v_margin ) + windowPosition.y = v_margin; + if( windowPosition != framepos ) + SetPosition(windowPosition); + } + wxPoint endCornerPosition = GetPosition(); + endCornerPosition.x += GetSize().x + margin; + endCornerPosition.y += GetSize().y + margin; + + windowPosition = GetPosition(); + wxRect freeScreenArea( wxGetClientDisplayRect( ) ); + + if( freeScreenArea.GetRight() < endCornerPosition.x ) + { + windowPosition.x += freeScreenArea.GetRight() - endCornerPosition.x; + + if( windowPosition.x < freeScreenArea.x ) + windowPosition.x = freeScreenArea.x; + + // Sligly modify the vertical position to avoid the mouse to be + // exactly on the upper side of the window + windowPosition.y +=5; + endCornerPosition.y += 5; + } + + if( freeScreenArea.GetBottom() < endCornerPosition.y ) + { + windowPosition.y += freeScreenArea.GetBottom() - endCornerPosition.y; + + if( windowPosition.y < freeScreenArea.y ) + windowPosition.y = freeScreenArea.y; + } + + SetPosition(windowPosition); +} + +void WinEDA_SelColorFrame::Init_Dialog( int aOldColor ) +{ + wxBoxSizer* OuterBoxSizer = NULL; + wxBoxSizer* MainBoxSizer = NULL; + wxFlexGridSizer* FlexColumnBoxSizer = NULL; + wxBitmapButton* BitmapButton = NULL; + wxStaticLine* Line = NULL; + wxStdDialogButtonSizer* StdDialogButtonSizer = NULL; + wxButton* Button = NULL; + + int ii, butt_ID; + int w = 20, h = 20; + bool ColorFound = false; + + SetReturnCode( -1 ); + + OuterBoxSizer = new wxBoxSizer( wxVERTICAL ); + SetSizer( OuterBoxSizer ); + + MainBoxSizer = new wxBoxSizer( wxHORIZONTAL ); + OuterBoxSizer->Add( MainBoxSizer, 1, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); + + for( ii = 0; ii < NBCOLORS; ++ii ) + { + // Provide a separate column for every six buttons (and their + // associated text strings), so provide a FlexGrid Sizer with + // eight 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 ii = 0; ii < 6; ii++ ) + { + FlexColumnBoxSizer->AddGrowableRow( ii ); + } + + // Specify that the second column can also be expanded. + FlexColumnBoxSizer->AddGrowableCol( 1 ); + + MainBoxSizer->Add( FlexColumnBoxSizer, 1, wxGROW | wxTOP, 5 ); + } + + butt_ID = ID_COLOR_BLACK + ii; + wxMemoryDC iconDC; + wxBitmap ButtBitmap( w, h ); + wxBrush brush; + + iconDC.SelectObject( ButtBitmap ); + + EDA_COLOR_T buttcolor = g_ColorRefs[ii].m_Numcolor; + + iconDC.SetPen( *wxBLACK_PEN ); + ColorSetBrush( &brush, buttcolor ); + brush.SetStyle( wxBRUSHSTYLE_SOLID ); + + iconDC.SetBrush( brush ); + iconDC.SetBackground( *wxGREY_BRUSH ); + iconDC.Clear(); + iconDC.DrawRoundedRectangle( 0, 0, w, h, (double) h / 3 ); + + 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( aOldColor == buttcolor ) + { + ColorFound = true; + BitmapButton->SetFocus(); + } + + wxStaticText* label = new wxStaticText( this, -1, + wxGetTranslation( ColorGetName( buttcolor ) ), + 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). + + Line = new wxStaticLine( this, -1, wxDefaultPosition, + wxDefaultSize, wxLI_HORIZONTAL ); + OuterBoxSizer->Add( Line, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); + + StdDialogButtonSizer = new wxStdDialogButtonSizer; + OuterBoxSizer->Add( StdDialogButtonSizer, 0, wxGROW | wxALL, 10 ); + + Button = new wxButton( this, wxID_CANCEL, _( "Cancel" ), wxDefaultPosition, + wxDefaultSize, 0 ); + StdDialogButtonSizer->AddButton( Button ); + + 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( !ColorFound ) + Button->SetFocus(); +} + +void WinEDA_SelColorFrame::OnCancel( wxCommandEvent& WXUNUSED( event ) ) +{ + // Setting the return value to -1 indicates that the + // dialog box has been canceled (and thus that the + // previously selected color is to be retained). + EndModal( -1 ); +} + + +void WinEDA_SelColorFrame::SelColor( wxCommandEvent& event ) +{ + int id = event.GetId(); + + EndModal( id - ID_COLOR_BLACK ); +} |