[qet] [849] Il est desormais possible de specifier l' orientation des champs de texte au degre pres. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 849
Author: xavier
Date: 2010-02-12 00:35:04 +0100 (Fri, 12 Feb 2010)
Log Message:
-----------
Il est desormais possible de specifier l'orientation des champs de texte au degre pres.
Modified Paths:
--------------
branches/0.3/sources/diagram.cpp
branches/0.3/sources/diagram.h
branches/0.3/sources/diagramcommands.cpp
branches/0.3/sources/diagramcommands.h
branches/0.3/sources/diagramview.cpp
branches/0.3/sources/diagramview.h
branches/0.3/sources/qetdiagrameditor.cpp
branches/0.3/sources/qetdiagrameditor.h
branches/0.3/sources/qtextorientationspinboxwidget.cpp
Modified: branches/0.3/sources/diagram.cpp
===================================================================
--- branches/0.3/sources/diagram.cpp 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagram.cpp 2010-02-11 23:35:04 UTC (rev 849)
@@ -980,6 +980,22 @@
return(conductors_set);
}
+/**
+ @return la liste de tous les textes selectionnes : les textes independants,
+ mais aussi ceux rattaches a des conducteurs ou des elements
+*/
+QSet<DiagramTextItem *> Diagram::selectedTexts() const {
+ QSet<DiagramTextItem *> selected_texts;
+ foreach(QGraphicsItem *item, selectedItems()) {
+ if (DiagramTextItem *dti = qgraphicsitem_cast<DiagramTextItem *>(item)) {
+ selected_texts << dti;
+ } else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(item)) {
+ selected_texts << eti;
+ }
+ }
+ return(selected_texts);
+}
+
/// @return true si le presse-papier semble contenir un schema
bool Diagram::clipboardMayContainDiagram() {
QString clipboard_text = QApplication::clipboard() -> text().trimmed();
Modified: branches/0.3/sources/diagram.h
===================================================================
--- branches/0.3/sources/diagram.h 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagram.h 2010-02-11 23:35:04 UTC (rev 849)
@@ -157,6 +157,7 @@
const QSet<Conductor *> &conductorsToMove();
const QHash<Conductor *, Terminal *> &conductorsToUpdate();
const QSet<DiagramTextItem *> &textsToMove();
+ QSet<DiagramTextItem *> selectedTexts() const;
QSet<Conductor *> selectedConductors() const;
DiagramContent content() const;
DiagramContent selectedContent();
Modified: branches/0.3/sources/diagramcommands.cpp
===================================================================
--- branches/0.3/sources/diagramcommands.cpp 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagramcommands.cpp 2010-02-11 23:35:04 UTC (rev 849)
@@ -410,7 +410,8 @@
RotateElementsCommand::RotateElementsCommand(const QHash<Element *, QET::Orientation> &elements, const QList<DiagramTextItem *> &texts, QUndoCommand *parent) :
QUndoCommand(parent),
elements_to_rotate(elements),
- texts_to_rotate(texts)
+ texts_to_rotate(texts),
+ applied_rotation_angle_(-90.0)
{
setText(
QString(
@@ -432,7 +433,7 @@
e -> setOrientation(elements_to_rotate[e]);
}
foreach(DiagramTextItem *dti, texts_to_rotate) {
- dti -> rotateBy(90.0);
+ dti -> rotateBy(-applied_rotation_angle_);
}
}
@@ -443,12 +444,95 @@
e -> update();
}
foreach(DiagramTextItem *dti, texts_to_rotate) {
- dti -> rotateBy(-90.0);
+ dti -> rotateBy(applied_rotation_angle_);
}
}
/**
+ @return l'angle de rotation applique aux textes
+*/
+qreal RotateElementsCommand::appliedRotationAngle() const {
+ return(applied_rotation_angle_);
+}
+
+/**
+ @param angle l'angle de rotation a appliquer aux textes
+*/
+void RotateElementsCommand::setAppliedRotationAngle(const qreal &angle) {
+ applied_rotation_angle_ = QET::correctAngle(angle);
+}
+
+/**
Constructeur
+ @param previous_state Hash associant les textes impactes par l'action et leur angle de rotation avant l'action
+ @param applied_rotation Nouvel angle de rotation, a appliquer au textes concernes
+ @param parent QUndoCommand parent
+*/
+RotateTextsCommand::RotateTextsCommand(const QHash<DiagramTextItem *, double> &previous_state, double applied_rotation, QUndoCommand *parent) :
+ QUndoCommand(parent),
+ texts_to_rotate(previous_state),
+ applied_rotation_angle_(applied_rotation)
+{
+ defineCommandName();
+}
+
+/**
+ Constructeur
+ @param texts Liste des textes impactes par l'action. L'objet retiendra leur angle de rotation au moment de sa construction.
+ @param applied_rotation Nouvel angle de rotation, a appliquer au textes concernes
+ @param parent QUndoCommand parent
+*/
+RotateTextsCommand::RotateTextsCommand(const QList<DiagramTextItem *> &texts, double applied_rotation, QUndoCommand *parent) :
+ QUndoCommand(parent),
+ applied_rotation_angle_(applied_rotation)
+{
+ foreach(DiagramTextItem *text, texts) {
+ texts_to_rotate.insert(text, text -> rotationAngle());
+ }
+ defineCommandName();
+}
+
+/**
+ Destructeur
+*/
+RotateTextsCommand::~RotateTextsCommand() {
+}
+
+/**
+ Annule la rotation des textes
+*/
+void RotateTextsCommand::undo() {
+ foreach(DiagramTextItem *text, texts_to_rotate.keys()) {
+ text -> setRotationAngle(texts_to_rotate[text]);
+ }
+}
+
+/**
+ Applique l'angle de rotation aux textes
+*/
+void RotateTextsCommand::redo() {
+ foreach(DiagramTextItem *text, texts_to_rotate.keys()) {
+ text -> setRotationAngle(applied_rotation_angle_);
+ }
+}
+
+/**
+ Definit le nom de la commande d'annulation
+*/
+void RotateTextsCommand::defineCommandName() {
+ setText(
+ QString(
+ QObject::tr(
+ "orienter %1 \340 %2\260",
+ "undo caption - %1 looks like '42 texts', %2 is a rotation angle"
+ )
+ ).arg(QET::ElementsAndConductorsSentence(0, 0, texts_to_rotate.count()))
+ .arg(applied_rotation_angle_)
+ );
+}
+
+/**
+ Constructeur
@param c Conducteur modifie
@param old_p ancien profil du conducteur
@param new_p nouveau profil du conducteur
Modified: branches/0.3/sources/diagramcommands.h
===================================================================
--- branches/0.3/sources/diagramcommands.h 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagramcommands.h 2010-02-11 23:35:04 UTC (rev 849)
@@ -227,7 +227,7 @@
};
/**
- Cette classe represente l'action de pivoter plusieurs elements
+ Cette classe represente l'action de pivoter plusieurs elements ou champs de textes avec un meme angle
*/
class RotateElementsCommand : public QUndoCommand {
// constructeurs, destructeur
@@ -241,6 +241,8 @@
public:
virtual void undo();
virtual void redo();
+ qreal appliedRotationAngle() const;
+ void setAppliedRotationAngle(const qreal &);
// attributs
private:
@@ -248,9 +250,39 @@
QHash<Element *, QET::Orientation> elements_to_rotate;
/// textes a pivoter
QList<DiagramTextItem *> texts_to_rotate;
+ /// angle de rotation a appliquer aux textes (valeur utilisee dans le redo
+ qreal applied_rotation_angle_;
};
/**
+ Cette classe represente l'action d'orienter plusieurs textes a un meme angle de rotation bien precis
+*/
+class RotateTextsCommand : public QUndoCommand {
+ // constructeurs, destructeur
+ public:
+ RotateTextsCommand(const QHash<DiagramTextItem *, double> &, double, QUndoCommand * = 0);
+ RotateTextsCommand(const QList<DiagramTextItem *> &, double, QUndoCommand * = 0);
+ virtual ~RotateTextsCommand();
+ private:
+ RotateTextsCommand(const RotateTextsCommand &);
+
+ // methodes
+ public:
+ virtual void undo();
+ virtual void redo();
+
+ private:
+ void defineCommandName();
+
+ // attributs
+ private:
+ /// textes pivotes associes a leur ancienne orientation
+ QHash<DiagramTextItem *, double> texts_to_rotate;
+ /// angle de rotation a appliquer aux textes
+ double applied_rotation_angle_;
+};
+
+/**
Cette classe represente l'action de modifier un conducteur
*/
class ChangeConductorCommand : public QUndoCommand {
Modified: branches/0.3/sources/diagramview.cpp
===================================================================
--- branches/0.3/sources/diagramview.cpp 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagramview.cpp 2010-02-11 23:35:04 UTC (rev 849)
@@ -32,6 +32,7 @@
#include "qetdiagrameditor.h"
#include "qeticons.h"
#include "qetmessagebox.h"
+#include "qtextorientationspinboxwidget.h"
/**
Constructeur
@@ -137,6 +138,58 @@
scene -> undoStack().push(new RotateElementsCommand(elements_to_rotate, texts_to_rotate));
}
+void DiagramView::rotateTexts() {
+ if (scene -> isReadOnly()) return;
+
+ // recupere les champs de texte a orienter
+ QList<DiagramTextItem *> texts_to_rotate;
+ foreach (QGraphicsItem *item, scene -> selectedItems()) {
+ if (DiagramTextItem *dti = qgraphicsitem_cast<DiagramTextItem *>(item)) {
+ texts_to_rotate << dti;
+ } else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(item)) {
+ // ici, on pivote un texte d'element meme si son parent est selectionne
+ texts_to_rotate << eti;
+ }
+ }
+
+ // effectue les rotations s'il y a quelque chose a pivoter
+ if (texts_to_rotate.isEmpty()) return;
+
+ // demande un angle a l'utilisateur
+ QDialog ori_text_dialog(diagramEditor());
+ ori_text_dialog.setSizeGripEnabled(false);
+#ifdef Q_WS_MAC
+ ori_text_dialog.setWindowFlags(Qt::Sheet);
+#endif
+ ori_text_dialog.setWindowTitle(tr("Orienter les textes s\351lectionn\351s", "window title"));
+// ori_text_dialog.setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+
+
+ QTextOrientationSpinBoxWidget *ori_widget = QETApp::createTextOrientationSpinBoxWidget();
+ ori_widget -> setParent(&ori_text_dialog);
+ if (texts_to_rotate.count() == 1) {
+ ori_widget -> setOrientation(texts_to_rotate.at(0) -> rotationAngle());
+ }
+ ori_widget -> spinBox() -> selectAll();
+
+ // boutons
+ QDialogButtonBox buttons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+ connect(&buttons, SIGNAL(accepted()), &ori_text_dialog, SLOT(accept()));
+ connect(&buttons, SIGNAL(rejected()), &ori_text_dialog, SLOT(reject()));
+
+ // ajout dans une disposition verticale
+ QVBoxLayout layout_v(&ori_text_dialog);
+ layout_v.setSizeConstraint(QLayout::SetFixedSize);
+ layout_v.addWidget(ori_widget);
+ layout_v.addStretch();
+ layout_v.addWidget(&buttons);
+
+ // si le dialogue est accepte
+ if (ori_text_dialog.exec() == QDialog::Accepted) {
+ scene -> undoStack().push(new RotateTextsCommand(texts_to_rotate, ori_widget -> orientation()));
+ }
+}
+
/**
Accepte ou refuse le drag'n drop en fonction du type de donnees entrant
@param e le QDragEnterEvent correspondant au drag'n drop tente
Modified: branches/0.3/sources/diagramview.h
===================================================================
--- branches/0.3/sources/diagramview.h 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/diagramview.h 2010-02-11 23:35:04 UTC (rev 849)
@@ -102,6 +102,7 @@
void selectInvert();
void deleteSelection();
void rotateSelection();
+ void rotateTexts();
void setVisualisationMode();
void setSelectionMode();
void zoomIn();
Modified: branches/0.3/sources/qetdiagrameditor.cpp
===================================================================
--- branches/0.3/sources/qetdiagrameditor.cpp 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/qetdiagrameditor.cpp 2010-02-11 23:35:04 UTC (rev 849)
@@ -196,6 +196,7 @@
select_invert = new QAction( tr("Inverser la s\351lection"), this);
delete_selection = new QAction(QET::Icons::EditDelete, tr("Supprimer"), this);
rotate_selection = new QAction(QET::Icons::ObjectRotateRight, tr("Pivoter"), this);
+ rotate_texts = new QAction(QET::Icons::ObjectRotateRight, tr("Orienter les textes"), this);
selection_prop = new QAction(QET::Icons::DialogInformation, tr("Propri\351t\351s de la s\351lection"), this);
conductor_reset = new QAction(QET::Icons::ConductorSettings, tr("R\351initialiser les conducteurs"), this);
conductor_default = new QAction(QET::Icons::DefaultConductor, tr("Conducteurs par d\351faut"), this);
@@ -259,6 +260,7 @@
#endif
rotate_selection -> setShortcut(QKeySequence(tr("Space")));
+ rotate_texts -> setShortcut(QKeySequence(tr("Ctrl+Space")));
selection_prop -> setShortcut(QKeySequence(tr("Ctrl+J")));
conductor_reset -> setShortcut(QKeySequence(tr("Ctrl+K")));
infos_diagram -> setShortcut(QKeySequence(tr("Ctrl+L")));
@@ -297,7 +299,8 @@
select_nothing -> setStatusTip(tr("D\351s\351lectionne tous les \351l\351ments du sch\351ma", "status bar tip"));
select_invert -> setStatusTip(tr("D\351s\351lectionne les \351l\351ments s\351lectionn\351s et s\351lectionne les \351l\351ments non s\351lectionn\351s", "status bar tip"));
delete_selection -> setStatusTip(tr("Enl\350ve les \351l\351ments s\351lectionn\351s du sch\351ma", "status bar tip"));
- rotate_selection -> setStatusTip(tr("Pivote les \351l\351ments s\351lectionn\351s", "status bar tip"));
+ rotate_selection -> setStatusTip(tr("Pivote les \351l\351ments et textes s\351lectionn\351s", "status bar tip"));
+ rotate_texts -> setStatusTip(tr("Pivote les textes s\351lectionn\351s \320 un angle pr\351cis", "status bar tip"));
selection_prop -> setStatusTip(tr("\311dite les propri\351t\351s des objets s\351lectionn\351", "status bar tip"));
conductor_reset -> setStatusTip(tr("Recalcule les chemins des conducteurs sans tenir compte des modifications", "status bar tip"));
conductor_default -> setStatusTip(tr("Sp\351cifie les propri\351t\351s par d\351faut des conducteurs", "status bar tip"));
@@ -355,6 +358,7 @@
connect(select_invert, SIGNAL(triggered()), this, SLOT(slot_selectInvert()) );
connect(delete_selection, SIGNAL(triggered()), this, SLOT(slot_delete()) );
connect(rotate_selection, SIGNAL(triggered()), this, SLOT(slot_rotate()) );
+ connect(rotate_texts, SIGNAL(triggered()), this, SLOT(slot_rotateTexts()) );
connect(fullscreen, SIGNAL(triggered()), this, SLOT(toggleFullScreen()) );
connect(configure, SIGNAL(triggered()), qet_app, SLOT(configureQET()) );
connect(windowed_view_mode, SIGNAL(triggered()), this, SLOT(setWindowedMode()) );
@@ -472,6 +476,7 @@
menu_edition -> addSeparator();
menu_edition -> addAction(delete_selection);
menu_edition -> addAction(rotate_selection);
+ menu_edition -> addAction(rotate_texts);
menu_edition -> addAction(selection_prop);
menu_edition -> addSeparator();
menu_edition -> addAction(conductor_reset);
@@ -1056,6 +1061,13 @@
}
/**
+ Effectue l'action "Orienter les textes selectionnes" sur le schema en cours
+*/
+void QETDiagramEditor::slot_rotateTexts() {
+ if (currentDiagram()) currentDiagram() -> rotateTexts();
+}
+
+/**
Effectue l'action "mode selection" sur le schema en cours
*/
void QETDiagramEditor::slot_setSelectionMode() {
@@ -1137,13 +1149,17 @@
int selected_conductors_count = dv ? dv -> diagram() -> selectedConductors().count() : 0;
conductor_reset -> setEnabled(editable_diagram && selected_conductors_count);
- // actions ayant aussi besoin d'elements selectionnes
- bool selected_elements = dv ? (dv -> hasSelectedItems()) : false;
- cut -> setEnabled(editable_diagram && selected_elements);
- copy -> setEnabled(selected_elements);
- delete_selection -> setEnabled(editable_diagram && selected_elements);
- rotate_selection -> setEnabled(editable_diagram && selected_elements && dv -> diagram() -> canRotateSelection());
- selection_prop -> setEnabled(editable_diagram && selected_elements);
+ // actions ayant aussi besoin d'items (elements, conducteurs, textes, ...) selectionnes
+ bool selected_items = dv ? (dv -> hasSelectedItems()) : false;
+ cut -> setEnabled(editable_diagram && selected_items);
+ copy -> setEnabled(selected_items);
+ delete_selection -> setEnabled(editable_diagram && selected_items);
+ rotate_selection -> setEnabled(editable_diagram && selected_items && dv -> diagram() -> canRotateSelection());
+ selection_prop -> setEnabled(editable_diagram && selected_items);
+
+ // actions ayant besoin de textes selectionnes
+ bool selected_texts = dv ? (dv -> diagram() -> selectedTexts().count()) : 0;
+ rotate_texts -> setEnabled(editable_diagram && selected_texts);
}
/**
Modified: branches/0.3/sources/qetdiagrameditor.h
===================================================================
--- branches/0.3/sources/qetdiagrameditor.h 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/qetdiagrameditor.h 2010-02-11 23:35:04 UTC (rev 849)
@@ -104,6 +104,7 @@
void slot_selectInvert();
void slot_delete();
void slot_rotate();
+ void slot_rotateTexts();
void slot_setSelectionMode();
void slot_setVisualisationMode();
void slot_updateActions();
@@ -177,7 +178,8 @@
QAction *select_nothing; ///< Deselectionne tout
QAction *select_invert; ///< Inverse la selection
QAction *delete_selection; ///< Supprime la selection
- QAction *rotate_selection; ///< Pivote les elements selectionnes
+ QAction *rotate_selection; ///< Pivote les elements et textes selectionnes de 90 degres
+ QAction *rotate_texts; ///< Pivote les textes selectionnes selon un angle parametrable
QAction *selection_prop; ///< Lance le dialogue de description ou d'edition de la selection
QAction *conductor_reset; ///< Reinitialise les conducteurs selectionnes
QAction *conductor_default; ///< Lance le dialogue d'edition des conducteurs par defaut
Modified: branches/0.3/sources/qtextorientationspinboxwidget.cpp
===================================================================
--- branches/0.3/sources/qtextorientationspinboxwidget.cpp 2010-02-09 19:29:55 UTC (rev 848)
+++ branches/0.3/sources/qtextorientationspinboxwidget.cpp 2010-02-11 23:35:04 UTC (rev 849)
@@ -103,6 +103,7 @@
QHBoxLayout *main_layout = new QHBoxLayout();
main_layout -> addWidget(orientation_widget_);
main_layout -> addWidget(spin_box_);
+ main_layout -> addStretch();
setLayout(main_layout);
}