SplashApp::SplashApp(int &argc, char ** argv) : QApplication(argc, argv), m_stage(0), m_testing(false) { m_testing = arguments().contains(QStringLiteral("--test")); m_desktop = QApplication::desktop(); screenGeometryChanged(m_desktop->screenCount()); setStage(1); QPixmap cursor(32, 32); cursor.fill(QColor(0, 0, 0, 0)); setOverrideCursor(QCursor(cursor)); if (m_testing) { m_timer.start(TEST_STEP_INTERVAL, this); } connect(m_desktop, SIGNAL(screenCountChanged(int)), this, SLOT(screenGeometryChanged(int))); connect(m_desktop, SIGNAL(workAreaResized(int)), this, SLOT(screenGeometryChanged(int))); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject(QStringLiteral("/KSplash"), this, QDBusConnection::ExportScriptableSlots); dbus.registerService(QStringLiteral("org.kde.KSplash")); }
SplashApp::SplashApp(int &argc, char ** argv) : QGuiApplication(argc, argv), m_stage(0), m_testing(false), m_window(false), m_startTime(QDateTime::currentDateTime()) { QCommandLineParser parser; parser.addOption(QCommandLineOption(QStringLiteral("test"), QStringLiteral("Run in test mode"))); parser.addOption(QCommandLineOption(QStringLiteral("window"), QStringLiteral("Run in windowed mode"))); parser.addOption(QCommandLineOption(QStringLiteral("nofork"), QStringLiteral("Don't fork"))); parser.addOption(QCommandLineOption(QStringLiteral("pid"), QStringLiteral("Print the pid of the child process"))); parser.addHelpOption(); parser.process(*this); m_testing = parser.isSet(QStringLiteral("test")); m_window = parser.isSet(QStringLiteral("window")); foreach(QScreen* screen, screens()) adoptScreen(screen); setStage(QStringLiteral("initial")); QPixmap cursor(32, 32); cursor.fill(Qt::transparent); setOverrideCursor(QCursor(cursor)); if (m_testing) { m_timer.start(TEST_STEP_INTERVAL, this); } connect(this, &QGuiApplication::screenAdded, this, &SplashApp::adoptScreen); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject(QStringLiteral("/KSplash"), this, QDBusConnection::ExportScriptableSlots); dbus.registerService(QStringLiteral("org.kde.KSplash")); }
// Open a new file void MainWindow::handleOpenFileEvent(QString filename, QString filter) { // On Windows, we have to remove all three '/' after 'file:', on Linux, we need to leave one of them #ifdef Q_OS_WIN if(filename.startsWith("file:///")) filename = filename.remove(0,8); #else if(filename.startsWith("file://")) filename = filename.remove(0,7); #endif if(filename.trimmed() == "") { QMetaObject::invokeMethod(object, "openFile"); return; } variables->keepLoadingThumbnails = true; setOverrideCursor(); if(variables->verbose) LOG << CURDATE << "handleOpenFileEvent(): Handle response to request to open new file" << NL; // Decode filename QByteArray usethis = QByteArray::fromPercentEncoding(filename.trimmed().toUtf8()); // Store filter variables->openfileFilter = filter; QString file = ""; // Check return file file = usethis; QMetaObject::invokeMethod(object, "alsoIgnoreSystemShortcuts", Q_ARG(QVariant, false)); // Save current directory variables->currentDir = QFileInfo(file).absolutePath(); // Clear loaded thumbnails variables->loadedThumbnails.clear(); // Load direcgtory QFileInfoList l = loadDir->loadDir(file,variables->openfileFilter); if(l.isEmpty()) { QMetaObject::invokeMethod(object, "noResultsFromFilter"); restoreOverrideCursor(); return; } if(!l.contains(QFileInfo(file))) file = l.at(0).filePath(); // Get and store length int l_length = l.length(); settingsPerSession->setValue("countTot",l_length); // Convert QFileInfoList into QStringList and store it QStringList ll; for(int i = 0; i < l_length; ++i) ll.append(l.at(i).absoluteFilePath()); settingsPerSession->setValue("allFileList",ll); // Get and store current position int curPos = l.indexOf(QFileInfo(file)); settingsPerSession->setValue("curPos",curPos); // Setiup thumbnail model QMetaObject::invokeMethod(object, "setupModel", Q_ARG(QVariant, ll), Q_ARG(QVariant, curPos)); // Display current postiion in main image view QMetaObject::invokeMethod(object, "displayImage", Q_ARG(QVariant, curPos)); QVariant centerPos = curPos; if(!QMetaObject::invokeMethod(object, "getCenterPos", Q_RETURN_ARG(QVariant, centerPos))) std::cerr << CURDATE << "handleOpenFileEvent(): ERROR: couldn't get center pos!" << NL; // And handle the thumbnails handleThumbnails(centerPos.toInt()); restoreOverrideCursor(); }
MainWindow::MainWindow(bool verbose, QWindow *parent) : QQuickView(parent) { connect(this, SIGNAL(statusChanged(QQuickView::Status)), this, SLOT(loadStatus(QQuickView::Status))); #ifdef Q_OS_WIN QtWin::enableBlurBehindWindow(this); #endif // Settings and variables settingsPerSession = new SettingsSession; settingsPermanent = new Settings; fileformats = new FileFormats(verbose); variables = new Variables; shortcuts = new Shortcuts; touch = new TouchHandler; variables->verbose = verbose; overrideCursorHowOftenSet = 0; this->setMinimumSize(QSize(800,600)); // Add image providers this->engine()->addImageProvider("thumb",new ImageProviderThumbnail); this->engine()->addImageProvider("full",new ImageProviderFull); this->engine()->addImageProvider("icon",new ImageProviderIcon); // Add settings access to QML qmlRegisterType<Settings>("Settings", 1, 0, "Settings"); qmlRegisterType<FileFormats>("FileFormats", 1, 0, "FileFormats"); qmlRegisterType<SettingsSession>("SettingsSession", 1, 0, "SettingsSession"); qmlRegisterType<GetMetaData>("GetMetaData", 1, 0, "GetMetaData"); qmlRegisterType<GetAndDoStuff>("GetAndDoStuff", 1, 0, "GetAndDoStuff"); qmlRegisterType<ThumbnailManagement>("ThumbnailManagement", 1, 0, "ThumbnailManagement"); qmlRegisterType<ToolTip>("ToolTip", 1, 0, "ToolTip"); qmlRegisterType<ShortcutsNotifier>("ShortcutsNotifier", 1, 0, "ShortcutsNotifier"); qmlRegisterType<Colour>("Colour", 1, 0, "Colour"); // Load QML this->setSource(QUrl("qrc:/qml/mainwindow.qml")); this->setColor(QColor(Qt::transparent)); // Get object (for signals and stuff) object = this->rootObject(); // Class to load a new directory loadDir = new LoadDir(verbose); // Scrolled view connect(object, SIGNAL(thumbScrolled(int)), this, SLOT(handleThumbnails(int))); connect(object, SIGNAL(reloadDirectory(QString,QString)), this, SLOT(handleOpenFileEvent(QString,QString))); connect(object, SIGNAL(loadMoreThumbnails()), this, SLOT(loadMoreThumbnails())); connect(object, SIGNAL(didntLoadThisThumbnail(int)), this, SLOT(didntLoadThisThumbnail(int))); connect(object, SIGNAL(setOverrideCursor()), this, SLOT(setOverrideCursor())); connect(object, SIGNAL(restoreOverrideCursor()), this, SLOT(restoreOverrideCursor())); connect(object, SIGNAL(stopThumbnails()), this, SLOT(stopThumbnails())); connect(object, SIGNAL(reloadThumbnails()), this, SLOT(reloadThumbnails())); connect(object, SIGNAL(verboseMessage(QString,QString)), this, SLOT(qmlVerboseMessage(QString,QString))); // Hide/Quit window connect(object, SIGNAL(hideToSystemTray()), this, SLOT(hideToSystemTray())); connect(object, SIGNAL(quitPhotoQt()), this, SLOT(quitPhotoQt())); // React to some settings... connect(settingsPermanent, SIGNAL(trayiconChanged(int)), this, SLOT(showTrayIcon())); connect(settingsPermanent, SIGNAL(trayiconChanged(int)), this, SLOT(hideTrayIcon())); connect(settingsPermanent, SIGNAL(windowmodeChanged(bool)), this, SLOT(updateWindowGeometry())); connect(settingsPermanent, SIGNAL(windowDecorationChanged(bool)), this, SLOT(updateWindowGeometry())); connect(this, SIGNAL(xChanged(int)), this, SLOT(updateWindowXandY())); connect(this, SIGNAL(yChanged(int)), this, SLOT(updateWindowXandY())); // Pass on touchevent connect(touch, SIGNAL(receivedTouchEvent(QPointF,QPointF,qint64,int,QStringList)), this, SLOT(passOnTouchEvent(QPointF,QPointF,qint64,int,QStringList))); connect(touch, SIGNAL(setImageInteractiveMode(bool)), this, SLOT(setImageInteractiveMode(bool))); showTrayIcon(); // We need to call this with a little delay, as the automatic restoration of the window geometry at startup when window mode // is enabled doesn't update the actualy window x/y (and thus PhotoQt might be detected on the wrong screen which messes up // calculations involving local cursor coordinates (e.g., for 'close on click on grey')) QTimer::singleShot(100,this, SLOT(updateWindowXandY())); }