Diffstat (limited to 'noncore/graphics/drawpad/drawpadcanvas.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/graphics/drawpad/drawpadcanvas.cpp | 135 |
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 | |||
@@ -134,64 +134,69 @@ bool DrawPadCanvasXmlHandler::characters(const QString& ch) | |||
134 | m_pixmaps.append(pixmap); | 134 | m_pixmaps.append(pixmap); |
135 | } | 135 | } |
136 | 136 | ||
137 | return true; | 137 | return true; |
138 | } | 138 | } |
139 | 139 | ||
140 | DrawPadCanvas::DrawPadCanvas(DrawPad* drawPad, QWidget* parent, const char* name, WFlags f) | 140 | DrawPadCanvas::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 | ||
151 | DrawPadCanvas::~DrawPadCanvas() | 153 | DrawPadCanvas::~DrawPadCanvas() |
152 | { | 154 | { |
153 | } | 155 | } |
154 | 156 | ||
155 | void DrawPadCanvas::load(QIODevice* ioDevice) | 157 | void DrawPadCanvas::load(QIODevice* ioDevice) |
156 | { | 158 | { |
157 | QTextStream textStream(ioDevice); | 159 | QTextStream textStream(ioDevice); |
158 | textStream.setCodec(QTextCodec::codecForName("UTF-8")); | 160 | textStream.setCodec(QTextCodec::codecForName("UTF-8")); |
159 | 161 | ||
160 | QXmlInputSource xmlInputSource(textStream); | 162 | QXmlInputSource xmlInputSource(textStream); |
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 | ||
177 | void DrawPadCanvas::save(QIODevice* ioDevice) | 182 | void 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; |
192 | QBuffer buffer(byteArray); | 197 | QBuffer buffer(byteArray); |
193 | QImageIO imageIO(&buffer, "XPM"); | 198 | QImageIO imageIO(&buffer, "XPM"); |
194 | 199 | ||
195 | buffer.open(IO_WriteOnly); | 200 | buffer.open(IO_WriteOnly); |
196 | imageIO.setImage(image); | 201 | imageIO.setImage(image); |
197 | imageIO.write(); | 202 | imageIO.write(); |
@@ -212,128 +217,204 @@ void DrawPadCanvas::save(QIODevice* ioDevice) | |||
212 | } | 217 | } |
213 | 218 | ||
214 | textStream << "</data>" << endl; | 219 | textStream << "</data>" << endl; |
215 | textStream << " </image>" << endl; | 220 | textStream << " </image>" << endl; |
216 | } | 221 | } |
217 | 222 | ||
218 | textStream << " </images>" << endl; | 223 | textStream << " </images>" << endl; |
219 | textStream << "</drawpad>"; | 224 | textStream << "</drawpad>"; |
220 | } | 225 | } |
221 | 226 | ||
222 | QPixmap* DrawPadCanvas::currentPage() | 227 | QPixmap* DrawPadCanvas::currentPage() |
223 | { | 228 | { |
224 | return m_buffers.current(); | 229 | return m_pages.current(); |
225 | } | 230 | } |
226 | 231 | ||
227 | void DrawPadCanvas::clearAll() | 232 | void 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 | ||
237 | void DrawPadCanvas::newPage() | 248 | void 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 | ||
244 | void DrawPadCanvas::clearPage() | 260 | void 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 | ||
250 | void DrawPadCanvas::deletePage() | 266 | void 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 | |||
284 | bool DrawPadCanvas::undoEnabled() | ||
285 | { | ||
286 | return (m_pageBackups.current() != m_pageBackups.getFirst()); | ||
287 | } | ||
288 | |||
289 | bool DrawPadCanvas::redoEnabled() | ||
290 | { | ||
291 | return (m_pageBackups.current() != m_pageBackups.getLast()); | ||
260 | } | 292 | } |
261 | 293 | ||
262 | bool DrawPadCanvas::goPreviousPageEnabled() | 294 | bool DrawPadCanvas::goPreviousPageEnabled() |
263 | { | 295 | { |
264 | return (m_buffers.current() != m_buffers.getFirst()); | 296 | return (m_pages.current() != m_pages.getFirst()); |
265 | } | 297 | } |
266 | 298 | ||
267 | bool DrawPadCanvas::goNextPageEnabled() | 299 | bool DrawPadCanvas::goNextPageEnabled() |
268 | { | 300 | { |
269 | return (m_buffers.current() != m_buffers.getLast()); | 301 | return (m_pages.current() != m_pages.getLast()); |
302 | } | ||
303 | |||
304 | void DrawPadCanvas::undo() | ||
305 | { | ||
306 | *(m_pages.current()) = *(m_pageBackups.prev()); | ||
307 | repaint(); | ||
308 | |||
309 | emit pageBackupsChanged(); | ||
310 | } | ||
311 | |||
312 | void DrawPadCanvas::redo() | ||
313 | { | ||
314 | *(m_pages.current()) = *(m_pageBackups.next()); | ||
315 | repaint(); | ||
316 | |||
317 | emit pageBackupsChanged(); | ||
270 | } | 318 | } |
271 | 319 | ||
272 | void DrawPadCanvas::goFirstPage() | 320 | void 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 | ||
278 | void DrawPadCanvas::goPreviousPage() | 331 | void 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 | ||
284 | void DrawPadCanvas::goNextPage() | 342 | void 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 | ||
290 | void DrawPadCanvas::goLastPage() | 353 | void 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 | ||
296 | void DrawPadCanvas::mousePressEvent(QMouseEvent* e) | 364 | void DrawPadCanvas::mousePressEvent(QMouseEvent* e) |
297 | { | 365 | { |
298 | m_pDrawPad->drawMode()->mousePressEvent(e); | 366 | m_pDrawPad->drawMode()->mousePressEvent(e); |
299 | } | 367 | } |
300 | 368 | ||
301 | void DrawPadCanvas::mouseReleaseEvent(QMouseEvent* e) | 369 | void 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 | ||
306 | void DrawPadCanvas::mouseMoveEvent(QMouseEvent* e) | 387 | void DrawPadCanvas::mouseMoveEvent(QMouseEvent* e) |
307 | { | 388 | { |
308 | m_pDrawPad->drawMode()->mouseMoveEvent(e); | 389 | m_pDrawPad->drawMode()->mouseMoveEvent(e); |
309 | } | 390 | } |
310 | 391 | ||
311 | void DrawPadCanvas::resizeEvent(QResizeEvent* e) | 392 | void 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())); |
322 | bufferIterator.current()->resize(w, h); | 403 | bufferIterator.current()->resize(w, h); |
323 | bufferIterator.current()->fill(Qt::white); | 404 | bufferIterator.current()->fill(Qt::white); |
324 | 405 | ||
325 | bitBlt(bufferIterator.current(), 0, 0, &tmpPixmap, 0, 0, tmpPixmap.width(), tmpPixmap.height()); | 406 | bitBlt(bufferIterator.current(), 0, 0, &tmpPixmap, 0, 0, tmpPixmap.width(), tmpPixmap.height()); |
326 | } | 407 | } |
327 | } | 408 | } |
328 | 409 | ||
329 | void DrawPadCanvas::paintEvent(QPaintEvent* e) | 410 | void DrawPadCanvas::paintEvent(QPaintEvent* e) |
330 | { | 411 | { |
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 | } |