QT6: QMouseEvent

This commit is contained in:
Simon De Backer
2020-10-03 15:45:43 +02:00
parent 074e2c8b2d
commit 2e2a652343

View File

@@ -1,28 +1,29 @@
/* /*
Copyright 2006-2020 The QElectroTech Team Copyright 2006-2020 The QElectroTech Team
This file is part of QElectroTech. This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
QElectroTech is distributed in the hope that it will be useful, QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "qtextorientationwidget.h" #include "qtextorientationwidget.h"
#include <algorithm> #include <algorithm>
#include <QMouseEvent>
/** /**
Constructeur Constructeur
Par defaut, ce widget met en valeur les angles multiples de 45 degres Par defaut, ce widget met en valeur les angles multiples de 45 degres
et presente un texte oriente a 0 degre, avec la police par defaut de et presente un texte oriente a 0 degre, avec la police par defaut de
l'application. Le texte affiche est l'application. Le texte affiche est
@param parent Widget parent @param parent Widget parent
*/ */
QTextOrientationWidget::QTextOrientationWidget(QWidget *parent) : QTextOrientationWidget::QTextOrientationWidget(QWidget *parent) :
@@ -36,14 +37,14 @@ QTextOrientationWidget::QTextOrientationWidget(QWidget *parent) :
// chaines par defaut // chaines par defaut
text_size_hash_.insert(tr("Ex.", "Short example string"), -1); text_size_hash_.insert(tr("Ex.", "Short example string"), -1);
text_size_hash_.insert(tr("Exemple", "Longer example string"), -1); text_size_hash_.insert(tr("Exemple", "Longer example string"), -1);
// definit la politique de gestion de la taille de ce widget : // definit la politique de gestion de la taille de ce widget :
// on prefere la sizeHint() // on prefere la sizeHint()
QSizePolicy size_policy(QSizePolicy::Minimum, QSizePolicy::Minimum); QSizePolicy size_policy(QSizePolicy::Minimum, QSizePolicy::Minimum);
// on souhaite conserver le rapport entre sa hauteur et sa largeur // on souhaite conserver le rapport entre sa hauteur et sa largeur
size_policy.setHeightForWidth(true); size_policy.setHeightForWidth(true);
setSizePolicy(size_policy); setSizePolicy(size_policy);
// suivi de la souris : permet de recevoir les evenements relatifs aux // suivi de la souris : permet de recevoir les evenements relatifs aux
// mouvement de la souris sans que l'utilisateur n'ait a cliquer // mouvement de la souris sans que l'utilisateur n'ait a cliquer
setMouseTracking(true); setMouseTracking(true);
@@ -82,7 +83,7 @@ double QTextOrientationWidget::orientation() const
*/ */
void QTextOrientationWidget::setFont(const QFont &font) { void QTextOrientationWidget::setFont(const QFont &font) {
text_font_ = font; text_font_ = font;
// invalide le cache contenant les longueurs des textes a disposition // invalide le cache contenant les longueurs des textes a disposition
foreach(QString text, text_size_hash_.keys()) { foreach(QString text, text_size_hash_.keys()) {
text_size_hash_[text] = -1; text_size_hash_[text] = -1;
@@ -121,7 +122,7 @@ bool QTextOrientationWidget::textDisplayed() const
*/ */
void QTextOrientationWidget::setUsableTexts(const QStringList &texts_list) { void QTextOrientationWidget::setUsableTexts(const QStringList &texts_list) {
if (texts_list.isEmpty()) return; if (texts_list.isEmpty()) return;
// on oublie les anciennes chaines // on oublie les anciennes chaines
foreach(QString text, text_size_hash_.keys()) { foreach(QString text, text_size_hash_.keys()) {
// il faut oublier les anciennes chaines // il faut oublier les anciennes chaines
@@ -129,7 +130,7 @@ void QTextOrientationWidget::setUsableTexts(const QStringList &texts_list) {
text_size_hash_.remove(text); text_size_hash_.remove(text);
} }
} }
// on ajoute les nouvelles, sans les calculer (on met -1 en guise de longueur) // on ajoute les nouvelles, sans les calculer (on met -1 en guise de longueur)
foreach(QString text, texts_list) { foreach(QString text, texts_list) {
if (!text_size_hash_.contains(text)) { if (!text_size_hash_.contains(text)) {
@@ -185,31 +186,31 @@ int QTextOrientationWidget::heightForWidth(int w) const
*/ */
void QTextOrientationWidget::paintEvent(QPaintEvent *event) { void QTextOrientationWidget::paintEvent(QPaintEvent *event) {
Q_UNUSED(event); Q_UNUSED(event);
// rectangle de travail avec son centre et son rayon // rectangle de travail avec son centre et son rayon
QRect drawing_rectangle(QPoint(0, 0), size()); QRect drawing_rectangle(QPoint(0, 0), size());
drawing_rectangle.adjust(5, 5, -5, -5); drawing_rectangle.adjust(5, 5, -5, -5);
QPointF drawing_rectangle_center(drawing_rectangle.center()); QPointF drawing_rectangle_center(drawing_rectangle.center());
qreal drawing_rectangle_radius = drawing_rectangle.width() / 2.0; qreal drawing_rectangle_radius = drawing_rectangle.width() / 2.0;
QPainter p; QPainter p;
p.begin(this); p.begin(this);
p.setRenderHint(QPainter::Antialiasing, true); p.setRenderHint(QPainter::Antialiasing, true);
p.setRenderHint(QPainter::TextAntialiasing, true); p.setRenderHint(QPainter::TextAntialiasing, true);
// cercle gris a fond jaune // cercle gris a fond jaune
p.setPen(QPen(QBrush(QColor("#9FA8A8")), 2.0)); p.setPen(QPen(QBrush(QColor("#9FA8A8")), 2.0));
p.setBrush(QBrush(QColor("#ffffaa"))); p.setBrush(QBrush(QColor("#ffffaa")));
p.drawEllipse(drawing_rectangle); p.drawEllipse(drawing_rectangle);
// ligne rouge indiquant l'angle actuel // ligne rouge indiquant l'angle actuel
p.setPen(QPen(QBrush(Qt::red), 1.0)); p.setPen(QPen(QBrush(Qt::red), 1.0));
p.translate(drawing_rectangle_center); p.translate(drawing_rectangle_center);
p.rotate(current_orientation_); p.rotate(current_orientation_);
p.drawLine(QLineF(QPointF(), QPointF(drawing_rectangle_radius, 0.0))); p.drawLine(QLineF(QPointF(), QPointF(drawing_rectangle_radius, 0.0)));
// texte optionnel // texte optionnel
if (display_text_) { if (display_text_) {
// determine le texte a afficher // determine le texte a afficher
@@ -223,7 +224,7 @@ void QTextOrientationWidget::paintEvent(QPaintEvent *event) {
p.drawText(QPoint(), chosen_text); p.drawText(QPoint(), chosen_text);
} }
} }
// carres verts a fond vert // carres verts a fond vert
qreal squares_size = size().width() / 15.0; qreal squares_size = size().width() / 15.0;
qreal square_offset = - squares_size / 2.0; qreal square_offset = - squares_size / 2.0;
@@ -244,7 +245,7 @@ void QTextOrientationWidget::paintEvent(QPaintEvent *event) {
p.setBrush(QBrush(QColor("#248A34"))); p.setBrush(QBrush(QColor("#248A34")));
} }
} }
p.end(); p.end();
} }
@@ -254,9 +255,15 @@ void QTextOrientationWidget::paintEvent(QPaintEvent *event) {
*/ */
void QTextOrientationWidget::mouseMoveEvent(QMouseEvent *event) { void QTextOrientationWidget::mouseMoveEvent(QMouseEvent *event) {
if (read_only_) return; if (read_only_) return;
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
bool drawn_angle_hovered = positionIsASquare(event -> localPos(), &highlight_angle_); bool drawn_angle_hovered = positionIsASquare(event -> localPos(), &highlight_angle_);
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
bool drawn_angle_hovered = positionIsASquare(event -> position(), &highlight_angle_);
#endif
if (must_highlight_angle_ != drawn_angle_hovered) { if (must_highlight_angle_ != drawn_angle_hovered) {
must_highlight_angle_ = drawn_angle_hovered; must_highlight_angle_ = drawn_angle_hovered;
update(); update();
@@ -269,10 +276,16 @@ void QTextOrientationWidget::mouseMoveEvent(QMouseEvent *event) {
*/ */
void QTextOrientationWidget::mouseReleaseEvent(QMouseEvent *event) { void QTextOrientationWidget::mouseReleaseEvent(QMouseEvent *event) {
if (read_only_) return; if (read_only_) return;
double clicked_angle; double clicked_angle;
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
bool drawn_angle_clicked = positionIsASquare(event -> localPos(), &clicked_angle); bool drawn_angle_clicked = positionIsASquare(event -> localPos(), &clicked_angle);
#else
#if TODO_LIST
#pragma message("@TODO remove code for QT 6 or later")
#endif
bool drawn_angle_clicked = positionIsASquare(event -> position(), &clicked_angle);
#endif
if (drawn_angle_clicked) { if (drawn_angle_clicked) {
setOrientation(clicked_angle); setOrientation(clicked_angle);
emit(orientationChanged(clicked_angle)); emit(orientationChanged(clicked_angle));
@@ -288,7 +301,7 @@ void QTextOrientationWidget::mouseReleaseEvent(QMouseEvent *event) {
QString QTextOrientationWidget::getMostUsableStringForRadius(const qreal &radius) { QString QTextOrientationWidget::getMostUsableStringForRadius(const qreal &radius) {
// s'assure que l'on connait la longueur de chaque texte a disposition // s'assure que l'on connait la longueur de chaque texte a disposition
generateTextSizeHash(); generateTextSizeHash();
// recupere les longueurs a disposition // recupere les longueurs a disposition
QList<qreal> available_lengths = text_size_hash_.values(); QList<qreal> available_lengths = text_size_hash_.values();
// trie les longueurs par ordre croissant // trie les longueurs par ordre croissant
@@ -297,7 +310,7 @@ QString QTextOrientationWidget::getMostUsableStringForRadius(const qreal &radius
QList<qreal>::const_iterator i = std::upper_bound(available_lengths.begin(), QList<qreal>::const_iterator i = std::upper_bound(available_lengths.begin(),
available_lengths.end(), available_lengths.end(),
radius); radius);
// la valeur precedent cette position est donc celle qui nous interesse // la valeur precedent cette position est donc celle qui nous interesse
if (i == available_lengths.begin()) { if (i == available_lengths.begin()) {
// nous sommes au debut de la liste - nous ne pouvons donc pas afficher de chaine // nous sommes au debut de la liste - nous ne pouvons donc pas afficher de chaine
@@ -335,27 +348,27 @@ bool QTextOrientationWidget::positionIsASquare(const QPointF &pos, double *angle
// rectangle de travail avec son centre et son rayon // rectangle de travail avec son centre et son rayon
QRect drawing_rectangle(QPoint(0, 0), size()); QRect drawing_rectangle(QPoint(0, 0), size());
drawing_rectangle.adjust(5, 5, -5, -5); drawing_rectangle.adjust(5, 5, -5, -5);
QPointF drawing_rectangle_center(drawing_rectangle.center()); QPointF drawing_rectangle_center(drawing_rectangle.center());
qreal drawing_rectangle_radius = drawing_rectangle.width() / 2.0; qreal drawing_rectangle_radius = drawing_rectangle.width() / 2.0;
qreal squares_size = size().width() / 15.0; qreal squares_size = size().width() / 15.0;
qreal square_offset = - squares_size / 2.0; qreal square_offset = - squares_size / 2.0;
QRectF square_qrect = QRect(square_offset, square_offset, squares_size, squares_size); QRectF square_qrect = QRect(square_offset, square_offset, squares_size, squares_size);
for (double drawing_angle = 0.0 ; drawing_angle < 360.0 ; drawing_angle += squares_interval_) { for (double drawing_angle = 0.0 ; drawing_angle < 360.0 ; drawing_angle += squares_interval_) {
QTransform transform = QTransform() QTransform transform = QTransform()
.translate(drawing_rectangle_center.x(), drawing_rectangle_center.y()) .translate(drawing_rectangle_center.x(), drawing_rectangle_center.y())
.rotate(drawing_angle) .rotate(drawing_angle)
.translate(drawing_rectangle_radius - 1.0, 0.0) .translate(drawing_rectangle_radius - 1.0, 0.0)
.rotate(-45.0); .rotate(-45.0);
QRectF mapped_rectangle = transform.mapRect(square_qrect); QRectF mapped_rectangle = transform.mapRect(square_qrect);
if (mapped_rectangle.contains(pos)) { if (mapped_rectangle.contains(pos)) {
if (angle_value_ptr) *angle_value_ptr = drawing_angle; if (angle_value_ptr) *angle_value_ptr = drawing_angle;
return(true); return(true);
} }
} }
return(false); return(false);
} }