comparison src/myframe.cpp @ 11:9b0840b0be7e

cache done.
author pyon@macmini
date Sun, 23 Oct 2011 07:43:34 +0900
parents 1fda3a06c39b
children 6ed3b64ed39a
comparison
equal deleted inserted replaced
10:1fda3a06c39b 11:9b0840b0be7e
1 // Filename : myframe.cpp 1 // Filename : myframe.cpp
2 // Last Change: 21-Oct-2011. 2 // Last Change: 23-Oct-2011.
3 // 3 //
4 4
5 #include "main.h" 5 #include "main.h"
6 #include "myframe.h" 6 #include "myframe.h"
7 #include "param.h" 7 #include "param.h"
8 #include "dndfile.h" 8 #include "dndfile.h"
9 #include "marksheet.h" 9 #include "marksheet.h"
10 #include "cache.h"
11 10
12 // resources 11 // resources
13 // the application icon (under Windows and OS/2 it is in resources and even 12 // the application icon (under Windows and OS/2 it is in resources and even
14 // though we could still include the XPM here it would be unused) 13 // though we could still include the XPM here it would be unused)
15 #if !defined(__WXMSW__) && !defined(__WXPM__) 14 #if !defined(__WXMSW__) && !defined(__WXPM__)
165 m_statusBar = this->CreateStatusBar( WXSIZEOF(widths), wxST_SIZEGRIP ); 164 m_statusBar = this->CreateStatusBar( WXSIZEOF(widths), wxST_SIZEGRIP );
166 m_statusBar->SetStatusWidths( WXSIZEOF(widths), widths ); 165 m_statusBar->SetStatusWidths( WXSIZEOF(widths), widths );
167 m_statusBar->SetStatusText( wxEmptyString, 0 ); 166 m_statusBar->SetStatusText( wxEmptyString, 0 );
168 167
169 this->Centre( wxBOTH ); 168 this->Centre( wxBOTH );
170 169 m_timer.SetOwner( this, ID_TIMER );
171 Cache cache;
172 } 170 }
173 171
174 // destructor 172 // destructor
175 MyFrame::~MyFrame() 173 MyFrame::~MyFrame()
176 { 174 {
177 } 175 }
178 176
179 // Event Table 177 // Event Table
180 BEGIN_EVENT_TABLE( MyFrame, wxFrame ) 178 BEGIN_EVENT_TABLE( MyFrame, wxFrame )
179 EVT_IDLE( MyFrame::OnIdle )
180 EVT_TIMER( ID_TIMER, MyFrame::OnTimer )
181 EVT_SIZE( MyFrame::OnWinSize ) 181 EVT_SIZE( MyFrame::OnWinSize )
182 EVT_MOVE( MyFrame::OnWinMove ) 182 EVT_MOVE( MyFrame::OnWinMove )
183 EVT_MENU( ID_MENUITEMPARAM, MyFrame::OnParam ) 183 EVT_MENU( ID_MENUITEMPARAM, MyFrame::OnParam )
184 EVT_MENU( ID_MENUITEMAPPDIR, MyFrame::OnOpenAppDir ) 184 EVT_MENU( ID_MENUITEMAPPDIR, MyFrame::OnOpenAppDir )
185 EVT_MENU( wxID_EXIT, MyFrame::OnQuit ) 185 EVT_MENU( wxID_EXIT, MyFrame::OnQuit )
230 d.Append( wxFILE_SEP_PATH ); 230 d.Append( wxFILE_SEP_PATH );
231 if ( !wxDirExists( d ) ) wxMkdir( d ); 231 if ( !wxDirExists( d ) ) wxMkdir( d );
232 } 232 }
233 m_buttonMove->Enable(true); 233 m_buttonMove->Enable(true);
234 234
235 // TODO.
236 // make 申請書ふぉるだ
237
235 wxMessageBox(wxT("移動先フォルダ準備完了")); 238 wxMessageBox(wxT("移動先フォルダ準備完了"));
236 wxString cmd = wxT("explorer ") + to; 239 wxString cmd = wxT("explorer ") + to;
237 wxExecute( cmd ); 240 wxExecute( cmd );
238 } 241 }
239 /* 検知 */ 242 /* 検知 */
299 void MyFrame::ReadyImage() 302 void MyFrame::ReadyImage()
300 { 303 {
301 wxString workdir = m_dirPickerWork->GetPath(); 304 wxString workdir = m_dirPickerWork->GetPath();
302 wxDir dir( workdir ); 305 wxDir dir( workdir );
303 if ( !dir.IsOpened() ) return; 306 if ( !dir.IsOpened() ) return;
307 // start-up iamge
304 wxString notfound = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("notfound.png"); 308 wxString notfound = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("notfound.png");
305 wxBitmap bmp = wxBitmap( notfound, wxBITMAP_TYPE_PNG ); 309 wxBitmap bmp = wxBitmap( notfound, wxBITMAP_TYPE_PNG );
306 m_bitmapName->SetBitmap( bmp ); 310 m_bitmapName->SetBitmap( bmp );
307 notfound = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("0000000000.png"); 311 notfound = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("0000000000.png");
308 bmp.LoadFile( notfound, wxBITMAP_TYPE_PNG ); 312 bmp.LoadFile( notfound, wxBITMAP_TYPE_PNG );
309 m_bitmapHhsno->SetBitmap( bmp ); 313 m_bitmapHhsno->SetBitmap( bmp );
310 314
315 // enum jpeg
311 wxArrayString filenames; 316 wxArrayString filenames;
312 unsigned int n = dir.GetAllFiles( workdir, &filenames, wxT("*.jpg"), wxDIR_FILES ); 317 unsigned int n = dir.GetAllFiles( workdir, &filenames, wxT("*.jpg"), wxDIR_FILES );
313 318
314 m_listCtrlView->DeleteAllItems(); 319 m_listCtrlView->DeleteAllItems();
315 m_imageList->RemoveAll(); 320 m_imageList->RemoveAll();
317 wxString first; 322 wxString first;
318 wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), 7, this, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE ); 323 wxProgressDialog pd( wxT("進行状況"), wxT("処理開始..."), 7, this, wxPD_APP_MODAL|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE );
319 pd.SetSize( wxSize(320,140) ); 324 pd.SetSize( wxSize(320,140) );
320 float z; long l; 325 float z; long l;
321 for ( int i=0; i<n; i++ ) { 326 for ( int i=0; i<n; i++ ) {
327 /*
322 wxFileName f( filenames[i] ); 328 wxFileName f( filenames[i] );
323 wxString filename = f.GetFullName(); 329 wxString filename = f.GetFullName();
324 330
325 m_listCtrlView->InsertItem( i, filename ); 331 m_listCtrlView->InsertItem( i, filename );
326 m_listCtrlView->SetItem( i, 0, filename, i ); 332 m_listCtrlView->SetItem( i, 0, filename, i );
352 if ( IsMarksheet( filenames[i], &z, &l ) ) { 358 if ( IsMarksheet( filenames[i], &z, &l ) ) {
353 break; 359 break;
354 } 360 }
355 } 361 }
356 m_listCtrlView->SetItemState( i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); 362 m_listCtrlView->SetItemState( i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
363 */
357 364
358 // write log 365 // write log
359 pd.Update( i+1, wxT("画像認識中") ); 366 pd.Update( i+1, wxT("画像認識中") );
360 } 367 }
361 368
363 } 370 }
364 371
365 /* 画像を選択 */ 372 /* 画像を選択 */
366 void MyFrame::GetImageInfo(wxListEvent& event) 373 void MyFrame::GetImageInfo(wxListEvent& event)
367 { 374 {
375 /*
368 SetStatusText( wxEmptyString, 2 ); 376 SetStatusText( wxEmptyString, 2 );
369 int i = event.GetIndex(); 377 int i = event.GetIndex();
370 378
371 wxString filename = event.GetText(); 379 wxString filename = event.GetText();
372 wxString workdir = m_dirPickerWork->GetPath(); 380 wxString workdir = m_dirPickerWork->GetPath();
375 wxString msg; 383 wxString msg;
376 if ( IsMarksheet( imagefile, &b, &l ) ) { 384 if ( IsMarksheet( imagefile, &b, &l ) ) {
377 msg = wxT("perhaps marksheet !"); 385 msg = wxT("perhaps marksheet !");
378 } 386 }
379 SetStatusText( wxString::Format(wxT("selected image : z = %f, l = %d ...")+msg, b, l ), 2 ); 387 SetStatusText( wxString::Format(wxT("selected image : z = %f, l = %d ...")+msg, b, l ), 2 );
388 */
380 } 389 }
381 390
382 /* 画像のスクリーン表示*/ 391 /* 画像のスクリーン表示*/
383 void MyFrame::ViewLarge(wxListEvent& event) 392 void MyFrame::ViewLarge(wxListEvent& event)
384 { 393 {
407 pd->NewParam( wxGetApp().lmin, wxGetApp().lmax, wxGetApp().zmin, wxGetApp().zmax ); 416 pd->NewParam( wxGetApp().lmin, wxGetApp().lmax, wxGetApp().zmin, wxGetApp().zmax );
408 } 417 }
409 pd->Destroy(); 418 pd->Destroy();
410 } 419 }
411 420
421 /* キャッシュ作成&更新 */
422 void MyFrame::UpdateCache()
423 {
424 wxString workdir = m_dirPickerWork->GetPath();
425 wxDir dir( workdir );
426 if ( !dir.IsOpened() ) return;
427 wxArrayString filenames;
428
429 wxListItem item;
430 wxString first;
431 float z; long l;
432 bool m;
433
434 wxGetApp().WriteLog( wxT("start updating cache") );
435 SetStatusText( wxT("rebuiling cache..."), 0 );
436
437 for ( CacheHash::iterator i=CH.begin(); i != CH.end(); ++i ) {
438 CacheItem* ci = new CacheItem;
439 ci = i->second;
440 ci->exists = false;
441 }
442 unsigned int n = dir.GetAllFiles( workdir, &filenames, wxT("*.jpg"), wxDIR_FILES );
443 for ( int i=0; i<n; i++ ) {
444 CacheItem* ci = new CacheItem;
445 if ( CH.count(filenames[i]) ) {
446 ci = CH[filenames[i]];
447 ci->exists = true;
448 continue;
449 }
450 ci->filename = filenames[i];
451 m = IsMarksheet( filenames[i], &z, &l );
452 wxImage image( filenames[i], wxBITMAP_TYPE_JPEG );
453 wxBitmap bmp( image.Scale( 160, 226, wxIMAGE_QUALITY_HIGH ) );
454 ci->marksheet = m;
455 ci->z = z;
456 ci->l = l;
457 ci->exists = true;
458 ci->thumbnail = bmp;
459 ci->modtime = wxEmptyString; // TODO.
460 CH[ci->filename] = ci; // add hash
461 wxGetApp().WriteLog( filenames[i] + wxString::Format(wxT(" z=%f l=%d m=%d"), z, l, m ? 1 : 0 ) );
462 }
463 for ( CacheHash::iterator i=CH.begin(); i != CH.end(); ++i ) {
464 CacheItem* ci = new CacheItem;
465 ci = i->second;
466 if ( !ci->exists ) {
467 CH.erase(ci->filename);
468 wxGetApp().WriteLog( ci->filename + wxT(" removed.") );
469 }
470 }
471
472 SetStatusText( wxEmptyString, 0 );
473 m_timer.Start( 20*1000, wxTIMER_ONE_SHOT ); // restart
474 }
475
412 // 以下,定型もの 476 // 以下,定型もの
477 void MyFrame::OnTimer(wxTimerEvent& event)
478 {
479 UpdateCache();
480 }
481 /* アイドリング */
482 void MyFrame::OnIdle(wxIdleEvent& event)
483 {
484 if ( !m_timer.IsRunning() ) {
485 m_timer.Start( 20*1000, wxTIMER_ONE_SHOT );
486 }
487 event.RequestMore();
488 event.Skip();
489 }
490
413 /* アプリフォルダを開く */ 491 /* アプリフォルダを開く */
414 void MyFrame::OnOpenAppDir(wxCommandEvent& WXUNUSED(event)) 492 void MyFrame::OnOpenAppDir(wxCommandEvent& WXUNUSED(event))
415 { 493 {
416 wxString appdir = wxGetCwd(); 494 wxString appdir = wxGetCwd();
417 wxString execmd = wxT("explorer ") + appdir; 495 wxString execmd = wxT("explorer ") + appdir;