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