#include "rm_play_slider.h" #include "rm_slider.h" #include "../fm_dimensions.h" #include "../fm_app_colors.h" #include "fm_layer.h" #include "../core/rm_player.h" #include "../data/rm_video_item_2ch.h" #include #include #include #include "fm_colors.h" RMPlaySlider::RMPlaySlider(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); FMWidgetBackground(this,"slider_frame",0x3a3a3a); layout = new QHBoxLayout(this); layout->setAlignment(Qt::AlignCenter); ZERO_LAYOUT(layout); LAYOUT_SPACE(layout,10,0); currentTimeLabel = new QLabel(this); currentTimeLabel->setAlignment(Qt::AlignCenter); FMLabel(currentTimeLabel,"current_time","Arial",FM_SELECTED_TEXT_COLOR,14,false); currentTimeLabel->setText(ZERO_TIME_STRING); layout->addWidget(currentTimeLabel); currentTimeLabel->setFixedWidth(60); //LAYOUT_SPACE(layout,10,0); slider = new RMSlider(this); slider->setValue(0); //slider->setObjectName("play"); FMSlider(slider,"play_slider",FM_SILDER_COLOR,0x666666); #if (RM_MODEL != RM_MODEL_TYPE_EMT_KR) layout->addWidget(slider); #endif durationLabel = new QLabel(this); durationLabel->setAlignment(Qt::AlignCenter); FMLabel(durationLabel,"duration_time","Arial",FM_COLOR_SLIDER_TEXT,14,false); durationLabel->setText(ZERO_TIME_STRING); durationLabel->setFixedWidth(60); layout->addWidget(durationLabel); #if (RM_MODEL == RM_MODEL_TYPE_EMT_KR) layout->addWidget(slider); #endif //LAYOUT_SPACE(layout,10,0); LAYOUT_SPACE(layout,10,0); RMPlayer* player = RMPlayer::instance(); player->setSlider(slider); connect(player,SIGNAL(positionChanged(qint64,qint64)),SLOT(onPositionChanged(qint64,qint64))); connect(player,SIGNAL(playEvent(PLAY_EVENT,RMVideoItem*)),SLOT(onPlayEvent(PLAY_EVENT,RMVideoItem*))); } void RMPlaySlider::setEnabled(bool bEnabled) { //qInfo() << __FUNCTION__ << __LINE__; // QT 5.12 문제로 보임 disabled 된 경우 QLabel Text 가 번지는 현상 발생 slider->setEnabled(bEnabled); } /* void RMPlaySlider::paintEvent(QPaintEvent *pe) { Q_UNUSED(pe); QStyleOption o; o.initFrom(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this); } */ void RMPlaySlider::onPositionChanged(qint64 position,qint64 duration) { // qInfo() << "onPositionChanged:" << position << " duration:" << duration; // 마지막 초를 표시하기 위해 사용 //qint64 posCeil = ((qint64)(ceil(((double)duration) / 1000.0) * 1000.0)); // 60260 video duration: 59281 qint64 pos = MIN(position,duration); qint64 pos2 = (qint64)(((double)pos) * _itemDurationMSec / ((double)(duration))); // 캡쳐 등에서 시간 동기화를 위해 사용 RMPlayer::instance()->titleSeconds = pos2; //qInfo() << __FUNCTION__ << " video duration:" << _itemDurationMSec << duration << "POS:" << pos << " POS2:" << pos2; currentTimeLabel->setText(RMVideoItem::durationString(pos2,true)); } void RMPlaySlider::onPlayEvent(PLAY_EVENT event,RMVideoItem* item) { if(event == PLAY_DID_LOADED) { if(item == NULL) { return; } //Q_ASSERT(item != NULL); // 로딩이 완료되지 않은 상태에서 slider click 하면 thread lock 이 발생함.. // 50 으로 처리할 경우 다시 발생함. QTimer::singleShot(200,this,SLOT(onEnableSliderDelay())); //playSlider->setEnabled(true); //playSlider->slider->setEnabled(true); //qInfo() << __FUNCTION__ << playSlider->isEnabled(); currentTimeLabel->setText(ZERO_TIME_STRING); durationLabel->setText(item->titleDuration()); _itemDurationMSec = (double)item->durationInMSecs(); } else if (event == PLAY_DID_CLEARED) { setEnabled(false); currentTimeLabel->setText(ZERO_TIME_STRING); durationLabel->setText(ZERO_TIME_STRING); slider->setValue(0); } } void RMPlaySlider::onEnableSliderDelay() { setEnabled(true); }