190 lines
5.1 KiB
C++
190 lines
5.1 KiB
C++
#include "StateColor.hpp"
|
|
|
|
static bool gDarkMode = false;
|
|
|
|
static bool operator<(wxColour const &l, wxColour const &r) { return l.GetRGBA() < r.GetRGBA(); }
|
|
|
|
static std::map<wxColour, wxColour> gDarkColors{
|
|
{"#00AE42", "#21A452"},
|
|
{"#1F8EEA", "#2778D2"},
|
|
{"#FF6F00", "#D15B00"},
|
|
{"#D01B1B", "#BB2A3A"},
|
|
{"#262E30", "#EFEFF0"},
|
|
{"#2C2C2E", "#B3B3B4"},
|
|
{"#6B6B6B", "#818183"},
|
|
{"#ACACAC", "#54545A"},
|
|
{"#EEEEEE", "#4C4C55"},
|
|
{"#E8E8E8", "#3E3E45"},
|
|
{"#323A3D", "#E5E5E4"},
|
|
{"#FFFFFF", "#2D2D31"},
|
|
{"#F8F8F8", "#36363C"},
|
|
{"#F1F1F1", "#36363B"},
|
|
{"#3B4446", "#2D2D30"},
|
|
{"#CECECE", "#54545B"},
|
|
{"#DBFDD5", "#3B3B40"},
|
|
{"#000000", "#FFFFFE"},
|
|
{"#F4F4F4", "#36363D"},
|
|
{"#DBDBDB", "#4A4A51"},
|
|
{"#EDFAF2", "#283232"},
|
|
{"#323A3C", "#E5E5E6"},
|
|
{"#6B6B6A", "#B3B3B5"},
|
|
{"#303A3C", "#E5E5E5"},
|
|
{"#FEFFFF", "#242428"},
|
|
{"#A6A9AA", "#2D2D29"},
|
|
{"#363636", "#B2B3B5"},
|
|
{"#F0F0F1", "#404040"},
|
|
{"#9E9E9E", "#53545A"},
|
|
{"#D7E8DE", "#1F2B27"},
|
|
{"#2B3436", "#808080"},
|
|
{"#ABABAB", "#ABABAB"},
|
|
{"#D9D9D9", "#2D2D32"},
|
|
//{"#F0F0F0", "#4C4C54"},
|
|
};
|
|
|
|
std::map<wxColour, wxColour> const & StateColor::GetDarkMap()
|
|
{
|
|
return gDarkColors;
|
|
}
|
|
|
|
void StateColor::SetDarkMode(bool dark) { gDarkMode = dark; }
|
|
|
|
inline wxColour darkModeColorFor2(wxColour const &color)
|
|
{
|
|
if (!gDarkMode)
|
|
return color;
|
|
auto iter = gDarkColors.find(color);
|
|
wxFAIL(iter != gDarkColors.end());
|
|
if (iter != gDarkColors.end()) return iter->second;
|
|
return color;
|
|
}
|
|
|
|
std::map<wxColour, wxColour> revert(std::map<wxColour, wxColour> const & map)
|
|
{
|
|
std::map<wxColour, wxColour> map2;
|
|
for (auto &p : map) map2.emplace(p.second, p.first);
|
|
return map2;
|
|
}
|
|
|
|
wxColour StateColor::lightModeColorFor(wxColour const &color)
|
|
{
|
|
static std::map<wxColour, wxColour> gLightColors = revert(gDarkColors);
|
|
auto iter = gLightColors.find(color);
|
|
wxFAIL(iter != gLightColors.end());
|
|
if (iter != gLightColors.end()) return iter->second;
|
|
return color;
|
|
}
|
|
|
|
wxColour StateColor::darkModeColorFor(wxColour const &color) { return darkModeColorFor2(color); }
|
|
|
|
StateColor::StateColor(wxColour const &color) { append(color, 0); }
|
|
|
|
StateColor::StateColor(wxString const &color) { append(color, 0); }
|
|
|
|
StateColor::StateColor(unsigned long color) { append(color, 0); }
|
|
|
|
void StateColor::append(wxColour const & color, int states)
|
|
{
|
|
statesList_.push_back(states);
|
|
colors_.push_back(color);
|
|
}
|
|
|
|
void StateColor::append(wxString const & color, int states)
|
|
{
|
|
wxColour c1(color);
|
|
append(c1, states);
|
|
}
|
|
|
|
void StateColor::append(unsigned long color, int states)
|
|
{
|
|
if ((color & 0xff000000) == 0)
|
|
color |= 0xff000000;
|
|
wxColour cl; cl.SetRGBA(color & 0xff00ff00 | ((color & 0xff) << 16) | ((color >> 16) & 0xff));
|
|
append(cl, states);
|
|
}
|
|
|
|
void StateColor::clear()
|
|
{
|
|
statesList_.clear();
|
|
colors_.clear();
|
|
}
|
|
|
|
int StateColor::states() const
|
|
{
|
|
int states = 0;
|
|
for (auto s : statesList_) states |= s;
|
|
states = (states & 0xffff) | (states >> 16);
|
|
if (takeFocusedAsHovered_ && (states & Hovered))
|
|
states |= Focused;
|
|
return states;
|
|
}
|
|
|
|
wxColour StateColor::defaultColor() {
|
|
return colorForStates(0);
|
|
}
|
|
|
|
wxColour StateColor::colorForStates(int states)
|
|
{
|
|
bool focused = takeFocusedAsHovered_ && (states & Focused);
|
|
for (int i = 0; i < statesList_.size(); ++i) {
|
|
int s = statesList_[i];
|
|
int on = s & 0xffff;
|
|
int off = s >> 16;
|
|
if ((on & states) == on && (off & ~states) == off) {
|
|
return darkModeColorFor2(colors_[i]);
|
|
}
|
|
if (focused && (on & Hovered)) {
|
|
on |= Focused;
|
|
on &= ~Hovered;
|
|
if ((on & states) == on && (off & ~states) == off) {
|
|
return darkModeColorFor2(colors_[i]);
|
|
}
|
|
}
|
|
}
|
|
return wxColour(0, 0, 0, 0);
|
|
}
|
|
|
|
wxColour StateColor::colorForStatesNoDark(int states)
|
|
{
|
|
bool focused = takeFocusedAsHovered_ && (states & Focused);
|
|
for (int i = 0; i < statesList_.size(); ++i) {
|
|
int s = statesList_[i];
|
|
int on = s & 0xffff;
|
|
int off = s >> 16;
|
|
if ((on & states) == on && (off & ~states) == off) {
|
|
return colors_[i];
|
|
}
|
|
if (focused && (on & Hovered)) {
|
|
on |= Focused;
|
|
on &= ~Hovered;
|
|
if ((on & states) == on && (off & ~states) == off) {
|
|
return colors_[i];
|
|
}
|
|
}
|
|
}
|
|
return wxColour(0, 0, 0, 0);
|
|
}
|
|
|
|
int StateColor::colorIndexForStates(int states)
|
|
{
|
|
for (int i = 0; i < statesList_.size(); ++i) {
|
|
int s = statesList_[i];
|
|
int on = s & 0xffff;
|
|
int off = s >> 16;
|
|
if ((on & states) == on && (off & ~states) == off) { return i; }
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
bool StateColor::setColorForStates(wxColour const &color, int states)
|
|
{
|
|
for (int i = 0; i < statesList_.size(); ++i) {
|
|
if (statesList_[i] == states) {
|
|
colors_[i] = color;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void StateColor::setTakeFocusedAsHovered(bool set) { takeFocusedAsHovered_ = set; }
|