~ubuntu-branches/ubuntu/wily/hedgewars/wily

« back to all changes in this revision

Viewing changes to QTfrontend/mapContainer.cpp

  • Committer: Package Import Robot
  • Author(s): Dmitry E. Oboukhov
  • Date: 2011-09-23 10:16:55 UTC
  • mfrom: (1.2.11 upstream)
  • Revision ID: package-import@ubuntu.com-20110923101655-3977th2gc5n0a3pv
Tags: 0.9.16-1
* New upstream version.
 + Downloadable content! Simply click to install any content.
   New voices, hats, maps, themes, translations, music, scripts...
   Hedgewars is now more customisable than ever before! As time goes
   by we will be soliciting community content to feature on this page,
   so remember to check it from time to time. If you decide you want
   to go back to standard Hedgewars, just remove the Data directory
   from your Hedgewars config directory.
 + 3-D rendering! Diorama-like rendering of the game in a variety
   of 3D modes. Let us know which ones work best for you, we didn't
   really have the equipment to test them all.
 + Resizable game window.
 + New utilities! The Time Box will remove one of your hedgehogs
   from the game for a while, protecting from attack until it returns,
   somewhere else on the map. Land spray will allow you to build bridges,
   seal up holes, or just make life unpleasant for your enemies.
 + New single player: Bamboo Thicket, That Sinking Feeling, Newton and
   the Tree and multi-player: The Specialists, Space Invaders,
   Racer - scripts! And a ton more script hooks for scripters
 + New twists on old weapons. Drill strike, seduction and fire have
   been adjusted. Defective mines have been added, rope can attach to
   hogs/crates/barrels again, grenades now have variable bounce (use
   precise key + 1-5). Portal gun is now more usable in flight and
   all game actions are a lot faster.
 + New theme - Golf, dozens of new community hats and a new
   localised Default voice, Ukranian.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * Hedgewars, a free turn based strategy game
3
 
 * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com>
 
3
 * Copyright (c) 2006-2011 Igor Ulyanov <iulyanov@gmail.com>
4
4
 *
5
5
 * This program is free software; you can redistribute it and/or modify
6
6
 * it under the terms of the GNU General Public License as published by
24
24
#include <QLinearGradient>
25
25
#include <QColor>
26
26
#include <QTextStream>
27
 
#include <QApplication>
28
27
#include <QLabel>
29
 
#include <QListWidget>
 
28
#include <QListView>
30
29
#include <QVBoxLayout>
31
30
#include <QIcon>
32
31
#include <QLineEdit>
33
32
#include <QMessageBox>
 
33
#include <QStringListModel>
34
34
 
35
35
#include "hwconsts.h"
36
36
#include "mapContainer.h"
37
37
#include "igbox.h"
 
38
#include "HWApplication.h"
38
39
 
39
40
HWMapContainer::HWMapContainer(QWidget * parent) :
40
41
    QWidget(parent),
46
47
    hhLimit = 18;
47
48
    templateFilter = 0;
48
49
 
49
 
    mainLayout.setContentsMargins(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin),
 
50
    mainLayout.setContentsMargins(HWApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin),
50
51
        1,
51
 
        QApplication::style()->pixelMetric(QStyle::PM_LayoutRightMargin),
52
 
        QApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin));
 
52
        HWApplication::style()->pixelMetric(QStyle::PM_LayoutRightMargin),
 
53
        HWApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin));
53
54
 
54
55
    QWidget* mapWidget = new QWidget(this);
55
56
    mainLayout.addWidget(mapWidget, 0, 0, Qt::AlignHCenter);
63
64
    imageButt->setFlat(true);
64
65
    imageButt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//QSizePolicy::Minimum, QSizePolicy::Minimum);
65
66
    mapLayout->addWidget(imageButt, 0, 0, 1, 2);
66
 
    //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomSeed()));
67
 
    //connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomTheme()));
68
67
    connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomMap()));
69
68
 
70
69
    chooseMap = new QComboBox(mapWidget);
85
84
 
86
85
    int missionindex = chooseMap->count();
87
86
    numMissions = 0;
 
87
    QFile mapLuaFile;
 
88
    QFile mapCfgFile;
88
89
    for (int i = 0; i < mapList->size(); ++i) {
89
90
        QString map = (*mapList)[i];
90
 
        QFile mapCfgFile(
91
 
                QString("%1/Maps/%2/map.cfg")
92
 
                .arg(datadir->absolutePath())
93
 
                .arg(map));
94
 
        QFile mapLuaFile(
95
 
                QString("%1/Maps/%2/map.lua")
96
 
                .arg(datadir->absolutePath())
97
 
                .arg(map));
 
91
        mapCfgFile.setFileName(
 
92
                QString("%1/Data/Maps/%2/map.cfg")
 
93
                .arg(cfgdir->absolutePath())
 
94
                .arg(map));
 
95
        if (mapCfgFile.exists()) {
 
96
            mapLuaFile.setFileName(
 
97
                    QString("%1/Data/Maps/%2/map.lua")
 
98
                    .arg(cfgdir->absolutePath())
 
99
                    .arg(map));
 
100
        } else {
 
101
            mapCfgFile.setFileName(
 
102
                    QString("%1/Maps/%2/map.cfg")
 
103
                    .arg(datadir->absolutePath())
 
104
                    .arg(map));
 
105
            mapLuaFile.setFileName(
 
106
                    QString("%1/Maps/%2/map.lua")
 
107
                    .arg(datadir->absolutePath())
 
108
                    .arg(map));
 
109
        }
98
110
 
99
111
        if (mapCfgFile.open(QFile::ReadOnly)) {
100
112
            QString theme;
140
152
    }
141
153
    chooseMap->insertSeparator(missionindex); // separator between missions and maps
142
154
 
143
 
    connect(chooseMap, SIGNAL(currentIndexChanged(int)), this, SLOT(mapChanged(int)));
 
155
    connect(chooseMap, SIGNAL(activated(int)), this, SLOT(mapChanged(int)));
144
156
    mapLayout->addWidget(chooseMap, 1, 1);
145
157
 
146
158
    QLabel * lblMap = new QLabel(tr("Map"), mapWidget);
149
161
    lblFilter = new QLabel(tr("Filter"), mapWidget);
150
162
    mapLayout->addWidget(lblFilter, 2, 0);
151
163
 
152
 
    CB_TemplateFilter = new QComboBox(mapWidget);
153
 
    CB_TemplateFilter->addItem(tr("All"), 0);
154
 
    CB_TemplateFilter->addItem(tr("Small"), 1);
155
 
    CB_TemplateFilter->addItem(tr("Medium"), 2);
156
 
    CB_TemplateFilter->addItem(tr("Large"), 3);
157
 
    CB_TemplateFilter->addItem(tr("Cavern"), 4);
158
 
    CB_TemplateFilter->addItem(tr("Wacky"), 5);
159
 
    mapLayout->addWidget(CB_TemplateFilter, 2, 1);
 
164
    cbTemplateFilter = new QComboBox(mapWidget);
 
165
    cbTemplateFilter->addItem(tr("All"), 0);
 
166
    cbTemplateFilter->addItem(tr("Small"), 1);
 
167
    cbTemplateFilter->addItem(tr("Medium"), 2);
 
168
    cbTemplateFilter->addItem(tr("Large"), 3);
 
169
    cbTemplateFilter->addItem(tr("Cavern"), 4);
 
170
    cbTemplateFilter->addItem(tr("Wacky"), 5);
 
171
    mapLayout->addWidget(cbTemplateFilter, 2, 1);
160
172
 
161
 
    connect(CB_TemplateFilter, SIGNAL(currentIndexChanged(int)), this, SLOT(templateFilterChanged(int)));
 
173
    connect(cbTemplateFilter, SIGNAL(activated(int)), this, SLOT(setTemplateFilter(int)));
162
174
 
163
175
    maze_size_label = new QLabel(tr("Type"), mapWidget);
164
 
    mainLayout.addWidget(maze_size_label, 2, 0);
 
176
    mapLayout->addWidget(maze_size_label, 2, 0);
165
177
    maze_size_label->hide();
166
 
    maze_size_selection = new QComboBox(mapWidget);
167
 
    maze_size_selection->addItem(tr("Small tunnels"), 0);
168
 
    maze_size_selection->addItem(tr("Medium tunnels"), 1);
169
 
    maze_size_selection->addItem(tr("Large tunnels"), 2);
170
 
    maze_size_selection->addItem(tr("Small floating islands"), 3);
171
 
    maze_size_selection->addItem(tr("Medium floating islands"), 4);
172
 
    maze_size_selection->addItem(tr("Large floating islands"), 5);
173
 
    maze_size_selection->setCurrentIndex(1);
 
178
    cbMazeSize = new QComboBox(mapWidget);
 
179
    cbMazeSize->addItem(tr("Small tunnels"), 0);
 
180
    cbMazeSize->addItem(tr("Medium tunnels"), 1);
 
181
    cbMazeSize->addItem(tr("Large tunnels"), 2);
 
182
    cbMazeSize->addItem(tr("Small floating islands"), 3);
 
183
    cbMazeSize->addItem(tr("Medium floating islands"), 4);
 
184
    cbMazeSize->addItem(tr("Large floating islands"), 5);
 
185
    cbMazeSize->setCurrentIndex(1);
174
186
 
175
 
    mapLayout->addWidget(maze_size_selection, 2, 1);
176
 
    maze_size_selection->hide();
177
 
    connect(maze_size_selection, SIGNAL(currentIndexChanged(int)), this, SLOT(setMaze_size(int)));
 
187
    mapLayout->addWidget(cbMazeSize, 2, 1);
 
188
    cbMazeSize->hide();
 
189
    connect(cbMazeSize, SIGNAL(activated(int)), this, SLOT(setMazeSize(int)));
178
190
 
179
191
    gbThemes = new IconedGroupBox(mapWidget);
180
192
    gbThemes->setTitleTextPadding(80);
187
199
    QVBoxLayout * gbTLayout = new QVBoxLayout(gbThemes);
188
200
    gbTLayout->setContentsMargins(0, 0, 0 ,0);
189
201
    gbTLayout->setSpacing(0);
190
 
    lwThemes = new QListWidget(mapWidget);
191
 
    lwThemes->setMinimumHeight(30);
192
 
    lwThemes->setFixedWidth(140);
193
 
    for (int i = 0; i < Themes->size(); ++i) {
194
 
        QListWidgetItem * lwi = new QListWidgetItem();
195
 
        lwi->setText(Themes->at(i));
196
 
        lwi->setIcon(QIcon(QString("%1/Themes/%2/icon.png").arg(datadir->absolutePath()).arg(Themes->at(i))));
197
 
        //lwi->setTextAlignment(Qt::AlignHCenter);
198
 
        lwThemes->addItem(lwi);
199
 
    }
200
 
    connect(lwThemes, SIGNAL(currentRowChanged(int)), this, SLOT(themeSelected(int)));
 
202
    lvThemes = new QListView(mapWidget);
 
203
    lvThemes->setMinimumHeight(30);
 
204
    lvThemes->setFixedWidth(140);
 
205
    lvThemes->setModel(themesModel);
 
206
    lvThemes->setIconSize(QSize(16, 16));
 
207
    lvThemes->setEditTriggers(QListView::NoEditTriggers);
 
208
 
 
209
    connect(lvThemes->selectionModel(), SIGNAL(currentRowChanged( const QModelIndex &, const QModelIndex &)), this, SLOT(themeSelected( const QModelIndex &, const QModelIndex &)));
201
210
 
202
211
    // override default style to tighten up theme scroller
203
 
    lwThemes->setStyleSheet(QString(
204
 
        "QListWidget{"
 
212
    lvThemes->setStyleSheet(QString(
 
213
        "QListView{"
205
214
            "border: solid;"
206
215
            "border-width: 0px;"
207
216
            "border-radius: 0px;"
213
222
        )
214
223
    );
215
224
 
216
 
    gbTLayout->addWidget(lwThemes);
217
 
    lwThemes->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);
 
225
    gbTLayout->addWidget(lvThemes);
 
226
    lvThemes->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);
218
227
 
219
228
    mapLayout->setSizeConstraint(QLayout::SetFixedSize);
220
229
 
278
287
        updatePreview();
279
288
        gbThemes->show();
280
289
        lblFilter->show();
281
 
        CB_TemplateFilter->show();
 
290
        cbTemplateFilter->show();
282
291
        maze_size_label->hide();
283
 
        maze_size_selection->hide();
 
292
        cbMazeSize->hide();
284
293
        emit mapChanged("+rnd+");
285
 
        emit mapgenChanged(mapgen);
286
294
        emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
287
295
        break;
288
296
    case MAPGEN_MAZE:
290
298
        updatePreview();
291
299
        gbThemes->show();
292
300
        lblFilter->hide();
293
 
        CB_TemplateFilter->hide();
 
301
        cbTemplateFilter->hide();
294
302
        maze_size_label->show();
295
 
        maze_size_selection->show();
 
303
        cbMazeSize->show();
296
304
        emit mapChanged("+maze+");
297
 
        emit mapgenChanged(mapgen);
298
305
        emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
299
306
        break;
300
307
    case MAPGEN_DRAWN:
302
309
        updatePreview();
303
310
        gbThemes->show();
304
311
        lblFilter->hide();
305
 
        CB_TemplateFilter->hide();
 
312
        cbTemplateFilter->hide();
306
313
        maze_size_label->hide();
307
 
        maze_size_selection->hide();
 
314
        cbMazeSize->hide();
308
315
        emit mapChanged("+drawn+");
309
 
        emit mapgenChanged(mapgen);
310
316
        emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
311
317
        break;
312
318
    default:
 
319
        mapgen = MAPGEN_MAP;
313
320
        updatePreview();
314
321
        gbThemes->hide();
315
322
        lblFilter->hide();
316
 
        CB_TemplateFilter->hide();
 
323
        cbTemplateFilter->hide();
317
324
        maze_size_label->hide();
318
 
        maze_size_selection->hide();
 
325
        cbMazeSize->hide();
319
326
        emit mapChanged(chooseMap->itemData(index).toList()[0].toString());
320
327
    }
 
