File indexing completed on 2025-09-14 03:43:31

0001 /*
0002     File                 : ResizableTextEdit.cpp
0003     Project              : LabPlot
0004     Description          : Extended TextEdit to allow the manual resize by the user
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2018 Alexander Semke <alexander.semke@web.de>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "ResizableTextEdit.h"
0011 #include "backend/lib/macros.h"
0012 
0013 #include <QApplication>
0014 #include <QMouseEvent>
0015 #include <QPainter>
0016 #include <QStyleOption>
0017 
0018 GrabBar::GrabBar(ResizableTextEdit* parent, bool vertResizeOnly)
0019     : QWidget(parent)
0020     , m_parent(parent)
0021     , m_vertResizeOnly(vertResizeOnly) {
0022     resize(20, 10);
0023 }
0024 
0025 QSize GrabBar::sizeHint() const {
0026     return QSize{20, 10};
0027 }
0028 
0029 void GrabBar::paintEvent(QPaintEvent*) {
0030     QPainter p(this);
0031 
0032     // QDEBUG(Q_FUNC_INFO << ", rect = " << rect())
0033 
0034 #if defined(Q_OS_LINUX) || defined(Q_OS_WIN)
0035     // fallback rect
0036     p.fillRect(rect(), QColor(Qt::darkGray));
0037 #endif
0038 
0039     // see qsplitter.cpp
0040     QStyleOption opt(0);
0041     opt.rect = rect();
0042     opt.palette = palette();
0043     opt.state = QStyle::State_Horizontal;
0044 
0045     if (m_hovered)
0046         opt.state |= QStyle::State_MouseOver;
0047     if (m_pressed)
0048         opt.state |= QStyle::State_Sunken;
0049     if (isEnabled())
0050         opt.state |= QStyle::State_Enabled;
0051 
0052     m_parent->style()->drawControl(QStyle::CE_Splitter, &opt, &p, m_parent);
0053 }
0054 
0055 void GrabBar::mousePressEvent(QMouseEvent* e) {
0056     if (e->button() == Qt::LeftButton) {
0057         m_pos = e->pos();
0058         m_pressed = true;
0059     }
0060 
0061     e->accept();
0062 }
0063 
0064 void GrabBar::mouseReleaseEvent(QMouseEvent* e) {
0065     if (e->button() == Qt::LeftButton)
0066         m_pressed = false;
0067 
0068     e->accept();
0069 }
0070 
0071 void GrabBar::mouseMoveEvent(QMouseEvent* e) {
0072     if (m_pressed) {
0073         const QPoint delta = e->pos() - m_pos;
0074         if (m_vertResizeOnly)
0075             m_parent->addSize(QSize(0, delta.y()));
0076         else
0077             m_parent->addSize(QSize(delta.x(), delta.y()));
0078     }
0079 
0080     e->accept();
0081 }
0082 
0083 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0084 void GrabBar::enterEvent(QEnterEvent* e) {
0085 #else
0086 void GrabBar::enterEvent(QEvent* e) {
0087 #endif
0088     if (isEnabled()) {
0089         if (m_vertResizeOnly)
0090             QApplication::setOverrideCursor(QCursor(Qt::SizeVerCursor));
0091         else
0092             QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor));
0093 
0094         m_hovered = true;
0095     }
0096 
0097     e->accept();
0098 }
0099 
0100 void GrabBar::leaveEvent(QEvent* e) {
0101     QApplication::restoreOverrideCursor();
0102     m_hovered = false;
0103     e->accept();
0104 }
0105 
0106 /**
0107  * \class ResizableTextEdit
0108  * \brief Extended QTextEdit supporting the manual resize by the user.
0109  *
0110  * \ingroup frontend/widgets
0111  */
0112 ResizableTextEdit::ResizableTextEdit(QWidget* parent, bool vertResizeOnly)
0113     : QTextEdit(parent)
0114     , m_grabBar(new GrabBar(this, vertResizeOnly))
0115     , m_size(QTextEdit::sizeHint())
0116     , m_vertResizeOnly(vertResizeOnly) {
0117 }
0118 
0119 void ResizableTextEdit::addSize(QSize size) {
0120     if (m_size.height() + size.height() < minimumHeight())
0121         return;
0122 
0123     m_size = QSize(m_size.width(), m_size.height() + size.height());
0124     updateGeometry();
0125     setMaximumHeight(m_size.height());
0126 }
0127 
0128 QSize ResizableTextEdit::sizeHint() const {
0129     return m_size;
0130 }
0131 
0132 QString ResizableTextEdit::text() const {
0133     return document()->toPlainText();
0134 }
0135 
0136 void ResizableTextEdit::resizeEvent(QResizeEvent* e) {
0137     if (m_vertResizeOnly)
0138         m_grabBar->move(width() / 2 - m_grabBar->width() / 2, height() - m_grabBar->height());
0139     else
0140         m_grabBar->move(width() - m_grabBar->width(), height() - m_grabBar->height());
0141 
0142     m_size = e->size();
0143 
0144     QTextEdit::resizeEvent(e);
0145     e->accept();
0146 }