-rw-r--r-- | noncore/graphics/drawpad/thumbnailview.cpp | 150 | ||||
-rw-r--r-- | noncore/graphics/drawpad/thumbnailview.h | 31 |
2 files changed, 118 insertions, 63 deletions
diff --git a/noncore/graphics/drawpad/thumbnailview.cpp b/noncore/graphics/drawpad/thumbnailview.cpp index 428e008..1eadc13 100644 --- a/noncore/graphics/drawpad/thumbnailview.cpp +++ b/noncore/graphics/drawpad/thumbnailview.cpp @@ -8,149 +8,195 @@ * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "thumbnailview.h" #include "drawpad.h" #include "drawpadcanvas.h" #include "newpagedialog.h" #include "page.h" #include <qpe/resource.h> #include <qapplication.h> -#include <qheader.h> #include <qimage.h> #include <qlayout.h> #include <qmessagebox.h> #include <qtoolbutton.h> -PageListViewItem::PageListViewItem(Page* page, QListView* parent) - : QListViewItem(parent) +#define THUMBNAIL_SIZE 48 + +PageListBoxItem::PageListBoxItem(Page* page, QListBox* parent) + : QListBoxItem(parent) { m_pPage = page; QImage image = m_pPage->convertToImage(); - int previewWidth = 64; - int previewHeight = 64; + int previewWidth = THUMBNAIL_SIZE; + int previewHeight = THUMBNAIL_SIZE; float widthScale = 1.0; float heightScale = 1.0; if (previewWidth < image.width()) { widthScale = (float)previewWidth / float(image.width()); } if (previewHeight < image.height()) { heightScale = (float)previewHeight / float(image.height()); } float scale = (widthScale < heightScale ? widthScale : heightScale); - QImage previewImage = image.smoothScale((int)(image.width() * scale) , (int)(image.height() * scale)); + QImage thumbnailImage = image.smoothScale((int)(image.width() * scale) , (int)(image.height() * scale)); + + m_thumbnail.convertFromImage(thumbnailImage); - QPixmap previewPixmap; - previewPixmap.convertFromImage(previewImage); + m_titleText = QObject::tr("Title:") + " -"; + m_dimensionText = QObject::tr("Dimension:") + " " + QString::number(m_pPage->width()) + + "x" + QString::number(m_pPage->height()); + m_dateTimeText = QObject::tr("Date:") + " -"; - QPixmap pixmap(64, 64); + QColor baseColor = parent->colorGroup().base(); + int h, s, v; + baseColor.hsv(&h, &s, &v); - pixmap.fill(listView()->colorGroup().mid()); - bitBlt(&pixmap, (pixmap.width() - previewPixmap.width()) / 2, - (pixmap.height() - previewPixmap.height()) / 2, &previewPixmap); + if (v > 128) { + m_alternateColor = baseColor.dark(106); + } else if (baseColor != Qt::black) { + m_alternateColor = baseColor.light(110); + } else { + m_alternateColor = QColor(32, 32, 32); + } +} + +PageListBoxItem::~PageListBoxItem() +{ +} + +int PageListBoxItem::height(const QListBox*) const +{ + return QMAX(THUMBNAIL_SIZE + 4, QApplication::globalStrut().height()); +} + +int PageListBoxItem::width(const QListBox* lb) const +{ + QFontMetrics fontMetrics = lb->fontMetrics(); + int maxtextLength = QMAX(fontMetrics.width(m_titleText), + QMAX(fontMetrics.width(m_dimensionText), + fontMetrics.width(m_dateTimeText))); - setPixmap(0, pixmap); + return QMAX(THUMBNAIL_SIZE + maxtextLength + 8, QApplication::globalStrut().width()); } -PageListViewItem::~PageListViewItem() +void PageListBoxItem::paint(QPainter *painter) { + QRect itemRect = listBox()->itemRect(this); + + if (!selected() && (listBox()->index(this) % 2)) { + painter->fillRect(0, 0, itemRect.width(), itemRect.height(), m_alternateColor); } -Page* PageListViewItem::page() const + painter->drawPixmap(2 + (THUMBNAIL_SIZE - m_thumbnail.width()) / 2, + 2 + (THUMBNAIL_SIZE - m_thumbnail.height()) / 2, + m_thumbnail); + + QFont standardFont = painter->font(); + QFont boldFont = painter->font(); + boldFont.setBold(TRUE); + + QFontMetrics fontMetrics = painter->fontMetrics(); + QRect textRect(THUMBNAIL_SIZE + 6, 2, + itemRect.width() - THUMBNAIL_SIZE - 8, + itemRect.height() - 4); + + painter->setFont(boldFont); + painter->drawText(textRect, Qt::AlignLeft | Qt::AlignTop, m_titleText); + + painter->setFont(standardFont); + painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, m_dimensionText); + painter->drawText(textRect, Qt::AlignLeft | Qt::AlignBottom, m_dateTimeText); + + if (!selected() && !(listBox()->hasFocus() && listBox()->item(listBox()->currentItem()) == this)) { + painter->drawLine(0, itemRect.height() - 1, itemRect.width() - 1, itemRect.height() - 1); + } +} + +Page* PageListBoxItem::page() const { return m_pPage; } -PageListView::PageListView(DrawPadCanvas* drawPadCanvas, QWidget* parent, const char* name) - : QListView(parent, name) +PageListBox::PageListBox(DrawPadCanvas* drawPadCanvas, QWidget* parent, const char* name) + : QListBox(parent, name) { m_pDrawPadCanvas = drawPadCanvas; - header()->hide(); setVScrollBarMode(QScrollView::AlwaysOn); - setAllColumnsShowFocus(true); - - addColumn(tr("Thumbnail")); - addColumn(tr("Information")); updateView(); } -PageListView::~PageListView() +PageListBox::~PageListBox() { } -void PageListView::updateView() +void PageListBox::updateView() { clear(); if (m_pDrawPadCanvas) { QList<Page> pageList = m_pDrawPadCanvas->pages(); QListIterator<Page> it(pageList); for (; it.current(); ++it) { - new PageListViewItem(it.current(), this); + new PageListBoxItem(it.current(), this); } - setSorting(0, false); select(m_pDrawPadCanvas->currentPage()); } } -void PageListView::resizeEvent(QResizeEvent* e) +void PageListBox::select(Page* page) { - Q_UNUSED(e); + uint i = 0; + uint itemCount = count(); - setColumnWidth(1, contentsRect().width() - columnWidth(0) - verticalScrollBar()->width()); -} - -void PageListView::select(Page* page) -{ - PageListViewItem* item = (PageListViewItem*)firstChild(); + while (i < itemCount) { + PageListBoxItem* currentItem = (PageListBoxItem*)item(i); - while (item) { - if (item->page() == page) { - setSelected(item, true); - ensureItemVisible(item); + if (currentItem->page() == page) { + setCurrentItem(currentItem); break; } - item = (PageListViewItem*)(item->nextSibling()); + i++; } } -Page* PageListView::selected() const +Page* PageListBox::selected() const { Page* page; - PageListViewItem* item = (PageListViewItem*)selectedItem(); + PageListBoxItem* selectedItem = (PageListBoxItem*)item(currentItem()); - if (item) { - page = item->page(); + if (selectedItem) { + page = selectedItem->page(); } else { page = NULL; } return page; } ThumbnailView::ThumbnailView(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas, QWidget* parent, const char* name) : QWidget(parent, name, Qt::WType_Modal | Qt::WType_TopLevel) { inLoop = false; m_pDrawPad = drawPad; m_pDrawPadCanvas = drawPadCanvas; setCaption(tr("DrawPad - Thumbnail View")); @@ -167,47 +213,47 @@ ThumbnailView::ThumbnailView(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas, QWi QToolButton* deletePageButton = new QToolButton(this); deletePageButton->setIconSet(Resource::loadIconSet("trash")); deletePageButton->setAutoRaise(true); connect(deletePageButton, SIGNAL(clicked()), this, SLOT(deletePage())); m_pMovePageUpButton = new QToolButton(this); m_pMovePageUpButton->setIconSet(Resource::loadIconSet("up")); m_pMovePageUpButton->setAutoRaise(true); connect(m_pMovePageUpButton, SIGNAL(clicked()), this, SLOT(movePageUp())); m_pMovePageDownButton = new QToolButton(this); m_pMovePageDownButton->setIconSet(Resource::loadIconSet("down")); m_pMovePageDownButton->setAutoRaise(true); connect(m_pMovePageDownButton, SIGNAL(clicked()), this, SLOT(movePageDown())); - m_pPageListView = new PageListView(m_pDrawPadCanvas, this); - connect(m_pPageListView, SIGNAL(selectionChanged()), this, SLOT(changePage())); + m_pPageListBox = new PageListBox(m_pDrawPadCanvas, this); + connect(m_pPageListBox, SIGNAL(selectionChanged()), this, SLOT(changePage())); QVBoxLayout* mainLayout = new QVBoxLayout(this, 4, 4); QHBoxLayout* buttonLayout = new QHBoxLayout(0); buttonLayout->addWidget(newPageButton); buttonLayout->addWidget(clearPageButton); buttonLayout->addWidget(deletePageButton); buttonLayout->addStretch(); buttonLayout->addWidget(m_pMovePageUpButton); buttonLayout->addWidget(m_pMovePageDownButton); mainLayout->addLayout(buttonLayout); - mainLayout->addWidget(m_pPageListView); + mainLayout->addWidget(m_pPageListBox); updateView(); } ThumbnailView::~ThumbnailView() { hide(); } void ThumbnailView::updateView() { m_pMovePageUpButton->setEnabled(m_pDrawPadCanvas->goPreviousPageEnabled()); m_pMovePageDownButton->setEnabled(m_pDrawPadCanvas->goNextPageEnabled()); } void ThumbnailView::hide() @@ -227,73 +273,73 @@ void ThumbnailView::exec() if (!inLoop) { inLoop = true; qApp->enter_loop(); } } void ThumbnailView::newPage() { QRect rect = m_pDrawPadCanvas->contentsRect(); NewPageDialog newPageDialog(rect.width(), rect.height(), m_pDrawPad->pen().color(), m_pDrawPad->brush().color(), this); if (newPageDialog.exec() == QDialog::Accepted) { m_pDrawPadCanvas->newPage(newPageDialog.selectedWidth(), newPageDialog.selectedHeight(), newPageDialog.selectedColor()); - m_pPageListView->updateView(); + m_pPageListBox->updateView(); updateView(); } } void ThumbnailView::clearPage() { QMessageBox messageBox(tr("Clear Page"), tr("Do you want to clear\nthe selected page?"), QMessageBox::Information, QMessageBox::Yes, QMessageBox::No | QMessageBox::Escape | QMessageBox::Default, QMessageBox::NoButton, this); messageBox.setButtonText(QMessageBox::Yes, tr("Yes")); messageBox.setButtonText(QMessageBox::No, tr("No")); if (messageBox.exec() == QMessageBox::Yes) { m_pDrawPadCanvas->clearPage(); - m_pPageListView->updateView(); + m_pPageListBox->updateView(); } } void ThumbnailView::deletePage() { QMessageBox messageBox(tr("Delete Page"), tr("Do you want to delete\nthe selected page?"), QMessageBox::Information, QMessageBox::Yes, QMessageBox::No | QMessageBox::Escape | QMessageBox::Default, QMessageBox::NoButton, this); messageBox.setButtonText(QMessageBox::Yes, tr("Yes")); messageBox.setButtonText(QMessageBox::No, tr("No")); if (messageBox.exec() == QMessageBox::Yes) { m_pDrawPadCanvas->deletePage(); - m_pPageListView->updateView(); + m_pPageListBox->updateView(); updateView(); } } void ThumbnailView::movePageUp() { m_pDrawPadCanvas->movePageUp(); - m_pPageListView->updateView(); + m_pPageListBox->updateView(); updateView(); } void ThumbnailView::movePageDown() { m_pDrawPadCanvas->movePageDown(); - m_pPageListView->updateView(); + m_pPageListBox->updateView(); updateView(); } void ThumbnailView::changePage() { - m_pDrawPadCanvas->selectPage(m_pPageListView->selected()); + m_pDrawPadCanvas->selectPage(m_pPageListBox->selected()); updateView(); } diff --git a/noncore/graphics/drawpad/thumbnailview.h b/noncore/graphics/drawpad/thumbnailview.h index eb748fa..88c3b27 100644 --- a/noncore/graphics/drawpad/thumbnailview.h +++ b/noncore/graphics/drawpad/thumbnailview.h @@ -1,67 +1,76 @@ /*************************************************************************** * * * DrawPad - a drawing program for Opie Environment * * * * (C) 2002 by S. Prud'homme <prudhomme@laposte.net> * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef THUMBNAILVIEW_H #define THUMBNAILVIEW_H +#include <qlistbox.h> #include <qwidget.h> -#include <qlistview.h> class DrawPad; class DrawPadCanvas; class Page; class QToolButton; -class PageListViewItem : public QListViewItem +class PageListBoxItem : public QListBoxItem { public: - PageListViewItem(Page* page, QListView* parent); - ~PageListViewItem(); + PageListBoxItem(Page* page, QListBox* parent); + ~PageListBoxItem(); + + int height(const QListBox* lb) const; + int width(const QListBox* lb) const; + void paint(QPainter *painter); Page* page() const; private: Page* m_pPage; + + QPixmap m_thumbnail; + + QString m_titleText; + QString m_dimensionText; + QString m_dateTimeText; + + QColor m_alternateColor; }; -class PageListView : public QListView +class PageListBox : public QListBox { public: - PageListView(DrawPadCanvas* drawPadCanvas, QWidget* parent = 0, const char* name = 0); - ~PageListView(); + PageListBox(DrawPadCanvas* drawPadCanvas, QWidget* parent = 0, const char* name = 0); + ~PageListBox(); void updateView(); void select(Page* page); Page* selected() const; -protected: - void resizeEvent(QResizeEvent* e); - private: DrawPadCanvas* m_pDrawPadCanvas; }; class ThumbnailView : public QWidget { Q_OBJECT public: ThumbnailView(DrawPad* drawPad, DrawPadCanvas* drawPadCanvas, QWidget* parent = 0, const char* name = 0); ~ThumbnailView(); void updateView(); void hide(); void exec(); @@ -70,20 +79,20 @@ public slots: void newPage(); void clearPage(); void deletePage(); void movePageUp(); void movePageDown(); void changePage(); private: bool inLoop; DrawPad* m_pDrawPad; DrawPadCanvas* m_pDrawPadCanvas; QToolButton* m_pMovePageUpButton; QToolButton* m_pMovePageDownButton; - PageListView* m_pPageListView; + PageListBox* m_pPageListBox; }; #endif // THUMBNAILVIEW_H |