6#include <QtCore/private/qohoscommon_p.h>
7#include <QtCore/private/qohoslogger_p.h>
8#include <QtCore/qmimedatabase.h>
9#include <QtGui/qwindow.h>
19
20
21
22
27constexpr const char *mimeTextUriList =
"text/uri-list";
32 switch (abilityType) {
48std::vector<QOhosShareKit::ShareAbilityType> mapExcludedAbilitiesToShareKit(
49 const QList<ShareAbilityType> &excludedAbilities)
51 std::vector<QOhosShareKit::ShareAbilityType> shareKitExcludedAbilities;
52 for (
auto excludedAbilityType : excludedAbilities) {
53 auto optShareKitExcludedAbilityType = tryMapShareAbilityTypeToShareKitEnum(excludedAbilityType);
54 if (optShareKitExcludedAbilityType.has_value())
55 shareKitExcludedAbilities.push_back(optShareKitExcludedAbilityType.value());
57 return shareKitExcludedAbilities;
60class SharedRecordImpl :
public SharedRecord
63 SharedRecordImpl(
const QMimeType &mimeType,
const QString &content,
bool urlContent);
64 SharedRecordImpl(
const QFileInfo &fileInfo);
66 QMimeType mimeType()
const override;
67 QString content()
const override;
68 QString filePath()
const override;
69 bool isUrlContent()
const override;
71 void setTitle(
const QString &title)
override;
72 QString title()
const override;
74 void setLabel(
const QString &label)
override;
75 QString label()
const override;
77 void setDescription(
const QString &description)
override;
78 QString description()
const override;
80 void setThumbnail(
const QByteArray &thumbnail)
override;
81 QByteArray thumbnail()
const override;
83 void setThumbnailFilePath(
const QString &thumbnailFilePath)
override;
84 QString thumbnailFilePath()
const override;
86 void setExtraData(
const QVariantMap &extraData)
override;
87 QVariantMap extraData()
const override;
91 std::optional<QString> m_content;
92 std::optional<QString> m_filePath;
94 std::optional<QString> m_title;
95 std::optional<QString> m_label;
96 std::optional<QString> m_description;
97 std::optional<QByteArray> m_thumbnail;
98 std::optional<QString> m_thumbnailFilePath;
99 std::optional<QVariantMap> m_extraData;
102SharedRecordImpl::SharedRecordImpl(
const QMimeType &mimeType,
const QString &content,
bool urlContent)
104 , m_mimeType(mimeType)
106 , m_urlContent(urlContent)
110SharedRecordImpl::SharedRecordImpl(
const QFileInfo &fileInfo)
112 , m_mimeType(QMimeDatabase().mimeTypeForFile(fileInfo))
113 , m_filePath(fileInfo.absoluteFilePath())
114 , m_urlContent(
false)
118QMimeType SharedRecordImpl::mimeType()
const
123QString SharedRecordImpl::content()
const
125 return m_content.value_or(QString());
128QString SharedRecordImpl::filePath()
const
130 return m_filePath.value_or(QString());
133bool SharedRecordImpl::isUrlContent()
const
138void SharedRecordImpl::setTitle(
const QString &title)
143QString SharedRecordImpl::title()
const
145 return m_title.value_or(QString());
148void SharedRecordImpl::setLabel(
const QString &label)
153QString SharedRecordImpl::label()
const
155 return m_label.value_or(QString());
158void SharedRecordImpl::setDescription(
const QString &description)
160 m_description = description;
163QString SharedRecordImpl::description()
const
165 return m_description.value_or(QString());
168void SharedRecordImpl::setThumbnail(
const QByteArray &thumbnail)
170 m_thumbnail = thumbnail;
173QByteArray SharedRecordImpl::thumbnail()
const
175 return m_thumbnail.value_or(QByteArray());
178void SharedRecordImpl::setThumbnailFilePath(
const QString &thumbnailFilePath)
180 m_thumbnailFilePath = thumbnailFilePath;
183QString SharedRecordImpl::thumbnailFilePath()
const
185 return m_thumbnailFilePath.value_or(QString());
188void SharedRecordImpl::setExtraData(
const QVariantMap &extraData)
190 m_extraData = extraData;
193QVariantMap SharedRecordImpl::extraData()
const
195 return m_extraData.value_or(QVariantMap());
198class ShareControllerOptionsImpl :
public ShareControllerOptions
201 void setAnchorOffset(QPoint anchorOffset)
override;
202 void setAnchor(QRect anchor)
override;
203 std::optional<QPoint> anchorOffset()
const;
204 std::optional<QSize> anchorSize()
const;
206 void setSingleSelectionMode(
bool singleSelectionMode) override;
207 std::optional<
bool> isSingleSelection()
const;
209 void setDefaultPreviewMode(
bool defaultPreviewMode) override;
210 std::optional<
bool> isDefaultPreview()
const;
212 void setExcludedAbilities(
const QList<ShareAbilityType> &excludedAbilities)
override;
213 std::optional<QList<ShareAbilityType>> excludedAbilities()
const;
216 std::optional<QPoint> m_anchorOffset;
217 std::optional<QSize> m_anchorSize;
218 std::optional<
bool> m_singleSelectionMode;
219 std::optional<
bool> m_defaultPreviewMode;
220 std::optional<QList<ShareAbilityType>> m_excludedAbilities;
223void ShareControllerOptionsImpl::setAnchorOffset(QPoint anchorOffset)
225 m_anchorOffset = anchorOffset;
228void ShareControllerOptionsImpl::setAnchor(QRect anchor)
230 m_anchorOffset = anchor.topLeft();
231 m_anchorSize = anchor.size();
234std::optional<QPoint> ShareControllerOptionsImpl::anchorOffset()
const
236 return m_anchorOffset;
239std::optional<QSize> ShareControllerOptionsImpl::anchorSize()
const
244void ShareControllerOptionsImpl::setSingleSelectionMode(
bool singleSelectionMode)
246 m_singleSelectionMode = singleSelectionMode;
249std::optional<
bool> ShareControllerOptionsImpl::isSingleSelection()
const
251 return m_singleSelectionMode;
254void ShareControllerOptionsImpl::setDefaultPreviewMode(
bool defaultPreviewMode)
256 m_defaultPreviewMode = defaultPreviewMode;
259std::optional<
bool> ShareControllerOptionsImpl::isDefaultPreview()
const
261 return m_defaultPreviewMode;
264void ShareControllerOptionsImpl::setExcludedAbilities(
const QList<ShareAbilityType> &excludedAbilities)
266 m_excludedAbilities = excludedAbilities;
269std::optional<QList<ShareAbilityType>> ShareControllerOptionsImpl::excludedAbilities()
const
271 return m_excludedAbilities;
274class ShareOperationResultImpl :
public ShareOperationResult
277 ShareOperationResultImpl(
280 QString targetAbilityName()
const override;
283 QString m_targetAbilityName;
286ShareOperationResultImpl::ShareOperationResultImpl(
288 : ShareOperationResult()
289 , m_targetAbilityName(QString::fromStdString(shareOperationResult.targetAbilityName))
293QString ShareOperationResultImpl::targetAbilityName()
const
295 return m_targetAbilityName;
298std::vector<QOhosShareKit::SharedRecord> convertToShareKitSharedRecords(
299 const QList<std::shared_ptr<SharedRecord>> &dataToShare)
301 std::vector<QOhosShareKit::SharedRecord> records;
303 for (
const auto &sharedRecord : dataToShare) {
304 const auto *sharedRecordImpl =
static_cast<
const SharedRecordImpl *>(sharedRecord.get());
306 auto shareKitSharedRecord = QOhosShareKit::SharedRecord{
307 .mimeType = !sharedRecordImpl->isUrlContent()
308 ? sharedRecordImpl->mimeType().name().toStdString()
309 : std::string(mimeTextUriList),
312 if (!sharedRecordImpl->content().isNull()) {
313 shareKitSharedRecord.content = sharedRecordImpl->content().toStdString();
314 }
else if (!sharedRecordImpl->filePath().isNull()) {
315 shareKitSharedRecord.filePath = sharedRecordImpl->filePath().toStdString();
317 qOhosPrintfWarning(
"%s: SharedRecord doesn't have content or uri, skipping...", Q_FUNC_INFO);
321 if (!sharedRecordImpl->title().isNull())
322 shareKitSharedRecord.title = sharedRecordImpl->title().toStdString();
323 if (!sharedRecordImpl->label().isNull())
324 shareKitSharedRecord.label = sharedRecordImpl->label().toStdString();
325 if (!sharedRecordImpl->description().isNull())
326 shareKitSharedRecord.description = sharedRecordImpl->description().toStdString();
327 if (!sharedRecordImpl->thumbnail().isNull())
328 shareKitSharedRecord.thumbnail = sharedRecordImpl->thumbnail();
329 if (!sharedRecordImpl->thumbnailFilePath().isNull())
330 shareKitSharedRecord.thumbnailFilePath = sharedRecordImpl->thumbnailFilePath().toStdString();
331 if (!sharedRecordImpl->extraData().isEmpty())
332 shareKitSharedRecord.extraData = sharedRecordImpl->extraData();
334 records.push_back(shareKitSharedRecord);
343
344
345
346
347
348
349
350
353
354
355
356
357
358
361
362
363
364
365
366
369
370
371
372
373
374
377
378
379
380
381
382
385
386
387
388
389
390
393
394
395
396
397
398
401
402
403
404
405
406
409
410
411
412
413
414
417
418
419
420
421
422
425
426
427
428
429
430
433
434
435
436
437
438
441
442
443
444
445
446
449
450
451
452
453
454
457
458
459
460
461
462
465
466
467
468
469
470
473
474
475
476
477
478
484
485
486
487
488
489
490
491
494
495
496
497
498
499
502
503
504
505
506
507
510
511
512
513
514
515
516
520
521
522
523
524
525
526
529
530
531
532
533
534
540
541
542
543
544
545
546
547
550
551
552
553
554
555
561
562
563
564
565
566
567
569 const QMimeType &mimeType,
const QString &content)
571 return std::make_shared<SharedRecordImpl>(mimeType, content,
false);
575
576
577
578
579
580
581
584 return std::make_shared<SharedRecordImpl>(fileInfo);
588
589
590
591
592
593
596 return std::make_shared<SharedRecordImpl>(QMimeType(), url.toString(),
true);
600
601
602
603
604
605
606
609 return std::make_shared<ShareControllerOptionsImpl>();
619 QWindow *optMainWindow,
const QList<std::shared_ptr<SharedRecord>> &records,
620 std::shared_ptr<ShareControllerOptions> controllerOptions,
621 std::function<
void()> panelClosedCallback,
622 std::function<
void(std::shared_ptr<ShareKit::ShareOperationResult>)> shareCompletedCallback)
625 if (controllerOptions) {
626 const auto *controllerOptionsImpl =
static_cast<
const ShareControllerOptionsImpl *>(controllerOptions.get());
628 const auto optAnchorOffset = controllerOptionsImpl->anchorOffset();
629 if (optAnchorOffset.has_value()) {
631 .windowOffset = optAnchorOffset.value(),
632 .size = controllerOptionsImpl->anchorSize(),
636 const auto optSingleSelection = controllerOptionsImpl->isSingleSelection();
637 if (optSingleSelection.has_value()) {
638 shareKitControllerOptions.selectionMode = optSingleSelection.value()
643 const auto optDefaultPreview = controllerOptionsImpl->isDefaultPreview();
644 if (optDefaultPreview.has_value()) {
645 shareKitControllerOptions.previewMode = optDefaultPreview.value()
650 const auto optExcludedAbilities = controllerOptionsImpl->excludedAbilities();
651 if (optExcludedAbilities.has_value())
652 shareKitControllerOptions.excludedAbilities =
653 mapExcludedAbilitiesToShareKit(optExcludedAbilities.value());
656 return QOhosShareKit::shareData(
657 optMainWindow, convertToShareKitSharedRecords(records), shareKitControllerOptions,
658 std::move(panelClosedCallback),
659 [shareCompletedCallback = std::move(shareCompletedCallback)](
auto shareOperationResult) {
660 shareCompletedCallback(
std::make_shared<ShareOperationResultImpl>(shareOperationResult));
Combined button and popup list for selecting options.
QtOhos::enums::kit::ShareKit::systemShare::ShareAbilityType ShareAbilityType
QtOhos::enums::kit::ShareKit::systemShare::SharePreviewMode SharePreviewMode
QtOhos::enums::kit::ShareKit::systemShare::SelectionMode SelectionMode
std::shared_ptr< void > shareData(QWindow *optMainWindow, const QList< std::shared_ptr< SharedRecord > > &records, std::shared_ptr< ShareControllerOptions > controllerOptions, std::function< void()> panelClosedCallback, std::function< void(std::shared_ptr< ShareKit::ShareOperationResult >)> shareCompletedCallback)
std::shared_ptr< SharedRecord > createContentRecord(const QMimeType &mimeType, const QString &content)
Creates a shared "content" record with a given mimeType and content.
std::shared_ptr< SharedRecord > createUrlRecord(const QUrl &url)
Creates a shared record with a given url.
std::shared_ptr< SharedRecord > createFileRecord(const QFileInfo &fileInfo)
Creates a shared "file" record with a given fileInfo.
std::shared_ptr< ShareControllerOptions > createControllerOptions()
Creates a controller options instnace.