*/
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.
*/
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);
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;
, m_RecordBtn(nullptr)
, m_PlayBtn(nullptr)
, m_Slider(nullptr)
+ , m_IsSliderDragging(false)
, m_Recorder(nullptr)
, m_Player(nullptr)
, m_PlayTimer(nullptr)
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);
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, "*");
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;
}