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