Add wxWebView::SetZoomFactor(float) and GetZoomFactor()

The new method allows to set the zoom level more precisely than the
existing SetZoom(wxWebViewZoom).

Also improve the webview sample by using radio menu items instead of
check items and manually resetting them.

Closes https://github.com/wxWidgets/wxWidgets/pull/1894

Closes #18769.
This commit is contained in:
Hertatijanto Hartono
2020-06-13 22:50:55 +07:00
committed by Vadim Zeitlin
parent dc9040cc89
commit 895424ecc0
12 changed files with 227 additions and 59 deletions

View File

@@ -284,6 +284,44 @@ wxWebViewZoom wxWebViewIE::GetZoom() const
}
float wxWebViewIE::GetZoomFactor() const
{
wxWebViewZoom level = wxWEBVIEW_ZOOM_MEDIUM;
float zoomFactor = 1.0;
if (m_impl->m_zoomType == wxWEBVIEW_ZOOM_TYPE_LAYOUT)
{
zoomFactor = (float)GetIEOpticalZoomFactor();
zoomFactor /= 100;
}
else if (m_impl->m_zoomType == wxWEBVIEW_ZOOM_TYPE_TEXT)
{
level = GetIETextZoom();
switch(level)
{
case wxWEBVIEW_ZOOM_TINY:
zoomFactor = 0.6;
break;
case wxWEBVIEW_ZOOM_SMALL:
zoomFactor = 0.8;
break;
case wxWEBVIEW_ZOOM_MEDIUM:
zoomFactor = 1.0;
break;
case wxWEBVIEW_ZOOM_LARGE:
zoomFactor = 1.3;
break;
case wxWEBVIEW_ZOOM_LARGEST:
zoomFactor = 1.6;
break;
default:
wxFAIL;
}
}
return zoomFactor;
}
void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
{
switch( m_impl->m_zoomType )
@@ -299,6 +337,41 @@ void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
}
}
void wxWebViewIE::SetZoomFactor(float zoom)
{
wxWebViewZoom level = wxWEBVIEW_ZOOM_MEDIUM;
if (m_impl->m_zoomType == wxWEBVIEW_ZOOM_TYPE_LAYOUT)
{
SetIEOpticalZoomFactor(zoom * 100);
}
else if (m_impl->m_zoomType == wxWEBVIEW_ZOOM_TYPE_TEXT)
{
//We make a somewhat arbitray map here, taken from values used by webkit
if (zoom <= 65)
{
level = wxWEBVIEW_ZOOM_TINY;
}
else if (zoom > 65 && zoom <= 90)
{
level = wxWEBVIEW_ZOOM_SMALL;
}
else if (zoom > 90 && zoom <= 115)
{
level = wxWEBVIEW_ZOOM_MEDIUM;
}
else if (zoom > 115 && zoom <= 145)
{
level = wxWEBVIEW_ZOOM_LARGE;
}
else
{
level = wxWEBVIEW_ZOOM_LARGEST;
}
SetIETextZoom(level);
}
}
void wxWebViewIE::SetIETextZoom(wxWebViewZoom level)
{
//We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
@@ -338,33 +411,40 @@ wxWebViewZoom wxWebViewIE::GetIETextZoom() const
void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level)
{
//We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
//is 10 to 1000 so the check is unnecessary
VARIANT zoomVariant;
VariantInit (&zoomVariant);
V_VT(&zoomVariant) = VT_I4;
int zoom = 100;
//We make a somewhat arbitray map here, taken from values used by webkit
switch(level)
{
case wxWEBVIEW_ZOOM_TINY:
V_I4(&zoomVariant) = 60;
zoom = 60;
break;
case wxWEBVIEW_ZOOM_SMALL:
V_I4(&zoomVariant) = 80;
zoom = 80;
break;
case wxWEBVIEW_ZOOM_MEDIUM:
V_I4(&zoomVariant) = 100;
zoom = 100;
break;
case wxWEBVIEW_ZOOM_LARGE:
V_I4(&zoomVariant) = 130;
zoom = 130;
break;
case wxWEBVIEW_ZOOM_LARGEST:
V_I4(&zoomVariant) = 160;
zoom = 160;
break;
default:
wxFAIL;
}
SetIEOpticalZoomFactor(zoom);
}
void wxWebViewIE::SetIEOpticalZoomFactor(int zoom)
{
//We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
//is 10 to 1000 so the check is unnecessary
VARIANT zoomVariant;
VariantInit (&zoomVariant);
V_VT(&zoomVariant) = VT_I4;
V_I4(&zoomVariant) = zoom;
#if wxDEBUG_LEVEL
HRESULT result =
@@ -378,19 +458,7 @@ void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level)
wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const
{
VARIANT zoomVariant;
VariantInit (&zoomVariant);
V_VT(&zoomVariant) = VT_I4;
#if wxDEBUG_LEVEL
HRESULT result =
#endif
m_impl->m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
OLECMDEXECOPT_DODEFAULT, NULL,
&zoomVariant);
wxASSERT(result == S_OK);
const int zoom = V_I4(&zoomVariant);
const int zoom = GetIEOpticalZoomFactor();
//We make a somewhat arbitray map here, taken from values used by webkit
if (zoom <= 65)
@@ -415,6 +483,25 @@ wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const
}
}
int wxWebViewIE::GetIEOpticalZoomFactor() const
{
VARIANT zoomVariant;
VariantInit (&zoomVariant);
V_VT(&zoomVariant) = VT_I4;
#if wxDEBUG_LEVEL
HRESULT result =
#endif
m_impl->m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
OLECMDEXECOPT_DODEFAULT, NULL,
&zoomVariant);
wxASSERT(result == S_OK);
const int zoom = V_I4(&zoomVariant);
return zoom;
}
void wxWebViewIE::SetZoomType(wxWebViewZoomType type)
{
m_impl->m_zoomType = type;