wxPictureWindow.cpp
author viric <viriketo@gmail.com>
Sun, 24 Apr 2011 20:43:56 +0200
changeset 4 6d09f682bc3e
parent 3 b29987bfe7ed
permissions -rw-r--r--
Afegeixo scripts que faig servir per a fer llibres. Aquests són de Duna.

#include <wx/scrolwin.h>
#include <wx/image.h>
#include <wx/bitmap.h>
#include <wx/dc.h>
#include <iostream>
#include <fstream>
#include "wxPictureWindow.hpp"
#include "MainWindow.hpp"

const int factor = 3;

BEGIN_EVENT_TABLE(wxPictureWindow, wxScrolledWindow)
  EVT_MOUSE_EVENTS (wxPictureWindow::OnMouse)
  EVT_KEY_UP (wxPictureWindow::OnKey)
END_EVENT_TABLE()

wxPictureWindow::wxPictureWindow(const wxString &img, const CropArea area, wxWindow *parent)
    :wxScrolledWindow(parent, wxID_ANY),
    _area(area)
{
    SetImg(img);
    _area.x /= factor;
    _area.y /= factor;
    _area.width /= factor;
    _area.height /= factor;
    SetScrollRate(10, 10);
    SetFocus();
}

void
wxPictureWindow::SetImg(const wxString &img)
{
    _filename = img;
    wxLogVerbose(_T("Opening file %s."), img.c_str());
    wxImage i(img);
    if (!i.IsOk())
    {
        wxLogFatalError(_T("Error opening file %s."), img.c_str());
    }

    i.Rescale(i.GetWidth()/3, i.GetHeight()/3);

    _bmp = wxBitmap(i);
    SetVirtualSize(_bmp.GetWidth(), _bmp.GetHeight());

    Refresh();
}

void wxPictureWindow::OnDraw(wxDC &dc)
{
    dc.DrawBitmap(_bmp, 0, 0, false);

    wxRect rect(_area.x, _area.y, _area.width, _area.height);
    dc.SetPen(*wxGREEN_PEN);
    dc.SetBrush(*wxTRANSPARENT_BRUSH);
    dc.DrawRectangle(rect);
}

void wxPictureWindow::OnMouse(wxMouseEvent &ev)
{
    wxClientDC dc(this);
    DoPrepareDC(dc);

    if (ev.LeftDown())
    {
        _area.x = ev.GetLogicalPosition(dc).x;
        _area.y = ev.GetLogicalPosition(dc).y;
        _area.width = 0;
        _area.height = 0;
    }
    else if (ev.LeftIsDown())
    {
        _area.width = ev.GetLogicalPosition(dc).x - _area.x;
        _area.height = ev.GetLogicalPosition(dc).y - _area.y;
    }

    Refresh();
}

wxPictureWindow::~wxPictureWindow()
{
}

void
wxPictureWindow::OnKey(wxKeyEvent &e)
{
    using namespace std;
    if (e.GetKeyCode() == WXK_ESCAPE)
    {
        std::ofstream of("crop.txt", std::fstream::app);
        of << (const char *) _filename.mb_str() << " ";
        of << _area.x * factor << " ";
        of << _area.y * factor << " ";
        of << _area.width * factor << " ";
        of << _area.height * factor << std::endl;

        wxCommandEvent e(EVT_NEXTPICTURE);
        GetParent()->AddPendingEvent(e);
    }
    else
        e.Skip();
}