diff --git a/CMakeLists.txt b/CMakeLists.txt index a16f6c8..ab037c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,75 +1,100 @@ project( klook ) -cmake_minimum_required( VERSION 2.6 ) +cmake_minimum_required( VERSION 3.10 FATAL_ERROR ) +set (QT_MIN_VERSION "5.9.0") +set (KF5_MIN_VERSION "5.35.0") # TODO: find an appropriate version -find_package( KDE4 REQUIRED ) -include( KDE4Defaults ) -find_package(KDeclarative) +find_package(ECM ${KF5_MIN_VERSION} REQUIRED CONFIG) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) -find_package( Qt4 REQUIRED QtCore QtGui QtDeclarative ) -include( ${QT_USE_FILE} ) -qt4_automoc( ${qtproject_SRCS} ) -add_definitions( ${QT_DEFINITIONS}) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") # Yeah, everything is deprecated, we know + +include(FeatureSummary) +include(ECMAddAppIcon) +include(ECMInstallIcons) +include(KDEInstallDirs) +include(KDECompilerSettings NO_POLICY_SCOPE) +include(KDECMakeSettings) + +kde_enable_exceptions() # We actually use/handle exceptions + +find_package( Qt5 ${QT_MIN_VERSION} NO_MODULE REQUIRED Core Gui Quick Qml) + +find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS + KDELibs4Support + KIO + Parts + Declarative + Plasma +) + +find_package(Phonon4Qt5 REQUIRED) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) -include_directories( ${KDE4_INCLUDES} ${QT_QDECLARATIVE_INCLUDE_DIR} ${KDECLARATIVE_INCLUDE_DIRS} ) add_subdirectory( icons ) set(EXIV2_MIN_VERSION "0.19") find_package(Exiv2) -macro_log_feature(EXIV2_FOUND "Exiv2" "Provides image metadata support" "http://www.exiv2.org" TRUE ${EXIV2_MIN_VERSION} "") -set( RESOURCES src/resources.qrc ) -QT4_ADD_RESOURCES( QRC_SOURCES ${RESOURCES} ) +set( QRC_RESOURCES src/resources.qrc ) file( GLOB qml_files "${CMAKE_CURRENT_SOURCE_DIR}/src/qml/*.qml" ) set( klook_SRCS src/main.cpp src/declarativeviewer.cpp src/video.cpp src/text.cpp src/file.cpp src/listitem.cpp src/previewgenerator.cpp src/previewprovider.cpp src/filemodel.cpp src/klookapp.cpp src/audio.cpp src/mimeprovider.cpp src/kpartsdeclarativeitem.cpp src/kpartswidget.cpp src/listitemcontent.cpp src/exifimageprovider.cpp src/rotatedimage.cpp ${qml_files} ) -set_source_files_properties(src/rotatedimage.cpp PROPERTIES COMPILE_FLAGS ${KDE4_ENABLE_EXCEPTIONS}) +#set_source_files_properties(src/rotatedimage.cpp PROPERTIES COMPILE_FLAGS ${KDE4_ENABLE_EXCEPTIONS}) + +file(GLOB ICON_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi*-apps-klook.png" ) +ecm_add_app_icon(klook_SRCS ICONS ${ICON_SRCS}) + +add_executable( klook ${klook_SRCS} ${QRC_SOURCES} ) -kde4_add_app_icon( klook_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi*-apps-klook.png" ) -kde4_add_executable( klook ${klook_SRCS} ${QRC_SOURCES} ) +target_include_directories(klook SYSTEM PUBLIC ${PHONON_INCLUDE_DIR}) -target_link_libraries( klook ${KDE4_KIO_LIBS} - ${EXIV2_LIBRARIES} - ${KDE4_PHONON_LIBS} - ${KDE4_PLASMA_LIBS} - ${KDE4_KFILE_LIBS} - kparts - ${KDECLARATIVE_LIBRARIES} - ${QT_LIBRARIES} - ${QT_QDECLARATIVE_LIBRARIES} - ) +target_link_libraries(klook KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM + ${EXIV2_LIBRARIES} + KF5::Plasma + ${PHONON_LIBRARY} + KF5::Parts + KF5::Declarative + KF5::KDELibs4Support + Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick + ) install( TARGETS klook ${INSTALL_TARGETS_DEFAULT_ARGS} ) install( FILES ${qml_files} DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/ ) install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/qml/images/ DESTINATION ${DATA_INSTALL_DIR}/${PROJECT_NAME}/images ) +#FIX AT SOME OTHER POINT IN TIME #Translations -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/locale) - find_package( Msgfmt REQUIRED ) - find_package( Gettext REQUIRED ) - add_subdirectory( locale ) -endif() +#if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/locale) + #find_package( Msgfmt REQUIRED ) + #find_package( Gettext REQUIRED ) + #add_subdirectory( locale ) +#endif() diff --git a/icons/CMakeLists.txt b/icons/CMakeLists.txt index 714baa0..48e0cce 100644 --- a/icons/CMakeLists.txt +++ b/icons/CMakeLists.txt @@ -1,2 +1,3 @@ -kde4_install_icons( ${ICON_INSTALL_DIR} ) -kde4_update_iconcache() +# FIXME +# akde4_install_icons( ${ICON_INSTALL_DIR} ) +# kde4_update_iconcache() diff --git a/src/audio.cpp b/src/audio.cpp index 5eb975d..35e4c94 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -1,239 +1,239 @@ /* KLook * Copyright (c) 2011-2012 ROSA * Authors: Julia Mineeva, Evgeniy Auzhin, Sergey Borovkov. * License: GPLv3 * * 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, * 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, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "audio.h" #include #include #include #include -#include -#include -#include +#include +#include +#include -Audio::Audio(QDeclarativeItem* parent) - : QDeclarativeItem(parent) +Audio::Audio(QQuickItem* parent) + : QQuickItem(parent) , m_isPreview(false) , m_isReady(false) { m_mediaObject = Phonon::createPlayer(Phonon::MusicCategory); m_mediaObject->setTickInterval(1000); QObject::connect(m_mediaObject, SIGNAL(tick(qint64)), SLOT(onTicked(qint64))); QObject::connect(m_mediaObject, SIGNAL(totalTimeChanged(qint64)), SLOT(onTotalTimeChanged(qint64))); QObject::connect(m_mediaObject, SIGNAL(finished()), SLOT(onFinished())); QObject::connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), SLOT(stateChanged(Phonon::State, Phonon::State))); } Audio::~Audio() { delete m_mediaObject; } void Audio::setPause() { if (!isVisible()) { pause(); } else { play(); } } bool Audio::isReady() { return m_isReady; } void Audio::setReady(bool b) { m_isReady = b; emit ready(); } void Audio::onFinished() { emit playFinished(); setPosition(0); } QString Audio::source() const { return m_mediaObject->currentSource().url().toString(); } void Audio::setSource(const KUrl& source) { m_mediaObject->setCurrentSource(source); emit sourceChanged(); } qlonglong Audio::position() const { return m_mediaObject->currentTime(); } void Audio::setPosition(qlonglong pos) { m_mediaObject->seek(pos); emit positionChanged(); } qlonglong Audio::totalTime() const { return m_mediaObject->totalTime(); } QTime Audio::duration() { QTime t; t = t.addMSecs(m_mediaObject->totalTime()); return t; } void Audio::onTotalTimeChanged(qint64 t) { Q_UNUSED(t) emit totalTimeChanged(); } void Audio::onTicked(qint64 t) { emit ticked(QVariant(t)); } bool Audio::playing() const { return (m_mediaObject->state() == Phonon::PlayingState); } bool Audio::paused() const { return (m_mediaObject->state() == Phonon::PausedState); } void Audio::play() { m_mediaObject->play(); } void Audio::pause() { m_mediaObject->pause(); } void Audio::play_or_pause() { if (playing()) { pause(); } else { play(); } } bool Audio::isPreview() const { return m_isPreview; } void Audio::setPreview(bool preview) { m_isPreview = preview; } void Audio::stateChanged(Phonon::State newState, Phonon::State oldState) { Q_UNUSED(newState) if ((oldState == Phonon::LoadingState) || (oldState == Phonon::StoppedState)) { setReady(true); } } QString Audio::artist() { QString artists; QStringList listArtists = m_mediaObject->metaData("ARTIST"); if (!listArtists.empty()) { artists = guessEncoding(listArtists.join(", ").toAscii()); } return artists; } QString Audio::album() { QString albums; QStringList listAlbums = m_mediaObject->metaData("ALBUM"); if (!listAlbums.empty()) { albums = guessEncoding(listAlbums.join(", ").toAscii()); } return albums; } QString Audio::title() { QString titles; QStringList listTitles = m_mediaObject->metaData("TITLE"); titles = guessEncoding(listTitles.join(", ").toAscii()); if (titles.isEmpty()) { QFileInfo fi(m_mediaObject->currentSource().url().path()); titles = fi.fileName(); } return titles; } QString Audio::guessEncoding(const QByteArray &data) { KEncodingProber prober(KEncodingProber::Universal); prober.feed(data); QString str = prober.confidence() > 0.7 ? QTextCodec::codecForName(prober.encoding())->toUnicode(data) : QString::fromUtf8(data); return str; } QString Audio::composer() { QString composers; QStringList listcomposers = m_mediaObject->metaData("COMPOSER"); if (!listcomposers.empty()) { composers = guessEncoding(listcomposers.join(", ").toAscii()); } return composers.toUtf8(); } QString Audio::genre() { QString genres; QStringList listgenres = m_mediaObject->metaData("GENRE"); if (!listgenres.empty()) { genres = guessEncoding(listgenres.join(", ").toAscii()); } return genres; } diff --git a/src/audio.h b/src/audio.h index 39a525b..1c6c605 100644 --- a/src/audio.h +++ b/src/audio.h @@ -1,120 +1,120 @@ /* KLook * Copyright (c) 2011-2012 ROSA * Authors: Julia Mineeva, Evgeniy Auzhin, Sergey Borovkov. * License: GPLv3 * * 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, * 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, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef AUDIO_H #define AUDIO_H #include -#include -#include -#include +#include +#include +#include #include class QHBoxLayout; -class Audio : public QDeclarativeItem +class Audio : public QQuickItem { Q_OBJECT Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(bool playing READ playing) Q_PROPERTY(bool paused READ paused) Q_PROPERTY(qlonglong totalTime READ totalTime NOTIFY totalTimeChanged) Q_PROPERTY(QTime duration READ duration) Q_PROPERTY(qlonglong position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(bool preview READ isPreview WRITE setPreview) Q_PROPERTY(bool ready READ isReady WRITE setReady NOTIFY ready) Q_PROPERTY(QString artist READ artist NOTIFY artistChanged) Q_PROPERTY(QString album READ album NOTIFY albumChanged) Q_PROPERTY(QString title READ title NOTIFY titleChanged) Q_PROPERTY(QString composer READ composer NOTIFY composerChanged) Q_PROPERTY(QString genre READ genre NOTIFY genreChanged) public: - Audio(QDeclarativeItem* parent = 0); + Audio(QQuickItem* parent = 0); ~Audio(); public slots: QString source() const; void setSource(const KUrl &source); bool playing() const; bool paused() const; void setPause(); bool isReady(); void setReady(bool b); qlonglong totalTime() const; QTime duration(); qlonglong position() const; void setPosition(qlonglong pos); QString artist(); QString album(); QString title(); QString composer(); QString genre(); void play_or_pause(); void play(); void pause(); void onTotalTimeChanged(qint64); void onTicked(qint64); void onFinished(); void stateChanged(Phonon::State oldState, Phonon::State newState); bool isPreview() const; void setPreview(bool preview); protected: Q_SIGNALS: void clicked(bool); void sourceChanged(); void totalTimeChanged(); void positionChanged(); void ticked(QVariant tick); void playFinished(); void ready(); void artistChanged(); void albumChanged(); void titleChanged(); void composerChanged(); void genreChanged(); private: QString guessEncoding(const QByteArray &data); Phonon::MediaObject* m_mediaObject; bool m_isPreview; bool m_isReady; }; #endif // AUDIO_H diff --git a/src/declarativeviewer.cpp b/src/declarativeviewer.cpp index ec91bd6..e0904c1 100644 --- a/src/declarativeviewer.cpp +++ b/src/declarativeviewer.cpp @@ -1,751 +1,742 @@ /* KLook * Copyright (c) 2011-2012 ROSA * Authors: Julia Mineeva, Evgeniy Auzhin, Sergey Borovkov. * License: GPLv3 * * 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, * 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, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "declarativeviewer.h" #include "audio.h" #include "exifimageprovider.h" #include "file.h" #include "filemodel.h" #include "kpartsdeclarativeitem.h" #include "kpartswidget.h" #include "listitem.h" #include "mimeprovider.h" #include "previewgenerator.h" #include "previewprovider.h" #include "text.h" #include "video.h" #include #include #include -#include -#include #include -#include -#include +#include +#include #include #include +#include -#include +#include #include #include -#include static int header_height = 27; static int border_width = 2; static int height_offset = 27; static int arrowIconWidth = 29; static int arrowIconHeight = 16; static int min_width = 600; static int min_height = 427; -DeclarativeViewer::DeclarativeViewer(QWidget* parent) - : QDeclarativeView(parent) +DeclarativeViewer::DeclarativeViewer(QWindow* parent) + : QQuickView(parent) , m_lastMousePosition(0, 0) , m_isSingleMode(true) , m_moving(false) , m_resize(false) , m_isEmbedded(false) , m_isGallery(false) , m_currentFile(0) , m_region(FRAME_REGION) { - KDeclarative kdeclarative; + KDeclarative::KDeclarative kdeclarative; kdeclarative.setDeclarativeEngine(engine()); kdeclarative.initialize(); kdeclarative.setupBindings(); - setOptimizationFlags(QGraphicsView::DontSavePainterState); - setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); - - setMouseTracking(true); - engine()->addImageProvider("preview", new PreviewProvider); engine()->addImageProvider("mime", new MimeProvider); engine()->addImageProvider("exif", new ExifImageProvider); - setResizeMode(QDeclarativeView::SizeRootObjectToView); + setResizeMode(QQuickView::SizeRootObjectToView); - setMinimumSize(min_width, min_height); + //setMinimumSize(min_width, min_height); TODO: fixme m_fileModel = new FileModel(this); m_fileModel->setRoleNames(ListItem::roleNames()); PreviewGenerator::instance()->setModel(m_fileModel); registerTypes(); - setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); + //setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); FIXME - setAttribute(Qt::WA_TranslucentBackground); - setStyleSheet("background:transparent;"); + //setAttribute(Qt::WA_TranslucentBackground); FIXME + //setStyleSheet("background:transparent;"); FIXME connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), SLOT(focusChanged(QWidget*, QWidget*))); connect(engine(), SIGNAL(quit()), qApp, SLOT(quit())); } DeclarativeViewer::~DeclarativeViewer() { delete PreviewGenerator::instance(); } void DeclarativeViewer::init(QStringList urls, bool embedded, const QRect& rc, int indexToShow) { if(!urls.size()) { qDebug() << "No files to display. Closing..."; qApp->exit(); return; } rootContext()->setContextProperty("indexToShow", indexToShow); initModel(urls); m_rcIcon = rc; setViewMode(urls.count() > 1 ? Multi : Single); rootContext()->setContextProperty("embedded", m_isEmbedded); setEmbedded(embedded); m_currentFile = m_fileModel->file(indexToShow); KWindowSystem::setState(winId(), NET::SkipTaskbar); if(!isVisible()) QTimer::singleShot(200, this, SLOT(showWindow())); emit setStartWindow(); } -void DeclarativeViewer::resizeEvent(QResizeEvent *event) -{ - if (KWindowSystem::compositingActive()) { - //QRegion mask(QRect(QPoint(), size())); - //Plasma::WindowEffects::enableBlurBehind(winId(), true, mask); - //Plasma::WindowEffects::overrideShadow(winId(), true); - } - - QDeclarativeView::resizeEvent(event); -} - void DeclarativeViewer::registerTypes() { qmlRegisterType