00001 #include "thumbnailscene.h"
00002 #include "common.h"
00003
00004 ThumbnailScene::ThumbnailScene() :
00005 cols(2), spacing(6), selectedIdx(-1),
00006 defaultItemIcon(":/images/default-page.png"),
00007 insertionPoint(),
00008 maxWidth(0), maxHeight(0)
00009 {
00010 qDebug("ThumbnailScene constructor");
00011 setBackgroundBrush(QBrush(Qt::darkGray));
00012 QPen thickRed(Qt::red);
00013 thickRed.setWidth(4);
00014 insertionPoint.setPen(thickRed);
00015 }
00016
00017 void ThumbnailScene::resize(int numItems)
00018 {
00019 foreach(ThumbnailItem* item, items)
00020 delete item;
00021 items.resize(numItems);
00022 col = 0;
00023 row = 0;
00024 maxWidth = 0;
00025 maxHeight = 0;
00026 selectedIdx = -1;
00027 }
00028
00029 void ThumbnailScene::add(int idx, QImage pm, QString label)
00030 {
00031 ThumbnailItem* item = NULL;
00032
00033 if (pm.width() < 1)
00034 {
00035 item = new ThumbnailItem(defaultItemIcon, idx, label);
00036 }
00037 else
00038 {
00039 QPixmap pxm = QPixmap::fromImage(pm);
00040 item = new ThumbnailItem(pxm, idx, label);
00041 }
00042 addItem(item);
00043 if (item->width() > maxWidth)
00044 maxWidth = item->width();
00045 if (item->height() > maxHeight)
00046 maxHeight = item->height();
00047 items[idx] = item;
00048 item->setPos(col++ * maxWidth + spacing, row * maxHeight + spacing);
00049 if (col >= cols)
00050 {
00051 col = 0;
00052 ++row;
00053 }
00054 if (selectedIdx < 0)
00055 selectedIdx = idx;
00056
00057 }
00058
00059 void ThumbnailScene::layout(int width, int height)
00060 {
00061 col = 0;
00062 row = 0;
00063 if (width > 0 && maxWidth > 0)
00064 cols = (width + spacing) / (maxWidth + spacing);
00065
00066 int i = 0;
00067 foreach(ThumbnailItem* item, items)
00068 {
00069 if (col >= cols)
00070 {
00071 col = 0;
00072 ++row;
00073 }
00074 item->setPos(col++ * (maxWidth + spacing) + (maxWidth - item->width()) / 2,
00075 row * (maxHeight + spacing) + (maxHeight - item->height()) / 2);
00076
00077 ++i;
00078 }
00079 QRectF sceneBounds = sceneRect();
00080 if (height > 0)
00081 sceneBounds.setHeight(MAX(height, (row + 1) * (maxHeight + spacing)));
00082 if (width > 0)
00083 sceneBounds.setWidth(width);
00084 setSceneRect(sceneBounds);
00085 }
00086
00087 void ThumbnailScene::currentPage(int idx)
00088 {
00089 selectedIdx = idx;
00090 update(sceneRect());
00091 }
00092
00093 void ThumbnailScene::dragEnterEvent ( QGraphicsSceneDragDropEvent * ev )
00094 {
00095 qDebug("dragEnterEvent at %f, %f", ev->scenePos().x(), ev->scenePos().y());
00096 ev->setAccepted(true);
00097 addItem(&insertionPoint);
00098 }
00099
00100 void ThumbnailScene::dragMoveEvent ( QGraphicsSceneDragDropEvent * ev )
00101 {
00102
00103 QPoint insColRow = insertionIdx(ev->scenePos());
00104 int x = (insColRow.x() + 1) * (maxWidth + spacing);
00105 if (x == 0)
00106 x = insertionPoint.pen().width() / 2;
00107 else
00108 x -= insertionPoint.pen().width() / 2;
00109 int y = insColRow.y() * (maxHeight + spacing) + (spacing / 2);
00110
00111 insertionPoint.setLine(x, y, x, y + maxHeight);
00112 int insIdx = insColRow.y() * cols + insColRow.x();
00113 if (insIdx >= 0)
00114 {
00115 if (insIdx + 1 < items.size())
00116 emit statusMessage(QString("moving between %1 and %2").arg(items[insIdx]->pageIdx).arg(items[insIdx + 1]->pageIdx));
00117 else
00118 emit statusMessage(QString("moving to end"));
00119 }
00120 else
00121 emit statusMessage("moving to beginning");
00122 }
00123
00124 void ThumbnailScene::dropEvent ( QGraphicsSceneDragDropEvent * ev )
00125 {
00126 qDebug("dropEvent at %f, %f", ev->scenePos().x(), ev->scenePos().y());
00127 removeItem(&insertionPoint);
00128 emit statusClear();
00129 QPoint insColRow = insertionIdx(ev->scenePos());
00130 QList<QGraphicsItem *> sel = selectedItems();
00131 qSort(sel.begin(), sel.end(), lessThan);
00132 int insIdx = insColRow.y() * cols + insColRow.x() + 1;
00133 foreach (QGraphicsItem* item, sel)
00134 {
00135 int oldIdx = items.indexOf((ThumbnailItem*)item);
00136 if (oldIdx < 0)
00137 qWarning("item being dropped is not in the set of thumbnails!");
00138 else
00139 items.remove(oldIdx);
00140 if (oldIdx < insIdx)
00141 --insIdx;
00142 }
00143 foreach (QGraphicsItem* item, sel)
00144 items.insert(insIdx++, (ThumbnailItem*)item);
00145 layout();
00146 }
00147
00148 QPoint ThumbnailScene::insertionIdx(QPointF pos)
00149 {
00150 int row = (int)(pos.y() / (maxHeight + spacing));
00151 int xadj = (int)(pos.x() - ((maxWidth + spacing) / 2));
00152 int col = (xadj < 0 ? -1 : xadj / maxWidth);
00153 return QPoint(col, row);
00154 }
00155
00156 QString ThumbnailScene::pdftkCatPageRanges()
00157 {
00158 QString ret;
00159 int last = -1;
00160 int rangeStart = -1;
00161 foreach(ThumbnailItem* item, items)
00162 {
00163 if (last < 0)
00164 last = item->pageIdx;
00165 if (rangeStart < 0)
00166 rangeStart = last;
00167 if (item->pageIdx > 0 && item->pageIdx != last + 1)
00168 {
00169 if (rangeStart == last)
00170 ret += QString(" A%1").arg(rangeStart);
00171 else
00172 ret += QString(" A%1-%2").arg(rangeStart).arg(last);
00173 rangeStart = -1;
00174 }
00175 last = item->pageIdx;
00176 }
00177 if (!ret.isEmpty())
00178 {
00179 if (rangeStart == last || rangeStart < 0)
00180 ret += QString(" A%1").arg(last);
00181 else
00182 ret += QString(" A%1-%2").arg(rangeStart).arg(last);
00183 }
00184 return ret;
00185 }