328
 
 
329
    emit mapgenChanged(mapgen);
321
330
}
322
331
 
323
332
// Should this add text to identify map size?
355
364
    pMap->getImage(m_seed,
356
365
                   getTemplateFilter(),
357
366
                   get_mapgen(),
358
 
                   get_maze_size(),
 
367
                   getMazeSize(),
359
368
                   getDrawnMapData()
360
369
            );
361
370
}
362
371
 
363
 
void HWMapContainer::themeSelected(int currentRow)
 
372
void HWMapContainer::themeSelected(const QModelIndex & current, const QModelIndex &)
364
373
{
365
 
    QString theme = Themes->at(currentRow);
 
374
    QString theme = current.data().toString();
366
375
    QList<QVariant> mapInfo;
367
376
    mapInfo.push_back(QString("+rnd+"));
368
377
    mapInfo.push_back(theme);
373
382
    chooseMap->setItemData(1, mapInfo);
374
383
    mapInfo[0] = QString("+drawn+");
375
384
    chooseMap->setItemData(2, mapInfo);
376
 
    gbThemes->setIcon(QIcon(QString("%1/Themes/%2/icon@2x.png").arg(datadir->absolutePath()).arg(theme)));
 
385
 
 
386
    gbThemes->setIcon(qVariantValue<QIcon>(current.data(Qt::UserRole)));
377
387
    emit themeChanged(theme);
378
388
}
379
389
 
