~ubuntu-branches/ubuntu/trusty/scribus/trusty

« back to all changes in this revision

Viewing changes to scribus/plugins/tools/pathfinder/pathfinder.cpp

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2013-05-16 20:34:07 UTC
  • mfrom: (1.1.13) (32.1.2 saucy-proposed)
  • Revision ID: package-import@ubuntu.com-20130516203407-ztj7ebsivoo41dih
Tags: 1.4.2.dfsg+r18267-1ubuntu2
Avoid qreal/double type clashes on ARM.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
*   You should have received a copy of the GNU General Public License      *
22
22
*   along with this program; if not, write to the                          *
23
23
*   Free Software Foundation, Inc.,                                        *
24
 
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.              *
 
24
*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.              *
25
25
****************************************************************************/
26
26
 
27
27
#include <QMessageBox>
32
32
#include "propertiespalette.h"
33
33
#include "scribuscore.h"
34
34
#include "sccolorengine.h"
 
35
#include "undomanager.h"
 
36
#include "undostate.h"
35
37
#include "util_color.h"
36
38
#include "util_math.h"
37
39
#include "util_icon.h"
117
119
 
118
120
bool PathFinderPlugin::run(ScribusDoc* doc, QString)
119
121
{
120
 
        QString vers = QString(qVersion()).left(5);
121
 
        if (vers < "4.3.3")
122
 
        {
123
 
                QMessageBox::information(doc->scMW(), tr("Qt Version too old"), tr("This plugin requires at least version 4.3.3 of the Qt library"));
124
 
                return true;
125
 
        }
126
122
        ScribusDoc* currDoc = doc;
127
123
        if (currDoc == 0)
128
124
                currDoc = ScCore->primaryMainWindow()->doc;
129
 
        if (currDoc->m_Selection->count() > 1)
 
125
        if (currDoc->m_Selection->count() <= 1)
 
126
                return true;
 
127
 
 
128
        //<<#9046
 
129
        UndoTransaction* activeTransaction = NULL;
 
130
        UndoManager* undoManager = UndoManager::instance();
 
131
        if (UndoManager::undoEnabled())
 
132
                activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IDocument, Um::PathOperation, "", Um::IPolygon));
 
133
        //>>#9046
 
134
 
 
135
        PageItem *Item1 = currDoc->m_Selection->itemAt(0);
 
136
        PageItem *Item2 = currDoc->m_Selection->itemAt(1);
 
137
        PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2);
 
138
        if (dia->exec())
