diff --git a/applets/notifications/package/contents/ui/JobDetails.qml b/applets/notifications/package/contents/ui/JobDetails.qml index e161b19bf..b9b68f6b0 100644 --- a/applets/notifications/package/contents/ui/JobDetails.qml +++ b/applets/notifications/package/contents/ui/JobDetails.qml @@ -1,153 +1,161 @@ /* * Copyright 2019 Kai Uwe Broulik * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ import QtQuick 2.8 import QtQuick.Layouts 1.1 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.extras 2.0 as PlasmaExtras import org.kde.kcoreaddons 1.0 as KCoreAddons import org.kde.notificationmanager 1.0 as NotificationManager GridLayout { id: detailsGrid property QtObject jobDetails columns: 2 rowSpacing: Math.round(units.smallSpacing / 2) columnSpacing: units.smallSpacing // once you use Layout.column/Layout.row *all* of the items in the Layout have to use them Repeater { model: [1, 2] PlasmaExtras.DescriptiveLabel { Layout.column: 0 Layout.row: index Layout.alignment: Qt.AlignTop | Qt.AlignRight text: jobDetails["descriptionLabel" + modelData] && jobDetails["descriptionValue" + modelData] ? i18ndc("plasma_applet_org.kde.plasma.notifications", "Row description, e.g. Source", "%1:", jobDetails["descriptionLabel" + modelData]) : "" font: theme.smallestFont textFormat: Text.PlainText visible: text !== "" } } Repeater { model: [1, 2] PlasmaExtras.DescriptiveLabel { id: descriptionValueLabel Layout.column: 1 Layout.row: index Layout.fillWidth: true font: theme.smallestFont elide: Text.ElideMiddle textFormat: Text.PlainText wrapMode: Text.WrapAtWordBoundaryOrAnywhere + verticalAlignment: Text.AlignTop maximumLineCount: 5 visible: text !== "" + // Only let the label grow, never shrink, to avoid repeatedly resizing the dialog when copying many files + onImplicitHeightChanged: { + if (implicitHeight > Layout.preferredHeight) { + Layout.preferredHeight = implicitHeight; + } + } + Component.onCompleted: bindText() function bindText() { text = Qt.binding(function() { return jobDetails["descriptionLabel" + modelData] && jobDetails["descriptionValue" + modelData] ? jobDetails["descriptionValue" + modelData] : ""; }); } MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton onPressed: { // break binding so it doesn't update while the menu is opened descriptionValueLabel.text = descriptionValueLabel.text; descriptionValueMenu.open(mouse.x, mouse.y) } } EditContextMenu { id: descriptionValueMenu target: descriptionValueLabel // defer re-binding until after the "Copy" action in the menu has triggered onClosed: Qt.callLater(descriptionValueLabel.bindText) } } } Repeater { model: ["Bytes", "Files", "Directories"] PlasmaExtras.DescriptiveLabel { Layout.column: 1 Layout.row: 2 + index Layout.fillWidth: true text: { var processed = jobDetails["processed" + modelData]; var total = jobDetails["total" + modelData]; if (processed > 0 || total > 1) { if (processed > 0 && total > 0 && processed <= total) { switch(modelData) { case "Bytes": return i18ndc("plasma_applet_org.kde.plasma.notifications", "How many bytes have been copied", "%2 of %1", KCoreAddons.Format.formatByteSize(total), KCoreAddons.Format.formatByteSize(processed)) case "Files": return i18ndcp("plasma_applet_org.kde.plasma.notifications", "How many files have been copied", "%2 of %1 file", "%2 of %1 files", total, processed); case "Directories": return i18ndcp("plasma_applet_org.kde.plasma.notifications", "How many dirs have been copied", "%2 of %1 folder", "%2 of %1 folders", total, processed); } } else { switch(modelData) { case "Bytes": return KCoreAddons.Format.formatByteSize(processed || total) case "Files": return i18ndp("plasma_applet_org.kde.plasma.notifications", "%1 file", "%1 files", (processed || total)); case "Directories": return i18ndp("plasma_applet_org.kde.plasma.notifications", "%1 folder", "%1 folders", (processed || total)); } } } return ""; } font: theme.smallestFont textFormat: Text.PlainText visible: text !== "" } } PlasmaExtras.DescriptiveLabel { Layout.column: 1 Layout.row: 2 + 3 Layout.fillWidth: true text: jobDetails.speed > 0 ? i18ndc("plasma_applet_org.kde.plasma.notifications", "Bytes per second", "%1/s", KCoreAddons.Format.formatByteSize(jobDetails.speed)) : "" font: theme.smallestFont textFormat: Text.PlainText visible: text !== "" } } diff --git a/libtaskmanager/virtualdesktopinfo.cpp b/libtaskmanager/virtualdesktopinfo.cpp index 602d3667e..288f2e943 100644 --- a/libtaskmanager/virtualdesktopinfo.cpp +++ b/libtaskmanager/virtualdesktopinfo.cpp @@ -1,486 +1,484 @@ /******************************************************************** Copyright 2016 Eike Hein This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) version 3, or any later version accepted by the membership of KDE e.V. (or its successor approved by the membership of KDE e.V.), which shall act as a proxy defined in Section 6 of version 3 of the license. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . *********************************************************************/ #include "virtualdesktopinfo.h" #include #include #include #include #include #include #include #if HAVE_X11 #include #include #endif namespace TaskManager { class Q_DECL_HIDDEN VirtualDesktopInfo::Private : public QObject { Q_OBJECT public: - Private(VirtualDesktopInfo *q); + Private(); virtual ~Private() {} uint refCount = 1; virtual void init() = 0; virtual QVariant currentDesktop() const = 0; virtual int numberOfDesktops() const = 0; virtual QVariantList desktopIds() const = 0; virtual QStringList desktopNames() const = 0; virtual quint32 position(const QVariant &desktop) const = 0; virtual int desktopLayoutRows() const = 0; virtual void requestActivate(const QVariant &desktop) = 0; virtual void requestCreateDesktop(quint32 position) = 0; virtual void requestRemoveDesktop(quint32 position) = 0; Q_SIGNALS: void currentDesktopChanged() const; void numberOfDesktopsChanged() const; void desktopIdsChanged() const; void desktopNamesChanged() const; void desktopLayoutRowsChanged() const; - -protected: - VirtualDesktopInfo *q; }; -VirtualDesktopInfo::Private::Private(VirtualDesktopInfo *q) - : q(q) +VirtualDesktopInfo::Private::Private() { } #if HAVE_X11 class Q_DECL_HIDDEN VirtualDesktopInfo::XWindowPrivate : public VirtualDesktopInfo::Private { + Q_OBJECT public: - XWindowPrivate(VirtualDesktopInfo *q); + XWindowPrivate(); void init() override; QVariant currentDesktop() const override; int numberOfDesktops() const override; QVariantList desktopIds() const override; QStringList desktopNames() const override; quint32 position(const QVariant &desktop) const override; int desktopLayoutRows() const override; void requestActivate(const QVariant &desktop) override; void requestCreateDesktop(quint32 position) override; void requestRemoveDesktop(quint32 position) override; }; -VirtualDesktopInfo::XWindowPrivate::XWindowPrivate(VirtualDesktopInfo *q) - : VirtualDesktopInfo::Private(q) +VirtualDesktopInfo::XWindowPrivate::XWindowPrivate() + : VirtualDesktopInfo::Private() { init(); } void VirtualDesktopInfo::XWindowPrivate::init() { connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged, this, &VirtualDesktopInfo::XWindowPrivate::currentDesktopChanged); connect(KWindowSystem::self(), &KWindowSystem::numberOfDesktopsChanged, this, &VirtualDesktopInfo::XWindowPrivate::numberOfDesktopsChanged); connect(KWindowSystem::self(), &KWindowSystem::desktopNamesChanged, this, &VirtualDesktopInfo::XWindowPrivate::desktopNamesChanged); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.connect(QString(), QStringLiteral("/KWin"), QStringLiteral("org.kde.KWin"), QStringLiteral("reloadConfig"), this, SIGNAL(desktopLayoutRowsChanged())); } QVariant VirtualDesktopInfo::XWindowPrivate::currentDesktop() const { return KWindowSystem::currentDesktop(); } int VirtualDesktopInfo::XWindowPrivate::numberOfDesktops() const { return KWindowSystem::numberOfDesktops(); } QVariantList VirtualDesktopInfo::XWindowPrivate::desktopIds() const { QVariantList ids; for (int i = 1; i <= KWindowSystem::numberOfDesktops(); ++i) { ids << i; } return ids; } QStringList VirtualDesktopInfo::XWindowPrivate::desktopNames() const { QStringList names; // Virtual desktop numbers start at 1. for (int i = 1; i <= KWindowSystem::numberOfDesktops(); ++i) { names << KWindowSystem::desktopName(i); } return names; } quint32 VirtualDesktopInfo::XWindowPrivate::position(const QVariant &desktop) const { bool ok = false; const quint32 desktopNumber = desktop.toUInt(&ok); if (!ok) { return -1; } return desktopNumber; } int VirtualDesktopInfo::XWindowPrivate::desktopLayoutRows() const { const NETRootInfo info(QX11Info::connection(), NET::NumberOfDesktops | NET::DesktopNames, NET::WM2DesktopLayout); return info.desktopLayoutColumnsRows().height(); } void VirtualDesktopInfo::XWindowPrivate::requestActivate(const QVariant &desktop) { bool ok = false; const int desktopNumber = desktop.toInt(&ok); // Virtual desktop numbers start at 1. if (ok && desktopNumber > 0 && desktopNumber <= KWindowSystem::numberOfDesktops()) { KWindowSystem::setCurrentDesktop(desktopNumber); } } void VirtualDesktopInfo::XWindowPrivate::requestCreateDesktop(quint32 position) { Q_UNUSED(position) NETRootInfo info(QX11Info::connection(), NET::NumberOfDesktops); info.setNumberOfDesktops(info.numberOfDesktops() + 1); } void VirtualDesktopInfo::XWindowPrivate::requestRemoveDesktop(quint32 position) { Q_UNUSED(position) NETRootInfo info(QX11Info::connection(), NET::NumberOfDesktops); if (info.numberOfDesktops() > 1) { info.setNumberOfDesktops(info.numberOfDesktops() - 1); } } #endif class Q_DECL_HIDDEN VirtualDesktopInfo::WaylandPrivate : public VirtualDesktopInfo::Private { + Q_OBJECT public: - WaylandPrivate(VirtualDesktopInfo *q); + WaylandPrivate(); QVariant currentVirtualDesktop; QStringList virtualDesktops; KWayland::Client::PlasmaVirtualDesktopManagement *virtualDesktopManagement = nullptr; void init() override; void addDesktop(const QString &id, quint32 position); QVariant currentDesktop() const override; int numberOfDesktops() const override; QVariantList desktopIds() const override; QStringList desktopNames() const override; quint32 position(const QVariant &desktop) const override; int desktopLayoutRows() const override; void requestActivate(const QVariant &desktop) override; void requestCreateDesktop(quint32 position) override; void requestRemoveDesktop(quint32 position) override; }; -VirtualDesktopInfo::WaylandPrivate::WaylandPrivate(VirtualDesktopInfo *q) - : VirtualDesktopInfo::Private(q) +VirtualDesktopInfo::WaylandPrivate::WaylandPrivate() + : VirtualDesktopInfo::Private() { init(); } void VirtualDesktopInfo::WaylandPrivate::init() { if (!KWindowSystem::isPlatformWayland()) { return; } - KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(q); + KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(this); if (!connection) { return; } - KWayland::Client::Registry *registry = new KWayland::Client::Registry(q); + KWayland::Client::Registry *registry = new KWayland::Client::Registry(this); registry->create(connection); QObject::connect(registry, &KWayland::Client::Registry::plasmaVirtualDesktopManagementAnnounced, [this, registry] (quint32 name, quint32 version) { - virtualDesktopManagement = registry->createPlasmaVirtualDesktopManagement(name, version, q); + virtualDesktopManagement = registry->createPlasmaVirtualDesktopManagement(name, version, this); const QList &desktops = virtualDesktopManagement->desktops(); - QObject::connect(virtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::desktopCreated, q, + QObject::connect(virtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::desktopCreated, this, [this](const QString &id, quint32 position) { addDesktop(id, position); } ); - QObject::connect(virtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::desktopRemoved, q, + QObject::connect(virtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::desktopRemoved, this, [this](const QString &id) { virtualDesktops.removeOne(id); emit numberOfDesktopsChanged(); emit desktopIdsChanged(); emit desktopNamesChanged(); if (currentVirtualDesktop == id) { currentVirtualDesktop.clear(); emit currentDesktopChanged(); } } ); QObject::connect(virtualDesktopManagement, &KWayland::Client::PlasmaVirtualDesktopManagement::rowsChanged, this, &VirtualDesktopInfo::WaylandPrivate::desktopLayoutRowsChanged); } ); registry->setup(); } void VirtualDesktopInfo::WaylandPrivate::addDesktop(const QString &id, quint32 position) { if (virtualDesktops.indexOf(id) != -1) { return; } virtualDesktops.insert(position, id); emit numberOfDesktopsChanged(); emit desktopIdsChanged(); emit desktopNamesChanged(); const KWayland::Client::PlasmaVirtualDesktop *desktop = virtualDesktopManagement->getVirtualDesktop(id); - QObject::connect(desktop, &KWayland::Client::PlasmaVirtualDesktop::activated, q, + QObject::connect(desktop, &KWayland::Client::PlasmaVirtualDesktop::activated, this, [desktop, this]() { currentVirtualDesktop = desktop->id(); emit currentDesktopChanged(); } ); - QObject::connect(desktop, &KWayland::Client::PlasmaVirtualDesktop::done, q, + QObject::connect(desktop, &KWayland::Client::PlasmaVirtualDesktop::done, this, [this]() { emit desktopNamesChanged(); } ); if (desktop->isActive()) { currentVirtualDesktop = id; emit currentDesktopChanged(); } } QVariant VirtualDesktopInfo::WaylandPrivate::currentDesktop() const { return currentVirtualDesktop; } int VirtualDesktopInfo::WaylandPrivate::numberOfDesktops() const { return virtualDesktops.count(); } quint32 VirtualDesktopInfo::WaylandPrivate::position(const QVariant &desktop) const { return virtualDesktops.indexOf(desktop.toString()); } QVariantList VirtualDesktopInfo::WaylandPrivate::desktopIds() const { QVariantList ids; foreach (const QString &id, virtualDesktops) { ids << id; } return ids; } QStringList VirtualDesktopInfo::WaylandPrivate::desktopNames() const { if (!virtualDesktopManagement) { return QStringList(); } QStringList names; foreach(const QString &id, virtualDesktops) { const KWayland::Client::PlasmaVirtualDesktop *desktop = virtualDesktopManagement->getVirtualDesktop(id); if (desktop) { names << desktop->name(); } } return names; } int VirtualDesktopInfo::WaylandPrivate::desktopLayoutRows() const { if (!virtualDesktopManagement) { return 0; } return virtualDesktopManagement->rows(); } void VirtualDesktopInfo::WaylandPrivate::requestActivate(const QVariant &desktop) { if (!virtualDesktopManagement) { return; } KWayland::Client::PlasmaVirtualDesktop *desktopObj = virtualDesktopManagement->getVirtualDesktop(desktop.toString()); if (desktopObj) { desktopObj->requestActivate(); } } void VirtualDesktopInfo::WaylandPrivate::requestCreateDesktop(quint32 position) { if (!virtualDesktopManagement) { return; } virtualDesktopManagement->requestCreateVirtualDesktop(i18n("New Desktop"), position); } void VirtualDesktopInfo::WaylandPrivate::requestRemoveDesktop(quint32 position) { if (!virtualDesktopManagement) { return; } if (virtualDesktops.count() == 1) { return; } if (position > ((quint32)virtualDesktops.count() - 1)) { return; } virtualDesktopManagement->requestRemoveVirtualDesktop(virtualDesktops.at(position)); } VirtualDesktopInfo::Private* VirtualDesktopInfo::d = nullptr; VirtualDesktopInfo::VirtualDesktopInfo(QObject *parent) : QObject(parent) { if (!d) { #if HAVE_X11 if (KWindowSystem::isPlatformX11()) { - d = new VirtualDesktopInfo::XWindowPrivate(this); + d = new VirtualDesktopInfo::XWindowPrivate; } else #endif { - d = new VirtualDesktopInfo::WaylandPrivate(this); + d = new VirtualDesktopInfo::WaylandPrivate; } } else { ++d->refCount; } connect(d, &VirtualDesktopInfo::Private::currentDesktopChanged, this, &VirtualDesktopInfo::currentDesktopChanged); connect(d, &VirtualDesktopInfo::Private::numberOfDesktopsChanged, this, &VirtualDesktopInfo::numberOfDesktopsChanged); connect(d, &VirtualDesktopInfo::Private::desktopIdsChanged, this, &VirtualDesktopInfo::desktopIdsChanged); connect(d, &VirtualDesktopInfo::Private::desktopNamesChanged, this, &VirtualDesktopInfo::desktopNamesChanged); connect(d, &VirtualDesktopInfo::Private::desktopLayoutRowsChanged, this, &VirtualDesktopInfo::desktopLayoutRowsChanged); } VirtualDesktopInfo::~VirtualDesktopInfo() { --d->refCount; if (!d->refCount) { delete d; d = nullptr; } } QVariant VirtualDesktopInfo::currentDesktop() const { return d->currentDesktop(); } int VirtualDesktopInfo::numberOfDesktops() const { return d->numberOfDesktops(); } QVariantList VirtualDesktopInfo::desktopIds() const { return d->desktopIds(); } QStringList VirtualDesktopInfo::desktopNames() const { return d->desktopNames(); } quint32 VirtualDesktopInfo::position(const QVariant &desktop) const { return d->position(desktop); } int VirtualDesktopInfo::desktopLayoutRows() const { return d->desktopLayoutRows(); } void VirtualDesktopInfo::requestActivate(const QVariant &desktop) { d->requestActivate(desktop); } void VirtualDesktopInfo::requestCreateDesktop(quint32 position) { return d->requestCreateDesktop(position); } void VirtualDesktopInfo::requestRemoveDesktop(quint32 position) { return d->requestRemoveDesktop(position); } } #include "virtualdesktopinfo.moc"