#include "ImageViewerImageWindow.h" 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(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(targetWidth) / originalWidth; float ratioHeight = static_cast(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(originalWidth * resizeRatio); int height = static_cast(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); }