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                           inlinepalette.cpp  -  description
9                              -------------------
10     begin                : Tue Mar 27 2012
11     copyright            : (C) 2012 by Franz Schmid
12     email                : Franz.Schmid@altmuehlnet.de
13  ***************************************************************************/
14 
15 /***************************************************************************
16  *                                                                         *
17  *   This program is free software; you can redistribute it and/or modify  *
18  *   it under the terms of the GNU General Public License as published by  *
19  *   the Free Software Foundation; either version 2 of the License, or     *
20  *   (at your option) any later version.                                   *
21  *                                                                         *
22  ***************************************************************************/
23 #include "inlinepalette.h"
24 #include <QPainter>
25 #include <QByteArray>
26 #include <QDrag>
27 #include <QMimeData>
28 
29 #include "appmodes.h"
30 #include "iconmanager.h"
31 #include "pageitem.h"
32 #include "pageitem_table.h"
33 #include "pageitem_textframe.h"
34 #include "scribus.h"
35 #include "scribusdoc.h"
36 #include "selection.h"
37 
InlineView(QWidget * parent)38 InlineView::InlineView(QWidget* parent) : QListWidget(parent)
39 {
40 	setDragEnabled(true);
41 	setViewMode(QListView::IconMode);
42 	setFlow(QListView::LeftToRight);
43 	setSortingEnabled(true);
44 	setWrapping(true);
45 	setAcceptDrops(true);
46 	setDropIndicatorShown(true);
47 	setDragDropMode(QAbstractItemView::DragDrop);
48 	setResizeMode(QListView::Adjust);
49 	setSelectionMode(QAbstractItemView::SingleSelection);
50 	setContextMenuPolicy(Qt::CustomContextMenu);
51 	delegate = new ScListWidgetDelegate(this, this);
52 	delegate->setIconOnly(true);
53 	setItemDelegate(delegate);
54 	setIconSize(QSize(50, 50));
55 }
56 
dragEnterEvent(QDragEnterEvent * e)57 void InlineView::dragEnterEvent(QDragEnterEvent *e)
58 {
59 	if (e->source() == this)
60 		e->ignore();
61 	else
62 		e->acceptProposedAction();
63 }
64 
dragMoveEvent(QDragMoveEvent * e)65 void InlineView::dragMoveEvent(QDragMoveEvent *e)
66 {
67 	if (e->source() == this)
68 		e->ignore();
69 	else
70 		e->acceptProposedAction();
71 }
72 
dropEvent(QDropEvent * e)73 void InlineView::dropEvent(QDropEvent *e)
74 {
75 	if (e->mimeData()->hasText())
76 	{
77 		e->acceptProposedAction();
78 		if (e->source() == this)
79 			return;
80 		QString text = e->mimeData()->text();
81 		if ((text.startsWith("<SCRIBUSELEM")) || (text.startsWith("SCRIBUSELEMUTF8")))
82 		{
83 			emit objectDropped(text);
84 		}
85 	}
86 	else
87 		e->ignore();
88 }
89 
startDrag(Qt::DropActions supportedActions)90  void InlineView::startDrag(Qt::DropActions supportedActions)
91  {
92 	QMimeData *mimeData = new QMimeData;
93 	int id = currentItem()->data(Qt::UserRole).toInt();
94 	QByteArray data;
95 	data.setNum(id);
96 	mimeData->setData("text/inline", data);
97 	QDrag *drag = new QDrag(this);
98 	drag->setMimeData(mimeData);
99 	drag->setPixmap(currentItem()->icon().pixmap(48, 48));
100 	drag->exec(Qt::CopyAction);
101 	clearSelection();
102 }
103 
InlinePalette(QWidget * parent)104 InlinePalette::InlinePalette( QWidget* parent) : ScDockPalette(parent, "Inline", Qt::WindowFlags())
105 {
106 	setContentsMargins(3, 3, 3, 3);
107 	setMinimumSize( QSize( 220, 240 ) );
108 	setObjectName(QString::fromLocal8Bit("Inline"));
109 	setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
110 	InlineViewWidget = new InlineView(this);
111 	InlineViewWidget->clear();
112 	setWidget( InlineViewWidget );
113 
114 	unsetDoc();
115 	m_scMW  = nullptr;
116 	currentEditedItem = -1;
117 	languageChange();
118 	connect(InlineViewWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
119 	connect(InlineViewWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(handleContextMenue(QPoint)));
120 	connect(InlineViewWidget, SIGNAL(objectDropped(QString)), this, SIGNAL(objectDropped(QString)));
121 }
122 
handleContextMenue(QPoint p)123 void InlinePalette::handleContextMenue(QPoint p)
124 {
125 	if (currentEditedItem > 0)
126 		return;
127 	QListWidgetItem *item = InlineViewWidget->itemAt(p);
128 	if (item)
129 	{
130 		actItem = item->data(Qt::UserRole).toInt();
131 		bool txFrame = false;
132 		if (!m_doc->m_Selection->isEmpty())
133 		{
134 			PageItem* selItem = m_doc->m_Selection->itemAt(0);
135 			if ((selItem->isTextFrame() || selItem->isTable()))
136 				txFrame = true;
137 		}
138 		QMenu *pmenu = new QMenu();
139 		if (txFrame)
140 		{
141 			QAction* pasteAct = pmenu->addAction( tr("Paste to Item"));
142 			connect(pasteAct, SIGNAL(triggered()), this, SLOT(handlePasteToItem()));
143 		}
144 		if ((m_doc->appMode != modeEdit) && (m_doc->appMode != modeEditTable))
145 		{
146 			QAction* editAct = pmenu->addAction( tr("Edit Item"));
147 			connect(editAct, SIGNAL(triggered()), this, SLOT(handleEditItem()));
148 		}
149 		QAction* delAct = pmenu->addAction( tr("Remove Item"));
150 		connect(delAct, SIGNAL(triggered()), this, SLOT(handleDeleteItem()));
151 		pmenu->exec(QCursor::pos());
152 		delete pmenu;
153 		actItem = -1;
154 	}
155 }
156 
handlePasteToItem()157 void InlinePalette::handlePasteToItem()
158 {
159 	PageItem* selItem = m_doc->m_Selection->itemAt(0);
160 	PageItem_TextFrame *currItem;
161 	if (selItem->isTable())
162 		currItem = selItem->asTable()->activeCell().textFrame();
163 	else
164 		currItem = selItem->asTextFrame();
165 	if (currItem->HasSel)
166 		currItem->deleteSelectedTextFromFrame();
167 	currItem->itemText.insertObject(actItem);
168 	if (selItem->isTable())
169 		selItem->asTable()->update();
170 	else
171 		currItem->update();
172 }
173 
handleEditItem()174 void InlinePalette::handleEditItem()
175 {
176 	emit startEdit(actItem);
177 }
178 
handleDoubleClick(QListWidgetItem * item)179 void InlinePalette::handleDoubleClick(QListWidgetItem *item)
180 {
181 	if (item)
182 		emit startEdit(item->data(Qt::UserRole).toInt());
183 }
184 
handleDeleteItem()185 void InlinePalette::handleDeleteItem()
186 {
187 	m_doc->removeInlineFrame(actItem);
188 	QListWidgetItem* item = InlineViewWidget->takeItem(InlineViewWidget->currentRow());
189 	delete item;
190 	InlineViewWidget->update();
191 }
192 
editingStart(int itemID)193 void InlinePalette::editingStart(int itemID)
194 {
195 	currentEditedItem = itemID;
196 	for (int a = 0; a < InlineViewWidget->count(); a++)
197 	{
198 		QListWidgetItem* item = InlineViewWidget->item(a);
199 		if (item)
200 			item->setFlags(Qt::NoItemFlags);
201 	}
202 }
203 
editingFinished()204 void InlinePalette::editingFinished()
205 {
206 	updateItemList();
207 	currentEditedItem = -1;
208 }
209 
setMainWindow(ScribusMainWindow * mw)210 void InlinePalette::setMainWindow(ScribusMainWindow *mw)
211 {
212 	m_scMW = mw;
213 	if (m_scMW == nullptr)
214 	{
215 		InlineViewWidget->clear();
216 		disconnect(m_scMW, SIGNAL(UpdateRequest(int)), this, SLOT(handleUpdateRequest(int)));
217 		return;
218 	}
219 	connect(m_scMW, SIGNAL(UpdateRequest(int)), this, SLOT(handleUpdateRequest(int)), Qt::UniqueConnection);
220 }
221 
setDoc(ScribusDoc * newDoc)222 void InlinePalette::setDoc(ScribusDoc *newDoc)
223 {
224 	if (m_scMW == nullptr)
225 		m_doc = nullptr;
226 	else
227 		m_doc = newDoc;
228 	if (m_doc == nullptr)
229 	{
230 		InlineViewWidget->clear();
231 		setEnabled(true);
232 	}
233 	else
234 	{
235 		setEnabled(!m_doc->drawAsPreview);
236 		updateItemList();
237 	}
238 }
239 
unsetDoc()240 void InlinePalette::unsetDoc()
241 {
242 	m_doc = nullptr;
243 	InlineViewWidget->clear();
244 	setEnabled(true);
245 }
246 
handleUpdateRequest(int updateFlags)247 void InlinePalette::handleUpdateRequest(int updateFlags)
248 {
249 	if (updateFlags & reqInlinePalUpdate)
250 		updateItemList();
251 }
252 
updateItemList()253 void InlinePalette::updateItemList()
254 {
255 	InlineViewWidget->clear();
256 	InlineViewWidget->setWordWrap(true);
257 	if (!m_doc)
258 		return;
259 	for (auto it = m_doc->FrameItems.begin(); it != m_doc->FrameItems.end(); ++it)
260 	{
261 		PageItem *currItem = it.value();
262 		QPixmap pm = QPixmap::fromImage(currItem->DrawObj_toImage(48));
263 		QPixmap pm2(50, 50);
264 		pm2.fill(palette().color(QPalette::Base));
265 		QPainter p;
266 		p.begin(&pm2);
267 		QBrush b(QColor(205,205,205), IconManager::instance().loadPixmap("testfill.png"));
268 		p.setBrush(b);
269 		p.drawRect(0, 0, 50, 50);
270 		p.drawPixmap(25 - pm.width() / 2, 25 - pm.height() / 2, pm);
271 		p.end();
272 		QListWidgetItem *item = new QListWidgetItem(pm2, currItem->itemName(), InlineViewWidget);
273 		item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
274 		item->setData(Qt::UserRole, currItem->inlineCharID);
275 	}
276 }
277 
changeEvent(QEvent * e)278 void InlinePalette::changeEvent(QEvent *e)
279 {
280 	if (e->type() == QEvent::LanguageChange)
281 	{
282 		languageChange();
283 	}
284 	else
285 		ScDockPalette::changeEvent(e);
286 }
287 
languageChange()288 void InlinePalette::languageChange()
289 {
290 	setWindowTitle( tr( "Inline Items" ) );
291 }
292