mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-17 20:50:34 +01:00
QT6: QMouseEvent
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user