@@ -18,7 +18,7 @@ PreviewController::PreviewController(DynaRangeFrame *frame) : m_frame(frame) {
1818 m_interactor = std::make_unique<ChartCornerInteractor>();
1919 m_renderer = std::make_unique<PreviewOverlayRenderer>();
2020
21- // Bind events for the preview panel
21+ // Bind events for the main preview panel
2222 m_frame->m_rawImagePreviewPanel ->Bind (wxEVT_PAINT, &PreviewController::OnPaintPreview, this );
2323 m_frame->m_rawImagePreviewPanel ->Bind (wxEVT_SIZE, &PreviewController::OnSizePreview, this );
2424 m_frame->m_rawImagePreviewPanel ->Bind (wxEVT_LEFT_DOWN, &PreviewController::OnPreviewMouseDown, this );
@@ -27,6 +27,9 @@ PreviewController::PreviewController(DynaRangeFrame *frame) : m_frame(frame) {
2727 m_frame->m_rawImagePreviewPanel ->Bind (wxEVT_MOUSE_CAPTURE_LOST, &PreviewController::OnPreviewMouseCaptureLost, this );
2828 m_frame->m_rawImagePreviewPanel ->Bind (wxEVT_KEY_DOWN, &PreviewController::OnPreviewKeyDown, this );
2929
30+ // Bind the new paint event for the dedicated loupe panel
31+ m_frame->m_loupePanel ->Bind (wxEVT_PAINT, &PreviewController::OnPaintLoupe, this );
32+
3033 // Bind gamma slider event
3134 m_frame->m_gammaThumbSlider ->Bind (wxEVT_SCROLL_CHANGED, &PreviewController::OnGammaSliderChanged, this );
3235}
@@ -118,6 +121,19 @@ void PreviewController::OnPaintPreview(wxPaintEvent &event) {
118121 }
119122}
120123
124+ void PreviewController::OnPaintLoupe (wxPaintEvent& event)
125+ {
126+ wxAutoBufferedPaintDC dc (m_frame->m_loupePanel );
127+ dc.Clear ();
128+ wxGraphicsContext* gc = wxGraphicsContext::Create (dc);
129+ if (gc) {
130+ // The renderer's DrawLoupe function can be called directly here.
131+ // We pass {0, 0} as the position because we are drawing relative to the loupe panel itself.
132+ m_renderer->DrawLoupe (gc, *m_interactor, m_displayPreviewImage, wxPoint (0 ,0 ));
133+ delete gc;
134+ }
135+ }
136+
121137void PreviewController::OnSizePreview (wxSizeEvent &event) {
122138 UpdatePreviewTransform ();
123139 m_frame->m_rawImagePreviewPanel ->Refresh ();
@@ -143,6 +159,7 @@ void PreviewController::OnPreviewMouseDown(wxMouseEvent &event) {
143159 }
144160
145161 m_frame->m_rawImagePreviewPanel ->Refresh ();
162+ m_frame->m_loupePanel ->Refresh (); // Refresh loupe as well
146163 event.Skip ();
147164}
148165
@@ -165,6 +182,7 @@ void PreviewController::OnPreviewMouseMove(wxMouseEvent &event) {
165182 wxPoint2DDouble imageCoords = PanelToImageCoords (event.GetPosition ());
166183 m_interactor->UpdateDraggedCorner (wxPoint (imageCoords.m_x , imageCoords.m_y ));
167184 m_frame->m_rawImagePreviewPanel ->Refresh ();
185+ m_frame->m_loupePanel ->Refresh (); // Refresh loupe on move
168186 }
169187 event.Skip ();
170188}
@@ -269,9 +287,11 @@ void PreviewController::UpdatePreviewTransform() {
269287 m_previewOffset.m_y = (panel_size.GetHeight () - final_height) / 2.0 ;
270288}
271289
272- void PreviewController::OnGammaSliderChanged (wxScrollEvent &event) {
273- ApplyGammaCorrection ();
274- m_frame->m_rawImagePreviewPanel ->Refresh ();
290+ void PreviewController::OnGammaSliderChanged (wxScrollEvent &event)
291+ {
292+ ApplyGammaCorrection ();
293+ m_frame->m_rawImagePreviewPanel ->Refresh ();
294+ m_frame->m_loupePanel ->Refresh (); // Also refresh the loupe as its source image changed
275295}
276296
277297void PreviewController::ApplyGammaCorrection () {
@@ -306,34 +326,28 @@ void PreviewController::ApplyGammaCorrection() {
306326 m_displayPreviewImage = GuiHelpers::CvMatToWxImage (dst_mat);
307327}
308328
309- void PreviewController::OnPreviewKeyDown (wxKeyEvent &event) {
310- if (m_interactor->GetSelectedCorner () == ChartCornerInteractor::Corner::None) {
311- event.Skip ();
312- return ;
313- }
329+ void PreviewController::OnPreviewKeyDown (wxKeyEvent &event)
330+ {
331+ if (m_interactor->GetSelectedCorner () == ChartCornerInteractor::Corner::None) {
332+ event.Skip ();
333+ return ;
334+ }
314335
315- int dx = 0 ;
316- int dy = 0 ;
317- switch (event.GetKeyCode ()) {
318- case WXK_UP:
319- dy = -1 ;
320- break ;
321- case WXK_DOWN:
322- dy = 1 ;
323- break ;
324- case WXK_LEFT:
325- dx = -1 ;
326- break ;
327- case WXK_RIGHT:
328- dx = 1 ;
329- break ;
330- default :
331- event.Skip ();
332- return ;
333- }
336+ int dx = 0 ;
337+ int dy = 0 ;
338+ switch (event.GetKeyCode ()) {
339+ case WXK_UP: dy = -1 ; break ;
340+ case WXK_DOWN: dy = 1 ; break ;
341+ case WXK_LEFT: dx = -1 ; break ;
342+ case WXK_RIGHT: dx = 1 ; break ;
343+ default :
344+ event.Skip ();
345+ return ;
346+ }
334347
335- m_interactor->MoveSelectedCorner (dx, dy);
336- UpdateCoordTextCtrls ();
337- m_frame->m_presenter ->UpdateCommandPreview ();
338- m_frame->m_rawImagePreviewPanel ->Refresh ();
348+ m_interactor->MoveSelectedCorner (dx, dy);
349+ UpdateCoordTextCtrls ();
350+ m_frame->m_presenter ->UpdateCommandPreview ();
351+ m_frame->m_rawImagePreviewPanel ->Refresh ();
352+ m_frame->m_loupePanel ->Refresh (); // Refresh loupe on move
339353}
0 commit comments