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 }