Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
16546 jghali 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
*/
7
 
8
#include "propertiespalette_shape.h"
9
 
17539 jghali 10
#if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
16546 jghali 11
#define _USE_MATH_DEFINES
12
#endif
13
#include <cmath>
14
#include "autoform.h"
15
#include "commonstrings.h"
16
#include "sccolorengine.h"
17
#include "pageitem_arc.h"
18
#include "pageitem_textframe.h"
19
#include "pageitem_regularpolygon.h"
20
#include "polyprops.h"
21
#include "sccombobox.h"
22
#include "scribus.h"
23
#include "scribuscore.h"
24
#include "scraction.h"
25
#include "scribusview.h"
26
#include "selection.h"
27
#include "units.h"
28
#include "undomanager.h"
29
#include "util.h"
30
#include "util_icon.h"
31
#include "util_math.h"
32
 
33
#include "ui/nodeeditpalette.h"
34
#include "ui/propertiespalette_utils.h"
35
#include "ui/propertiespalette_xyz.h"
36
 
37
PropertiesPalette_Shape::PropertiesPalette_Shape( QWidget* parent) : QWidget(parent)
38
{
39
        m_ScMW = 0;
40
        m_doc  = 0;
41
        m_haveDoc    = false;
42
        m_haveItem   = false;
43
        m_unitRatio  = 1.0;
44
 
45
        m_tmpSelection = new Selection(this, false);
46
        m_tmpSelection->clear();
47
 
48
        setupUi(this);
17383 fschmid 49
        setSizePolicy( QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
16546 jghali 50
 
51
        roundRectLabel->setBuddy(roundRect);
52
 
53
        textFlowDisabled->setIcon(QIcon(loadIcon("flow-none.png")));
54
        textFlowUsesFrameShape->setIcon(QIcon(loadIcon("flow-frame.png")));
55
        textFlowUsesBoundingBox->setIcon(QIcon(loadIcon("flow-bounding.png")));
56
        textFlowUsesContourLine->setIcon(QIcon(loadIcon("flow-contour.png")));
57
        textFlowUsesImageClipping->setIcon(QIcon(loadIcon("flow-contour.png")));
58
 
59
        languageChange();
60
 
61
        connect(textFlowBtnGroup, SIGNAL(buttonClicked(int)), this, SLOT(handleTextFlow()));
62
        connect(editShape  , SIGNAL(clicked())                 , this, SLOT(handleShapeEdit()));
63
        connect(roundRect  , SIGNAL(valueChanged(double))      , this, SLOT(handleCornerRadius()));
64
        connect(evenOdd    , SIGNAL(clicked())                 , this, SLOT(handleFillRule()) );
65
        connect(nonZero    , SIGNAL(clicked())                 , this, SLOT(handleFillRule()) );
66
        connect(customShape, SIGNAL(FormSel(int, int, qreal *)), this, SLOT(handleNewShape(int, int, qreal *)));
67
 
68
        roundRect->showValue(0);
69
        stackedWidget->setCurrentIndex(0);
70
}
71
 
72
void PropertiesPalette_Shape::changeEvent(QEvent *e)
73
{
74
        if (e->type() == QEvent::LanguageChange)
75
        {
76
                languageChange();
77
                return;
78
        }
79
        QWidget::changeEvent(e);
80
}
81
 
82
 
83
void PropertiesPalette_Shape::setMainWindow(ScribusMainWindow* mw)
84
{
85
        m_ScMW = mw;
86
 
87
        connect(m_ScMW, SIGNAL(UpdateRequest(int)), this  , SLOT(handleUpdateRequest(int)));
88
}
89
 
90
void PropertiesPalette_Shape::setDoc(ScribusDoc *d)
91
{
92
        if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
93
                return;
94
 
95
        if (m_doc)
96
        {
97
                disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
98
                disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
99
        }
100
 
101
        m_doc  = d;
102
        m_item = NULL;
103
        m_unitRatio   = m_doc->unitRatio();
104
        m_unitIndex   = m_doc->unitIndex();
105
 
106
        m_haveDoc  = true;
107
        m_haveItem = false;
108
 
109
        roundRect->setValues( -300, 300, 2, 0);
110
 
111
        connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
112
        connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
113
}
114
 
115
void PropertiesPalette_Shape::unsetDoc()
116
{
117
        if (m_doc)
118
        {
119
                disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
120
                disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
121
        }
122
 
123
        m_haveDoc  = false;
124
        m_haveItem = false;
125
        m_doc   = NULL;
126
        m_item  = NULL;
127
 
128
        editShape->setEnabled(false);
129
        roundRect->setEnabled(false);
130
        roundRect->showValue(0);
131
        setEnabled(false);
132
}
133
 
134
void PropertiesPalette_Shape::unsetItem()
135
{
136
        m_haveItem = false;
137
        m_item     = NULL;
138
        handleSelectionChanged();
139
}
140
 
141
PageItem* PropertiesPalette_Shape::currentItemFromSelection()
142
{
143
        PageItem *currentItem = NULL;
144
 
17644 craig 145
        if (m_doc && m_doc->m_Selection->count()>0)
146
                currentItem = m_doc->m_Selection->itemAt(0);
16546 jghali 147
 
148
        return currentItem;
149
}
150
 
151
void PropertiesPalette_Shape::setCustomShapeIcon(int submode)
152
{
153
        customShape->setIcon( customShape->getIconPixmap(submode) );
154
}
155
 
156
void PropertiesPalette_Shape::setLocked(bool isLocked)
157
{
158
        QPalette pal(qApp->palette());
159
        if (isLocked)
160
                pal.setCurrentColorGroup(QPalette::Disabled);
161
        if ((m_haveDoc) && (m_haveItem))
162
        {
163
                enableCustomShape();
17806 fschmid 164
                enableEditShape();
16546 jghali 165
                if (((m_item->asTextFrame()) || (m_item->asImageFrame()) || (m_item->asPolygon())) &&  (!m_item->ClipEdited) && ((m_item->FrameType == 0) || (m_item->FrameType == 2)))
166
                        roundRect->setEnabled(!isLocked);
167
                else
168
                        roundRect->setEnabled(false);
169
        }
170
}
171
 
17806 fschmid 172
void PropertiesPalette_Shape::setSizeLocked(bool )
16890 jghali 173
{
17806 fschmid 174
        enableEditShape();
16890 jghali 175
}
176
 
16546 jghali 177
void PropertiesPalette_Shape::setRoundRectEnabled(bool enabled)
178
{
179
        roundRect->setEnabled(enabled);
180
}
181
 
182
void PropertiesPalette_Shape::enableCustomShape()
183
{
184
        bool enabled = false;
185
        if (m_item)
186
        {
187
                enabled  = true;
188
                enabled &= !m_item->isArc();
189
                enabled &= !m_item->isLine();
190
                enabled &= !m_item->isPathText();
191
                enabled &= !m_item->isPolyLine();
192
                enabled &= !m_item->isSpiral();
193
                enabled &= !m_item->isRegularPolygon();
194
                enabled &= !m_item->locked();
17806 fschmid 195
                enabled &= !m_item->sizeLocked();
196
                enabled &= !m_item->isTable();
16546 jghali 197
        }
198
        customShape->setEnabled(enabled);
199
}
200
 
17806 fschmid 201
void PropertiesPalette_Shape::enableEditShape()
202
{
203
        bool enabled = false;
204
        if (m_item)
205
        {
206
                enabled  = true;
207
                enabled &= !m_item->locked();
208
                enabled &= !m_item->sizeLocked();
209
                enabled &= !m_item->isTable();
210
        }
211
        editShape->setEnabled(enabled);
212
}
213
 
16546 jghali 214
void PropertiesPalette_Shape::handleSelectionChanged()
215
{
216
        if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
217
                return;
218
 
219
        PageItem* currItem = currentItemFromSelection();
220
        if (m_doc->m_Selection->count() > 1)
221
        {
222
                roundRect->showValue(0);
223
        }
224
        else
225
        {
226
                int itemType = currItem ? (int) currItem->itemType() : -1;
227
 
228
                m_haveItem = (itemType != -1);
229
                if (itemType != -1)
230
                {
17806 fschmid 231
                        enableEditShape();
16546 jghali 232
                        enableCustomShape();
233
                }
234
                else
235
                {
236
                        editShape->setEnabled(false);
237
                        customShape->setEnabled(false);
238
                }
239
                switch (itemType)
240
                {
241
                case -1:
242
                        setEnabled(false);
243
                        roundRect->setEnabled(false);
244
                        roundRect->showValue(0);
245
                        break;
246
                case PageItem::ImageFrame:
247
                case PageItem::LatexFrame:
248
                case PageItem::OSGFrame:
249
                        if (currItem->asOSGFrame())
250
                        {
251
                                setEnabled(false);
252
                                roundRect->setEnabled(false);
253
                                editShape->setEnabled(false);
254
                                customShape->setEnabled(false);
255
                        }
256
                        else
257
                        {
258
                                setEnabled(true);
259
                                if ((!currItem->ClipEdited) && ((currItem->FrameType == 0) || (currItem->FrameType == 2)))
260
                                        roundRect->setEnabled(!currItem->locked());
261
                                else
262
                                        roundRect->setEnabled(false);
263
                                if ((m_doc->m_Selection->itemAt(0)->FrameType == 0) || (m_doc->m_Selection->itemAt(0)->FrameType == 2))
264
                                        roundRect->setEnabled(!currItem->locked());
265
                        }
266
                        break;
267
                case PageItem::TextFrame:
268
                        setEnabled(true);
269
                        if ((!currItem->ClipEdited) && ((currItem->FrameType == 0) || (currItem->FrameType == 2)))
270
                                roundRect->setEnabled(!currItem->locked());
271
                        else
272
                                roundRect->setEnabled(false);
273
                        break;
274
                case PageItem::Line:
275
                        setEnabled(false);
276
                        roundRect->setEnabled(false);
277
                        break;
278
                case PageItem::Arc:
279
                case PageItem::ItemType1:
280
                case PageItem::ItemType3:
281
                case PageItem::Polygon:
282
                case PageItem::RegularPolygon:
283
                        setEnabled(true);
284
                        if ((!currItem->ClipEdited) && ((currItem->FrameType == 0) || (currItem->FrameType == 2)))
285
                                roundRect->setEnabled(!currItem->locked());
286
                        else
287
                                roundRect->setEnabled(false);
288
                        break;
289
                case PageItem::PolyLine:
290
                case PageItem::Spiral:
291
                        setEnabled(true);
292
                        roundRect->setEnabled(false);
293
                        break;
294
                case PageItem::PathText:
295
                        setEnabled(true);
296
                        roundRect->setEnabled(false);
297
                        break;
298
                case PageItem::Symbol:
299
                        setEnabled(false);
300
                        if ((!currItem->ClipEdited) && ((currItem->FrameType == 0) || (currItem->FrameType == 2)))
301
                                roundRect->setEnabled(!currItem->locked());
302
                        else
303
                                roundRect->setEnabled(false);
304
                        break;
17806 fschmid 305
                case PageItem::Table:
306
                        setEnabled(true);
307
                        roundRect->setEnabled(false);
308
                        editShape->setEnabled(false);
309
                        customShape->setEnabled(false);
310
                        break;
16546 jghali 311
                }
312
        }
16814 jghali 313
        setCurrentItem(currItem);
16546 jghali 314
        updateGeometry();
18480 jghali 315
        //repaint();
16546 jghali 316
}
317
 
318
void PropertiesPalette_Shape::handleUpdateRequest(int updateFlags)
319
{
320
        if ((updateFlags & reqCustomShapeUpdate) && (m_haveDoc && m_doc))
321
        {
322
                setCustomShapeIcon(m_doc->SubMode);
323
        }
324
}
325
 
326
void PropertiesPalette_Shape::setCurrentItem(PageItem *item)
327
{
328
        if (!m_ScMW || m_ScMW->scriptIsRunning())
329
                return;
330
        //CB We shouldnt really need to process this if our item is the same one
331
        //maybe we do if the item has been changed by scripter.. but that should probably
332
        //set some status if so.
333
        //FIXME: This wont work until when a canvas deselect happens, m_item must be NULL.
334
        //if (m_item == i)
335
        //      return;
336
 
16814 jghali 337
        if (item && !m_doc)
16546 jghali 338
                setDoc(item->doc());
339
 
340
        m_haveItem = false;
341
        m_item = item;
342
 
16814 jghali 343
        if (!m_item) return;
344
 
16546 jghali 345
        if (m_item->FrameType == 0)
346
                customShape->setIcon(customShape->getIconPixmap(0));
347
        if (m_item->FrameType == 1)
348
                customShape->setIcon(customShape->getIconPixmap(1));
349
        if (m_item->FrameType > 3)
350
                customShape->setIcon(customShape->getIconPixmap(m_item->FrameType-2));
351
 
352
        roundRect->setValue(m_item->cornerRadius()*m_unitRatio);
353
        displayTextFlowMode(m_item->textFlowMode());
354
 
355
        if (m_item->asPathText())
356
        {
357
                stackedWidget->setCurrentIndex(0);
358
        }
359
        else if (m_item->asTextFrame())
360
        {
361
                stackedWidget->setCurrentIndex(0);
362
        }
363
        else
364
        {
365
                stackedWidget->setCurrentIndex(1);
366
                fillRuleGroup->setVisible(m_item->itemType() != PageItem::ImageFrame);
367
        }
368
        setLocked(m_item->locked());
16890 jghali 369
        setSizeLocked(m_item->sizeLocked());
16546 jghali 370
        nonZero->setChecked(!m_item->fillRule);
371
        evenOdd->setChecked(m_item->fillRule);
372
 
373
        // Frame type 3 is obsolete: CR 2005-02-06
374
        //if (((i->itemType() == PageItem::TextFrame) || (i->itemType() == PageItem::ImageFrame) || (i->itemType() == 3)) &&  (!i->ClipEdited))
375
        if (((m_item->asTextFrame()) || (m_item->asImageFrame())) &&  (!m_item->ClipEdited) && ((m_item->FrameType == 0) || (m_item->FrameType == 2)))
376
                roundRect->setEnabled(true);
377
        else
378
        {
379
                roundRect->setEnabled ((m_item->asPolygon()) &&  (!m_item->ClipEdited)  && ((m_item->FrameType == 0) || (m_item->FrameType == 2)));
380
        }
381
        if (m_item->asOSGFrame())
382
        {
383
                setEnabled(false);
384
                roundRect->setEnabled(false);
385
                editShape->setEnabled(false);
386
                customShape->setEnabled(false);
387
        }
388
        if (m_item->asSymbolFrame())
389
        {
390
                setEnabled(false);
391
        }
17806 fschmid 392
        if (m_item->asTable())
393
        {
394
                setEnabled(true);
395
                roundRect->setEnabled(false);
396
                editShape->setEnabled(false);
397
                customShape->setEnabled(false);
398
        }
17057 fschmid 399
        m_haveItem = true;
400
        displayTextFlowMode(m_item->textFlowMode());
16546 jghali 401
}
402
 
403
void PropertiesPalette_Shape::handleTextFlow()
404
{
405
        PageItem::TextFlowMode mode = PageItem::TextFlowDisabled;
406
        if (!m_ScMW || m_ScMW->scriptIsRunning())
407
                return;
408
        if ((m_haveDoc) && (m_haveItem))
409
        {
410
                if (!m_item->isGroup())
411
                {
412
                        if (textFlowDisabled->isChecked())
413
                                mode = PageItem::TextFlowDisabled;
414
                        if (textFlowUsesFrameShape->isChecked())
415
                                mode = PageItem::TextFlowUsesFrameShape;
416
                        if (textFlowUsesBoundingBox->isChecked())
417
                                mode = PageItem::TextFlowUsesBoundingBox;
418
                        if (textFlowUsesContourLine->isChecked())
419
                                mode = PageItem::TextFlowUsesContourLine;
420
                        if (textFlowUsesImageClipping->isChecked())
421
                                mode = PageItem::TextFlowUsesImageClipping;
422
                }
423
                m_item->setTextFlowMode(mode);
17099 jghali 424
                m_doc->changed();
17057 fschmid 425
                m_doc->invalidateAll();
17038 fschmid 426
                m_doc->regionsChanged()->update(QRect());
16546 jghali 427
        }
428
}
429
 
430
void PropertiesPalette_Shape::handleShapeEdit()
431
{
432
        if (!m_ScMW || m_ScMW->scriptIsRunning())
433
                return;
434
        if ((m_haveDoc) && (m_haveItem))
435
        {
436
                m_tmpSelection->clear();
437
                if (m_item->asRegularPolygon())
438
                {
439
                        m_ScMW->view->requestMode(modeEditPolygon);
440
                        roundRect->setEnabled(false);
441
                }
442
                else if (m_item->asArc())
443
                {
444
                        m_ScMW->view->requestMode(modeEditArc);
445
                        roundRect->setEnabled(false);
446
                }
447
                else if (m_item->asSpiral())
448
                {
449
                        m_ScMW->view->requestMode(modeEditSpiral);
450
                        roundRect->setEnabled(false);
451
                }
452
                else
453
                {
454
                        m_ScMW->view->requestMode(modeEditClip);
455
                        roundRect->setEnabled(false);
456
                        connect(m_ScMW->nodePalette, SIGNAL(paletteClosed()), this, SLOT(handleShapeEditEnded()));
457
                }
17099 jghali 458
                m_doc->changed();
16546 jghali 459
        }
460
}
461
 
462
void PropertiesPalette_Shape::handleShapeEditEnded()
463
{
464
        disconnect(m_ScMW->nodePalette, SIGNAL(paletteClosed()), this, SLOT(handleShapeEditEnded()));
465
        if ((m_haveDoc) && (m_haveItem))
466
        {
467
                if (m_tmpSelection->count() > 0)
468
                {
469
                        m_doc->m_Selection->copy(*m_tmpSelection, false);
470
                        m_doc->m_Selection->connectItemToGUI();
471
                }
472
                m_tmpSelection->clear();
473
        }
474
}
475
 
476
void PropertiesPalette_Shape::handleCornerRadius()
477
{
478
        if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
479
                return;
480
        m_item->setCornerRadius(roundRect->value() / m_unitRatio);
481
        m_ScMW->view->SetFrameRounded();
17099 jghali 482
        m_doc->changed();
16546 jghali 483
        m_doc->regionsChanged()->update(QRect());
484
}
485
 
486
void PropertiesPalette_Shape::handleFillRule()
487
{
488
        if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
489
                return;
490
        m_item->fillRule = evenOdd->isChecked();
491
        m_item->update();
492
}
493
 
494
void PropertiesPalette_Shape::handleNewShape(int f, int c, qreal *vals)
495
{
496
        if (!m_ScMW || m_ScMW->scriptIsRunning())
497
                return;
498
        if ((m_haveDoc) && (m_haveItem))
499
        {
500
                if ((m_item->itemType() == PageItem::PolyLine) || (m_item->itemType() == PageItem::PathText))
501
                        return;
502
 
503
                m_doc->item_setFrameShape(m_item, f, c, vals);
504
 
505
                //ScribusDoc::changed() is called in item_setFrameShape()
506
                //Hope this is enough
507
                //emit DocChanged();
508
 
509
                if ((m_item->itemType() == PageItem::ImageFrame) || (m_item->itemType() == PageItem::TextFrame))
510
                {
511
                        roundRect->setEnabled(f == 0);
512
                        return;
513
                }
514
//              m_item->convertTo(PageItem::Polygon);
515
//              newSelection(6);
516
                roundRect->setEnabled(f == 0);
17097 fschmid 517
                m_doc->invalidateAll();
518
                m_doc->regionsChanged()->update(QRect());
16546 jghali 519
        }
520
}
521
 
522
void PropertiesPalette_Shape::displayTextFlowMode(PageItem::TextFlowMode mode)
523
{
524
        if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveItem)
525
                return;
526
        if (!m_item->isGroup())
527
        {
528
                if (mode == PageItem::TextFlowDisabled)
529
                        textFlowDisabled->setChecked(true);
530
                else if (mode == PageItem::TextFlowUsesFrameShape)
531
                        textFlowUsesFrameShape->setChecked(true);
532
                else if (mode == PageItem::TextFlowUsesBoundingBox)
533
                        textFlowUsesBoundingBox->setChecked(true);
534
                else if (mode == PageItem::TextFlowUsesContourLine)
535
                        textFlowUsesContourLine->setChecked(true);
536
                else if (mode == PageItem::TextFlowUsesImageClipping)
537
                        textFlowUsesImageClipping->setChecked(true);
538
                if ((m_item->asImageFrame()) && (m_item->imageClip.size() != 0))
539
                        textFlowUsesImageClipping->setEnabled(true);
540
                else
541
                        textFlowUsesImageClipping->setEnabled(false);
542
        }
543
}
544
 
