VPalette: support referencing definition in the same group

This commit is contained in:
Le Tan 2017-12-08 19:31:33 +08:00
parent 49811cabc0
commit 0d4a62626e
2 changed files with 25 additions and 4 deletions

View File

@ -620,7 +620,6 @@ QTreeView {
color: @treeview_fg;
background: @treeview_bg;
show-decoration-selected: 0;
padding-top: 3px;
border: none;
selection-background-color: transparent;
outline: none;
@ -681,7 +680,6 @@ QListView {
color: @listview_fg;
background: @listview_bg;
show-decoration-selected: 0;
padding-top: 3px;
border: none;
selection-background-color: transparent;
outline: none;

View File

@ -42,6 +42,8 @@ void VPalette::initPaleteFromSettings(QSettings *p_settings, const QString &p_gr
QRegExp reg("@(\\w+)");
p_settings->beginGroup(p_group);
// Used to store undefined pairs.
QHash<QString, QString> undefined;
QStringList keys = p_settings->childKeys();
for (auto const & key : keys) {
if (key.isEmpty()) {
@ -54,14 +56,35 @@ void VPalette::initPaleteFromSettings(QSettings *p_settings, const QString &p_gr
if (it != m_palette.end()) {
val = it.value();
} else {
qWarning() << "non-defined reference attribute" << key << "in palette" << p_settings->fileName();
val.clear();
undefined.insert(key, reg.cap(1));
continue;
}
}
m_palette.insert(key, val);
}
// Handle definition: a=@b b=@c c=red.
int iter = 0;
while (!undefined.isEmpty()) {
if (iter >= undefined.size()) {
qWarning() << "cyclic palette definitions found" << undefined;
break;
}
for (auto it = undefined.begin(); it != undefined.end();) {
auto pit = m_palette.find(it.value());
if (pit != m_palette.end()) {
m_palette.insert(it.key(), pit.value());
iter = 0;
it = undefined.erase(it);
} else {
++iter;
++it;
}
}
}
p_settings->endGroup();
}