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.h"
10
11 #include <QCloseEvent>
12 #include <QComboBox>
13 #include <QEvent>
14 #include <QFocusEvent>
15 #include <QKeyEvent>
16 #include <QObject>
17 #include <QPoint>
18 #include <QSpacerItem>
19 #include <QStackedWidget>
20 #include <QTimer>
21 #include <QToolBox>
22 #include <QToolTip>
23 #include <QTransform>
24 #include <QVBoxLayout>
25 #include <QValidator>
26 #include <QWidget>
27
28 #if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
29 #define _USE_MATH_DEFINES
30 #endif
31 #include <cmath>
32
33 #include "appmodehelper.h"
34 #include "appmodes.h"
35 #include "arrowchooser.h"
36 #include "autoform.h"
37 #include "basepointwidget.h"
38 #include "colorcombo.h"
39 #include "colorlistbox.h"
40 #include "commonstrings.h"
41 #include "cpalette.h"
42 #include "dasheditor.h"
43 #include "pageitem_table.h"
44 #include "propertiespalette_line.h"
45 #include "propertiespalette_shadow.h"
46 #include "propertiespalette_shape.h"
47 #include "propertiespalette_utils.h"
48 #include "propertiespalette_xyz.h"
49 #include "transparencypalette.h"
50 #include "scribus.h"
51 #include "scribusview.h"
52 #include "selection.h"
53 #include "undomanager.h"
54 #include "units.h"
55 #include "util_math.h"
56
57
PropertiesPalette(QWidget * parent)58 PropertiesPalette::PropertiesPalette( QWidget* parent) : ScDockPalette(parent, "PropertiesPalette", Qt::WindowFlags())
59 {
60 undoManager = UndoManager::instance();
61
62 setObjectName(QString::fromLocal8Bit("PropertiesPalette"));
63 setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
64
65 QFont f(font());
66 f.setPointSize(f.pointSize()-1);
67 setFont(f);
68
69 TabStack = new ScTreeWidget( this );
70 // Uncomment this line if the new behaviour makes any trouble.
71 // TabStack->setToolBoxMode(true);
72
73 xyzPal = new PropertiesPalette_XYZ( this );
74 idXYZItem = TabStack->addItem( xyzPal, "X, Y, &Z" );
75
76 shadowPal = new PropertiesPalette_Shadow( this );
77 idShadowItem = TabStack->addItem( shadowPal, "Drop Shadow" );
78
79 shapePal = new PropertiesPalette_Shape( this );
80 idShapeItem = TabStack->addItem( shapePal, "&Shape" );
81
82 linePal = new PropertiesPalette_Line(this);
83 idLineItem=TabStack->addItem( linePal, "&Line" );
84
85 colorPalette = new ColorPalette(this);
86 idColorsItem = TabStack->addItem(colorPalette, "&Colors" );
87
88 transparencyPalette = new TransparencyPalette(this);
89 idTransparencyItem = TabStack->addItem(transparencyPalette, "&Transparency" );
90
91 setWidget( TabStack );
92
93 languageChange();
94
95 connect(linePal, SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
96 connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
97
98 connect(colorPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradient(double,double,double,double,double,double,double,double,double,double )));
99 connect(colorPalette, SIGNAL(editGradient(int)), this, SLOT(toggleGradientEdit(int)));
100 connect(transparencyPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradientM(double,double,double,double,double,double,double,double )));
101 connect(transparencyPalette, SIGNAL(editGradient()), this, SLOT(toggleGradientEditM()));
102
103 m_haveItem = false;
104 for (int i = 1; i < 10; ++i)
105 TabStack->setItemEnabled(i, false);
106 TabStack->setCurrentIndex(0);
107 TabStack->widget(0)->setEnabled(false);
108 TabStack->setItemEnabled(0, false);
109 }
110
closeEvent(QCloseEvent * closeEvent)111 void PropertiesPalette::closeEvent(QCloseEvent *closeEvent)
112 {
113 if (m_ScMW && !m_ScMW->scriptIsRunning())
114 {
115 if (m_haveDoc && m_haveItem && colorPalette->gradEditButton->isChecked())
116 {
117 m_ScMW->view->requestMode(modeNormal);
118 m_ScMW->view->RefreshGradient(m_item);
119 }
120 }
121 ScDockPalette::closeEvent(closeEvent);
122 }
123
setMainWindow(ScribusMainWindow * mw)124 void PropertiesPalette::setMainWindow(ScribusMainWindow* mw)
125 {
126 m_ScMW = mw;
127
128 // For some reason, the mapToGlobal() / mapFromGlobal() roundtrip
129 // performed below does not give always good results, causing PP to
130 // not display in some situations. Moreover the reparenting is useless
131 // as PP is already created with ScribusMainWindow as parent.
132 /*QPoint p1 = mapToGlobal(pos());
133 QPoint p2 = m_ScMW->mapFromGlobal(p1);
134 setParent(m_ScMW);
135 move(p2);*/
136
137 this->xyzPal->setMainWindow(mw);
138 this->shadowPal->setMainWindow(mw);
139 this->shapePal->setMainWindow(mw);
140 this->linePal->setMainWindow(mw);
141
142 //connect(this->Cpal, SIGNAL(gradientChanged()), m_ScMW, SLOT(updtGradFill()));
143 //connect(this->Cpal, SIGNAL(strokeGradientChanged()), m_ScMW, SLOT(updtGradStroke()));
144 connect(this->transparencyPalette, SIGNAL(gradientChanged()), this, SLOT(handleGradientChanged()));
145 connect(m_ScMW->appModeHelper, SIGNAL(AppModeChanged(int,int)), this, SLOT(AppModeChanged()));
146 }
147
SelTab(int t)148 void PropertiesPalette::SelTab(int t)
149 {
150 if (!m_ScMW || m_ScMW->scriptIsRunning())
151 return;
152
153 if (!TabStack->widget(t)->isVisible())
154 return;
155
156 bool focusNowSet = false;
157 foreach (QObject *o, TabStack->widget(t)->children())
158 {
159 // Layouts, boxes etc aren't widgets at all
160 // so let's skip them silently...
161 QWidget *w = qobject_cast<QWidget*>(o);
162 if (!w)
163 continue;
164
165 QWidget *i = TabStack->widget(t);
166 while ((i = i->nextInFocusChain()) != TabStack->widget(t))
167 {
168 if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus) && !i->focusProxy() && i->isEnabled())
169 {
170 focusNowSet = true;
171 i->setFocus();
172 break;
173 }
174 }
175
176 if (focusNowSet)
177 break;
178 }
179 }
180
setDoc(ScribusDoc * d)181 void PropertiesPalette::setDoc(ScribusDoc *d)
182 {
183 if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
184 return;
185
186 if (m_doc)
187 {
188 disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
189 disconnect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
190 }
191
192 m_doc = d;
193 m_item = nullptr;
194 setEnabled(!m_doc->drawAsPreview);
195 colorPalette->setDocument(m_doc);
196 colorPalette->setCurrentItem(nullptr);
197 transparencyPalette->setDocument(m_doc);
198 transparencyPalette->setCurrentItem(nullptr);
199
200 m_unitRatio = m_doc->unitRatio();
201 m_unitIndex = m_doc->unitIndex();
202 m_haveDoc = true;
203 m_haveItem = false;
204
205 xyzPal->setDoc(m_doc);
206 shadowPal->setDoc(m_doc);
207 shapePal->setDoc(m_doc);
208 linePal->setDoc(m_doc);
209
210 updateColorList();
211
212 connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
213 connect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
214
215 // Handle properties update when switching document
216 handleSelectionChanged();
217 }
218
unsetDoc()219 void PropertiesPalette::unsetDoc()
220 {
221 if (m_doc)
222 {
223 disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
224 disconnect(m_doc, SIGNAL(docChanged()), this, SLOT(handleSelectionChanged()));
225 }
226 setEnabled(true);
227 m_haveDoc = false;
228 m_haveItem = false;
229 m_doc=nullptr;
230 m_item = nullptr;
231
232 xyzPal->unsetItem();
233 xyzPal->unsetDoc();
234 shadowPal->unsetItem();
235 shadowPal->unsetDoc();
236 shapePal->unsetItem();
237 shapePal->unsetDoc();
238 linePal->unsetItem();
239 linePal->unsetDoc();
240
241 colorPalette->setCurrentItem(nullptr);
242 colorPalette->setDocument(nullptr);
243 transparencyPalette->setCurrentItem(nullptr);
244 transparencyPalette->setDocument(nullptr);
245
246 m_haveItem = false;
247 for (int ws = 1; ws < 10; ++ws)
248 TabStack->setItemEnabled(ws, false);
249 TabStack->widget(0)->setEnabled(false);
250 TabStack->setItemEnabled(idXYZItem, false);
251 }
252
unsetItem()253 void PropertiesPalette::unsetItem()
254 {
255 m_haveItem = false;
256 m_item = nullptr;
257 colorPalette->setCurrentItem(nullptr);
258 transparencyPalette->setCurrentItem(nullptr);
259 shapePal->unsetItem();
260 linePal->unsetItem();
261 handleSelectionChanged();
262 }
263
setTextFlowMode(PageItem::TextFlowMode mode)264 void PropertiesPalette::setTextFlowMode(PageItem::TextFlowMode mode)
265 {
266 if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveItem)
267 return;
268 shapePal->showTextFlowMode(mode);
269 }
270
currentItemFromSelection()271 PageItem* PropertiesPalette::currentItemFromSelection()
272 {
273 if (m_doc && m_doc->m_Selection->count() > 0)
274 return m_doc->m_Selection->itemAt(0);
275 return nullptr;
276 }
277
AppModeChanged()278 void PropertiesPalette::AppModeChanged()
279 {
280 if (!m_ScMW || m_ScMW->scriptIsRunning())
281 return;
282 if ((m_haveDoc) && (m_haveItem))
283 {
284 // TODO: not sure that this is still needed...
285 if (m_item->isTable())
286 {
287 if (m_doc->appMode == modeEditTable)
288 connect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
289 else
290 disconnect(m_item->asTable(), SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
291 }
292 }
293 }
294
setCurrentItem(PageItem * item)295 void PropertiesPalette::setCurrentItem(PageItem *item)
296 {
297 if (!m_ScMW || m_ScMW->scriptIsRunning())
298 return;
299 //CB We shouldn't really need to process this if our item is the same one
300 //maybe we do if the item has been changed by scripter.. but that should probably
301 //set some status if so.
302 //FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
303 //if (m_item == item)
304 // return;
305
306 if (!item)
307 {
308 unsetItem();
309 return;
310 }
311
312 int oldTabIndex = TabStack->currentIndex();
313
314 if (!m_doc)
315 setDoc(item->doc());
316
317 disconnect(TabStack, SIGNAL(currentChanged2(int)) , this, SLOT(SelTab(int)));
318 disconnect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
319
320 m_haveItem = false;
321 m_item = item;
322
323 transparencyPalette->setCurrentItem(m_item);
324
325 setTextFlowMode(m_item->textFlowMode());
326
327 connect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
328
329 //CB replaces old emits from PageItem::emitAllToGUI()
330 setLocked(item->locked());
331
332 if ((m_item->isGroup()) && (!m_item->isSingleSel))
333 {
334 TabStack->setItemEnabled(idXYZItem, true);
335 TabStack->setItemEnabled(idShadowItem, true);
336 TabStack->setItemEnabled(idShapeItem, true);
337 TabStack->setItemEnabled(idLineItem, false);
338 TabStack->setItemEnabled(idColorsItem, false);
339 TabStack->setItemEnabled(idTransparencyItem, true);
340 }
341
342 m_haveItem = true;
343
344 if (oldTabIndex != TabStack->currentIndex())
345 {
346 //Must be called only when necessary : cause focus problem
347 //in spinboxes when processing valueChanged() signals
348 SelTab(TabStack->currentIndex());
349 }
350
351 if (!sender() || (m_doc->appMode == modeEditTable))
352 {
353 xyzPal->handleSelectionChanged();
354 shadowPal->handleSelectionChanged();
355 shapePal->handleSelectionChanged();
356 linePal->handleSelectionChanged();
357 colorPalette->handleSelectionChanged();
358 }
359
360 if (m_item->isOSGFrame())
361 {
362 TabStack->setItemEnabled(idXYZItem, true);
363 TabStack->setItemEnabled(idShadowItem, true);
364 TabStack->setItemEnabled(idShapeItem, true);
365 TabStack->setItemEnabled(idLineItem, false);
366 TabStack->setItemEnabled(idColorsItem, true);
367 TabStack->setItemEnabled(idTransparencyItem, false);
368 }
369 if (m_item->asSymbol())
370 {
371 TabStack->setItemEnabled(idXYZItem, true);
372 TabStack->setItemEnabled(idShadowItem, true);
373 TabStack->setItemEnabled(idShapeItem, false);
374 TabStack->setItemEnabled(idLineItem, false);
375 TabStack->setItemEnabled(idColorsItem, false);
376 TabStack->setItemEnabled(idTransparencyItem, false);
377 }
378 connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
379 }
380
handleSelectionChanged()381 void PropertiesPalette::handleSelectionChanged()
382 {
383 if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
384 return;
385 int currentTab = TabStack->currentIndex();
386 disconnect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
387
388 PageItem* currItem = currentItemFromSelection();
389 if (m_doc->m_Selection->count() > 1)
390 {
391 for (int ws = 1; ws < 10; ++ws)
392 TabStack->setItemEnabled(ws, false);
393 TabStack->widget(0)->setEnabled(true);
394 TabStack->setItemEnabled(idXYZItem, true);
395 TabStack->setItemEnabled(idShadowItem, true);
396 TabStack->setItemEnabled(idLineItem, true);
397 TabStack->setItemEnabled(idColorsItem, true);
398 TabStack->setItemEnabled(idTransparencyItem, true);
399 }
400 else
401 {
402 int itemType = currItem ? (int) currItem->itemType() : -1;
403 m_haveItem = (itemType != -1);
404
405 // int visID = TabStack->currentIndex();
406 TabStack->widget(0)->setEnabled(true);
407 TabStack->setItemEnabled(idXYZItem, true);
408 TabStack->setItemEnabled(idColorsItem, true);
409 TabStack->setItemEnabled(idTransparencyItem, true);
410 switch (itemType)
411 {
412 case -1:
413 m_haveItem = false;
414 for (int ws = 1; ws < 10; ++ws)
415 TabStack->setItemEnabled(ws, false);
416 TabStack->widget(0)->setEnabled(false);
417 TabStack->setItemEnabled(idXYZItem, false);
418 colorPalette->showGradient(0);
419 break;
420 case PageItem::ImageFrame:
421 case PageItem::LatexFrame:
422 case PageItem::OSGFrame:
423 if (currItem->isOSGFrame())
424 {
425 TabStack->setItemEnabled(idXYZItem, true);
426 TabStack->setItemEnabled(idShadowItem, true);
427 TabStack->setItemEnabled(idShapeItem, true);
428 TabStack->setItemEnabled(idLineItem, false);
429 TabStack->setItemEnabled(idColorsItem, true);
430 TabStack->setItemEnabled(idTransparencyItem, false);
431 }
432 else
433 {
434 TabStack->setItemEnabled(idXYZItem, true);
435 TabStack->setItemEnabled(idShadowItem, true);
436 TabStack->setItemEnabled(idShapeItem, true);
437 TabStack->setItemEnabled(idLineItem, true);
438 }
439 break;
440 case PageItem::Group:
441 case PageItem::Symbol:
442 case PageItem::Table:
443 case PageItem::TextFrame:
444 TabStack->setItemEnabled(idShadowItem, true);
445 TabStack->setItemEnabled(idShapeItem, true);
446 TabStack->setItemEnabled(idLineItem, true);
447 break;
448 case PageItem::Line:
449 TabStack->setItemEnabled(idShadowItem, true);
450 TabStack->setItemEnabled(idShapeItem, false);
451 TabStack->setItemEnabled(idLineItem, true);
452 break;
453 case PageItem::ItemType1:
454 case PageItem::ItemType3:
455 case PageItem::Polygon:
456 case PageItem::RegularPolygon:
457 case PageItem::Arc:
458 TabStack->setItemEnabled(idShadowItem, true);
459 TabStack->setItemEnabled(idShapeItem, true);
460 TabStack->setItemEnabled(idLineItem, true);
461 break;
462 case PageItem::PolyLine:
463 case PageItem::Spiral:
464 TabStack->setItemEnabled(idShadowItem, true);
465 TabStack->setItemEnabled(idShapeItem, true);
466 TabStack->setItemEnabled(idLineItem, true);
467 break;
468 case PageItem::PathText:
469 TabStack->setItemEnabled(idShadowItem, true);
470 TabStack->setItemEnabled(idShapeItem, true);
471 TabStack->setItemEnabled(idLineItem, true);
472 break;
473 }
474 }
475 if (TabStack->isItemEnabled(currentTab) && (TabStack->currentIndex() != currentTab))
476 TabStack->setCurrentIndex(currentTab);
477 updateGeometry();
478 update();
479 connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
480
481 if (currItem)
482 {
483 setCurrentItem(currItem);
484 }
485 }
486
unitChange()487 void PropertiesPalette::unitChange()
488 {
489 if (!m_haveDoc)
490 return;
491 bool tmp = m_haveItem;
492 m_haveItem = false;
493 double oldRatio = m_unitRatio;
494 m_unitRatio = m_doc->unitRatio();
495 m_unitIndex = m_doc->unitIndex();
496
497 xyzPal->unitChange();
498 shadowPal->unitChange();
499 shapePal->unitChange();
500 linePal->unitChange();
501
502 colorPalette->unitChange(oldRatio, m_unitRatio, m_doc->unitIndex());
503 transparencyPalette->unitChange(oldRatio, m_unitRatio, m_doc->unitIndex());
504 m_haveItem = tmp;
505 }
506
NewLineMode(int mode)507 void PropertiesPalette::NewLineMode(int mode)
508 {
509 if (!m_ScMW || m_ScMW->scriptIsRunning())
510 return;
511 xyzPal->setLineMode(mode);
512 xyzPal->showWH(m_item->width(), m_item->height());
513 updateGeometry();
514 repaint();
515 }
516
handleNewShape(int frameType)517 void PropertiesPalette::handleNewShape(int frameType)
518 {
519 if (!m_ScMW || m_ScMW->scriptIsRunning())
520 return;
521 if ((m_haveDoc) && (m_haveItem))
522 {
523 if ((m_item->itemType() == PageItem::PolyLine) || (m_item->itemType() == PageItem::PathText))
524 return;
525 shapePal->setRoundRectEnabled(frameType == 0);
526 }
527 }
528
NewSpGradient(double x1,double y1,double x2,double y2,double fx,double fy,double sg,double sk,double cx,double cy)529 void PropertiesPalette::NewSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy)
530 {
531 if (!m_ScMW || m_ScMW->scriptIsRunning())
532 return;
533 if ((m_haveDoc) && (m_haveItem))
534 {
535 QRectF upRect;
536 UndoTransaction trans;
537 if (UndoManager::undoEnabled())
538 trans = undoManager->beginTransaction(Um::Selection, Um::ILine, Um::GradPos + "p", "", Um::ILine);
539 if (m_ScMW->view->editStrokeGradient == 1)
540 {
541 m_item->setGradientStrokeStart(x1 / m_unitRatio, y1 / m_unitRatio);
542 m_item->setGradientStrokeEnd(x2 / m_unitRatio, y2 / m_unitRatio);
543 m_item->setGradientStrokeFocal(fx / m_unitRatio, fy / m_unitRatio);
544 m_item->setGradientStrokeScale(sg);
545 m_item->setGradientStrokeSkew(sk);
546 if (m_item->strokeGradientType() == 6)
547 {
548 m_item->setGradientStrokeFocal(m_item->gradientStrokeStartX(), m_item->gradientStrokeStartY());
549 }
550 m_item->update();
551 upRect = QRectF(m_item->gradientStrokeStart(), m_item->gradientStrokeEnd());
552 double radEnd = distance(m_item->gradientStrokeEndX() - m_item->gradientStrokeStartX(), m_item->gradientStrokeEndY() - m_item->gradientStrokeStartY());
553 double rotEnd = xy2Deg(m_item->gradientStrokeEndX() - m_item->gradientStrokeStartX(), m_item->gradientStrokeEndY() - m_item->gradientStrokeStartY());
554 QTransform m;
555 m.translate(m_item->gradientStrokeStartX(), m_item->gradientStrokeStartY());
556 m.rotate(rotEnd);
557 m.rotate(-90);
558 m.rotate(m_item->gradientStrokeSkew());
559 m.translate(radEnd * m_item->gradientStrokeScale(), 0);
560 QPointF shP = m.map(QPointF(0,0));
561 upRect = upRect.united(QRectF(shP, m_item->gradientStrokeEnd()).normalized());
562 upRect = upRect.united(QRectF(shP, m_item->gradientStrokeStart()).normalized());
563 upRect |= QRectF(shP, QPointF(0, 0)).normalized();
564 upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
565 }
566 else if (m_ScMW->view->editStrokeGradient == 3)
567 {
568 m_item->setGradientControl1(FPoint(x1 / m_unitRatio, y1 / m_unitRatio));
569 m_item->setGradientControl2(FPoint(x2 / m_unitRatio, y2 / m_unitRatio));
570 m_item->setGradientControl3(FPoint(fx / m_unitRatio, fy / m_unitRatio));
571 m_item->setGradientControl4(FPoint(sg / m_unitRatio, sk / m_unitRatio));
572 m_item->update();
573 upRect = QRectF(QPointF(-m_item->width(), -m_item->height()), QPointF(m_item->width() * 2, m_item->height() * 2)).normalized();
574 }
575 else if (m_ScMW->view->editStrokeGradient == 4)
576 {
577 m_item->setGradientControl1(FPoint(x1 / m_unitRatio, y1 / m_unitRatio));
578 m_item->setGradientControl2(FPoint(x2 / m_unitRatio, y2 / m_unitRatio));
579 m_item->setGradientControl3(FPoint(fx / m_unitRatio, fy / m_unitRatio));
580 m_item->setGradientControl4(FPoint(sg / m_unitRatio, sk / m_unitRatio));
581 m_item->setGradientControl5(FPoint(cx / m_unitRatio, cy / m_unitRatio));
582 m_item->update();
583 upRect = QRectF(QPointF(-m_item->width(), -m_item->height()), QPointF(m_item->width() * 2, m_item->height() * 2)).normalized();
584 }
585 else
586 {
587 if (m_item->gradientType() == 13 && UndoManager::undoEnabled())
588 {
589 SimpleState *ss= new SimpleState("Refresh");
590 ss->set("UNDO_UPDATE_CONICAL");
591 undoManager->action(m_item,ss);
592 }
593 m_item->setGradientStart(x1 / m_unitRatio, y1 / m_unitRatio);
594 m_item->setGradientEnd(x2 / m_unitRatio, y2 / m_unitRatio);
595 m_item->setGradientFocal(fx / m_unitRatio, fy / m_unitRatio);
596 m_item->setGradientScale(sg);
597 m_item->setGradientSkew(sk);
598 if (m_item->strokeGradientType() == 6)
599 {
600 m_item->setGradientFocal(m_item->gradientStartX(), m_item->gradientStartY());
601 }
602 if (m_item->gradientType() == 13 && UndoManager::undoEnabled())
603 {
604 m_item->createConicalMesh();
605 SimpleState *ss= new SimpleState("Refresh");
606 ss->set("REDO_UPDATE_CONICAL");
607 undoManager->action(m_item,ss);
608 }
609 m_item->update();
610 upRect = QRectF(m_item->gradientStart(), m_item->gradientEnd());
611 double radEnd = distance(m_item->gradientEndX() - m_item->gradientStartX(), m_item->gradientEndY() - m_item->gradientStartY());
612 double rotEnd = xy2Deg(m_item->gradientEndX() - m_item->gradientStartX(), m_item->gradientEndY() - m_item->gradientStartY());
613 QTransform m;
614 m.translate(m_item->gradientStartX(), m_item->gradientStartY());
615 m.rotate(rotEnd);
616 m.rotate(-90);
617 m.rotate(m_item->gradientSkew());
618 m.translate(radEnd * m_item->gradientScale(), 0);
619 QPointF shP = m.map(QPointF(0,0));
620 upRect |= QRectF(shP, m_item->gradientEnd()).normalized();
621 upRect |= QRectF(shP, m_item->gradientStart()).normalized();
622 upRect |= QRectF(shP, QPointF(0, 0)).normalized();
623 upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
624 }
625 if (trans)
626 trans.commit();
627 upRect.translate(m_item->xPos(), m_item->yPos());
628 m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
629 m_doc->changed();
630 }
631 }
632
toggleGradientEdit(int stroke)633 void PropertiesPalette::toggleGradientEdit(int stroke)
634 {
635 if (!m_ScMW || m_ScMW->scriptIsRunning())
636 return;
637 if ((m_haveDoc) && (m_haveItem))
638 {
639 m_ScMW->view->editStrokeGradient = stroke;
640 if (stroke == 1)
641 {
642 if (colorPalette->gradEditButtonStroke->isChecked())
643 m_ScMW->view->requestMode(modeEditGradientVectors);
644 else
645 m_ScMW->view->requestMode(modeNormal);
646 }
647 else
648 {
649 if ((colorPalette->gradEditButton->isChecked()) || (colorPalette->editMeshColors->isChecked()))
650 {
651 if ((stroke == 5) || (stroke == 6) || (stroke == 7))
652 m_ScMW->view->requestMode(modeEditMeshGradient);
653 else if ((stroke == 8) || (stroke == 9) || (stroke == 10) || (stroke == 11))
654 m_ScMW->view->requestMode(modeEditMeshPatch);
655 else
656 m_ScMW->view->requestMode(modeEditGradientVectors);
657 }
658 else
659 m_ScMW->view->requestMode(modeNormal);
660 }
661 m_ScMW->view->RefreshGradient(m_item);
662 }
663 }
664
NewSpGradientM(double x1,double y1,double x2,double y2,double fx,double fy,double sg,double sk)665 void PropertiesPalette::NewSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk)
666 {
667 if (!m_ScMW || m_ScMW->scriptIsRunning())
668 return;
669 if ((m_haveDoc) && (m_haveItem))
670 {
671 QRectF upRect;
672 UndoTransaction trans;
673 if (UndoManager::undoEnabled())
674 trans = undoManager->beginTransaction(Um::Selection, Um::ILine, Um::GradPos + "o", "", Um::ILine);
675 m_item->setGradientMaskStart(x1 / m_unitRatio, y1 / m_unitRatio);
676 m_item->setGradientMaskEnd(x2 / m_unitRatio, y2 / m_unitRatio);
677 m_item->setGradientMaskFocal(fx / m_unitRatio, fy / m_unitRatio);
678 m_item->setGradientMaskScale(sg);
679 m_item->setGradientMaskSkew(sk);
680 if ((m_item->GrMask == GradMask_Linear) || (m_item->GrMask == GradMask_LinearLumAlpha))
681 {
682 m_item->setGradientMaskFocal(m_item->GrMaskStartX, m_item->GrMaskStartY);
683 }
684 m_item->update();
685 if (trans)
686 {
687 trans.commit();
688 }
689 upRect = QRectF(m_item->gradientMaskStart(), m_item->gradientMaskEnd());
690 double radEnd = distance(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY);
691 double rotEnd = xy2Deg(m_item->GrMaskEndX - m_item->GrMaskStartX, m_item->GrMaskEndY - m_item->GrMaskStartY);
692 QTransform m;
693 m.translate(m_item->GrMaskStartX, m_item->GrMaskStartY);
694 m.rotate(rotEnd);
695 m.rotate(-90);
696 m.rotate(m_item->GrMaskSkew);
697 m.translate(radEnd * m_item->GrMaskScale, 0);
698 QPointF shP = m.map(QPointF(0,0));
699 upRect |= QRectF(shP, m_item->gradientMaskEnd()).normalized();
700 upRect |= QRectF(shP, m_item->gradientMaskStart()).normalized();
701 upRect |= QRectF(shP, QPointF(0, 0)).normalized();
702 upRect |= QRectF(shP, QPointF(m_item->width(), m_item->height())).normalized();
703 upRect.translate(m_item->xPos(), m_item->yPos());
704 m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
705 m_doc->changed();
706 }
707 }
708
toggleGradientEditM()709 void PropertiesPalette::toggleGradientEditM()
710 {
711 if (!m_ScMW || m_ScMW->scriptIsRunning())
712 return;
713 if ((m_haveDoc) && (m_haveItem))
714 {
715 m_ScMW->view->editStrokeGradient = 2;
716 if (transparencyPalette->gradEditButton->isChecked())
717 m_ScMW->view->requestMode(modeEditGradientVectors);
718 else
719 m_ScMW->view->requestMode(modeNormal);
720 }
721 }
722
updateColorList()723 void PropertiesPalette::updateColorList()
724 {
725 if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
726 return;
727
728 colorPalette->updateColorList();
729 transparencyPalette->updateColorList();
730 shadowPal->updateColorList();
731
732 assert (m_doc->PageColors.document());
733 }
734
userActionOn()735 bool PropertiesPalette::userActionOn()
736 {
737 return xyzPal->userActionOn();
738 }
739
changeEvent(QEvent * e)740 void PropertiesPalette::changeEvent(QEvent *e)
741 {
742 if (e->type() == QEvent::LanguageChange)
743 {
744 languageChange();
745 return;
746 }
747 ScDockPalette::changeEvent(e);
748 }
749
languageChange()750 void PropertiesPalette::languageChange()
751 {
752 setWindowTitle( tr("Properties"));
753
754 TabStack->setItemText(idXYZItem, tr("X, Y, &Z"));
755 TabStack->setItemText(idShadowItem, tr("Drop Shadow"));
756 TabStack->setItemText(idShapeItem, tr("&Shape"));
757 TabStack->setItemText(idLineItem, tr("&Line"));
758 TabStack->setItemText(idColorsItem, tr("&Colors"));
759 TabStack->setItemText(idTransparencyItem, tr("&Transparency"));
760
761 xyzPal->languageChange();
762 shadowPal->languageChange();
763 shapePal->languageChange();
764 colorPalette->languageChange();
765 linePal->languageChange();
766 }
767
setGradientEditMode(bool on)768 void PropertiesPalette::setGradientEditMode(bool on)
769 {
770 colorPalette->gradEditButton->setChecked(on);
771 }
772
endPatchAdd()773 void PropertiesPalette::endPatchAdd()
774 {
775 colorPalette->endPatchAdd();
776 }
777
updateColorSpecialGradient()778 void PropertiesPalette::updateColorSpecialGradient()
779 {
780 if (!m_haveDoc)
781 return;
782 if(m_doc->m_Selection->isEmpty())
783 return;
784
785 PageItem *currItem=m_doc->m_Selection->itemAt(0);
786 if (currItem)
787 {
788 if (m_ScMW->view->editStrokeGradient == 0)
789 colorPalette->setSpecialGradient(currItem->GrStartX, currItem->GrStartY, currItem->GrEndX, currItem->GrEndY, currItem->GrFocalX, currItem->GrFocalY, currItem->GrScale, currItem->GrSkew, 0, 0);
790 else if (m_ScMW->view->editStrokeGradient == 1)
791 colorPalette->setSpecialGradient(currItem->GrStrokeStartX, currItem->GrStrokeStartY, currItem->GrStrokeEndX, currItem->GrStrokeEndY, currItem->GrStrokeFocalX, currItem->GrStrokeFocalY, currItem->GrStrokeScale, currItem->GrStrokeSkew, 0, 0);
792 else if (m_ScMW->view->editStrokeGradient == 3)
793 colorPalette->setSpecialGradient(currItem->GrControl1.x(), currItem->GrControl1.y(), currItem->GrControl2.x(), currItem->GrControl2.y(), currItem->GrControl3.x(), currItem->GrControl3.y(), currItem->GrControl4.x(), currItem->GrControl4.y(), 0, 0);
794 else if (m_ScMW->view->editStrokeGradient == 4)
795 colorPalette->setSpecialGradient(currItem->GrControl1.x(), currItem->GrControl1.y(), currItem->GrControl2.x(), currItem->GrControl2.y(), currItem->GrControl3.x(), currItem->GrControl3.y(), currItem->GrControl4.x(), currItem->GrControl4.y(), currItem->GrControl5.x(), currItem->GrControl5.y());
796 else if ((m_ScMW->view->editStrokeGradient == 5) || (m_ScMW->view->editStrokeGradient == 6))
797 colorPalette->setMeshPoint();
798 else if (m_ScMW->view->editStrokeGradient == 8)
799 colorPalette->setMeshPatchPoint();
800 else if (m_ScMW->view->editStrokeGradient == 9)
801 colorPalette->setMeshPatch();
802 else if (currItem->isGroup())
803 transparencyPalette->setSpecialGradient(currItem->GrMaskStartX, currItem->GrMaskStartY, currItem->GrMaskEndX, currItem->GrMaskEndY, currItem->GrMaskFocalX, currItem->GrMaskFocalY, currItem->GrMaskScale, currItem->GrMaskSkew);
804 }
805 }
806
setLocked(bool isLocked)807 void PropertiesPalette::setLocked(bool isLocked)
808 {
809 shapePal->setLocked(isLocked);
810 }
811
handleShapeEdit()812 void PropertiesPalette::handleShapeEdit()
813 {
814 if (!m_ScMW || m_ScMW->scriptIsRunning())
815 return;
816 if ((m_haveDoc) && (m_haveItem))
817 shapePal->setRoundRectEnabled(false);
818 }
819
handleGradientChanged()820 void PropertiesPalette::handleGradientChanged()
821 {
822 if (!m_ScMW || m_ScMW->scriptIsRunning())
823 return;
824 if ((m_haveDoc) && (m_haveItem))
825 {
826 VGradient vg(transparencyPalette->gradEdit->gradient());
827 m_doc->itemSelection_SetMaskGradient(vg);
828 }
829 }
830