TizenRefApp-7838 Implement player response to slider changes 57/106657/4
authorNataliia Sydorchuk <n.sydorchuk@samsung.com>
Thu, 29 Dec 2016 11:37:04 +0000 (13:37 +0200)
committerNataliia Sydorchuk <n.sydorchuk@samsung.com>
Thu, 29 Dec 2016 11:37:04 +0000 (13:37 +0200)
Change-Id: Icb4826d88727184a56cc15278c52d5d9eb12b1b3
Signed-off-by: Nataliia Sydorchuk <n.sydorchuk@samsung.com>
lib-common/inc/Common/Player.h
lib-common/src/Common/Player.cpp
memo-app/inc/Input/RecordField.h
memo-app/src/Input/RecordField.cpp

index 5e656a9242c666eb73b274462df381fcfe10e4b7..5f1ae2cd272cb9e16b2b711e2efe575edb39ba59 100644 (file)
@@ -36,6 +36,11 @@ namespace Common
                 */
                typedef std::function<void()> InterruptCallback;
 
+               /**
+                * @brief Called when the seek operation of player is completed.
+                */
+               typedef std::function<void()> SeekCompleteCallback;
+
                /**
                 * @brief Create player.
                 * @param[in]   path   Record path.
@@ -94,6 +99,13 @@ namespace Common
                 */
                int getPosition();
 
+               /**
+                * @brief Set the seek position of the record, asynchronously.
+                * @param[in]   position    The position in milliseconds.
+                * @param[in]   callback    Seek completed callback
+                */
+               void setPosition(int position, SeekCompleteCallback callback);
+
        private:
                void onCompleted();
                void onInterrupted(player_interrupted_code_e code);
index 5ffc556ce2ddcc02d39db9959ec3ea96509b56f0..9238f0f241a8cd8846b41bf247c7b3386ee439c1 100644 (file)
@@ -83,6 +83,17 @@ int Player::getPosition()
        return position;
 }
 
+void Player::setPosition(int position, SeekCompleteCallback callback)
+{
+       player_set_play_position(m_Player, position, true, [](void *data) {
+               SeekCompleteCallback *callback = (SeekCompleteCallback *)data;
+               if (*callback) {
+                       (*callback)();
+               }
+               delete callback;
+       }, new SeekCompleteCallback(std::move(callback)));
+}
+
 void Player::onCompleted()
 {
        if (m_OnCompleted) {
index 55467134c9cb781cc0a2175f255bc9f7a7cf0f18..3e36e88f276b69e0d78a2f8a5901f8c132c73c4a 100644 (file)
@@ -132,11 +132,17 @@ namespace Input
                void showDeletePopup();
                std::string formatTime(int time);
 
+               void onSliderDragStarted(Evas_Object *slider, void *eventInfo);
+               void onSliderDragStoped(Evas_Object *slider, void *eventInfo);
+               void onSliderChanged(Evas_Object *slider, void *eventInfo);
+               int getSliderPosition();
+
                std::string m_Path;
                Mode m_Mode;
                Evas_Object *m_RecordBtn;
                Evas_Object *m_PlayBtn;
                Evas_Object *m_Slider;
+               bool m_IsSliderDragging;
                Common::Recorder *m_Recorder;
                Common::Player *m_Player;
                Ecore_Timer *m_PlayTimer;
index 5174acf387b7e20dcbd578fe1232a6e2e2426752..806cea955e7af4a301b96ecec840b9c53ccc0805 100644 (file)
@@ -48,6 +48,7 @@ RecordField::RecordField(std::string path, Mode mode)
        , m_RecordBtn(nullptr)
        , m_PlayBtn(nullptr)
        , m_Slider(nullptr)
+       , m_IsSliderDragging(false)
        , m_Recorder(nullptr)
        , m_Player(nullptr)
        , m_PlayTimer(nullptr)
@@ -208,6 +209,9 @@ Evas_Object *RecordField::createPlayBtn(Evas_Object *parent)
 Evas_Object *RecordField::createSlider(Evas_Object *parent)
 {
        m_Slider = elm_slider_add(parent);
+       evas_object_smart_callback_add(m_Slider, "slider,drag,start", makeCallback(&RecordField::onSliderDragStarted), this);
+       evas_object_smart_callback_add(m_Slider, "slider,drag,stop", makeCallback(&RecordField::onSliderDragStoped), this);
+       evas_object_smart_callback_add(m_Slider, "changed", makeCallback(&RecordField::onSliderChanged), this);
 
        m_PlayTimer = ecore_timer_add(0.1, makeCallback(&RecordField::onPlaying), this);
        ecore_timer_freeze(m_PlayTimer);
@@ -215,6 +219,29 @@ Evas_Object *RecordField::createSlider(Evas_Object *parent)
        return m_Slider;
 }
 
+void RecordField::onSliderDragStarted(Evas_Object *slider, void *eventInfo)
+{
+       m_IsSliderDragging = true;
+}
+
+void RecordField::onSliderDragStoped(Evas_Object *slider, void *eventInfo)
+{
+       m_Player->setPosition(getSliderPosition(), [this]() {
+               elm_layout_text_set(getEvasObject(), PART_SLIDER_LEFT_TEXT, formatTime(m_Player->getPosition()).c_str());
+       });
+       m_IsSliderDragging = false;
+}
+
+void RecordField::onSliderChanged(Evas_Object *slider, void *eventInfo)
+{
+       elm_layout_text_set(getEvasObject(), PART_SLIDER_LEFT_TEXT, formatTime(getSliderPosition()).c_str());
+}
+
+int RecordField::getSliderPosition()
+{
+       return (int)(elm_slider_value_get(m_Slider) * m_Player->getDuration());
+}
+
 void RecordField::stop()
 {
        elm_object_signal_emit(getEvasObject(), SIGNAL_BTN_STOP_HIDE, "*");
@@ -322,8 +349,10 @@ void RecordField::onPlayPausePressed()
 
 Eina_Bool RecordField::onPlaying()
 {
-       elm_slider_value_set(m_Slider, (double)m_Player->getPosition()/(double)m_Player->getDuration());
-       elm_layout_text_set(getEvasObject(), PART_SLIDER_LEFT_TEXT, formatTime(m_Player->getPosition()).c_str());
+       if (!m_IsSliderDragging) {
+               elm_slider_value_set(m_Slider, (double)m_Player->getPosition() / (double)m_Player->getDuration());
+               elm_layout_text_set(getEvasObject(), PART_SLIDER_LEFT_TEXT, formatTime(m_Player->getPosition()).c_str());
+       }
        return EINA_TRUE;
 }