Subversion Repositories tpanel

Rev

Rev 420 | Blame | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2022, 2023 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 <QPainter>
#include <QEvent>
#include <QKeyEvent>
#include <QApplication>

#include "tqtextedit.h"
#include "terror.h"

using std::string;

TQTextEdit::TQTextEdit(QWidget* parent)
    : QWidget(parent)
{
    DECL_TRACER("TQTextEdit::TQTextEdit(QWidget* parent)");

    init();
}

TQTextEdit::TQTextEdit(const QString& text, QWidget* parent)
    : QWidget(parent),
      mText(text)
{
    DECL_TRACER("TQTextEdit::TQTextEdit(const QString& text, QWidget* parent)");
}

void TQTextEdit::init()
{
    DECL_TRACER("TQTextEdit::init()");

    setCursor(Qt::IBeamCursor);
    setAutoFillBackground(true);
    update();
//    setTextInteractionFlags(Qt::TextEditorInteraction);
//    setTextFormat(Qt::PlainText);
}

void TQTextEdit::setText(const QString& text)
{
    DECL_TRACER("TQTextEdit::setText(const std::string& text)");

    if (mText != text)
    {
        mText = text;
        update();
    }
}

bool TQTextEdit::event(QEvent* event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *sKey = static_cast<QKeyEvent*>(event);

        if (sKey)
        {
            switch(sKey->key())
            {
                case Qt::Key_Enter:
                case Qt::Key_Return:
                    emit contentChanged(mText);
                break;

                case Qt::Key_0: insert("0"); break;
                case Qt::Key_1: insert("1"); break;
                case Qt::Key_2: insert("2"); break;
                case Qt::Key_3: insert("3"); break;
                case Qt::Key_4: insert("4"); break;
                case Qt::Key_5: insert("5"); break;
                case Qt::Key_6: insert("6"); break;
                case Qt::Key_7: insert("7"); break;
                case Qt::Key_8: insert("8"); break;
                case Qt::Key_9: insert("9"); break;
                case Qt::Key_A: insert(mShift || mCapsLock ? "A" : "a"); break;
                case Qt::Key_B: insert(mShift || mCapsLock ? "B" : "b"); break;
                case Qt::Key_C: insert(mShift || mCapsLock ? "C" : "c"); break;
                case Qt::Key_D: insert(mShift || mCapsLock ? "D" : "d"); break;
                case Qt::Key_E: insert(mShift || mCapsLock ? "E" : "e"); break;
                case Qt::Key_F: insert(mShift || mCapsLock ? "F" : "f"); break;
                case Qt::Key_G: insert(mShift || mCapsLock ? "G" : "g"); break;
                case Qt::Key_H: insert(mShift || mCapsLock ? "H" : "h"); break;
                case Qt::Key_I: insert(mShift || mCapsLock ? "I" : "i"); break;
                case Qt::Key_J: insert(mShift || mCapsLock ? "J" : "j"); break;
                case Qt::Key_K: insert(mShift || mCapsLock ? "K" : "k"); break;
                case Qt::Key_L: insert(mShift || mCapsLock ? "L" : "l"); break;
                case Qt::Key_M: insert(mShift || mCapsLock ? "M" : "m"); break;
                case Qt::Key_N: insert(mShift || mCapsLock ? "N" : "n"); break;
                case Qt::Key_O: insert(mShift || mCapsLock ? "O" : "o"); break;
                case Qt::Key_P: insert(mShift || mCapsLock ? "P" : "p"); break;
                case Qt::Key_Q: insert(mShift || mCapsLock ? "Q" : "q"); break;
                case Qt::Key_R: insert(mShift || mCapsLock ? "R" : "r"); break;
                case Qt::Key_S: insert(mShift || mCapsLock ? "S" : "s"); break;
                case Qt::Key_T: insert(mShift || mCapsLock ? "T" : "t"); break;
                case Qt::Key_U: insert(mShift || mCapsLock ? "U" : "u"); break;
                case Qt::Key_V: insert(mShift || mCapsLock ? "V" : "v"); break;
                case Qt::Key_W: insert(mShift || mCapsLock ? "W" : "w"); break;
                case Qt::Key_X: insert(mShift || mCapsLock ? "X" : "x"); break;
                case Qt::Key_Y: insert(mShift || mCapsLock ? "Y" : "y"); break;
                case Qt::Key_Z: insert(mShift || mCapsLock ? "Z" : "z"); break;

                case Qt::Key_Exclam:        insert("!"); break;
                case Qt::Key_Space:         insert(" "); break;
                case Qt::Key_Ampersand:     insert("&"); break;
                case Qt::Key_Slash:         insert("/"); break;
                case Qt::Key_Backslash:     insert("\\"); break;
                case Qt::Key_QuoteDbl:      insert("\""); break;
                case Qt::Key_Percent:       insert("%"); break;
                case Qt::Key_Dollar:        insert("$"); break;
                case Qt::Key_paragraph:     insert("§"); break;
                case Qt::Key_BraceLeft:     insert("{"); break;
                case Qt::Key_BraceRight:    insert("}"); break;
                case Qt::Key_BracketLeft:   insert("["); break;
                case Qt::Key_BracketRight:  insert("]"); break;
                case Qt::Key_ParenLeft:     insert("("); break;
                case Qt::Key_ParenRight:    insert(")"); break;
                case Qt::Key_Equal:         insert("="); break;
                case Qt::Key_Question:      insert("?"); break;
                case Qt::Key_degree:        insert("°"); break;
                case Qt::Key_Colon:         insert(":"); break;
                case Qt::Key_Comma:         insert(","); break;
                case Qt::Key_Underscore:    insert("_"); break;
                case Qt::Key_hyphen:        insert("-"); break;
                case Qt::Key_Semicolon:     insert(";"); break;
                case Qt::Key_Bar:           insert("|"); break;
                case Qt::Key_Greater:       insert(">"); break;
                case Qt::Key_Less:          insert("<"); break;
                case Qt::Key_AsciiCircum:   insert("^"); break;
                case Qt::Key_Plus:          insert("+"); break;
                case Qt::Key_Period:        insert("."); break;
                case Qt::Key_QuoteLeft:     insert("`"); break;
                case Qt::Key_Apostrophe:    insert("'"); break;
                case Qt::Key_Asterisk:      insert("*"); break;
                case Qt::Key_AsciiTilde:    insert("~"); break;
                case Qt::Key_At:            insert("@"); break;
                case Qt::Key_mu:            insert("µ"); break;

                default:
                    return false;
            }

            return true;
        }
    }

    return false;
}

