Subversion Repositories Scribus

Rev

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