416
426
 
417
427
quint32 HWMapContainer::getTemplateFilter() const
418
428
{
419
 
    return CB_TemplateFilter->itemData(CB_TemplateFilter->currentIndex()).toInt();
 
429
    return cbTemplateFilter->itemData(cbTemplateFilter->currentIndex()).toInt();
420
430
}
421
431
 
422
432
void HWMapContainer::resizeEvent ( QResizeEvent * event )
425
435
  //imageButt->setIconSize(imageButt->size());
426
436
}
427
437
 
428
 
void HWMapContainer::setSeed(const QString & seed)
 
438
void HWMapContainer::intSetSeed(const QString & seed)
429
439
{
430
440
    m_seed = seed;
431
441
    if (seed != seedEdit->text())
432
442
        seedEdit->setText(seed);
433
 
    if (chooseMap->currentIndex() < MAPGEN_MAP)
 
443
}
 
444
 
 
445
void HWMapContainer::setSeed(const QString & seed)
 
446
{
 
447
    intSetSeed(seed);
 
448
    if (chooseMap->currentIndex() < MAPGEN_DRAWN)
434
449
        updatePreview();
435
450
}
436
451
 
437
 
void HWMapContainer::setMap(const QString & map)
 
452
void HWMapContainer::intSetMap(const QString & map)
438
453
{
439
454
    int id = 0;
440
455
    for(int i = 0; i < chooseMap->count(); i++)
452
467
            pMap = 0;
453
468
        }
454
469
        chooseMap->setCurrentIndex(id);
455
 
        updatePreview();
456
470
    }
457
471
}
458
472
 
 
473
void HWMapContainer::setMap(const QString &map)
 
474
{
 
475
    intSetMap(map);
 
476
    updatePreview();
 
477
}
 
478
 
459
479
void HWMapContainer::setTheme(const QString & theme)
460
480
{
461
 
    QList<QListWidgetItem *> items = lwThemes->findItems(theme, Qt::MatchExactly);
462
 
    if(items.size())
463
 
        lwThemes->setCurrentItem(items.at(0));
 
481
    QModelIndexList mdl = themesModel->match(themesModel->index(0), Qt::DisplayRole, theme);
 
482
 
 
483
    if(mdl.size())
 
484
        lvThemes->setCurrentIndex(mdl.at(0));
464
485
}
465
486
 
