/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTHSYMBOLOGY_STYLE_SHEET_H #define OSGEARTHSYMBOLOGY_STYLE_SHEET_H 1 #include #include #include #include #include #include namespace osgEarth { using ResourceLibraries = std::map>; using StyleSelectors = std::map; /** * A complete definition of style information. */ class OSGEARTH_EXPORT StyleSheet : public Layer { public: // Simple representation of a script used locally struct ScriptDef : osg::Referenced { ScriptDef() { } ScriptDef(const std::string& code, const std::string& language = "javascript", const std::string& name = "") : code(code), language(language), name(name) { } std::string code; std::string language; std::string name; std::string profile; optional uri; }; public: class OSGEARTH_EXPORT Options : public Layer::Options { public: META_LayerOptions(osgEarth, Options, Layer::Options); StyleMap& styles() { return _styles; } const StyleMap& styles() const { return _styles; } StyleSelectors& selectors() { return _selectors; } const StyleSelectors& selectors() const { return _selectors; } osg::ref_ptr& script() { return _script; } const osg::ref_ptr& script() const { return _script; } ResourceLibraries& libraries() { return _libraries; } const ResourceLibraries& libraries() const { return _libraries; } virtual Config getConfig() const; private: void fromConfig(const Config& conf); StyleMap _styles; StyleSelectors _selectors; osg::ref_ptr _script; ResourceLibraries _libraries; }; public: META_Layer(osgEarth, StyleSheet, Options, Layer, Styles); virtual void init(); /** Gets the context for relative path resolution */ const URIContext& uriContext() const { return _uriContext; } /** Adds a style to this sheet. */ void addStyle( const Style& style ); /** Adds one or more styles from a CSS block */ void addStylesFromCSS(const std::string& css); /** Removes a style from this sheet. */ void removeStyle( const std::string& name ); /** Gets a named style from this sheet. If the name isn't found, optionally falls back on the "default" style. Note: if the name has a hashtag prefix (e.g., "#name") it will search for the name with and without the hash. (they are considered equivalent) */ Style* getStyle( const std::string& name, bool fallBackOnDefault =true ); const Style* getStyle( const std::string& name, bool fallBackOnDefault =true ) const; //! Same as getStyle, but also returns the style's index within the sheet. //! Does NOT return a default on failure. std::pair getStyleAndIndex(const std::string& name) const; /** Gets the default style in this sheet. */ Style* getDefaultStyle(); const Style* getDefaultStyle() const; /** Get access to styles for manual configuration */ StyleMap& getStyles(); const StyleMap& getStyles() const; /** Selectors pick a style from the sheet based on some criteria. */ void addSelector(const StyleSelector&); StyleSelectors& getSelectors(); const StyleSelectors& getSelectors() const; const StyleSelector* getSelector(const std::string& name) const; /** Adds a resource library. */ void addResourceLibrary( ResourceLibrary* library ); /** Gets a resource library by name. */ ResourceLibrary* getResourceLibrary( const std::string& name ) const; /** Gets the first library. */ ResourceLibrary* getDefaultResourceLibrary() const; /** Script accessors */ void setScript( ScriptDef* script ); ScriptDef* getScript() const; protected: URIContext _uriContext; Style _emptyStyle; Threading::ReadWriteMutex _resLibsMutex; }; } // namespace osgEarth OSGEARTH_SPECIALIZE_CONFIG(osgEarth::StyleSheet::Options); #endif // OSGEARTHSYMBOLOGY_STYLE_SHEET_H