Subversion Repositories Scribus

Rev

Rev 17092 | Rev 20691 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
3903 cbradney 7
/***************************************************************************
8
        copyright            : (C) 2005 by Craig Bradney
9
        email                : cbradney@zip.com.au
10
***************************************************************************/
11
 
12
/***************************************************************************
13
*                                                                         *
14
*   This program is free software; you can redistribute it and/or modify  *
15
*   it under the terms of the GNU General Public License as published by  *
16
*   the Free Software Foundation; either version 2 of the License, or     *
17
*   (at your option) any later version.                                   *
18
*                                                                         *
19
***************************************************************************/
20
#ifndef SELECTION_H
21
#define SELECTION_H
22
 
9803 fschmid 23
#include <QList>
10223 cbradney 24
#include <QMap>
25
#include <QObject>
26
#include <QPointer>
13801 pierre 27
#include <QRectF>
3903 cbradney 28
 
29
#include "pageitem.h"
3938 cbradney 30
#include "scribusapi.h"
3903 cbradney 31
 
9803 fschmid 32
typedef QList< QPointer<PageItem> > SelectionList;
3903 cbradney 33
 
3937 cbradney 34
class SCRIBUS_API Selection : public QObject
3903 cbradney 35
{
36
        Q_OBJECT
37
        public:
4135 cbradney 38
                /**
4650 subik 39
                 * \brief Create an empty selection that is not a GUI selection
40
                 * @param  parent QObject
4135 cbradney 41
                 */
8266 avox 42
                explicit Selection(QObject* parent);   // otherwise implicit conversion Selection* -> Selection& is possible
4135 cbradney 43
                /**
4650 subik 44
                 * \brief Create an empty selection that may be a GUI selection
45
                 * @param  parent QObject
46
                 * @param  guiSelection If the selection is to be a GUI selection
4135 cbradney 47
                 */
4650 subik 48
                Selection(QObject* parent, bool guiSelection);
4135 cbradney 49
                /**
4650 subik 50
                 * \brief Copy a selection
51
                 * \note We are leaving the connections of the items in place
4135 cbradney 52
                 * and the isGUISelection set in the copy. We cannot disconnect them
53
                 * as they may be connected via the main GUI selection.
4650 subik 54
                 * @param  other selection
4135 cbradney 55
                 */
4650 subik 56
                Selection(const Selection& other);
4147 cbradney 57
                Selection& operator=( const Selection & );
3903 cbradney 58
                ~Selection();
8735 cbradney 59
 
60
                /**
61
                 * \brief Copy the selection of items from one selection to another
62
                 */
11729 jghali 63
                void copy(Selection& other, bool emptyOther);
3903 cbradney 64
 
4133 cbradney 65
                bool connectItemToGUI();
3903 cbradney 66
                /**
4650 subik 67
                 * \brief Disconnect all items from the GUI slots.
3903 cbradney 68
                 * This should not really be necessary if all things are going ok
69
                 * except for within the clearAll function.
4650 subik 70
                 * @return bool true on success
3903 cbradney 71
                 */
72
                bool disconnectAllItemsFromGUI();
3936 cbradney 73
                /**
74
                 * @brief Add an item to the selection.
4135 cbradney 75
                 * If its added to a GUI selection selection and its item 0, its connected to the GUI too
3936 cbradney 76
                 * @param item Item to add
4280 cbradney 77
                 * @param ignoreGUI Dont connect Item To GUI even if this is a GUI selection
3936 cbradney 78
                 * @return If the item was added
79
                 */
4280 cbradney 80
                bool addItem(PageItem *item, bool ignoreGUI=false);
3936 cbradney 81
                /**
82
                 * @brief Prepend an item to the selection.
4135 cbradney 83
                 * If its added to a GUI selection selection and its item 0, its connected to the GUI too
3936 cbradney 84
                 * @param item Item to add
4650 subik 85
                 * @param doEmit call emitAllToGUI()
3936 cbradney 86
                 * @return If the item was added
87
                 */
4632 cbradney 88
                bool prependItem(PageItem *item, bool doEmit=true);
10978 avox 89
 
90
                bool containsItem(PageItem *item) const { return m_SelList.contains(item); }
3936 cbradney 91
                /**
4650 subik 92
                 * \brief Unused
3936 cbradney 93
                 */
3903 cbradney 94
                bool addGroup();
3936 cbradney 95
                /**
4650 subik 96
                 * \brief Remove an item from list
97
                 * @param item page item
3936 cbradney 98
                 */
4133 cbradney 99
                bool removeItem(PageItem *item);
3936 cbradney 100
                /**
4650 subik 101
                 * \brief Remove the first item from the list
3936 cbradney 102
                 * @return If the remove was successful
103
                 */
4133 cbradney 104
                bool removeFirst();
3936 cbradney 105
                /**
4650 subik 106
                 * \brief Unused
3936 cbradney 107
                 */
3903 cbradney 108
                bool removeGroup();
3936 cbradney 109
                /**
4650 subik 110
                 * \brief Remove an item from list listNumber and return a pointer to it
3936 cbradney 111
                 * @param itemIndex Index of the item in the list
112
                 * @return Item
113
                 */
8613 cbradney 114
                PageItem* takeItem(int itemIndex);
3936 cbradney 115
                /**
4650 subik 116
                 * \brief Find an item from the selection and return an index to it
3936 cbradney 117
                 * @param item Item pointer to find in the list
118
                 * @return Item
119
                 */
10394 cbradney 120
                int findItem(PageItem *item) const { return m_SelList.indexOf(item); }
3936 cbradney 121
                /**
4650 subik 122
                 * \brief Return the count of the selection
3936 cbradney 123
                 */
10390 cbradney 124
                int count() const { return m_SelList.count(); }
3936 cbradney 125
                /**
4650 subik 126
                 * \brief Check if the selection is empty.
3936 cbradney 127
                 */
4135 cbradney 128
                bool isEmpty() const { return m_SelList.count()==0; }
3936 cbradney 129
                /**
4650 subik 130
                 * \brief Clear a list
3936 cbradney 131
                 */
4133 cbradney 132
                bool clear();
3903 cbradney 133
                /**
4650 subik 134
                 * \brief See if the first selected item is "me", usually called from an item object with "this".
135
                 * @param item PageItem reference
3903 cbradney 136
                 */
4134 cbradney 137
                bool primarySelectionIs(const PageItem* item) const { return (!m_SelList.isEmpty() && (item==m_SelList.first())); }
13801 pierre 138
                const SelectionList& selectionList() const {return m_SelList;}
8266 avox 139
                PageItem *itemAt(int index=0) { return itemAt_(index); }
140
                const PageItem *itemAt(int index=0) const { return const_cast<Selection*>(this)->itemAt_(index); }
18357 jghali 141
                QList<PageItem*> items() const;
8266 avox 142
                QStringList getSelectedItemsByName() const;
16546 jghali 143
                bool isMultipleSelection() const { return (m_SelList.count() > 1); }
4133 cbradney 144
                bool isGUISelection() const { return m_isGUISelection; }
8266 avox 145
                double width() const;
146
                double height() const;
7575 cbradney 147
                //set the group rectangle properties
148
                void setGroupRect();
149
                void getGroupRect(double *x, double *y, double *w, double *h);
13801 pierre 150
                QRectF getGroupRect();
12463 pierre 151
                void getVisualGroupRect(double *x, double *y, double *w, double *h);
13801 pierre 152
                QRectF getVisualGroupRect();
7686 cbradney 153
                //!\brief Test to see if all items in the selection are the same typedef
8266 avox 154
                bool itemsAreSameType() const;
11729 jghali 155
 
14296 jghali 156
                /**
157
                 * \brief get the layer ID of items in the selection
158
                 * @return the layer ID or -1 if items do not belong to the same layer
159
                 */
160
                int objectsLayer(void) const;
161
 
17092 jghali 162
                /**
163
                 * \brief detect if selected object have all same parent (doc or group)
164
                 * @return true if objects share same parent, false otherwise
165
                 */
166
                bool objectsHaveSameParent(void) const;
167
 
11729 jghali 168
                bool signalsDelayed(void);
169
                void delaySignalsOn(void);
170
                void delaySignalsOff(void);
3903 cbradney 171
 
172
        protected:
8266 avox 173
                PageItem *itemAt_(int index=0);
4133 cbradney 174
                SelectionList m_SelList;
175
                bool m_isGUISelection;
7575 cbradney 176
                double groupX;
177
                double groupY;
178
                double groupW;
179
                double groupH;
12463 pierre 180
 
181
                double visualGX;
182
                double visualGY;
183
                double visualGW;
184
                double visualGH;
7575 cbradney 185
 
11729 jghali 186
                int  m_delaySignals;
187
                bool m_sigSelectionChanged;
188
                bool m_sigSelectionIsMultiple;
189
 
12125 jghali 190
                void sendSignals(bool guiConnect = true);
4049 cbradney 191
 
192
        signals:
4130 cbradney 193
                void selectionIsMultiple(bool);
4738 cbradney 194
                void empty();
5859 tsoots 195
                void selectionChanged();
3903 cbradney 196
};
197
 
198
#endif