SciFigs/GraphicSheet.h
Go to the documentation of this file.
00001 /***************************************************************************
00002 **
00003 **  This file is part of SciFigs.
00004 **
00005 **  This library is free software; you can redistribute it and/or
00006 **  modify it under the terms of the GNU Lesser General Public
00007 **  License as published by the Free Software Foundation; either
00008 **  version 2.1 of the License, or (at your option) any later version.
00009 **
00010 **  This file is distributed in the hope that it will be useful, but WITHOUT
00011 **  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00012 **  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
00013 **  License for more details.
00014 **
00015 **  You should have received a copy of the GNU Lesser General Public
00016 **  License along with this library; if not, write to the Free Software
00017 **  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00018 **
00019 **  See http://www.geopsy.org for more information.
00020 **
00021 **  Created : 2003-02-13
00022 **  Authors :
00023 **    Marc Wathelet
00024 **    Marc Wathelet (ULg, Liège, Belgium)
00025 **    Marc Wathelet (LGIT, Grenoble, France)
00026 **
00027 ***************************************************************************/
00028 
00029 #ifndef GRAPHICSHEET_H
00030 #define GRAPHICSHEET_H
00031 
00032 #include <QtGui>
00033 
00034 #include "SelectionWidget.h"
00035 
00036 namespace SciFigs {
00037 
00038 class GraphicObject;
00039 class SelectionWidget;
00040 class AxisWindow;
00041 class GraphContent;
00042 class TextEdit;
00043 class OrderTip;
00044 class GraphicSheetProperties;
00045 
00046 class SCIFIGS_EXPORT GraphicSheet : public QScrollArea, public PropertyContext, public PropertyItem, public XMLClass
00047 {
00048   Q_OBJECT
00049   // Overload to mark the beginning of properties to save to XML
00050   Q_PROPERTY(QString objectName READ objectName WRITE setObjectName STORED true)
00051   // Kept only to avoid warning on loading old files
00052   Q_PROPERTY(QString name READ dummyPropertyString WRITE setObjectName STORED false)
00053   Q_PROPERTY(QString objectList READ dummyPropertyString WRITE setDummyProperty STORED false)
00054   Q_PROPERTY(QString objectOrder READ dummyPropertyString WRITE setDummyProperty STORED false)
00055   // Use only in scripts
00056   Q_PROPERTY(bool orderIndex READ isOrderIndex WRITE showOrderIndex STORED false SCRIPTABLE true)
00057   Q_PROPERTY(int objectCount READ objectCount STORED false SCRIPTABLE true)
00058   Q_PROPERTY(int transparency READ transparency WRITE setTransparency SCRIPTABLE true)
00059   Q_PROPERTY(bool transparentMask READ transparentMask WRITE setTransparentMask SCRIPTABLE true)
00060   DUMMY_PROPERTIES;
00061 public:
00062   GraphicSheet(QWidget *parent=0);
00063   ~GraphicSheet();
00064 
00065   virtual const QString& xml_tagName() const {return xmlGraphicSheetTag;}
00066   static const QString xmlGraphicSheetTag;
00067 
00068   QString uniqueName(GraphicObject * obj, QString newName);
00069   int objectCount();
00070   void clear(bool force);
00071   QString objectList() const;
00072   void setObjectList(QString list);
00073   void setObjectOrder(QString list);
00074   // Count the palette currently in the sheet
00075   int paletteCount();
00076   bool removeObject(GraphicObject * obj, bool force);
00077   void addObject(GraphicObject * obj);
00078   GraphicObject * findObject(QString tag, QString name);
00079   void showObject(GraphicObject * obj);
00080   void showAllObjects();
00081   // Set status bar where to show messages
00082   void setStatusBar(QStatusBar * s) {_statusBar=s;}
00083   QStatusBar * statusBar() {return _statusBar;}
00084   bool isOrderIndex() const {return _orderIndex >= 0;}
00085   void setOrderIndex(GraphicObject * obj);
00086   // Caluclate max right and bottom coordinate of child graphs and resize content
00087   void autoResizeContent();
00088   double printBottom();
00089   double printRight();
00090   // Find maximum printer resolution in all graphs (!! in dpi !!)
00091   int maximumResolution();
00092   template <typename T> QList<T> selectedObjects() const;
00093   GraphicObject * activeObject(const char * inherits=0);
00094   void print(QPrinter& printer);
00095   Point2D currentOrigin();
00096 
00097   void addFileActions(QMenu * m, QToolBar * tb, bool shortcuts=true);
00098   void addEditActions(QMenu * m, QToolBar * tb, bool shortcuts=true);
00099   void addFormatActions(QMenu * m, bool shortcuts=true);
00100   void addInsertActions(QMenu * m, QToolBar * tb, bool shortcuts=true);
00101   void addMenu(QMenu * m);
00102 
00103   SelectionWidget * addSelection(GraphicObject * obj);
00104 
00105   void addProperties(PropertyProxy * pp);
00106   void removeProperties(PropertyProxy * pp);
00107   virtual void properties(PropertyWidget * w) const;
00108   virtual void setProperty(uint wid, int pid, QVariant val);
00109 
00110   void setTransparency(int val) {_transparency=val;}
00111   void setTransparentMask(bool val);
00112 
00113   int transparency() const {return _transparency;}
00114   bool transparentMask() const {return _transparentMask;}
00115 
00116   virtual QSize minimumSizeHind() const {return QSize(100,100);}
00117 protected:
00118   virtual void mousePressEvent (QMouseEvent * e);
00119   virtual void mouseReleaseEvent (QMouseEvent * e);
00120   void addActions();
00121 private:
00122   SelectionWidget * _currentActiveSelection;
00123   void printSvg(const QString& fileName, int dpi);
00124   void printSize(double& x0, double& y0, double& x1, double& y1,
00125                   double& mx0, double& my0, double& mx1, double& my1);
00126 
00127   bool _transparentMask;
00128   int _transparency;
00129 
00130   int _orderIndex;
00131   // Smartly remember the last loaded file
00132   QString _currentFile;
00133   // Smoother drag engine
00134   Point2D _dragDelta;
00135   QTimer _dragDelay;
00136   /* Pointer to a status bar where to show messages
00137    (allways check if non null before using it!!) */
00138   QStatusBar * _statusBar;
00139   // List of objects added during xml restore
00140   QList<GraphicObject *> _loadedObjects;
00141 
00142   static uint _category, _tabPrint;
00143 signals:
00144   void currentFileChanged(const QString& fileName);
00145   void activeSelectionChanged(GraphicObject * obj);
00146 private slots:
00147   void dragObjects(Point2D delta);
00148   void dragObjectsDelayed();
00149   QList<GraphicObject *> graphicObjects() const;
00150 public slots:
00151   Q_SCRIPTABLE void clear() {clear(false);}
00152   Q_SCRIPTABLE void fileNew();
00153   Q_SCRIPTABLE void fileOpen();
00154   Q_SCRIPTABLE void fileOpen(QString fileName, double dx=0, double dy=0);
00155   Q_SCRIPTABLE void fileSave();
00156   Q_SCRIPTABLE void fileSaveAs();
00157   Q_SCRIPTABLE void fileSave(QString fileName);
00158   Q_SCRIPTABLE void setPreferences ();
00159 
00160   Q_SCRIPTABLE void undo();
00161   Q_SCRIPTABLE void redo();
00162   Q_SCRIPTABLE void cut();
00163   Q_SCRIPTABLE void copy();
00164   Q_SCRIPTABLE void copyImage();
00165   Q_SCRIPTABLE void paste();
00166 
00167   Q_SCRIPTABLE void selectAll();
00168   Q_SCRIPTABLE bool selectAll(QString actionTitle);
00169   Q_SCRIPTABLE void unSelectAll() {selectObjects(0, Qt::NoModifier);}
00170   Q_SCRIPTABLE void selectObjects(GraphicObject * obj, Qt::KeyboardModifiers m=Qt::NoModifier);
00171   Q_SCRIPTABLE void select(GraphicObject * obj) {selectObjects(obj, Qt::NoModifier);}
00172   Q_SCRIPTABLE void addSelect(GraphicObject * obj)  {selectObjects(obj, Qt::ShiftModifier);}
00173   Q_SCRIPTABLE void selectNextChild();
00174   Q_SCRIPTABLE void addSelectNextChild();
00175 
00176   GraphicObject * addObject();
00177   Q_SCRIPTABLE bool removeObject(GraphicObject * obj) {return removeObject (obj, false);}
00178   Q_SCRIPTABLE GraphicObject * object(QString objectName);
00179   Q_SCRIPTABLE GraphicObject * object(int index);
00180 
00181   void moveObject(GraphicObject * obj=0);
00182   void resizeObject();
00183   void startDragging();
00184   Q_SCRIPTABLE void exportFile(QString fileName=QString::null, QString fileFormat=QString::null, int dpi=0);
00185   Q_SCRIPTABLE void exportImage(QString fileName=QString::null, QString imageFormat=QString::null, int dpi=0);
00186   Q_SCRIPTABLE QPixmap image(int dpi=0);
00187   Q_SCRIPTABLE void print(int dpi=0);
00188   Q_SCRIPTABLE void print(bool outputToFile, QString name, int dpi);
00189   void updatePageLimits(QPrinter& p);
00190   Q_SCRIPTABLE void copyMakeUp();
00191   Q_SCRIPTABLE void pasteMakeUp();
00192   Q_SCRIPTABLE void saveMakeUp(QString fileName=QString::null);
00193   Q_SCRIPTABLE void restoreMakeUp(QString fileName=QString::null);
00194   Q_SCRIPTABLE void saveLayers(QString fileName=QString::null);
00195   Q_SCRIPTABLE void addLayers();
00196   virtual Q_SCRIPTABLE void update();
00197   virtual Q_SCRIPTABLE void deepUpdate();
00198   Q_SCRIPTABLE void showOrderIndex(bool isOn);
00199   Q_SCRIPTABLE void alignLeft() {alignX(0.0);}
00200   Q_SCRIPTABLE void alignHCenter() {alignX(0.5);}
00201   Q_SCRIPTABLE void alignRight() {alignX(1.0);}
00202   Q_SCRIPTABLE void alignTop() {alignY(0.0);}
00203   Q_SCRIPTABLE void alignVCenter() {alignY(0.5);}
00204   Q_SCRIPTABLE void alignBottom() {alignY(1.0);}
00205   Q_SCRIPTABLE void alignX(double localPosition);
00206   Q_SCRIPTABLE void alignY(double localPosition);
00207   Q_SCRIPTABLE void raiseSelection();
00208   Q_SCRIPTABLE void lowerSelection();
00209   Q_SCRIPTABLE void showProperties();
00210 protected:
00211   virtual void xml_polish(XML_POLISH_ARGS);
00212   virtual void xml_polishChild(XML_POLISHCHILD_ARGS);
00213   virtual void xml_writeChildren(XML_WRITECHILDREN_ARGS) const;
00214   virtual XMLMember xml_member(XML_MEMBER_ARGS);
00215   virtual bool xml_setProperty(XML_SETPROPERTY_ARGS) {return qobject_setProperty(this, memberID, tag, attributes, content, context);}
00216 };
00217 
00218 template <typename T>
00219 QList<T> GraphicSheet::selectedObjects() const
00220 {
00221   QList<T> wList;
00222   QList<SelectionWidget *> wSelList=findChildren<SelectionWidget *>();
00223   SelectionWidget * wSel;
00224   foreach(wSel, wSelList) {
00225     if(wSel->state()!=SelectionWidget::Hoover) {
00226       GraphicObject * w=wSel->widget();
00227       T castedW=qobject_cast<T>(w);
00228       if(castedW)
00229         wList << castedW;
00230     }
00231   }
00232   return wList;
00233 }
00234 
00235 } // namespace SciFigs
00236 
00237 #endif // GRAPHICSHEET_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines