88
99const React = require ( 'react' ) ;
1010const { connect } = require ( 'react-redux' ) ;
11- const { createSelector} = require ( 'reselect' ) ;
12- const moment = require ( 'moment' ) ;
13- const { compose, withState, withProps, withHandlers} = require ( 'recompose' ) ;
14- const { playbackSettingsSelector, playbackRangeSelector} = require ( '../../selectors/playback' ) ;
15- const { selectedLayerSelector, rangeSelector, selectedLayerDataRangeSelector} = require ( '../../selectors/timeline' ) ;
16- const { selectPlaybackRange, changeSetting, toggleAnimationMode, animationStepMove } = require ( '../../actions/playback' ) ;
17- const Message = require ( '../../components/I18N/Message' ) ;
18- const { onRangeChanged } = require ( '../../actions/timeline' ) ;
19-
20-
21- const Toolbar = require ( '../../components/misc/toolbar/Toolbar' ) ;
11+ const { createSelector } = require ( 'reselect' ) ;
12+ const { compose, withState, withProps, withHandlers } = require ( 'recompose' ) ;
13+ const { selectedLayerSelector} = require ( '../../selectors/timeline' ) ;
2214
23- const PlaybackSettings = compose (
24- connect ( createSelector (
25- playbackSettingsSelector ,
26- selectedLayerSelector ,
27- playbackRangeSelector ,
28- ( settings , selectedLayer , playbackRange ) => ( {
29- fixedStep : ! selectedLayer ,
30- playbackRange,
31- ...settings
32- } )
33- ) , {
34- setPlaybackRange : selectPlaybackRange ,
35- onSettingChange : changeSetting ,
36- toggleAnimationMode
37- }
15+ const { statusSelector, hasPrevNextAnimationSteps, playbackMetadataSelector } = require ( '../../selectors/playback' ) ;
16+ const { animationStepMove, STATUS } = require ( '../../actions/playback' ) ;
3817
39- ) ,
40- // playback buttons
41- compose (
42- connect ( createSelector (
43- rangeSelector ,
44- selectedLayerDataRangeSelector ,
45- ( viewRange , layerRange ) => ( {
46- layerRange,
47- viewRange
48- } )
49- ) , {
50- moveTo : onRangeChanged
51- } ) ,
52- withHandlers ( {
53- toggleAnimationRange : ( { fixedStep, layerRange, viewRange = { } , setPlaybackRange = ( ) => { } } ) => ( enabled ) => {
54- let currentPlaybackRange = fixedStep ? viewRange : layerRange ;
55- // when view range is collapsed, nothing may be initialized yet, so by default 1 day before and after today
56- currentPlaybackRange = {
57- startPlaybackTime : moment ( currentPlaybackRange && currentPlaybackRange . start || new Date ( ) ) . subtract ( 1 , 'days' ) . toISOString ( ) ,
58- endPlaybackTime : moment ( currentPlaybackRange && currentPlaybackRange . end || new Date ( ) ) . add ( 1 , 'days' ) . toISOString ( )
59- } ;
60- setPlaybackRange ( enabled ? currentPlaybackRange : undefined ) ;
61- } ,
62- setPlaybackToCurrentViewRange : ( { viewRange = { } , setPlaybackRange = ( ) => { } } ) => ( ) => {
63- if ( viewRange . start && viewRange . end ) {
64- setPlaybackRange ( {
65- startPlaybackTime : moment ( viewRange . start ) . toISOString ( ) ,
66- endPlaybackTime : moment ( viewRange . end ) . toISOString ( )
67- } ) ;
68- }
69- } ,
70- setPlaybackToCurrentLayerDataRange : ( { setPlaybackRange = ( ) => { } , layerRange } ) => ( ) => layerRange && setPlaybackRange ( {
71- startPlaybackTime : layerRange . start ,
72- endPlaybackTime : layerRange . end
73- } )
74- } ) ,
75- withProps ( ( { playbackRange, fixedStep, moveTo = ( ) => { } , setPlaybackToCurrentViewRange = ( ) => { } , setPlaybackToCurrentLayerDataRange = ( ) => { } } ) => {
76- return {
77- playbackButtons : [ {
78- glyph : "search" ,
79- tooltipId : "playback.settings.range.zoomToCurrentPlayackRange" ,
80- onClick : ( ) => moveTo ( { start : playbackRange . startPlaybackTime , end : playbackRange . endPlaybackTime } )
81- } , {
82- glyph : "resize-horizontal" ,
83- tooltipId : "playback.settings.range.setToCurrentViewRange" ,
84- onClick : ( ) => setPlaybackToCurrentViewRange ( )
85- } , {
86- glyph : "1-layer" ,
87- visible : ! fixedStep ,
88- tooltipId : "playback.settings.range.fitToSelectedLayerRange" ,
89- onClick : ( ) => setPlaybackToCurrentLayerDataRange ( )
90- } ]
91- } ;
92- } )
93- )
9418
95- ) (
96- require ( "../../components/playback/PlaybackSettings" )
97- ) ;
19+ const Message = require ( '../../components/I18N/Message' ) ;
20+ const Toolbar = require ( '../../components/misc/toolbar/Toolbar' ) ;
9821
22+ const PlaybackSettings = require ( './Settings' ) ;
9923
10024/**
10125 * Support for expand/collapse timeline
@@ -111,11 +35,25 @@ const collapsible = compose(
11135 } ) )
11236) ;
11337
38+ const playbackButtonsSelector = createSelector (
39+ statusSelector ,
40+ selectedLayerSelector ,
41+ playbackMetadataSelector ,
42+ hasPrevNextAnimationSteps ,
43+ ( status , layer , metadata = { } , animationState ) =>
44+ ! layer
45+ ? { hasNext : true , hasPrevious : true } // fixed step
46+ : status === STATUS . PLAY || status === STATUS . PAUSE
47+ ? animationState // animation mode with guide layer
48+ : { hasNext : ! ! metadata . next , hasPrevious : ! ! metadata . previous } // normal mode with guide layer
49+ ) ;
50+
51+
11452/**
11553 * Implements playback buttons functionalities
11654 */
11755const playbackButtons = compose (
118- connect ( ( ) => ( { } ) , {
56+ connect ( playbackButtonsSelector , {
11957 stepMove : animationStepMove
12058 } ) ,
12159 withHandlers ( {
@@ -137,6 +75,8 @@ module.exports = playbackEnhancer(({
13775 backward = ( ) => { } ,
13876 pause = ( ) => { } ,
13977 stop = ( ) => { } ,
78+ hasPrevious,
79+ hasNext,
14080 showSettings,
14181 onShowSettings = ( ) => { }
14282} ) =>
@@ -151,6 +91,7 @@ module.exports = playbackEnhancer(({
15191 {
15292 glyph : "step-backward" ,
15393 onClick : backward ,
94+ disabled : ! hasPrevious ,
15495 tooltip : < Message msgId = { "playback.backwardStep" } />
15596 } , {
15697 glyph : status === statusMap . PLAY ? "pause" : "play" ,
@@ -168,6 +109,7 @@ module.exports = playbackEnhancer(({
168109 } , {
169110 glyph : "step-forward" ,
170111 onClick : forward ,
112+ disabled : ! hasNext ,
171113 tooltip : < Message msgId = { "playback.forwardStep" } />
172114 } , {
173115 glyph : "wrench" ,
0 commit comments