130
139
        {
131
 
                PageItem *Item1 = currDoc->m_Selection->itemAt(0);
132
 
                PageItem *Item2 = currDoc->m_Selection->itemAt(1);
133
 
                PathFinderDialog *dia = new PathFinderDialog(currDoc->scMW(), currDoc, Item1, Item2);
134
 
                if (dia->exec())
135
 
                {
136
 
                        if (dia->keepItem1)
137
 
                        {
138
 
                                PageItem *newItem;
139
 
                                if (dia->swapped)
140
 
                                {
141
 
                                        newItem = new PageItem_Polygon(*Item2);
142
 
                                        newItem->setSelected(false);
143
 
                                        currDoc->Items->insert(Item2->ItemNr, newItem);
144
 
                                }
145
 
                                else
146
 
                                {
147
 
                                        newItem = new PageItem_Polygon(*Item1);
148
 
                                        newItem->setSelected(false);
149
 
                                        currDoc->Items->insert(Item1->ItemNr, newItem);
150
 
                                }
151
 
                        }
152
 
                        if (dia->keepItem2)
153
 
                        {
154
 
                                PageItem *newItem;
155
 
                                if (dia->swapped)
156
 
                                {
157
 
                                        newItem = new PageItem_Polygon(*Item1);
158
 
                                        newItem->setSelected(false);
159
 
                                        currDoc->Items->insert(Item1->ItemNr, newItem);
160
 
                                }
161
 
                                else
162
 
                                {
163
 
                                        newItem = new PageItem_Polygon(*Item2);
164
 
                                        newItem->setSelected(false);
165
 
                                        currDoc->Items->insert(Item2->ItemNr, newItem);
166
 
                                }
167
 
                        }
168
 
                        if (dia->keepItem1 || dia->keepItem2)
169
 
                                currDoc->renumberItemsInListOrder();
170
 
                        if (dia->opMode != 4)
171
 
                        {
172
 
                                PageItem *currItem;
173
 
                                QPainterPath path;
174
 
                                FPointArray points;
 
140
                int opMode=dia->opMode;
 
141
                if (dia->keepItem1)
 
142
                {
 
143
                        PageItem *newItem;
 
144
                        if (dia->swapped)
 
145
                        {
 
146
                                newItem = new PageItem_Polygon(*Item2);
 
147
                                newItem->setSelected(false);
 
148
                                currDoc->Items->insert(Item2->ItemNr, newItem);
 
149
                        }
 
150
                        else
 
151
                        {
 
152
                                newItem = new PageItem_Polygon(*Item1);
 
153
                                newItem->setSelected(false);
 
154
                                currDoc->Items->insert(Item1->ItemNr, newItem);
 
155
                        }
 
156
                        if (UndoManager::undoEnabled())
 
157
                        {
 
158
                                ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
 
159
                                is->set("CREATE_ITEM", "create_item");
 
160
                                is->setItem(newItem);
 
161
                                UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
 
162
                                undoManager->action(target, is);
 
163
                        }
 
164
                }
 
165
                if (dia->keepItem2)
 
166
                {
 
167
                        PageItem *newItem;
 
168
                        if (dia->swapped)
 
169
                        {
 
170
                                newItem = new PageItem_Polygon(*Item1);
 
171
                                newItem->setSelected(false);
 
172
                                currDoc->Items->insert(Item1->ItemNr, newItem);
 
173
                        }
 
174
                        else
 
175
                        {
 
176
                                newItem = new PageItem_Polygon(*Item2);
 
177
                                newItem->setSelected(false);
 
178
                                currDoc->Items->insert(Item2->ItemNr, newItem);
 
179
                        }
 
180
                        if (UndoManager::undoEnabled())
 
181
                        {
 
182
                                ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
 
183
                                is->set("CREATE_ITEM", "create_item");
 
184
                                is->setItem(newItem);
 
185
                                UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
 
186
                                undoManager->action(target, is);
 
187
                        }
 
188
                }
 
189
                if (dia->keepItem1 || dia->keepItem2)
 
190
                        currDoc->renumberItemsInListOrder();
 
191
                if (opMode != 4)
 
192
                {
 
193
                        PageItem *currItem;
 
194
                        QPainterPath path;
 
195
                        FPointArray points;
 
196
                        if (dia->targetColor == 0)
 
197
                        {
 
198
                                currItem = Item1;
 
199
                                if (dia->swapped)
 
200
                                {
 
201
                                        currItem = Item2;
 
202
                                        currItem->setXYPos(Item1->xPos(), Item1->yPos());
 
203
                                        currItem->setRotation(0.0);
 
204
                                }
 
205
                        }
 
206
                        else
 
207
                        {
 
208
                                if (dia->swapped)
 
209
                                        currItem = Item1;
 
210
                                else
 
211
                                {
 
212
                                        currItem = Item2;
 
213
                                        currItem->setXYPos(Item1->xPos(), Item1->yPos());
 
214
                                        currItem->setRotation(0.0);
 
215
                                }
 
216
                        }
 
217
                        path = dia->result;
 
218
                        points.fromQPainterPath(path);
 
219
 
 
220
                        //<<#9046
 
221
                        FPointArray oldPOLine=currItem->PoLine;
 
222
                        FPointArray oldContourLine=currItem->ContourLine;
 
223
                        ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
 
224
                        if (UndoManager::undoEnabled())
 
225
                        {
 
226
                                state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
 
227
                                state->set("PATH_OPERATION", "path_operation");
 
228
                                state->set("PATH_OP_OLD_FRAME", currItem->Frame);
 
229
                                state->set("PATH_OP_OLD_CLIPEDITED", currItem->ClipEdited);
 
230
                                state->set("PATH_OP_OLD_FRAMETYPE", currItem->FrameType);
 
231
                                state->set("PATH_OP_OLD_OLDB2", currItem->OldB2);
 
232
                                state->set("PATH_OP_OLD_OLDH2", currItem->OldH2);
 
233
                                state->set("PATH_OP_NEW_FRAME", false);
 
234
                                state->set("PATH_OP_NEW_CLIPEDITED", true);
 
235
                                state->set("PATH_OP_NEW_FRAMETYPE", 3);
 
236
                        }
 
237
                        //>>#9046
 
238
 
 
239
                        currItem->PoLine = points;
 
240
                        currItem->Frame = false;
 
241
                        currItem->ClipEdited = true;
 
242
                        currItem->FrameType = 3;
 
243
                        currDoc->AdjustItemSize(currItem);
 
244
                        currItem->OldB2 = currItem->width();
 
245
                        currItem->OldH2 = currItem->height();
 
246
                        currItem->updateClip();
 
247
                        currItem->ContourLine = currItem->PoLine.copy();
 
248
 
 
249
                        //<<#9046
 
250
                        if (UndoManager::undoEnabled())
 
251
                        {
 
252
                                state->set("PATH_OP_NEW_OLDB2", currItem->OldB2);
 
253
                                state->set("PATH_OP_NEW_OLDH2", currItem->OldH2);
 
254
                                state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(points, currItem->ContourLine)));
 
255
                                undoManager->action(currItem, state);
 
256
                        }
 
257
                        //>>#9046
 
258
 
 
259
                        currDoc->m_Selection->removeItem(currItem);
 
260
                        currDoc->itemSelection_DeleteItem();
 
261
 
 
262
                }
 
263
                else
 
264
                {
 
265
                        QPainterPath path;
 
266
                        FPointArray points;
 
267
                        PageItem *newItem;
 
268
                        double i1x = Item1->xPos();
 
269
                        double i1y = Item1->yPos();
 
270
                        path = dia->result;
 
271
                        if (!path.isEmpty())
 
272
                        {
 
273
                                points.fromQPainterPath(path);
 
274
                                //<<#9046
 
275
                                FPointArray oldPOLine=Item1->PoLine;
 
276
                                FPointArray oldContourLine=Item1->ContourLine;
 
277
                                ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
 
278
                                if (UndoManager::undoEnabled())
 
279
                                {
 
280
                                        state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
 
281
                                        state->set("PATH_OPERATION", "path_operation");
 
282
                                        state->set("PATH_OP_OLD_FRAME", Item1->Frame);
 
283
                                        state->set("PATH_OP_OLD_CLIPEDITED", Item1->ClipEdited);
 
284
                                        state->set("PATH_OP_OLD_FRAMETYPE", Item1->FrameType);
 
285
                                        state->set("PATH_OP_OLD_OLDB2", Item1->OldB2);
 
286
                                        state->set("PATH_OP_OLD_OLDH2", Item1->OldH2);
 
287
                                        state->set("PATH_OP_NEW_FRAME", false);
 
288
                                        state->set("PATH_OP_NEW_CLIPEDITED", true);
 
289
                                        state->set("PATH_OP_NEW_FRAMETYPE", 3);
 
290
                                }
 
291
                                //>>#9046
 
292
                                Item1->PoLine = points;
 
293
                                Item1->Frame = false;
 
294
                                Item1->ClipEdited = true;
 
295
                                Item1->FrameType = 3;
 
296
                                currDoc->AdjustItemSize(Item1);
 
297
                                Item1->OldB2 = Item1->width();
 
298
                                Item1->OldH2 = Item1->height();
 
299
                                Item1->updateClip();
 
300
                                Item1->ContourLine = Item1->PoLine.copy();
 
301
                                //<<#9046
 
302
                                if (UndoManager::undoEnabled())
 
303
                                {
 
304
                                        state->set("PATH_OP_NEW_OLDB2", Item1->OldB2);
 
305
                                        state->set("PATH_OP_NEW_OLDH2", Item1->OldH2);
 
306
                                        state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item1->PoLine, Item1->ContourLine)));
 
307
                                        undoManager->action(Item1, state);
 
308
                                }
 
