From 5d543bcc0d15b871315a2123aec01041d73c53fb Mon Sep 17 00:00:00 2001
From: fszontagh <51741446+fszontagh@users.noreply.github.com>
Date: Sun, 25 Feb 2024 15:37:58 +0000
Subject: [PATCH] drag and drop

---
 ui/ImageViewerImageWindow.cpp |  235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 232 insertions(+), 3 deletions(-)

diff --git a/ui/ImageViewerImageWindow.cpp b/ui/ImageViewerImageWindow.cpp
index 28a9dcf..990733b 100644
--- a/ui/ImageViewerImageWindow.cpp
+++ b/ui/ImageViewerImageWindow.cpp
@@ -1,8 +1,237 @@
 #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);
+}
\ No newline at end of file

--
Gitblit v1.9.3