view src/preview.cpp @ 16:1ba97995f642

Get/Put DB files to shared-directory.
author pyon@macmini
date Thu, 19 Jun 2014 18:46:11 +0900
parents de222bc84e48
children 92188f60323d
line wrap: on
line source

// Filename   : preview.cpp
// Last Change: 11-Jun-2014.
//

#include "marksheet.h"
#include "preview.h"
#define THUMB_W 60
#define THUMB_H 75

// サムネイルパネル
PThumbnailPanel::PThumbnailPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) 
    : wxPanel( parent, id, pos, size, style )
{
    m_parent = (PreviewDialog*)parent;

	wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL );
	this->SetBackgroundColour( wxColour( 192, 192, 192 ) );

    wxString thumb = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("thumbnail.png");
    wxBitmap bmp = wxBitmap( thumb, wxBITMAP_TYPE_PNG );
	
	m_bitmap0 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap0, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap0->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick0 ), NULL, this );
	
	m_bitmap1 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap1, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap1->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick1 ), NULL, this );
	
	m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap2, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap2->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick2 ), NULL, this );
	
	m_bitmap3 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap3, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap3->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick3 ), NULL, this );
	
	m_bitmap4 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap4, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap4->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this );
	
	m_bitmap5 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 );
	bSizer->Add( m_bitmap5, 0, wxALL|wxALIGN_CENTER, 5 );
    m_bitmap5->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this );
	
	this->SetSizer( bSizer );
	this->Layout();
}

PThumbnailPanel::~PThumbnailPanel()
{
    m_bitmap0->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick0 ), NULL, this );
    m_bitmap1->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick1 ), NULL, this );
    m_bitmap2->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick2 ), NULL, this );
    m_bitmap3->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick3 ), NULL, this );
    m_bitmap4->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this );
    m_bitmap5->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this );
}

