Rev 212 | Blame | Last modification | View Log | RSS feed
/*
* Copyright (C) 2022 by Andreas Theofilu <andreas@theosys.at>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "tqeditline.h"
#include "tpagemanager.h"
#include "terror.h"
#include <QLineEdit>
#include <QTextEdit>
#include <QLabel>
#include <QHBoxLayout>
#include <QEvent>
#include <QKeyEvent>
#include <QApplication>
#ifdef QT6_LINUX
#include <QAnyStringView>
#endif
using std::string;
TQEditLine::TQEditLine(QWidget *widget, bool multiline)
: mMultiline(multiline)
{
DECL_TRACER("TQEditLine::TQEditLine(QWidget *widget, bool multiline)");
QWidget::setParent(widget);
init();
}
TQEditLine::TQEditLine(string &text, QWidget *widget, bool multiline)
: mText(text),
mMultiline(multiline)
{
DECL_TRACER("TQEditLine::TQEditLine(string &text, QWidget *widget, bool multiline)");
QWidget::setParent(widget);
init();
}
TQEditLine::~TQEditLine()
{
DECL_TRACER("TQEditLine::~TQEditLine()");
// if (mEdit || mTextArea)
// QWidget::close();
}
void TQEditLine::init()
{
DECL_TRACER("TQEditLine::init()");
QWidget::setAttribute(Qt::WA_DeleteOnClose);
QWidget::setAttribute(Qt::WA_LayoutOnEntireRect);
QWidget::setAttribute(Qt::WA_LayoutUsesWidgetRect);
if (!mLayout)
{
mLayout = new QHBoxLayout(this);
mLayout->setContentsMargins(0, 0, 0, 0);
if (mMultiline)
{
mTextArea = new QTextEdit;
}
else
{
mEdit = new QLineEdit;
}
QPalette pal;
pal.setColor(QPalette::Window, QColorConstants::Transparent);
pal.setColor(QPalette::WindowText, QColorConstants::Black);
if (!mText.empty())
{
if (mMultiline)
mTextArea->setText(mText.c_str());
else
mEdit->setText(mText.c_str());
}
if (mMultiline)
{
QWidget::setPalette(pal);
QWidget::connect(mTextArea, &QTextEdit::textChanged, this, &TQEditLine::onTextAreaChanged);
mLayout->addWidget(mTextArea);
}
else
{
QWidget::setPalette(pal);
QWidget::connect(mEdit, &QLineEdit::textChanged, this, &TQEditLine::onTextChanged);
mLayout->addWidget(mEdit);
}
QWidget::setLayout(mLayout);
}
}
void TQEditLine::setText(string &text)
{
DECL_TRACER("TQEditLine::setText(string &text)");
mText = text;
if (mMultiline && mTextArea)
mTextArea->setText(text.c_str());
else if (!mMultiline && mEdit)
mEdit->setText(text.c_str());
}
void TQEditLine::setPasswordChar(uint c)
{
DECL_TRACER("TQEditLine::setPasswordString(const string &str)");
if (!mMultiline && mEdit && c)
{
char style[256];
snprintf(style, sizeof(style), "lineedit-password-character: %d", c);
mEdit->setStyleSheet(style);
mEdit->setEchoMode(QLineEdit::Password);
}
}
void TQEditLine::setFixedSize(int w, int h)
{
DECL_TRACER("TQEditLine::setFixedSize(int w, int h)");
if (mLayout && w > 0 && h > 0)
{
QWidget::setFixedSize(w, h);
if (mMultiline)
mTextArea->setFixedSize(w - 1 - mPadLeft - mPadRight, h - 1 - mPadTop - mPadBottom);
else
mEdit->setFixedSize(w - 1 - mPadLeft - mPadRight, h - 1 - mPadTop - mPadBottom);
mWidth = w;
mHeight = h;
}
}
void TQEditLine::move(QPoint &p)
{
DECL_TRACER("TQEditLine::move(QPoint &p)");
mPosX = p.x();
mPosY = p.y();
QWidget::move(p);
}
void TQEditLine::move(int x, int y)
{
DECL_TRACER("TQEditLine::move(int x, int y)");
if (mLayout && x >= 0 && x >= 0)
{
QWidget::move(x, y);
mPosX = x;
mPosY = y;
}
}
void TQEditLine::setFont(QFont &font)
{
DECL_TRACER("TQEditLine::setFont(QFont &font)");
if (mEdit)
mEdit->setFont(font);
}
void TQEditLine::setPalette(QPalette &pal)
{
DECL_TRACER("TQEditLine::setPalette(QPalette &pal)");
QWidget::setPalette(pal);
}
void TQEditLine::grabGesture(Qt::GestureType type, Qt::GestureFlags flags)
{
DECL_TRACER("TQEditLine::grabGesture(Qt::GestureType type, Qt::GestureFlags flags)");
if (mMultiline && mTextArea)
mTextArea->grabGesture(type, flags);
else if (!mMultiline && mEdit)
mEdit->grabGesture(type, flags);
}
void TQEditLine::setPadding(int left, int top, int right, int bottom)
{
DECL_TRACER("TQEditLine::setPadding(int left, int top, int right, int bottom)");
mPadLeft = (left < 0 ? 0 : left);
mPadTop = (top < 0 ? 0 : top);
mPadRight = (right < 0 ? 0 : right);
mPadBottom = (bottom < 0 ? 0 : bottom);
if (mMultiline && mTextArea)
mTextArea->setFixedSize(mWidth - 1 - mPadLeft - mPadRight, mHeight - 1 - mPadTop - mPadBottom);
else if (!mMultiline && mEdit)
mEdit->setFixedSize(mWidth - 1 - mPadLeft - mPadRight, mHeight - 1 - mPadTop - mPadBottom);
mLayout->setContentsMargins(mPadLeft, mPadTop, mPadRight, mPadBottom);
}
void TQEditLine::setFrameSize(int s)
{
DECL_TRACER("TQEditLine::setFrameSize(int s)");
setPadding(s + mPadLeft, s + mPadTop, s + mPadRight, s + mPadBottom);
}
void TQEditLine::setAutoFillBackground(bool f)
{
DECL_TRACER("TQEditLine::setAutoFillBackground(bool f)");
QWidget::setAutoFillBackground(f);
}
void TQEditLine::installEventFilter(QObject *filter)
{
DECL_TRACER("TQEditLine::installEventFilter(QObject *filter)");
QWidget::installEventFilter(filter);
}
void TQEditLine::setWordWrapMode(bool mode)
{
DECL_TRACER("TQEditLine::setWordWrapMode(bool mode)");
if (!mMultiline || !mTextArea)
return;
mTextArea->setWordWrapMode((mode ? QTextOption::WordWrap : QTextOption::NoWrap));
}
WId TQEditLine::winId()
{
DECL_TRACER("TQEditLine::winId()");
return QWidget::winId();
}
void TQEditLine::show()
{
DECL_TRACER("TQEditLine::show()");
QWidget::show();
}
void TQEditLine::close()
{
DECL_TRACER("TQEditLine::close()");
QWidget::close();
mLayout = nullptr;
mEdit = nullptr;
}
void TQEditLine::clear()
{
DECL_TRACER("TQEditLine::clear()");
if (mMultiline && mTextArea)
mTextArea->clear();
else if (!mMultiline && mEdit)
mEdit->clear();
mText.clear();
}
void TQEditLine::setInputMask(const std::string& mask)
{
DECL_TRACER("TQEditLine::setInputMask(const std::string& mask)");
if (!mMultiline && mEdit)
mEdit->setInputMask(mask.c_str());
}
void TQEditLine::setNumericInput()
{
DECL_TRACER("TQEditLine::setNumericInput()");
if (!mMultiline && mEdit)
mEdit->setInputMethodHints(mEdit->inputMethodHints() | Qt::ImhDigitsOnly);
}
#ifndef __ANDROID__
void TQEditLine::setClearButtonEnabled(bool state)
{
DECL_TRACER("TQEditLine::setClearButtonEnabled(bool state)");
if (!mMultiline && mEdit)
mEdit->setClearButtonEnabled(state);
}
void TQEditLine::setCursor(const QCursor& qc)
{
DECL_TRACER("TQEditLine::setCursor(const QCursor& qc)");
if (mMultiline && mTextArea)
mTextArea->setCursor(qc);
else if (!mMultiline && mEdit)
mEdit->setCursor(qc);
}
#endif
/*
* Here the signal and callback functions follow.
*/
bool TQEditLine::event(QEvent* event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *sKey = static_cast<QKeyEvent*>(event);
if (sKey && (sKey->key() == Qt::Key_Enter || sKey->key() == Qt::Key_Return))
{
if (mMultiline && mTextArea)
mText = mTextArea->toPlainText().toStdString();
else if (!mMultiline && mEdit)
mText = mEdit->text().toStdString();
else
{
if (mMultiline && mTextArea)
mTextArea->repaint(mTextArea->visibleRegion());
else if (!mMultiline && mEdit)
mEdit->repaint(visibleRegion());
return true;
}
if (mChanged && gPageManager)
gPageManager->inputButtonFinished(mHandle, mText);
if (mMultiline && mTextArea)
mTextArea->repaint(mTextArea->visibleRegion());
else if (!mMultiline && mEdit)
mEdit->repaint(visibleRegion());
return true;
}
}
else if (event->type() == QEvent::Close ||
event->type() == QEvent::Leave ||
event->type() == QEvent::FocusOut ||
event->type() == QEvent::Hide ||
event->type() == QEvent::WindowDeactivate)
{
if (mMultiline && mTextArea)
mText = mTextArea->toPlainText().toStdString();
else if (!mMultiline && mEdit)
mText = mEdit->text().toStdString();
else
return QWidget::event(event);
if (mChanged && gPageManager)
gPageManager->inputButtonFinished(mHandle, mText);
}
return QWidget::event(event);
}
void TQEditLine::onTextChanged(const QString &text)
{
DECL_TRACER("TQEditLine::onTextChanged(const QString &text)");
mText = text.toStdString();
mChanged = true;
}
void TQEditLine::onTextAreaChanged()
{
DECL_TRACER("TQEditLine::onTextAreaChanged()");
mText = mTextArea->toPlainText().toStdString();
mChanged = true;
}