Browse Source

VPalette: support referencing definition in the same group

Le Tan 8 years ago
parent
commit
0d4a62626e
2 changed files with 25 additions and 4 deletions
  1. 0 2
      src/resources/themes/v_white/v_white.qss
  2. 25 2
      src/vpalette.cpp

+ 0 - 2
src/resources/themes/v_white/v_white.qss

@@ -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;

+ 25 - 2
src/vpalette.cpp

@@ -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();
 }