Kaynağa Gözat

Some small improvements

Malte Veerman 6 yıl önce
ebeveyn
işleme
c00bab54e6

+ 16 - 9
fancontrol-gui/package/contents/ui/Application.qml

@@ -30,7 +30,8 @@ Kirigami.ApplicationWindow {
     id: window
 
     property string leftPage
-    property QtObject fan: Fancontrol.Base.pwmFanModel.fans.length > 0 ? Fancontrol.Base.pwmFanModel.fans[0] : null
+    readonly property QtObject pwmFanModel: Fancontrol.Base.pwmFanModel
+    property QtObject fan: pwmFanModel.length > 0 ? pwmFanModel.fan(0) : null
 
     function showWindow() {
         window.show()
@@ -74,13 +75,13 @@ Kirigami.ApplicationWindow {
         handleVisible: !window.wideScreen
         resetMenuOnTriggered: false
 
-        function populateFans(fans) {
+        function populateFans() {
             for (var i=fansAction.children.length-1; i>=0; i--) {
                 fansAction.children[i].destroy();
             }
             var actions = [];
-            for (var i=0; i<fans.length; i++) {
-                var action = fanActionComponent.createObject(fansAction, { "fan": fans[i] });
+            for (var i=0; i<20; i++) {
+                var action = fanActionComponent.createObject(fansAction, { "index": i });
                 actions.push(action);
             }
             fansAction.children = actions;
@@ -90,20 +91,26 @@ Kirigami.ApplicationWindow {
             id: fanActionComponent
 
             Kirigami.Action {
-                property QtObject fan
+                property int index
+                property QtObject fan: pwmFanModel.fan(index)
 
-                text: fan.name
+                text: !!fan ? fan.name : ""
+                visible: !!fan
                 checked: window.fan === fan
 
                 onTriggered: window.fan = fan
             }
         }
 
-        Component.onCompleted: populateFans(Fancontrol.Base.pwmFanModel.fans)
+        Component.onCompleted: populateFans()
 
         Connections {
-            target: Fancontrol.Base.pwmFanModel
-            onFansChanged: populateFans(Fancontrol.Base.pwmFanModel.fans)
+            target: pwmFanModel
+            onFansChanged: {
+                for (var i=0; i<pwmFanModel.length && i<fansAction.children.length; i++) {
+                    fansAction.children[i].fan = pwmFanModel.fan(i);
+                }
+            }
         }
 
         actions: [

+ 1 - 1
fancontrol-gui/package/contents/ui/ConfigfileTab.qml

@@ -28,7 +28,7 @@ import Fancontrol.Qml 1.0 as Fancontrol
 Kirigami.ScrollablePage {
     id: root
 
-    property QtObject loader: Fancontrol.Base.loader
+    readonly property QtObject loader: Fancontrol.Base.loader
 
     header: Label {
         text: !!loader && loader.configEqualToLoadedFile ? loader.configPath : i18n("New config")

+ 9 - 19
fancontrol-gui/package/contents/ui/PwmFansTab.qml

@@ -20,18 +20,15 @@
 
 import QtQuick 2.6
 import QtQuick.Controls 2.1
-import QtQuick.Layouts 1.2
 import org.kde.kirigami 2.3 as Kirigami
 import Fancontrol.Qml 1.0 as Fancontrol
 
 
 Kirigami.Page {
-    property QtObject loader: Fancontrol.Base.loader
-    property QtObject systemdCom: Fancontrol.Base.hasSystemdCommunicator() ? Fancontrol.Base.systemdCom : null
-    property QtObject pwmFanModel: Fancontrol.Base.pwmFanModel
-    property QtObject tempModel: Fancontrol.Base.tempModel
-    property QtObject profileModel: Fancontrol.Base.profileModel
-    property var pwmFans: pwmFanModel.fans
+    readonly property QtObject loader: Fancontrol.Base.loader
+    readonly property QtObject systemdCom: Fancontrol.Base.hasSystemdCommunicator ? Fancontrol.Base.systemdCom : null
+    readonly property QtObject pwmFanModel: Fancontrol.Base.pwmFanModel
+    readonly property QtObject profileModel: Fancontrol.Base.profileModel
     property QtObject fan: applicationWindow().fan
 
     id: root
@@ -100,25 +97,18 @@ Kirigami.Page {
         onTriggered: Fancontrol.Base.reset()
     }
 
-    ColumnLayout {
+    Loader {
         anchors.fill: parent
+        active: !!root.fan
 
-        Loader {
-            Layout.fillWidth: true
-            Layout.fillHeight: true
-            active: !!root.fan
-
-            sourceComponent: Fancontrol.FanItem {
-                fan: root.fan
-                tempModel: root.tempModel
-                systemdCom: root.systemdCom
-            }
+        sourceComponent: Fancontrol.FanItem {
+            fan: root.fan
         }
     }
 
     Label {
         anchors.centerIn: parent
-        visible: pwmFans.length === 0
+        visible: pwmFanModel.length === 0
         text: i18n("There are no pwm capable fans in your system.")
         font.pointSize: 14
         font.bold: true

+ 1 - 1
fancontrol-gui/package/contents/ui/SensorsTab.qml

@@ -28,7 +28,7 @@ import Fancontrol.Qml 1.0 as Fancontrol
 Kirigami.ScrollablePage {
     id: root
 
-    property QtObject loader: Fancontrol.Base.loader
+    readonly property QtObject loader: Fancontrol.Base.loader
 
     spacing: Kirigami.Units.smallSpacing
 

+ 17 - 15
import/qml/FanItem.qml

@@ -30,14 +30,14 @@ import "colors.js" as Colors
 
 Item {
     property QtObject fan
-    property QtObject systemdCom
-    property QtObject tempModel
-    property real minTemp: Fancontrol.Base.minTemp
-    property real maxTemp: Fancontrol.Base.maxTemp
     property int margin: Kirigami.Units.smallSpacing
-    property string unit: Fancontrol.Base.unit
-    property real convertedMinTemp: Units.fromCelsius(minTemp, unit)
-    property real convertedMaxTemp: Units.fromCelsius(maxTemp, unit)
+    readonly property QtObject systemdCom: Fancontrol.Base.hasSystemdCommunicator ? Fancontrol.Base.systemdCom : null
+    readonly property QtObject tempModel: Fancontrol.Base.tempModel
+    readonly property real minTemp: Fancontrol.Base.minTemp
+    readonly property real maxTemp: Fancontrol.Base.maxTemp
+    readonly property string unit: Fancontrol.Base.unit
+    readonly property real convertedMinTemp: Units.fromCelsius(minTemp, unit)
+    readonly property real convertedMaxTemp: Units.fromCelsius(maxTemp, unit)
 
     id: root
 
@@ -65,6 +65,7 @@ Item {
             right: parent.right
             top: parent.top
             bottom: settingsArea.top
+            bottomMargin: root.margin
         }
         visible: graphBackground.height > 0 && graphBackground.width > 0
 
@@ -76,7 +77,7 @@ Item {
                 bottom: graphBackground.bottom
                 left: parent.left
             }
-            width: MoreMath.maxWidth(children) + graph.fontSize
+            width: MoreMath.maxWidth(children) + graph.fontSize / 3
 
             Repeater {
                 id: verticalRepeater
@@ -88,7 +89,7 @@ Item {
                     y: graphBackground.height - graphBackground.height / (graph.verticalScalaCount - 1) * index - graph.fontSize * 2 / 3
                     horizontalAlignment: Text.AlignRight
                     color: Kirigami.Theme.textColor
-                    text: Number(index * (100 / (graph.verticalScalaCount - 1))).toLocaleString(locale, 'f', 0) + locale.percent
+                    text: Number(index * (100 / (graph.verticalScalaCount - 1))).toLocaleString(Qt.locale(), 'f', 0) + Qt.locale().percent
                     font.pixelSize: graph.fontSize
                 }
             }
@@ -295,7 +296,7 @@ Item {
     }
 
     ColumnLayout {
-        property int padding: 10
+        property int padding: root.margin
 
         id: settingsArea
         anchors {
@@ -319,8 +320,8 @@ Item {
                 onCheckedChanged: {
                     if (!!fan) {
                         fan.hasTemp = checked;
-                        if (checked && !!tempModel.temps[tempBox.currentIndex]) {
-                            fan.temp = tempModel.temps[tempBox.currentIndex];
+                        if (checked && !!tempModel.temp(tempBox.currentIndex)) {
+                            fan.temp = tempModel.temp(tempBox.currentIndex);
                         }
                         curveCanvas.requestPaint();
                     }
@@ -340,21 +341,22 @@ Item {
                     id: tempBox
                     Layout.fillWidth: true
                     model: tempModel
+                    currentIndex: !!fan && fan.hasTemp ? tempModel.indexOf(fan.temp) : -1
                     textRole: "display"
                     enabled: hasTempCheckBox.checked
                     onCurrentIndexChanged: {
                         if (hasTempCheckBox.checked)
-                            fan.temp = tempModel.temps[currentIndex];
+                            fan.temp = tempModel.temp(currentIndex);
                     }
                 }
 
                 Connections {
                     target: root
-                    onFanChanged: if (!!fan && fan.hasTemp) tempBox.currentIndex = tempModel.temps.indexOf(fan.temp)
+                    onFanChanged: tempBox.currentIndex = !!fan && fan.hasTemp ? tempModel.indexOf(fan.temp) : -1
                 }
                 Connections {
                     target: fan
-                    onTempChanged: if (fan.hasTemp) tempBox.currentIndex = tempModel.temps.indexOf(fan.temp)
+                    onTempChanged: tempBox.currentIndex = !!fan && fan.hasTemp ? tempModel.indexOf(fan.temp) : -1
                 }
             }
         }

+ 3 - 4
import/qml/PwmPoint.qml

@@ -36,8 +36,7 @@ Rectangle {
     property int pwm: 0
     property alias drag: pwmMouse.drag
     property int size: Kirigami.Units.smallSpacing * 2
-    property string unit: Fancontrol.Base.unit
-    property var locale: Qt.locale()
+    readonly property string unit: Fancontrol.Base.unit
 
     signal positionChanged()
 
@@ -84,12 +83,12 @@ Rectangle {
 
             Text {
                 font.pixelSize: root.size * 1.5
-                text: Number(Units.fromCelsius(root.temp, unit)).toLocaleString(locale, 'f', 0) + i18n(unit)
+                text: Number(Units.fromCelsius(root.temp, unit)).toLocaleString(Qt.locale(), 'f', 0) + i18n(unit)
                 color: Kirigami.Theme.textColor
             }
             Text {
                 font.pixelSize: root.size * 1.5
-                text: Number(root.pwm / 2.55).toLocaleString(locale, 'f', 1) + locale.percent
+                text: Number(root.pwm / 2.55).toLocaleString(Qt.locale(), 'f', 1) + Qt.locale().percent
                 color: Kirigami.Theme.textColor
             }
         }

+ 2 - 2
import/qml/SettingsForm.qml

@@ -29,8 +29,8 @@ import Fancontrol.Qml 1.0 as Fancontrol
 Kirigami.FormLayout {
     id: root
 
-    property QtObject systemdCom: Fancontrol.Base.hasSystemdCommunicator() ? Fancontrol.Base.systemdCom : null
-    property QtObject loader: Fancontrol.Base.loader
+    readonly property QtObject systemdCom: Fancontrol.Base.hasSystemdCommunicator ? Fancontrol.Base.systemdCom : null
+    readonly property QtObject loader: Fancontrol.Base.loader
     property bool showAll: true
 
     SpinBox {

+ 4 - 5
import/qml/StatusPoint.qml

@@ -34,12 +34,11 @@ Rectangle {
     property real unscaledTemp: !!fan && fan.hasTemp && !!fan.temp ? fan.temp.value : 0
     property real unscaledPwm: !!fan ? fan.pwm : 0
     property real unscaledRpm: !!fan ? fan.rpm : 0
-    property var locale: Qt.locale()
     readonly property real centerX: x + width / 2
     readonly property real centerY: y + height / 2
     readonly property point center: Qt.point(centerX, centerY)
     property int size: Kirigami.Units.smallSpacing * 2
-    property string unit: Fancontrol.Base.unit
+    readonly property string unit: Fancontrol.Base.unit
 
     width: size
     height: size
@@ -94,17 +93,17 @@ Rectangle {
 
             Text {
                 font.pixelSize: root.size * 1.5
-                text: Number(Units.fromCelsius(root.unscaledTemp, unit)).toLocaleString(locale, 'f', 1) + i18n(unit)
+                text: Number(Units.fromCelsius(root.unscaledTemp, unit)).toLocaleString(Qt.locale(), 'f', 1) + i18n(unit)
                 color: Kirigami.Theme.textColor
             }
             Text {
                 font.pixelSize: root.size * 1.5
-                text: Number(unscaledPwm / 2.55).toLocaleString(locale, 'f', 1) + locale.percent
+                text: Number(unscaledPwm / 2.55).toLocaleString(Qt.locale(), 'f', 1) + Qt.locale().percent
                 color: Kirigami.Theme.textColor
             }
             Text {
                 font.pixelSize: root.size * 1.5
-                text: Number(unscaledRpm).toLocaleString(locale, 'f', 0) + i18n("rpm")
+                text: Number(unscaledRpm).toLocaleString(Qt.locale(), 'f', 0) + i18n("rpm")
                 color: Kirigami.Theme.textColor
             }
         }

+ 1 - 0
import/src/guibase.h

@@ -65,6 +65,7 @@ class GUIBase : public QObject
     Q_PROPERTY(bool needsApply READ needsApply NOTIFY needsApplyChanged)
     Q_PROPERTY(bool showTray READ showTray WRITE setShowTray NOTIFY showTrayChanged)
     Q_PROPERTY(bool startMinimized READ startMinimized WRITE setStartMinimized NOTIFY startMinimizedChanged)
+    Q_PROPERTY(bool hasSystemdCommunicator READ hasSystemdCommunicator CONSTANT)
 
 public:
 

+ 43 - 26
import/src/pwmfanmodel.cpp

@@ -27,10 +27,48 @@
 namespace Fancontrol
 {
 
-PwmFanModel::PwmFanModel(QObject *parent) : QStringListModel(parent)
+PwmFanModel::PwmFanModel(QObject *parent) : QAbstractListModel(parent)
 {
 }
 
+QHash<int, QByteArray> PwmFanModel::roleNames() const
+{
+    QHash<int, QByteArray> roleNames;
+
+    roleNames.insert(DisplayRole, "display");
+    roleNames.insert(ObjectRole, "object");
+
+    return roleNames;
+}
+
+QVariant PwmFanModel::data(const QModelIndex& index, int role) const
+{
+    if (!index.isValid())
+        return QVariant();
+
+    const int row = index.row();
+
+    if (row >= rowCount())
+        return QVariant();
+
+    const auto fan = m_fans.at(row);
+
+    if (!fan)
+        return QVariant();
+
+    switch (role)
+    {
+        case DisplayRole:
+            return fan->name() + "  (" + fan->path() + ")";
+
+        case ObjectRole:
+            return QVariant::fromValue(fan);
+
+        default:
+            return QVariant();
+    }
+}
+
 void PwmFanModel::setPwmFans(const QList<PwmFan *> &fans)
 {
     if (m_fans == fans)
@@ -39,15 +77,8 @@ void PwmFanModel::setPwmFans(const QList<PwmFan *> &fans)
     m_fans = fans;
     emit fansChanged();
 
-    QStringList list;
-
     for (const auto &fan : fans)
-    {
         connect(fan, &PwmFan::nameChanged, this, static_cast<void(PwmFanModel::*)()>(&PwmFanModel::updateFan));
-        list << fan->name() + "  (" + fan->path() + ")";
-    }
-
-    setStringList(list);
 }
 
 void PwmFanModel::addPwmFans(QList<PwmFan *> newFans)
@@ -90,33 +121,19 @@ void PwmFanModel::updateFan(PwmFan *fan)
     if (i == -1)
         return;
 
-    const auto string = fan->name() + "  (" + fan->path() + ")";
-    setData(index(i, 0), string);
-    emit dataChanged(index(i, 0), index(i, 0));
+    emit dataChanged(index(i, 0), index(i, 0), QVector<int>{ DisplayRole });
 }
 
 void PwmFanModel::updateFan()
 {
     const auto fan = qobject_cast<PwmFan*>(sender());
 
-    if (!fan)
-        return;
-
-    const auto i = m_fans.indexOf(fan);
-    if (i == -1)
-        return;
-
-    const auto string = fan->name() + "  (" + fan->path() + ")";
-    setData(index(i, 0), string);
-    emit dataChanged(index(i, 0), index(i, 0));
+    updateFan(fan);
 }
 
-QList<QObject *> PwmFanModel::fans() const
+QObject * PwmFanModel::fan(int index) const
 {
-    auto list = QList<QObject *>();
-    for (const auto &fan : m_fans)
-        list << fan;
-    return list;
+    return m_fans.value(index);
 }
 
 }

+ 14 - 4
import/src/pwmfanmodel.h

@@ -24,7 +24,7 @@
 #define PWMFANMODEL_H
 
 
-#include <QtCore/QStringListModel>
+#include <QtCore/QAbstractListModel>
 
 
 namespace Fancontrol {
@@ -32,17 +32,27 @@ namespace Fancontrol {
 
 class PwmFan;
 
-class PwmFanModel : public QStringListModel
+class PwmFanModel : public QAbstractListModel
 {
     Q_OBJECT
-    Q_PROPERTY(QList<QObject *> fans READ fans NOTIFY fansChanged)
+    Q_PROPERTY(int length READ rowCount NOTIFY fansChanged)
 
 public:
 
+    enum Roles
+    {
+        DisplayRole,
+        ObjectRole
+    };
+    Q_ENUM(Roles)
+
     PwmFanModel(QObject *parent = Q_NULLPTR);
     void setPwmFans(const QList<PwmFan *> &fans);
     void addPwmFans(QList<PwmFan *> newFans);
-    QList<QObject *> fans() const;
+    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return m_fans.size(); }
+    virtual QVariant data(const QModelIndex &index, int role = DisplayRole) const override;
+    virtual QHash<int, QByteArray> roleNames() const override;
+    Q_INVOKABLE QObject *fan(int index) const;
 
 
 public slots:

+ 51 - 23
import/src/tempmodel.cpp

@@ -27,32 +27,63 @@
 namespace Fancontrol
 {
 
-TempModel::TempModel(QObject *parent) : QStringListModel(parent),
+TempModel::TempModel(QObject *parent) : QAbstractListModel(parent),
     m_unit(QStringLiteral("°C"))
 {
 }
 
-QString TempModel::composeText(Temp *temp)
+QHash<int, QByteArray> TempModel::roleNames() const
 {
-    return temp->name() + ": " + QString::number(temp->value()) + m_unit + "   (" + temp->path() + ")";
+    QHash<int, QByteArray> roleNames;
+
+    roleNames.insert(DisplayRole, "display");
+    roleNames.insert(ObjectRole, "object");
+
+    return roleNames;
 }
 
+QVariant TempModel::data(const QModelIndex& index, int role) const
+{
+    if (!index.isValid())
+        return QVariant();
+
+    const int row = index.row();
+
+    if (row >= rowCount())
+        return QVariant();
+
+    const auto temp = m_temps.at(row);
+
+    if (!temp)
+        return QVariant();
+
+    switch (role)
+    {
+        case DisplayRole:
+            return temp->name() + ": " + QString::number(temp->value()) + m_unit + "   (" + temp->path() + ")";
+
+        case ObjectRole:
+            return QVariant::fromValue(temp);
+
+        default:
+            return QVariant();
+    }
+}
 
 void TempModel::setTemps(const QList<Temp *> &temps)
 {
+    beginResetModel();
+
     m_temps = temps;
     emit tempsChanged();
 
-    QStringList list;
-
     for (const auto &temp : temps)
     {
         connect(temp, &Temp::nameChanged, this, static_cast<void(TempModel::*)()>(&TempModel::updateTemp));
         connect(temp, &Temp::valueChanged, this, static_cast<void(TempModel::*)()>(&TempModel::updateTemp));
-        list << composeText(temp);
     }
 
-    setStringList(list);
+    endResetModel();
 }
 
 void TempModel::addTemps(QList<Temp *> newTemps)
@@ -72,19 +103,19 @@ void TempModel::addTemps(QList<Temp *> newTemps)
 
     if (!newTemps.isEmpty())
     {
+        beginResetModel();
+
         m_temps += newTemps;
         emit tempsChanged();
 
-        const auto oldSize = rowCount();
-
-        insertRows(oldSize, newTemps.size());
-
         for (const auto &temp : qAsConst(newTemps))
         {
             connect(temp, &Temp::nameChanged, this, static_cast<void(TempModel::*)()>(&TempModel::updateTemp));
             connect(temp, &Temp::valueChanged, this, static_cast<void(TempModel::*)()>(&TempModel::updateTemp));
             updateTemp(temp);
         }
+
+        endResetModel();
     }
 }
 
@@ -97,8 +128,7 @@ void TempModel::updateTemp(Temp *temp)
     if (i == -1)
         return;
 
-    setData(index(i, 0), composeText(temp));
-    emit dataChanged(index(i, 0), index(i, 0));
+    emit dataChanged(index(i, 0), index(i, 0), QVector<int>{ DisplayRole });
 }
 
 void TempModel::updateTemp()
@@ -110,21 +140,19 @@ void TempModel::updateTemp()
 
 void TempModel::updateAll()
 {
-    for (int i=0; i<m_temps.size(); i++)
-        setData(index(i, 0), composeText(m_temps.at(i)));
-
-    emit dataChanged(index(0, 0), index(m_temps.size(), 0));
+    emit dataChanged(index(0, 0), index(m_temps.size(), 0), QVector<int>{ DisplayRole });
 }
 
-QList<QObject *> TempModel::temps() const
+QObject * TempModel::temp(int index) const
 {
-    QList<QObject *> list;
-
-    for (const auto &temp : m_temps)
-        list << temp;
+    return m_temps.value(index);
+}
 
-    return list;
+int TempModel::indexOf(QObject* temp) const
+{
+    return m_temps.indexOf(qobject_cast<Temp*>(temp));
 }
 
+
 }
 

+ 18 - 19
import/src/tempmodel.h

@@ -24,7 +24,7 @@
 #define TEMPMODEL_H
 
 
-#include <QtCore/QStringListModel>
+#include <QtCore/QAbstractListModel>
 
 
 
@@ -33,40 +33,37 @@ namespace Fancontrol {
 
 class Temp;
 
-class TempModel : public QStringListModel
+class TempModel : public QAbstractListModel
 {
     Q_OBJECT
-    Q_PROPERTY(QList<QObject *> temps READ temps NOTIFY tempsChanged)
+    Q_PROPERTY(int length READ rowCount NOTIFY tempsChanged)
 
 public:
 
+    enum Roles
+    {
+        DisplayRole,
+        ObjectRole
+    };
+    Q_ENUM(Roles)
+
     TempModel(QObject *parent = Q_NULLPTR);
     void setTemps(const QList<Temp *> &temps);
     void addTemps(QList<Temp *> newTemps);
-    QList<QObject *> temps() const;
-
-
-protected:
-
-    QString composeText(Temp *temp);
-
-
-public slots:
-
+    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return m_temps.size(); }
+    virtual QVariant data(const QModelIndex &index, int role = DisplayRole) const override;
+    virtual QHash<int, QByteArray> roleNames() const override;
     void updateTemp(Temp *temp);
     void setUnit(const QString &unit) { if (unit != m_unit) { m_unit = unit; updateAll(); } }
+    Q_INVOKABLE QObject *temp(int index) const;
+    Q_INVOKABLE int indexOf(QObject *temp) const;
 
 
-protected slots:
+protected:
 
     void updateAll();
 
 
-private slots:
-
-    void updateTemp();
-
-
 signals:
 
     void tempsChanged();
@@ -74,6 +71,8 @@ signals:
 
 private:
 
+    void updateTemp();
+
     QList<Temp *> m_temps;
     QString m_unit;
 };

+ 9 - 53
kcm/package/contents/ui/KCM.qml

@@ -28,14 +28,12 @@ import Fancontrol.Qml 1.0 as Fancontrol
 
 
 Kirigami.Page {
-    property QtObject loader: Fancontrol.Base.loader
-    property QtObject systemdCom: Fancontrol.Base.systemdCom
-    property QtObject pwmFanModel: Fancontrol.Base.pwmFanModel
-    property QtObject tempModel: Fancontrol.Base.tempModel
-    property QtObject profileModel: Fancontrol.Base.profileModel
-    property real textWidth: 0
-    property var pwmFans: pwmFanModel.fans
-    property QtObject fan: pwmFans[fansListView.currentIndex]
+    readonly property QtObject loader: Fancontrol.Base.loader
+    readonly property QtObject systemdCom: Fancontrol.Base.systemdCom
+    readonly property QtObject pwmFanModel: Fancontrol.Base.pwmFanModel
+    readonly property QtObject tempModel: Fancontrol.Base.tempModel
+    readonly property QtObject profileModel: Fancontrol.Base.profileModel
+    readonly property QtObject fan: fansListView.currentItem ? fansListView.currentItem.fan : null
 
     id: root
 
@@ -61,52 +59,13 @@ Kirigami.Page {
         onAboutToDefault: enabledBox.checked = false
     }
 
-//     contextualActions: [
-//         Kirigami.Action {
-//             text: i18n("Profiles")
-//
-//             Kirigami.Action {
-//                 id: loadProfilesAction
-//
-//                 text: i18n("Load profile")
-//             }
-//             Kirigami.Action {
-//                 text: i18n("Save profile")
-//                 icon.name: "document-save"
-//                 onTriggered: Fancontrol.Base.saveProfile(profileComboBox.saveText)
-//             }
-//             Kirigami.Action {
-//                 text: i18n("Delete profile")
-//                 icon.name: "edit-delete"
-//                 onTriggered: Fancontrol.Base.deleteProfile(profileComboBox.currentIndex)
-//             }
-//         },
-//         Kirigami.Action {
-//             text: loader.sensorsDetected ? i18n("Detect fans again") : i18n("Detect fans")
-//             icon.name: "dialog-password"
-//             onTriggered: loader.detectSensors()
-//         },
-//         Kirigami.Action {
-//             visible: !!systemdCom && !!fan
-//             text: !!fan ? fan.testing ? i18n("Abort test") : i18n("Test start and stop values") : ""
-//             icon.name: "dialog-password"
-//             onTriggered: {
-//                 if (fan.testing) {
-//                     fan.abortTest();
-//                 } else {
-//                     fan.test();
-//                 }
-//             }
-//         }
-//     ]
-
     ColumnLayout {
         id: noFansInfo
 
         width: root.width
         y: root.height / 2 - height / 2
         spacing: Kirigami.Units.smallSpacing * 2
-        visible: pwmFans.length === 0
+        visible: pwmFanModel.length === 0
 
         Label {
             Layout.alignment: Qt.AlignCenter
@@ -172,6 +131,8 @@ Kirigami.Page {
                 leftPadding: Kirigami.Units.smallSpacing
             }
             delegate: Kirigami.BasicListItem {
+                property QtObject fan: object
+
                 label: display
                 reserveSpaceForIcon: false
                 hoverEnabled: true
@@ -206,12 +167,7 @@ Kirigami.Page {
         active: !!root.fan
         visible: enabledBox.checked
         sourceComponent: Fancontrol.FanItem {
-            unit: Fancontrol.Base.unit
             fan: root.fan
-            systemdCom: root.systemdCom
-            tempModel: root.tempModel
-            minTemp: Fancontrol.Base.minTemp
-            maxTemp: Fancontrol.Base.maxTemp
         }
     }