// Functions
/* サムネイル画像作成 */
void PThumbnailPanel::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select )
{
    m_imagefiles = imagefiles;

    wxBitmap bmp;
    m_imageList.Create( THUMB_W, THUMB_H );

    bmp.LoadFile( cachefiles[0], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    bmp.LoadFile( cachefiles[1], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    bmp.LoadFile( cachefiles[2], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    bmp.LoadFile( cachefiles[3], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    bmp.LoadFile( cachefiles[4], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    bmp.LoadFile( cachefiles[5], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp );
    SetImageList( select );
}
/* 画像クリックで拡大表示 */
void PThumbnailPanel::OnClick0( wxMouseEvent& WXUNUSED(event) ) { Preview( 0 ); }
void PThumbnailPanel::OnClick1( wxMouseEvent& WXUNUSED(event) ) { Preview( 1 ); }
void PThumbnailPanel::OnClick2( wxMouseEvent& WXUNUSED(event) ) { Preview( 2 ); }
void PThumbnailPanel::OnClick3( wxMouseEvent& WXUNUSED(event) ) { Preview( 3 ); }
void PThumbnailPanel::OnClick4( wxMouseEvent& WXUNUSED(event) ) { Preview( 4 ); }
void PThumbnailPanel::OnClick5( wxMouseEvent& WXUNUSED(event) ) { Preview( 5 ); }
void PThumbnailPanel::Preview( int n )
{
    if ( m_imagefiles.GetCount() < n + 1 ) return;
    SetImageList( n );
    m_parent->SetPreviewImage( n );
}
/* サムネイル表示 */
void PThumbnailPanel::SetImageList( int selected )
{
    m_bitmap0->SetBitmap( m_imageList.GetBitmap(0) );
    m_bitmap1->SetBitmap( m_imageList.GetBitmap(1) );
    m_bitmap2->SetBitmap( m_imageList.GetBitmap(2) );
    m_bitmap3->SetBitmap( m_imageList.GetBitmap(3) );
    m_bitmap4->SetBitmap( m_imageList.GetBitmap(4) );
    m_bitmap5->SetBitmap( m_imageList.GetBitmap(5) );

    wxImage image = m_imageList.GetBitmap( selected ).ConvertToImage();
    unsigned char *data = image.GetData();
    for ( int y = 0; y < THUMB_H; y++ )
        for ( int x = 0;  x <THUMB_W; x++ )
            data[ ( y * THUMB_W + x ) * 3 + 2 ] = 255;  // 文字色:黒(0,0,0)->青(0,0,255)

    wxBitmap bmp_mask( image );

    switch ( selected ) {
        case 0:
            m_bitmap0->SetBitmap( bmp_mask );
            break;
        case 1:
            m_bitmap1->SetBitmap( bmp_mask );
            break;
        case 2:
            m_bitmap2->SetBitmap( bmp_mask );
            break;
        case 3:
            m_bitmap3->SetBitmap( bmp_mask );
            break;
        case 4:
            m_bitmap4->SetBitmap( bmp_mask );
            break;
        case 5:
            m_bitmap5->SetBitmap( bmp_mask );
            break;
    }
}

////////////////////////////////////////////////////////
// プレビューダイアログ
PreviewDialog::PreviewDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) 
    : wxDialog( parent, id, title, pos, size, style )
{
	wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL );

    m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxALWAYS_SHOW_SB );
    m_scrolledWindow->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this );
	m_bitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
    m_bitmap->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this );
    m_bitmap->Connect( wxEVT_RIGHT_DOWN,  wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this );
    m_bitmap->Connect( wxEVT_RIGHT_UP,    wxMouseEventHandler( PreviewDialog::OnEndRGesture   ), NULL, this );
	bSizerTop->Add( m_scrolledWindow, 1, wxALL|wxEXPAND, 5 );
	
	wxBoxSizer* bSizerMenu = new wxBoxSizer( wxVERTICAL );
	
    m_thumbPanel = new PThumbnailPanel( this, wxID_ANY, wxDefaultPosition, wxSize( 100, -1 ), wxSUNKEN_BORDER );
	bSizerMenu->Add( m_thumbPanel, 0, wxALL|wxEXPAND, 5 );

    m_textInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 80 ), wxTE_MULTILINE|wxTE_READONLY|wxTE_NO_VSCROLL );
	m_textInfo->SetBackgroundColour( wxColour( 192, 192, 192 ) );
    bSizerMenu->Add( m_textInfo, 0, wxRIGHT|wxLEFT|wxBOTTOM, 5 );

	m_buttonPrint = new wxButton( this, ID_PRINT, wxT("印刷"), wxDefaultPosition, wxDefaultSize, 0 );
	bSizerMenu->Add( m_buttonPrint, 0, wxALL, 5 );

	bSizerMenu->Add( 0, 0, 0, 0, 5 );
	
	m_buttonClose = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 );
	m_buttonClose->SetDefault(); 
	bSizerMenu->Add( m_buttonClose, 0, wxALL, 5 );

	bSizerTop->Add( bSizerMenu, 0, wxALL|wxEXPAND, 5 );
	
	this->SetSizer( bSizerTop );
	this->Layout();
}

PreviewDialog::~PreviewDialog()
{
    m_scrolledWindow->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this );
    m_bitmap->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this );
    m_bitmap->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this );
    m_bitmap->Disconnect( wxEVT_RIGHT_UP,   wxMouseEventHandler( PreviewDialog::OnEndRGesture   ), NULL, this );
}

// Event Table
BEGIN_EVENT_TABLE( PreviewDialog, wxDialog )
    EVT_BUTTON( ID_PRINT, PreviewDialog::OnPrint )
END_EVENT_TABLE()

#define WIDTH  2480
#define HEIGHT 3509
/* プレビューするファイルをセット */
void PreviewDialog::SetPreviewImage( int n )
{
    m_preview = n;
    m_zoom = 1.0;
    SetZoom( m_zoom );

    // file info
    float z;
    long l;
    GetScore( &z, &l, m_imagefiles[n] );
    wxString info = m_imagefiles[n].AfterLast( wxFILE_SEP_PATH );
    info += wxString::Format( wxT("\n%z = %f"), z );
    info += wxString::Format( wxT("\n%l = %ld"), l );
    m_textInfo->SetValue( info );
}

