Skip to content

Commit

Permalink
Resolve #4444: Make selected group item colour customisable.
Browse files Browse the repository at this point in the history
And make sure newly added colour scheme items get added to existing ones
defined in the user's settings folder.
  • Loading branch information
codereader committed Dec 22, 2016
1 parent e14e55e commit dc42f6f
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 91 deletions.
10 changes: 8 additions & 2 deletions install/colours.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<colour name="default_entity" value="1 0.5 0" />
<colour name="camera_background" value="0.25 0.25 0.25" />
<colour name="selected_brush" value="1 0 0" />
<colour name="selected_group_items" value="0 0.4 0.8" />
<colour name="selected_brush_camera" value="1 0 0" />
<colour name="clipper" value="0 0 1" />
<colour name="active_view_name" value="0.5 0 0.75" />
Expand Down Expand Up @@ -43,6 +44,7 @@
<colour name="default_entity" value="1 0.5 0" />
<colour name="camera_background" value="0.25 0.25 0.25" />
<colour name="selected_brush" value="1 0 0" />
<colour name="selected_group_items" value="0 0.4 0.8" />
<colour name="selected_brush_camera" value="1 0 0" />
<colour name="clipper" value="0 0 1" />
<colour name="active_view_name" value="0.5 0 0.75" />
Expand Down Expand Up @@ -75,6 +77,7 @@
<colour name="default_entity" value="1 0.5 0" />
<colour name="camera_background" value="0.25 0.25 0.25" />
<colour name="selected_brush" value="1 0 0" />
<colour name="selected_group_items" value="0 0.4 0.8" />
<colour name="selected_brush_camera" value="1 0 0" />
<colour name="clipper" value="0 0 1" />
<colour name="active_view_name" value="0.7 0.7 0" />
Expand Down Expand Up @@ -107,6 +110,7 @@
<colour name="default_entity" value="0 0.4 0" />
<colour name="camera_background" value="0.25 0.25 0.25" />
<colour name="selected_brush" value="1 0 0" />
<colour name="selected_group_items" value="0 0.4 0.8" />
<colour name="selected_brush_camera" value="1 0 0" />
<colour name="clipper" value="0 0 1" />
<colour name="active_view_name" value="0.5 0 0.75" />
Expand Down Expand Up @@ -154,6 +158,7 @@
<colour name="patch_vertex_corner" value="1 0 1"></colour>
<colour name="patch_vertex_inside" value="0 1 0"></colour>
<colour name="selected_brush" value="1 0.898039 0.898039"></colour>
<colour name="selected_group_items" value="0 0.4 0.8" />
<colour name="selected_brush_camera" value="1 0.898039 0.898039"></colour>
<colour name="texture_background" value="0 0 0"></colour>
<colour name="workzone" value="1 0 0"></colour>
Expand All @@ -170,8 +175,9 @@
<default_brush value="Brushes" />
<default_entity value="Entities (default)" />
<camera_background value="Camera Background" />
<selected_brush value="Selected Brush" />
<selected_brush_camera value="Selected Brush (Camera)" />
<selected_brush value="Selected Items" />
<selected_group_items value="Selected Group Items" />
<selected_brush_camera value="Selected Items (Camera)" />
<clipper value="Clipper" />
<active_view_name value="Active View Name" />
<axis_x value="X-Axis" />
Expand Down
80 changes: 60 additions & 20 deletions plugins/uimanager/colourscheme/ColourScheme.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,44 +2,84 @@

#include "itextstream.h"

