From d8615a868204f25388013bbcad566d3be08d1a53 Mon Sep 17 00:00:00 2001 From: James Hogan Date: Sun, 28 Dec 2008 02:59:54 +0000 Subject: [PATCH] New css schema object for constructing property values from strings most display styles have been commented out as they now require template instantiation that is incomplete --- kworship/css/{KwCssStandardise.h => KwCssSchema.h} | 92 +++++++++++----------- kworship/css/KwCssScope.cpp | 9 ++- kworship/css/KwCssScope.h | 5 +- kworship/css/KwCssStandardise.h | 30 ++++++- kworship/css/KwCssStyle.cpp | 2 +- kworship/css/KwCssStyle.h | 16 ++++ kworship/css/KwCssStyleSheet.cpp | 4 +- kworship/css/KwCssStyleSheet.h | 3 +- kworship/css/KwCssStyles.cpp | 5 +- kworship/css/KwCssStyles.h | 3 +- kworship/display/CMakeLists.txt | 1 + .../KwDisplayStyles.cpp} | 67 +--------------- kworship/display/KwDisplayStyles.h | 13 +++ kworship/playlist/KwPlaylistItem.cpp | 5 +- 14 files changed, 130 insertions(+), 125 deletions(-) copy kworship/css/{KwCssStandardise.h => KwCssSchema.h} (57%) copy kworship/{css/KwCssStandardise.h => display/KwDisplayStyles.cpp} (52%) diff --git a/kworship/css/KwCssStandardise.h b/kworship/css/KwCssSchema.h similarity index 57% copy from kworship/css/KwCssStandardise.h copy to kworship/css/KwCssSchema.h index 833ca7b..2bfec66 100644 --- a/kworship/css/KwCssStandardise.h +++ b/kworship/css/KwCssSchema.h @@ -17,70 +17,72 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef _KwCssStandardise_h_ -#define _KwCssStandardise_h_ +#ifndef _KwCssSchema_h_ +#define _KwCssSchema_h_ /** - * @file KwCssStandardise.h - * @brief Macros for css standardisation. + * @file KwCssSchema.h + * @brief Schema of styles. * @author James Hogan */ #include "KwCssScope.h" -/// Simple class for accessing a style. -template -class KwCssStyleAccessor +#include +#include + +#include +/// Schema of styles. +class KwCssSchema { public: - virtual ~KwCssStyleAccessor() + + /* + * Constructors + destructor + */ + + /// Default constructor + KwCssSchema() { } + /* * Main interface */ - T operator () (const KwCssScope* scope) const - { - return scope->getStyles().getStyle(getName()); - } - protected: - virtual QString getName() const = 0; -}; -/// Start the root css namespace. -#define KWCSS_ROOT_NAMESPACE(NAME) \ - namespace NAME \ - { \ - QString _scopeName() \ - { \ - return #NAME; \ + /// Register a new property. + template + void registerProperty(const QString& name) + { + m_constructors[name] = &KwCssConstruct; } -/// Start a non-root css namespace. -#define KWCSS_START_NAMESPACE(PREV,NAME) \ - namespace NAME \ - { \ - QString _scopeName() \ - { \ - return #PREV "." #NAME; \ + /// Construct from an unprocessed string and a style name. + KwCssAbstractStyle* construct(const QString& name, const KwCssUnprocessed& value) const + { + KwCssAbstractStyle* result = 0; + if (m_constructors.contains(name)) + { + result = m_constructors[name](value); + } + if (0 == result) + { + result = new KwCssStyle(value); + } + return result; } -/// End a css namespace. -#define KWCSS_END_NAMESPACE() \ - }; + private: + + /* + * Variables + */ -/// Define a property in a css namespace. -#define KWCSS_DEFINE_PROPERTY(TYPE, LNAME) \ - class Acc_##LNAME : public KwCssStyleAccessor< TYPE > \ - { \ - protected: \ - virtual QString getName() const \ - { \ - QString name = _scopeName(); \ - name.append("." #LNAME); \ - return name; \ - } \ - } LNAME; + /// Constructor function. + typedef KwCssAbstractStyle* Constructor(const KwCssUnprocessed& value); + /// Hash of style names to constructors. + QHash m_constructors; +}; -#endif // _KwCssStandardise_h_ +#endif // _KwCssSchema_h_ diff --git a/kworship/css/KwCssScope.cpp b/kworship/css/KwCssScope.cpp index 97edb31..5fe53ad 100644 --- a/kworship/css/KwCssScope.cpp +++ b/kworship/css/KwCssScope.cpp @@ -35,8 +35,9 @@ */ /// Primary constructor. -KwCssScope::KwCssScope(KwCssScope* parent) -: m_parentScope(parent) +KwCssScope::KwCssScope(KwCssSchema* schema, KwCssScope* parent) +: m_schema(schema) +, m_parentScope(parent) , m_childScopes() , m_name() , m_classes() @@ -97,7 +98,7 @@ void KwCssScope::importStylesFromDom(const QDomElement& element, KwResourceManag for (int i = 0; i < elems.count(); ++i) { KwCssStyleSheet* newSheet = new KwCssStyleSheet; - newSheet->import(elems.at(i).toElement().text()); + newSheet->import(m_schema, elems.at(i).toElement().text()); m_styleSheets.push_back(newSheet); } if (elems.count() > 0) @@ -110,7 +111,7 @@ void KwCssScope::importStylesFromDom(const QDomElement& element, KwResourceManag for (int i = 0; i < elems.count(); ++i) { QString styles = elems.at(i).toElement().text(); - int last = m_styles.import(styles); + int last = m_styles.import(m_schema, styles); /// @todo Check it got to the end of the styles } } diff --git a/kworship/css/KwCssScope.h b/kworship/css/KwCssScope.h index d15dcff..3573d03 100644 --- a/kworship/css/KwCssScope.h +++ b/kworship/css/KwCssScope.h @@ -67,7 +67,7 @@ class KwCssScope */ /// Primary constructor. - KwCssScope(KwCssScope* parent = 0); + KwCssScope(KwCssSchema* schema, KwCssScope* parent = 0); /// Destructor. virtual ~KwCssScope(); @@ -148,6 +148,9 @@ class KwCssScope * Basic data */ + /// Style schema. + KwCssSchema* m_schema; + /// Parent scope. KwCssScope* m_parentScope; diff --git a/kworship/css/KwCssStandardise.h b/kworship/css/KwCssStandardise.h index 833ca7b..3aeb4bf 100644 --- a/kworship/css/KwCssStandardise.h +++ b/kworship/css/KwCssStandardise.h @@ -27,6 +27,7 @@ */ #include "KwCssScope.h" +#include "KwCssSchema.h" /// Simple class for accessing a style. template @@ -43,15 +44,31 @@ class KwCssStyleAccessor { return scope->getStyles().getStyle(getName()); } + + void registerToSchema(KwCssSchema* schema) const + { + schema->registerProperty(getName()); + } protected: virtual QString getName() const = 0; }; +#define KWCSS_SCHEMA \ + inline KwCssSchema* schema() \ + { \ + static KwCssSchema* s = 0; \ + if (0 == s) \ + { \ + s = new KwCssSchema; \ + } \ + return s; \ + } + /// Start the root css namespace. #define KWCSS_ROOT_NAMESPACE(NAME) \ namespace NAME \ { \ - QString _scopeName() \ + inline QString _scopeName() \ { \ return #NAME; \ } @@ -60,7 +77,7 @@ class KwCssStyleAccessor #define KWCSS_START_NAMESPACE(PREV,NAME) \ namespace NAME \ { \ - QString _scopeName() \ + inline QString _scopeName() \ { \ return #PREV "." #NAME; \ } @@ -71,8 +88,13 @@ class KwCssStyleAccessor /// Define a property in a css namespace. #define KWCSS_DEFINE_PROPERTY(TYPE, LNAME) \ - class Acc_##LNAME : public KwCssStyleAccessor< TYPE > \ + KWCSS_EXTERN class Acc_##LNAME : public KwCssStyleAccessor< TYPE > \ { \ + public: \ + Acc_##LNAME() \ + { \ + registerToSchema(schema()); \ + } \ protected: \ virtual QString getName() const \ { \ @@ -82,5 +104,7 @@ class KwCssStyleAccessor } \ } LNAME; +#define KWCSS_EXTERN extern + #endif // _KwCssStandardise_h_ diff --git a/kworship/css/KwCssStyle.cpp b/kworship/css/KwCssStyle.cpp index 189144e..9573ee7 100644 --- a/kworship/css/KwCssStyle.cpp +++ b/kworship/css/KwCssStyle.cpp @@ -113,6 +113,6 @@ KwCssUnprocessed KwCssStringify(const QPixmap& value) template <> QPixmap KwCssUnstringify(const KwCssUnprocessed& value, bool* success) { - *success = false; + *success = true; return QPixmap(); } diff --git a/kworship/css/KwCssStyle.h b/kworship/css/KwCssStyle.h index 95dc37e..2e50f22 100644 --- a/kworship/css/KwCssStyle.h +++ b/kworship/css/KwCssStyle.h @@ -171,6 +171,22 @@ class KwCssStyle : public KwCssAbstractStyle T m_value; }; +/// Construct a style of some type from an unprocessed string. +template +KwCssAbstractStyle* KwCssConstruct(const KwCssUnprocessed& value) +{ + bool worked; + T val = KwCssUnstringify(value, &worked); + if (worked) + { + return new KwCssStyle(val); + } + else + { + return 0; + } +} + #include "KwCssStyleState.h" /// Get a new state. diff --git a/kworship/css/KwCssStyleSheet.cpp b/kworship/css/KwCssStyleSheet.cpp index 2fd4cf8..19b5d30 100644 --- a/kworship/css/KwCssStyleSheet.cpp +++ b/kworship/css/KwCssStyleSheet.cpp @@ -77,7 +77,7 @@ void KwCssStyleSheet::importStyleSheet(const KwCssStyleSheet* styleSheet) } /// Import from CSS-like format into the sheet. -void KwCssStyleSheet::import(const QString& sheet) +void KwCssStyleSheet::import(const KwCssSchema* schema, const QString& sheet) { QString css = sheet; @@ -146,7 +146,7 @@ void KwCssStyleSheet::import(const QString& sheet) } // Read the styles - lastRulesPos = rule.getStyles()->import(css, lastRulesPos); + lastRulesPos = rule.getStyles()->import(schema, css, lastRulesPos); // End of rule static QRegExp reRuleEnd("^\\}\\s*"); diff --git a/kworship/css/KwCssStyleSheet.h b/kworship/css/KwCssStyleSheet.h index 25c292e..7c976b5 100644 --- a/kworship/css/KwCssStyleSheet.h +++ b/kworship/css/KwCssStyleSheet.h @@ -29,6 +29,7 @@ #include class KwCssStyleRule; +class KwCssSchema; /// Cascading style sheet. /** @@ -82,7 +83,7 @@ class KwCssStyleSheet void importStyleSheet(const KwCssStyleSheet* styleSheet); /// Import from CSS-like format into the sheet. - void import(const QString& sheet); + void import(const KwCssSchema* schema, const QString& sheet); /* * Accessors diff --git a/kworship/css/KwCssStyles.cpp b/kworship/css/KwCssStyles.cpp index a7f2dc5..d13deca 100644 --- a/kworship/css/KwCssStyles.cpp +++ b/kworship/css/KwCssStyles.cpp @@ -27,6 +27,7 @@ #include "KwCssStyleStates.h" #include "KwCssAbstractStyle.h" #include "KwCssAbstractStyleState.h" +#include "KwCssSchema.h" #include @@ -98,7 +99,7 @@ QString KwCssStyles::toString() const } /// Import from CSS-like format into the sheet. -int KwCssStyles::import(const QString& sheet, int start) +int KwCssStyles::import(const KwCssSchema* schema, const QString& sheet, int start) { // Read the styles static QRegExp reStyle("^([\\w.]+)\\s*:\\s*(\\S[^;]*);\\s*"); @@ -108,7 +109,7 @@ int KwCssStyles::import(const QString& sheet, int start) last = start + reStyle.matchedLength(); QString name = reStyle.cap(1); KwCssUnprocessed value = reStyle.cap(2); - setStyle(name, value); + setRawStyle(name, schema->construct(name, value)); } return last; } diff --git a/kworship/css/KwCssStyles.h b/kworship/css/KwCssStyles.h index ba9697f..16f328d 100644 --- a/kworship/css/KwCssStyles.h +++ b/kworship/css/KwCssStyles.h @@ -32,6 +32,7 @@ class KwCssAbstractStyle; class KwCssStyleStates; +class KwCssSchema; /// Set of cascading style properties. class KwCssStyles @@ -74,7 +75,7 @@ class KwCssStyles /** Import from CSS-like format into the sheet. * @return position of first character after styles. */ - int import(const QString& sheet, int start = 0); + int import(const KwCssSchema* schema, const QString& sheet, int start = 0); /* * Operators diff --git a/kworship/display/CMakeLists.txt b/kworship/display/CMakeLists.txt index d28cad1..a94d108 100644 --- a/kworship/display/CMakeLists.txt +++ b/kworship/display/CMakeLists.txt @@ -22,6 +22,7 @@ set(kworshipdisplay_SRCS KwBackgroundManager.cpp KwTextManager.cpp KwOverlayManager.cpp + KwDisplayStyles.cpp ) kde4_add_library(kworshipdisplay ${kworshipdisplay_SRCS}) diff --git a/kworship/css/KwCssStandardise.h b/kworship/display/KwDisplayStyles.cpp similarity index 52% copy from kworship/css/KwCssStandardise.h copy to kworship/display/KwDisplayStyles.cpp index 833ca7b..b488a59 100644 --- a/kworship/css/KwCssStandardise.h +++ b/kworship/display/KwDisplayStyles.cpp @@ -17,70 +17,11 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#ifndef _KwCssStandardise_h_ -#define _KwCssStandardise_h_ - /** - * @file KwCssStandardise.h - * @brief Macros for css standardisation. + * @file KwDisplayStyles.cpp + * @brief Display styles interface. * @author James Hogan */ -#include "KwCssScope.h" - -/// Simple class for accessing a style. -template -class KwCssStyleAccessor -{ - public: - virtual ~KwCssStyleAccessor() - { - } - /* - * Main interface - */ - T operator () (const KwCssScope* scope) const - { - return scope->getStyles().getStyle(getName()); - } - protected: - virtual QString getName() const = 0; -}; - -/// Start the root css namespace. -#define KWCSS_ROOT_NAMESPACE(NAME) \ - namespace NAME \ - { \ - QString _scopeName() \ - { \ - return #NAME; \ - } - -/// Start a non-root css namespace. -#define KWCSS_START_NAMESPACE(PREV,NAME) \ - namespace NAME \ - { \ - QString _scopeName() \ - { \ - return #PREV "." #NAME; \ - } - -/// End a css namespace. -#define KWCSS_END_NAMESPACE() \ - }; - -/// Define a property in a css namespace. -#define KWCSS_DEFINE_PROPERTY(TYPE, LNAME) \ - class Acc_##LNAME : public KwCssStyleAccessor< TYPE > \ - { \ - protected: \ - virtual QString getName() const \ - { \ - QString name = _scopeName(); \ - name.append("." #LNAME); \ - return name; \ - } \ - } LNAME; - -#endif // _KwCssStandardise_h_ - +#define KW_DISPLAY_STYLES_DECLARE +#include "KwDisplayStyles.h" diff --git a/kworship/display/KwDisplayStyles.h b/kworship/display/KwDisplayStyles.h index 7d3a936..3d063fe 100644 --- a/kworship/display/KwDisplayStyles.h +++ b/kworship/display/KwDisplayStyles.h @@ -33,8 +33,17 @@ #include #include +// The cpp file defines this to declare static variables +#ifdef KW_DISPLAY_STYLES_DECLARE +#undef KWCSS_EXTERN +#define KWCSS_EXTERN +#endif + namespace KwDisplayStyles { + // Define schema accessor + KWCSS_SCHEMA + // Display background KWCSS_ROOT_NAMESPACE(background) // Brush to fill the background @@ -44,6 +53,7 @@ namespace KwDisplayStyles // Pixmap to display KWCSS_DEFINE_PROPERTY(QPixmap, pixmap) KWCSS_END_NAMESPACE() + /* // Video backgrounds KWCSS_START_NAMESPACE(background, video) // Path of video file @@ -51,8 +61,10 @@ namespace KwDisplayStyles // Whether to loop the video KWCSS_DEFINE_PROPERTY(bool, loop) KWCSS_END_NAMESPACE() + */ KWCSS_END_NAMESPACE() + /* // Text KWCSS_ROOT_NAMESPACE(text) // Font display settings @@ -69,6 +81,7 @@ namespace KwDisplayStyles KWCSS_END_NAMESPACE() // Text layout settings KWCSS_END_NAMESPACE() + */ } #endif // _KwDisplayStyles_h_ diff --git a/kworship/playlist/KwPlaylistItem.cpp b/kworship/playlist/KwPlaylistItem.cpp index af13605..ea42be2 100644 --- a/kworship/playlist/KwPlaylistItem.cpp +++ b/kworship/playlist/KwPlaylistItem.cpp @@ -26,6 +26,7 @@ #include "KwPlaylistItem.h" #include "KwPlaylistUnknown.h" #include "KwResourceLink.h" +#include #include #include @@ -47,7 +48,7 @@ KwPlaylistItem::Factory* KwPlaylistItem::factory() /// Default constructor. KwPlaylistItem::KwPlaylistItem() -: KwCssScope() +: KwCssScope(KwDisplayStyles::schema()) , m_domDocument() , m_domPreserve(m_domDocument.createDocumentFragment()) { @@ -55,7 +56,7 @@ KwPlaylistItem::KwPlaylistItem() /// Construct from a DOM element. KwPlaylistItem::KwPlaylistItem(const QDomElement& element, KwResourceManager* resourceManager) -: KwCssScope() +: KwCssScope(KwDisplayStyles::schema()) , m_domDocument() , m_domPreserve(m_domDocument.createDocumentFragment()) { -- 2.11.4.GIT