Index: common/control.h =================================================================== --- common/control.h +++ common/control.h @@ -30,17 +30,46 @@ Individual = 1, }; - static QMap readInOutputRetentionValues(const QString &configId); + virtual ~Control() = default; + static OutputRetention getOutputRetention(const QString &outputId, const QMap &retentions); - static QString configFilePath(const QString &hash); - static QString outputFilePath(const QString &hash); + virtual QString filePath() = 0; -private: +protected: static QString dirPath(); static OutputRetention convertVariantToOutputRetention(QVariant variant); +private: static QString s_dirName; }; +class ControlConfig : public Control +{ +public: + ControlConfig(KScreen::ConfigPtr config); + + QMap readInOutputRetentionValues(); + + QString filePath() override; + static QString filePath(const QString &hash); + +private: + KScreen::ConfigPtr m_config; +}; + +class ControlOutput : public Control +{ +public: + ControlOutput(KScreen::OutputPtr output); + + // TODO: scale auto value + + QString filePath() override; + static QString filePath(const QString &hash); + +private: + KScreen::OutputPtr m_output; +}; + #endif Index: common/control.cpp =================================================================== --- common/control.cpp +++ common/control.cpp @@ -21,31 +21,47 @@ #include #include +#include +#include + QString Control::s_dirName = QStringLiteral("control/"); QString Control::dirPath() { return Globals::dirPath() % s_dirName; } -QString Control::outputFilePath(const QString &hash) +Control::OutputRetention Control::getOutputRetention(const QString &outputId, const QMap &retentions) { - const QString dir = dirPath() % QStringLiteral("outputs/"); - if (!QDir().mkpath(dir)) { - return QString(); + if (retentions.contains(outputId)) { + return retentions[outputId]; } - return dir % hash; + // info for output not found + return OutputRetention::Undefined; } -QString Control::configFilePath(const QString &hash) +ControlConfig::ControlConfig(KScreen::ConfigPtr config) + : m_config(config) +{ +} + +QString ControlConfig::filePath(const QString &hash) { const QString dir = dirPath() % QStringLiteral("configs/"); if (!QDir().mkpath(dir)) { return QString(); } return dir % hash; } +QString ControlConfig::filePath() +{ + if (!m_config) { + return QString(); + } + return ControlConfig::filePath(m_config->connectedOutputsHash()); +} + Control::OutputRetention Control::convertVariantToOutputRetention(QVariant variant) { if (variant.canConvert()) { @@ -60,10 +76,10 @@ return OutputRetention::Undefined; } -QMap Control::readInOutputRetentionValues(const QString &configId) +QMap ControlConfig::readInOutputRetentionValues() { -// qDebug() << "Looking for control file:" << configId; - QFile file(configFilePath(configId)); +// qDebug() << "Looking for control file:" << m_config->connectedOutputsHash(); + QFile file(filePath(m_config->connectedOutputsHash())); if (!file.open(QIODevice::ReadOnly)) { // TODO: have a logging category // qCDebug(KSCREEN_COMMON) << "Failed to open file" << file.fileName(); @@ -89,11 +105,24 @@ return retentions; } -Control::OutputRetention Control::getOutputRetention(const QString &outputId, const QMap &retentions) +ControlOutput::ControlOutput(KScreen::OutputPtr output) + : m_output(output) { - if (retentions.contains(outputId)) { - return retentions[outputId]; +} + +QString ControlOutput::filePath(const QString &hash) +{ + const QString dir = dirPath() % QStringLiteral("outputs/"); + if (!QDir().mkpath(dir)) { + return QString(); } - // info for output not found - return OutputRetention::Undefined; + return dir % hash; +} + +QString ControlOutput::filePath() +{ + if (!m_output) { + return QString(); + } + return ControlOutput::filePath(m_output->hash()); } Index: kded/config.cpp =================================================================== --- kded/config.cpp +++ kded/config.cpp @@ -114,7 +114,7 @@ QJsonDocument parser; QVariantList outputs = parser.fromJson(file.readAll()).toVariant().toList(); - Output::readInOutputs(config->data()->outputs(), outputs, Control::readInOutputRetentionValues(config->id())); + Output::readInOutputs(config->data()->outputs(), outputs, ControlConfig(config->data()).readInOutputRetentionValues()); QSize screenSize; for (const auto &output : config->data()->outputs()) { @@ -170,7 +170,7 @@ } const KScreen::OutputList outputs = m_data->outputs(); - const auto retentions = Control::readInOutputRetentionValues(id()); + const auto retentions = ControlConfig(m_data).readInOutputRetentionValues(); QVariantList outputList; Q_FOREACH(const KScreen::OutputPtr &output, outputs) {