1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-23 10:42:11 +02:00
falkonOfficial/src/lib/3rdparty/lineedit.cpp

216 lines
5.8 KiB
C++
Raw Normal View History

2011-03-02 16:57:41 +01:00
#include "lineedit.h"
#include <QEvent>
#include <QLayout>
#include <QStyleOption>
#include <QPainter>
#include <QFocusEvent>
#include <qdebug.h>
SideWidget::SideWidget(QWidget* parent)
2011-03-02 16:57:41 +01:00
: QWidget(parent)
{
}
bool SideWidget::event(QEvent* event)
2011-03-02 16:57:41 +01:00
{
if (event->type() == QEvent::LayoutRequest) {
2011-03-02 16:57:41 +01:00
emit sizeHintChanged();
}
2011-03-02 16:57:41 +01:00
return QWidget::event(event);
}
LineEdit::LineEdit(QWidget* parent)
2011-03-02 16:57:41 +01:00
: QLineEdit(parent)
, m_leftLayout(0)
, m_rightLayout(0)
, m_leftMargin(0)
{
init();
}
LineEdit::LineEdit(const QString &contents, QWidget* parent)
2011-03-02 16:57:41 +01:00
: QLineEdit(contents, parent)
, m_leftWidget(0)
, m_rightWidget(0)
, m_leftLayout(0)
, m_rightLayout(0)
, m_leftMargin(0)
{
init();
}
void LineEdit::setLeftMargin(int margin)
{
m_leftMargin = margin;
}
void LineEdit::init()
{
////we use setTextMargins() instead of padding property, and we should
//// uncomment following line or just update padding property of LineEdit's
//// subclasses in all themes and use same value for padding-left and padding-right,
//// with this new implementation padding-left and padding-right show padding from
//// edges of m_leftWidget and m_rightWidget.
mainLayout = new QHBoxLayout(this);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
2011-03-02 16:57:41 +01:00
m_leftWidget = new SideWidget(this);
m_leftWidget->resize(0, 0);
m_leftLayout = new QHBoxLayout(m_leftWidget);
m_leftLayout->setContentsMargins(0, 0, 2, 0);
2011-03-02 16:57:41 +01:00
if (isRightToLeft()) {
2011-03-02 16:57:41 +01:00
m_leftLayout->setDirection(QBoxLayout::RightToLeft);
}
else {
2011-03-02 16:57:41 +01:00
m_leftLayout->setDirection(QBoxLayout::LeftToRight);
}
2011-03-02 16:57:41 +01:00
m_leftLayout->setSizeConstraint(QLayout::SetFixedSize);
m_rightWidget = new SideWidget(this);
m_rightWidget->resize(0, 0);
m_rightLayout = new QHBoxLayout(m_rightWidget);
if (isRightToLeft()) {
2011-03-02 16:57:41 +01:00
m_rightLayout->setDirection(QBoxLayout::RightToLeft);
}
else {
2011-03-02 16:57:41 +01:00
m_rightLayout->setDirection(QBoxLayout::LeftToRight);
}
2011-03-02 16:57:41 +01:00
m_rightLayout->setContentsMargins(0, 0, 2, 0);
QSpacerItem* horizontalSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
mainLayout->addWidget(m_leftWidget, 0, Qt::AlignVCenter | Qt::AlignLeft);
mainLayout->addItem(horizontalSpacer);
mainLayout->addWidget(m_rightWidget, 0, Qt::AlignVCenter | Qt::AlignRight);
//by this we undo reversing of layout when direction is RTL. //TODO: don't do this and show reversed icon when needed
mainLayout->setDirection(isRightToLeft() ? QBoxLayout::RightToLeft : QBoxLayout::LeftToRight);
2011-03-02 16:57:41 +01:00
setWidgetSpacing(3);
connect(m_leftWidget, SIGNAL(sizeHintChanged()),
this, SLOT(updateTextMargins()));
connect(m_rightWidget, SIGNAL(sizeHintChanged()),
this, SLOT(updateTextMargins()));
}
bool LineEdit::event(QEvent* event)
2011-03-02 16:57:41 +01:00
{
if (event->type() == QEvent::LayoutDirectionChange) {
//by this we undo reversing of layout when direction is RTL.
2011-03-02 16:57:41 +01:00
if (isRightToLeft()) {
mainLayout->setDirection(QBoxLayout::RightToLeft);
2011-03-02 16:57:41 +01:00
m_leftLayout->setDirection(QBoxLayout::RightToLeft);
m_rightLayout->setDirection(QBoxLayout::RightToLeft);
}
else {
mainLayout->setDirection(QBoxLayout::LeftToRight);
2011-03-02 16:57:41 +01:00
m_leftLayout->setDirection(QBoxLayout::LeftToRight);
m_rightLayout->setDirection(QBoxLayout::LeftToRight);
}
}
return QLineEdit::event(event);
}
void LineEdit::addWidget(QWidget* widget, WidgetPosition position)
2011-03-02 16:57:41 +01:00
{
if (!widget) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
if (position == LeftSide) {
m_leftLayout->addWidget(widget);
}
else {
m_rightLayout->addWidget(widget);
2011-03-02 16:57:41 +01:00
}
}
void LineEdit::removeWidget(QWidget* widget)
2011-03-02 16:57:41 +01:00
{
if (!widget) {
2011-03-02 16:57:41 +01:00
return;
}
2011-03-02 16:57:41 +01:00
m_leftLayout->removeWidget(widget);
m_rightLayout->removeWidget(widget);
widget->hide();
}
void LineEdit::setWidgetSpacing(int spacing)
{
m_leftLayout->setSpacing(spacing);
m_rightLayout->setSpacing(spacing);
updateTextMargins();
}
int LineEdit::widgetSpacing() const
{
return m_leftLayout->spacing();
}
int LineEdit::textMargin(WidgetPosition position) const
{
int spacing = m_rightLayout->spacing();
int w = 0;
if (position == LeftSide) {
2011-03-02 16:57:41 +01:00
w = m_leftWidget->sizeHint().width();
}
else {
2011-03-02 16:57:41 +01:00
w = m_rightWidget->sizeHint().width();
}
if (w == 0) {
2011-03-02 16:57:41 +01:00
return 0;
}
2011-03-02 16:57:41 +01:00
return w + spacing * 2;
}
void LineEdit::updateTextMargins()
{
int left;
if (m_leftMargin == 0) {
left = m_leftWidget->sizeHint().width();
}
else {
2011-03-02 16:57:41 +01:00
left = m_leftMargin;
}
int right = m_rightWidget->sizeHint().width();
2011-03-02 16:57:41 +01:00
int top = 0;
int bottom = 0;
setTextMargins(left, top, right, bottom);
// updateSideWidgetLocations();
}
//void LineEdit::updateSideWidgetLocations()
//{
// QStyleOptionFrameV2 opt;
// initStyleOption(&opt);
// QRect textRect = style()->subElementRect(QStyle::SE_LineEditContents, &opt, this);
// int spacing = m_rightLayout->spacing();
// textRect.adjust(spacing, 0, -spacing, 0);
// int left = textMargin(LineEdit::LeftSide);
// int midHeight = textRect.center().y() + 1;
// if (m_leftLayout->count() > 0) {
// int leftHeight = midHeight - m_leftWidget->height() / 2;
// int leftWidth = m_leftWidget->width();
// if (leftWidth == 0) {
// leftHeight = midHeight - m_leftWidget->sizeHint().height() / 2;
// }
// m_leftWidget->move(textRect.x(), leftHeight);
// }
// textRect.setX(left);
// textRect.setY(midHeight - m_rightWidget->sizeHint().height() / 2);
// textRect.setHeight(m_rightWidget->sizeHint().height());
// m_rightWidget->setGeometry(textRect);
//}
//void LineEdit::resizeEvent(QResizeEvent* event)
//{
// updateSideWidgetLocations();
// QLineEdit::resizeEvent(event);
//}