summaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/common/extlineedit.cpp
blob: 2ac65315ede5a13ef120724217b899c4b34f280a (plain) (blame)
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
#include "extlineedit.h"
#include "iconmanager.h"
#include <QStyle>
#include <QAction>
#include <QDebug>

ExtLineEdit::ExtLineEdit(QWidget* parent)
    : QLineEdit(parent)
{
    init();
}

ExtLineEdit::ExtLineEdit(const QString& text, QWidget *parent)
    : QLineEdit(text, parent)
{
    init();
}

void ExtLineEdit::init()
{
    connect(this, &QLineEdit::textChanged, this, &ExtLineEdit::handleTextChanged);
}

void ExtLineEdit::updateMinSize()
{
    setMinimumSize(expandingMinWidth, 0);
}

int ExtLineEdit::getExpandingMaxWidth() const
{
    return expandingMaxWidth;
}

void ExtLineEdit::setExpandingMaxWidth(int value)
{
    expandingMaxWidth = value;
    setMaximumWidth(value);
}

void ExtLineEdit::setClearButtonEnabled(bool enable)
{
    QLineEdit::setClearButtonEnabled(enable);
    if (enable)
    {
        // This is a hack to get to know when QLineEdit's clear button is pressed.
        // Unfortunately Qt 5.2 API doesn't provide such information,
        // but we can find QAction responsible for it by its object name
        // and handle its triggered() signal.
        // This is not part of an official Qt's API and may be modified in any Qt version.
        // Ugly, but works.
        static const char* qtClearBtnActionName = "_q_qlineeditclearaction";
        QAction *clearAction = findChild<QAction*>(qtClearBtnActionName);
        if (!clearAction)
        {
            qWarning() << "Could not find 'clear action' in QLineEdit, so 'valueErased()' signal won't be emitted from ExtLineEdit.";
            return;
        }
        connect(clearAction, SIGNAL(triggered()), this, SLOT(checkForValueErased()));
    }
}

void ExtLineEdit::checkForValueErased()
{
    if (text().isEmpty())
        return;

    emit valueErased();
}

bool ExtLineEdit::getExpanding() const
{
    return expanding;
}

void ExtLineEdit::setExpanding(bool value)
{
    expanding = value;
    if (!expanding)
        setFixedWidth(-1);
    else
        setFixedWidth(expandingMinWidth);
}

int ExtLineEdit::getExpandingMinWidth() const
{
    return expandingMinWidth;
}

void ExtLineEdit::setExpandingMinWidth(int value)
{
    expandingMinWidth = value;
    updateMinSize();
}

void ExtLineEdit::handleTextChanged()
{
    QString txt = text();
    if (!expanding)
        return;

    // Text width
    int newWidth = fontMetrics().horizontalAdvance(txt);

    // Text margins
    QMargins margins = textMargins();
    newWidth += margins.left() + margins.right();

    // Content margins
    QMargins localContentsMargins = contentsMargins();
    newWidth += localContentsMargins.left() + localContentsMargins.right();

    // Frame
    int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
    newWidth += frameWidth * 2;

    // Extra space
    newWidth += expandingExtraSpace;

    if (newWidth < expandingMinWidth)
        newWidth = expandingMinWidth;
    else if (expandingMaxWidth > 0 && newWidth > expandingMaxWidth)
        newWidth = expandingMaxWidth;

    setFixedWidth(newWidth);
}