/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2020 Jon Evans * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef _COLOR_SETTINGS_H #define _COLOR_SETTINGS_H #include #include using KIGFX::COLOR4D; /** * Color settings are a bit different than most of the settings objects in that there * can be more than one of them loaded at once. * * Each COLOR_SETTINGS object corresponds to a single color scheme file on disk. * The default color scheme is called "default" and will be created on first run. * * When users change color settings, they have the option of modifying the default scheme * or saving their changes to a new color scheme file. * * Each COLOR_SETTINGS defines all the settings used across all parts of KiCad, but it's not * necessary for the underlying theme file to contain all of them. The color settings cascade, * so if a user chooses a non-default scheme for a certain application, and that non-default * scheme file is missing some color definitions, those will fall back to those from the "default" * scheme (which is either loaded from disk or created if missing) * * Each application (eeschema, gerbview, pcbnew) can have a different active color scheme selected. * The "child applications" (library editors) inherit from either eeschema or pcbnew. */ #include #include /** * For specifying whether to retrieve colors from the "pcbnew" or "fpedit" set. * Can be removed once color themes exist. */ enum class COLOR_CONTEXT { PCB, FOOTPRINT }; class COLOR_SETTINGS : public JSON_SETTINGS { public: /** * m_Pallete stores a list of colors that are used, in order, when a list of colors needs to be * generated for an application. For example, layer colors in GerbView, or default layer colors * in PcbNew. */ std::vector m_Palette; explicit COLOR_SETTINGS( std::string aFilename = "user" ); virtual ~COLOR_SETTINGS() {} bool MigrateFromLegacy( wxConfigBase* aCfg ) override; COLOR4D GetColor( int aLayer ) const; COLOR4D GetDefaultColor( int aLayer ); void SetColor( int aLayer, COLOR4D aColor ); // TODO(JE) remove once color themes exist void SetColorContext( COLOR_CONTEXT aContext = COLOR_CONTEXT::PCB ) { m_color_context = aContext; } private: wxString m_displayName; /** * Map of all layer colors. * The key needs to be a valid layer ID, see layers_id_colors_and_visibility.h */ std::unordered_map m_colors; std::unordered_map m_defaultColors; // TODO(JE) remove once color themes exist COLOR_CONTEXT m_color_context; }; class COLOR_MAP_PARAM : public PARAM_BASE { public: COLOR_MAP_PARAM( const std::string& aJsonPath, int aMapKey, COLOR4D aDefault, std::unordered_map* aMap, bool aReadOnly = false ) : PARAM_BASE( aJsonPath, aReadOnly ), m_key( aMapKey ), m_default( aDefault ), m_map( aMap ) {} void Load( JSON_SETTINGS* aSettings ) const override { if( m_readOnly ) return; COLOR4D val = m_default; try { val = aSettings->Get( m_path ); } catch( ... ) {} ( *m_map )[ m_key ] = val; } void Store( JSON_SETTINGS* aSettings) const override { aSettings->Set( m_path, ( *m_map )[ m_key ] ); } int GetKey() const { return m_key; } COLOR4D GetDefault() const { return m_default; } virtual void SetDefault() override { ( *m_map )[ m_key ] = m_default; } private: int m_key; COLOR4D m_default; std::unordered_map* m_map; }; #endif