1 #include "imageviewer.h"
2 
3 #include <stdexcept>
4 //#include <wx/intl.h>
5 //#include <wx/imaglist.h>
6 #include <wx/bitmap.h>
7 #include <wx/sizer.h>
8 //#include <wx/notebook.h>
9 #include <wx/listctrl.h>
10 #include <wx/image.h>
11 #include <wx/scrolwin.h>
12 #include <wx/dcclient.h>
13 #include <wx/button.h>
14 #include <wx/filedlg.h>
15 
16 #include "../utils/customdialogs.h"
17 #include "../uiutils.h"
18 
BEGIN_EVENT_TABLE(ImagePanel,wxPanel)19 BEGIN_EVENT_TABLE( ImagePanel, wxPanel )
20     EVT_PAINT(ImagePanel::OnPaint)
21     EVT_SIZE( ImagePanel::OnSize)
22 END_EVENT_TABLE()
23 
24 BEGIN_EVENT_TABLE( ImageViewerPanel, wxPanel )
25     EVT_BUTTON( ImageViewerPanel::ID_NEXT, ImageViewerPanel::OnNext )
26     EVT_BUTTON( ImageViewerPanel::ID_DELETE, ImageViewerPanel::OnDelete )
27     EVT_BUTTON( ImageViewerPanel::ID_PREV, ImageViewerPanel::OnPrev )
28     EVT_BUTTON( ImageViewerPanel::ID_SAVE_AS, ImageViewerPanel::OnSaveAs )
29 END_EVENT_TABLE()
30 
31 ImagePanel::ImagePanel( const wxString& file, wxWindow* parent, wxWindowID id )
32     : wxPanel( parent, id ),
33     m_file( file )
34 {}
35 
ImagePanel(wxWindow * parent,wxWindowID id)36 ImagePanel::ImagePanel( wxWindow* parent, wxWindowID id )
37     : wxPanel( parent, id )
38 {}
39 
~ImagePanel()40 ImagePanel::~ImagePanel()
41 {}
42 
SetBitmap(const wxString & file)43 void ImagePanel::SetBitmap( const wxString& file )
44 {
45     m_file = file;
46     wxPaintEvent p;
47     OnPaint( p );
48 }
49 
OnPaint(wxPaintEvent & WXUNUSED (event))50 void ImagePanel::OnPaint(wxPaintEvent& WXUNUSED(event))
51 {
52     wxPaintDC dc( this );
53     dc.Clear();
54 
55     wxImage im;
56     if ( !im.LoadFile( m_file ) )
57         return;
58 
59     wxSize c_sz = GetClientSize();
60     wxSize im_sz ( im.GetWidth(), im.GetHeight() );
61     im_sz = MakeFit( im_sz, c_sz );
62 
63     dc.DrawBitmap( wxBitmap(im.Rescale( im_sz.GetWidth(), im_sz.GetHeight() ) ), 0, 0, true /* use mask */ );
64 }
OnSize(wxSizeEvent & WXUNUSED (event))65 void ImagePanel::OnSize(wxSizeEvent& WXUNUSED(event))
66 {
67     wxPaintEvent p;
68     OnPaint( p );
69 }
70 
ImageViewerPanel(const wxArrayString & filenames,bool enable_delete,wxWindow * parent,wxWindowID id,long)71 ImageViewerPanel::ImageViewerPanel(const wxArrayString& filenames, bool enable_delete, wxWindow* parent,
72         wxWindowID id, long /*style*/ )
73     : wxPanel ( parent, id, wxDefaultPosition, wxDefaultSize ),
74     m_filenames( filenames ),
75     m_current_file_index( 0 ),
76     m_num_files( filenames.Count() ),
77     m_enable_delete( enable_delete ),
78     m_delete( 0 )
79 {
80     m_main_sizer = new wxBoxSizer( wxVERTICAL );
81     m_button_sizer = new wxBoxSizer( wxHORIZONTAL );
82     m_panel = new ImagePanel( this, -1 );
83     m_main_sizer->Add( m_panel, 1, wxEXPAND | wxALL, 0 );
84 
85     m_prev = new wxButton( this, ID_PREV, _("previous") );
86     m_button_sizer->Add( m_prev, 0, wxALL, 5 );
87 
88     m_next = new wxButton( this, ID_NEXT, _("next") );
89     m_button_sizer->Add( m_next, 0, wxALL, 5 );
90 
91     if ( m_enable_delete ) {
92         m_delete = new wxButton( this, ID_DELETE, _("delete") );
93         m_button_sizer->Add( m_delete, 0, wxALL, 5 );
94     }
95 
96     m_save_as = new wxButton( this, ID_SAVE_AS, _("save as") );
97     m_button_sizer->Add( m_save_as, 0, wxALL, 5 );
98 
99     m_main_sizer->Add( m_button_sizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 0 );
100     SetSizer( m_main_sizer );
101 
102     SetButtonStates();
103     SetImage();
104 
105     Layout();
106     m_panel->Refresh();
107 }
108 
~ImageViewerPanel()109 ImageViewerPanel::~ImageViewerPanel()
110 {
111 }
112 
SetButtonStates()113 void ImageViewerPanel::SetButtonStates()
114 {
115     m_next->Enable( m_current_file_index < m_num_files -1 );
116     m_prev->Enable( m_current_file_index > 0 );
117     if ( m_delete )
118         m_delete->Enable( m_num_files > 0 );
119     m_save_as->Enable( m_num_files > 0 );
120 }
121 
SetImage()122 void ImageViewerPanel::SetImage()
123 {
124     SetButtonStates();
125     m_panel->SetBitmap( m_filenames[m_current_file_index] );
126 //    SetTitle( m_filenames[m_current_file_index] );
127 }
128 
OnNext(wxCommandEvent &)129 void ImageViewerPanel::OnNext( wxCommandEvent& /*evt*/ )
130 {
131     m_current_file_index++;
132     SetImage();
133 }
134 
OnDelete(wxCommandEvent &)135 void ImageViewerPanel::OnDelete( wxCommandEvent& /*evt*/ )
136 {
137     wxString file = m_filenames[m_current_file_index];
138     if ( wxRemoveFile( file ) ) {
139         m_filenames.RemoveAt( m_current_file_index );
140         m_num_files--;
141         if ( m_current_file_index > m_num_files -1 )
142             m_current_file_index--;
143         SetImage();
144     }
145     else {
146         customMessageBoxNoModal( SL_MAIN_ICON, _("couldn't remove file"), _("Error") );
147     }
148 }
149 
OnPrev(wxCommandEvent &)150 void ImageViewerPanel::OnPrev( wxCommandEvent& /*evt*/ )
151 {
152     m_current_file_index--;
153     SetImage();
154 }
155 
OnSaveAs(wxCommandEvent &)156 void ImageViewerPanel::OnSaveAs( wxCommandEvent& /*evt*/ )
157 {
158     wxString ext = m_filenames[m_current_file_index].AfterLast( '.' );
159     wxString mask = _T("*.") + ext;
160     wxFileDialog fd( this, _("Choose a filename"), wxEmptyString, wxEmptyString, mask, wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
161     if ( fd.ShowModal() == wxID_OK ) {
162         wxString new_file = fd.GetPath();
163         if ( !new_file.EndsWith( ext ) )
164             new_file += _T(".") + ext;
165 
166         if ( wxCopyFile( m_filenames[m_current_file_index], new_file ) ) {
167             customMessageBoxNoModal( SL_MAIN_ICON, _("File successfully saved"), _("Success") );
168         }
169         else {
170             customMessageBoxNoModal( SL_MAIN_ICON, _("Couldn't save file"), _("Error") );
171         }
172     }
173 }
174 
ImageViewerDialog(const wxArrayString & filenames,bool enable_delete,wxWindow * parent,wxWindowID id,const wxString & title,long style)175 ImageViewerDialog::ImageViewerDialog(const wxArrayString& filenames, bool enable_delete, wxWindow* parent, wxWindowID id,
176             const wxString& title, long style )
177     : wxDialog ( parent, id, title, wxDefaultPosition, wxDefaultSize, style)
178 {
179     m_main_sizer = new wxBoxSizer( wxVERTICAL );
180     long p_style = 0;
181     m_imageviewer_panel = new ImageViewerPanel( filenames, enable_delete, this, -1,p_style );
182     m_main_sizer->Add( m_imageviewer_panel, 1, wxEXPAND|wxALIGN_CENTER, 0 );
183     SetSizer( m_main_sizer );
184 
185 }
186