75 chooseMap->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); |
75 chooseMap->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); |
76 m_mapModel = DataManager::instance().mapModel(); |
76 m_mapModel = DataManager::instance().mapModel(); |
77 chooseMap->setEditable(false); |
77 chooseMap->setEditable(false); |
78 chooseMap->setModel(m_mapModel); |
78 chooseMap->setModel(m_mapModel); |
79 |
79 |
80 // update model views after model changes (to e.g. re-adjust separators) |
|
81 connect(&DataManager::instance(), SIGNAL(updated()), this, SLOT(updateModelViews())); |
|
82 |
|
83 mapLayout->addWidget(chooseMap, 1, 1); |
80 mapLayout->addWidget(chooseMap, 1, 1); |
84 |
81 |
85 QLabel * lblMap = new QLabel(tr("Map"), mapWidget); |
82 QLabel * lblMap = new QLabel(tr("Map"), mapWidget); |
86 mapLayout->addWidget(lblMap, 1, 0); |
83 mapLayout->addWidget(lblMap, 1, 0); |
87 |
84 |
181 setRandomSeed(); |
178 setRandomSeed(); |
182 setRandomTheme(); |
179 setRandomTheme(); |
183 |
180 |
184 chooseMap->setCurrentIndex(0); |
181 chooseMap->setCurrentIndex(0); |
185 mapChanged(0); |
182 mapChanged(0); |
186 connect(chooseMap, SIGNAL(currentIndexChanged(int)), this, SLOT(mapChanged(int))); |
183 // use signal "activated" rather than currentIndexChanged |
187 |
184 // because index is somtimes changed a few times in a row programmatically |
188 updateModelViews(); |
185 connect(chooseMap, SIGNAL(activated(int)), this, SLOT(mapChanged(int))); |
|
186 |
|
187 // update model views after model changes (to e.g. re-adjust separators) |
|
188 connect(&DataManager::instance(), SIGNAL(updated()), this, SLOT(updateModelViews())); |
189 } |
189 } |
190 |
190 |
191 void HWMapContainer::setImage(const QImage newImage) |
191 void HWMapContainer::setImage(const QImage newImage) |
192 { |
192 { |
193 QPixmap px(m_previewSize); |
193 QPixmap px(m_previewSize); |
211 hhLimit = newHHLimit; |
211 hhLimit = newHHLimit; |
212 } |
212 } |
213 |
213 |
214 void HWMapContainer::mapChanged(int index) |
214 void HWMapContainer::mapChanged(int index) |
215 { |
215 { |
|
216 if (chooseMap->currentIndex() != index) |
|
217 chooseMap->setCurrentIndex(index); |
|
218 |
216 if (index < 0) |
219 if (index < 0) |
|
220 { |
|
221 m_mapInfo.type = MapModel::Invalid; |
|
222 updatePreview(); |
217 return; |
223 return; |
|
224 } |
218 |
225 |
219 Q_ASSERT(chooseMap->itemData(index, Qt::UserRole + 1).canConvert<MapModel::MapInfo>()); |
226 Q_ASSERT(chooseMap->itemData(index, Qt::UserRole + 1).canConvert<MapModel::MapInfo>()); |
220 m_mapInfo = chooseMap->itemData(index, Qt::UserRole + 1).value<MapModel::MapInfo>(); |
227 m_mapInfo = chooseMap->itemData(index, Qt::UserRole + 1).value<MapModel::MapInfo>(); |
221 m_curMap = chooseMap->currentText(); |
228 m_curMap = m_mapInfo.name; |
222 |
229 |
223 switch(m_mapInfo.type) |
230 switch(m_mapInfo.type) |
224 { |
231 { |
225 case MapModel::GeneratedMap: |
232 case MapModel::GeneratedMap: |
226 mapgen = MAPGEN_REGULAR; |
233 mapgen = MAPGEN_REGULAR; |
227 updatePreview(); |
|
228 gbThemes->show(); |
234 gbThemes->show(); |
229 lblFilter->show(); |
235 lblFilter->show(); |
230 cbTemplateFilter->show(); |
236 cbTemplateFilter->show(); |
231 maze_size_label->hide(); |
237 maze_size_label->hide(); |
232 cbMazeSize->hide(); |
238 cbMazeSize->hide(); |
233 break; |
239 break; |
234 case MapModel::GeneratedMaze: |
240 case MapModel::GeneratedMaze: |
235 mapgen = MAPGEN_MAZE; |
241 mapgen = MAPGEN_MAZE; |
236 updatePreview(); |
|
237 gbThemes->show(); |
242 gbThemes->show(); |
238 lblFilter->hide(); |
243 lblFilter->hide(); |
239 cbTemplateFilter->hide(); |
244 cbTemplateFilter->hide(); |
240 maze_size_label->show(); |
245 maze_size_label->show(); |
241 cbMazeSize->show(); |
246 cbMazeSize->show(); |
242 break; |
247 break; |
243 case MapModel::HandDrawnMap: |
248 case MapModel::HandDrawnMap: |
244 mapgen = MAPGEN_DRAWN; |
249 mapgen = MAPGEN_DRAWN; |
245 updatePreview(); |
|
246 gbThemes->show(); |
250 gbThemes->show(); |
247 lblFilter->hide(); |
251 lblFilter->hide(); |
248 cbTemplateFilter->hide(); |
252 cbTemplateFilter->hide(); |
249 maze_size_label->hide(); |
253 maze_size_label->hide(); |
250 cbMazeSize->hide(); |
254 cbMazeSize->hide(); |
251 break; |
255 break; |
252 default: |
256 default: |
253 mapgen = MAPGEN_MAP; |
257 mapgen = MAPGEN_MAP; |
254 updatePreview(); |
|
255 gbThemes->hide(); |
258 gbThemes->hide(); |
256 lblFilter->hide(); |
259 lblFilter->hide(); |
257 cbTemplateFilter->hide(); |
260 cbTemplateFilter->hide(); |
258 maze_size_label->hide(); |
261 maze_size_label->hide(); |
259 cbMazeSize->hide(); |
262 cbMazeSize->hide(); |
264 if (m_mapInfo.theme.isEmpty()) |
267 if (m_mapInfo.theme.isEmpty()) |
265 { |
268 { |
266 m_theme = lvThemes->currentIndex().data().toString(); |
269 m_theme = lvThemes->currentIndex().data().toString(); |
267 emit themeChanged(m_theme); |
270 emit themeChanged(m_theme); |
268 } |
271 } |
269 emit mapChanged(m_mapInfo.name); |
272 |
|
273 updatePreview(); |
|
274 emit mapChanged(m_curMap); |
270 emit mapgenChanged(mapgen); |
275 emit mapgenChanged(mapgen); |
271 } |
276 } |
272 |
277 |
273 // Should this add text to identify map size? |
278 // Should this add text to identify map size? |
274 void HWMapContainer::addInfoToPreview(QPixmap image) |
279 void HWMapContainer::addInfoToPreview(QPixmap image) |
291 imageButt->setIconSize(image.size()); |
296 imageButt->setIconSize(image.size()); |
292 } |
297 } |
293 |
298 |
294 void HWMapContainer::askForGeneratedPreview() |
299 void HWMapContainer::askForGeneratedPreview() |
295 { |
300 { |
296 if (pMap) |
|
297 { |
|
298 disconnect(pMap, 0, this, SLOT(setImage(const QImage))); |
|
299 disconnect(pMap, 0, this, SLOT(setHHLimit(int))); |
|
300 pMap = 0; |
|
301 } |
|
302 |
|
303 pMap = new HWMap(); |
301 pMap = new HWMap(); |
304 connect(pMap, SIGNAL(ImageReceived(const QImage)), this, SLOT(setImage(const QImage))); |
302 connect(pMap, SIGNAL(ImageReceived(const QImage)), this, SLOT(setImage(const QImage))); |
305 connect(pMap, SIGNAL(HHLimitReceived(int)), this, SLOT(setHHLimit(int))); |
303 connect(pMap, SIGNAL(HHLimitReceived(int)), this, SLOT(setHHLimit(int))); |
306 connect(pMap, SIGNAL(destroyed(QObject *)), this, SLOT(onPreviewMapDestroyed(QObject *))); |
304 connect(pMap, SIGNAL(destroyed(QObject *)), this, SLOT(onPreviewMapDestroyed(QObject *))); |
307 pMap->getImage(m_seed, |
305 pMap->getImage(m_seed, |
395 updatePreview(); |
393 updatePreview(); |
396 } |
394 } |
397 |
395 |
398 void HWMapContainer::intSetMap(const QString & map) |
396 void HWMapContainer::intSetMap(const QString & map) |
399 { |
397 { |
|
398 m_curMap = map; |
|
399 |
400 int id = m_mapModel->indexOf(map); |
400 int id = m_mapModel->indexOf(map); |
401 |
401 |
402 if (pMap) |
402 mapChanged(id); |
403 { |
403 } |
404 disconnect(pMap, 0, this, SLOT(setImage(const QImage))); |
404 |
405 disconnect(pMap, 0, this, SLOT(setHHLimit(int))); |
405 void HWMapContainer::setMap(const QString & map) |
406 pMap = 0; |
406 { |
407 } |
407 if ((m_mapInfo.type == MapModel::Invalid) || (map != m_mapInfo.name)) |
408 |
408 intSetMap(map); |
409 chooseMap->setCurrentIndex(id); |
|
410 |
|
411 if(id < 0) |
|
412 { |
|
413 m_mapInfo.type = MapModel::Invalid; |
|
414 m_curMap = map; |
|
415 } |
|
416 } |
|
417 |
|
418 void HWMapContainer::setMap(const QString &map) |
|
419 { |
|
420 intSetMap(map); |
|
421 updatePreview(); |
|
422 } |
409 } |
423 |
410 |
424 void HWMapContainer::setTheme(const QString & theme) |
411 void HWMapContainer::setTheme(const QString & theme) |
425 { |
412 { |
426 QModelIndexList mdl = m_themeModel->match(m_themeModel->index(0), Qt::DisplayRole, theme); |
413 QModelIndexList mdl = m_themeModel->match(m_themeModel->index(0), Qt::DisplayRole, theme); |
445 break; |
432 break; |
446 case MapModel::MissionMap: |
433 case MapModel::MissionMap: |
447 case MapModel::StaticMap: |
434 case MapModel::StaticMap: |
448 // get random map of same type |
435 // get random map of same type |
449 idx = m_mapModel->randomMap(m_mapInfo.type); |
436 idx = m_mapModel->randomMap(m_mapInfo.type); |
450 chooseMap->setCurrentIndex(idx); |
437 mapChanged(idx); |
451 break; |
438 break; |
452 case MapModel::Invalid: |
439 case MapModel::Invalid: |
453 chooseMap->setCurrentIndex(0); |
440 mapChanged(0); |
454 } |
441 } |
455 } |
442 } |
456 |
443 |
457 |
444 |
458 void HWMapContainer::setRandomSeed() |
445 void HWMapContainer::setRandomSeed() |
497 } |
485 } |
498 |
486 |
499 void HWMapContainer::setMazeSize(int size) |
487 void HWMapContainer::setMazeSize(int size) |
500 { |
488 { |
501 intSetMazeSize(size); |
489 intSetMazeSize(size); |
502 updatePreview(); |
490 if (m_mapInfo.type == MapModel::GeneratedMaze) |
|
491 updatePreview(); |
503 } |
492 } |
504 |
493 |
505 void HWMapContainer::intSetMapgen(MapGenerator m) |
494 void HWMapContainer::intSetMapgen(MapGenerator m) |
506 { |
495 { |
507 mapgen = m; |
496 if (mapgen != m) |
508 |
497 { |
|
498 mapgen = m; |
|
499 |
|
500 switch (m) |
|
501 { |
|
502 case MAPGEN_REGULAR: |
|
503 m_mapInfo.type = MapModel::GeneratedMap; |
|
504 break; |
|
505 case MAPGEN_MAZE: |
|
506 m_mapInfo.type = MapModel::GeneratedMaze; |
|
507 break; |
|
508 case MAPGEN_DRAWN: |
|
509 m_mapInfo.type = MapModel::HandDrawnMap; |
|
510 break; |
|
511 case MAPGEN_MAP: |
|
512 switch (m_mapInfo.type) |
|
513 { |
|
514 case MapModel::GeneratedMap: |
|
515 case MapModel::GeneratedMaze: |
|
516 case MapModel::HandDrawnMap: |
|
517 m_mapInfo.type = MapModel::Invalid; |
|
518 default: |
|
519 break; |
|
520 } |
|
521 break; |
|
522 } |
|
523 |
|
524 if(m != MAPGEN_MAP) |
|
525 chooseMap->setCurrentIndex(m); |
|
526 |
|
527 emit mapgenChanged(m); |
|
528 } |
|
529 } |
|
530 |
|
531 void HWMapContainer::setMapgen(MapGenerator m) |
|
532 { |
|
533 intSetMapgen(m); |
509 if(m != MAPGEN_MAP) |
534 if(m != MAPGEN_MAP) |
510 chooseMap->setCurrentIndex(m); |
535 updatePreview(); |
511 |
|
512 emit mapgenChanged(m); |
|
513 } |
|
514 |
|
515 void HWMapContainer::setMapgen(MapGenerator m) |
|
516 { |
|
517 intSetMapgen(m); |
|
518 updatePreview(); |
|
519 } |
536 } |
520 |
537 |
521 void HWMapContainer::setDrawnMapData(const QByteArray & ar) |
538 void HWMapContainer::setDrawnMapData(const QByteArray & ar) |
522 { |
539 { |
523 drawMapScene.decode(ar); |
540 drawMapScene.decode(ar); |
560 updatePreview(); |
577 updatePreview(); |
561 } |
578 } |
562 |
579 |
563 void HWMapContainer::updatePreview() |
580 void HWMapContainer::updatePreview() |
564 { |
581 { |
|
582 if (pMap) |
|
583 { |
|
584 disconnect(pMap, 0, this, SLOT(setImage(const QImage))); |
|
585 disconnect(pMap, 0, this, SLOT(setHHLimit(int))); |
|
586 pMap = 0; |
|
587 } |
|
588 |
565 QPixmap failIcon; |
589 QPixmap failIcon; |
566 |
590 |
567 switch(m_mapInfo.type) |
591 switch(m_mapInfo.type) |
568 { |
592 { |
569 case MapModel::Invalid: |
593 case MapModel::Invalid: |
598 } |
622 } |
599 } |
623 } |
600 |
624 |
601 void HWMapContainer::setAllMapParameters(const QString &map, MapGenerator m, int mazesize, const QString &seed, int tmpl) |
625 void HWMapContainer::setAllMapParameters(const QString &map, MapGenerator m, int mazesize, const QString &seed, int tmpl) |
602 { |
626 { |
603 intSetMap(map); |
|
604 intSetMapgen(m); |
627 intSetMapgen(m); |
605 intSetMazeSize(mazesize); |
628 intSetMazeSize(mazesize); |
606 intSetSeed(seed); |
629 intSetSeed(seed); |
607 intSetTemplateFilter(tmpl); |
630 intSetTemplateFilter(tmpl); |
608 |
631 // this one last because it will refresh the preview |
609 updatePreview(); |
632 intSetMap(map); |
610 } |
633 } |
611 |
634 |
612 |
635 |
613 void HWMapContainer::updateModelViews() |
636 void HWMapContainer::updateModelViews() |
614 { |
637 { |