diff options
Diffstat (limited to 'tests/manual/jumplist')
-rw-r--r-- | tests/manual/jumplist/main.cpp | 79 | ||||
-rw-r--r-- | tests/manual/jumplist/testwidget.cpp | 90 | ||||
-rw-r--r-- | tests/manual/jumplist/testwidget.h | 26 | ||||
-rw-r--r-- | tests/manual/jumplist/testwidget.ui | 385 |
4 files changed, 356 insertions, 224 deletions
diff --git a/tests/manual/jumplist/main.cpp b/tests/manual/jumplist/main.cpp index f2bb7f8..78d101c 100644 --- a/tests/manual/jumplist/main.cpp +++ b/tests/manual/jumplist/main.cpp @@ -34,42 +34,93 @@ #include "testwidget.h" #include <QApplication> -#include <QSettings> +#include <QCommandLineParser> +#include <QCommandLineOption> #include <QDir> +#include <QDebug> +#include <QMimeDatabase> +#include <QSettings> +#include <QStatusBar> -void associateFileType() -{ - QString exeFileName = QCoreApplication::applicationFilePath(); - exeFileName = exeFileName.right(exeFileName.length() - exeFileName.lastIndexOf("/") - 1); - QString appName = "QtWinExtras JumpList Test"; +#include <algorithm> +#include <iterator> +static bool associateFileType() +{ + const QString applicationBinary = QCoreApplication::applicationFilePath(); + QString exeFileName = applicationBinary; + const int lastSlashPos = exeFileName.lastIndexOf(QLatin1Char('/')); + exeFileName.remove(0, lastSlashPos + 1); QSettings regApplications("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + exeFileName, QSettings::NativeFormat); - regApplications.setValue("FriendlyAppName", appName); + regApplications.setValue("FriendlyAppName", QGuiApplication::applicationDisplayName()); regApplications.beginGroup("SupportedTypes"); - regApplications.setValue(".txt", QString()); + QMimeDatabase mimeDatabase; + foreach (const QString &t, TestWidget::supportedMimeTypes()) { + foreach (const QString &s, mimeDatabase.mimeTypeForName(t).suffixes()) + regApplications.setValue('.' + s, QString()); + } regApplications.endGroup(); regApplications.beginGroup("shell"); regApplications.beginGroup("open"); - regApplications.setValue("FriendlyAppName", appName); + regApplications.setValue("FriendlyAppName", QGuiApplication::applicationDisplayName()); regApplications.beginGroup("command"); - regApplications.setValue(".", '"' + QDir::toNativeSeparators(QCoreApplication::applicationFilePath()) + "\" \"%1\""); + regApplications.setValue(".", '"' + QDir::toNativeSeparators(applicationBinary) + "\" \"%1\""); regApplications.endGroup(); regApplications.endGroup(); regApplications.endGroup(); + return regApplications.status() == QSettings::NoError; } int main(int argc, char *argv[]) { - QApplication a(argc, argv); - associateFileType(); + QStringList allArgs; // Show all arguments including style. + std::copy(argv + 1, argv + argc, std::back_inserter(allArgs)); + + QApplication app(argc, argv); + QGuiApplication::setApplicationDisplayName(QStringLiteral("QtWinExtras JumpList Test")); + if (!associateFileType()) { + qWarning() << "Unable to create registry entries."; + return -1; + } + + QCoreApplication::setOrganizationName("QtProject"); + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCommandLineParser parser; + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); + parser.setApplicationDescription(QGuiApplication::applicationDisplayName()); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption textOption("text", "Show some text"); + parser.addOption(textOption); + QCommandLineOption fullScreenOption("fullscreen", "Show fullscreen"); + parser.addOption(fullScreenOption); + QCommandLineOption idOption("id", "Jump list identifier", "id"); + parser.addOption(idOption); + parser.addPositionalArgument("file", "The file to open."); + parser.process(app); TestWidget w; - if (QCoreApplication::arguments().contains("-fullscreen")) + + if (parser.isSet(idOption)) + w.setId(parser.value(idOption)); + + if (parser.isSet(fullScreenOption)) w.showFullScreen(); else w.show(); - return a.exec(); + if (parser.isSet(textOption)) + w.setText("Hello, world!"); + + if (!parser.positionalArguments().isEmpty()) + w.showFile(parser.positionalArguments().first()); + + if (allArgs.isEmpty()) + w.statusBar()->showMessage("Remember to run windeployqt"); + else + w.statusBar()->showMessage("Arguments: " + allArgs.join(' ')); + + return app.exec(); } diff --git a/tests/manual/jumplist/testwidget.cpp b/tests/manual/jumplist/testwidget.cpp index e6660e4..15982a6 100644 --- a/tests/manual/jumplist/testwidget.cpp +++ b/tests/manual/jumplist/testwidget.cpp @@ -38,34 +38,27 @@ #include <QStyle> #include <QFile> #include <QFileDialog> +#include <QDesktopServices> #include <QMessageBox> +#include <QProcess> +#include <QStatusBar> +#include <QUrl> #include <QWinJumpList> #include <QWinJumpListItem> #include <QWinJumpListCategory> #include <QDebug> TestWidget::TestWidget(QWidget *parent) : - QWidget(parent), + QMainWindow(parent), ui(new Ui::TestWidget) { ui->setupUi(this); - if (QCoreApplication::arguments().contains("-text")) - ui->text->setPlainText("Hello, world!"); - if (!QCoreApplication::arguments().contains("-fullscreen")) - ui->btnClose->hide(); - - for (int i = 1; i < QCoreApplication::arguments().size(); i++) { - const QString arg = QCoreApplication::arguments().at(i); - if (!arg.isEmpty() && arg.at(0) != '-' && QFile(arg).exists()) { - showFile(arg); - break; - } - } - - connect(ui->btnUpdate, &QAbstractButton::clicked, this, &TestWidget::updateJumpList); - connect(ui->btnOpenFile, &QAbstractButton::clicked, this, &TestWidget::openFile); - connect(ui->btnClose, &QAbstractButton::clicked, QCoreApplication::quit); + connect(ui->actionUpdate, &QAction::triggered, this, &TestWidget::updateJumpList); + connect(ui->actionOpen, &QAction::triggered, this, &TestWidget::openFile); + connect(ui->actionExit, &QAction::triggered, QCoreApplication::quit); + connect(ui->actionShow_in_Explorer, &QAction::triggered, this, &TestWidget::showInExplorer); + connect(ui->actionRun_JumpListView, &QAction::triggered, this, &TestWidget::runJumpListView); } TestWidget::~TestWidget() @@ -73,6 +66,12 @@ TestWidget::~TestWidget() delete ui; } +QStringList TestWidget::supportedMimeTypes() +{ + return QStringList() << "text/x-c++src" << "text/x-csrc" << "text/x-chdr" + << "text/x-c++hdr" << "text/x-qml" << "text/plain"; +} + void TestWidget::changeEvent(QEvent *e) { QWidget::changeEvent(e); @@ -88,40 +87,73 @@ void TestWidget::changeEvent(QEvent *e) void TestWidget::showFile(const QString &path) { QFile file(path); - if (file.open(QIODevice::ReadOnly|QIODevice::Text)) - ui->text->setPlainText(QString::fromUtf8(file.readAll())); - else - QMessageBox::warning(this, "Error", "Failed to open file"); + if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) { + const QString error = "Failed to open file " + QDir::toNativeSeparators(path) + + ": " + file.errorString(); + QMessageBox::warning(this, "Error", error); + return; + } + setText(QString::fromUtf8(file.readAll())); +} + +void TestWidget::setText(const QString &text) +{ + ui->text->setPlainText(text); } void TestWidget::updateJumpList() { QWinJumpList jumplist; + if (!m_id.isEmpty()) + jumplist.setIdentifier(m_id); + const QString applicationBinary = QDir::toNativeSeparators(QCoreApplication::applicationFilePath()); jumplist.recent()->setVisible(ui->cbShowRecent->isChecked()); jumplist.frequent()->setVisible(ui->cbShowFrequent->isChecked()); if (ui->cbRunFullscreen->isChecked()) { QWinJumpListItem *item = new QWinJumpListItem(QWinJumpListItem::Link); item->setTitle(ui->cbRunFullscreen->text()); - item->setFilePath(QDir::toNativeSeparators(QCoreApplication::applicationFilePath())); + item->setFilePath(applicationBinary); item->setArguments(QStringList("-fullscreen")); item->setIcon(style()->standardIcon(QStyle::SP_TitleBarMaxButton)); jumplist.tasks()->addItem(item); } if (ui->cbRunFusion->isChecked()) { - jumplist.tasks()->addLink(style()->standardIcon(QStyle::SP_DesktopIcon), ui->cbRunFusion->text(), QDir::toNativeSeparators(QCoreApplication::applicationFilePath()), (QStringList() << "-style" << "fusion")); + jumplist.tasks()->addLink(style()->standardIcon(QStyle::SP_DesktopIcon), + ui->cbRunFusion->text(), + applicationBinary, + (QStringList() << "-style" << "fusion")); } if (ui->cbRunText->isChecked()) { jumplist.tasks()->addSeparator(); - jumplist.tasks()->addLink(ui->cbRunText->text(), QDir::toNativeSeparators(QCoreApplication::applicationFilePath()), QStringList("-text")); + jumplist.tasks()->addLink(ui->cbRunText->text(), + applicationBinary, + QStringList("-text")); } jumplist.tasks()->setVisible(!jumplist.tasks()->isEmpty()); } void TestWidget::openFile() { - QString filePath = QFileDialog::getOpenFileName(this, "Open a text file", QString(), "Text files (*.txt)"); - if (filePath.isEmpty()) - return; - else - showFile(filePath); + QFileDialog fileDialog(this, "Open a Text File"); + fileDialog.setAcceptMode(QFileDialog::AcceptOpen); + fileDialog.setMimeTypeFilters(TestWidget::supportedMimeTypes()); + // Note: The native file dialog creates the frequent/recent entries. + if (!ui->actionUse_Native_File_Dialog->isChecked()) + fileDialog.setOption(QFileDialog::DontUseNativeDialog); + if (fileDialog.exec() == QDialog::Accepted) + showFile(fileDialog.selectedFiles().first()); +} + +void TestWidget::showInExplorer() +{ + const QString path = QFile::decodeName(qgetenv("APPDATA")) + + "/Microsoft/Windows/Recent/Automaticdestinations"; + QDesktopServices::openUrl(QUrl::fromLocalFile(path)); +} + +void TestWidget::runJumpListView() +{ + const char binary[] = "JumpListsView"; + if (!QProcess::startDetached(binary)) + statusBar()->showMessage(QLatin1String("Unable to run ") + binary); } diff --git a/tests/manual/jumplist/testwidget.h b/tests/manual/jumplist/testwidget.h index 71287c5..defb541 100644 --- a/tests/manual/jumplist/testwidget.h +++ b/tests/manual/jumplist/testwidget.h @@ -34,7 +34,7 @@ #ifndef TESTWIDGET_H #define TESTWIDGET_H -#include <QWidget> +#include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { @@ -46,24 +46,34 @@ QT_END_NAMESPACE namespace Ui = QT_NAMESPACE::Ui; #endif -class TestWidget : public QWidget +class TestWidget : public QMainWindow { Q_OBJECT public: - explicit TestWidget(QWidget *parent = 0); + explicit TestWidget(QWidget *parent = Q_NULLPTR); ~TestWidget(); -protected: - void changeEvent(QEvent *e); - -private: - Ui::TestWidget *ui; void showFile(const QString &path); + void setText(const QString &text); + + static QStringList supportedMimeTypes(); + + QString id() const { return m_id; } + void setId(const QString &id) { m_id = id; } + +protected: + void changeEvent(QEvent *e) Q_DECL_OVERRIDE; private slots: void updateJumpList(); + void showInExplorer(); + void runJumpListView(); void openFile(); + +private: + Ui::TestWidget *ui; + QString m_id; }; #endif // TESTWIDGET_H diff --git a/tests/manual/jumplist/testwidget.ui b/tests/manual/jumplist/testwidget.ui index 82b9a0d..abcb078 100644 --- a/tests/manual/jumplist/testwidget.ui +++ b/tests/manual/jumplist/testwidget.ui @@ -1,196 +1,235 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>TestWidget</class> - <widget class="QWidget" name="TestWidget"> + <widget class="QMainWindow" name="TestWidget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>695</width> - <height>394</height> + <width>800</width> + <height>600</height> </rect> </property> - <property name="windowTitle"> - <string>QtWinExtras JumpList</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1"> - <property name="spacing"> - <number>3</number> - </property> - <property name="margin"> - <number>3</number> + <widget class="QWidget" name="centralwidget"> + <property name="windowTitle"> + <string>QtWinExtras JumpList</string> </property> - <item> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Known categories</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>3</number> - </property> - <property name="margin"> - <number>3</number> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Known categories</string> </property> - <item> - <widget class="QCheckBox" name="cbShowFrequent"> - <property name="text"> - <string>Frequent</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbShowRecent"> - <property name="text"> - <string>Recent</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>Tasks</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>3</number> - </property> - <property name="margin"> - <number>3</number> - </property> - <item> - <widget class="QCheckBox" name="cbRunFullscreen"> - <property name="text"> - <string>Run in fullscreen</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbRunFusion"> - <property name="text"> - <string>Run with Fusion style</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbRunText"> - <property name="text"> - <string>Run with some text displayed</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>3</number> + </property> + <property name="leftMargin"> + <number>3</number> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <property name="topMargin"> + <number>3</number> </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="btnUpdate"> - <property name="text"> - <string>Update</string> + <property name="rightMargin"> + <number>3</number> </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <property name="bottomMargin"> + <number>3</number> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <item> + <widget class="QCheckBox" name="cbShowFrequent"> + <property name="text"> + <string>Frequent</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbShowRecent"> + <property name="text"> + <string>Recent</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Tasks</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="spacing"> + <number>3</number> </property> - </spacer> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <property name="spacing"> - <number>3</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QPushButton" name="btnOpenFile"> - <property name="text"> - <string>Open a file</string> + <property name="leftMargin"> + <number>3</number> </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <property name="topMargin"> + <number>3</number> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> + <property name="rightMargin"> + <number>3</number> </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="btnClose"> - <property name="text"> - <string>Close</string> + <property name="bottomMargin"> + <number>3</number> </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTextEdit" name="text"> - <property name="font"> - <font> - <family>Consolas</family> - <pointsize>10</pointsize> - </font> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> + <item> + <widget class="QCheckBox" name="cbRunFullscreen"> + <property name="text"> + <string>Run in fullscreen</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbRunFusion"> + <property name="text"> + <string>Run with Fusion style</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="cbRunText"> + <property name="text"> + <string>Run with some text displayed</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QTextEdit" name="text"> + <property name="font"> + <font> + <family>Consolas</family> + <pointsize>10</pointsize> + </font> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menuBar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>800</width> + <height>21</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>File</string> + </property> + <addaction name="actionOpen"/> + <addaction name="actionExit"/> + </widget> + <widget class="QMenu" name="menuJumplist"> + <property name="title"> + <string>Jumplist</string> + </property> + <addaction name="actionUpdate"/> + <addaction name="actionShow_in_Explorer"/> + <addaction name="actionRun_JumpListView"/> + </widget> + <widget class="QMenu" name="menuSettings"> + <property name="title"> + <string>Settings</string> + </property> + <addaction name="actionUse_Native_File_Dialog"/> + </widget> + <addaction name="menuFile"/> + <addaction name="menuJumplist"/> + <addaction name="menuSettings"/> + </widget> + <action name="actionOpen"> + <property name="text"> + <string>Open</string> + </property> + <property name="shortcut"> + <string>Ctrl+O</string> + </property> + </action> + <action name="actionExit"> + <property name="text"> + <string>Exit</string> + </property> + <property name="shortcut"> + <string>Ctrl+Q</string> + </property> + </action> + <action name="actionUpdate"> + <property name="text"> + <string>Update</string> + </property> + <property name="shortcut"> + <string>Ctrl+U</string> + </property> + </action> + <action name="actionShow_in_Explorer"> + <property name="text"> + <string>Show in Explorer</string> + </property> + <property name="shortcut"> + <string>Ctrl+E</string> + </property> + </action> + <action name="actionRun_JumpListView"> + <property name="text"> + <string>Run JumpListView</string> + </property> + <property name="toolTip"> + <string>Run JumpListView utility</string> + </property> + </action> + <action name="actionUse_Native_File_Dialog"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Use Native File Dialog</string> + </property> + </action> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> |