void TQTextEdit::append(const QString& txt)
{
    DECL_TRACER("TQTextEdit::append(const QString& txt)");

    mText += txt;
//    QLabel::setText(mText);
    mPos = mText.length();
    update();
}

void TQTextEdit::insert(const QString& txt, int pos)
{
    DECL_TRACER("TQTextEdit::insert(const QString& txt, int pos)");

    if (mText.isEmpty())
    {
        mText = txt;
//        QLabel::setText(mText);
        mPos = mText.length();
        update();
        return;
    }

    if (pos >= 0)
    {
        if ((qsizetype)pos > mText.length())
            mPos = mText.length();
        else
            mPos = pos;
    }

    if ((qsizetype)mPos == mText.length())
    {
        append(txt);
        return;
    }

    if (mPos > 0)
    {
        QString left = txt.mid(0, mPos);
        QString right = txt.mid(mPos);

        mText = left + txt + right;
        mPos += txt.length();
    }
    else
    {
        mText = txt + mText;
        mPos += txt.length();
    }

    update();
//    QLabel::setText(mText);
}

void TQTextEdit::setAlignment(Qt::Alignment al)
{
    DECL_TRACER("TQTextEdit::setAlignment(Qt::Alignment al)");

    mAlignment = al;
    updateCoordinates();
}

void TQTextEdit::setPadding(int left, int top, int right, int bottom)
{
    DECL_TRACER("TQTextEdit::setPadding(int left, int top, int right, int bottom)");

    mPadLeft = (left >= 0 ? left : 0);
    mPadTop = (top >= 0 ? left : 0);
    mPadRight = (right >= 0 ? left : 0);
    mPadBottom = (bottom >= 0 ? left : 0);
    updateCoordinates();
}

void TQTextEdit::updateCoordinates()
{
    DECL_TRACER("TQTextEdit::updateCoordinates()");

    mFontPointSize = font().pointSize() / 2;
    mTextLength = fontMetrics().horizontalAdvance(mText);
    mTextHeight = fontMetrics().height();

    if (mAlignment & Qt::AlignLeft)
        mPosX = mPadLeft;
    else if (mAlignment & Qt::AlignHCenter)
        mPosX = width() / 2 - mTextLength / 2;
    else if (mAlignment & Qt::AlignRight)
        mPosX = width() - mPadRight - mTextLength;

    if (mAlignment & Qt::AlignTop)
        mPosY = mPadTop + mTextHeight / 2;
    else if (mAlignment & Qt::AlignVCenter)
        mPosY = height() / 2;
    else if (mAlignment & Qt::AlignBottom)
        mPosY = height() - mPadBottom - mTextHeight / 2;

    MSG_DEBUG("Font point size: " << mFontPointSize << ", text length: " << mTextLength << ", text height: " << mTextHeight);
    MSG_DEBUG("Pos X: " << mPosX << ", Pos Y: " << mPosY);
//    QApplication::processEvents();
    update();
}

void TQTextEdit::setBackgroundPixmap(const QPixmap& pixmap)
{
    DECL_TRACER("TQTextEdit::setBackgroundPixmap(const QPixmap& pixmap)");

    if (pixmap.isNull())
        return;

    mBackground = pixmap;
//    setPixmap(mBackground);
//    QApplication::processEvents();
    update();
}

void TQTextEdit::resizeEvent(QResizeEvent *evt)
{
    DECL_TRACER("TQTextEdit::resizeEvent(QResizeEvent *evt)");

    updateCoordinates();
    QWidget::resizeEvent(evt);
}

void TQTextEdit::paintEvent(QPaintEvent*)
{
    DECL_TRACER("TQTextEdit::paintEvent(QPaintEvent*)");

    QPainter p(this);

    if (!mBackground.isNull())
        p.drawPixmap(0, 0, mBackground);

    p.drawText(mPosX, mPosY + mFontPointSize, mText);
}