Files
qelectrotech-source-mirror/sources/editor/qetelementeditor.h
xavier 04222b3f89 Optimisation de l'editeur d'element.
L'organisation interne de l'editeur d'element a ete completement revue.
Auparavant, chaque primitive instanciait son propre widget d'edition et le
gardait durant toute sa duree de vie, entrainant ainsi une consommation memoire
et un temps de chargement importants.
Desormais, l'editeur instancie des son demarrage 9 widgets d'edition qu'il
conserve durant toute sa duree de vie. Il choisit alors lequel afficher en
fonction des primitives selectionnees.


git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@855 bfdf4180-ca20-0410-9c96-a3a8aa849046
2010-02-18 00:17:34 +00:00

260 lines
7.5 KiB
C++

/*
Copyright 2006-2010 Xavier Guerrin
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CUSTOM_ELEMENT_EDITOR_H
#define CUSTOM_ELEMENT_EDITOR_H
#include <QtGui>
#include "qet.h"
#include "elementscene.h"
#include "orientationset.h"
#include "elementslocation.h"
class ElementItemEditor;
class ElementView;
/**
Cette classe represente un editeur d'element. Elle permet a l'utilisateur
de dessiner, modifier et parametrer un element electrique. Le dessin se
fait par ajout de parties (Part).
*/
class QETElementEditor : public QMainWindow {
Q_OBJECT
// constructeur, destructeur
public:
QETElementEditor(QWidget * = 0);
virtual ~QETElementEditor();
private:
QETElementEditor(const QETElementEditor &);
// attributs
private:
/// booleen indiquant si l'editeur est en mode "lecture seule" ou non
bool read_only;
/// menus
QMenu *file_menu, *edit_menu, *paste_from_menu, *display_menu, *tools_menu, *config_menu, *help_menu;
/// vue sur la scene d'edition
ElementView *ce_view;
/// scene d'edition
ElementScene *ce_scene;
/// container pour les widgets d'edition des parties
QDockWidget *tools_dock;
/// Pile de widgets pour tools_dock
QStackedWidget *tools_dock_stack_;
/// label affiche lors de la selection de plusieurs elements
QLabel *default_informations;
/// Hash permettant d'acceder aux widgets d'editions disponibles
QHash<QString, ElementItemEditor *> editors_;
/// ScrollArea pour le DockWidget affichant des infos sur la partie selectionnee
QScrollArea *tools_dock_scroll_area_;
/// container pour la liste des annulations
QDockWidget *undo_dock;
/// Container pour la liste des parties
QDockWidget *parts_dock;
/// Liste des parties
QListWidget *parts_list;
/// actions du menu fichier
QAction *new_element, *open, *open_file, *save, *save_as, *save_as_file, *reload, *quit;
/// actions du menu edition
QAction *selectall, *deselectall, *inv_select;
QAction *cut, *copy, *paste, *paste_in_area, *paste_from_file, *paste_from_elmt;
QAction *undo, *redo;
QAction *edit_delete, *edit_size_hs, *edit_names, *edit_ori, *edit_author;
QAction *edit_raise, *edit_lower, *edit_backward, *edit_forward;
/// actions du menu affichage
QAction *zoom_in, *zoom_out, *zoom_fit, *zoom_reset;
/// actions du menu configurer
QAction *fullscreen; ///< Passe en mode plein ecran ou en sort
QAction *configure; ///< Lance le dialogue de configuration de QElectroTech
/// actions du menu aide
QAction *about_qet; ///< Lance le dialogue "A propos de QElectroTech"
QAction *about_qt; ///< Lance le dialogue "A propos de Qt"
/// barres d'outils
QToolBar *parts_toolbar, *main_toolbar, *view_toolbar, *depth_toolbar, *element_toolbar;
/// actions de la barre d'outils
QActionGroup *parts;
QAction *move, *add_line, *add_circle, *add_rectangle, *add_ellipse, *add_polygon, *add_text;
QAction *add_arc, *add_terminal, *add_textfield;
/// titre minimal
QString min_title;
/// Nom de fichier de l'element edite
QString filename_;
/// Emplacement de l'element edite
ElementsLocation location_;
/// booleen indiquant si l'element en cours d'edition provient d'un fichier ou d'un emplacement
bool opened_from_file;
// methodes
public:
void setSize(const QSize &);
QSize size() const;
void setHotspot(const QPoint &);
QPoint hotspot() const;
void setNames(const NamesList &);
void setOrientations(const OrientationSet &orientation_set);
OrientationSet orientations() const;
void setLocation(const ElementsLocation &);
ElementsLocation location() const;
void setFileName(const QString &);
QString fileName() const;
void setReadOnly(bool);
bool isReadOnly() const;
void fromFile(const QString &);
void fromLocation(const ElementsLocation &);
bool toFile(const QString &);
bool toLocation(const ElementsLocation &);
ElementScene *elementScene() const;
void readSettings();
void writeSettings();
static QPointF pasteOffset();
static QET::OrientedMovement pasteMovement();
static QString getOpenElementFileName(QWidget * = 0, const QString & = QString());
protected:
void closeEvent(QCloseEvent *);
virtual bool event(QEvent *);
private:
void setupActions();
void setupMenus();
void setupInterface();
bool canClose();
QWidget *clearToolsDock();
void copyAndPasteXml(const QDomDocument &);
public slots:
void slot_new();
void slot_open();
void slot_openFile();
void openRecentFile(const QString &);
void openElement(const QString &);
void slot_reload();
bool slot_save();
bool slot_saveAs();
bool slot_saveAsFile();
void slot_setRubberBandToView();
void slot_setNoDragToView();
void slot_setNormalMode();
void slot_updateInformations();
void slot_updateMenus();
void slot_updateFullScreenAction();
void slot_updateTitle();
void slot_createPartsList();
void slot_updatePartsList();
void slot_updateSelectionFromPartsList();
void toggleFullScreen();
void xmlPreview();
bool checkElement();
void pasteFromFile();
void pasteFromElement();
void updateCurrentPartEditor();
};
/**
@param siz La nouvelle taille de l'element edite
*/
inline void QETElementEditor::setSize(const QSize &siz) {
ce_scene -> setWidth(siz.width());
ce_scene -> setHeight(siz.height());
}
/**
@return la taille de l'element edite
*/
inline QSize QETElementEditor::size() const {
return(
QSize(
ce_scene -> width(),
ce_scene -> height()
)
);
}
/**
@param hs Le nouveau point de saisie de l'element edite
*/
inline void QETElementEditor::setHotspot(const QPoint &hs) {
ce_scene -> setHotspot(hs);
}
/**
@return le point de saisie de l'element edite
*/
inline QPoint QETElementEditor::hotspot() const {
return(ce_scene -> hotspot());
}
/**
@param nameslist le nouvel ensemble de noms de l'element edite
*/
inline void QETElementEditor::setNames(const NamesList &nameslist) {
ce_scene -> setNames(nameslist);
}
/**
@param orientation_set le nouvel ensemble d'orientations de l'element edite
*/
inline void QETElementEditor::setOrientations(const OrientationSet &orientation_set) {
ce_scene -> setOrientations(orientation_set);
}
/**
@return le nouvel ensemble d'orientations de l'element edite
*/
inline OrientationSet QETElementEditor::orientations() const {
return(ce_scene -> orientations());
}
/**
@param el Le nouvel emplacement de l'element edite
*/
inline void QETElementEditor::setLocation(const ElementsLocation &el) {
location_ = el;
opened_from_file = false;
slot_updateTitle();
}
/**
@return l'emplacement de l'element edite
*/
inline ElementsLocation QETElementEditor::location() const {
return(location_);
}
/**
@param fn Le nouveau nom de fichier de l'element edite
*/
inline void QETElementEditor::setFileName(const QString &fn) {
filename_ = fn;
opened_from_file = true;
slot_updateTitle();
}
/**
@return le nom de fichier de l'element edite
*/
inline QString QETElementEditor::fileName() const {
return(filename_);
}
/**
@return la scene d'edition de l'element
*/
inline ElementScene *QETElementEditor::elementScene() const {
return(ce_scene);
}
#endif