summaryrefslogtreecommitdiff
path: root/noncore/graphics/drawpad/drawpadcanvas.cpp
Unidiff
Diffstat (limited to 'noncore/graphics/drawpad/drawpadcanvas.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/graphics/drawpad/drawpadcanvas.cpp135
1 files changed, 108 insertions, 27 deletions
diff --git a/noncore/graphics/drawpad/drawpadcanvas.cpp b/noncore/graphics/drawpad/drawpadcanvas.cpp
index f02f478..08f7b66 100644
--- a/noncore/graphics/drawpad/drawpadcanvas.cpp
+++ b/noncore/graphics/drawpad/drawpadcanvas.cpp
@@ -140,15 +140,17 @@ bool DrawPadCanvasXmlHandler::characters(const QString& ch)
140DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name, WFlags f) 140DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name, WFlags f)
141 : QWidget(parent, name, f) 141 : QWidget(parent, name, f)
142{ 142{
143 setBackgroundMode(QWidget::PaletteBase); 143 setBackgroundMode(QWidget::PaletteBase);
144 144
145 m_pDrawPad = drawPad; 145 m_pDrawPad = drawPad;
146 m_buffers.setAutoDelete(true); 146 m_pages.setAutoDelete(true);
147 m_buffers.append(new QPixmap(width(), height())); 147 m_pages.append(new QPixmap(width(), height()));
148 m_buffers.current()->fill(Qt::white); 148 m_pages.current()->fill(Qt::white);
149 m_pageBackups.setAutoDelete(true);
150 m_pageBackups.append(new QPixmap(*(m_pages.current())));
149} 151}
150 152
151DrawPadCanvas::~DrawPadCanvas() 153DrawPadCanvas::~DrawPadCanvas()
152{ 154{
153} 155}
154 156
@@ -161,31 +163,34 @@ void DrawPadCanvas::load(QIODevice* ioDevice)
161 QXmlSimpleReader xmlSimpleReader; 163 QXmlSimpleReader xmlSimpleReader;
162 DrawPadCanvasXmlHandler drawPadCanvasXmlHandler; 164 DrawPadCanvasXmlHandler drawPadCanvasXmlHandler;
163 165
164 xmlSimpleReader.setContentHandler(&drawPadCanvasXmlHandler); 166 xmlSimpleReader.setContentHandler(&drawPadCanvasXmlHandler);
165 xmlSimpleReader.parse(xmlInputSource); 167 xmlSimpleReader.parse(xmlInputSource);
166 168
167 m_buffers = drawPadCanvasXmlHandler.pixmaps(); 169 m_pages = drawPadCanvasXmlHandler.pixmaps();
168 170
169 if (m_buffers.isEmpty()) { 171 if (m_pages.isEmpty()) {
170 m_buffers.append(new QPixmap(width(), height())); 172 m_pages.append(new QPixmap(width(), height()));
171 m_buffers.current()->fill(Qt::white); 173 m_pages.current()->fill(Qt::white);
172 } 174 }
173 175
176 m_pageBackups.clear();
177 m_pageBackups.append(new QPixmap(*(m_pages.current())));
178
174 repaint(); 179 repaint();
175} 180}
176 181
177void DrawPadCanvas::save(QIODevice* ioDevice) 182void DrawPadCanvas::save(QIODevice* ioDevice)
178{ 183{
179 QTextStream textStream(ioDevice); 184 QTextStream textStream(ioDevice);
180 textStream.setCodec(QTextCodec::codecForName("UTF-8")); 185 textStream.setCodec(QTextCodec::codecForName("UTF-8"));
181 186
182 textStream << "<drawpad>" << endl; 187 textStream << "<drawpad>" << endl;
183 textStream << " <images>" << endl; 188 textStream << " <images>" << endl;
184 189
185 QListIterator<QPixmap> bufferIterator(m_buffers); 190 QListIterator<QPixmap> bufferIterator(m_pages);
186 191
187 for (bufferIterator.toFirst(); bufferIterator.current() != 0; ++bufferIterator) { 192 for (bufferIterator.toFirst(); bufferIterator.current() != 0; ++bufferIterator) {
188 textStream << " <image>" << endl; 193 textStream << " <image>" << endl;
189 194
190 QImage image = bufferIterator.current()->convertToImage(); 195 QImage image = bufferIterator.current()->convertToImage();
191 QByteArray byteArray; 196 QByteArray byteArray;
@@ -218,104 +223,180 @@ void DrawPadCanvas::save(QIODevice* ioDevice)
218 textStream << " </images>" << endl; 223 textStream << " </images>" << endl;
219 textStream << "</drawpad>"; 224 textStream << "</drawpad>";
220} 225}
221 226
222QPixmap* DrawPadCanvas::currentPage() 227QPixmap* DrawPadCanvas::currentPage()
223{ 228{
224 return m_buffers.current(); 229 return m_pages.current();
225} 230}
226 231
227void DrawPadCanvas::clearAll() 232void DrawPadCanvas::clearAll()
228{ 233{
229 m_buffers.clear(); 234 m_pages.clear();
235
236 m_pages.append(new QPixmap(width(), height()));
237 m_pages.current()->fill(Qt::white);
230 238
231 m_buffers.append(new QPixmap(width(), height())); 239 m_pageBackups.clear();
232 m_buffers.current()->fill(Qt::white); 240 m_pageBackups.append(new QPixmap(*(m_pages.current())));
233 241
234 repaint(); 242 repaint();
243
244 emit pagesChanged();
245 emit pageBackupsChanged();
235} 246}
236 247
237void DrawPadCanvas::newPage() 248void DrawPadCanvas::newPage()
238{ 249{
239 m_buffers.insert(m_buffers.at() + 1, new QPixmap(width(), height())); 250 m_pages.insert(m_pages.at() + 1, new QPixmap(width(), height()));
240 m_buffers.current()->fill(Qt::white); 251 m_pages.current()->fill(Qt::white);
252 m_pageBackups.clear();
253 m_pageBackups.append(new QPixmap(*(m_pages.current())));
241 repaint(); 254 repaint();
255
256 emit pagesChanged();
257 emit pageBackupsChanged();
242} 258}
243 259
244void DrawPadCanvas::clearPage() 260void DrawPadCanvas::clearPage()
245{ 261{
246 m_buffers.current()->fill(Qt::white); 262 m_pages.current()->fill(Qt::white);
247 repaint(); 263 repaint();
248} 264}
249 265
250void DrawPadCanvas::deletePage() 266void DrawPadCanvas::deletePage()
251{ 267{
252 m_buffers.remove(m_buffers.current()); 268 m_pages.remove(m_pages.current());
253 269
254 if (m_buffers.isEmpty()) { 270 if (m_pages.isEmpty()) {
255 m_buffers.append(new QPixmap(width(), height())); 271 m_pages.append(new QPixmap(width(), height()));
256 m_buffers.current()->fill(Qt::white); 272 m_pages.current()->fill(Qt::white);
257 } 273 }
258 274
275 m_pageBackups.clear();
276 m_pageBackups.append(new QPixmap(*(m_pages.current())));
277
259 repaint(); 278 repaint();
279
280 emit pagesChanged();
281 emit pageBackupsChanged();
282}
283
284bool DrawPadCanvas::undoEnabled()
285{
286 return (m_pageBackups.current() != m_pageBackups.getFirst());
287}
288
289bool DrawPadCanvas::redoEnabled()
290{
291 return (m_pageBackups.current() != m_pageBackups.getLast());
260} 292}
261 293
262bool DrawPadCanvas::goPreviousPageEnabled() 294bool DrawPadCanvas::goPreviousPageEnabled()
263{ 295{
264 return (m_buffers.current() != m_buffers.getFirst()); 296 return (m_pages.current() != m_pages.getFirst());
265} 297}
266 298
267bool DrawPadCanvas::goNextPageEnabled() 299bool DrawPadCanvas::goNextPageEnabled()
268{ 300{
269 return (m_buffers.current() != m_buffers.getLast()); 301 return (m_pages.current() != m_pages.getLast());
302}
303
304void DrawPadCanvas::undo()
305{
306 *(m_pages.current()) = *(m_pageBackups.prev());
307 repaint();
308
309 emit pageBackupsChanged();
310}
311
312void DrawPadCanvas::redo()
313{
314 *(m_pages.current()) = *(m_pageBackups.next());
315 repaint();
316
317 emit pageBackupsChanged();
270} 318}
271 319
272void DrawPadCanvas::goFirstPage() 320void DrawPadCanvas::goFirstPage()
273{ 321{
274 m_buffers.first(); 322 m_pages.first();
323 m_pageBackups.clear();
324 m_pageBackups.append(new QPixmap(*(m_pages.current())));
275 repaint(); 325 repaint();
326
327 emit pagesChanged();
328 emit pageBackupsChanged();
276} 329}
277 330
278void DrawPadCanvas::goPreviousPage() 331void DrawPadCanvas::goPreviousPage()
279{ 332{
280 m_buffers.prev(); 333 m_pages.prev();
334 m_pageBackups.clear();
335 m_pageBackups.append(new QPixmap(*(m_pages.current())));
281 repaint(); 336 repaint();
337
338 emit pagesChanged();
339 emit pageBackupsChanged();
282} 340}
283 341
284void DrawPadCanvas::goNextPage() 342void DrawPadCanvas::goNextPage()
285{ 343{
286 m_buffers.next(); 344 m_pages.next();
345 m_pageBackups.clear();
346 m_pageBackups.append(new QPixmap(*(m_pages.current())));
287 repaint(); 347 repaint();
348
349 emit pagesChanged();
350 emit pageBackupsChanged();
288} 351}
289 352
290void DrawPadCanvas::goLastPage() 353void DrawPadCanvas::goLastPage()
291{ 354{
292 m_buffers.last(); 355 m_pages.last();
356 m_pageBackups.clear();
357 m_pageBackups.append(new QPixmap(*(m_pages.current())));
293 repaint(); 358 repaint();
359
360 emit pagesChanged();
361 emit pageBackupsChanged();
294} 362}
295 363
296void DrawPadCanvas::mousePressEvent(QMouseEvent* e) 364void DrawPadCanvas::mousePressEvent(QMouseEvent* e)
297{ 365{
298 m_pDrawPad->drawMode()->mousePressEvent(e); 366 m_pDrawPad->drawMode()->mousePressEvent(e);
299} 367}
300 368
301void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) 369void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e)
302{ 370{
303 m_pDrawPad->drawMode()->mouseReleaseEvent(e); 371 m_pDrawPad->drawMode()->mouseReleaseEvent(e);
372
373 QPixmap* currentBackup = m_pageBackups.current();
374 while (m_pageBackups.last() != currentBackup) {
375 m_pageBackups.removeLast();
376 }
377
378 while (m_pageBackups.count() >= (5 + 1)) {
379 m_pageBackups.removeFirst();
380 }
381
382 m_pageBackups.append(new QPixmap(*(m_pages.current())));
383
384 emit pageBackupsChanged();
304} 385}
305 386
306void DrawPadCanvas::mouseMoveEvent(QMouseEvent* e) 387void DrawPadCanvas::mouseMoveEvent(QMouseEvent* e)
307{ 388{
308 m_pDrawPad->drawMode()->mouseMoveEvent(e); 389 m_pDrawPad->drawMode()->mouseMoveEvent(e);
309} 390}
310 391
311void DrawPadCanvas::resizeEvent(QResizeEvent* e) 392void DrawPadCanvas::resizeEvent(QResizeEvent* e)
312{ 393{
313 QWidget::resizeEvent(e); 394 QWidget::resizeEvent(e);
314 395
315 QListIterator<QPixmap> bufferIterator(m_buffers); 396 QListIterator<QPixmap> bufferIterator(m_pages);
316 397
317 for (bufferIterator.toFirst(); bufferIterator.current() != 0; ++bufferIterator) { 398 for (bufferIterator.toFirst(); bufferIterator.current() != 0; ++bufferIterator) {
318 int w = width() > bufferIterator.current()->width() ? width() : bufferIterator.current()->width(); 399 int w = width() > bufferIterator.current()->width() ? width() : bufferIterator.current()->width();
319 int h = height() > bufferIterator.current()->height() ? height() : bufferIterator.current()->height(); 400 int h = height() > bufferIterator.current()->height() ? height() : bufferIterator.current()->height();
320 401
321 QPixmap tmpPixmap(*(bufferIterator.current())); 402 QPixmap tmpPixmap(*(bufferIterator.current()));
@@ -331,9 +412,9 @@ void DrawPadCanvas::paintEvent(QPaintEvent* e)
331 QWidget::paintEvent(e); 412 QWidget::paintEvent(e);
332 413
333 QArray<QRect> rects = e->region().rects(); 414 QArray<QRect> rects = e->region().rects();
334 415
335 for (uint i = 0; i < rects.count(); i++) { 416 for (uint i = 0; i < rects.count(); i++) {
336 QRect r = rects[i]; 417 QRect r = rects[i];
337 bitBlt(this, r.x(), r.y(), m_buffers.current(), r.x(), r.y(), r.width(), r.height()); 418 bitBlt(this, r.x(), r.y(), m_pages.current(), r.x(), r.y(), r.width(), r.height());
338 } 419 }
339} 420}