545
void PropertiesPalette_Shape::languageChange()
546
{
547
        QString ptSuffix = tr(" pt");
548
        QString suffix   = m_doc ? unitGetSuffixFromIndex(m_doc->unitIndex()) : ptSuffix;
549
        roundRect->setSuffix(suffix);
550
 
551
        shapeGroup->setTitle( tr("Shape:"));
552
        customShape->setToolTip( tr("Choose the shape of frame..."));
553
        editShape->setText( tr("&Edit..."));
554
        roundRect->setToolTip( tr("Set radius of corner rounding"));
555
        roundRectLabel->setText( tr("R&ound Corners:"));
556
        fillRuleGroup->setTitle( tr("Fill Rule"));
557
        evenOdd->setText( tr("Even-Odd"));
558
        nonZero->setText( tr("Non Zero"));
559
 
17250 jghali 560
        evenOdd->setToolTip( "<qt>" + tr("This rule determines the &quot;insideness&quot; of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses. If this number is odd, the point is inside, if even, the point is outside.")  + "</qt>");
17252 jghali 561
        nonZero->setToolTip( "<qt>" + tr("This rule determines the &quot;insideness&quot; of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray. Starting with a count of zero, add one each time a path segment crosses the ray from left to right and subtract one each time a path segment crosses the ray from right to left. If the result is zero then the point is outside the path. Otherwise, it is inside.")  + "</qt>");
17250 jghali 562
 
16546 jghali 563
        textFlowGroup->setTitle( tr("Text &Flow Around Frame"));
564
        textFlowDisabled->setText( tr("Disabled"));
565
        textFlowUsesFrameShape->setText( tr("Use Frame &Shape"));
566
        textFlowUsesBoundingBox->setText( tr("Use &Bounding Box"));
567
        textFlowUsesContourLine->setText( tr("&Use Contour Line"));
568
        textFlowUsesImageClipping->setText( tr("Use Image Clip Path"));
569
}
570
 
571
void PropertiesPalette_Shape::unitChange()
572
{
573
        if (!m_doc)
574
                return;
575
 
576
        m_unitRatio = m_doc->unitRatio();
577
        m_unitIndex = m_doc->unitIndex();
578
 
579
        roundRect->blockSignals(true);
580
        roundRect->setNewUnit( m_unitIndex );
581
        roundRect->blockSignals(false);
582
}