diff --git a/ChromiumBasedEditors/videoplayerlib/IconsVideoPlayerLib.qrc b/ChromiumBasedEditors/videoplayerlib/IconsVideoPlayerLib.qrc new file mode 100644 index 00000000..6cd0d2ca --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/IconsVideoPlayerLib.qrc @@ -0,0 +1,46 @@ + + + icons/add-files.png + icons/add-files.svg + icons/add-files-2x.png + icons/add-files-active.png + icons/add-files-active.svg + icons/add-files-active-2x.png + icons/drop-playlist.png + icons/drop-playlist.svg + icons/drop-playlist-2x.png + icons/drop-playlist-active.png + icons/drop-playlist-active.svg + icons/drop-playlist-active-2x.png + icons/fullscreen-on.png + icons/fullscreen-on.svg + icons/fullscreen-on-2x.png + icons/fullscreen-on-active.png + icons/fullscreen-on-active.svg + icons/pause.png + icons/pause.svg + icons/pause-2x.png + icons/pause-active.png + icons/pause-active.svg + icons/pause-active-2x.png + icons/play.png + icons/play.svg + icons/play-2x.png + icons/play-active.png + icons/play-active.svg + icons/play-active-2x.png + icons/playlist.png + icons/playlist.svg + icons/playlist-2x.png + icons/playlist-active.png + icons/playlist-active.svg + icons/playlist-active-2x.png + icons/volume.png + icons/volume.svg + icons/volume-2x.png + icons/volume-active.png + icons/volume-active.svg + icons/volume-active-2x.png + icons/fullscreen-on-active-2x.png + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/add-files-2x.png new file mode 100644 index 00000000..9015486b Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/add-files-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active-2x.png new file mode 100644 index 00000000..6e40f179 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.png b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.png new file mode 100644 index 00000000..9d0bbea1 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.svg new file mode 100644 index 00000000..575004aa --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/add-files-active.svg @@ -0,0 +1,5 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files.png b/ChromiumBasedEditors/videoplayerlib/icons/add-files.png new file mode 100644 index 00000000..fb5660f6 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/add-files.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/add-files.svg b/ChromiumBasedEditors/videoplayerlib/icons/add-files.svg new file mode 100644 index 00000000..9a6c086b --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/add-files.svg @@ -0,0 +1,5 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-2x.png new file mode 100644 index 00000000..1870221a Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active-2x.png new file mode 100644 index 00000000..5f53b0c9 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.png b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.png new file mode 100644 index 00000000..ff900125 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.svg new file mode 100644 index 00000000..4038c916 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist-active.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.png b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.png new file mode 100644 index 00000000..87a2ad02 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.svg b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.svg new file mode 100644 index 00000000..3870b320 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/drop-playlist.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-2x.png new file mode 100644 index 00000000..b1bf0908 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active-2x.png new file mode 100644 index 00000000..f60eabdb Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.png b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.png new file mode 100644 index 00000000..d4cf458a Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.svg new file mode 100644 index 00000000..c9539c0e --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on-active.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.png b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.png new file mode 100644 index 00000000..213b9c21 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.svg b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.svg new file mode 100644 index 00000000..2ba9fbab --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/fullscreen-on.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/pause-2x.png new file mode 100644 index 00000000..45275850 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/pause-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/pause-active-2x.png new file mode 100644 index 00000000..a5be335d Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/pause-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause-active.png b/ChromiumBasedEditors/videoplayerlib/icons/pause-active.png new file mode 100644 index 00000000..2c2fbed3 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/pause-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/pause-active.svg new file mode 100644 index 00000000..6ed506cf --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/pause-active.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause.png b/ChromiumBasedEditors/videoplayerlib/icons/pause.png new file mode 100644 index 00000000..51db542d Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/pause.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/pause.svg b/ChromiumBasedEditors/videoplayerlib/icons/pause.svg new file mode 100644 index 00000000..d3cc67d7 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/pause.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/play-2x.png new file mode 100644 index 00000000..f04745c8 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/play-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/play-active-2x.png new file mode 100644 index 00000000..19258fb4 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/play-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play-active.png b/ChromiumBasedEditors/videoplayerlib/icons/play-active.png new file mode 100644 index 00000000..fd25c29e Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/play-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/play-active.svg new file mode 100644 index 00000000..23ad120f --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/play-active.svg @@ -0,0 +1,5 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play.png b/ChromiumBasedEditors/videoplayerlib/icons/play.png new file mode 100644 index 00000000..12bfb757 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/play.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/play.svg b/ChromiumBasedEditors/videoplayerlib/icons/play.svg new file mode 100644 index 00000000..eaf01c07 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/play.svg @@ -0,0 +1,5 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/playlist-2x.png new file mode 100644 index 00000000..e7b3afa4 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/playlist-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active-2x.png new file mode 100644 index 00000000..0872c9af Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.png b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.png new file mode 100644 index 00000000..71ae8281 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.svg new file mode 100644 index 00000000..527eff2f --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/playlist-active.svg @@ -0,0 +1,6 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist.png b/ChromiumBasedEditors/videoplayerlib/icons/playlist.png new file mode 100644 index 00000000..09afc2bf Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/playlist.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/playlist.svg b/ChromiumBasedEditors/videoplayerlib/icons/playlist.svg new file mode 100644 index 00000000..e17ffcd8 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/playlist.svg @@ -0,0 +1,6 @@ + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/volume-2x.png new file mode 100644 index 00000000..9f0f59d5 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/volume-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume-active-2x.png b/ChromiumBasedEditors/videoplayerlib/icons/volume-active-2x.png new file mode 100644 index 00000000..093abf28 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/volume-active-2x.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume-active.png b/ChromiumBasedEditors/videoplayerlib/icons/volume-active.png new file mode 100644 index 00000000..42360107 Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/volume-active.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume-active.svg b/ChromiumBasedEditors/videoplayerlib/icons/volume-active.svg new file mode 100644 index 00000000..5835005d --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/volume-active.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume.png b/ChromiumBasedEditors/videoplayerlib/icons/volume.png new file mode 100644 index 00000000..f607d99c Binary files /dev/null and b/ChromiumBasedEditors/videoplayerlib/icons/volume.png differ diff --git a/ChromiumBasedEditors/videoplayerlib/icons/volume.svg b/ChromiumBasedEditors/videoplayerlib/icons/volume.svg new file mode 100644 index 00000000..de18aabc --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/icons/volume.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/ChromiumBasedEditors/videoplayerlib/linux_gstreamer_deps.txt b/ChromiumBasedEditors/videoplayerlib/linux_gstreamer_deps.txt new file mode 100644 index 00000000..2d75bd03 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/linux_gstreamer_deps.txt @@ -0,0 +1,16 @@ +# debian +sudo apt-get install libgstreamer1.0 +sudo apt-get install gstreamer1.0-libav +sudo apt-get install gstreamer1.0-plugins-bad +sudo apt-get install gstreamer1.0-plugins-good +sudo apt-get install gstreamer1.0-plugins-ugly + +# centos +yum install gstreamer1 +yum install gstreamer1-plugins-base +yum install gstreamer1-plugins-good +yum install gstreamer1-plugins-ugly-free + +yum -y install epel-release +yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm +yum -y install gstreamer1-libav diff --git a/ChromiumBasedEditors/videoplayerlib/qascvideoview.h b/ChromiumBasedEditors/videoplayerlib/qascvideoview.h new file mode 100644 index 00000000..f33f4c4e --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/qascvideoview.h @@ -0,0 +1,104 @@ +#ifndef QASCIMAGEVIEW_H +#define QASCIMAGEVIEW_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#if defined(BUILD_VIDEO_LIBRARY) +# define VIDEO_LIB_EXPORT Q_DECL_EXPORT +#else +# define VIDEO_LIB_EXPORT Q_DECL_IMPORT +#endif + +namespace NSBaseVideoLibrary +{ + VIDEO_LIB_EXPORT void Init(QObject* parent); + VIDEO_LIB_EXPORT void Destroy(); + VIDEO_LIB_EXPORT void* GetLibrary(); +} + +class QAscVideoView_Private; +class VIDEO_LIB_EXPORT QAscVideoView : public QWidget +{ + Q_OBJECT +public: + explicit QAscVideoView(QWidget *parent, int r, int g, int b); + virtual ~QAscVideoView(); + +public: + virtual void resizeEvent(QResizeEvent* e); + + virtual void paintEvent(QPaintEvent *); + + virtual void dragEnterEvent(QDragEnterEvent *event); + virtual void dropEvent(QDropEvent *event); + + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +#if defined(_LINUX) && !defined(_MAC) + virtual void mouseMoveEvent(QMouseEvent* e); +#endif + + void keyPressEvent(QKeyEvent *event); + bool eventFilter(QObject *watched, QEvent *event); + + virtual bool getMainWindowFullScreen(); + virtual void setMainWindowFullScreen(bool bIsFullScreen); + +public: + void PlayPause(); + void Volume(); + void Fullscreen(); + void Playlist(double duration = 100); + void SavePlayListAddons(const QString& sAddon); + + void AddFilesToPlaylist(QStringList& files, const bool isStart = false); + void LoadPlaylist(); + void SavePlaylist(); + + void setFooterVisible(bool isVisible); + + void setPlayListUsed(bool isUsed); + void setFullScreenUsed(bool isUsed); + void setPresentationMode(bool isPresentationMode); + void setMedia(QString sMedia); + + void Stop(); + +signals: + void OnTitleChanged(const QString& sTitle); + +public slots: + void slotPlayPause(); + void slotVolume(); + void slotFullscreen(); + void slotPlaylist(); + void slotVolumeChanged(int nValue); + void slotSeekChanged(int nValue); + + void slotOpenFile(QString sFile); + + void slotPlayerPosChanged(int nPos); + void slotPlayerStateChanged(QMediaPlayer::State state); + void slotVideoAvailableChanged(bool videoAvailable); + +protected: + void UpdatePlayPause(); + +public: + QAscVideoView_Private* m_pInternal; +}; + +#endif // QASCIMAGEVIEW_H diff --git a/ChromiumBasedEditors/videoplayerlib/src/lib_base.cpp b/ChromiumBasedEditors/videoplayerlib/src/lib_base.cpp new file mode 100644 index 00000000..da9964f9 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/lib_base.cpp @@ -0,0 +1,68 @@ +#include "../qascvideoview.h" +#include "./lib_base.h" + +#ifdef USE_VLC_LIBRARY + +#include + +#include "../../../../core/DesktopEditor/common/File.h" +#include "../../../../core/DesktopEditor/common/Directory.h" + +static VlcInstance* g_vlc_instance = NULL; + +void NSBaseVideoLibrary::Init(QObject* parent) +{ + if (g_vlc_instance) + return; + + if (!parent) + return; + + QCoreApplication::setAttribute(Qt::AA_X11InitThreads); + + std::wstring sProcessDir = NSFile::GetProcessDirectory(); + std::wstring sPluginsDir = sProcessDir + L"/plugins"; + if (!NSDirectory::Exists(sPluginsDir)) + { + std::vector dirs = NSDirectory::GetDirectories(sProcessDir + L"/.."); + for (std::vector::iterator i = dirs.begin(); i != dirs.end(); i++) + { + std::wstring sTest = *i + L"/plugins"; + if (NSDirectory::Exists(sTest)) + { + sPluginsDir = sTest; + break; + } + } + } + + VlcCommon::setPluginPath(QString::fromStdWString(sPluginsDir)); + g_vlc_instance = new VlcInstance(VlcCommon::args(), NULL); +} +void NSBaseVideoLibrary::Destroy() +{ + if (g_vlc_instance) + { + delete g_vlc_instance; + g_vlc_instance = NULL; + } +} +void* NSBaseVideoLibrary::GetLibrary() +{ + return (void*)g_vlc_instance; +} + +#else + +void NSBaseVideoLibrary::Init(QObject* parent) +{ +} +void NSBaseVideoLibrary::Destroy() +{ +} +void* NSBaseVideoLibrary::GetLibrary() +{ + return NULL; +} + +#endif diff --git a/ChromiumBasedEditors/videoplayerlib/src/lib_base.h b/ChromiumBasedEditors/videoplayerlib/src/lib_base.h new file mode 100644 index 00000000..07cc5fd7 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/lib_base.h @@ -0,0 +1,19 @@ +#ifndef QUSE_VLC_BASE_H +#define QUSE_VLC_BASE_H + +#include + +#ifdef USE_VLC_LIBRARY + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif + +#endif // QUSE_VLC_BASE_H diff --git a/ChromiumBasedEditors/videoplayerlib/src/qascvideoview.cpp b/ChromiumBasedEditors/videoplayerlib/src/qascvideoview.cpp new file mode 100644 index 00000000..6f025532 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qascvideoview.cpp @@ -0,0 +1,507 @@ +#include +#include +#include +#include +#include +#include + +#include "../../../../core/DesktopEditor/common/File.h" + +#include "qpushbutton_icons.h" +#include "../qascvideoview.h" +#include "qfooterpanel.h" +#include "qvideoplaylist.h" +#include "qascvideowidget.h" +#include "qvideoslider.h" + +#ifdef USE_VLC_LIBRARY +#ifdef WIN32 +//#define USE_VLC_LIBRARY_VIDEO +#endif +#endif + +#ifdef USE_VLC_LIBRARY_VIDEO + +class QVideoWidgetParent : public QVideoWidget +{ + Q_OBJECT + +public: + QWidget* m_pChild; + +public: + explicit QVideoWidgetParent(QWidget *parent = Q_NULLPTR); + +public: + virtual void resizeEvent(QResizeEvent* event); +}; + +#else + +typedef QWidget QVideoWidgetParent; + +#endif + +#ifdef USE_VLC_LIBRARY_VIDEO + +QVideoWidgetParent::QVideoWidgetParent(QWidget* parent) : QVideoWidget(parent) +{ + m_pChild = NULL; +} + +void QVideoWidgetParent::resizeEvent(QResizeEvent *event) +{ + QVideoWidget::resizeEvent(event); + + if (m_pChild) + m_pChild->setGeometry(0, 0, width(), height()); +} + +#endif + +QAscVideoView::QAscVideoView(QWidget *parent, int r, int g, int b) : QWidget(parent) +{ + NSBaseVideoLibrary::Init(parent); + m_pInternal = new QAscVideoView_Private(); + + QWidget_setBackground(this, 0x22, 0x22, 0x22); + m_pInternal->m_pFooter = new QFooterPanel(this); + QWidget_setBackground(m_pInternal->m_pFooter, r, g, b); + + this->setStyleSheet("QFrame {border: none;}"); + + QWidget* pParentVideo = new QVideoWidgetParent(this); + pParentVideo->setGeometry(0, 0, width(), height()); + + m_pInternal->m_pPlayer = new QAscVideoWidget(pParentVideo); + m_pInternal->m_pPlayer->m_pView = this; + m_pInternal->m_pPlayer->installEventFilter(this); + + m_pInternal->m_pPlaylist = new QVideoPlaylist(this); + m_pInternal->m_pPlaylist->setGeometry(width(), 0, 250, height()); + + QObject::connect(m_pInternal->m_pPlaylist, SIGNAL(fileChanged(QString)), this, SLOT(slotOpenFile(QString))); + + m_pInternal->m_pVolumeControl = new QWidget(this); + m_pInternal->m_pVolumeControl->setHidden(true); + m_pInternal->m_pVolumeControl->setGeometry(0, 0, 60, 160); + m_pInternal->m_pVolumeControl->setStyleSheet("border: none; background-color:#111111"); + + m_pInternal->m_pVolumeControlV = new QVideoSlider(m_pInternal->m_pVolumeControl); + m_pInternal->m_pVolumeControlV->setOrientation(Qt::Vertical); + m_pInternal->m_pVolumeControlV->setGeometry(15, 20, 30, 120); + m_pInternal->m_pVolumeControlV->setMinimum(0); + m_pInternal->m_pVolumeControlV->setMaximum(100); + m_pInternal->m_pVolumeControlV->setValue(50); + QObject::connect(m_pInternal->m_pVolumeControlV, SIGNAL(valueChanged(int)), this, SLOT(slotVolumeChanged(int))); + + // init events + QObject::connect(m_pInternal->m_pFooter->m_pPlayPause, SIGNAL(clicked(bool)), this, SLOT(slotPlayPause())); + QObject::connect(m_pInternal->m_pFooter->m_pVolume, SIGNAL(clicked(bool)), this, SLOT(slotVolume())); + QObject::connect(m_pInternal->m_pFooter->m_pFullscreen, SIGNAL(clicked(bool)), this, SLOT(slotFullscreen())); + QObject::connect(m_pInternal->m_pFooter->m_pPlaylist, SIGNAL(clicked(bool)), this, SLOT(slotPlaylist())); + + QObject::connect(m_pInternal->m_pFooter->m_pSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSeekChanged(int))); + + QObject::connect(m_pInternal->m_pPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(slotPlayerStateChanged(QMediaPlayer::State))); + QObject::connect(m_pInternal->m_pPlayer, SIGNAL(posChanged(int)), this, SLOT(slotPlayerPosChanged(int))); + +#ifndef USE_VLC_LIBRARY + QObject::connect(m_pInternal->m_pPlayer->getEngine(), SIGNAL(videoAvailableChanged(bool)), this, SLOT(slotVideoAvailableChanged(bool))); +#else + +#endif + + setAcceptDrops(true); + +#if defined(_LINUX) && !defined(_MAC) + this->setMouseTracking(true); + m_pInternal->m_pPlayer->setMouseTracking(true); + m_pInternal->m_pPlaylist->setMouseTracking(true); +#endif + + m_pInternal->m_bIsShowingPlaylist = false; + m_pInternal->m_bIsPlay = true; + m_pInternal->m_bIsEnabledPlayList = true; + m_pInternal->m_bIsEnabledFullscreen = true; + m_pInternal->m_bIsPresentationMode = false; + m_pInternal->m_bIsPresentationModeMediaTypeSended = false; + m_pInternal->m_bIsDestroy = false; + UpdatePlayPause(); + + m_pInternal->m_bIsSeekEnabled = true; + + m_pInternal->m_pFooter->installEventFilter(this); + m_pInternal->m_pFooter->m_pFullscreen->installEventFilter(this); + m_pInternal->m_pFooter->m_pVolume->installEventFilter(this); + m_pInternal->m_pFooter->m_pPlaylist->installEventFilter(this); + m_pInternal->m_pFooter->m_pSlider->installEventFilter(this); + m_pInternal->m_pFooter->m_pPlayPause->installEventFilter(this); +} + +QAscVideoView::~QAscVideoView() +{ + +} + +void QAscVideoView::resizeEvent(QResizeEvent* e) +{ + QWidget::resizeEvent(e); + + QSize size = this->size(); + double dDpi = QWidget_GetDPI(this); + + int nFooterH = QWidget_ScaleDPI(m_pInternal->m_pFooter->m_nHeigth, dDpi); + if (this->getMainWindowFullScreen()) + nFooterH = 0; + + m_pInternal->m_pFooter->setGeometry(0, size.height() - nFooterH, size.width(), nFooterH); + + int nViewHeight = size.height(); + + if (!m_pInternal->m_bIsPresentationMode) + nViewHeight -= nFooterH; + + m_pInternal->m_pPlayer->parentWidget()->setGeometry(0, 0, width(), nViewHeight); + m_pInternal->m_pPlayer->setGeometry(0, 0, width(), nViewHeight); + + if (m_pInternal->m_bIsPresentationMode) + nViewHeight -= nFooterH; + + int nVolumeVHeight = QWidget_ScaleDPI(160, dDpi); + if (nVolumeVHeight > nViewHeight) + nVolumeVHeight = nViewHeight; + + int nVolumeVHeightSlider = nVolumeVHeight - QWidget_ScaleDPI(40, dDpi); + if (30 > nVolumeVHeightSlider) + nVolumeVHeightSlider = 30; + + m_pInternal->m_pVolumeControl->setGeometry(0, 0, QWidget_ScaleDPI(60, dDpi), nVolumeVHeight); + m_pInternal->m_pVolumeControlV->setGeometry(QWidget_ScaleDPI(15, dDpi), QWidget_ScaleDPI(20, dDpi), QWidget_ScaleDPI(30, dDpi), nVolumeVHeightSlider); + + int nOffsetVolume = QWidget_ScaleDPI(135, dDpi); + if (!m_pInternal->m_bIsEnabledPlayList) + nOffsetVolume -= QWidget_ScaleDPI(35, dDpi); + if (!m_pInternal->m_bIsEnabledFullscreen) + nOffsetVolume -= QWidget_ScaleDPI(35, dDpi); + + m_pInternal->m_pVolumeControl->move(width() - nOffsetVolume, nViewHeight - m_pInternal->m_pVolumeControl->height()); + m_pInternal->m_pVolumeControlV->resizeEvent(NULL); + m_pInternal->m_pPlaylist->setGeometry(m_pInternal->m_bIsShowingPlaylist ? (width() - QWidget_ScaleDPI(250, dDpi)) : width(), 0, QWidget_ScaleDPI(250, dDpi), nViewHeight); +} + +void QAscVideoView::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} + +void QAscVideoView::dragEnterEvent(QDragEnterEvent *event) +{ + QList urls = event->mimeData()->urls(); + + CVideoExt ext; + QSet _exts = ext.getQSet(false); + + for (int i = 0; i < urls.count(); i++) + { + QFileInfo oInfo(urls[i].toString()); + if (_exts.contains(oInfo.suffix().toLower())) + { + event->acceptProposedAction(); + return; + } + } +} + +void QAscVideoView::dropEvent(QDropEvent *event) +{ + QList urls = event->mimeData()->urls(); + + QStringList files; + for (int i = 0; i < urls.count(); i++) + { + files.append(urls[i].toLocalFile()); + } + + m_pInternal->m_pPlaylist->AddFiles(files, true); + event->acceptProposedAction(); +} + +void QAscVideoView::mousePressEvent(QMouseEvent *event) +{ + if (!m_pInternal->m_pVolumeControl->isHidden()) + m_pInternal->m_pVolumeControl->setHidden(true); + + if (event->button() == Qt::LeftButton) + { + if (m_pInternal->m_bIsShowingPlaylist) + Playlist(); + } + + setFocus(); +} + +void QAscVideoView::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + if (m_pInternal->m_bIsPresentationMode) + { + m_pInternal->m_pFooter->setHidden(!m_pInternal->m_pFooter->isHidden()); + if (!m_pInternal->m_pFooter->isHidden()) + { + m_pInternal->m_pFooter->raise(); + } + } + } +} + +#if defined(_LINUX) && !defined(_MAC) +#include +void QAscVideoView::mouseMoveEvent(QMouseEvent* e) +{ + QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); +} +#endif + +void QAscVideoView::keyPressEvent(QKeyEvent *event) +{ + m_pInternal->m_pPlayer->keyPressEvent(event); + Qt::KeyboardModifiers ee = event->modifiers(); + switch (event->key()) + { + case Qt::Key_Left: + { + m_pInternal->m_pFooter->m_pSlider->event(event); + break; + } + case Qt::Key_Right: + { + m_pInternal->m_pFooter->m_pSlider->event(event); + break; + } + default: + break; + } +} + +bool QAscVideoView::eventFilter(QObject *watched, QEvent *event) +{ + if (event->type() == QEvent::KeyPress) + { + this->keyPressEvent((QKeyEvent*)event); + return true; + } + return QWidget::eventFilter(watched, event); +} + +void QAscVideoView::PlayPause() +{ + if (m_pInternal->m_bIsPlay) + m_pInternal->m_pPlayer->setPlay(); + else + m_pInternal->m_pPlayer->setPause(); +} + +void QAscVideoView::Volume() +{ + m_pInternal->m_pVolumeControl->setHidden(!m_pInternal->m_pVolumeControl->isHidden()); +} + +void QAscVideoView::Fullscreen() +{ + m_pInternal->m_pPlayer->setFullScreenOnCurrentScreen(true); +} + +void QAscVideoView::Playlist(double duration) +{ + m_pInternal->m_bIsShowingPlaylist = !m_pInternal->m_bIsShowingPlaylist; + + if (m_pInternal->m_bIsShowingPlaylist) + { + QPropertyAnimation *animation = new QPropertyAnimation(m_pInternal->m_pPlaylist, "pos"); + animation->setDuration(duration); + animation->setStartValue(QPoint(m_pInternal->m_pPlaylist->x(), 0)); + double dDpi = QWidget_GetDPI(this); + animation->setEndValue(QPoint(width() - QWidget_ScaleDPI(250, dDpi), 0)); + animation->start(); + } + else + { + QPropertyAnimation *animation = new QPropertyAnimation(m_pInternal->m_pPlaylist, "pos"); + animation->setDuration(duration); + animation->setStartValue(QPoint(m_pInternal->m_pPlaylist->x(), 0)); + animation->setEndValue(QPoint(width(), 0)); + animation->start(); + } +} + +void QAscVideoView::SavePlayListAddons(const QString& sAddon) +{ + m_pInternal->m_pPlaylist->m_sSavePlayListAddon = sAddon; +} + +void QAscVideoView::AddFilesToPlaylist(QStringList& files, const bool isStart) +{ + m_pInternal->m_pPlaylist->AddFiles(files, isStart); +} + +void QAscVideoView::LoadPlaylist() +{ + m_pInternal->m_pPlaylist->Load(); +} + +void QAscVideoView::SavePlaylist() +{ + m_pInternal->m_pPlaylist->Save(); +} + +void QAscVideoView::setPlayListUsed(bool isUsed) +{ + m_pInternal->m_bIsEnabledPlayList = isUsed; + m_pInternal->m_pFooter->m_bIsEnabledPlayList = isUsed; + + m_pInternal->m_pFooter->m_pPlaylist->setHidden(!isUsed); +} +void QAscVideoView::setFullScreenUsed(bool isUsed) +{ + m_pInternal->m_bIsEnabledFullscreen = isUsed; + m_pInternal->m_pFooter->m_bIsEnabledFullscreen = isUsed; + + m_pInternal->m_pFooter->m_pFullscreen->setHidden(!isUsed); +} +void QAscVideoView::setPresentationMode(bool isPresentationMode) +{ + m_pInternal->m_bIsPresentationMode = isPresentationMode; +} +void QAscVideoView::setMedia(QString sMedia) +{ + QStringList files; + files.append(sMedia); + AddFilesToPlaylist(files, true); +} + +void QAscVideoView::Stop() +{ + m_pInternal->m_bIsDestroy = true; + m_pInternal->m_pPlayer->stop(); +} + +void QAscVideoView::setFooterVisible(bool isVisible) +{ + m_pInternal->m_pFooter->setHidden(!isVisible); +} + +void QAscVideoView::slotPlayPause() +{ + this->PlayPause(); +} + +void QAscVideoView::slotVolume() +{ + this->Volume(); +} + +void QAscVideoView::slotFullscreen() +{ + if (m_pInternal->m_bIsShowingPlaylist) + Playlist(0); + if (!m_pInternal->m_pVolumeControl->isHidden()) + m_pInternal->m_pVolumeControl->setHidden(true); + this->Fullscreen(); +} + +void QAscVideoView::slotPlaylist() +{ + this->Playlist(); +} + +void QAscVideoView::slotVolumeChanged(int nValue) +{ + m_pInternal->m_pPlayer->setVolume(nValue); +} + +void QAscVideoView::slotSeekChanged(int nValue) +{ + if (m_pInternal->m_bIsSeekEnabled) + m_pInternal->m_pPlayer->setSeek(nValue); +} + +void QAscVideoView::UpdatePlayPause() +{ + m_pInternal->m_pFooter->SetPlayPause(m_pInternal->m_bIsPlay); +} + +void QAscVideoView::slotOpenFile(QString sFile) +{ + m_pInternal->m_pPlayer->open(sFile); + + if (sFile == "") + return; + + std::wstring sFileW = sFile.toStdWString(); + std::wstring sFileName = NSFile::GetFileName(sFileW); + emit OnTitleChanged(QString::fromStdWString(sFileName)); +} + +void QAscVideoView::slotPlayerPosChanged(int nPos) +{ + m_pInternal->m_bIsSeekEnabled = false; + m_pInternal->m_pFooter->m_pSlider->setValue(nPos); + m_pInternal->m_bIsSeekEnabled = true; +} + +void QAscVideoView::slotPlayerStateChanged(QMediaPlayer::State state) +{ + m_pInternal->m_bIsPlay = (state == QMediaPlayer::PlayingState) ? false : true; + UpdatePlayPause(); + + if (!m_pInternal->m_bIsPlay) + { + if (!m_pInternal->m_pFooter->isHidden()) + { + m_pInternal->m_pFooter->raise(); + } + +#ifdef USE_VLC_LIBRARY + if (m_pInternal->m_bIsPresentationMode && !m_pInternal->m_bIsPresentationModeMediaTypeSended) + { + m_pInternal->m_bIsPresentationModeMediaTypeSended = true; + if (!m_pInternal->m_pPlayer->isAudio() && !m_pInternal->m_bIsDestroy) + this->show(); + } +#endif + } + + if (state == QMediaPlayer::StoppedState + #ifndef USE_VLC_LIBRARY + && QMediaPlayer::EndOfMedia == m_pInternal->m_pPlayer->getEngine()->mediaStatus() + #endif + ) + + { + m_pInternal->m_pPlaylist->Next(); + } +} + +bool QAscVideoView::getMainWindowFullScreen() +{ + return false; +} +void QAscVideoView::setMainWindowFullScreen(bool bIsFullScreen) +{ + return; +} + +void QAscVideoView::slotVideoAvailableChanged(bool videoAvailable) +{ + if (m_pInternal->m_bIsPresentationMode && !m_pInternal->m_bIsPresentationModeMediaTypeSended) + { + m_pInternal->m_bIsPresentationModeMediaTypeSended = true; + if (!m_pInternal->m_pPlayer->isAudio() && !m_pInternal->m_bIsDestroy) + this->show(); + } +} diff --git a/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.cpp b/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.cpp new file mode 100644 index 00000000..ef5f6465 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.cpp @@ -0,0 +1,359 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../qascvideoview.h" +#include "qascvideowidget.h" + +#include +#include +#include +#include +#include +#include + +#ifdef ASC_MAIN_WINDOW_HAS_QWINDOW_AS_PARENT +#define USE_ASC_MAINWINDOW_FULLSCREEN +#endif + +#ifndef USE_ASC_MAINWINDOW_FULLSCREEN +#ifndef USE_VLC_LIBRARY_VIDEO +#define USE_ASC_MAINWINDOW_FULLSCREEN +#endif +#endif + +QAscVideoWidget::QAscVideoWidget(QWidget *parent) + : QASCVIDEOBASE(parent) +{ + m_pParent = parent; + m_nVolume = 50; + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + + /* + QPalette p = palette(); + p.setColor(QPalette::Window, Qt::black); + setPalette(p); + + setAttribute(Qt::WA_OpaquePaintEvent); + */ + + m_pEngine = NULL; + +#ifdef USE_VLC_LIBRARY + m_pVlcPlayer = NULL; +#endif + +#ifndef USE_VLC_LIBRARY + m_pEngine = new QMediaPlayer(parent); + m_pEngine->setVideoOutput(this); + + QObject::connect(m_pEngine, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(slotChangeState(QMediaPlayer::State))); + QObject::connect(m_pEngine, SIGNAL(positionChanged(qint64)), this, SLOT(slotPositionChange(qint64))); +#else + m_pVlcPlayer = new VlcMediaPlayer((VlcInstance*)NSBaseVideoLibrary::GetLibrary()); + m_pVlcPlayer->setVideoWidget(this); + + QObject::connect(m_pVlcPlayer, SIGNAL(stateChanged()), this, SLOT(slotVlcStateChanged())); + QObject::connect(m_pVlcPlayer, SIGNAL(timeChanged(int)), this, SLOT(slotVlcTimeChanged(int))); + + m_pMedia = NULL; +#endif +} + +QAscVideoWidget::~QAscVideoWidget() +{ +#ifdef USE_VLC_LIBRARY + m_pVlcPlayer->stop(); + m_pVlcPlayer->deleteLater(); +#endif +} + +void QAscVideoWidget::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape && isVideoFullScreen()) + { + setFullScreenOnCurrentScreen(false); + event->accept(); + } + else if (((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) && event->modifiers() & Qt::AltModifier) + { + setFullScreenOnCurrentScreen(!isVideoFullScreen()); + event->accept(); + } + else + { + QASCVIDEOBASE::keyPressEvent(event); + } +} + +void QAscVideoWidget::mouseDoubleClickEvent(QMouseEvent *event) +{ + QAscVideoView* pView = (QAscVideoView*)(m_pParent->parentWidget()); + if (!pView->m_pInternal->m_bIsPresentationMode) + setFullScreenOnCurrentScreen(!isVideoFullScreen()); + event->accept(); +} + +void QAscVideoWidget::mousePressEvent(QMouseEvent *event) +{ + QASCVIDEOBASE::mousePressEvent(event); +} + +#if defined(_LINUX) && !defined(_MAC) +#include +void QAscVideoWidget::mouseMoveEvent(QMouseEvent* e) +{ + QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); +} +#endif + +void QAscVideoWidget::setPlay() +{ +#ifndef USE_VLC_LIBRARY + m_pEngine->play(); +#else + m_pVlcPlayer->play(); +#endif +} + +void QAscVideoWidget::setPause() +{ +#ifndef USE_VLC_LIBRARY + m_pEngine->pause(); +#else + m_pVlcPlayer->pause(); +#endif +} + +void QAscVideoWidget::setVolume(int nVolume) +{ + m_nVolume = nVolume; +#ifndef USE_VLC_LIBRARY + m_pEngine->setVolume(nVolume); +#else + if (m_pVlcPlayer->audio()) + m_pVlcPlayer->audio()->setVolume(nVolume * 2); +#endif +} + +void QAscVideoWidget::setSeek(int nPos) +{ +#ifndef USE_VLC_LIBRARY + qint64 nDuration = m_pEngine->duration(); + double dProgress = (double)nPos / 100000.0; + m_pEngine->setPosition((qint64)(dProgress * nDuration)); +#else + qint64 nDuration = m_pMedia ? m_pMedia->duration() : 0; + double dProgress = (double)nPos / 100000.0; + m_pVlcPlayer->setTime((int)(dProgress * nDuration)); +#endif +} + +void QAscVideoWidget::open(QString& sFile) +{ +#ifndef USE_VLC_LIBRARY + m_pEngine->setMedia(QMediaContent(QUrl::fromLocalFile(sFile))); + m_pEngine->play(); +#else + + if (!m_pMedia && !sFile.isEmpty()) + { + delete m_pMedia; + m_pMedia = NULL; + } + + if (sFile.isEmpty()) + { + m_pVlcPlayer->stop(); + return; + } + + m_pMedia = new VlcMedia(sFile, true, (VlcInstance*)NSBaseVideoLibrary::GetLibrary()); + m_pVlcPlayer->open(m_pMedia); +#endif +} + +bool QAscVideoWidget::isVideoFullScreen() +{ +#ifdef USE_ASC_MAINWINDOW_FULLSCREEN + return ((QAscVideoView*)(m_pParent->parentWidget()))->getMainWindowFullScreen(); +#else + return isFullScreen(); +#endif +} + +void QAscVideoWidget::setFullScreenOnCurrentScreen(bool isFullscreen) +{ + if (isFullscreen == isVideoFullScreen()) + return; + +#ifndef USE_VLC_LIBRARY + +#ifdef USE_ASC_MAINWINDOW_FULLSCREEN + ((QAscVideoView*)(m_pParent->parentWidget()))->setMainWindowFullScreen(isFullscreen); +#else + setFullScreen(isFullscreen); +#endif + +#else + if (isFullscreen) + { +#ifdef USE_VLC_LIBRARY_VIDEO + ((QVideoWidget*)m_pParent)->setFullScreen(true); +#endif + +#ifdef USE_ASC_MAINWINDOW_FULLSCREEN + ((QAscVideoView*)(m_pParent->parentWidget()))->setMainWindowFullScreen(true); +#else + QPoint pt = mapToGlobal(pos()); + QRect rect = QApplication::desktop()->screenGeometry(m_pParent); + + this->setParent(NULL); + this->showFullScreen(); + this->setGeometry(rect); +#endif + } + else + { +#ifdef USE_VLC_LIBRARY_VIDEO + ((QVideoWidget*)m_pParent)->setFullScreen(false); + m_pParent->lower(); +#endif + +#ifdef USE_ASC_MAINWINDOW_FULLSCREEN + ((QAscVideoView*)(m_pParent->parentWidget()))->setMainWindowFullScreen(false); +#else + this->setParent(m_pParent); + showNormal(); + this->lower(); +#endif + + QAscVideoView* pView = (QAscVideoView*)(m_pParent->parentWidget()); + m_pParent->stackUnder(pView->m_pInternal->m_pVolumeControl); + m_pParent->stackUnder(pView->m_pInternal->m_pPlaylist); + pView->m_pInternal->m_pVolumeControl->raise(); + pView->m_pInternal->m_pPlaylist->raise(); + + this->setGeometry(0, 0, m_pParent->width(), m_pParent->height()); + } +#endif + + if (!isFullscreen) + { + ((QAscVideoView*)this->m_pView)->resizeEvent(NULL); + } +} + +void QAscVideoWidget::slotChangeState(QMediaPlayer::State state) +{ + if (QMediaPlayer::PlayingState == state) + setVolume(m_nVolume); + + emit stateChanged(state); +} + +#ifdef USE_VLC_LIBRARY +void QAscVideoWidget::slotVlcStateChanged() +{ + Vlc::State state = m_pVlcPlayer->state(); + int stateQ = -1; + + if (state == Vlc::Playing) + { + stateQ = QMediaPlayer::PlayingState; + setVolume(m_nVolume); + } + else if (state == Vlc::Paused) + stateQ = QMediaPlayer::PausedState; + else if (state == Vlc::Ended) + stateQ = QMediaPlayer::StoppedState; + + if (stateQ < 0) + return; + + emit stateChanged((QMediaPlayer::State)stateQ); +} + +void QAscVideoWidget::slotVlcTimeChanged(int time) +{ + qint64 nDuration = m_pMedia->duration(); + double dProgress = (double)time / nDuration; + emit posChanged((int)(100000 * dProgress + 0.5)); +} +#endif + +void QAscVideoWidget::slotPositionChange(qint64 pos) +{ + qint64 nDuration = m_pEngine->duration(); + double dProgress = (double)pos / nDuration; + emit posChanged((int)(100000 * dProgress + 0.5)); +} + +QMediaPlayer* QAscVideoWidget::getEngine() +{ + return m_pEngine; +} + +bool QAscVideoWidget::isAudio() +{ +#ifdef USE_VLC_LIBRARY + if (!m_pVlcPlayer || !m_pVlcPlayer->video()) + return true; + + if (0 == m_pVlcPlayer->video()->trackCount()) + return true; + + return false; +#else + if (m_pEngine && m_pEngine->isVideoAvailable()) + return false; + return true; +#endif +} + +void QAscVideoWidget::stop() +{ +#ifdef USE_VLC_LIBRARY + if (m_pVlcPlayer) + m_pVlcPlayer->stop(); +#else + if (m_pEngine) + m_pEngine->stop(); +#endif +} diff --git a/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.h b/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.h new file mode 100644 index 00000000..1ed632a2 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qascvideowidget.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include "lib_base.h" + +#include +#include +#include "qfooterpanel.h" +#include "qvideoplaylist.h" + +#ifndef USE_VLC_LIBRARY +#define QASCVIDEOBASE QVideoWidget +#else +#define QASCVIDEOBASE VlcWidgetVideo +#endif + +class QAscVideoWidget; +class QAscVideoView_Private +{ +public: + QFooterPanel* m_pFooter; + + QWidget* m_pVolumeControl; + QVideoSlider* m_pVolumeControlV; + + QVideoPlaylist* m_pPlaylist; + QAscVideoWidget* m_pPlayer; + + bool m_bIsShowingPlaylist; + bool m_bIsPlay; + bool m_bIsSeekEnabled; + + bool m_bIsEnabledPlayList; + bool m_bIsEnabledFullscreen; + + bool m_bIsPresentationMode; + bool m_bIsPresentationModeMediaTypeSended; + + bool m_bIsDestroy; +}; + +class QAscVideoWidget : public QASCVIDEOBASE +{ + Q_OBJECT + + QMediaPlayer* m_pEngine; + +#ifdef USE_VLC_LIBRARY + VlcMediaPlayer* m_pVlcPlayer; + VlcMedia* m_pMedia; +#endif + + int m_nVolume; + +public: + QWidget* m_pParent; + +public: + QAscVideoWidget(QWidget *parent = 0); + ~QAscVideoWidget(); + +public: + void keyPressEvent(QKeyEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + +#if defined(_LINUX) && !defined(_MAC) + virtual void mouseMoveEvent(QMouseEvent* e); +#endif + +public: + void open(QString& sFile); + + void setPlay(); + void setPause(); + void setVolume(int nVolume); + void setSeek(int nPos); + + bool isVideoFullScreen(); + void setFullScreenOnCurrentScreen(bool isFullscreen); + + QMediaPlayer* getEngine(); + + bool isAudio(); + void stop(); + +signals: + void stateChanged(QMediaPlayer::State); + void posChanged(int); + +public slots: + void slotChangeState(QMediaPlayer::State state); + void slotPositionChange(qint64 pos); + +#ifdef USE_VLC_LIBRARY + void slotVlcStateChanged(); + void slotVlcTimeChanged(int time); +#endif + +public: + QWidget* m_pView; +}; diff --git a/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.cpp b/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.cpp new file mode 100644 index 00000000..db545c23 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.cpp @@ -0,0 +1,89 @@ +#include "qfooterpanel.h" +#include +#include +#include "qpushbutton_icons.h" + +QFooterPanel::QFooterPanel(QWidget *parent) : QWidget(parent) +{ + m_nHeigth = 40; + + m_pPlayPause = new QIconPushButton(this, true, "play", "play-active"); + m_pVolume = new QIconPushButton(this, true, "volume", "volume-active"); + m_pFullscreen = new QIconPushButton(this, true, "fullscreen-on", "fullscreen-on-active"); + m_pPlaylist = new QIconPushButton(this, true, "playlist", "playlist-active"); + + m_pSlider = new QVideoSlider(this); + m_pSlider->setOrientation(Qt::Horizontal); + m_pSlider->setMinimum(0); + m_pSlider->setMaximum(100000); + m_pSlider->setValue(0); + m_pSlider->setSingleStep(1000); + m_pSlider->setShortcutEnabled(QKeySequence::Back, true); + m_pSlider->setShortcutEnabled(QKeySequence::Forward, true); + m_pSlider->SetSeekOnClick(true); + + m_bIsEnabledPlayList = true; + m_bIsEnabledFullscreen = true; + +#if defined(_LINUX) && !defined(_MAC) + this->setMouseTracking(true); + m_pSlider->setMouseTracking(true); + m_pFullscreen->setMouseTracking(true); + m_pPlaylist->setMouseTracking(true); + m_pVolume->setMouseTracking(true); + m_pPlayPause->setMouseTracking(true); + + this->setCursor(QCursor(Qt::ArrowCursor)); +#endif +} + +void QFooterPanel::resizeEvent(QResizeEvent* e) +{ + double dDpi = QWidget_GetDPI(this); + + int nWidth = this->width(); + int nButW = QWidget_ScaleDPI(30, dDpi); + + int nY = QWidget_ScaleDPI(5, dDpi); + int nBetweenButtons = QWidget_ScaleDPI(10, dDpi); + + int nLeft = nBetweenButtons; + m_pPlayPause->setGeometry(nLeft, nY, nButW, nButW); nLeft += (nButW + nBetweenButtons); + + int nRight = nWidth; + + nRight -= (nBetweenButtons + nButW); + if (m_bIsEnabledPlayList) + { + m_pPlaylist->setGeometry(nRight, nY, nButW, nButW); nRight -= (nBetweenButtons + nButW); + } + if (m_bIsEnabledFullscreen) + { + m_pFullscreen->setGeometry(nRight, nY, nButW, nButW); nRight -= (nBetweenButtons + nButW); + } + + m_pVolume->setGeometry(nRight, nY, nButW, nButW); nRight -= nBetweenButtons; + m_pSlider->setGeometry(nLeft, nY, nRight - nLeft, nButW); +} + +void QFooterPanel::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} + +#if defined(_LINUX) && !defined(_MAC) +#include +void QFooterPanel::mouseMoveEvent(QMouseEvent* e) +{ + QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); +} +#endif + +void QFooterPanel::SetPlayPause(bool bIsPlay) +{ + QString sI = bIsPlay ? "play" : "pause"; + ((QIconPushButton*)m_pPlayPause)->changeIcons(sI, sI + "-active"); +} diff --git a/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.h b/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.h new file mode 100644 index 00000000..b275173c --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qfooterpanel.h @@ -0,0 +1,42 @@ +#ifndef QFOOTERPANEL_H +#define QFOOTERPANEL_H + +#include +#include +#include +#include +#include +#include "qvideoslider.h" + +class QFooterPanel : public QWidget +{ + Q_OBJECT +public: + explicit QFooterPanel(QWidget *parent = 0); + + virtual void resizeEvent(QResizeEvent* e); + + virtual void paintEvent(QPaintEvent *); + +#if defined(_LINUX) && !defined(_MAC) + virtual void mouseMoveEvent(QMouseEvent* e); +#endif + +public: + QPushButton* m_pPlayPause; + QPushButton* m_pVolume; + QPushButton* m_pFullscreen; + QPushButton* m_pPlaylist; + + QVideoSlider* m_pSlider; + + int m_nHeigth; + + bool m_bIsEnabledPlayList; + bool m_bIsEnabledFullscreen; + +public: + void SetPlayPause(bool bIsPlay); +}; + +#endif // QFOOTERPANEL_H diff --git a/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.cpp b/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.cpp new file mode 100644 index 00000000..a049a9b3 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.cpp @@ -0,0 +1,139 @@ +#include "qpushbutton_icons.h" + +class QIconPushButtonPrivate +{ +public: + QString m_sIconR; + QString m_sIconH; + QString m_sIconP; + + bool m_bIsSvg; + bool m_bIsSvgSupport; + double m_dDpi; + + QPushButton* m_pButton; + +public: + QIconPushButtonPrivate(QPushButton* pButton) + { + m_pButton = pButton; + + m_bIsSvg = false; + m_bIsSvgSupport = false; + + m_dDpi = 0.0; + } + + QString getIconPostfix(QPushButton* p) + { + double dDpi = QWidget_GetDPI(p); + QString sPostfix = m_bIsSvg ? ".svg" : ".png"; + + if (fabs(1.0 - dDpi) < 0.1 || fabs(0.0 - dDpi) < 0.1) + sPostfix = ".png"; + else if (fabs(2.0 - dDpi) < 0.1) + sPostfix = "-2x.png"; + + return sPostfix; + } + + void checkDpi(const double dDpi, const bool isAttack = false) + { + if (!isAttack && fabs(dDpi - m_dDpi) < 0.05) + return; + + m_dDpi = dDpi; + if (fabs(0.0 - m_dDpi) > 0.05 && fabs(1.0 - m_dDpi) > 0.05 && fabs(2.0 - m_dDpi) > 0.05) + { + if (m_bIsSvgSupport) + { + m_bIsSvg = true; + this->m_pButton->setStyleSheet("QPushButton { background-color: transparent; border: none; margin:0; padding:0; outline:none; }"); + this->setIcon(":/icons/" + m_sIconR + ".svg"); + this->m_pButton->update(); + return; + } + } + m_bIsSvg = false; + + QString sPostfix = ".png"; + if (fabs(2.0 - m_dDpi) < 0.1) + sPostfix = "-2x.png"; + + QString sStyle = "QPushButton {border-image:url(:/icons/" + m_sIconR + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; + sStyle += "QPushButton::hover {border-image:url(:/icons/" + m_sIconH + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; + sStyle += "QPushButton::pressed {border-image:url(:/icons/" + m_sIconP + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; + + m_pButton->setStyleSheet(sStyle); + } + + void setIcon(QString s) + { + if (m_bIsSvg) + { + QIcon icon; + QSize size = m_pButton->size(); + icon.addFile(s, size); + m_pButton->setIcon(icon); + m_pButton->setIconSize(size); + } + } +}; + +QIconPushButton::QIconPushButton(QWidget *parent, bool bIsSvgSupport, QString sIconR, QString sIconH, QString sIconP) : QPushButton(parent) +{ + m_internal = new QIconPushButtonPrivate(this); + m_internal->m_bIsSvgSupport = bIsSvgSupport; + + changeIcons(sIconR, sIconH, sIconP); +} + +void QIconPushButton::changeIcons(QString sIconR, QString sIconH, QString sIconP) +{ + m_internal->m_sIconR = sIconR; + + if (sIconH.isEmpty() && sIconP.isEmpty()) + { + m_internal->m_sIconH = m_internal->m_sIconR + "-hover"; + m_internal->m_sIconP = m_internal->m_sIconR + "-active"; + } + else if (sIconP.isEmpty()) + { + m_internal->m_sIconH = sIconH; + m_internal->m_sIconP = m_internal->m_sIconH; + } + else + { + m_internal->m_sIconH = sIconH; + m_internal->m_sIconP = sIconP; + } + + this->m_internal->checkDpi(m_internal->m_dDpi, true); +} + +bool QIconPushButton::event(QEvent *e) +{ + if (!m_internal->m_bIsSvg) + return QPushButton::event(e); + + QPushButton::event(e); + if (e->type() == QEvent::Enter) + { + this->m_internal->setIcon(":/icons/" + m_internal->m_sIconH + ".svg"); + } + if (e->type() == QEvent::Leave) + { + this->m_internal->setIcon(":/icons/" + m_internal->m_sIconR + ".svg"); + } + return true; +} +void QIconPushButton::resizeEvent(QResizeEvent* e) +{ + QPushButton::resizeEvent(e); + m_internal->checkDpi(QWidget_GetDPI(this)); +} + +QIconPushButton::~QIconPushButton() +{ + delete m_internal; +} diff --git a/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.h b/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.h new file mode 100644 index 00000000..eee099d1 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qpushbutton_icons.h @@ -0,0 +1,103 @@ +#ifndef QASCICONS_ENGINE_H +#define QASCICONS_ENGINE_H + +#include +#include +#include + +static QString getButtonBackground(QString src, QString srcH, QString srcP, double dDpi = 0.0) +{ +#if 0 + QString sRet = "QPushButton {background-image:url(:/icons/" + src + ".png);border:none;margin:0;padding:0;outline:none;}"; + sRet += "QPushButton::hover {background-image:url(:/icons/" + srcH + ".png);border:none;margin:0;padding:0;outline:none;}"; + sRet += "QPushButton::pressed {background-image:url(:/icons/" + srcP + ".png);border:none;margin:0;padding:0;outline:none;}"; +#else + QString sPostfix = ".svg"; + if (fabs(1.0 - dDpi) < 0.1 || fabs(0.0 - dDpi) < 0.1) + sPostfix = ".png"; + else if (fabs(2.0 - dDpi) < 0.1) + sPostfix = "-2x.png"; + + QString sRet = "QPushButton {border-image:url(:/icons/" + src + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; + sRet += "QPushButton::hover {border-image:url(:/icons/" + srcH + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; + sRet += "QPushButton::pressed {border-image:url(:/icons/" + srcP + sPostfix + ") 0 0 0 0 stretch stretch;margin:0;padding:0;outline:none;}"; +#endif + return sRet; +} +static QString getButtonBackground(QString src, double dDpi = 0.0) +{ + return getButtonBackground(src, src + "-hover", src + "-active", dDpi); +} +static QString getButtonBackground2(QString src, double dDpi = 0.0) +{ + return getButtonBackground(src, src + "-active", src + "-active", dDpi); +} +static QString getButtonBackgroundSimple(QString src, double dDpi = 0.0) +{ + return getButtonBackground(src, src, src, dDpi); +} + +class QIconPushButtonPrivate; +class QIconPushButton : public QPushButton +{ + Q_OBJECT + +public: + QIconPushButton(QWidget *parent, bool bSvgSupport, QString sIconR, QString sIconH = "", QString sIconP = ""); + void changeIcons(QString sIconR, QString sIconH = "", QString sIconP = ""); + virtual ~QIconPushButton(); + +protected: + virtual bool event(QEvent *e); + virtual void resizeEvent(QResizeEvent* e); + +private: + QIconPushButtonPrivate* m_internal; +}; + +static void QWidget_SetProperty(QObject* w, const QVariant& p) +{ + w->setProperty("native_dpi", p); + QObjectList childs = w->children(); + for (int i = childs.count() - 1; i >= 0; --i) + { + QWidget_SetProperty(childs.at(i), p); + } +} + +static void QWidget_SetDPI(QWidget* w, const double& v) +{ + QVariant p(v); + QWidget_SetProperty(w, p); +} +static double QWidget_GetDPI(QWidget* w) +{ + QVariant p = w->property("native_dpi"); + if (p.isValid()) + return p.toDouble(); + return 1.0; +} +static int QWidget_ScaleDPI(const int& v, const double& s) +{ + return (int)(v * s + 0.001); +} + +#include +static void QWidget_setBackground(QWidget* widget, int r, int g, int b) +{ +#if 1 + QString s1 = QString::number(r, 16); if (s1.length() == 0) s1 = "0" + s1; + QString s2 = QString::number(g, 16); if (s2.length() == 0) s2 = "0" + s2; + QString s3 = QString::number(b, 16); if (s3.length() == 0) s3 = "0" + s3; + QString sBackColor = "background-color:#" + s1 + s2 + s3 + ";"; + widget->setStyleSheet(sBackColor); +#endif + + QPalette pal; + pal.setColor(QPalette::Background, QColor(r, g, b)); + widget->setAutoFillBackground(true); + widget->setPalette(pal); +} + + +#endif // QASCICONS_ENGINE_H diff --git a/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.cpp b/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.cpp new file mode 100644 index 00000000..773f07b8 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.cpp @@ -0,0 +1,665 @@ +#include "qvideoplaylist.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "../../../../core/DesktopEditor/common/Directory.h" +#include "../../../../core/DesktopEditor/common/StringBuilder.h" +#include "../../../../core/DesktopEditor/xml/include/xmlutils.h" +#include "qpushbutton_icons.h" +#include "../qascvideoview.h" + +QStandardItem* CreateFileItem(const QString& text, const QString& file) +{ + QStandardItem* item = new QStandardItem(text); + item->setAccessibleText(file); + item->setDropEnabled(false); + item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); + return item; +} + +QStandardItem* CreateFileDurationItem(const QString& text) +{ + QStandardItem* item = new QStandardItem(text); + item->setDropEnabled(false); + item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); + return item; +} + +QVideoPlaylist::QVideoPlaylist(QWidget *parent) : QWidget(parent) +{ + m_oCS.InitializeCriticalSection(); + + m_sSavePlayListAddon = "/ONLYOFFICE/VideoPlayer"; + QWidget_setBackground(this, 0x22, 0x22, 0x22); + + m_pAdd = new QIconPushButton(this, true, "add-files", "add-files-active"); + m_pClear = new QIconPushButton(this, true, "drop-playlist", "drop-playlist-active"); + + m_pListView = new QTableView(this); + QStandardItemModel* pModel = new QStandardItemModel(); + m_pListView->setModel(pModel); + + pModel->setColumnCount(2); + m_pListView->setColumnWidth(0, 150); + m_pListView->setColumnWidth(1, 50); + + QHeaderView* pVerticalHeader = m_pListView->verticalHeader(); + QHeaderView* pHorizontalHeader = m_pListView->horizontalHeader(); + + pHorizontalHeader->setHidden(true); + pHorizontalHeader->setStretchLastSection(true); + + pVerticalHeader->setHidden(true); + + m_pListView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_pListView->setSelectionMode(QAbstractItemView::SingleSelection); + m_pListView->setDragDropMode(QAbstractItemView::DropOnly); + m_pListView->setDefaultDropAction(Qt::IgnoreAction); + m_pListView->setDragDropOverwriteMode(false); + m_pListView->setDragEnabled(true); + m_pListView->setDropIndicatorShown(false); + + QObject::connect(m_pAdd, SIGNAL(clicked(bool)), this, SLOT(slotButtonAdd())); + QObject::connect(m_pClear, SIGNAL(clicked(bool)), this, SLOT(slotButtonClear())); + + QObject::connect(m_pListView, SIGNAL(clicked(const QModelIndex &)), + this, SLOT(slotClick(const QModelIndex &))); + + QObject::connect(m_pListView, SIGNAL(activated(const QModelIndex &)), + this, SLOT(slotActivated(const QModelIndex &))); + + m_pListView->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_pListView->setShowGrid(false); + + m_dDpi = 0; + private_Style(1.0); + +#ifdef _MAC + QShortcut* shortcut1 = new QShortcut(QKeySequence(Qt::Key_Return), m_pListView); + connect(shortcut1, SIGNAL(activated()), this, SLOT(slotActivatedShortcut())); + + QShortcut* shortcut2 = new QShortcut(QKeySequence(Qt::Key_Enter), m_pListView); + connect(shortcut2, SIGNAL(activated()), this, SLOT(slotActivatedShortcut())); +#endif + + QShortcut* shortcutDelete = new QShortcut(QKeySequence(QKeySequence::Delete), m_pListView); + connect(shortcutDelete, SIGNAL(activated()), this, SLOT(slotDeletedShortcut())); + + QObject::connect(this, SIGNAL(_onCheckDuration(QString,QString)), this, SLOT(_onSlotCheckDuration(QString,QString)), Qt::QueuedConnection); + + QObject::connect(&m_oTimer, SIGNAL(timeout()), this, SLOT(_onThreadFunc())); + m_oTimer.start(100); + +#ifndef USE_VLC_LIBRARY + m_pCheckPlayer = new QMediaPlayer(); + QObject::connect(m_pCheckPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(_onSlotDurationChanged(qint64))); + QObject::connect(m_pCheckPlayer, SIGNAL(mediaChanged(QMediaContent)), this, SLOT(_onSlotMediaChanged(QMediaContent))); + QObject::connect(m_pCheckPlayer, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(_onSlotError(QMediaPlayer::Error))); + QObject::connect(m_pCheckPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(_onSlotMediaStatusChanged(QMediaPlayer::MediaStatus))); +#endif +} + +QVideoPlaylist::~QVideoPlaylist() +{ + m_oCS.DeleteCriticalSection(); +} + +void QVideoPlaylist::private_Style(double dDpi) +{ + if (fabs(dDpi - m_dDpi) < 0.1) + return; + m_dDpi = dDpi; + + QScrollBar* pScrollBar = m_pListView->verticalScrollBar(); + + int n1 = (int)(dDpi * 1); + int n2 = (int)(dDpi * 2); + int n4 = (int)(dDpi * 4); + int n5 = (int)(dDpi * 5); + int n6 = (int)(dDpi * 6); + int n10 = (int)(dDpi * 10); + int n20 = (int)(dDpi * 20); + + QString sStyle = QString("\ + QScrollBar:vertical {\ + border: none;\ + background: transparent;\ + width: %6px;\ + margin-left: 0px;\ + margin-top: %4px;\ + margin-right: %2px;\ + margin-bottom: %4px;\ + }\ + QScrollBar::handle:vertical {\ + background: #545454;\ + min-height: %7px;\ + border: %1px solid #545454;\ + width: %5px;\ + border-radius: %3px;\ + }\ + QScrollBar::handle:vertical:hover {\ + background: #9B9B9B;\ + min-height: %7px;\ + border: %1px solid #9B9B9B;\ + width: %5px;\ + border-radius: %3px;\ + }\ + QScrollBar::add-line:vertical {\ + background: transparent;\ + height: 0px;\ + }\ + QScrollBar::sub-line:vertical {\ + background: transparent;\ + height: 0px;\ + }\ + QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {\ + height: %6px;\ + background: transparent;\ + }\ + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {\ + background: none;\ + height: %6px;\ + }").arg(QString::number(n1), QString::number(n2), QString::number(n4), QString::number(n5), QString::number(n6), QString::number(n10), QString::number(n20)); + pScrollBar->setStyleSheet(sStyle); + + QString sStyleL = QString("\ +QTableView {\ + background: transparent;\ + border: none;\ + color: #BBBBBB;\ + margin-left: %2px;\ + margin-top: %2px;\ + margin-right: %1px;\ + margin-bottom: %2px;\ + border: none;\ + outline: none;\ + selection-background-color: transparent;\ + selection-color: #FFFFFF; \ + vertical-align:middle;\ + font-family: 'Open Sans'; font-style: normal; font-size: %3px;\ +}\ +QTableView::item { height: 20px; border: none; outline: none; }\ +QTableView::item:selected { border: none; outline: none; background-color: #353535; }\ +").arg(QString::number(n5), QString::number(n10), QString::number((int)(dDpi * 12))); + m_pListView->setStyleSheet(sStyleL); + + m_pListView->setColumnWidth(0, QWidget_ScaleDPI(150, m_dDpi)); + m_pListView->setColumnWidth(1, QWidget_ScaleDPI(50, m_dDpi)); + + m_pListView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); + m_pListView->verticalHeader()->setDefaultSectionSize(QWidget_ScaleDPI(30, m_dDpi)); + + CheckStyles(); +} + +void QVideoPlaylist::resizeEvent(QResizeEvent* e) +{ + double dDpi = QWidget_GetDPI(this); + + int nButW = QWidget_ScaleDPI(30, dDpi); + int n5 = QWidget_ScaleDPI(5, dDpi); + int n10 = QWidget_ScaleDPI(10, dDpi); + + int nTopB = height() - nButW; + + m_pListView->setGeometry(0, 0, width(), nTopB - n10); + m_pAdd->setGeometry(n10, nTopB - n5, nButW, nButW); + m_pClear->setGeometry(width() - nButW - n10, nTopB - n5, nButW, nButW); + + private_Style(dDpi); +} + +void QVideoPlaylist::slotClick(const QModelIndex &index) +{ + +} + + +void QVideoPlaylist::slotActivated(const QModelIndex &index) +{ + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + int nRows = pModel->rowCount(); + int nCurrentRow = index.row(); + + QFont fontAll("Open Sans", 10, QFont::Normal, false); + QFont fontSelected("Open Sans", 10, QFont::Bold, false); + fontAll.setPixelSize(QWidget_ScaleDPI(12, m_dDpi)); + fontSelected.setPixelSize(QWidget_ScaleDPI(12, m_dDpi)); + + QBrush brushAll(QColor(0xBB, 0xBB, 0xBB)); + QBrush brushSelected(QColor(0xFF, 0xFF, 0xFF)); + + for (int i = 0; i < nRows; i++) + { + QStandardItem* item1 = pModel->item(i, 0); + QStandardItem* item2 = pModel->item(i, 1); + + if (i != nCurrentRow) + { + item1->setFont(fontAll); + item1->setForeground(brushAll); + + item2->setFont(fontAll); + item2->setForeground(brushAll); + } + else + { + item1->setFont(fontSelected); + item1->setForeground(brushSelected); + + item2->setFont(fontSelected); + item2->setForeground(brushSelected); + + emit fileChanged(item1->accessibleText()); + } + } +} + +void QVideoPlaylist::CheckStyles() +{ + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + int nRows = pModel->rowCount(); + + int nRow = -1; + for (int i = 0; i < nRows; i++) + { + QStandardItem* item1 = pModel->item(i, 0); + + if (item1->font().bold()) + { + nRow = i; + break; + } + } + + int nCurrentRow = nRow; + + QFont fontAll("Open Sans", 10, QFont::Normal, false); + QFont fontSelected("Open Sans", 10, QFont::Bold, false); + fontAll.setPixelSize(QWidget_ScaleDPI(12, m_dDpi)); + fontSelected.setPixelSize(QWidget_ScaleDPI(12, m_dDpi)); + + QBrush brushAll(QColor(0xBB, 0xBB, 0xBB)); + QBrush brushSelected(QColor(0xFF, 0xFF, 0xFF)); + + for (int i = 0; i < nRows; i++) + { + QStandardItem* item1 = pModel->item(i, 0); + QStandardItem* item2 = pModel->item(i, 1); + + if (i != nCurrentRow) + { + item1->setFont(fontAll); + item1->setForeground(brushAll); + + item2->setFont(fontAll); + item2->setForeground(brushAll); + } + else + { + item1->setFont(fontSelected); + item1->setForeground(brushSelected); + + item2->setFont(fontSelected); + item2->setForeground(brushSelected); + } + } +} + +#ifdef _MAC +void QVideoPlaylist::slotActivatedShortcut() +{ + this->slotActivated(m_pListView->selectionModel()->currentIndex()); +} +#endif + +void QVideoPlaylist::slotDeletedShortcut() +{ + this->m_pListView->model()->removeRow(m_pListView->selectionModel()->currentIndex().row()); +} + +#if defined(_LINUX) && !defined(_MAC) +#include +void QVideoPlaylist::mouseMoveEvent(QMouseEvent* e) +{ + QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor)); +} +#endif + +void QVideoPlaylist::slotButtonAdd() +{ + QString sDir = QStandardPaths::writableLocation(QStandardPaths::MoviesLocation); + if (!m_sLastFileDialogFolder.isEmpty()) + sDir = m_sLastFileDialogFolder; + + QString sTitle = QString::fromUtf8("Добавить файлы в список воспроизведения"); + //sTitle = "Add files to playlist"; + CVideoExt ext; + QStringList filenames = QFileDialog::getOpenFileNames(this, +sTitle, sDir, +ext.getFilter(), NULL, + #ifdef QFILEDIALOG_DONTUSENATIVEDIALOG + QFileDialog::DontUseNativeDialog + #else + QFileDialog::Option() + #endif + ); + + AddFiles(filenames); +} + +void QVideoPlaylist::slotButtonClear() +{ + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + pModel->clear(); +} + +void QVideoPlaylist::AddFiles(QStringList& filenames, const bool isStart) +{ + int nPrevCount = m_pListView->model()->rowCount(); + if (filenames.isEmpty()) + return; + + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + + QStringList listCheck; + + QList rowData; + for (int i = 0; i < filenames.count(); ++i) + { + rowData.clear(); + + QFileInfo file(filenames.at(i)); + + if (0 == i) + m_sLastFileDialogFolder = file.absolutePath(); + + QStandardItem* item = CreateFileItem(file.fileName(), file.absoluteFilePath()); + rowData << item; + + listCheck.append(file.absoluteFilePath()); + + item = CreateFileDurationItem("..."); + rowData << item; + + pModel->appendRow(rowData); + } + + m_pListView->setColumnWidth(0, QWidget_ScaleDPI(150, m_dDpi)); + m_pListView->setColumnWidth(1, QWidget_ScaleDPI(50, m_dDpi)); + + AddFilesToCheck(listCheck); + + if (isStart) + { + m_pListView->setCurrentIndex(pModel->index(nPrevCount, 0)); + m_pListView->activated(pModel->index(nPrevCount, 0)); + } +} + +void QVideoPlaylist::Load() +{ + QString sSettings = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + sSettings += m_sSavePlayListAddon; + + std::wstring sDir = sSettings.toStdWString(); + NSDirectory::CreateDirectories(sDir); + + XmlUtils::CXmlNode oNode; + if (!oNode.FromXmlFile(sDir + L"/settings.xml")) + return; + + XmlUtils::CXmlNodes oFiles; + if (oNode.GetNodes(L"file", oFiles)) + { + QStringList list; + int nCount = oFiles.GetCount(); + for (int i = 0; i < nCount; ++i) + { + XmlUtils::CXmlNode nodeFile; + oFiles.GetAt(i, nodeFile); + list.append(QString::fromStdWString(nodeFile.GetText())); + } + + this->AddFiles(list); + } + + int nIndex = oNode.ReadValueInt(L"index", -1); + if (-1 != nIndex) + { + QModelIndex index = m_pListView->model()->index(nIndex, 0); + m_pListView->setCurrentIndex(index); + } + + std::wstring sLastFolder = oNode.ReadValueString(L"lastdirectory"); + if (!sLastFolder.empty()) + m_sLastFileDialogFolder = QString::fromStdWString(sLastFolder); +} + +void QVideoPlaylist::Save() +{ + m_oCS.DeleteCriticalSection(); + + QString sSettings = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + sSettings += m_sSavePlayListAddon; + + std::wstring sDir = sSettings.toStdWString(); + NSDirectory::CreateDirectories(sDir); + + std::wstring sFile = sDir + L"/settings.xml"; + + NSStringUtils::CStringBuilder builder; + builder.WriteString(L""); + + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + int nRows = pModel->rowCount(); + int nCurrentRow = m_pListView->currentIndex().row(); + + for (int i = 0; i < nRows; i++) + { + QStandardItem* item = pModel->item(i, 0); + + builder.WriteString(L""); + builder.WriteEncodeXmlString(item->accessibleText().toStdWString()); + builder.WriteString(L""); + } + + builder.WriteString(L""); + builder.AddInt(nCurrentRow); + builder.WriteString(L""); + + builder.WriteString(L""); + builder.WriteEncodeXmlString(m_sLastFileDialogFolder.toStdWString()); + builder.WriteString(L""); + + builder.WriteString(L""); + + std::wstring sXml = builder.GetData(); + NSFile::CFileBinary::SaveToFile(sFile, sXml); +} + +// check duration methods +void QVideoPlaylist::AddFilesToCheck(QStringList& list) +{ + CTemporaryCS oCS(&m_oCS); + + for (int i = 0; i < list.count(); ++i) + { + if (!m_mapChecked.contains(list[i].toLower())) + m_mapChecked.insert(list[i], true); + } +} + +void QVideoPlaylist::_onSlotCheckDuration(const QString& file, const QString& duration) +{ + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + int nRows = pModel->rowCount(); + + for (int i = 0; i < nRows; i++) + { + QStandardItem* item = pModel->item(i, 0); + if (item->accessibleText() == file) + pModel->item(i, 1)->setText(duration); + } +} + +#ifndef USE_VLC_LIBRARY +void QVideoPlaylist::_onSlotError(QMediaPlayer::Error error) +{ + +} + +void QVideoPlaylist::_onSlotMediaStatusChanged(QMediaPlayer::MediaStatus status) +{ + if (status == QMediaPlayer::InvalidMedia) + _onSlotDurationChanged(0); +} + +void QVideoPlaylist::_onSlotDurationChanged(qint64 duration) +{ + if (m_sCheckFile.isEmpty()) + return; + + qint64 nH = (qint64)(duration / 3600000); + duration -= (nH * 3600000); + qint64 nM = (qint64)(duration / 60000); + duration -= (nM * 60000); + qint64 nS = (qint64)(duration / 1000); + + QString sDur = ""; + if (nH > 0) + { + sDur += QString::number((uint)nH); + sDur += ":"; + } + if (nM < 10) + sDur += "0"; + sDur += QString::number((uint)nM); + sDur += ":"; + if (nS < 10) + sDur += "0"; + sDur += QString::number((uint)nS); + + emit _onCheckDuration(m_sCheckFile, sDur); + + m_pCheckPlayer->stop(); + m_pCheckPlayer->setMedia(QMediaContent()); +} + +void QVideoPlaylist::_onSlotMediaChanged(QMediaContent content) +{ + if (content.isNull()) + { + m_sCheckFile = ""; + return; + } +} +#else +void QVideoPlaylist::_onVlcMediaParseChanged(bool isparsed) +{ + if (m_sCheckFile.isEmpty()) + return; + + qint64 duration = m_pCheckMedia->duration(); + + QString sCheckFile = m_sCheckFile; + + m_sCheckFile = ""; + delete m_pCheckMedia; + + qint64 nH = (qint64)(duration / 3600000); + duration -= (nH * 3600000); + qint64 nM = (qint64)(duration / 60000); + duration -= (nM * 60000); + qint64 nS = (qint64)(duration / 1000); + + QString sDur = ""; + if (nH > 0) + { + sDur += QString::number((uint)nH); + sDur += ":"; + } + if (nM < 10) + sDur += "0"; + sDur += QString::number((uint)nM); + sDur += ":"; + if (nS < 10) + sDur += "0"; + sDur += QString::number((uint)nS); + + emit _onCheckDuration(sCheckFile, sDur); +} +#endif + +void QVideoPlaylist::_onThreadFunc() +{ + if (!m_sCheckFile.isEmpty()) + return; + + m_oCS.Enter(); + + if (!m_mapChecked.isEmpty()) + { + m_sCheckFile = m_mapChecked.firstKey(); + m_mapChecked.remove(m_sCheckFile); + } + else + { + m_sCheckFile = ""; + m_oCS.Leave(); + + return; + } + + m_oCS.Leave(); + +#ifndef USE_VLC_LIBRARY + m_pCheckPlayer->setMedia(QUrl::fromLocalFile(m_sCheckFile)); +#else + m_pCheckMedia = new VlcMedia(m_sCheckFile, true, (VlcInstance*)NSBaseVideoLibrary::GetLibrary()); + QObject::connect(m_pCheckMedia, SIGNAL(parsedChanged(bool)), this, SLOT(_onVlcMediaParseChanged(bool))); + m_pCheckMedia->parse(); +#endif + return; +} + +void QVideoPlaylist::Next() +{ + QStandardItemModel* pModel = (QStandardItemModel*)m_pListView->model(); + int nRows = pModel->rowCount(); + int nRow = -1; + + for (int i = 0; i < nRows; i++) + { + QStandardItem* item1 = pModel->item(i, 0); + + if (item1->font().bold()) + { + nRow = i; + break; + } + } + + if (nRow >= (nRows - 1)) + { + emit fileChanged(""); + return; + } + + ++nRow; + + m_pListView->setCurrentIndex(pModel->index(nRow, 0)); + m_pListView->activated(pModel->index(nRow, 0)); + //m_pListView->selectionModel()->select(pModel->index(nRow, 0), QItemSelectionModel::Toggle | QItemSelectionModel::Rows | QItemSelectionModel::ClearAndSelect); +} diff --git a/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.h b/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.h new file mode 100644 index 00000000..e4c53eec --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qvideoplaylist.h @@ -0,0 +1,168 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "../../../../core/DesktopEditor/graphics/BaseThread.h" +#include "../../../../core/DesktopEditor/graphics/TemporaryCS.h" + +#include "lib_base.h" + +#ifndef USE_VLC_LIBRARY +#include +#endif + +class CVideoExt +{ +private: + QStringList m_video_exts; + QStringList m_audio_exts; + +public: + CVideoExt() + { + m_video_exts << "webm" << "mkv" << "flv" << "ogg" << "avi" << "mov" << "wmv" << "mp4" << + "m4v" << "mpg" << "mp2" << "mpeg" << "mpe" << "mpv" << "m2v" << "m4v" << + "3gp" << "3g2" << "f4v" << "m2ts" << "mts"; + m_audio_exts << "flac" << "mp3" << "ogg" << "wav" << "wma" << "ape"; + } + + QSet getQSet(bool isAddPoint = false) + { + QSet ret; + for (int i = 0; i < m_video_exts.size(); i++) + { + QString tmp = m_video_exts[i]; + if (isAddPoint) + tmp = ("*." + tmp); + ret << tmp; + } + for (int i = 0; i < m_audio_exts.size(); i++) + { + QString tmp = m_audio_exts[i]; + if (isAddPoint) + tmp = ("*." + tmp); + ret << tmp; + } + return ret; + } + + QString getFilter() + { + QString sRes = "All Video Files ("; + + int size = m_video_exts.size(); + for (int i = 0; i < size; i++) + { + sRes += "*."; + sRes += m_video_exts[i]; + + if (i != (size - 1)) + sRes += " "; + } + + sRes += ");;All Audio Files ("; + + size = m_audio_exts.size(); + for (int i = 0; i < size; i++) + { + sRes += "*."; + sRes += m_audio_exts[i]; + + if (i != (size - 1)) + sRes += " "; + } + + sRes += ");;All files (*.*)"; + + return sRes; + } +}; + +class QVideoPlaylist : public QWidget +{ + Q_OBJECT + +private: + double m_dDpi; + void private_Style(double dDpi); + +public: + explicit QVideoPlaylist(QWidget *parent = 0); + virtual ~QVideoPlaylist(); + + virtual void resizeEvent(QResizeEvent* e); + +signals: + void fileChanged(const QString& file); + +public slots: + void slotClick(const QModelIndex &index); + void slotActivated(const QModelIndex &index); + + void slotButtonAdd(); + void slotButtonClear(); + +#ifdef _MAC + void slotActivatedShortcut(); +#endif + void slotDeletedShortcut(); + +#if defined(_LINUX) && !defined(_MAC) + virtual void mouseMoveEvent(QMouseEvent* e); +#endif + +public: + void AddFiles(QStringList& files, const bool isStart = false); + void Load(); + void Save(); + + void Next(); + + void CheckStyles(); + +public: + QPushButton* m_pAdd; + QPushButton* m_pClear; + QTableView* m_pListView; + + QString m_sLastFileDialogFolder; + + QString m_sSavePlayListAddon; + +private: + NSCriticalSection::CRITICAL_SECTION m_oCS; + + QTimer m_oTimer; + +#ifndef USE_VLC_LIBRARY + QMediaPlayer* m_pCheckPlayer; +#else + VlcMedia* m_pCheckMedia; +#endif + + QString m_sCheckFile; + QMap m_mapChecked; + void AddFilesToCheck(QStringList& list); + +signals: + void _onCheckDuration(const QString& file, const QString& duration); +private slots: + +#ifndef USE_VLC_LIBRARY + void _onSlotError(QMediaPlayer::Error error); + void _onSlotMediaStatusChanged(QMediaPlayer::MediaStatus status); + void _onSlotDurationChanged(qint64 duration); + void _onSlotMediaChanged(QMediaContent content); +#else + void _onVlcMediaParseChanged(bool isparsed); +#endif + void _onSlotCheckDuration(const QString& file, const QString& duration); + void _onThreadFunc(); + +}; diff --git a/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.cpp b/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.cpp new file mode 100644 index 00000000..bef24c3b --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.cpp @@ -0,0 +1,134 @@ +#include "qvideoslider.h" +#include +#include +#include "qpushbutton_icons.h" + +QVideoSlider::QVideoSlider(QWidget *parent) : QSlider(parent) +{ + QString sStyle = "\ + QSlider::groove:horizontal { background-color: transparent; border: 1px solid transparent; border-radius: 3px; background: transparent; height: 16px; \ + margin-top: -5px; margin-bottom: -5px; margin-left: 0px; margin-right:0px; border-radius: 3px; }\ + \ + QSlider::groove:vertical { background-color: transparent; border: 1px solid transparent; border-radius: 3px; background: transparent; width: 16px; \ + margin-left: -5px; margin-right: -5px; margin-top: 0px; margin-bottom:0px; border-radius: 3px; }\ + \ + QSlider::sub-page:horizontal { background-color: #9B9B9B; border: 1px solid #9B9B9B; border-radius: 3px; }\ + QSlider::add-page:horizontal { background-color: #545454; border: 1px solid #545454; border-radius: 3px; }\ + \ + QSlider::sub-page:vertical { background-color: #545454; border: 1px solid #545454; border-radius: 3px; }\ + QSlider::add-page:vertical { background-color: #9B9B9B; border: 1px solid #9B9B9B; border-radius: 3px; }\ + \ + QSlider::handle { background-color: #FFFFFF; border: 1px solid #FFFFFF; border-radius: 7px;\ + width: 14px; height: 14px; margin-top: 0px; margin-bottom: 0px; }\ + \ + QSlider::sub-page:disabled { background: #545454; border-color: #545454; }\ + \ + QSlider::add-page:disabled { background: #545454; border-color: #545454; }\ + \ + QSlider::handle:disabled { background: #545454; border: 1px solid #545454; border-radius: 8px;\ + }\ + "; + m_dDpi = 1; + this->setStyleSheet(sStyle); +} + +void QVideoSlider::mousePressEvent(QMouseEvent *event) +{ + if (!m_bIsSeekOnClick) + return QSlider::mousePressEvent(event); + + QStyleOptionSlider opt; + initStyleOption(&opt); + QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); + + if (event->button() == Qt::LeftButton && !sr.contains(event->pos())) + { + int newVal; + + if (orientation() == Qt::Vertical) + { + double halfHandleHeight = (0.5 * sr.height()) + 0.5; + int adaptedPosY = height() - event->y(); + if ( adaptedPosY < halfHandleHeight ) + adaptedPosY = halfHandleHeight; + if ( adaptedPosY > height() - halfHandleHeight ) + adaptedPosY = height() - halfHandleHeight; + + double newHeight = (height() - halfHandleHeight) - halfHandleHeight; + double normalizedPosition = (adaptedPosY - halfHandleHeight) / newHeight ; + + newVal = minimum() + qRound((maximum()-minimum()) * normalizedPosition); + } + else + { + double halfHandleWidth = (0.5 * sr.width()) + 0.5; + int adaptedPosX = event->x(); + if ( adaptedPosX < halfHandleWidth ) + adaptedPosX = halfHandleWidth; + if ( adaptedPosX > width() - halfHandleWidth ) + adaptedPosX = width() - halfHandleWidth; + + double newWidth = (width() - halfHandleWidth) - halfHandleWidth; + double normalizedPosition = (adaptedPosX - halfHandleWidth) / newWidth ; + + newVal = minimum() + qRound((maximum()-minimum()) * normalizedPosition); + } + + if (invertedAppearance()) + this->setValue( maximum() - newVal ); + else + this->setValue(newVal); + + QSlider::mousePressEvent(event); + } + else + { + QSlider::mousePressEvent(event); + } +} + +void QVideoSlider::resizeEvent(QResizeEvent* e) +{ + double dDpi = QWidget_GetDPI(this); + if (fabs(dDpi - m_dDpi) > 0.01) + { + m_dDpi = dDpi; + int n8 = (int)(m_dDpi * 7); + int n14 = (int)(m_dDpi * 14); + int n3 = (int)(m_dDpi * 3); + int n5 = (int)(m_dDpi * 5); + int n16 = (int)(m_dDpi * 16); + int n1 = (int)(m_dDpi * 1); + + QString sStyle = QString("\ + QSlider::groove:horizontal { background-color: transparent; border: %6px solid transparent; border-radius: %3px; background: transparent; height: %5px; \ + margin-top: -%4px; margin-bottom: -%4px; margin-left: 0px; margin-right:0px; border-radius: %3px; }\ + \ + QSlider::groove:vertical { background-color: transparent; border: %6px solid transparent; border-radius: %3px; background: transparent; width: %5px; \ + margin-left: -%4px; margin-right: -%4px; margin-top: 0px; margin-bottom:0px; border-radius: %3px; }\ + \ + QSlider::sub-page:horizontal { background-color: #9B9B9B; border: %6px solid #9B9B9B; border-radius: %3px; }\ + QSlider::add-page:horizontal { background-color: #545454; border: %6px solid #545454; border-radius: %3px; }\ + \ + QSlider::sub-page:vertical { background-color: #545454; border: %6px solid #545454; border-radius: %3px; }\ + QSlider::add-page:vertical { background-color: #9B9B9B; border: %6px solid #9B9B9B; border-radius: %3px; }\ + \ + QSlider::handle { background-color: #FFFFFF; border: %6px solid #FFFFFF; border-radius: %1px;\ + width: %2px; height: %2px; margin-top: 0px; margin-bottom: 0px; }\ + \ + QSlider::sub-page:disabled { background: #545454; border-color: #545454; }\ + \ + QSlider::add-page:disabled { background: #545454; border-color: #545454; }\ + \ + QSlider::handle:disabled { background: #545454; border: %6px solid #545454; border-radius: %1px;\ + }\ + ").arg(QString::number(n8), QString::number(n14), QString::number(n3), QString::number(n5), QString::number(n16), QString::number(n1)); + this->setStyleSheet(sStyle); + } +} + +void QVideoSlider::SetSeekOnClick(bool bValue) +{ + m_bIsSeekOnClick = bValue; +} + diff --git a/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.h b/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.h new file mode 100644 index 00000000..cf7fcc10 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/src/qvideoslider.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include + +class QVideoSlider : public QSlider +{ + Q_OBJECT + + bool m_bIsSeekOnClick; + double m_dDpi; + +public: + explicit QVideoSlider(QWidget *parent = 0); + + virtual void mousePressEvent(QMouseEvent* e); + virtual void resizeEvent(QResizeEvent* e); + +public: + void SetSeekOnClick(bool bValue); +}; diff --git a/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pri b/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pri new file mode 100644 index 00000000..f3f2cd2e --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pri @@ -0,0 +1,70 @@ +QT += core gui printsupport widgets multimedia multimediawidgets + +TARGET = videoplayer +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +DEFINES += QT_DEPRECATED_WARNINGS +DEFINES += BUILD_VIDEO_LIBRARY + +CORE_ROOT_DIR = $$PWD/../../../core +PWD_ROOT_DIR = $$PWD +include($$CORE_ROOT_DIR/Common/base.pri) + +core_linux { + DEFINES += QFILEDIALOG_DONTUSENATIVEDIALOG +} + +LIBS += -L$$CORE_BUILDS_LIBRARIES_PATH -lkernel + +HEADERS += \ + ./src/lib_base.h \ + ./src/qpushbutton_icons.h \ + ./src/qfooterpanel.h \ + ./src/qvideoslider.h \ + ./src/qvideoplaylist.h \ + ./src/qascvideowidget.h + +SOURCES += \ + ./src/lib_base.cpp \ + ./src/qpushbutton_icons.cpp \ + ./src/qfooterpanel.cpp \ + ./src/qascvideoview.cpp \ + ./src/qvideoslider.cpp \ + ./src/qvideoplaylist.cpp \ + ./src/qascvideowidget.cpp + +HEADERS += \ + ./qascvideoview.h \ + +RESOURCES += \ + $$PWD_ROOT_DIR/IconsVideoPlayerLib.qrc + +libvlc { + + DEFINES += USE_VLC_LIBRARY + + isEmpty(VLC_DIR) { + VLC_DIR=$$PWD_ROOT_DIR/vlc + } + + INCLUDEPATH += $$VLC_DIR/$$CORE_BUILDS_PLATFORM_PREFIX/include + + VLC_LIB_PREFIX= + core_windows { + core_debug { + VLC_LIB_PREFIX=d + } + } + + core_windows { + LIBS += -L$$VLC_DIR/$$CORE_BUILDS_PLATFORM_PREFIX/lib -lVLCQtCore$$VLC_POSTFIX_LIB -lVLCQtWidgets$$VLC_POSTFIX_LIB + LIBS += -L$$VLC_DIR/$$CORE_BUILDS_PLATFORM_PREFIX/bin + } else { + LIBS += -L$$VLC_DIR/$$CORE_BUILDS_PLATFORM_PREFIX/bin -lVLCQtCore$$VLC_POSTFIX_LIB -lVLCQtWidgets$$VLC_POSTFIX_LIB + LIBS += -L$$VLC_DIR/$$CORE_BUILDS_PLATFORM_PREFIX/bin -lvlc -lvlccore + } + +} diff --git a/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pro b/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pro new file mode 100644 index 00000000..0e55e382 --- /dev/null +++ b/ChromiumBasedEditors/videoplayerlib/videoplayerlib.pro @@ -0,0 +1,9 @@ +QT += core gui printsupport widgets multimedia multimediawidgets + +TARGET = videoplayer +TEMPLATE = lib + +CONFIG += shared +CONFIG += plugin + +include($$PWD/videoplayerlib.pri)