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_group.h"
9
10 #include <QButtonGroup>
11 #include <QCheckBox>
12 #include <QCloseEvent>
13 #include <QComboBox>
14 #include <QEvent>
15 #include <QFocusEvent>
16 #include <QFrame>
17 #include <QGridLayout>
18 #include <QGroupBox>
19 #include <QHBoxLayout>
20 #include <QImage>
21 #include <QKeyEvent>
22 #include <QLabel>
23 #include <QListView>
24 #include <QTransform>
25 #include <QMenu>
26 #include <QMessageBox>
27 #include <QObject>
28 #include <QPixmap>
29 #include <QPoint>
30 #include <QPushButton>
31 #include <QRadioButton>
32 #include <QRegExp>
33 #include <QSpacerItem>
34 #include <QSpinBox>
35 #include <QStackedWidget>
36 #include <QTimer>
37 #include <QToolBox>
38 #include <QToolTip>
39 #include <QVBoxLayout>
40 #include <QValidator>
41 #include <QWidget>
42
43 #if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES)
44 #define _USE_MATH_DEFINES
45 #endif
46 #include <cmath>
47
48 #include "appmodes.h"
49 #include "commonstrings.h"
50 #include "iconmanager.h"
51 #include "scraction.h"
52 #include "scribuscore.h"
53 #include "scribusview.h"
54 #include "selection.h"
55 #include "ui/autoform.h"
56 #include "ui/nodeeditpalette.h"
57 #include "ui/propertiespalette.h"
58 #include "ui/propertiespalette_utils.h"
59 #include "ui/propertiespalette_xyz.h"
60 #include "undomanager.h"
61 #include "units.h"
62 #include "util.h"
63 #include "util_math.h"
64
PropertiesPalette_Group(QWidget * parent)65 PropertiesPalette_Group::PropertiesPalette_Group( QWidget* parent)
66 : QWidget(parent)
67 {
68 m_tmpSelection = new Selection(this, false);
69 m_tmpSelection->clear();
70
71 setupUi(this);
72 setSizePolicy( QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
73
74 languageChange();
75
76 connect(clipGroups , SIGNAL(clicked()) , this, SLOT(handleClipping()) );
77 }
78
currentItemFromSelection()79 PageItem* PropertiesPalette_Group::currentItemFromSelection()
80 {
81 PageItem *currentItem = nullptr;
82
83 if (m_doc && m_doc->m_Selection->count()>0)
84 currentItem = m_doc->m_Selection->itemAt(0);
85
86 return currentItem;
87 }
88
setMainWindow(ScribusMainWindow * mw)89 void PropertiesPalette_Group::setMainWindow(ScribusMainWindow *mw)
90 {
91 m_ScMW = mw;
92
93 connect(m_ScMW, SIGNAL(UpdateRequest(int)), this, SLOT(handleUpdateRequest(int)));
94 }
95
setDoc(ScribusDoc * d)96 void PropertiesPalette_Group::setDoc(ScribusDoc *d)
97 {
98 if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
99 return;
100
101 if (m_doc)
102 {
103 disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
104 disconnect(m_doc , SIGNAL(docChanged()) , this, SLOT(handleSelectionChanged()));
105 }
106
107 m_doc = d;
108 m_item = nullptr;
109 m_unitRatio = m_doc->unitRatio();
110 m_unitIndex = m_doc->unitIndex();
111
112 m_haveDoc = true;
113 m_haveItem = false;
114
115 connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
116 connect(m_doc , SIGNAL(docChanged()) , this, SLOT(handleSelectionChanged()));
117 }
118
unsetDoc()119 void PropertiesPalette_Group::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 = nullptr;
130 m_item = nullptr;
131
132 setEnabled(false);
133 }
134
unsetItem()135 void PropertiesPalette_Group::unsetItem()
136 {
137 m_haveItem = false;
138 m_item = nullptr;
139 handleSelectionChanged();
140 }
141
handleSelectionChanged()142 void PropertiesPalette_Group::handleSelectionChanged()
143 {
144 if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
145 return;
146
147 PageItem* currItem = currentItemFromSelection();
148 if (m_doc->m_Selection->count() > 1)
149 {
150 bool widgetEnabled = false;
151 if (m_haveItem && m_item)
152 {
153 if ((m_item->isGroup()) && (!m_item->isSingleSel))
154 widgetEnabled = true;
155 }
156 setEnabled(widgetEnabled);
157 }
158 else
159 {
160 int itemType = currItem ? (int) currItem->itemType() : -1;
161 m_haveItem = (itemType != -1);
162
163 if (itemType == PageItem::Symbol)
164 setEnabled(true);
165 }
166 if (currItem)
167 {
168 setCurrentItem(currItem);
169 }
170 updateGeometry();
171 }
172
handleUpdateRequest(int updateFlags)173 void PropertiesPalette_Group::handleUpdateRequest(int updateFlags)
174 {
175 }
176
setCurrentItem(PageItem * item)177 void PropertiesPalette_Group::setCurrentItem(PageItem *item)
178 {
179 if (!m_ScMW || m_ScMW->scriptIsRunning())
180 return;
181 //CB We shouldn't really need to process this if our item is the same one
182 //maybe we do if the item has been changed by scripter.. but that should probably
183 //set some status if so.
184 //FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
185 //if (m_item == i)
186 // return;
187
188 if (!m_doc)
189 setDoc(item->doc());
190
191 m_haveItem = false;
192 m_item = item;
193
194 clipGroups->setChecked(m_item->groupClipping());
195
196 if (((m_item->isGroup()) && (!m_item->isSingleSel)) || m_item->asSymbol())
197 setEnabled(true);
198 else
199 setEnabled(false);
200
201 m_haveItem = true;
202 }
203
handleClipping()204 void PropertiesPalette_Group::handleClipping()
205 {
206 if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
207 return;
208 m_item->setGroupClipping(clipGroups->isChecked());
209 m_item->update();
210 }
211
changeEvent(QEvent * e)212 void PropertiesPalette_Group::changeEvent(QEvent *e)
213 {
214 if (e->type() == QEvent::LanguageChange)
215 {
216 languageChange();
217 return;
218 }
219 QWidget::changeEvent(e);
220 }
221
222
languageChange()223 void PropertiesPalette_Group::languageChange()
224 {
225 retranslateUi(this);
226 }
227
unitChange()228 void PropertiesPalette_Group::unitChange()
229 {
230 if (!m_doc)
231 return;
232
233 m_unitRatio = m_doc->unitRatio();
234 m_unitIndex = m_doc->unitIndex();
235 }
236