Repository navigation
Expand file tree
/
Copy pathResponsiveImageFrame.cpp
More file actions
83 lines (63 loc) · 2.34 KB
/
Copy pathResponsiveImageFrame.cpp
File metadata and controls
83 lines (63 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "ResponsiveImageFrame.h"
#include <wx/graphics.h>
ResponsiveImageFrame::ResponsiveImageFrame(wxFrame* parent, const wxString& title, const wxImage& image)
: wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE)
{
if (parent && parent->GetIcon().IsOk()) {
SetIcon(parent->GetIcon());
}
m_bitmap = wxBitmap(image);
m_panel = new wxPanel(this, wxID_ANY);
m_panel->SetBackgroundColour(wxColour(30, 30, 30));
m_panel->SetDoubleBuffered(true);
SetMinSize(wxSize(200, 200));
m_panel->Bind(wxEVT_SIZE, &ResponsiveImageFrame::OnSize, this);
m_panel->Bind(wxEVT_PAINT, &ResponsiveImageFrame::OnPaint, this);
}
void ResponsiveImageFrame::OnSize(wxSizeEvent& event) {
m_panel->Refresh();
event.Skip();
}
void ResponsiveImageFrame::OnPaint(wxPaintEvent& event) {
wxPaintDC dc(m_panel);
wxGraphicsContext* gc = wxGraphicsContext::Create(dc);
if (gc && m_bitmap.IsOk()) {
wxSize panelSize = m_panel->GetClientSize();
double targetW = panelSize.GetWidth();
double targetH = panelSize.GetHeight();
double origW = m_bitmap.GetWidth();
double origH = m_bitmap.GetHeight();
double scaleW = targetW / origW;
double scaleH = targetH / origH;
double scale = std::min(scaleW, scaleH);
double finalW = origW * scale;
double finalH = origH * scale;
double x = (targetW - finalW) / 2.0;
double y = (targetH - finalH) / 2.0;
gc->DrawBitmap(m_bitmap, x, y, finalW, finalH);
delete gc;
}
}
void ShowStandaloneImage(wxFrame* parent, const wxImage& image, ResponsiveImageFrame*& previewFrame) {
if (!image.IsOk()) {
wxMessageBox("The provided image is invalid.", "Error", wxICON_ERROR | wxOK);
return;
}
if (previewFrame) {
previewFrame->UpdateImage(image);
previewFrame->Raise();
}
else {
previewFrame = new ResponsiveImageFrame(parent, "Image Viewer", image);
previewFrame->Bind(wxEVT_CLOSE_WINDOW, [&previewFrame](wxCloseEvent& event) {
previewFrame = nullptr;
event.Skip();
});
previewFrame->Show(true);
}
}
void ResponsiveImageFrame::UpdateImage(const wxImage& image) {
if (!image.IsOk()) return;
m_bitmap = wxBitmap(image);
m_panel->Refresh();
}