~faenil/ubuntu-ui-toolkit/listitemlayout_fixes_and_docs

« back to all changes in this revision

Viewing changes to src/Ubuntu/Components/plugin/uctheme.cpp

  • Committer: Andrea Bernabei
  • Date: 2016-01-20 13:47:23 UTC
  • mfrom: (1795.2.13 staging)
  • Revision ID: andrea.bernabei@canonical.com-20160120134723-hn6rkf4s3pie0wwp
merge staging

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright 2015 Canonical Ltd.
 
2
 * Copyright 2016 Canonical Ltd.
3
3
 *
4
4
 * This program is free software; you can redistribute it and/or modify
5
5
 * it under the terms of the GNU Lesser General Public License as published by
44
44
#include <QtQml/private/qqmlbinding_p.h>
45
45
#undef foreach
46
46
 
47
 
 
 
47
const char *CONTEXT_THEME = "theme";
48
48
quint16 UCTheme::previousVersion = 0;
49
49
/*!
50
50
 * \qmltype ThemeSettings
345
345
 */
346
346
UCTheme::UCTheme(QObject *parent)
347
347
    : QObject(parent)
348
 
    , m_palette(UCTheme::defaultTheme().m_palette)
349
 
    , m_engine(UCTheme::defaultTheme().m_engine)
350
 
    , m_defaultStyle(false)
351
 
{
352
 
    init();
353
 
}
354
 
 
355
 
UCTheme::UCTheme(bool defaultStyle, QObject *parent)
356
 
    : QObject(parent)
357
 
    , m_palette(NULL)
358
 
    , m_engine(NULL)
359
 
    , m_defaultStyle(defaultStyle)
360
 
{
361
 
    init();
 
348
    , m_parentTheme(Q_NULLPTR)
 
349
    , m_palette(Q_NULLPTR)
 
350
    , m_completed(false)
 
351
{
 
352
    init();
 
353
}
 
354
 
 
355
UCTheme *UCTheme::defaultTheme(QQmlEngine *engine)
 
356
{
 
357
    if (!engine || !engine->rootContext()) {
 
358
        return Q_NULLPTR;
 
359
    }
 
360
    UCTheme *theme = Q_NULLPTR;
 
361
    for (int tryCount = 0; !theme && tryCount < 2; tryCount++) {
 
362
        theme = engine->rootContext()->contextProperty(CONTEXT_THEME).value<UCTheme*>();
 
363
        if (!theme) {
 
364
            createDefaultTheme(engine);
 
365
        }
 
366
    }
 
367
    return theme;
 
368
}
 
369
 
 
370
void UCTheme::setupDefault()
 
371
{
 
372
    // FIXME: move this into QPA
362
373
    // set the default font
363
374
    QFont defaultFont = QGuiApplication::font();
364
375
    defaultFont.setFamily("Ubuntu");
378
389
 
379
390
void UCTheme::classBegin()
380
391
{
381
 
    m_engine = qmlEngine(this);
382
 
    updateEnginePaths();
383
 
    loadPalette();
 
392
    QQmlEngine *engine = qmlEngine(this);
 
393
    updateEnginePaths(engine);
 
394
    m_palette = UCTheme::defaultTheme(engine)->m_palette;
 
395
    if (!m_palette) {
 
396
        loadPalette(engine);
 
397
    }
384
398
}
385
399
 
386
 
void UCTheme::updateEnginePaths()
 
400
void UCTheme::updateEnginePaths(QQmlEngine *engine)
387
401
{
388
 
    if (!m_engine) {
 
402
    if (!engine) {
389
403
        return;
390
404
    }
391
405
 
392
406
    QStringList paths = themeSearchPath();
393
407
    Q_FOREACH(const QString &path, paths) {
394
 
        if (QDir(path).exists() && !m_engine->importPathList().contains(path)) {
395
 
            m_engine->addImportPath(path);
 
408
        if (QDir(path).exists() && !engine->importPathList().contains(path)) {
 
409
            engine->addImportPath(path);
396
410
        }
397
411
    }
398
412
}
458
472
                            this, &UCTheme::_q_defaultThemeChanged);
459
473
        updateThemePaths();
460
474
    }
461
 
    loadPalette();
 
475
    loadPalette(qmlEngine(this));
462
476
    Q_EMIT nameChanged();
463
477
    updateThemedItems();
464
478
}
526
540
QObject* UCTheme::palette()
527
541
{
528
542
    if (!m_palette) {
529
 
        loadPalette(false);
 
543
        loadPalette(qmlEngine(this), false);
530
544
    }
531
545
    return m_palette;
532
546
}
611
625
}
612
626
 
613
627
// registers the default theme property to the root context
614
 
void UCTheme::registerToContext(QQmlContext* context)
 
