| // Copyright 2015 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_CSSOM_CSS_TRANSITION_SET_H_ |
| #define COBALT_CSSOM_CSS_TRANSITION_SET_H_ |
| |
| #include <map> |
| |
| #include "base/basictypes.h" |
| #include "base/optional.h" |
| #include "base/time/time.h" |
| #include "cobalt/cssom/css_transition.h" |
| #include "cobalt/cssom/property_definitions.h" |
| |
| namespace cobalt { |
| namespace cssom { |
| |
| class CSSComputedStyleData; |
| class PropertyValue; |
| |
| // Maintains a mapping from the set of all unique CSS style properties to |
| // active transitions. Not all style properties may have active transitions. |
| // This class is used to maintain persistence of active transitions and is |
| // expected to be modified over time as events such as CSS style modifications |
| // occur. |
| class TransitionSet { |
| public: |
| // An EventHandler object can be supplied to the TransitionSet upon |
| // construction to have TransitionSet update a caller as it internally updates |
| // its set of active transitions on each call to UpdateTransitions(). This |
| // is useful as it can provide an external observer (e.g. such as an adapter |
| // from CSS Transitions to the Web Animations API) the opportunity to take |
| // action based on transition start/end events. |
| class EventHandler { |
| public: |
| virtual ~EventHandler() {} |
| // Called when a transition is starting, either freshly introduced or |
| // replacing an existing transition. |
| virtual void OnTransitionStarted(const Transition& transition, |
| TransitionSet* transition_set) = 0; |
| |
| // Called when a transition is removed, either because it has finished, or |
| // because it was replaced (in which case OnTransitionStarted() will be |
| // called with the replacement immediately after this). |
| virtual void OnTransitionRemoved(const Transition& transition, |
| Transition::IsCanceled is_canceled) = 0; |
| }; |
| |
| explicit TransitionSet(EventHandler* event_handler = NULL); |
| |
| // Helper function to get a const reference to a global empty transition set. |
| static const TransitionSet* EmptyTransitionSet(); |
| |
| // Given a source and destination CSS Style Declarations (presumably applied |
| // to an HTML element), updates all current transitions to reflect the new |
| // state. This may mean removing transitions that were canceled or |
| // completed, updating existing transitions with new values, or creating new |
| // transitions. The implementation of this method is defined here: |
| // https://www.w3.org/TR/2013/WD-css3-transitions-20131119/#starting |
| void UpdateTransitions(const base::TimeDelta& current_time, |
| const CSSComputedStyleData& source, |
| const CSSComputedStyleData& destination); |
| |
| // Given the name of a property, returns the active transition corresponding |
| // to it. If no transition currently exists for this property, this method |
| // returns NULL. |
| const Transition* GetTransitionForProperty(PropertyKey property) const; |
| |
| // Returns true if there are no animations in this animation set. |
| bool empty() const { return transitions_.IsEmpty(); } |
| |
| // Clears out all currently running transitions. |
| void Clear(); |
| |
| private: |
| void UpdateTransitionForProperty( |
| PropertyKey property, const base::TimeDelta& current_time, |
| const scoped_refptr<PropertyValue>& source_value, |
| const scoped_refptr<PropertyValue>& destination_value, |
| const CSSComputedStyleData& transition_style); |
| |
| // We define a TransitionMap (from CSS property to Transition object) here to |
| // host our set of active transitions, and additionally manage the firing |
| // of transition begin/end events. |
| class TransitionMap { |
| public: |
| explicit TransitionMap(EventHandler* event_handler); |
| ~TransitionMap(); |
| |
| const Transition* GetTransitionForProperty(PropertyKey property) const; |
| bool IsEmpty() const { return transitions_.empty(); } |
| |
| // Adds or replaces an existing transition in the map. |
| void UpdateTransitionForProperty(PropertyKey property, |
| const Transition& transition, |
| cssom::TransitionSet* transition_set); |
| |
| // Removes an existing transition from the map if it exists. |
| void RemoveTransitionForPropertyIfExists( |
| PropertyKey property, Transition::IsCanceled is_canceled); |
| |
| // Clears all entries from the map, as if RemoveTransitionForProperty() |
| // had been called on each property. |
| void Clear(); |
| |
| typedef std::map<PropertyKey, Transition> InternalTransitionMap; |
| const InternalTransitionMap& GetInternalMap() const { return transitions_; } |
| |
| private: |
| EventHandler* event_handler_; |
| InternalTransitionMap transitions_; |
| }; |
| |
| TransitionMap transitions_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TransitionSet); |
| }; |
| |
| } // namespace cssom |
| } // namespace cobalt |
| |
| #endif // COBALT_CSSOM_CSS_TRANSITION_SET_H_ |