309
                                //>>#9046
 
310
                        }
 
311
 
 
312
                        path = QPainterPath();
 
313
                        path = dia->result1;
 
314
                        if (!path.isEmpty())
 
315
                        {
 
316
                                points.fromQPainterPath(path);
 
317
                                //<<#9046
 
318
                                FPointArray oldPOLine=Item2->PoLine;
 
319
                                FPointArray oldContourLine=Item2->ContourLine;
 
320
                                ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >* state = NULL;
 
321
                                if (UndoManager::undoEnabled())
 
322
                                {
 
323
                                        state = new ItemState<QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> > >(Um::PathOperation);
 
324
                                        state->set("PATH_OPERATION", "path_operation");
 
325
                                        state->set("PATH_OP_OLD_FRAME", Item2->Frame);
 
326
                                        state->set("PATH_OP_OLD_CLIPEDITED", Item2->ClipEdited);
 
327
                                        state->set("PATH_OP_OLD_FRAMETYPE", Item2->FrameType);
 
328
                                        state->set("PATH_OP_OLD_OLDB2", Item2->OldB2);
 
329
                                        state->set("PATH_OP_OLD_OLDH2", Item2->OldH2);
 
330
                                        state->set("PATH_OP_NEW_FRAME", false);
 
331
                                        state->set("PATH_OP_NEW_CLIPEDITED", true);
 
332
                                        state->set("PATH_OP_NEW_FRAMETYPE", 3);
 
333
                                }
 
334
                                //>>#9046
 
335
                                Item2->setXYPos(i1x, i1y);
 
336
                                Item2->setRotation(0.0);
 
337
                                Item2->PoLine = points;
 
338
                                Item2->Frame = false;
 
339
                                Item2->ClipEdited = true;
 
340
                                Item2->FrameType = 3;
 
341
                                currDoc->AdjustItemSize(Item2);
 
342
                                Item2->OldB2 = Item2->width();
 
343
                                Item2->OldH2 = Item2->height();
 
344
                                Item2->updateClip();
 
345
                                Item2->ContourLine = Item2->PoLine.copy();
 
346
                                //<<#9046
 
347
                                if (UndoManager::undoEnabled())
 
348
                                {
 
349
                                        state->set("PATH_OP_NEW_OLDB2", Item2->OldB2);
 
350
                                        state->set("PATH_OP_NEW_OLDH2", Item2->OldH2);
 
351
                                        state->setItem(QPair<QPair<FPointArray, FPointArray>, QPair<FPointArray, FPointArray> >(QPair<FPointArray, FPointArray>(oldPOLine, oldContourLine), QPair<FPointArray, FPointArray>(Item2->PoLine, Item2->ContourLine)));
 
352
                                        undoManager->action(Item2, state);
 
353
                                }
 
354
                                //>>#9046
 
355
                        }
 