/* 倍率を指定しロード */
void PreviewDialog::SetZoom( float zoom )
{
    int w, h;
    m_scrolledWindow->GetSize( &w, &h );
    w = (int)( zoom * h * WIDTH / HEIGHT );
    h = (int)( zoom * h );

    m_bitmap->SetBitmap( wxNullBitmap );
    wxImage img;
    img.LoadFile( m_imagefiles[m_preview], wxBITMAP_TYPE_JPEG );
    wxBitmap bmp( img.Scale( w, h, wxIMAGE_QUALITY_HIGH ) );
    m_bitmap->SetBitmap( bmp );
    m_bitmap->Centre( wxHORIZONTAL );

    m_scrolledWindow->Scroll( 0, 0 );
    m_scrolledWindow->SetScrollbars( 10, 10, 0, h/10 );
}

/* ファイル名を保持 */
void PreviewDialog::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select )
{ 
    m_imagefiles = imagefiles;
    m_cachefiles = cachefiles;
    m_thumbPanel->SetFiles( m_imagefiles, m_cachefiles, select );

    wxString title = wxT("プレビュー @ ") + m_imagefiles[0].BeforeLast( wxFILE_SEP_PATH );
    this->SetTitle( title );
}

/* コントロールキー + マウスホイール で画像を拡大・縮小 */
void PreviewDialog::OnWheel( wxMouseEvent& event )
{
    if ( event.ControlDown() ) {
        if ( event.GetWheelRotation() < 0 ) {
            if ( m_zoom > 2.1 ) return;
            m_zoom *= 1.3;
        }
        else {
            if ( m_zoom <= 1.0 ) return;
            m_zoom /= 1.3;
        }
        SetZoom( m_zoom );
        return;
    }
    event.Skip();
}

/* 画像のダブルクリックで倍率変更 */
void PreviewDialog::OnDClick( wxMouseEvent& WXUNUSED(event) )
{
    if ( m_zoom > 2.1 ) m_zoom  = 1.0;
    else                m_zoom *= 1.3;

    SetZoom( m_zoom );
}

/* 右ジェスチャー検知開始 */
void PreviewDialog::OnStartRGesture( wxMouseEvent& event )
{
    event.GetPosition( &cx, &cy );
}

/* 右ジェスチャー判定 */
void PreviewDialog::OnEndRGesture( wxMouseEvent& event )
{
    int x, y;
    event.GetPosition( &x, &y );

    int dx = x - cx;
    int dy = y - cy;
    float rad = fabs( atan2( dy, dx ) );
    float pi = 3.14159;

    // 右へジェスチャー
    if ( rad < pi/8 && dx > 0 ) {
        if ( m_preview < m_imagefiles.GetCount() - 1 ) 
            m_preview++;
        else 
            return;
        m_thumbPanel->Preview( m_preview );
    }
    // 左へジェスチャー
    else if ( rad > pi/8*7 && rad < pi && dx < 0 ) { 
        if ( m_preview > 0 ) 
            m_preview--;
        else 
            return;
        m_thumbPanel->Preview( m_preview );
    }
    // 右上ヘジェスチャー
    else if ( rad > pi/8 && rad < pi/8*3 && dx > 0 ) {
        Close();
    }
}

/* 印刷 */
void PreviewDialog::OnPrint( wxCommandEvent& WXUNUSED(event) )
{
    wxString html;
    html = html + wxT("<html><body>\n");

    wxString tmpjpg = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("preview.jpg");

    wxCopyFile( m_imagefiles[m_preview], tmpjpg, true );

    html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>");
    html = html + wxT("</body></html>");

    // start printing
    wxHtmlPrintout hpout( wxT("Searcher03") );
    hpout.SetMargins( 0, 0, 0, 0, 0 );
    wxPrintDialogData pd;
    wxPrinter p( &pd );

    hpout.SetHtmlText( html, wxEmptyString, false );
    p.Print( NULL, &hpout, true );
}