466
487
void HWMapContainer::setRandomMap()
488
509
{
489
510
    int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
490
511
    chooseMap->setCurrentIndex(i);
491
 
    setRandomSeed();
 
512
    updatePreview();
492
513
}
493
514
 
494
515
void HWMapContainer::setRandomMission()
495
516
{
496
517
    int i = MAPGEN_MAP + 2 + rand() % numMissions;
497
 
    qDebug() << i << MAPGEN_MAP << numMissions;
498
518
    chooseMap->setCurrentIndex(i);
499
 
    setRandomSeed();
 
519
    updatePreview();
500
520
}
501
521
 
502
522
void HWMapContainer::setRandomSeed()
510
530
 
511
531
void HWMapContainer::setRandomTheme()
512
532
{
513
 
    if(!Themes->size()) return;
514
 
    quint32 themeNum = rand() % Themes->size();
515
 
    lwThemes->setCurrentRow(themeNum);
 
533
    if(!themesModel->rowCount()) return;
 
534
    quint32 themeNum = rand() % themesModel->rowCount();
 
535
    lvThemes->setCurrentIndex(themesModel->index(themeNum));
 
536
}
 
537
 
 
538
void HWMapContainer::intSetTemplateFilter(int filter)
 
539
{
 
540
    cbTemplateFilter->setCurrentIndex(filter);
 
541
    emit newTemplateFilter(filter);
516
542
}
517
543
 
518
544
void HWMapContainer::setTemplateFilter(int filter)
519
545
{
520
 
    CB_TemplateFilter->setCurrentIndex(filter);
521
 
}
522
 
 
523
 
void HWMapContainer::templateFilterChanged(int filter)
524
 
{
525
 
    emit newTemplateFilter(filter);
 
546
    intSetTemplateFilter(filter);
526
547
    updatePreview();
527
548
}
528
549
 
531
552
    return mapgen;
532
553
}
533
554
 
534
 
int HWMapContainer::get_maze_size(void) const
535
 
{
536
 
    return maze_size_selection->currentIndex();
537
 
}
538
 
 
539
 
void HWMapContainer::setMaze_size(int size)
540
 
{
541
 
    maze_size_selection->setCurrentIndex(size);
542
 
    emit maze_sizeChanged(size);
 
555
int HWMapContainer::getMazeSize(void) const
 
556
{
 
557
    return cbMazeSize->currentIndex();
 
558
}
 
559
 
 
560
void HWMapContainer::intSetMazeSize(int size)
 
561
{
 
562
    cbMazeSize->setCurrentIndex(size);
 
563
    emit mazeSizeChanged(size);
 
564
}
 
565
 
 
566
void HWMapContainer::setMazeSize(int size)
 
567
{
 
568
    intSetMazeSize(size);
543
569
    updatePreview();
544
570
}
545
571
 
546
 
void HWMapContainer::setMapgen(MapGenerator m)
 
572
void HWMapContainer::intSetMapgen(MapGenerator m)
547
573
{
548
574
    mapgen = m;
549
 
    chooseMap->setCurrentIndex(m);
 
575
 
 
576
    if(m != MAPGEN_MAP)
 
577
        chooseMap->setCurrentIndex(m);
 
578
 
550
579
    emit mapgenChanged(m);
 
580
}
 
581
 
 
582
void HWMapContainer::setMapgen(MapGenerator m)
 
583
{
 
584
    intSetMapgen(m);
551
585
    updatePreview();
552
586
}
553
587
 
610
644
        break;
611
645
    default:
612
646
        QPixmap mapImage;
613
 
        qDebug() << "Map data" << curIndex << chooseMap->currentText() << chooseMap->itemData(curIndex);
614
 
        if(!mapImage.load(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png")) {
 
647
        QFile tmpfile;
 
648
        tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
 
649
        if (!tmpfile.exists()) tmpfile.setFileName(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png");
 
650
        if(!mapImage.load(QFileInfo(tmpfile).absoluteFilePath())) {
615
651
            imageButt->setIcon(QIcon());
616
652
            return;
617
653
        }
620
656
        addInfoToPreview(mapImage);
621
657
    }
622
658
}
 
659
 
 
660
void HWMapContainer::setAllMapParameters(const QString &map, MapGenerator m, int mazesize, const QString &seed, int tmpl)
 
661
{
 
662
    intSetMap(map);
 
663
    intSetMapgen(m);
 
664
    intSetMazeSize(mazesize);
 
665
    intSetSeed(seed);
 
666
    intSetTemplateFilter(tmpl);
 
667
 
 
668
    updatePreview();
 
669
}