356
 
 
357
                        path = QPainterPath();
 
358
                        path = dia->result2;
 
359
                        if (!path.isEmpty())
 
360
                        {
175
361
                                if (dia->targetColor == 0)
176
362
                                {
177
 
                                        currItem = Item1;
178
 
                                        if (dia->swapped)
179
 
                                        {
180
 
                                                currItem = Item2;
181
 
                                                currItem->setXYPos(Item1->xPos(), Item1->yPos());
182
 
                                                currItem->setRotation(0.0);
183
 
                                        }
 
363
                                        newItem = new PageItem_Polygon(*Item1);
 
364
                                        newItem->setXYPos(i1x, i1y);
184
365
                                }
185
366
                                else
186
367
                                {
187
 
                                        if (dia->swapped)
188
 
                                                currItem = Item1;
189
 
                                        else
190
 
                                        {
191
 
                                                currItem = Item2;
192
 
                                                currItem->setXYPos(Item1->xPos(), Item1->yPos());
193
 
                                                currItem->setRotation(0.0);
194
 
                                        }
 
368
                                        newItem = new PageItem_Polygon(*Item2);
 
369
                                        newItem->setXYPos(i1x, i1y);
 
370
                                        newItem->setRotation(0.0);
195
371
                                }
196
 
                                path = dia->result;
 
372
                                currDoc->Items->append(newItem);
 
373
                                newItem->ItemNr = currDoc->Items->count()-1;
 
374
                                newItem->setSelected(false);
197
375
                                points.fromQPainterPath(path);
198
 
                                currItem->PoLine = points;
199
 
                                currItem->Frame = false;
200
 
                                currItem->ClipEdited = true;
201
 
                                currItem->FrameType = 3;
202
 
                                currDoc->AdjustItemSize(currItem);
203
 
                                currItem->OldB2 = currItem->width();
204
 
                                currItem->OldH2 = currItem->height();
205
 
                                currItem->updateClip();
206
 
                                currItem->ContourLine = currItem->PoLine.copy();
207
 
                                currDoc->m_Selection->removeItem(currItem);
208
 
                                currDoc->itemSelection_DeleteItem();
 
376
                                newItem->PoLine = points;
 
377
                                newItem->Frame = false;
 
378
                                newItem->ClipEdited = true;
 
379
                                newItem->FrameType = 3;
 
380
                                currDoc->AdjustItemSize(newItem);
 
381
                                newItem->OldB2 = newItem->width();
 
382
                                newItem->OldH2 = newItem->height();
 
383
                                newItem->updateClip();
 
384
                                newItem->ContourLine = newItem->PoLine.copy();
 
385
                                if (dia->targetColor == 2)
 
386
                                {
 
387
                                        QString fill = dia->getOtherFillColor();
 
388
                                        if (fill == CommonStrings::tr_NoneColor)
 
389
                                                fill = CommonStrings::None;
 
390
                                        newItem->setFillColor(fill);
 
391
                                        QString stroke = dia->getOtherLineColor();
 
392
                                        if (stroke == CommonStrings::tr_NoneColor)
 
393
                                                stroke = CommonStrings::None;
 
394
                                        newItem->setLineColor(stroke);
 
395
                                }
 
396
                                if (UndoManager::undoEnabled())
 
397
                                {
 
398
                                        ItemState<PageItem*> *is = new ItemState<PageItem*>("Create PageItem");
 
399
                                        is->set("CREATE_ITEM", "create_item");
 
400
                                        is->setItem(newItem);
 
401
                                        UndoObject *target = currDoc->Pages->at(Item1->OwnPage);
 
402
                                        undoManager->action(target, is);
 
403
                                }
209
404
                        }
