Changeset 47 in projects for punch-card/punch-card-editor/src/app/navigator.cc
- Timestamp:
- Dec 9, 2009, 2:56:54 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
punch-card/punch-card-editor/src/app/navigator.cc
r44 r47 2 2 3 3 Navigator::Navigator(EditorWindow* parent) : QDockWidget("Cards", parent), main(parent) { 4 view = new QListView(this); 5 model = new DeckModel(this); 6 7 model->setDeck(main->deck); 4 model = new DeckModel(main); // ja, das ist bloed. 5 view = new DeckListView(this); 6 // mach das model selbst: 7 //model->setDeck(main->deck); 8 // darf die view nicht selbst machen (erst nach model erstellt wird!) 8 9 view->setModel(model); 9 10 // view einrichten11 view->setViewMode(QListView::IconMode);12 view->setIconSize( model->getIconSize() );13 view->setSpacing(20);14 view->setSelectionMode(QAbstractItemView::ContiguousSelection);15 view->setDragEnabled(true);16 view->setAcceptDrops(true);17 view->setDropIndicatorShown(true);18 view->setMovement(QListView::Snap);19 view->setWrapping(false);20 view->setFlow(QListView::TopToBottom);21 10 22 11 setWidget(view); … … 26 15 connect(view, SIGNAL(activated(QModelIndex)), this, SLOT(cardSelected_translator(QModelIndex))); 27 16 connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(setFlowOnLocationChange(Qt::DockWidgetArea))); 17 connect(main, SIGNAL(contentsChanged(DeckIndex,DeckIndex)), model, SLOT(contentsChanged(DeckIndex,DeckIndex))); 18 19 // Beim Klick auf Karte alle Views aktualisieren 20 connect(this, SIGNAL(cardSelected(DeckIndex)), main, SLOT(setCard(DeckIndex))); 21 connect(main, SIGNAL(cardSelected(DeckIndex)), this, SLOT(setCard(DeckIndex))); 22 23 // Beim Laden/Entladen eines Decks Model und View an/ausschalten 24 connect(main, SIGNAL(fileOpened(bool)), this, SLOT(setVisible(bool))); 25 connect(main, SIGNAL(fileOpened(bool)), model, SLOT(setDeck(bool))); 26 } 27 28 DeckListView::DeckListView(Navigator* nav) : QListView(nav), navigator(nav) { 29 Q_ASSERT( navigator->model != 0); 30 setModel( navigator->model ); 31 32 // view einrichten 33 setViewMode(QListView::IconMode); 34 setIconSize( navigator->model->getIconSize() ); 35 setSpacing(20); 36 //setSelectionMode(QAbstractItemView::ContiguousSelection); 37 setSelectionMode(QAbstractItemView::SingleSelection); 38 setDragEnabled(true); 39 setAcceptDrops(true); 40 setDropIndicatorShown(true); 41 setMovement(QListView::Snap); 42 setWrapping(false); 43 setFlow(QListView::TopToBottom); 28 44 } 29 45 … … 41 57 break; 42 58 } 59 // in jedem Fall Icon-Groesse neu berechnen (etwas quick & dirty) 60 resizeEvent(0); 43 61 } 44 62 45 void Navigator::setCard(int i) { 46 view->scrollTo( model->index(i), QAbstractItemView::PositionAtCenter); 63 void Navigator::setCard(DeckIndex i) { 64 if(i.isValid()) 65 view->scrollTo( model->index(i), QAbstractItemView::PositionAtCenter); 66 else 67 qDebug("Navigator invalid scroll to %d", (int)i); 47 68 } 48 69 49 void Navigator::resizeEvent(QResizeEvent* event) { 50 qDebug("Alte size: %d, %d, neue: %d, %d", event->oldSize().width(), event->oldSize().height(), 51 event->size().width(), event->size().height()); 52 qDebug("Icon size war: %d, %d", view->iconSize().width(), view->iconSize().height()); 53 qDebug("Icon size war: %d, %d", model->getIconSize().width(), model->getIconSize().height()); 54 view->setIconSize( 55 model->getIconSize() * 56 ( (float)event->size().width() / (float)event->oldSize().width() ) 70 void Navigator::resizeEvent(QResizeEvent*) { 71 if(view->flow() == QListView::TopToBottom) { 72 model->setIconSizeByWidth( view->viewport()->contentsRect().width() - 40 ); 73 view->setIconSize( model->getIconSize() ); 74 } else if(view->flow() == QListView::LeftToRight) { 75 // bei Hoehe ist halt noch das Label irgendwie dabei -- schwierig zu berechnen 76 model->setIconSizeByHeight( view->viewport()->contentsRect().height() - 80); 77 view->setIconSize( model->getIconSize() ); 78 } 79 } 80 81 void DeckListView::dragEnterEvent(QDragEnterEvent *event) { 82 if(event->mimeData()->hasFormat("binary/x-punch-card")) 83 event->accept(); 84 else 85 event->ignore(); 86 } 87 88 void DeckListView::dragMoveEvent(QDragMoveEvent* event) { 89 if(event->mimeData()->hasFormat("binary/x-punch-card")) { 90 event->setDropAction(Qt::MoveAction); 91 event->accept(); 92 } else { 93 event->ignore(); 94 } 95 } 96 97 void DeckListView::dropEvent(QDropEvent* event) { 98 /* 99 if(event->mimeData()->hasFormat("binary/x-punch-card")) { 100 QByteArray piece = event->mimeData()->data("binary/x-punch-card"); 101 QDataStream dataStream(&piece, QIODevice::ReadOnly); 102 Card card; 103 dataStream >> card; 104 105 QByteArray pieceData = event->mimeData()->data("image/x-puzzle-piece"); 106 QDataStream dataStream(&pieceData, QIODevice::ReadOnly); 107 QPixmap pixmap; 108 QPoint location; 109 dataStream >> pixmap >> location; 110 111 addPiece(pixmap, location); 112 113 event->setDropAction(Qt::MoveAction); 114 event->accept(); 115 } else 116 event->ignore(); 117 */ 118 event->ignore(); 119 } 120 121 void DeckListView::startDrag(Qt::DropActions /* supportedActions */) { 122 qDebug("Started Drag and Drop handler"); 123 Q_ASSERT(navigator->main != 0); 124 Q_ASSERT(navigator->main->deck != 0); 125 DeckIndex i = navigator->main->deck->createIndex( 126 currentIndex().row() 57 127 ); 58 model->setIconSize( ( (float)event->size().width() / (float)event->oldSize().width() ) ); 59 qDebug("Icon size ist: %d, %d", view->iconSize().width(), view->iconSize().height()); 128 129 if(!i.isValid()) { 130 qDebug() << "Invalid index for drag&drop start: " << i; 131 return; 132 } 133 134 QPixmap pixmap = currentIndex().data(Qt::DecorationRole).value<QPixmap>(); 135 136 QByteArray itemData; 137 // todo: Lochkarte praepareieren in verschiedenen Formaten 138 139 QMimeData *mimeData = new QMimeData; 140 mimeData->setData("binary/x-punch-card", itemData); 141 142 QDrag *drag = new QDrag(this); 143 drag->setMimeData(mimeData); 144 drag->setHotSpot(QPoint( navigator->model->getIconSize().width()/2, 145 navigator->model->getIconSize().height()/2)); 146 drag->setPixmap(pixmap); 147 148 if(drag->exec(Qt::MoveAction) == Qt::MoveAction) { 149 qDebug() << "Karte wurde verschoben von Index " << i; 150 // teil hier loeschen und so. 151 } 152 153 /* 154 QListWidgetItem *item = currentItem(); 155 156 QByteArray itemData; 157 QDataStream dataStream(&itemData, QIODevice::WriteOnly); 158 QPixmap pixmap = qVariantValue<QPixmap>(item->data(Qt::UserRole)); 159 QPoint location = item->data(Qt::UserRole+1).toPoint(); 160 161 dataStream << pixmap << location; 162 163 QMimeData *mimeData = new QMimeData; 164 mimeData->setData("image/x-puzzle-piece", itemData); 165 166 QDrag *drag = new QDrag(this); 167 drag->setMimeData(mimeData); 168 drag->setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2)); 169 drag->setPixmap(pixmap); 170 171 if (drag->exec(Qt::MoveAction) == Qt::MoveAction) 172 delete takeItem(row(item)); 173 */ 60 174 }
Note: See TracChangeset
for help on using the changeset viewer.