HAL
module_color_manager.cpp
Go to the documentation of this file.
2 
4 #include "gui/gui_globals.h"
6 
7 #include <QJsonArray>
8 #include <QJsonDocument>
9 #include <QJsonObject>
10 #include <QFile>
11 #include <QDir>
12 
13 namespace hal
14 {
15 
17  : QObject(parent)
18  {
19  setModuleColor(1, QColor(96, 110, 112));
20  }
21 
23  {
24  mModuleColors.clear();
25  }
26 
28  {
29  return mModuleColors.value(id);
30  }
31 
33  {
34  QColor retval = mModuleColors.value(id);
35  mModuleColors[id] = col;
37  return retval;
38  }
39 
40  QColor ModuleColorManager::getRandomColor()
41  {
42  static qreal h = 0.5;
43 
44  h += 0.6180339887498948;
45 
46  if (h > 1)
47  --h;
48 
49  QColor c;
50  c.setHsvF(h, 0.8, 0.95); // (MAYBE) GET S AND V FROM STYLESHEET OR CYCLE 3 DIMENSIONAL
51  return c;
52  }
53 
55  {
56  QColor retval = mModuleColors.value(id);
57  mModuleColors.insert(id,getRandomColor());
58  return retval;
59  }
60 
62  {
63  return mModuleColors;
64  }
65 
67  {
68  mModuleColors.remove(id);
69  }
70 
71  //---------------------------------------
73  : ProjectSerializer("modulecolor")
74  {;}
75 
77  {
79  std::string relname = pm->get_filename(m_name);
80  if (!relname.empty())
81  restoreModuleColor(pm->get_project_directory(), relname, mcm);
82  }
83 
84  void ModuleColorSerializer::serializeColorMap(QJsonArray& mcArr, const ModuleColorManager *mcm)
85  {
86  QMap<u32, QColor> cmap = mcm->getColorMap();
87 
88  for (auto it = cmap.constBegin(); it != cmap.constEnd(); ++it)
89  {
90  QJsonObject mcEntry;
91  mcEntry["id"] = (int) it.key();
92  mcEntry["color"] = it.value().name(QColor::HexArgb);
93  mcArr.append(mcEntry);
94  }
95  }
96 
97  std::string ModuleColorSerializer::serialize(Netlist* netlist, const std::filesystem::path& savedir, bool isAutosave)
98  {
99  Q_UNUSED(netlist);
100  Q_UNUSED(isAutosave);
101  QString mcFilename("modulecolor.json");
102  QFile mcFile(QDir(QString::fromStdString(savedir.string())).absoluteFilePath(mcFilename));
103  if (!mcFile.open(QIODevice::WriteOnly)) return std::string();
104 
105  QJsonObject mcObj;
106  QJsonArray mcArr;
107 
109  if (!mcm) return std::string();
110 
111  serializeColorMap(mcArr,mcm);
112 
113  mcObj["modcolors"] = mcArr;
114 
115  mcFile.write(QJsonDocument(mcObj).toJson(QJsonDocument::Compact));
116 
117  return mcFilename.toStdString();
118  }
119 
120 
121  void ModuleColorSerializer::deserialize(Netlist* netlist, const std::filesystem::path& loaddir)
122  {
123  Q_UNUSED(netlist);
124  std::string relname = ProjectManager::instance()->get_filename(m_name);
125  if (!relname.empty())
126  restoreModuleColor(loaddir, relname);
127  }
128 
129  void ModuleColorSerializer::restoreModuleColor(const std::filesystem::path& loaddir, const std::string& jsonfile, ModuleColorManager *mcm)
130  {
131  if (!mcm)
132  {
134  if (!mcm) return;
135  }
136 
137  QFile mcFile(QDir(QString::fromStdString(loaddir.string())).absoluteFilePath(QString::fromStdString(jsonfile)));
138  if (!mcFile.open(QIODevice::ReadOnly))
139  return;
140  QJsonDocument jsonDoc = QJsonDocument::fromJson(mcFile.readAll());
141  const QJsonObject& json = jsonDoc.object();
142 
143  if (json.contains("modcolors") && json["modcolors"].isArray())
144  {
145  QJsonArray mcArr = json["modcolors"].toArray();
146  int nmc = mcArr.size();
147  for (int imc = 0; imc < nmc; imc++)
148  {
149  QJsonObject mcEntry = mcArr.at(imc).toObject();
150  u32 moduleId = mcEntry["id"].toInt();
151  gNetlistRelay->getModuleColorManager()->setModuleColor(moduleId,QColor(mcEntry["color"].toString()));
152  }
153  }
154  }
155 }
QMap< u32, QColor > getColorMap() const
void moduleColorChanged(u32 id) const
QColor moduleColor(u32 id) const
QColor setModuleColor(u32 id, const QColor &col)
ModuleColorManager(QObject *parent=nullptr)
void restore(ModuleColorManager *mcm)
void deserialize(Netlist *netlist, const std::filesystem::path &loaddir) override
std::string serialize(Netlist *netlist, const std::filesystem::path &savedir, bool isAutosave) override
ModuleColorManager * getModuleColorManager() const
static ProjectManager * instance()
std::string get_filename(const std::string &serializer_name)
const ProjectDirectory & get_project_directory() const
NetlistRelay * gNetlistRelay
Definition: plugin_gui.cpp:81
quint32 u32
i32 id
void setHsvF(qreal h, qreal s, qreal v, qreal a)
QString absoluteFilePath(const QString &fileName) const const
virtual bool open(QIODevice::OpenMode mode) override
qint64 write(const char *data, qint64 maxSize)
void append(const QJsonValue &value)
QJsonValue at(int i) const const
int size() const const
QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error)
QJsonObject object() const const
bool contains(const QString &key) const const
QJsonValue value(const QString &key) const const
QJsonObject toObject() const const
void clear()
QMap::const_iterator constBegin() const const
QMap::const_iterator constEnd() const const
QMap::iterator insert(const Key &key, const T &value)
int remove(const Key &key)
const T value(const Key &key, const T &defaultValue) const const
Q_EMITQ_EMIT
QString fromStdString(const std::string &str)
std::string toStdString() const const