| | |
| | | #include "ImageViewerImageWindow.h" |
| | | |
| | | ImageViewerImageWindow::ImageViewerImageWindow( wxWindow* parent ) |
| | | : |
| | | ImageWindow( parent ) |
| | | ImageViewerImageWindow::ImageViewerImageWindow(wxWindow *parent) |
| | | : ImageWindow(parent) |
| | | { |
| | | auto bitmap = app_png_to_wx_bitmap(); |
| | | wxIcon icon; |
| | | icon.CopyFromBitmap(bitmap); |
| | | this->SetIcon(icon); |
| | | |
| | | this->windowTitle = this->GetTitle(); |
| | | this->imgList = new wxImageList(100, 100); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnDropFile(wxDropFilesEvent &event) |
| | | { |
| | | auto numFiles = event.GetNumberOfFiles(); |
| | | auto files = event.GetFiles(); |
| | | bool first = false; |
| | | |
| | | this->imgList->Destroy(); |
| | | this->imgList->Create(100, 100); |
| | | this->images.clear(); |
| | | |
| | | for (int index = 0; index < numFiles; index++) |
| | | { |
| | | wxFileName filename(files[index]); |
| | | if (wxFile::Exists(filename.GetAbsolutePath())) |
| | | { |
| | | if (filename.GetExt() == "jpg" || filename.GetExt() == "png") |
| | | { |
| | | wxImage img(filename.GetAbsolutePath()); |
| | | // this->images.emplace(filename.GetAbsolutePath(), img); |
| | | ImageUtils::ImageFileInfo *info = new ImageUtils::ImageFileInfo(); |
| | | info->file = new wxFileName(filename); |
| | | info->img = new wxImage(img); |
| | | |
| | | if (first == false) |
| | | { |
| | | first = true; |
| | | this->ShowImage(img); |
| | | this->SetTitle(wxString::Format("%s - %s - %dx%dpx", this->windowTitle, filename.GetFullName(), img.GetWidth(), img.GetHeight())); |
| | | } |
| | | wxImage resized = this->cropResizeImage(img, 100, 100); |
| | | auto id = this->imgList->Add(resized); |
| | | this->images.emplace(id, info); |
| | | } |
| | | } |
| | | } |
| | | this->m_image_list->SetImageList(this->imgList, wxIMAGE_LIST_NORMAL); |
| | | this->m_image_list->SetImageList(this->imgList, wxIMAGE_LIST_SMALL); |
| | | // this->m_image_list->AssignImageList(this->imgList, wxIMAGE_LIST_NORMAL); |
| | | |
| | | int idx = 0; |
| | | for (auto img : this->images) |
| | | { |
| | | |
| | | long id = this->m_image_list->InsertItem(idx, img.second->file->GetFullName(), idx); |
| | | this->m_image_list->SetItemPtrData(id, wxUIntPtr(img.second)); |
| | | idx++; |
| | | } |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnWindowKeyUp(wxKeyEvent &event) |
| | | { |
| | | // TODO: implement F key as fullscreen |
| | | if (this->IsFullScreen() && (event.GetKeyCode() == WXK_ESCAPE)) |
| | | { |
| | | this->ShowFullScreen(false); |
| | | } |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnWindowMouseWheel(wxMouseEvent &event) |
| | | { |
| | | // disabled, because when zoomed by button, we need scrollbar to scroll the image... |
| | | return event.Skip(); |
| | | |
| | | // only vertical to zoom |
| | | if (event.GetWheelAxis() != wxMOUSE_WHEEL_VERTICAL) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (event.GetWheelRotation() < 0) |
| | | { |
| | | this->ZoomImage(5); |
| | | } |
| | | |
| | | if (event.GetWheelRotation() > 0) |
| | | { |
| | | this->ZoomImage(+5); |
| | | } |
| | | } |
| | | |
| | | void ImageViewerImageWindow::WindowOnSize(wxSizeEvent &event) |
| | | { |
| | | // TODO: Implement WindowOnSize |
| | | if (this->currentVisibleImage.IsOk()) |
| | | { |
| | | this->ShowImage(this->currentOriginalImage); |
| | | } |
| | | event.Skip(); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnBitmapDoubleLeftClick(wxMouseEvent &event) |
| | | { |
| | | if (this->IsFullScreen()) |
| | | { |
| | | this->ShowFullScreen(false); |
| | | } |
| | | else |
| | | { |
| | | this->ShowFullScreen(true, wxFULLSCREEN_ALL); |
| | | } |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnListItemSelected(wxListEvent &event) |
| | | { |
| | | wxUIntPtr dataPtr = this->m_image_list->GetItemData(event.GetIndex()); |
| | | ImageUtils::ImageFileInfo *fileinfo = reinterpret_cast<ImageUtils::ImageFileInfo *>(dataPtr); |
| | | this->ShowImage(*fileinfo->img); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnRotateLeftClicked(wxCommandEvent &event) |
| | | { |
| | | auto rotated = this->RotateImage(ImageUtils::LEFT, this->currentOriginalImage); |
| | | this->currentVisibleImage = rotated; |
| | | this->ShowImage(rotated); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnRotateRightClicked(wxCommandEvent &event) |
| | | { |
| | | auto rotated = this->RotateImage(ImageUtils::RIGHT, this->currentOriginalImage); |
| | | this->currentVisibleImage = rotated; |
| | | this->ShowImage(rotated); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnZoomInClicked(wxCommandEvent &event) |
| | | { |
| | | this->ZoomImage(5); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnZoomResetClicked(wxCommandEvent &event) |
| | | { |
| | | this->ShowImage(this->currentOriginalImage); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnZoomOutClicked(wxCommandEvent &event) |
| | | { |
| | | this->ZoomImage(-5); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::OnShowFullScreenClick(wxCommandEvent &event) |
| | | { |
| | | this->ShowFullScreen(true, wxFULLSCREEN_ALL); |
| | | } |
| | | |
| | | void ImageViewerImageWindow::ZoomImage(int factor) |
| | | { |
| | | auto orig_width = this->currentOriginalImage.GetWidth(); |
| | | auto orig_height = this->currentOriginalImage.GetHeight(); |
| | | |
| | | if (this->currentZoom + factor < 10 || this->currentZoom + factor > 200) |
| | | { |
| | | return; |
| | | } |
| | | this->currentZoom += factor; |
| | | float zoomFactor = this->currentZoom / 100.0f; |
| | | |
| | | auto target_width = std::round(orig_width * zoomFactor); |
| | | auto target_height = std::round(orig_height * zoomFactor); |
| | | |
| | | auto scaled = this->currentOriginalImage.Scale(target_width, target_height, wxIMAGE_QUALITY_HIGH); |
| | | |
| | | this->m_bitmap1->SetBitmap(scaled); |
| | | this->m_bitmap1->SetSize(scaled.GetSize()); |
| | | this->m_bitmap1->Center(); |
| | | this->m_bitmap1->Refresh(); |
| | | this->currentVisibleImage = scaled; |
| | | this->Layout(); |
| | | |
| | | this->m_statusBar1->SetStatusText(wxString::Format("Zoom: %d Width: %d Height: %d Original Width: %d Height: %d", |
| | | this->currentZoom, |
| | | scaled.GetWidth(), scaled.GetHeight(), orig_width, orig_height)); |
| | | } |
| | | |
| | | wxImage ImageViewerImageWindow::FitImage(wxImage img, int targetWidth, int targetHeight) |
| | | { |
| | | |
| | | int originalWidth = img.GetWidth(); |
| | | int originalHeight = img.GetHeight(); |
| | | |
| | | // Az arány megtartása |
| | | float ratioWidth = static_cast<float>(targetWidth) / originalWidth; |
| | | float ratioHeight = static_cast<float>(targetHeight) / originalHeight; |
| | | float resizeRatio = (ratioWidth < ratioHeight) ? ratioWidth : ratioHeight; |
| | | this->currentZoom = std::round(resizeRatio * 100); |
| | | |
| | | // Új méretek kiszámítása |
| | | int width = static_cast<int>(originalWidth * resizeRatio); |
| | | int height = static_cast<int>(originalHeight * resizeRatio); |
| | | auto scaled = img.Scale(width, height, wxIMAGE_QUALITY_HIGH); |
| | | |
| | | this->m_statusBar1->SetStatusText(wxString::Format("Zoom: %d Width: %d Height: %d Original Width: %d Height: %d", |
| | | this->currentZoom, |
| | | scaled.GetWidth(), scaled.GetHeight(), img.GetWidth(), img.GetHeight())); |
| | | return scaled; |
| | | } |
| | | |
| | | void ImageViewerImageWindow::ShowImage(wxImage img) |
| | | { |
| | | auto size = this->m_scrolledWindow1->GetClientSize(); |
| | | |
| | | if (size.GetWidth() > img.GetWidth() && size.GetHeight() > img.GetHeight()) |
| | | { |
| | | this->m_bitmap1->SetBitmap(img); |
| | | this->m_bitmap1->SetSize(img.GetSize()); |
| | | this->currentVisibleImage = img; |
| | | } |
| | | else |
| | | { |
| | | auto scaled = this->FitImage(img, size.GetWidth(), size.GetHeight()); |
| | | this->m_bitmap1->SetSize(scaled.GetSize()); |
| | | this->m_bitmap1->SetBitmap(scaled); |
| | | this->currentVisibleImage = scaled; |
| | | } |
| | | |
| | | this->currentOriginalImage = img; |
| | | this->m_bitmap1->Center(); |
| | | this->m_bitmap1->Refresh(); |
| | | this->Layout(); |
| | | } |
| | | |
| | | wxImage ImageViewerImageWindow::RotateImage(ImageUtils::ROTATE_DIRECTION dir, wxImage img) |
| | | { |
| | | return img.Rotate90(dir == ImageUtils::ROTATE_DIRECTION::RIGHT); |
| | | } |