Commit 4da0bfc2 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

Eeschema: bitmap editor dialog: some enhancements

parent c42f1446
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -236,7 +236,7 @@ void BITMAP_BASE::Mirror( bool aVertically )
    if( m_image )
    {
        *m_image  = m_image->Mirror( not aVertically );
        *m_bitmap = wxBitmap( *m_image );
        RebuildBitmap();
    }
}

@@ -246,7 +246,7 @@ void BITMAP_BASE::Rotate( bool aRotateCCW )
    if( m_image )
    {
        *m_image  = m_image->Rotate90( aRotateCCW );
        *m_bitmap = wxBitmap( *m_image );
        RebuildBitmap();
    }
}

+82 −3
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ DIALOG_IMAGE_EDITOR::DIALOG_IMAGE_EDITOR( wxWindow* aParent, BITMAP_BASE* aItem
    : DIALOG_IMAGE_EDITOR_BASE( aParent )
{
    m_workingImage = new BITMAP_BASE( * aItem );
    m_lastImage = NULL;
    m_buttonUndoLast->Enable( false );
    wxString msg;
    msg.Printf( wxT("%f"), m_workingImage->m_Scale );
    m_textCtrlScale->SetValue( msg );;
@@ -53,28 +55,106 @@ DIALOG_IMAGE_EDITOR::DIALOG_IMAGE_EDITOR( wxWindow* aParent, BITMAP_BASE* aItem
    SetFocus();
}

void DIALOG_IMAGE_EDITOR::OnMirrorX_click( wxCommandEvent& event )
void DIALOG_IMAGE_EDITOR::OnUndoLastChange( wxCommandEvent& event )
{
    BITMAP_BASE * tmp = m_workingImage;
    m_workingImage = m_lastImage;
    delete tmp;
    m_buttonUndoLast->Enable( false );
    m_lastImage = NULL;
    m_panelDraw->Refresh();
}

void DIALOG_IMAGE_EDITOR::OnMirrorX_click( wxCommandEvent& event )
{
    delete m_lastImage;
    m_lastImage = new BITMAP_BASE( *  m_workingImage );
    m_buttonUndoLast->Enable( true );
    m_buttonUndoLast->Enable( true );
    m_workingImage->Mirror( true );
    m_panelDraw->Refresh();
}

void DIALOG_IMAGE_EDITOR::OnMirrorY_click( wxCommandEvent& event )
{
    delete m_lastImage;
    m_lastImage = new BITMAP_BASE( *  m_workingImage );
    m_buttonUndoLast->Enable( true );
    m_workingImage->Mirror( false );
    m_panelDraw->Refresh();
}

void DIALOG_IMAGE_EDITOR::OnRotateClick( wxCommandEvent& event )
{
    delete m_lastImage;
    m_lastImage = new BITMAP_BASE( *  m_workingImage );
    m_buttonUndoLast->Enable( true );
    m_workingImage->Rotate( false );
    m_panelDraw->Refresh();
}

void DIALOG_IMAGE_EDITOR::OnGreyScaleConvert( wxCommandEvent& event )
{
    delete m_lastImage;
    m_lastImage = new BITMAP_BASE( *  m_workingImage );
    m_buttonUndoLast->Enable( true );
    wxImage& image = *m_workingImage->GetImageData();
    image = image.ConvertToGreyscale();
    m_workingImage->RebuildBitmap();
    m_panelDraw->Refresh();
}

void DIALOG_IMAGE_EDITOR::OnHalfSize( wxCommandEvent& event )
{
    delete m_lastImage;
    m_lastImage = new BITMAP_BASE( *  m_workingImage );
    m_buttonUndoLast->Enable( true );
    wxSize psize = m_workingImage->GetSizePixels();
    wxImage& image = *m_workingImage->GetImageData();

    image = image.Scale(psize.x/2, psize.y/2, wxIMAGE_QUALITY_HIGH);
    m_workingImage->RebuildBitmap();
    m_panelDraw->Refresh();
}

/* Test params values correctness
 * Currently scale value must give an actual image
 * > MIN_SIZE pixels and < MAX_SIZE pixels
 */
bool DIALOG_IMAGE_EDITOR::CheckValues()
{
    #define MIN_SIZE 16
    #define MAX_SIZE 6000
    double tmp;
    wxString msg = m_textCtrlScale->GetValue();
    // Test number correctness
    if( ! msg.ToDouble( &tmp ) )
    {
        wxMessageBox( _("Incorrect scale number" ) );
        return false;
    }

    // Test value  correctness
    wxSize psize = m_workingImage->GetSizePixels();
    if ( (psize.x * tmp) < MIN_SIZE ||  (psize.y * tmp) < MIN_SIZE )
    {
        wxMessageBox( _("Scale is too small for this image" ) );
        return false;
    }
    if ( (psize.x * tmp) > MAX_SIZE ||  (psize.y * tmp) > MAX_SIZE )
    {
        wxMessageBox( _("Scale is too large for this image" ) );
        return false;
    }

    return true;
}

void DIALOG_IMAGE_EDITOR::OnOK_Button( wxCommandEvent& aEvent )
{
    if( CheckValues() )
        EndModal( wxID_OK );
    return;
}

void DIALOG_IMAGE_EDITOR::OnCancel_Button( wxCommandEvent& aEvent )
@@ -97,7 +177,6 @@ void DIALOG_IMAGE_EDITOR::TransfertToImage(BITMAP_BASE* aItem )
{
    wxString msg = m_textCtrlScale->GetValue();
    msg.ToDouble( &m_workingImage->m_Scale );
    m_textCtrlScale->SetValue( msg );
    aItem->ImportData( m_workingImage );
}
+268 −4

File changed.

Preview size limit exceeded, changes collapsed.

+7 −1
Original line number Diff line number Diff line
@@ -35,7 +35,9 @@
class DIALOG_IMAGE_EDITOR : public DIALOG_IMAGE_EDITOR_BASE
{
private:
    BITMAP_BASE*     m_workingImage;
    BITMAP_BASE*     m_workingImage;        // The copy of BITMAP_BASE to be edited
    BITMAP_BASE*     m_lastImage;           // the saved BITMAP_BASE before a new change.
                                            // Used to undo the last change

public:
    DIALOG_IMAGE_EDITOR( wxWindow* aParent, BITMAP_BASE* aItem );
@@ -51,12 +53,16 @@ public:
    void TransfertToImage( BITMAP_BASE* aItem );

private:
	void OnUndoLastChange( wxCommandEvent& event );
	void OnGreyScaleConvert( wxCommandEvent& event );
	void OnHalfSize( wxCommandEvent& event );
    void OnMirrorX_click( wxCommandEvent& event );
    void OnMirrorY_click( wxCommandEvent& event );
    void OnRotateClick( wxCommandEvent& event );
    void OnOK_Button( wxCommandEvent& aEvent );
    void OnCancel_Button( wxCommandEvent& aEvent );
	void OnRedrawPanel( wxPaintEvent& event );
    bool CheckValues();
};


+19 −3
Original line number Diff line number Diff line
@@ -31,13 +31,23 @@ DIALOG_IMAGE_EDITOR_BASE::DIALOG_IMAGE_EDITOR_BASE( wxWindow* parent, wxWindowID
	bSizerRight = new wxBoxSizer( wxVERTICAL );
	
	m_buttonMirrorX = new wxButton( this, wxID_ANY, _("Mirror X"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerRight->Add( m_buttonMirrorX, 0, wxEXPAND|wxALL, 5 );
	bSizerRight->Add( m_buttonMirrorX, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
	
	m_buttonMirrorY = new wxButton( this, wxID_ANY, _("Mirror Y"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerRight->Add( m_buttonMirrorY, 0, wxEXPAND|wxALL, 5 );
	bSizerRight->Add( m_buttonMirrorY, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
	
	m_buttonRotate = new wxButton( this, wxID_ANY, _("Rotate"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerRight->Add( m_buttonRotate, 0, wxALL|wxEXPAND, 5 );
	bSizerRight->Add( m_buttonRotate, 0, wxEXPAND|wxALL, 5 );
	
	m_buttonGrey = new wxButton( this, wxID_ANY, _("Grey"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerRight->Add( m_buttonGrey, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
	
	m_buttonHalfSize = new wxButton( this, wxID_ANY, _("Half Size"), wxDefaultPosition, wxDefaultSize, 0 );
	m_buttonHalfSize->SetDefault(); 
	bSizerRight->Add( m_buttonHalfSize, 0, wxALL|wxEXPAND, 5 );
	
	m_buttonUndoLast = new wxButton( this, wxID_ANY, _("Undo Last"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerRight->Add( m_buttonUndoLast, 0, wxALL|wxEXPAND, 5 );
	
	m_staticTextScale = new wxStaticText( this, wxID_ANY, _("Image Scale:"), wxDefaultPosition, wxDefaultSize, 0 );
	m_staticTextScale->Wrap( -1 );
@@ -70,6 +80,9 @@ DIALOG_IMAGE_EDITOR_BASE::DIALOG_IMAGE_EDITOR_BASE( wxWindow* parent, wxWindowID
	m_buttonMirrorX->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnMirrorX_click ), NULL, this );
	m_buttonMirrorY->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnMirrorY_click ), NULL, this );
	m_buttonRotate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnRotateClick ), NULL, this );
	m_buttonGrey->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnGreyScaleConvert ), NULL, this );
	m_buttonHalfSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnHalfSize ), NULL, this );
	m_buttonUndoLast->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnUndoLastChange ), NULL, this );
	m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnCancel_Button ), NULL, this );
	m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnOK_Button ), NULL, this );
}
@@ -81,6 +94,9 @@ DIALOG_IMAGE_EDITOR_BASE::~DIALOG_IMAGE_EDITOR_BASE()
	m_buttonMirrorX->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnMirrorX_click ), NULL, this );
	m_buttonMirrorY->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnMirrorY_click ), NULL, this );
	m_buttonRotate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnRotateClick ), NULL, this );
	m_buttonGrey->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnGreyScaleConvert ), NULL, this );
	m_buttonHalfSize->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnHalfSize ), NULL, this );
	m_buttonUndoLast->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnUndoLastChange ), NULL, this );
	m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnCancel_Button ), NULL, this );
	m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMAGE_EDITOR_BASE::OnOK_Button ), NULL, this );
	
Loading