Skip to content

Commit

Permalink
Implemented large screen mode
Browse files Browse the repository at this point in the history
Enact-DCO-1.0-Signed-off-by: Hyelyn Kim (myelyn.kim@lge.com)
  • Loading branch information
mmyelyn committed May 13, 2024
1 parent 7c03337 commit 10b9aa7
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 9 deletions.
40 changes: 37 additions & 3 deletions packages/ui/resolution/ResolutionDecorator.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@ import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import hoc from '@enact/core/hoc';

import {init, config as riConfig, defineScreenTypes, getResolutionClasses} from './resolution';
import {
init,
calculateFontSize,
config as riConfig,
defineScreenTypes,
getResolutionClasses,
updateBaseFontSize,
updateScreenScale
} from './resolution';

/**
* Default config for `ResolutionDecorator`.
Expand Down Expand Up @@ -97,13 +105,29 @@ const ResolutionDecorator = hoc(defaultConfig, (config, Wrapped) => {
static displayName = 'ResolutionDecorator';

static propTypes = /** @lends ui/resolution.ResolutionDecorator.prototype */ {
className: PropTypes.string
className: PropTypes.string,

/**
* Screen Scale value for the large screen mode.
* Use this value to set the scale of the base font.
* This is the value that will be multiplied by pxPerRem, which is determined by the resolution.
*
* @type {Number}
* @default 1
* @public
*/
screenScale: PropTypes.number
};

static defaultProps = {
screenScale: 1
};

constructor (props) {
super(props);
riConfig.intermediateScreenHandling = config.intermediateScreenHandling;
riConfig.matchSmallerScreenType = config.matchSmallerScreenType;
updateScreenScale(this.props.screenScale);
init({measurementNode: (typeof window !== 'undefined' && window)});
this.state = {
resolutionClasses: ''
Expand All @@ -116,6 +140,10 @@ const ResolutionDecorator = hoc(defaultConfig, (config, Wrapped) => {
this.rootNode = ReactDOM.findDOMNode(this);
}

componentDidUpdate (prevProps) {

Check warning on line 143 in packages/ui/resolution/ResolutionDecorator.js

View check run for this annotation

Codecov / codecov/patch

packages/ui/resolution/ResolutionDecorator.js#L143

Added line #L143 was not covered by tests
if (prevProps.screenScale !== this.props.screenScale) updateBaseFontSize(calculateFontSize());
}

componentWillUnmount () {
if (config.dynamic) window.removeEventListener('resize', this.handleResize);
}
Expand Down Expand Up @@ -145,11 +173,17 @@ const ResolutionDecorator = hoc(defaultConfig, (config, Wrapped) => {
}

render () {
const {...rest} = this.props;

delete rest.screenScale;

if (this.props.screenScale) updateScreenScale(this.props.screenScale);

// Check if the classes are different from our previous classes
let classes = getResolutionClasses();

if (this.props.className) classes += (classes ? ' ' : '') + this.props.className;
return <Wrapped {...this.props} className={classes} />;
return <Wrapped {...rest} className={classes} />;
}
};
});
Expand Down
26 changes: 20 additions & 6 deletions packages/ui/resolution/resolution.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
let baseScreen,
orientation,
riRatio,
screenScale = 1,
screenType,
workspaceBounds = {
width: (typeof window === 'object') ? window.innerWidth : 1920,
Expand Down Expand Up @@ -201,11 +202,11 @@ function calculateFontSize (type) {
let size;

if (orientation === 'portrait' && config.orientationHandling === 'scale') {
size = scrObj.height / scrObj.width * scrObj.pxPerRem;
size = scrObj.height / (scrObj.width * scrObj.pxPerRem * screenScale);

Check warning on line 205 in packages/ui/resolution/resolution.js

View check run for this annotation

Codecov / codecov/patch

packages/ui/resolution/resolution.js#L205

Added line #L205 was not covered by tests
} else {
size = scrObj.pxPerRem;
size = scrObj.pxPerRem * screenScale;
if (orientation === 'landscape' && shouldScaleFontSize) {
size = parseInt(workspaceBounds.height * scrObj.pxPerRem / scrObj.height);
size = parseInt(workspaceBounds.height * scrObj.pxPerRem * screenScale / scrObj.height);

Check warning on line 209 in packages/ui/resolution/resolution.js

View check run for this annotation

Codecov / codecov/patch

packages/ui/resolution/resolution.js#L209

Added line #L209 was not covered by tests
}
}
return size + 'px';
Expand All @@ -224,6 +225,17 @@ function updateBaseFontSize (size) {
}
}

/**
* @function
* @memberof ui/resolution
* @param {Number} screenScaleValue A value that adjusts the screen scaling.
* @returns {undefined}
* @private
*/
function updateScreenScale (screenScaleValue) {
screenScale = screenScaleValue;
}

/**
* Returns the CSS classes for the given `type`.
*
Expand Down Expand Up @@ -332,7 +344,7 @@ function getAspectRatioName (type) {
* @public
*/
function scale (px) {
return (riRatio || getRiRatio()) * px;
return (riRatio || getRiRatio()) * px * screenScale;
}

/**
Expand Down Expand Up @@ -366,7 +378,7 @@ function unit (pixels, toUnit) {
if (typeof pixels === 'string' && pixels.substr(-2) === 'px') pixels = parseInt(pixels.substr(0, pixels.length - 2));
if (typeof pixels !== 'number') return;

return (pixels / unitToPixelFactors[toUnit]) + '' + toUnit;
return (pixels / (screenScale * unitToPixelFactors[toUnit])) + '' + toUnit;
}

/**
Expand Down Expand Up @@ -494,5 +506,7 @@ export {
scaleToRem,
selectSrc,
unit,
unitToPixelFactors
unitToPixelFactors,
updateBaseFontSize,
updateScreenScale
};

0 comments on commit 10b9aa7

Please sign in to comment.