namespace ui {
namespace ui
{

ColourScheme::ColourScheme()
{}

/* ColourScheme Constructor
* Builds the colourscheme structure and passes the found <colour> tags to the ColourItem constructor
* All the found <colour> items are stored in a vector of ColourItems
*/
ColourScheme::ColourScheme(xml::Node& schemeNode) {
ColourScheme::ColourScheme(const xml::Node& schemeNode)
{
_readOnly = (schemeNode.getAttributeValue("readonly") == "1");

// Select all <colour> nodes from the tree
xml::NodeList colourNodes = schemeNode.getNamedChildren("colour");

if (colourNodes.size() > 0) {
// Assign the name of this scheme
_name = schemeNode.getAttributeValue("name");
if (colourNodes.empty())
{
rMessage() << "ColourScheme: No scheme items found." << std::endl;
return;
}

// Cycle through all found colour tags and add them to this scheme
for (unsigned int i = 0; i < colourNodes.size(); i++) {
std::string colourName = colourNodes[i].getAttributeValue("name");
_colours[colourName] = ColourItem(colourNodes[i]);
}
// Assign the name of this scheme
_name = schemeNode.getAttributeValue("name");

}
else {
rMessage() << "ColourScheme: No scheme items found.\n";
// Cycle through all found colour tags and add them to this scheme
for (const xml::Node& colourNode : colourNodes)
{
std::string colourName = colourNode.getAttributeValue("name");

_colours[colourName] = ColourItem(colourNode);
}
}

/* Returns the specified colour object
*/
ColourItem& ColourScheme::getColour(const std::string& colourName) {
ColourItemMap& ColourScheme::getColourMap()
{
return _colours;
}

ColourItem& ColourScheme::getColour(const std::string& colourName)
{
ColourItemMap::iterator it = _colours.find(colourName);
if (it != _colours.end()) {

if (it != _colours.end())
{
return it->second;
}
else {
rMessage() << "ColourScheme: Colour " << colourName.c_str() << " doesn't exist!\n";
return _emptyColour;

rMessage() << "ColourScheme: Colour " << colourName << " doesn't exist!" << std::endl;

return _emptyColour;
}

const std::string& ColourScheme::getName() const
{
return _name;
}

bool ColourScheme::isReadOnly() const
{
return _readOnly;
}

void ColourScheme::setReadOnly(bool isReadOnly)
{
_readOnly = isReadOnly;
}

void ColourScheme::mergeMissingItemsFromScheme(const ColourScheme& other)
{
for (const ColourItemMap::value_type& otherPair : other._colours)
{
// Insert any ColourItems from the other mapping into this scheme
if (_colours.find(otherPair.first) == _colours.end())
{
_colours.insert(otherPair);
}
}
}

Expand Down
84 changes: 38 additions & 46 deletions plugins/uimanager/colourscheme/ColourScheme.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,84 +5,76 @@
#include "string/convert.h"
#include "xmlutil/Node.h"

namespace ui {
namespace ui
{

/* The ColourItem represents a single colour. This ia a simple derivative of
* Vector3 which provides an additional constructor to extract the colour information
* from an XML node.
*/

class ColourItem
: public Vector3
class ColourItem :
public Vector3
{
public:

/** Default constructor. Creates a black colour.
*/
ColourItem()
: Vector3(0, 0, 0)
ColourItem() :
Vector3(0, 0, 0)
{}

/** Construct a ColourItem from an XML Node.
*/
ColourItem(xml::Node& colourNode)
: Vector3(string::convert<Vector3>(colourNode.getAttributeValue("value")))
ColourItem(const xml::Node& colourNode) :
Vector3(string::convert<Vector3>(colourNode.getAttributeValue("value")))
{}

};

typedef std::map<const std::string, ColourItem> ColourItemMap;

/* A colourscheme is basically a collection of ColourItems
*/
class ColourScheme {

private:
// The name of this scheme
std::string _name;
class ColourScheme
{
private:
// The name of this scheme
std::string _name;

// The ColourItems Map
ColourItemMap _colours;
// The ColourItems Map
ColourItemMap _colours;

// True if the scheme must not be edited
bool _readOnly;
// True if the scheme must not be edited
bool _readOnly;

/* Empty Colour, this serves as return value for
non-existing, but requested colours */
ColourItem _emptyColour;
/* Empty Colour, this serves as return value for
non-existing, but requested colours */
ColourItem _emptyColour;

public:
// Constructors
ColourScheme() {};
// Constructs a ColourScheme from a given xml::node
ColourScheme(xml::Node& schemeNode);
public:
// Constructors
ColourScheme();

// Returns the list of ColourItems
ColourItemMap& getColourMap() {
return _colours;
}
// Constructs a ColourScheme from a given xml::node
ColourScheme(const xml::Node& schemeNode);

// Returns the requested colour object
ColourItem& getColour(const std::string& colourName);
// Returns the list of ColourItems
ColourItemMap& getColourMap();

// returns the name of this colour scheme
std::string getName() const {
return _name;
}
// Returns the requested colour object
ColourItem& getColour(const std::string& colourName);

// returns true if the scheme is read-only
bool isReadOnly() const {
return _readOnly;
}
// returns the name of this colour scheme
const std::string& getName() const;

// set the read-only status of this scheme
void setReadOnly(const bool isReadOnly) {
_readOnly = isReadOnly;
}
// returns true if the scheme is read-only
bool isReadOnly() const;

// Destructor
~ColourScheme() {};
// set the read-only status of this scheme
void setReadOnly(bool isReadOnly);

}; // class ColourScheme
// Tries to add any missing items from the given scheme into this one
void mergeMissingItemsFromScheme(const ColourScheme& other);
};

} // namespace ui
51 changes: 29 additions & 22 deletions plugins/uimanager/colourscheme/ColourSchemeManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,6 @@ void ColourSchemeManager::saveColourSchemes()

void ColourSchemeManager::loadColourSchemes()
{
std::string schemeName = "";

// load from XMLRegistry
rMessage() << "ColourSchemeManager: Loading colour schemes..." << std::endl;

Expand All @@ -156,36 +154,45 @@ void ColourSchemeManager::loadColourSchemes()
"user/ui/colourschemes/colourscheme[@version='" + COLOURSCHEME_VERSION + "']"
);

if (!schemeNodes.empty())
if (schemeNodes.empty())
{
// Cycle through all found scheme nodes
for (std::size_t i = 0; i < schemeNodes.size(); i++)
rMessage() << "ColourSchemeManager: No schemes found..." << std::endl;
return;
}

std::string schemeName = "";

// Cycle through all found scheme nodes
for (const xml::Node& node : schemeNodes)
{
schemeName = node.getAttributeValue("name");

// If the scheme is already in the list, skip it
if (!schemeExists(schemeName))
{
schemeName = schemeNodes[i].getAttributeValue("name");
// Construct the ColourScheme class from the xml::node
_colourSchemes[schemeName] = ColourScheme(node);

// If the scheme is already in the list, skip it
if (!schemeExists(schemeName))
// Check, if this is the currently active scheme
if (node.getAttributeValue("active") == "1")
{
// Construct the ColourScheme class from the xml::node
_colourSchemes[schemeName] = ColourScheme(schemeNodes[i]);

// Check, if this is the currently active scheme
if (schemeNodes[i].getAttributeValue("active") == "1")
{
_activeScheme = schemeName;
}
_activeScheme = schemeName;
}
}

// If there isn't any active scheme yet, take the last one as active scheme
if (_activeScheme.empty() && !schemeNodes.empty())
else if (node.getAttributeValue("readonly") == "1")
{
_activeScheme = schemeName;
// Scheme exists, but we have a factory-defined scheme
// try to merge any missing items into the existing scheme
ColourScheme readOnlyScheme(node);

_colourSchemes[schemeName].mergeMissingItemsFromScheme(readOnlyScheme);
}
}
else

// If there isn't any active scheme yet, take the last one as active scheme
if (_activeScheme.empty() && !schemeNodes.empty())
{
rMessage() << "ColourSchemeManager: No schemes found..." << std::endl;
_activeScheme = schemeName;
}
}

Expand Down
2 changes: 1 addition & 1 deletion radiant/render/backend/OpenGLShader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ void OpenGLShader::construct(const std::string& name)
}
else if (name == "$XY_OVERLAY_GROUP")
{
Vector3 colorSelBrushes(0, 0.4, 0.8);
Vector3 colorSelBrushes = ColourSchemes().getColour("selected_group_items");
state.setColour(colorSelBrushes[0],
colorSelBrushes[1],
colorSelBrushes[2],
Expand Down

0 comments on commit dc42f6f

Please sign in to comment.