QTfrontend/model/ThemeModel.cpp
author Wuzzy <Wuzzy2@mail.ru>
Mon, 13 Nov 2017 22:14:45 +0100
changeset 12836 8610462e3d33
parent 11757 6874644a2d00
child 13247 4df9d8cedf7f
permissions -rw-r--r--
Remove 2 unused number tags in Construction Mode GUI These numbers are shown aside the power tag, but the numbers never change. They don't serve any purpose and are just visual clutter and annoying, since they partially overlap. They are probably a leftover from copying code over from other scripts. With this changeset, only the power and turn time are left visible, as it is supposed to.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6948
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     1
/*
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     2
 * Hedgewars, a free turn based strategy game
11046
47a8c19ecb60 more copyright fixes
sheepluva
parents: 10108
diff changeset
     3
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
6948
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     4
 *
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     8
 *
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    12
 * GNU General Public License for more details.
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    13
 *
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    14
 * You should have received a copy of the GNU General Public License
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    15
 * along with this program; if not, write to the Free Software
10108
c68cf030eded update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents: 9998
diff changeset
    16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
6948
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    17
 */
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    18
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    19
/**
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    20
 * @file
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    21
 * @brief ThemeModel class implementation
7271ce89950f various comment tweaks/fixes
sheepluva
parents: 6937
diff changeset
    22
 */
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    23
8419
d99f46b676b5 Prepends an asterisk on maps, styles, and themes that are DLC. (Resolves issue 515)
dag10
parents: 8377
diff changeset
    24
#include "physfs.h"
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    25
#include "ThemeModel.h"
8464
c708b4f5cffc check datadir instead
nemo
parents: 8436
diff changeset
    26
#include "hwconsts.h"
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    27
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    28
ThemeModel::ThemeModel(QObject *parent) :
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    29
    QAbstractListModel(parent)
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    30
{
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    31
    m_data = QList<QMap<int, QVariant> >();
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    32
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    33
    m_themesLoaded = false;
11757
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    34
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    35
    m_filteredNoDLC = NULL;
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    36
}
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    37
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    38
QSortFilterProxyModel * ThemeModel::withoutDLC()
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    39
{
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    40
    if (m_filteredNoDLC == NULL)
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    41
    {
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    42
        m_filteredNoDLC = new QSortFilterProxyModel(this);
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    43
        m_filteredNoDLC->setSourceModel(this);
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    44
        // filtering based on IsDlcRole would be nicer
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    45
        // but seems this model can only do string-based filtering :|
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    46
        m_filteredNoDLC->setFilterRegExp(QRegExp("^[^*]"));
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    47
    }
6874644a2d00 in non-local games, don't include DLC-themes/maps/missions during random selection. thanks to unC0Rr for helping me realize that I was stupid in a different way than I thought :P
sheepluva
parents: 11754
diff changeset
    48
    return m_filteredNoDLC;
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    49
}
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    50
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    51
int ThemeModel::rowCount(const QModelIndex &parent) const
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    52
{
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    53
    if(parent.isValid())
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    54
        return 0;
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    55
    else
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    56
    {
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    57
        if(!m_themesLoaded)
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    58
            loadThemes();
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    59
        return m_data.size();
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    60
    }
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    61
}
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    62
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    63
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    64
QVariant ThemeModel::data(const QModelIndex &index, int role) const
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    65
{
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    66
    if(index.column() > 0 || index.row() >= m_data.size())
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    67
        return QVariant();
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    68
    else
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    69
    {
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    70
        if(!m_themesLoaded)
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    71
            loadThemes();
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    72
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    73
        return m_data.at(index.row()).value(role);
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    74
    }
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    75
}
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    76
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    77
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    78
void ThemeModel::loadThemes() const
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    79
{
9815
d4621fb76284 - Fix typo in frontend debug output
unc0rr
parents: 9745
diff changeset
    80
    qDebug("[LAZINESS] ThemeModel::loadThemes()");
9745
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    81
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    82
    m_themesLoaded = true;
258c320256dc Load themes lazily
unc0rr
parents: 9080
diff changeset
    83
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    84
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    85
    DataManager & datamgr = DataManager::instance();
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    86
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    87
    QStringList themes =
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    88
        datamgr.entryList("Themes", QDir::AllDirs | QDir::NoDotAndDotDot);
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    89
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    90
    m_data.clear();
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    91
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    92
#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    93
    m_data.reserve(themes.size());
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    94
#endif
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    95
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    96
    foreach (QString theme, themes)
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
    97
    {
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
    98
        // themes without icon are supposed to be hidden
8049
133e22b5c410 Get rid of DataManager::findFileForRead
unc0rr
parents: 7955
diff changeset
    99
        QString iconpath = QString("physfs://Themes/%1/icon.png").arg(theme);
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   100
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   101
        if (!QFile::exists(iconpath))
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   102
            continue;
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   103
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   104
        QMap<int, QVariant> dataset;
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
   105
8419
d99f46b676b5 Prepends an asterisk on maps, styles, and themes that are DLC. (Resolves issue 515)
dag10
parents: 8377
diff changeset
   106
        // detect if theme is dlc
d99f46b676b5 Prepends an asterisk on maps, styles, and themes that are DLC. (Resolves issue 515)
dag10
parents: 8377
diff changeset
   107
        QString themeDir = PHYSFS_getRealDir(QString("Themes/%1/icon.png").arg(theme).toLocal8Bit().data());
8475
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   108
        bool isDLC = !themeDir.startsWith(datadir->absolutePath());
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   109
        dataset.insert(IsDlcRole, isDLC);
8419
d99f46b676b5 Prepends an asterisk on maps, styles, and themes that are DLC. (Resolves issue 515)
dag10
parents: 8377
diff changeset
   110
8377
869f80966a77 GCI2012: Improve Game Configuration Widget
dag10
parents: 8049
diff changeset
   111
        // set icon path
8475
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   112
        dataset.insert(IconPathRole, iconpath);
8377
869f80966a77 GCI2012: Improve Game Configuration Widget
dag10
parents: 8049
diff changeset
   113
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   114
        // set name
8475
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   115
        dataset.insert(ActualNameRole, theme);
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   116
8475
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   117
        // set displayed name
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   118
        dataset.insert(Qt::DisplayRole, (isDLC ? "*" : "") + theme);
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   119
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   120
        // load and set preview icon
8049
133e22b5c410 Get rid of DataManager::findFileForRead
unc0rr
parents: 7955
diff changeset
   121
        QIcon preview(QString("physfs://Themes/%1/icon@2x.png").arg(theme));
8475
f605bc59c603 Initial theme selection is now random. Theme prompt now has a search input and no longer uses FlowLayout. (Resolves issue 520)
dag10
parents: 8464
diff changeset
   122
        dataset.insert(Qt::DecorationRole, preview);
6937
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   123
7f77fa908a4e messing with the theme model a bit (gets now auto-updated after DLC download too)
sheepluva
parents: 6061
diff changeset
   124
        m_data.append(dataset);
5289
9d18b61bd3eb - Implement ThemesModel (load theme icons once, store in memory, don't reload from disk every time selection changes)
unc0rr
parents:
diff changeset
   125
    }
8436
b89aacebb9db - Also pass unknown cmds to the server when in room
unc0rr
parents: 8419
diff changeset
   126
}