210
 
                        else
211
 
                        {
212
 
                                QPainterPath path;
213
 
                                FPointArray points;
214
 
                                PageItem *newItem;
215
 
                                double i1x = Item1->xPos();
216
 
                                double i1y = Item1->yPos();
217
 
                                path = dia->result;
218
 
                                if (!path.isEmpty())
219
 
                                {
220
 
                                        points.fromQPainterPath(path);
221
 
                                        Item1->PoLine = points;
222
 
                                        Item1->Frame = false;
223
 
                                        Item1->ClipEdited = true;
224
 
                                        Item1->FrameType = 3;
225
 
                                        currDoc->AdjustItemSize(Item1);
226
 
                                        Item1->OldB2 = Item1->width();
227
 
                                        Item1->OldH2 = Item1->height();
228
 
                                        Item1->updateClip();
229
 
                                        Item1->ContourLine = Item1->PoLine.copy();
230
 
                                }
 
405
                        currDoc->m_Selection->clear();
 
406
                        currDoc->view()->Deselect(true);
 
407
                }
 
408
                currDoc->changed();
 
409
                currDoc->view()->DrawNew();
 
410
        }
 
411
        delete dia;
231
412
 
232
 
                                path = QPainterPath();
233
 
                                path = dia->result1;
234
 
                                if (!path.isEmpty())
