1 // This file is part of Desktop App Toolkit, 2 // a set of libraries for developing nice desktop applications. 3 // 4 // For license and copyright information please follow this link: 5 // https://github.com/desktop-app/legal/blob/master/LEGAL 6 // 7 #pragma once 8 9 #include "base/algorithm.h" 10 #include "ui/click_handler.h" 11 12 class TextClickHandler : public ClickHandler { 13 public: 14 TextClickHandler(bool fullDisplayed = true) _fullDisplayed(fullDisplayed)15 : _fullDisplayed(fullDisplayed) { 16 } 17 copyToClipboardText()18 QString copyToClipboardText() const override { 19 return url(); 20 } 21 tooltip()22 QString tooltip() const override { 23 return _fullDisplayed ? QString() : readable(); 24 } 25 setFullDisplayed(bool full)26 void setFullDisplayed(bool full) { 27 _fullDisplayed = full; 28 } 29 30 protected: 31 virtual QString url() const = 0; 32 virtual QString readable() const; 33 34 bool _fullDisplayed; 35 36 }; 37 38 class UrlClickHandler : public TextClickHandler { 39 public: 40 UrlClickHandler(const QString &url, bool fullDisplayed = true); 41 42 QString copyToClipboardContextItemText() const override; 43 dragText()44 QString dragText() const override { 45 return url(); 46 } 47 48 TextEntity getTextEntity() const override; 49 50 static void Open(QString url, QVariant context = {}); onClick(ClickContext context)51 void onClick(ClickContext context) const override { 52 const auto button = context.button; 53 if (button == Qt::LeftButton || button == Qt::MiddleButton) { 54 Open(url(), context.other); 55 } 56 } 57 IsEmail(const QString & url)58 [[nodiscard]] static bool IsEmail(const QString &url) { 59 const auto at = url.indexOf('@'), slash = url.indexOf('/'); 60 return ((at > 0) && (slash < 0 || slash > at)); 61 } 62 [[nodiscard]] static QString EncodeForOpening(const QString &originalUrl); 63 [[nodiscard]] static bool IsSuspicious(const QString &url); 64 [[nodiscard]] static QString ShowEncoded(const QString &url); 65 66 protected: originalUrl()67 [[nodiscard]] QString originalUrl() const { 68 return _originalUrl; 69 } url()70 QString url() const override { 71 return EncodeForOpening(_originalUrl); 72 } readable()73 QString readable() const override { 74 return _readable; 75 } 76 77 private: isEmail()78 [[nodiscard]] bool isEmail() const { 79 return IsEmail(_originalUrl); 80 } 81 82 QString _originalUrl, _readable; 83 84 }; 85