628
void UCTheme::createDefaultTheme(QQmlEngine* engine)
615
629
{
616
 
    UCTheme *defaultTheme = &UCTheme::defaultTheme();
617
 
    defaultTheme->m_engine = context->engine();
618
 
    defaultTheme->updateEnginePaths();
619
 
 
620
 
    context->setContextProperty("theme", defaultTheme);
 
630
    QQmlContext *context = engine->rootContext();
 
631
 
 
632
    UCTheme *theme = new UCTheme(engine);
 
633
    QQmlEngine::setContextForObject(theme, context);
 
634
    context->setContextProperty(CONTEXT_THEME, theme);
 
635
 
 
636
    theme->setupDefault();
 
637
    theme->updateEnginePaths(engine);
 
638
 
621
639
    ContextPropertyChangeListener *listener =
622
 
        new ContextPropertyChangeListener(context, "theme");
623
 
    QObject::connect(defaultTheme, &UCTheme::nameChanged,
 
640
        new ContextPropertyChangeListener(context, CONTEXT_THEME);
 
641
    QObject::connect(theme, &UCTheme::nameChanged,
624
642
                     listener, &ContextPropertyChangeListener::updateContextProperty);
625
643
}
626
644
 
674
692
 
675
693
    if (parent != NULL) {
676
694
        QQmlEngine* engine = qmlEngine(parent);
677
 
        if (engine != m_engine && !m_engine) {
678
 
            m_engine = engine;
679
 
            updateEnginePaths();
680
 
        }
 
695
        Q_ASSERT(engine);
 
696
        Q_ASSERT(engine == qmlEngine(this));
681
697
        // make sure we have the paths
682
 
        if (engine != NULL) {
683
 
            bool fallback = false;
684
 
            QUrl url = styleUrl(styleName, version, &fallback);
685
 
            if (url.isValid()) {
686
 
                if (fallback) {
687
 
                    qmlInfo(parent) << QStringLiteral("Theme '%1' has no '%2' style for version %3.%4, fall back to version %5.%6.")
688
 
                                       .arg(name()).arg(styleName).arg(MAJOR_VERSION(version)).arg(MINOR_VERSION(version))
689
 
                                       .arg(MAJOR_VERSION(LATEST_UITK_VERSION)).arg(MINOR_VERSION(LATEST_UITK_VERSION));
690
 
                }
691
 
                component = new QQmlComponent(engine, url, QQmlComponent::PreferSynchronous, parent);
692
 
                if (component->isError()) {
693
 
                    qmlInfo(parent) << component->errorString();
694
 
                    delete component;
695
 
                    component = NULL;
696
 
                } else {
697
 
                    // set context for the component
698
 
                    QQmlEngine::setContextForObject(component, qmlContext(parent));
699
 
                }
 
698
        bool fallback = false;
 
699
        QUrl url = styleUrl(styleName, version, &fallback);
 
700
        if (url.isValid()) {
 
701
            if (fallback) {
 
702
                qmlInfo(parent) << QStringLiteral("Theme '%1' has no '%2' style for version %3.%4, fall back to version %5.%6.")
 
703
                                   .arg(name()).arg(styleName).arg(MAJOR_VERSION(version)).arg(MINOR_VERSION(version))
 
704
                                   .arg(MAJOR_VERSION(LATEST_UITK_VERSION)).arg(MINOR_VERSION(LATEST_UITK_VERSION));
 
705
            }
 
706
            component = new QQmlComponent(engine, url, QQmlComponent::PreferSynchronous, parent);
 
707
            if (component->isError()) {
 
708
                qmlInfo(parent) << component->errorString();
 
709
                delete component;
 
710
                component = NULL;
700
711
            } else {
701
 
                qmlInfo(parent) <<
702
 
                   UbuntuI18n::instance().tr(QString("Warning: Style %1 not found in theme %2").arg(styleName).arg(name()));
 
712
                // set context for the component
 
713
                QQmlEngine::setContextForObject(component, qmlContext(parent));
703
714
            }
 
715
        } else {
 
716
            qmlInfo(parent) <<
 
717
               UbuntuI18n::instance().tr(QString("Warning: Style %1 not found in theme %2").arg(styleName).arg(name()));
704
718
        }
705
719
    }
706
720
 
707
721
    return component;
708
722
}
709
723
 
710
 
void UCTheme::loadPalette(bool notify)
 
724
void UCTheme::loadPalette(QQmlEngine *engine, bool notify)
711
725
{
712
 
    if (!m_engine) {
 
726
    if (!engine) {
713
727
        return;
714
728
    }
715
729
    if (m_palette) {
721
735
    // theme may not have palette defined
722
736
    QUrl paletteUrl = styleUrl("Palette.qml", previousVersion ? previousVersion : LATEST_UITK_VERSION);
723
737
    if (paletteUrl.isValid()) {
724
 
        m_palette = QuickUtils::instance().createQmlObject(paletteUrl, m_engine);
 
738
        m_palette = QuickUtils::instance().createQmlObject(paletteUrl, engine);
725
739
        if (m_palette) {
726
740
            m_palette->setParent(this);
727
741
        }
731
745
        }
732
746
    } else {
733
747
        // use the default palette if none defined
734
 
        m_palette = defaultTheme().m_palette;
 
748
        m_palette = defaultTheme(engine)->m_palette;
735
749
    }
736
750
}
737
751
 
747
761
    }
748
762
    return result;
749
763
}
750