preferencesAboutTextFull
commit
ca0203056a
@ -1,65 +0,0 @@ |
|||||||
#include <QPainter> |
|
||||||
#include <QDebug> |
|
||||||
|
|
||||||
#include "UBActionableWidget.h" |
|
||||||
|
|
||||||
UBActionableWidget::UBActionableWidget(QWidget *parent, const char *name):QWidget(parent) |
|
||||||
, mShowActions(false) |
|
||||||
{ |
|
||||||
setObjectName(name); |
|
||||||
mActions.clear(); |
|
||||||
mCloseButtons.setIcon(QIcon(QPixmap(":images/close.svg"))); |
|
||||||
mCloseButtons.setGeometry(0, 0, 2*ACTIONSIZE, ACTIONSIZE); |
|
||||||
mCloseButtons.setVisible(false); |
|
||||||
connect(&mCloseButtons, SIGNAL(clicked()), this, SLOT(onCloseClicked())); |
|
||||||
} |
|
||||||
|
|
||||||
UBActionableWidget::~UBActionableWidget() |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::addAction(eAction act) |
|
||||||
{ |
|
||||||
if(!mActions.contains(act)){ |
|
||||||
mActions << act; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::removeAction(eAction act) |
|
||||||
{ |
|
||||||
if(mActions.contains(act)){ |
|
||||||
mActions.remove(mActions.indexOf(act)); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::removeAllActions() |
|
||||||
{ |
|
||||||
mActions.clear(); |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::setActionsVisible(bool bVisible) |
|
||||||
{ |
|
||||||
if(!mActions.empty() && mActions.contains(eAction_Close)){ |
|
||||||
mCloseButtons.setVisible(bVisible); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::onCloseClicked() |
|
||||||
{ |
|
||||||
emit close(this); |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::setActionsParent(QWidget *parent) |
|
||||||
{ |
|
||||||
if(mActions.contains(eAction_Close)){ |
|
||||||
mCloseButtons.setParent(parent); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBActionableWidget::unsetActionsParent() |
|
||||||
{ |
|
||||||
if(mActions.contains(eAction_Close)){ |
|
||||||
mCloseButtons.setParent(this); |
|
||||||
} |
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
#ifndef UBACTIONABLEWIDGET_H |
|
||||||
#define UBACTIONABLEWIDGET_H |
|
||||||
|
|
||||||
#include <QWidget> |
|
||||||
#include <QPaintEvent> |
|
||||||
#include <QToolButton> |
|
||||||
#include <QPushButton> |
|
||||||
|
|
||||||
#define ACTIONSIZE 16 |
|
||||||
|
|
||||||
typedef enum{ |
|
||||||
eAction_Close, |
|
||||||
eAction_MoveUp, |
|
||||||
eAction_MoveDown |
|
||||||
}eAction; |
|
||||||
|
|
||||||
class UBActionableWidget : public QWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
public: |
|
||||||
UBActionableWidget(QWidget* parent=0, const char* name="UBActionableWidget"); |
|
||||||
~UBActionableWidget(); |
|
||||||
void addAction(eAction act); |
|
||||||
void removeAction(eAction act); |
|
||||||
void removeAllActions(); |
|
||||||
void setActionsVisible(bool bVisible); |
|
||||||
|
|
||||||
signals: |
|
||||||
void close(QWidget* w); |
|
||||||
|
|
||||||
protected: |
|
||||||
void setActionsParent(QWidget* parent); |
|
||||||
void unsetActionsParent(); |
|
||||||
QVector<eAction> mActions; |
|
||||||
QPushButton mCloseButtons; |
|
||||||
|
|
||||||
private slots: |
|
||||||
void onCloseClicked(); |
|
||||||
|
|
||||||
private: |
|
||||||
bool mShowActions; |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBACTIONABLEWIDGET_H
|
|
@ -1,39 +0,0 @@ |
|||||||
#include <QMimeData> |
|
||||||
#include <QDrag> |
|
||||||
#include <QUrl> |
|
||||||
|
|
||||||
#include "UBDraggableLabel.h" |
|
||||||
|
|
||||||
|
|
||||||
UBDraggableLabel::UBDraggableLabel(QWidget *parent) : |
|
||||||
QLabel(parent) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
UBDraggableLabel::~UBDraggableLabel() |
|
||||||
{ |
|
||||||
//NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
void UBDraggableLabel::loadImage(QString imagePath) |
|
||||||
{ |
|
||||||
mSourcePath = imagePath; |
|
||||||
QPixmap pix = QPixmap(mSourcePath); |
|
||||||
setPixmap(pix); |
|
||||||
setScaledContents(true); |
|
||||||
} |
|
||||||
|
|
||||||
void UBDraggableLabel::mousePressEvent(QMouseEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event); |
|
||||||
QMimeData *mimeData = new QMimeData; |
|
||||||
QList<QUrl> urls; |
|
||||||
urls << QUrl::fromLocalFile(mSourcePath); |
|
||||||
mimeData->setUrls(urls); |
|
||||||
mimeData->setText(mSourcePath); |
|
||||||
|
|
||||||
|
|
||||||
QDrag *drag = new QDrag(this); |
|
||||||
drag->setMimeData(mimeData); |
|
||||||
drag->start(); |
|
||||||
} |
|
@ -1,23 +0,0 @@ |
|||||||
#ifndef UBDRAGGABLELABEL_H |
|
||||||
#define UBDRAGGABLELABEL_H |
|
||||||
|
|
||||||
#include <QLabel> |
|
||||||
|
|
||||||
class UBDraggableLabel : public QLabel |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
public: |
|
||||||
UBDraggableLabel(QWidget *parent = 0); |
|
||||||
~UBDraggableLabel(); |
|
||||||
void loadImage(QString imagePath); |
|
||||||
signals: |
|
||||||
|
|
||||||
public slots: |
|
||||||
|
|
||||||
protected: |
|
||||||
QString mSourcePath; |
|
||||||
void mousePressEvent(QMouseEvent *event); |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBDRAGGABLELABEL_H
|
|
@ -1,42 +0,0 @@ |
|||||||
#include <QApplication> |
|
||||||
#include <QUrl> |
|
||||||
|
|
||||||
#include "UBDraggableMedia.h" |
|
||||||
|
|
||||||
UBDraggableMedia::UBDraggableMedia(eMediaType type, QWidget *parent, const char *name):UBMediaWidget(type, parent, name) |
|
||||||
{ |
|
||||||
removeAllActions(); |
|
||||||
} |
|
||||||
|
|
||||||
UBDraggableMedia::~UBDraggableMedia() |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
void UBDraggableMedia::mousePressEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
if(Qt::LeftButton == ev->button()){ |
|
||||||
mDragStartPos = ev->pos(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBDraggableMedia::mouseMoveEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
if(!(ev->buttons() & Qt::LeftButton)){ |
|
||||||
return; |
|
||||||
} |
|
||||||
if((ev->pos() - mDragStartPos).manhattanLength() < QApplication::startDragDistance()){ |
|
||||||
return; |
|
||||||
} |
|
||||||
QDrag *drag = new QDrag(this); |
|
||||||
QMimeData *mimeData = new QMimeData; |
|
||||||
|
|
||||||
QList<QUrl> urls; |
|
||||||
urls << QUrl(mFilePath); |
|
||||||
mimeData->setText(mFilePath); |
|
||||||
mimeData->setUrls(urls); |
|
||||||
|
|
||||||
drag->setMimeData(mimeData); |
|
||||||
|
|
||||||
drag->exec(Qt::CopyAction | Qt::MoveAction); |
|
||||||
} |
|
@ -1,19 +0,0 @@ |
|||||||
#ifndef UBDRAGGABLEMEDIA_H |
|
||||||
#define UBDRAGGABLEMEDIA_H |
|
||||||
|
|
||||||
#include "UBMediaWidget.h" |
|
||||||
|
|
||||||
class UBDraggableMedia : public UBMediaWidget |
|
||||||
{ |
|
||||||
public: |
|
||||||
UBDraggableMedia(eMediaType type = eMediaType_Video, QWidget* parent=0, const char* name="UBDraggableMedia"); |
|
||||||
~UBDraggableMedia(); |
|
||||||
protected: |
|
||||||
void mousePressEvent(QMouseEvent* ev); |
|
||||||
void mouseMoveEvent(QMouseEvent* ev); |
|
||||||
|
|
||||||
private: |
|
||||||
QPoint mDragStartPos; |
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBDRAGGABLEMEDIA_H
|
|
@ -1,335 +0,0 @@ |
|||||||
/*
|
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU General Public License as published by |
|
||||||
* the Free Software Foundation, either version 3 of the License, or |
|
||||||
* (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
#include "core/UBApplication.h" |
|
||||||
#include "globals/UBGlobals.h" |
|
||||||
#include "UBMediaWidget.h" |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Constructor |
|
||||||
* @param type as the media type |
|
||||||
* @param parent as the parent widget |
|
||||||
* @param name as the object name |
|
||||||
*/ |
|
||||||
UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name):UBActionableWidget(parent, name) |
|
||||||
, mpMediaObject(NULL) |
|
||||||
, mpVideoWidget(NULL) |
|
||||||
, mpAudioOutput(NULL) |
|
||||||
, mpPlayStopButton(NULL) |
|
||||||
, mpPauseButton(NULL) |
|
||||||
, mpSlider(NULL) |
|
||||||
, mAutoUpdate(false) |
|
||||||
, mGeneratingThumbnail(false) |
|
||||||
, mBorder(5) |
|
||||||
, mpMediaContainer(NULL) |
|
||||||
, mpCover(NULL) |
|
||||||
{ |
|
||||||
setAttribute(Qt::WA_StyledBackground, true); |
|
||||||
setStyleSheet(UBApplication::globalStyleSheet()); |
|
||||||
|
|
||||||
addAction(eAction_Close); |
|
||||||
mType = type; |
|
||||||
setLayout(&mLayout); |
|
||||||
|
|
||||||
mpPlayStopButton = new UBMediaButton(this); |
|
||||||
mpPlayStopButton->setPixmap(QPixmap(":images/play.svg")); |
|
||||||
mpPauseButton = new UBMediaButton(this); |
|
||||||
mpPauseButton->setPixmap(QPixmap(":images/pause.svg")); |
|
||||||
mpPauseButton->setEnabled(false); |
|
||||||
mpSlider = new QSlider(this); |
|
||||||
mpSlider->setOrientation(Qt::Horizontal); |
|
||||||
mpSlider->setMinimum(0); |
|
||||||
mpSlider->setMaximum(0); |
|
||||||
|
|
||||||
mSeekerLayout.addWidget(mpPlayStopButton, 0); |
|
||||||
mSeekerLayout.addWidget(mpPauseButton, 0); |
|
||||||
mSeekerLayout.addWidget(mpSlider, 1); |
|
||||||
mSeekerLayout.setContentsMargins(0, 0, 0, 0); |
|
||||||
|
|
||||||
connect(mpPlayStopButton, SIGNAL(clicked()), this, SLOT(onPlayStopClicked())); |
|
||||||
connect(mpPauseButton, SIGNAL(clicked()), this, SLOT(onPauseClicked())); |
|
||||||
connect(mpSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int))); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Destructor |
|
||||||
*/ |
|
||||||
UBMediaWidget::~UBMediaWidget() |
|
||||||
{ |
|
||||||
unsetActionsParent(); |
|
||||||
DELETEPTR(mpSlider); |
|
||||||
DELETEPTR(mpPauseButton); |
|
||||||
DELETEPTR(mpPlayStopButton); |
|
||||||
DELETEPTR(mpAudioOutput); |
|
||||||
DELETEPTR(mpVideoWidget); |
|
||||||
DELETEPTR(mpMediaObject); |
|
||||||
DELETEPTR(mpCover); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Set the media file |
|
||||||
* @param filePath as the media file path |
|
||||||
*/ |
|
||||||
void UBMediaWidget::setFile(const QString &filePath) |
|
||||||
{ |
|
||||||
Q_ASSERT("" != filePath); |
|
||||||
mFilePath = filePath; |
|
||||||
mpMediaObject = new Phonon::MediaObject(this); |
|
||||||
mpMediaObject->setTickInterval(TICK_INTERVAL); |
|
||||||
connect(mpMediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(onStateChanged(Phonon::State,Phonon::State))); |
|
||||||
connect(mpMediaObject, SIGNAL(totalTimeChanged(qint64)), this, SLOT(onTotalTimeChanged(qint64))); |
|
||||||
connect(mpMediaObject, SIGNAL(tick(qint64)), this, SLOT(onTick(qint64))); |
|
||||||
mpMediaObject->setCurrentSource(Phonon::MediaSource(filePath)); |
|
||||||
createMediaPlayer(); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Get the media type |
|
||||||
* @returns the media type |
|
||||||
*/ |
|
||||||
eMediaType UBMediaWidget::mediaType() |
|
||||||
{ |
|
||||||
return mType; |
|
||||||
} |
|
||||||
|
|
||||||
void UBMediaWidget::showEvent(QShowEvent* event) |
|
||||||
{ |
|
||||||
if(!mpVideoWidget){ |
|
||||||
mpVideoWidget = new Phonon::VideoWidget(this); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
mMediaLayout.addWidget(mpVideoWidget, 0); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
Phonon::createPath(mpMediaObject, mpVideoWidget); |
|
||||||
adaptSizeToVideo(); |
|
||||||
mpMediaObject->play(); |
|
||||||
mpMediaObject->stop(); |
|
||||||
} |
|
||||||
QWidget::showEvent(event); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Create the media player |
|
||||||
*/ |
|
||||||
void UBMediaWidget::createMediaPlayer() |
|
||||||
{ |
|
||||||
mpMediaContainer = new QWidget(this); |
|
||||||
mpMediaContainer->setObjectName("UBMediaVideoContainer"); |
|
||||||
mpMediaContainer->setLayout(&mMediaLayout); |
|
||||||
|
|
||||||
if(eMediaType_Video == mType){ |
|
||||||
mMediaLayout.setContentsMargins(10, 10, 25, 10); |
|
||||||
if(isVisible()){ |
|
||||||
mpVideoWidget = new Phonon::VideoWidget(this); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
mMediaLayout.addWidget(mpVideoWidget, 0); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
Phonon::createPath(mpMediaObject, mpVideoWidget); |
|
||||||
adaptSizeToVideo(); |
|
||||||
} |
|
||||||
mpAudioOutput = new Phonon::AudioOutput(Phonon::VideoCategory, this); |
|
||||||
Phonon::createPath(mpMediaObject, mpAudioOutput); |
|
||||||
}else if(eMediaType_Audio == mType){ |
|
||||||
mMediaLayout.setContentsMargins(10, 10, 10, 10); |
|
||||||
mpCover = new QLabel(mpMediaContainer); |
|
||||||
mpMediaContainer->setStyleSheet(QString("background: none;")); |
|
||||||
setAudioCover(":images/libpalette/soundIcon.svg"); |
|
||||||
mpCover->setScaledContents(true); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
mMediaLayout.addWidget(mpCover, 0); |
|
||||||
mMediaLayout.addStretch(1); |
|
||||||
mpAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); |
|
||||||
Phonon::createPath(mpMediaObject, mpAudioOutput); |
|
||||||
} |
|
||||||
mLayout.addWidget(mpMediaContainer, 1); |
|
||||||
mLayout.addLayout(&mSeekerLayout, 0); |
|
||||||
setActionsParent(mpMediaContainer); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Adapt the widget size to the video in order to keep the good aspect ratio |
|
||||||
*/ |
|
||||||
void UBMediaWidget::adaptSizeToVideo() |
|
||||||
{ |
|
||||||
if(NULL != mpMediaContainer){ |
|
||||||
int origW = mpMediaContainer->width(); |
|
||||||
int origH = mpMediaContainer->height(); |
|
||||||
int newW = width(); |
|
||||||
float scaleFactor = (float)origW/(float)newW; |
|
||||||
int newH = origH/scaleFactor; |
|
||||||
resize(newW, height() + newH); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handle the media state change notification |
|
||||||
* @param newState as the new state |
|
||||||
* @param oldState as the old state |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onStateChanged(Phonon::State newState, Phonon::State oldState) |
|
||||||
{ |
|
||||||
if(!mGeneratingThumbnail){ |
|
||||||
if(Phonon::LoadingState == oldState && Phonon::StoppedState == newState){ |
|
||||||
if(eMediaType_Video == mType){ |
|
||||||
// We do that here to generate the thumbnail of the video
|
|
||||||
mGeneratingThumbnail = true; |
|
||||||
mpMediaObject->play(); |
|
||||||
mpMediaObject->pause(); |
|
||||||
mGeneratingThumbnail = false; |
|
||||||
} |
|
||||||
}else if(Phonon::PlayingState == oldState && Phonon::PausedState == newState){ |
|
||||||
mpPlayStopButton->setPixmap(QPixmap(":images/play.svg")); |
|
||||||
mpPauseButton->setEnabled(false); |
|
||||||
}else if((Phonon::PausedState == oldState && Phonon::PlayingState == newState) || |
|
||||||
(Phonon::StoppedState == oldState && Phonon::PlayingState == newState)){ |
|
||||||
mpPlayStopButton->setPixmap(QPixmap(":images/stop.svg")); |
|
||||||
mpPauseButton->setEnabled(true); |
|
||||||
}else if(Phonon::PlayingState == oldState && Phonon::StoppedState == newState){ |
|
||||||
mpPlayStopButton->setPixmap(QPixmap(":images/play.svg")); |
|
||||||
mpPauseButton->setEnabled(false); |
|
||||||
mpSlider->setValue(0); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the total time change notification |
|
||||||
* @param total as the new total time |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onTotalTimeChanged(qint64 total) |
|
||||||
{ |
|
||||||
mpSlider->setMaximum(total); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the tick notification |
|
||||||
* @param currentTime as the current time |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onTick(qint64 currentTime) |
|
||||||
{ |
|
||||||
mAutoUpdate = true; |
|
||||||
mpSlider->setValue((int)currentTime); |
|
||||||
mAutoUpdate = false; |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the seeker value change notification |
|
||||||
* @param value as the new seeker value |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onSliderChanged(int value) |
|
||||||
{ |
|
||||||
if(!mAutoUpdate){ |
|
||||||
mpMediaObject->seek(value); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Toggle Play-Stop |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onPlayStopClicked() |
|
||||||
{ |
|
||||||
switch(mpMediaObject->state()){ |
|
||||||
case Phonon::PlayingState: |
|
||||||
mpMediaObject->stop(); |
|
||||||
break; |
|
||||||
|
|
||||||
case Phonon::StoppedState: |
|
||||||
case Phonon::PausedState: |
|
||||||
mpMediaObject->play(); |
|
||||||
break; |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Pause the media |
|
||||||
*/ |
|
||||||
void UBMediaWidget::onPauseClicked() |
|
||||||
{ |
|
||||||
mpMediaObject->pause(); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the border |
|
||||||
* @returns the actual border |
|
||||||
*/ |
|
||||||
int UBMediaWidget::border() |
|
||||||
{ |
|
||||||
return mBorder; |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the resize event |
|
||||||
* @param ev as the resize event |
|
||||||
*/ |
|
||||||
void UBMediaWidget::resizeEvent(QResizeEvent* ev) |
|
||||||
{ |
|
||||||
Q_UNUSED(ev); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Set the audio cover |
|
||||||
* @param coverPath as the cover image file path |
|
||||||
*/ |
|
||||||
void UBMediaWidget::setAudioCover(const QString &coverPath) |
|
||||||
{ |
|
||||||
if(NULL != mpCover){ |
|
||||||
mpCover->setPixmap(QPixmap(coverPath)); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* \brief Constructor |
|
||||||
* @param parent as the parent widget |
|
||||||
* @param name as the object name |
|
||||||
*/ |
|
||||||
UBMediaButton::UBMediaButton(QWidget *parent, const char *name):QLabel(parent) |
|
||||||
, mPressed(false) |
|
||||||
{ |
|
||||||
setObjectName(name); |
|
||||||
resize(UBMEDIABUTTON_SIZE, UBMEDIABUTTON_SIZE); |
|
||||||
setStyleSheet(QString("padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;")); |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Destructor |
|
||||||
*/ |
|
||||||
UBMediaButton::~UBMediaButton() |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the mouse press notification |
|
||||||
* @param ev as the mouse press event |
|
||||||
*/ |
|
||||||
void UBMediaButton::mousePressEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
Q_UNUSED(ev); |
|
||||||
mPressed = true; |
|
||||||
} |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Handles the mouse release notification |
|
||||||
* @param ev as the mouse release event |
|
||||||
*/ |
|
||||||
void UBMediaButton::mouseReleaseEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
Q_UNUSED(ev); |
|
||||||
if(mPressed){ |
|
||||||
mPressed = false; |
|
||||||
emit clicked(); |
|
||||||
} |
|
||||||
} |
|
@ -1,127 +0,0 @@ |
|||||||
/*
|
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU General Public License as published by |
|
||||||
* the Free Software Foundation, either version 3 of the License, or |
|
||||||
* (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
#ifndef UBMEDIAWIDGET_H |
|
||||||
#define UBMEDIAWIDGET_H |
|
||||||
|
|
||||||
#include <QWidget> |
|
||||||
#include <QVBoxLayout> |
|
||||||
#include <QHBoxLayout> |
|
||||||
#include <QLabel> |
|
||||||
#include <QSlider> |
|
||||||
#include <QMouseEvent> |
|
||||||
|
|
||||||
#include <phonon/MediaObject> |
|
||||||
#include <phonon/VideoWidget> |
|
||||||
#include <phonon/AudioOutput> |
|
||||||
|
|
||||||
#include "interfaces/IResizeable.h" |
|
||||||
#include "UBActionableWidget.h" |
|
||||||
|
|
||||||
#define UBMEDIABUTTON_SIZE 32 |
|
||||||
#define TICK_INTERVAL 1000 |
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief The media type |
|
||||||
*/ |
|
||||||
typedef enum{ |
|
||||||
eMediaType_Video, |
|
||||||
eMediaType_Audio |
|
||||||
}eMediaType; |
|
||||||
|
|
||||||
class UBMediaButton : public QLabel |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
public: |
|
||||||
UBMediaButton(QWidget* parent=0, const char* name="UBMediaButton"); |
|
||||||
~UBMediaButton(); |
|
||||||
|
|
||||||
signals: |
|
||||||
void clicked(); |
|
||||||
|
|
||||||
protected: |
|
||||||
void mousePressEvent(QMouseEvent* ev); |
|
||||||
void mouseReleaseEvent(QMouseEvent* ev); |
|
||||||
|
|
||||||
private: |
|
||||||
/** And indicator of the press event in progress */ |
|
||||||
bool mPressed; |
|
||||||
}; |
|
||||||
|
|
||||||
class UBMediaWidget : public UBActionableWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
public: |
|
||||||
UBMediaWidget(eMediaType type = eMediaType_Video, QWidget* parent=0, const char* name="UBMediaWidget"); |
|
||||||
~UBMediaWidget(); |
|
||||||
void setFile(const QString& filePath); |
|
||||||
eMediaType mediaType(); |
|
||||||
int border(); |
|
||||||
void setAudioCover(const QString& coverPath); |
|
||||||
void setUrl(const QString& url){mUrl = url;} |
|
||||||
QString url(){return mUrl;} |
|
||||||
|
|
||||||
protected: |
|
||||||
void resizeEvent(QResizeEvent* ev); |
|
||||||
void showEvent(QShowEvent* event); |
|
||||||
/** The current media file path */ |
|
||||||
QString mFilePath; |
|
||||||
|
|
||||||
private slots: |
|
||||||
void onPlayStopClicked(); |
|
||||||
void onPauseClicked(); |
|
||||||
void onStateChanged(Phonon::State newState, Phonon::State oldState); |
|
||||||
void onTotalTimeChanged(qint64 total); |
|
||||||
void onTick(qint64 currentTime); |
|
||||||
void onSliderChanged(int value); |
|
||||||
|
|
||||||
private: |
|
||||||
void createMediaPlayer(); |
|
||||||
void adaptSizeToVideo(); |
|
||||||
|
|
||||||
/** The current media type */ |
|
||||||
eMediaType mType; |
|
||||||
/** The media object */ |
|
||||||
Phonon::MediaObject* mpMediaObject; |
|
||||||
/** The video renderer */ |
|
||||||
Phonon::VideoWidget* mpVideoWidget; |
|
||||||
/** The audio renderer */ |
|
||||||
Phonon::AudioOutput* mpAudioOutput; |
|
||||||
/** The principal layout of this widget */ |
|
||||||
QVBoxLayout mLayout; |
|
||||||
/** The seeker layout */ |
|
||||||
QHBoxLayout mSeekerLayout; |
|
||||||
/** The play-stop button */ |
|
||||||
UBMediaButton* mpPlayStopButton; |
|
||||||
/** The pause button */ |
|
||||||
UBMediaButton* mpPauseButton; |
|
||||||
/** The seeker slider */ |
|
||||||
QSlider* mpSlider; |
|
||||||
/** An indicator of the seeker auto update in progress */ |
|
||||||
bool mAutoUpdate; |
|
||||||
/** An indicator of the thumbnail generation in progress */ |
|
||||||
bool mGeneratingThumbnail; |
|
||||||
/** The border */ |
|
||||||
int mBorder; |
|
||||||
/** A widget that will contain the media */ |
|
||||||
QWidget* mpMediaContainer; |
|
||||||
/** The media layout */ |
|
||||||
QHBoxLayout mMediaLayout; |
|
||||||
/** The audio cover */ |
|
||||||
QLabel* mpCover; |
|
||||||
/** The media url */ |
|
||||||
QString mUrl; |
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBMEDIAWIDGET_H
|
|
@ -1,229 +0,0 @@ |
|||||||
#include <QDebug> |
|
||||||
#include <QScrollBar> |
|
||||||
#include <QApplication> |
|
||||||
#include <QPainter> |
|
||||||
|
|
||||||
#include "globals/UBGlobals.h" |
|
||||||
#include "UBWidgetList.h" |
|
||||||
|
|
||||||
UBWidgetList::UBWidgetList(QWidget* parent, eWidgetListOrientation orientation, const char* name):QScrollArea(parent) |
|
||||||
, mCanRemove(true) |
|
||||||
, mpLayout(NULL) |
|
||||||
, mpContainer(NULL) |
|
||||||
, mMargin(10) |
|
||||||
, mListElementsSpacing(10) |
|
||||||
, mpEmptyLabel(NULL) |
|
||||||
, mpCurrentWidget(NULL) |
|
||||||
{ |
|
||||||
setObjectName(name); |
|
||||||
mOrientation = orientation; |
|
||||||
mpContainer = new QWidget(this); |
|
||||||
mpEmptyLabel = new QLabel(this); |
|
||||||
mpEmptyLabel->setObjectName("emptyString"); |
|
||||||
mpEmptyLabel->setWordWrap(true); |
|
||||||
mpEmptyLabel->setAlignment(Qt::AlignCenter); |
|
||||||
|
|
||||||
if(eWidgetListOrientation_Vertical == orientation){ |
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
||||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
|
||||||
mpLayout = new QVBoxLayout(mpContainer); |
|
||||||
} |
|
||||||
else{ |
|
||||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
||||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
|
||||||
mpLayout = new QHBoxLayout(mpContainer); |
|
||||||
} |
|
||||||
mpLayout->setContentsMargins(margin(), margin(), margin(), margin()); |
|
||||||
mpContainer->setLayout(mpLayout); |
|
||||||
setWidget(mpContainer); |
|
||||||
} |
|
||||||
|
|
||||||
UBWidgetList::~UBWidgetList() |
|
||||||
{ |
|
||||||
DELETEPTR(mpEmptyLabel); |
|
||||||
DELETEPTR(mpLayout); |
|
||||||
DELETEPTR(mpContainer); |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::addWidget(QWidget *widget) |
|
||||||
{ |
|
||||||
if(NULL != mpLayout && NULL != widget){ |
|
||||||
widget->setParent(mpContainer); |
|
||||||
mpEmptyLabel->setVisible(false); |
|
||||||
mWidgetInfo[widget] = widget->size(); |
|
||||||
updateView(size()); |
|
||||||
mpLayout->addWidget(widget); |
|
||||||
|
|
||||||
// This call is used only to refresh the size of the widgets
|
|
||||||
updateSizes(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::removeWidget(QWidget *widget) |
|
||||||
{ |
|
||||||
if(NULL != mpLayout && NULL != widget){ |
|
||||||
mpLayout->removeWidget(widget); |
|
||||||
mWidgetInfo.remove(widget); |
|
||||||
widget->setVisible(false); |
|
||||||
updateView(size()); |
|
||||||
if(0 == mpLayout->count()){ |
|
||||||
mpEmptyLabel->setVisible(true); |
|
||||||
} |
|
||||||
if(mpCurrentWidget == widget){ |
|
||||||
mpCurrentWidget = NULL; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
int UBWidgetList::scaleWidgets(QSize pSize) |
|
||||||
{ |
|
||||||
// to remove the first spacing that shouldn't be there.
|
|
||||||
int result = -mListElementsSpacing; |
|
||||||
foreach(QWidget* eachWidget, mWidgetInfo.keys()){ |
|
||||||
qreal scaleFactor = 0; |
|
||||||
int newWidgetWidth = pSize.width(); |
|
||||||
int newWidgetHeight = pSize.height(); |
|
||||||
if(eWidgetListOrientation_Vertical == mOrientation){ |
|
||||||
scaleFactor = (float)mWidgetInfo[eachWidget].width() / (float)pSize.width(); |
|
||||||
newWidgetHeight = mWidgetInfo[eachWidget].height()/scaleFactor; |
|
||||||
result += newWidgetHeight; |
|
||||||
eachWidget->setMinimumHeight(newWidgetHeight- 1); |
|
||||||
eachWidget->setMaximumHeight(newWidgetHeight); |
|
||||||
} |
|
||||||
else{ |
|
||||||
scaleFactor = (float)mWidgetInfo[eachWidget].height() / (float)pSize.height(); |
|
||||||
newWidgetWidth = mWidgetInfo[eachWidget].width()/scaleFactor; |
|
||||||
result += newWidgetWidth; |
|
||||||
eachWidget->setMinimumWidth(newWidgetWidth - 1); |
|
||||||
eachWidget->setMaximumWidth(newWidgetWidth); |
|
||||||
} |
|
||||||
//Adding a vertical/horizontal space between each element of the list
|
|
||||||
result += mListElementsSpacing; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::scaleContainer(QSize pSize, int updateValue) |
|
||||||
{ |
|
||||||
if(eWidgetListOrientation_Vertical == mOrientation) |
|
||||||
mpContainer->resize(pSize.width(), updateValue); |
|
||||||
else |
|
||||||
mpContainer->resize(updateValue, pSize.height()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBWidgetList::updateView(QSize pSize) |
|
||||||
{ |
|
||||||
// Widgets on list are resized automatically to fit the mpcontainer.
|
|
||||||
// so if you want to keep the aspect ratio you have to calculate
|
|
||||||
// the sum of the new widget height and give it to the mpContainer.
|
|
||||||
// The container resize will trig the widgets resize and the good
|
|
||||||
// height permits to respect the aspect ratio.
|
|
||||||
int updatedValue = scaleWidgets(pSize); |
|
||||||
scaleContainer(pSize,updatedValue); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void UBWidgetList::resizeEvent(QResizeEvent *ev) |
|
||||||
{ |
|
||||||
Q_UNUSED(ev); |
|
||||||
mpEmptyLabel->setGeometry((width() - mpEmptyLabel->width()) / 2, |
|
||||||
(height() - mpEmptyLabel->height()) /2, |
|
||||||
mpEmptyLabel->width(), |
|
||||||
mpEmptyLabel->height()); |
|
||||||
updateView(size()); |
|
||||||
updateSizes(); |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::mousePressEvent(QMouseEvent *ev) |
|
||||||
{ |
|
||||||
Q_UNUSED(ev); |
|
||||||
if(mCanRemove){ |
|
||||||
QWidget* pWAt = widgetAt(ev->pos()); |
|
||||||
if(NULL != mpCurrentWidget){ |
|
||||||
if(pWAt != mpCurrentWidget){ |
|
||||||
mpCurrentWidget->setActionsVisible(false); |
|
||||||
update(); |
|
||||||
} |
|
||||||
} |
|
||||||
mpCurrentWidget = dynamic_cast<UBActionableWidget*>(pWAt); |
|
||||||
if(NULL != mpCurrentWidget){ |
|
||||||
mpCurrentWidget->setActionsVisible(true); |
|
||||||
update(); |
|
||||||
} |
|
||||||
} |
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
QWidget* UBWidgetList::widgetAt(QPoint p) |
|
||||||
{ |
|
||||||
QWidget* pW = NULL; |
|
||||||
pW = childAt(p); |
|
||||||
if(NULL != pW){ |
|
||||||
do{ |
|
||||||
if( "UBTeacherStudentAction" == pW->objectName() || |
|
||||||
"UBUrlWidget" == pW->objectName() || |
|
||||||
"UBTBMediaPicture" == pW->objectName() || |
|
||||||
"UBMediaWidget" == pW->objectName()){ |
|
||||||
return pW; |
|
||||||
}else{ |
|
||||||
pW = pW->parentWidget(); |
|
||||||
} |
|
||||||
}while(NULL != pW && this != pW); |
|
||||||
} |
|
||||||
|
|
||||||
return pW; |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::updateSizes() |
|
||||||
{ |
|
||||||
// Resize all the widgets
|
|
||||||
foreach(QWidget* eachWidget, mWidgetInfo.keys()){ |
|
||||||
if(NULL != eachWidget){ |
|
||||||
QSize originalSize = mWidgetInfo[eachWidget]; |
|
||||||
int currentWidth = mpContainer->width(); |
|
||||||
int currentHeight = mpContainer->height(); |
|
||||||
if(eWidgetListOrientation_Vertical == mOrientation){ |
|
||||||
if(verticalScrollBar()->isVisible()){ |
|
||||||
currentWidth -= verticalScrollBar()->width(); |
|
||||||
eachWidget->setStyleSheet(QString("margin-right:%0;").arg(verticalScrollBar()->width())); |
|
||||||
} |
|
||||||
float scaleFactor = (float)currentWidth/(float)originalSize.width(); |
|
||||||
currentHeight = originalSize.height()*scaleFactor; |
|
||||||
}else{ |
|
||||||
if(horizontalScrollBar()->isVisible()){ |
|
||||||
currentHeight -= horizontalScrollBar()->height(); |
|
||||||
eachWidget->setStyleSheet(QString("padding-bottom:%0;").arg(horizontalScrollBar()->height())); |
|
||||||
} |
|
||||||
float scaleFactor = (float)currentHeight/(float)originalSize.height(); |
|
||||||
currentWidth = originalSize.width()*scaleFactor; |
|
||||||
} |
|
||||||
|
|
||||||
eachWidget->resize(currentWidth, currentHeight); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::setMargin(int margin) |
|
||||||
{ |
|
||||||
mMargin = margin; |
|
||||||
} |
|
||||||
|
|
||||||
int UBWidgetList::margin() |
|
||||||
{ |
|
||||||
return mMargin; |
|
||||||
} |
|
||||||
|
|
||||||
void UBWidgetList::setEmptyText(const QString &text) |
|
||||||
{ |
|
||||||
if(NULL != mpEmptyLabel){ |
|
||||||
mpEmptyLabel->setText(text); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
bool UBWidgetList::empty() |
|
||||||
{ |
|
||||||
return mWidgetInfo.empty(); |
|
||||||
} |
|
@ -1,69 +0,0 @@ |
|||||||
#ifndef UBWIDGETLIST_H |
|
||||||
#define UBWIDGETLIST_H |
|
||||||
|
|
||||||
#include <QWidget> |
|
||||||
#include <QScrollArea> |
|
||||||
#include <QBoxLayout> |
|
||||||
#include <QVBoxLayout> |
|
||||||
#include <QHBoxLayout> |
|
||||||
#include <QResizeEvent> |
|
||||||
#include <QVector> |
|
||||||
#include <QLabel> |
|
||||||
|
|
||||||
#include "interfaces/IResizeable.h" |
|
||||||
#include "customWidgets/UBActionableWidget.h" |
|
||||||
|
|
||||||
typedef enum{ |
|
||||||
eWidgetListOrientation_Vertical, |
|
||||||
eWidgetListOrientation_Horizontal |
|
||||||
}eWidgetListOrientation; |
|
||||||
|
|
||||||
|
|
||||||
class UBWidgetList : public QScrollArea |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
typedef struct |
|
||||||
{ |
|
||||||
QSize size; |
|
||||||
bool isResizable; |
|
||||||
} sWidgetProperties; |
|
||||||
|
|
||||||
public: |
|
||||||
UBWidgetList(QWidget* parent=0, eWidgetListOrientation orientation = eWidgetListOrientation_Vertical, const char* name = "UBWidgetList"); |
|
||||||
~UBWidgetList(); |
|
||||||
void addWidget(QWidget* widget); |
|
||||||
void removeWidget(QWidget* widget); |
|
||||||
void setMargin(int margin); |
|
||||||
void setEmptyText(const QString& text); |
|
||||||
int margin(); |
|
||||||
bool empty(); |
|
||||||
void setListElementSpacing(int margin) { mListElementsSpacing = margin; } |
|
||||||
int listElementsSpacing() {return mListElementsSpacing; } |
|
||||||
|
|
||||||
signals: |
|
||||||
void closeWidget(QWidget* w); |
|
||||||
|
|
||||||
protected: |
|
||||||
bool mCanRemove; |
|
||||||
|
|
||||||
void resizeEvent(QResizeEvent* ev); |
|
||||||
void mousePressEvent(QMouseEvent* ev); |
|
||||||
|
|
||||||
private: |
|
||||||
QWidget* widgetAt(QPoint p); |
|
||||||
int scaleWidgets(QSize pSize); |
|
||||||
void scaleContainer(QSize pSize, int updateValue); |
|
||||||
void updateView(QSize pSize); |
|
||||||
void updateSizes(); |
|
||||||
QBoxLayout* mpLayout; |
|
||||||
QWidget* mpContainer; |
|
||||||
eWidgetListOrientation mOrientation; |
|
||||||
int mMargin; |
|
||||||
int mListElementsSpacing; |
|
||||||
QMap<QWidget*, QSize> mWidgetInfo; |
|
||||||
QLabel* mpEmptyLabel; |
|
||||||
UBActionableWidget* mpCurrentWidget; |
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBWIDGETLIST_H
|
|
@ -1,13 +0,0 @@ |
|||||||
|
|
||||||
HEADERS += src/customWidgets/UBWidgetList.h \ |
|
||||||
src/customWidgets/UBDraggableLabel.h \ |
|
||||||
src/customWidgets/UBMediaWidget.h \ |
|
||||||
src/globals/UBGlobals.h \ |
|
||||||
src/customWidgets/UBDraggableMedia.h \ |
|
||||||
src/customWidgets/UBActionableWidget.h |
|
||||||
|
|
||||||
SOURCES += src/customWidgets/UBWidgetList.cpp \ |
|
||||||
src/customWidgets/UBDraggableLabel.cpp \ |
|
||||||
src/customWidgets/UBMediaWidget.cpp \ |
|
||||||
src/customWidgets/UBDraggableMedia.cpp \ |
|
||||||
src/customWidgets/UBActionableWidget.cpp |
|
Loading…
Reference in new issue