Mercurial > mercurial > hgweb_searcher03.cgi
comparison src/preview.cpp @ 15:de222bc84e48
Implement Mouse Gesture in Preview Dialog.
author | pyon@macmini |
---|---|
date | Sun, 15 Jun 2014 16:45:52 +0900 |
parents | ac17a73e39b3 |
children | 92188f60323d |
comparison
equal
deleted
inserted
replaced
14:ac17a73e39b3 | 15:de222bc84e48 |
---|---|
1 // Filename : preview.cpp | 1 // Filename : preview.cpp |
2 // Last Change: 04-Jun-2014. | 2 // Last Change: 11-Jun-2014. |
3 // | 3 // |
4 | 4 |
5 #include "marksheet.h" | 5 #include "marksheet.h" |
6 #include "preview.h" | 6 #include "preview.h" |
7 #define THUMB_W 60 | 7 #define THUMB_W 60 |
56 m_bitmap4->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this ); | 56 m_bitmap4->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this ); |
57 m_bitmap5->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this ); | 57 m_bitmap5->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this ); |
58 } | 58 } |
59 | 59 |
60 // Functions | 60 // Functions |
61 /* サムネイル表示 */ | 61 /* サムネイル画像作成 */ |
62 void PThumbnailPanel::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) | 62 void PThumbnailPanel::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) |
63 { | 63 { |
64 m_imagefiles = imagefiles; | 64 m_imagefiles = imagefiles; |
65 | 65 |
66 wxBitmap bmp; | 66 wxBitmap bmp; |
133 : wxDialog( parent, id, title, pos, size, style ) | 133 : wxDialog( parent, id, title, pos, size, style ) |
134 { | 134 { |
135 wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL ); | 135 wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL ); |
136 | 136 |
137 m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxALWAYS_SHOW_SB ); | 137 m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxALWAYS_SHOW_SB ); |
138 m_scrolledWindow->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); | 138 m_scrolledWindow->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); |
139 m_bitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); | 139 m_bitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); |
140 m_bitmap->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); | 140 m_bitmap->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); |
141 m_bitmap->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this ); | |
142 m_bitmap->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( PreviewDialog::OnEndRGesture ), NULL, this ); | |
141 bSizerTop->Add( m_scrolledWindow, 1, wxALL|wxEXPAND, 5 ); | 143 bSizerTop->Add( m_scrolledWindow, 1, wxALL|wxEXPAND, 5 ); |
142 | 144 |
143 wxBoxSizer* bSizerMenu = new wxBoxSizer( wxVERTICAL ); | 145 wxBoxSizer* bSizerMenu = new wxBoxSizer( wxVERTICAL ); |
144 | 146 |
145 m_thumbPanel = new PThumbnailPanel( this, wxID_ANY, wxDefaultPosition, wxSize( 100, -1 ), wxSUNKEN_BORDER ); | 147 m_thumbPanel = new PThumbnailPanel( this, wxID_ANY, wxDefaultPosition, wxSize( 100, -1 ), wxSUNKEN_BORDER ); |
164 this->Layout(); | 166 this->Layout(); |
165 } | 167 } |
166 | 168 |
167 PreviewDialog::~PreviewDialog() | 169 PreviewDialog::~PreviewDialog() |
168 { | 170 { |
169 m_scrolledWindow->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); | 171 m_scrolledWindow->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); |
170 m_bitmap->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); | 172 m_bitmap->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); |
173 m_bitmap->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this ); | |
174 m_bitmap->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( PreviewDialog::OnEndRGesture ), NULL, this ); | |
171 } | 175 } |
172 | 176 |
173 // Event Table | 177 // Event Table |
174 BEGIN_EVENT_TABLE( PreviewDialog, wxDialog ) | 178 BEGIN_EVENT_TABLE( PreviewDialog, wxDialog ) |
175 EVT_BUTTON( ID_PRINT, PreviewDialog::OnPrint ) | 179 EVT_BUTTON( ID_PRINT, PreviewDialog::OnPrint ) |
176 END_EVENT_TABLE() | 180 END_EVENT_TABLE() |
177 | 181 |
178 #define WIDTH 2480 | 182 #define WIDTH 2480 |
179 #define HEIGHT 3509 | 183 #define HEIGHT 3509 |
184 /* プレビューするファイルをセット */ | |
180 void PreviewDialog::SetPreviewImage( int n ) | 185 void PreviewDialog::SetPreviewImage( int n ) |
181 { | 186 { |
182 m_preview = m_imagefiles[n]; | 187 m_preview = n; |
183 m_zoom = 1.0; | 188 m_zoom = 1.0; |
184 SetZoom( m_zoom ); | 189 SetZoom( m_zoom ); |
185 | 190 |
186 // file info | 191 // file info |
187 float z; | 192 float z; |
191 info += wxString::Format( wxT("\n%z = %f"), z ); | 196 info += wxString::Format( wxT("\n%z = %f"), z ); |
192 info += wxString::Format( wxT("\n%l = %ld"), l ); | 197 info += wxString::Format( wxT("\n%l = %ld"), l ); |
193 m_textInfo->SetValue( info ); | 198 m_textInfo->SetValue( info ); |
194 } | 199 } |
195 | 200 |
201 /* 倍率を指定しロード */ | |
196 void PreviewDialog::SetZoom( float zoom ) | 202 void PreviewDialog::SetZoom( float zoom ) |
197 { | 203 { |
198 int w, h; | 204 int w, h; |
199 m_scrolledWindow->GetSize( &w, &h ); | 205 m_scrolledWindow->GetSize( &w, &h ); |
200 w = (int)( zoom * h * WIDTH / HEIGHT ); | 206 w = (int)( zoom * h * WIDTH / HEIGHT ); |
201 h = (int)( zoom * h ); | 207 h = (int)( zoom * h ); |
202 | 208 |
203 m_bitmap->SetBitmap( wxNullBitmap ); | 209 m_bitmap->SetBitmap( wxNullBitmap ); |
204 wxImage img; | 210 wxImage img; |
205 img.LoadFile( m_preview, wxBITMAP_TYPE_JPEG ); | 211 img.LoadFile( m_imagefiles[m_preview], wxBITMAP_TYPE_JPEG ); |
206 wxBitmap bmp( img.Scale( w, h, wxIMAGE_QUALITY_HIGH ) ); | 212 wxBitmap bmp( img.Scale( w, h, wxIMAGE_QUALITY_HIGH ) ); |
207 m_bitmap->SetBitmap( bmp ); | 213 m_bitmap->SetBitmap( bmp ); |
208 m_bitmap->Centre( wxHORIZONTAL ); | 214 m_bitmap->Centre( wxHORIZONTAL ); |
209 | 215 |
210 m_scrolledWindow->Scroll( 0, 0 ); | 216 m_scrolledWindow->Scroll( 0, 0 ); |
211 m_scrolledWindow->SetScrollbars( 10, 10, 0, h/10 ); | 217 m_scrolledWindow->SetScrollbars( 10, 10, 0, h/10 ); |
212 } | 218 } |
213 | 219 |
220 /* ファイル名を保持 */ | |
214 void PreviewDialog::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) | 221 void PreviewDialog::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) |
215 { | 222 { |
216 m_imagefiles = imagefiles; | 223 m_imagefiles = imagefiles; |
217 m_cachefiles = cachefiles; | 224 m_cachefiles = cachefiles; |
218 m_thumbPanel->SetFiles( m_imagefiles, m_cachefiles, select ); | 225 m_thumbPanel->SetFiles( m_imagefiles, m_cachefiles, select ); |
219 | 226 |
220 wxString title = wxT("プレビュー @ ") + m_imagefiles[0].BeforeLast( wxFILE_SEP_PATH ); | 227 wxString title = wxT("プレビュー @ ") + m_imagefiles[0].BeforeLast( wxFILE_SEP_PATH ); |
221 this->SetTitle( title ); | 228 this->SetTitle( title ); |
222 } | 229 } |
223 | 230 |
231 /* コントロールキー + マウスホイール で画像を拡大・縮小 */ | |
224 void PreviewDialog::OnWheel( wxMouseEvent& event ) | 232 void PreviewDialog::OnWheel( wxMouseEvent& event ) |
225 { | 233 { |
226 if ( event.ControlDown() ) { | 234 if ( event.ControlDown() ) { |
227 if ( event.GetWheelRotation() < 0 ) { | 235 if ( event.GetWheelRotation() < 0 ) { |
228 if ( m_zoom > 2.1 ) return; | 236 if ( m_zoom > 2.1 ) return; |
236 return; | 244 return; |
237 } | 245 } |
238 event.Skip(); | 246 event.Skip(); |
239 } | 247 } |
240 | 248 |
249 /* 画像のダブルクリックで倍率変更 */ | |
241 void PreviewDialog::OnDClick( wxMouseEvent& WXUNUSED(event) ) | 250 void PreviewDialog::OnDClick( wxMouseEvent& WXUNUSED(event) ) |
242 { | 251 { |
243 if ( m_zoom > 2.1 ) m_zoom = 1.0; | 252 if ( m_zoom > 2.1 ) m_zoom = 1.0; |
244 else m_zoom *= 1.3; | 253 else m_zoom *= 1.3; |
245 | 254 |
246 SetZoom( m_zoom ); | 255 SetZoom( m_zoom ); |
247 } | 256 } |
248 | 257 |
258 /* 右ジェスチャー検知開始 */ | |
259 void PreviewDialog::OnStartRGesture( wxMouseEvent& event ) | |
260 { | |
261 event.GetPosition( &cx, &cy ); | |
262 } | |
263 | |
264 /* 右ジェスチャー判定 */ | |
265 void PreviewDialog::OnEndRGesture( wxMouseEvent& event ) | |
266 { | |
267 int x, y; | |
268 event.GetPosition( &x, &y ); | |
269 | |
270 int dx = x - cx; | |
271 int dy = y - cy; | |
272 float rad = fabs( atan2( dy, dx ) ); | |
273 float pi = 3.14159; | |
274 | |
275 // 右へジェスチャー | |
276 if ( rad < pi/8 && dx > 0 ) { | |
277 if ( m_preview < m_imagefiles.GetCount() - 1 ) | |
278 m_preview++; | |
279 else | |
280 return; | |
281 m_thumbPanel->Preview( m_preview ); | |
282 } | |
283 // 左へジェスチャー | |
284 else if ( rad > pi/8*7 && rad < pi && dx < 0 ) { | |
285 if ( m_preview > 0 ) | |
286 m_preview--; | |
287 else | |
288 return; | |
289 m_thumbPanel->Preview( m_preview ); | |
290 } | |
291 // 右上ヘジェスチャー | |
292 else if ( rad > pi/8 && rad < pi/8*3 && dx > 0 ) { | |
293 Close(); | |
294 } | |
295 } | |
296 | |
297 /* 印刷 */ | |
249 void PreviewDialog::OnPrint( wxCommandEvent& WXUNUSED(event) ) | 298 void PreviewDialog::OnPrint( wxCommandEvent& WXUNUSED(event) ) |
250 { | 299 { |
251 wxString html; | 300 wxString html; |
252 html = html + wxT("<html><body>\n"); | 301 html = html + wxT("<html><body>\n"); |
253 | 302 |
254 wxString tmpjpg = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("preview.jpg"); | 303 wxString tmpjpg = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("preview.jpg"); |
255 | 304 |
256 wxCopyFile( m_preview, tmpjpg, true ); | 305 wxCopyFile( m_imagefiles[m_preview], tmpjpg, true ); |
257 | 306 |
258 html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>"); | 307 html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>"); |
259 html = html + wxT("</body></html>"); | 308 html = html + wxT("</body></html>"); |
260 | 309 |
261 // start printing | 310 // start printing |