Allow building as monolithic app (no plugins) for easier developement.
[tagua.git] / src / variantfactories / builtinvariants.cpp
blob67a7a3cd9ae09ca6c6726fd2e53e434a0cce1f7e
1 #include <QString>
2 #include <core/repository.h>
3 #include <variant.h>
4 #include "builtinvariants.h"
6 extern "C" Repository* taguachess_initrepo(IVariantLoader*);
7 extern "C" Repository* taguachess5x5_initrepo(IVariantLoader*);
8 extern "C" Repository* taguacrazyhouse_initrepo(IVariantLoader*);
10 // FIXME: a KDE plugin willing to reuse a builtin one crashes
12 /**
13 * Hardcoded definition of builtin variants.
15 static const struct builtin {
16 const char* name;
17 Repository* (*init_func)(IVariantLoader*);
18 const char* theme_proxy;
19 } builtins[] = {
20 { "Chess", taguachess_initrepo, "Chess" },
21 { "Chess 5x5", taguachess5x5_initrepo, "Chess" },
22 { "Crazyhouse", taguacrazyhouse_initrepo, "Chess" },
25 static const struct builtin* const get_builtin(QString name) {
26 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
27 if (name.compare(builtins[i].name, Qt::CaseInsensitive) == 0)
28 return builtins+i;
29 return NULL;
32 BuiltinVariants::BuiltinVariants() {
33 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
34 m_allvariants << builtins[i].name;
37 BuiltinVariants& BuiltinVariants::self() {
38 static BuiltinVariants inst;
39 return inst;
42 Variant* BuiltinVariants::create(const QString& name) {
43 Repository* repo = getRepository(name);
44 if (repo) {
45 const struct builtin* const builtin = get_builtin(name);
46 if (!builtin)
47 kFatal() << "builtin not properly registered" << name;
48 return new Variant(name, repo, builtin->theme_proxy);
50 return NULL;
53 QStringList BuiltinVariants::all() const {
54 return m_allvariants;
57 Repository* BuiltinVariants::getRepository(const QString& variant) {
58 if (m_variants.contains(variant))
59 return m_variants[variant];
61 Repository* repo = NULL;
62 const struct builtin* const builtin = get_builtin(variant);
63 if (builtin) {
64 repo = builtin->init_func(this);
65 if (repo)
66 m_variants[builtin->name] = repo;
67 else
68 kError() << "could not load builtin variant" << variant;
71 return repo;