diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-09-17 16:53:23 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-09-19 15:51:43 +0200 |
commit | 3a87fb18241e803f7ebffedfc59648782f560f4e (patch) | |
tree | e1cc8c272375d892947327a2c9882303897dd8bd /cui/source/dialogs/cuigrfflt.cxx | |
parent | 088af44063c3e2d1d0e7744a9f9bd7b37ff58a75 (diff) |
weld GraphicFilterEmboss
Change-Id: Ic3c816ddd7d5df9c5ced14600fffd6ca59f0096e
Reviewed-on: https://gerrit.libreoffice.org/60594
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'cui/source/dialogs/cuigrfflt.cxx')
-rw-r--r-- | cui/source/dialogs/cuigrfflt.cxx | 163 |
1 files changed, 135 insertions, 28 deletions
diff --git a/cui/source/dialogs/cuigrfflt.cxx b/cui/source/dialogs/cuigrfflt.cxx index e9f84d1789ef..f8f2b76bc4a5 100644 --- a/cui/source/dialogs/cuigrfflt.cxx +++ b/cui/source/dialogs/cuigrfflt.cxx @@ -79,7 +79,6 @@ void GraphicPreviewWindow::SetPreview(const Graphic& rGraphic) Invalidate(); } - void GraphicPreviewWindow::ScaleImageToFit() { if (!mpOrigGraphic) @@ -125,13 +124,105 @@ void GraphicPreviewWindow::ScaleImageToFit() maModifyHdl.Call(nullptr); } - void GraphicPreviewWindow::Resize() { Control::Resize(); ScaleImageToFit(); } +CuiGraphicPreviewWindow::CuiGraphicPreviewWindow() + : mpOrigGraphic(nullptr) + , mfScaleX(0.0) + , mfScaleY(0.0) +{ +} + +void CuiGraphicPreviewWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ + CustomWidgetController::SetDrawingArea(pDrawingArea); + OutputDevice &rDevice = pDrawingArea->get_ref_device(); + maOutputSizePixel = rDevice.LogicToPixel(Size(81, 73), MapMode(MapUnit::MapAppFont)); + pDrawingArea->set_size_request(maOutputSizePixel.Width(), maOutputSizePixel.Height()); +} + +void CuiGraphicPreviewWindow::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) +{ + rRenderContext.SetBackground(Wallpaper(Application::GetSettings().GetStyleSettings().GetDialogColor())); + rRenderContext.Erase(); + + const Size aOutputSize(GetOutputSizePixel()); + + if (maPreview.IsAnimated()) + { + const Size aGraphicSize(rRenderContext.LogicToPixel(maPreview.GetPrefSize(), maPreview.GetPrefMapMode())); + const Point aGraphicPosition((aOutputSize.Width() - aGraphicSize.Width() ) >> 1, + (aOutputSize.Height() - aGraphicSize.Height() ) >> 1); + maPreview.StartAnimation(&rRenderContext, aGraphicPosition, aGraphicSize); + } + else + { + const Size aGraphicSize(maPreview.GetSizePixel()); + const Point aGraphicPosition((aOutputSize.Width() - aGraphicSize.Width()) >> 1, + (aOutputSize.Height() - aGraphicSize.Height()) >> 1); + maPreview.Draw(&rRenderContext, aGraphicPosition, aGraphicSize); + } +} + +void CuiGraphicPreviewWindow::SetPreview(const Graphic& rGraphic) +{ + maPreview = rGraphic; + Invalidate(); +} + +void CuiGraphicPreviewWindow::ScaleImageToFit() +{ + if (!mpOrigGraphic) + return; + + maScaledOrig = *mpOrigGraphic; + + const Size aPreviewSize(GetOutputSizePixel()); + Size aGrfSize(maOrigGraphicSizePixel); + + if( mpOrigGraphic->GetType() == GraphicType::Bitmap && + aPreviewSize.Width() && aPreviewSize.Height() && + aGrfSize.Width() && aGrfSize.Height() ) + { + const double fGrfWH = static_cast<double>(aGrfSize.Width()) / aGrfSize.Height(); + const double fPreWH = static_cast<double>(aPreviewSize.Width()) / aPreviewSize.Height(); + + if( fGrfWH < fPreWH ) + { + aGrfSize.setWidth( static_cast<long>( aPreviewSize.Height() * fGrfWH ) ); + aGrfSize.setHeight( aPreviewSize.Height() ); + } + else + { + aGrfSize.setWidth( aPreviewSize.Width() ); + aGrfSize.setHeight( static_cast<long>( aPreviewSize.Width() / fGrfWH ) ); + } + + mfScaleX = static_cast<double>(aGrfSize.Width()) / maOrigGraphicSizePixel.Width(); + mfScaleY = static_cast<double>(aGrfSize.Height()) / maOrigGraphicSizePixel.Height(); + + if( !mpOrigGraphic->IsAnimated() ) + { + BitmapEx aBmpEx( mpOrigGraphic->GetBitmapEx() ); + + if( aBmpEx.Scale( aGrfSize ) ) + maScaledOrig = aBmpEx; + } + } + + maModifyHdl.Call(nullptr); +} + +void CuiGraphicPreviewWindow::Resize() +{ + maOutputSizePixel = GetOutputSizePixel(); + ScaleImageToFit(); +} + GraphicFilterDialog::GraphicFilterDialog(vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription, const Graphic& rGraphic) @@ -180,6 +271,36 @@ IMPL_LINK_NOARG(GraphicFilterDialog, ImplModifyHdl, LinkParamNone*, void) } } +GraphicFilterDialogController::GraphicFilterDialogController(weld::Window* pParent, + const OUString& rUIXMLDescription, const OString& rID, + const Graphic& rGraphic) + : GenericDialogController(pParent, rUIXMLDescription, rID) + , maModifyHdl(LINK(this, GraphicFilterDialogController, ImplModifyHdl)) + , mxPreview(new weld::CustomWeld(*m_xBuilder, "preview", maPreview)) +{ + bIsBitmap = rGraphic.GetType() == GraphicType::Bitmap; + + maTimer.SetInvokeHandler(LINK(this, GraphicFilterDialogController, ImplPreviewTimeoutHdl)); + maTimer.SetTimeout(5); + + maPreview.init(&rGraphic, maModifyHdl); +} + +IMPL_LINK_NOARG(GraphicFilterDialogController, ImplPreviewTimeoutHdl, Timer *, void) +{ + maTimer.Stop(); + maPreview.SetPreview(GetFilteredGraphic(maPreview.GetScaledOriginal(), + maPreview.GetScaleX(), maPreview.GetScaleY())); +} + +IMPL_LINK_NOARG(GraphicFilterDialogController, ImplModifyHdl, LinkParamNone*, void) +{ + if (bIsBitmap) + { + maTimer.Stop(); + maTimer.Start(); + } +} GraphicFilterMosaic::GraphicFilterMosaic( vcl::Window* pParent, const Graphic& rGraphic, sal_uInt16 nTileWidth, sal_uInt16 nTileHeight, bool bEnhanceEdges ) @@ -517,53 +638,39 @@ void EmbossControl::MouseButtonDown( const MouseEvent& rEvt ) { const RectPoint eOldRP = GetActualRP(); - SvxRectCtl::MouseButtonDown( rEvt ); + RectCtl::MouseButtonDown( rEvt ); if( GetActualRP() != eOldRP ) maModifyHdl.Call( nullptr ); } - -Size EmbossControl::GetOptimalSize() const +void EmbossControl::SetDrawingArea(weld::DrawingArea* pDrawingArea) { - return LogicToPixel(Size(77, 60), MapMode(MapUnit::MapAppFont)); + RectCtl::SetDrawingArea(pDrawingArea); + Size aSize(pDrawingArea->get_ref_device().LogicToPixel(Size(77, 60), MapMode(MapUnit::MapAppFont))); + pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); } - -VCL_BUILDER_FACTORY(EmbossControl) - - -GraphicFilterEmboss::GraphicFilterEmboss(vcl::Window* pParent, +GraphicFilterEmboss::GraphicFilterEmboss(weld::Window* pParent, const Graphic& rGraphic, RectPoint eLightSource) - : GraphicFilterDialog (pParent, "EmbossDialog", - "cui/ui/embossdialog.ui", rGraphic) + : GraphicFilterDialogController(pParent, "cui/ui/embossdialog.ui", "EmbossDialog", rGraphic) + , mxCtlLight(new weld::CustomWeld(*m_xBuilder, "lightsource", maCtlLight)) { - get(mpCtlLight, "lightsource"); - mpCtlLight->SetActualRP(eLightSource); - mpCtlLight->SetModifyHdl( GetModifyHdl() ); - mpCtlLight->GrabFocus(); + maCtlLight.SetActualRP(eLightSource); + maCtlLight.SetModifyHdl( GetModifyHdl() ); + maCtlLight.GrabFocus(); } - GraphicFilterEmboss::~GraphicFilterEmboss() { - disposeOnce(); } - -void GraphicFilterEmboss::dispose() -{ - mpCtlLight.clear(); - GraphicFilterDialog::dispose(); -} - - Graphic GraphicFilterEmboss::GetFilteredGraphic( const Graphic& rGraphic, double, double ) { Graphic aRet; sal_uInt16 nAzim, nElev; - switch( mpCtlLight->GetActualRP() ) + switch (maCtlLight.GetActualRP()) { default: OSL_FAIL("svx::GraphicFilterEmboss::GetFilteredGraphic(), unknown Reference Point!" ); SAL_FALLTHROUGH; |