aboutsummaryrefslogtreecommitdiff
path: root/src/lib/navigation/urllineedit.cpp
blob: 4dc6b394bad30396841e77dd7f7519c3506a280d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * This file is part of smolbote. It's copyrighted by the contributors recorded
 * in the version control history of the file, available from its original
 * location: git://neueland.iserlohn-fortress.net/smolbote.git
 *
 * SPDX-License-Identifier: GPL-3.0
 */

#include "urllineedit.h"
#include <QUrl>
#include <QTimer>
#include <QMenu>
#include <QAction>
#include <QStyle>

#include <QWidgetAction>

// ssl menu
#include <QLabel>

#include "lib/bookmarks/bookmarkswidget.h"

#include <QCompleter>

UrlLineEdit::UrlLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
    setPlaceholderText(tr("Enter address"));

    // ssl menu
    m_sslMenu = new QMenu(this);
    m_sslLabel = new QLabel(m_sslMenu);
    QWidgetAction *sslErrorAction = new QWidgetAction(m_sslMenu);
    sslErrorAction->setDefaultWidget(m_sslLabel);
    m_sslMenu->addAction(sslErrorAction);

    m_sslAction = addAction(style()->standardIcon(QStyle::SP_DriveNetIcon), QLineEdit::LeadingPosition);
    m_sslAction->setToolTip(tr("TODO: Display SSL Status popup here"));
    m_sslAction->setMenu(m_sslMenu);

    connect(m_sslAction, &QAction::triggered, this, [this]() {
        m_sslMenu->exec(this->mapToGlobal(QPoint(0, height())));
    });

    m_pageAction = addAction(style()->standardIcon(QStyle::SP_FileIcon), QLineEdit::TrailingPosition);
    m_pageAction->setShortcut(QKeySequence("F10"));
    m_pageAction->setToolTip(tr("Page Actions"));
    connect(m_pageAction, &QAction::triggered, m_pageAction, [&]() {
        //this->deselect();
        if(m_pageAction->menu() != nullptr) {
            m_pageAction->menu()->exec(this->mapToGlobal(QPoint(width(), height())));
        }
    });

    QTextCharFormat hostnameFormat;
    hostnameFormat.setFontWeight(QFont::Bold);
    m_hostFormat.format = hostnameFormat;

    // connect signals
    connect(this, &QLineEdit::returnPressed, [this]() {
        if(this->text().startsWith('#')) {
            emit searchTermEntered(this->text().mid(1));
        } else {
            emit addressEntered(QUrl::fromUserInput(this->text()));
        }
        this->clearFocus();
    });

}

QAction *UrlLineEdit::sslAction()
{
    Q_CHECK_PTR(m_sslAction);
    return m_sslAction;
}

QAction *UrlLineEdit::pageAction()
{
    Q_CHECK_PTR(m_pageAction);
    return m_pageAction;
}

void UrlLineEdit::setCompleterModel(QAbstractItemModel *model)
{
    Q_CHECK_PTR(model);
    m_completer = new UrlCompleter(model, this);
    m_completer->setCompletionColumn(1);
    this->setCompleter(m_completer);
}

void UrlLineEdit::setUrl(const QUrl &url)
{
    QString urlText = url.toString();
    QString domain = url.host();

    m_hostFormat.start = urlText.indexOf(domain);
    m_hostFormat.length = domain.length();

    clear();
    clearTextFormat();
    setTextFormat(m_hostFormat);
    setText(urlText);
}

void UrlLineEdit::showSslError(const QString &message)
{
    m_sslLabel->setText(message);
    m_sslAction->trigger();
}

void UrlLineEdit::focusInEvent(QFocusEvent *event)
{
    clearTextFormat();

    QLineEdit::focusInEvent(event);

    // select the contents when receiving focus
    // http://stackoverflow.com/a/35725950/1054406
    // mousePressEvent triggers right after focusInEvent so text selected in focusInEvent unselects by mousePressEvent
    //QTimer::singleShot(0, this, SLOT(selectAll()));
}

// formatting taken from: https://forum.qt.io/topic/60962/setting-qlineedit-text-bold
void UrlLineEdit::setTextFormat(const QTextLayout::FormatRange &format)
{
    QList<QInputMethodEvent::Attribute> attributes;
    attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, format.start, format.length, format.format));
    QInputMethodEvent ev(QString(), attributes);
    event(&ev);

}

void UrlLineEdit::clearTextFormat()
{
    setTextFormat(QTextLayout::FormatRange());
}