Changeset View
Changeset View
Standalone View
Standalone View
common/control.cpp
Show First 20 Lines • Show All 205 Lines • ▼ Show 20 Line(s) | |||||
206 | 206 | | |||
207 | static QVariantMap metadata(const QString &outputName) | 207 | static QVariantMap metadata(const QString &outputName) | ||
208 | { | 208 | { | ||
209 | QVariantMap metadata; | 209 | QVariantMap metadata; | ||
210 | metadata[QStringLiteral("name")] = outputName; | 210 | metadata[QStringLiteral("name")] = outputName; | ||
211 | return metadata; | 211 | return metadata; | ||
212 | } | 212 | } | ||
213 | 213 | | |||
214 | QVariantMap createOutputInfo(const QString &outputId, const QString &outputName) | ||||
215 | { | ||||
216 | QVariantMap outputInfo; | ||||
217 | outputInfo[QStringLiteral("id")] = outputId; | ||||
218 | outputInfo[QStringLiteral("metadata")] = metadata(outputName); | ||||
219 | return outputInfo; | ||||
220 | } | ||||
221 | | ||||
214 | void ControlConfig::setOutputRetention(const KScreen::OutputPtr &output, OutputRetention value) | 222 | void ControlConfig::setOutputRetention(const KScreen::OutputPtr &output, OutputRetention value) | ||
215 | { | 223 | { | ||
216 | setOutputRetention(output->hashMd5(), output->name(), value); | 224 | setOutputRetention(output->hashMd5(), output->name(), value); | ||
217 | } | 225 | } | ||
218 | 226 | | |||
219 | void ControlConfig::setOutputRetention(const QString &outputId, const QString &outputName, OutputRetention value) | 227 | void ControlConfig::setOutputRetention(const QString &outputId, const QString &outputName, OutputRetention value) | ||
220 | { | 228 | { | ||
221 | QList<QVariant>::iterator it; | 229 | QList<QVariant>::iterator it; | ||
222 | QVariantList outputsInfo = getOutputs(); | 230 | QVariantList outputsInfo = getOutputs(); | ||
223 | 231 | | |||
224 | for (it = outputsInfo.begin(); it != outputsInfo.end(); ++it) { | 232 | for (it = outputsInfo.begin(); it != outputsInfo.end(); ++it) { | ||
225 | QVariantMap outputInfo = (*it).toMap(); | 233 | QVariantMap outputInfo = (*it).toMap(); | ||
226 | if (!infoIsOutput(outputInfo, outputId, outputName)) { | 234 | if (!infoIsOutput(outputInfo, outputId, outputName)) { | ||
227 | continue; | 235 | continue; | ||
228 | } | 236 | } | ||
229 | outputInfo[QStringLiteral("retention")] = (int)value; | 237 | outputInfo[QStringLiteral("retention")] = (int)value; | ||
230 | *it = outputInfo; | 238 | *it = outputInfo; | ||
231 | setOutputs(outputsInfo); | 239 | setOutputs(outputsInfo); | ||
232 | return; | 240 | return; | ||
233 | } | 241 | } | ||
234 | // no entry yet, create one | 242 | // no entry yet, create one | ||
235 | QVariantMap outputInfo; | 243 | auto outputInfo = createOutputInfo(outputId, outputName); | ||
236 | outputInfo[QStringLiteral("id")] = outputId; | | |||
237 | outputInfo[QStringLiteral("metadata")] = metadata(outputName); | | |||
238 | outputInfo[QStringLiteral("retention")] = (int)value; | 244 | outputInfo[QStringLiteral("retention")] = (int)value; | ||
239 | 245 | | |||
240 | outputsInfo << outputInfo; | 246 | outputsInfo << outputInfo; | ||
241 | setOutputs(outputsInfo); | 247 | setOutputs(outputsInfo); | ||
242 | } | 248 | } | ||
243 | 249 | | |||
250 | bool ControlConfig::getAutoRotate(const KScreen::OutputPtr &output) const | ||||
251 | { | ||||
252 | return getAutoRotate(output->hashMd5(), output->name()); | ||||
253 | } | ||||
254 | | ||||
255 | bool ControlConfig::getAutoRotate(const QString &outputId, const QString &outputName) const | ||||
256 | { | ||||
257 | const auto retention = getOutputRetention(outputId, outputName); | ||||
258 | if (retention == OutputRetention::Individual) { | ||||
259 | const QVariantList outputsInfo = getOutputs(); | ||||
260 | for (const auto variantInfo : outputsInfo) { | ||||
261 | const QVariantMap info = variantInfo.toMap(); | ||||
262 | if (!infoIsOutput(info, outputId, outputName)) { | ||||
263 | continue; | ||||
264 | } | ||||
265 | const auto val = info[QStringLiteral("autorotate")]; | ||||
266 | return !val.canConvert<bool>() || val.toBool(); | ||||
volkov: Why treat an inconvertible value as true and not false? | |||||
267 | } | ||||
268 | } | ||||
269 | // Retention is global or info for output not in config control file. | ||||
270 | if (auto *outputControl = getOutputControl(outputId, outputName)) { | ||||
271 | return outputControl->getAutoRotate(); | ||||
272 | } | ||||
273 | | ||||
274 | // Info for output not found. | ||||
275 | // TODO: make this return value depend on the device having a tablet state? | ||||
276 | return true; | ||||
277 | } | ||||
278 | | ||||
279 | void ControlConfig::setAutoRotate(const KScreen::OutputPtr &output, bool value) | ||||
280 | { | ||||
281 | setAutoRotate(output->hashMd5(), output->name(), value); | ||||
282 | } | ||||
283 | | ||||
284 | // TODO: combine methods (templated functions) | ||||
285 | void ControlConfig::setAutoRotate(const QString &outputId, const QString &outputName, bool value) | ||||
286 | { | ||||
287 | QList<QVariant>::iterator it; | ||||
288 | QVariantList outputsInfo = getOutputs(); | ||||
289 | | ||||
290 | auto setOutputAutoRotate = [&outputId, &outputName, value, this]() { | ||||
291 | if (auto *control = getOutputControl(outputId, outputName)) { | ||||
292 | control->setAutoRotate(value); | ||||
293 | } | ||||
294 | | ||||
295 | }; | ||||
296 | | ||||
297 | for (it = outputsInfo.begin(); it != outputsInfo.end(); ++it) { | ||||
298 | QVariantMap outputInfo = (*it).toMap(); | ||||
299 | if (!infoIsOutput(outputInfo, outputId, outputName)) { | ||||
300 | continue; | ||||
301 | } | ||||
302 | outputInfo[QStringLiteral("autorotate")] = value; | ||||
303 | *it = outputInfo; | ||||
304 | setOutputs(outputsInfo); | ||||
305 | setOutputAutoRotate(); | ||||
306 | return; | ||||
307 | } | ||||
308 | // no entry yet, create one | ||||
309 | auto outputInfo = createOutputInfo(outputId, outputName); | ||||
310 | outputInfo[QStringLiteral("autorotate")] = value; | ||||
311 | | ||||
312 | outputsInfo << outputInfo; | ||||
313 | setOutputs(outputsInfo); | ||||
314 | setOutputAutoRotate(); | ||||
315 | } | ||||
316 | | ||||
244 | QVariantList ControlConfig::getOutputs() const | 317 | QVariantList ControlConfig::getOutputs() const | ||
245 | { | 318 | { | ||
246 | return constInfo()[QStringLiteral("outputs")].toList(); | 319 | return constInfo()[QStringLiteral("outputs")].toList(); | ||
247 | } | 320 | } | ||
248 | 321 | | |||
249 | void ControlConfig::setOutputs(QVariantList outputsInfo) | 322 | void ControlConfig::setOutputs(QVariantList outputsInfo) | ||
250 | { | 323 | { | ||
251 | auto &infoMap = info(); | 324 | auto &infoMap = info(); | ||
Show All 34 Lines | |||||
286 | 359 | | |||
287 | QString ControlOutput::filePath() const | 360 | QString ControlOutput::filePath() const | ||
288 | { | 361 | { | ||
289 | if (!m_output) { | 362 | if (!m_output) { | ||
290 | return QString(); | 363 | return QString(); | ||
291 | } | 364 | } | ||
292 | return filePathFromHash(m_output->hashMd5()); | 365 | return filePathFromHash(m_output->hashMd5()); | ||
293 | } | 366 | } | ||
367 | | ||||
368 | bool ControlOutput::getAutoRotate() const | ||||
369 | { | ||||
370 | const auto val = constInfo()[QStringLiteral("autorotate")]; | ||||
371 | return !val.canConvert<bool>() || val.toBool(); | ||||
372 | } | ||||
373 | | ||||
374 | void ControlOutput::setAutoRotate(bool value) | ||||
375 | { | ||||
376 | auto &infoMap = info(); | ||||
377 | if (infoMap.isEmpty()) { | ||||
378 | infoMap = createOutputInfo(m_output->hashMd5(), m_output->name()); | ||||
379 | } | ||||
380 | infoMap[QStringLiteral("autorotate")] = value; | ||||
381 | } |
Why treat an inconvertible value as true and not false?