235
 
                                {
236
 
                                        points.fromQPainterPath(path);
237
 
                                        Item2->setXYPos(i1x, i1y);
238
 
                                        Item2->setRotation(0.0);
239
 
                                        Item2->PoLine = points;
240
 
                                        Item2->Frame = false;
241
 
                                        Item2->ClipEdited = true;
242
 
                                        Item2->FrameType = 3;
243
 
                                        currDoc->AdjustItemSize(Item2);
244
 
                                        Item2->OldB2 = Item2->width();
245
 
                                        Item2->OldH2 = Item2->height();
246
 
                                        Item2->updateClip();
247
 
                                        Item2->ContourLine = Item2->PoLine.copy();
248
 
                                }
249
 
                                
250
 
                                path = QPainterPath();
251
 
                                path = dia->result2;
252
 
                                if (!path.isEmpty())
253
 
                                {
254
 
                                        if (dia->targetColor == 0)
255
 
                                        {
256
 
                                                newItem = new PageItem_Polygon(*Item1);
257
 
                                                newItem->setXYPos(i1x, i1y);
258
 
                                        }
259
 
                                        else
260
 
                                        {
261
 
                                                newItem = new PageItem_Polygon(*Item2);
262
 
                                                newItem->setXYPos(i1x, i1y);
263
 
                                                newItem->setRotation(0.0);
264
 
                                        }
265
 
                                        currDoc->Items->append(newItem);
266
 
                                        newItem->ItemNr = currDoc->Items->count()-1;
267
 
                                        newItem->setSelected(false);
268
 
                                        points.fromQPainterPath(path);
269
 
                                        newItem->PoLine = points;
270
 
                                        newItem->Frame = false;
271
 
                                        newItem->ClipEdited = true;
272
 
                                        newItem->FrameType = 3;
273
 
                                        currDoc->AdjustItemSize(newItem);
274
 
                                        newItem->OldB2 = newItem->width();
275
 
                                        newItem->OldH2 = newItem->height();
276
 
                                        newItem->updateClip();
277
 
                                        newItem->ContourLine = newItem->PoLine.copy();
278
 
                                        if (dia->targetColor == 2)
279
 
                                        {
280
 
                                                QString fill = dia->getOtherFillColor();
281
 
                                                if (fill == CommonStrings::tr_NoneColor)
282
 
                                                        fill = CommonStrings::None;
283
 
                                                newItem->setFillColor(fill);
284
 
                                                QString stroke = dia->getOtherLineColor();
285
 
                                                if (stroke == CommonStrings::tr_NoneColor)
286
 
                                                        stroke = CommonStrings::None;
287
 
                                                newItem->setLineColor(stroke);
288
 
                                        }
289
 
                                }
290
 
                                currDoc->m_Selection->clear();
291
 
                                currDoc->view()->Deselect(true);
292
 
                        }
293
 
                        currDoc->changed();
294
 
                        currDoc->view()->DrawNew();
295
 
                }
296
 
                delete dia;
 
413
        //<<#9046
 
414
        if (activeTransaction)
 
415
        {
 
416
                activeTransaction->commit();
 
417
                delete activeTransaction;
 
418
                activeTransaction = NULL;
297
419
        }
 
420
        //>>#9046
298
421
        return true;
299
422
}