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