9#include <QtWidgets/qlineedit.h>
10#include <QtGui/qvalidator.h>
11#include <QtGui/qevent.h>
12#include <QtWidgets/qcompleter.h>
13#include <QtWidgets/qabstractitemview.h>
14#include <QtCore/qregularexpression.h>
15#include <QtCore/qurl.h>
16#include <QtCore/qfile.h>
17#include <QtCore/qdebug.h>
21using namespace Qt::StringLiterals;
24 const QChar NewLineChar(u'\n');
25 const auto EscapedNewLine =
"\\n"_L1;
28 class ReplacementValidator :
public QValidator {
30 ReplacementValidator (QObject * parent,
31 const QString &offending,
32 const QString &replacement);
33 void fixup ( QString & input )
const override;
34 State validate ( QString & input,
int &pos)
const override;
36 const QString m_offending;
37 const QString m_replacement;
40 ReplacementValidator::ReplacementValidator (QObject * parent,
41 const QString &offending,
42 const QString &replacement) :
44 m_offending(offending),
45 m_replacement(replacement)
49 void ReplacementValidator::fixup ( QString & input )
const {
50 input.replace(m_offending, m_replacement);
53 QValidator::State ReplacementValidator::validate ( QString & input,
int &)
const {
59 class StyleSheetValidator :
public ReplacementValidator {
61 StyleSheetValidator (QObject * parent);
62 State validate(QString & input,
int &pos)
const override;
65 StyleSheetValidator::StyleSheetValidator (QObject * parent) :
66 ReplacementValidator(parent, NewLineChar, EscapedNewLine)
70 QValidator::State StyleSheetValidator::validate ( QString & input,
int &pos)
const
73 const State state = ReplacementValidator:: validate(input, pos);
74 if (state != Acceptable)
77 const QString styleSheet = qdesigner_internal::TextPropertyEditor::editorStringToString(input, qdesigner_internal::ValidationStyleSheet);
78 const bool valid = qdesigner_internal::StyleSheetEditorDialog::isStyleSheetValid(styleSheet);
79 return valid ? Acceptable : Intermediate;
84 class UrlValidator :
public QValidator {
86 UrlValidator(QCompleter *completer, QObject *parent);
88 State validate(QString &input,
int &pos)
const override;
89 void fixup(QString &input)
const override;
91 QUrl guessUrlFromString(
const QString &string)
const;
92 QCompleter *m_completer;
95 UrlValidator::UrlValidator(QCompleter *completer, QObject *parent) :
97 m_completer(completer)
101 QValidator::State UrlValidator::validate(QString &input,
int &pos)
const
108 const QUrl url(input, QUrl::StrictMode);
110 if (!url.isValid() || url.isEmpty())
113 if (url.scheme().isEmpty())
116 if (url.host().isEmpty() && url.path().isEmpty())
122 void UrlValidator::fixup(QString &input)
const
125 if (
const QAbstractItemView *iv = m_completer->popup()) {
130 input = guessUrlFromString(input).toString();
133 QUrl UrlValidator::guessUrlFromString(
const QString &string)
const
135 const QString urlStr = string.trimmed();
136 const QRegularExpression qualifiedUrl(u"^[a-zA-Z]+\\:.*$"_s);
137 Q_ASSERT(qualifiedUrl.isValid());
140 const bool hasSchema = qualifiedUrl.match(urlStr).hasMatch();
142 const QUrl url(urlStr, QUrl::TolerantMode);
148 if (string.startsWith(
":/"_L1))
149 return QUrl(
"qrc"_L1 + string);
152 if (QFile::exists(urlStr))
153 return QUrl::fromLocalFile(urlStr);
157 const int dotIndex = urlStr.indexOf(u'.');
158 if (dotIndex != -1) {
159 const QString prefix = urlStr.left(dotIndex).toLower();
161 if (prefix ==
"ftp"_L1)
164 urlString +=
"http"_L1;
165 urlString +=
"://"_L1;
167 const QUrl url(urlString, QUrl::TolerantMode);
174 return QUrl(string, QUrl::TolerantMode);
254 u"data:text/html,"_s,
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.