diff options
Diffstat (limited to 'src/kconfig_compiler/kconfig_compiler.cpp')
| -rw-r--r-- | src/kconfig_compiler/kconfig_compiler.cpp | 79 | 
1 files changed, 59 insertions, 20 deletions
| diff --git a/src/kconfig_compiler/kconfig_compiler.cpp b/src/kconfig_compiler/kconfig_compiler.cpp index 0c4254a2..7d84cfbc 100644 --- a/src/kconfig_compiler/kconfig_compiler.cpp +++ b/src/kconfig_compiler/kconfig_compiler.cpp @@ -1152,12 +1152,17 @@ static QString itemDeclaration(const CfgEntry *e, const CfgConfig &cfg)          return QString();      } +    QString type; +    if (!e->signalList().isEmpty()) { +        type = "KConfigCompilerSignallingItem"; +    } else { +        type = cfg.inherits + "::Item" + itemType(e->type()); +    } +      QString fCap = e->name();      fCap[0] = fCap[0].toUpper(); -    return "  " + cfg.inherits + "::Item" + itemType(e->type()) + -           "  *item" + fCap + -           ((!e->param().isEmpty()) ? (QString("[%1]").arg(e->paramMax() + 1)) : QString()) + -           ";\n"; +    return "  " + type + "  *item" + fCap + +            ( (!e->param().isEmpty())?(QString("[%1]").arg(e->paramMax()+1)) : QString()) + ";\n";  }  // returns the name of an item variable @@ -1192,24 +1197,41 @@ static QString itemPath(const CfgEntry *e, const CfgConfig &cfg)      return result;  } -QString newItem(const QString &type, const QString &name, const QString &key, -                const QString &defaultValue, const CfgConfig &cfg, const QString ¶m = QString()) -{ -    QString t = "new " + cfg.inherits + "::Item" + itemType(type) + -                "( currentGroup(), " + key + ", " + varPath(name, cfg) + param; -    if (type == "Enum") { -        t += ", values" + name; +QString newItem(const CfgEntry* entry, const QString &key, const QString& defaultValue, +                const CfgConfig &cfg, const QString ¶m = QString()) { + +    QList<Signal> sigs = entry->signalList(); +    QString t; +    if (!sigs.isEmpty()) { +        t += "new KConfigCompilerSignallingItem("; +    } +    t += "new "+ cfg.inherits + "::Item" + itemType(entry->type()) + "( currentGroup(), " +            + key + ", " + varPath( entry->name(), cfg ) + param; + +    if (entry->type() == "Enum") { +        t += ", values" + entry->name();      }      if (!defaultValue.isEmpty()) {          t += ", "; -        if (type == "String") { +        if (entry->type() == "String") {              t += defaultValue;          } else {              t += defaultValue;          }      } -    t += " );"; +    t += " )"; +    if (!sigs.isEmpty()) { +        t += ", this, notifyFunction, "; +        //append the signal flags +        for (int i = 0; i < sigs.size(); ++i) { +            if (i != 0) +                t += " | "; +            t += signalEnumName(sigs[i].name); +        } +        t += ")"; +    } +    t += ";";      return t;  } @@ -2019,6 +2041,10 @@ int main(int argc, char **argv)              h << ");" << endl;          }          h << endl; + +        h << "  private:" << endl; +        h << "    void itemChanged(quint64 flags);" << endl; +        h << endl;      }      h << "  protected:" << endl; @@ -2185,7 +2211,10 @@ int main(int argc, char **argv)          }          cpp << endl << "    // items" << endl;          for (itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry) { -            cpp << "    " + cfg.inherits + "::Item" << itemType((*itEntry)->type()) << " *" << itemVar(*itEntry, cfg); +            const QString declType = (*itEntry)->signalList().isEmpty() +                    ? QString(cfg.inherits + "::Item" + itemType((*itEntry)->type())) +                    : "KConfigCompilerSignallingItem"; +            cpp << "    " << declType << " *" << itemVar( *itEntry, cfg );              if (!(*itEntry)->param().isEmpty()) {                  cpp << QString("[%1]").arg((*itEntry)->paramMax() + 1);              } @@ -2302,6 +2331,14 @@ int main(int argc, char **argv)      group.clear(); +    if (hasSignals) { +        // this cast to base-class pointer-to-member is valid C++ +        // http://stackoverflow.com/questions/4272909/is-it-safe-to-upcast-a-method-pointer-and-use-it-with-base-class-pointer/ +        cpp << "  KConfigCompilerSignallingItem::NotifyFunction notifyFunction =" +            << " static_cast<KConfigCompilerSignallingItem::NotifyFunction>(&" +            << cfg.className << "::itemChanged);" << endl << endl; +    } +      for (itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry) {          if ((*itEntry)->group() != group) {              if (!group.isEmpty()) { @@ -2353,7 +2390,7 @@ int main(int argc, char **argv)          if ((*itEntry)->param().isEmpty()) {              // Normal case              cpp << "  " << itemPath(*itEntry, cfg) << " = " -                << newItem((*itEntry)->type(), (*itEntry)->name(), key, (*itEntry)->defaultValue(), cfg) << endl; +                << newItem((*itEntry), key, (*itEntry)->defaultValue(), cfg) << endl;              if (!(*itEntry)->minValue().isEmpty()) {                  cpp << "  " << itemPath(*itEntry, cfg) << "->setMinValue(" << (*itEntry)->minValue() << ");" << endl; @@ -2388,8 +2425,7 @@ int main(int argc, char **argv)                  }                  cpp << "  " << itemVarStr << " = " -                    << newItem((*itEntry)->type(), (*itEntry)->name(), paramString(key, *itEntry, i), defaultStr, cfg,  QString("[%1]").arg(i)) -                    << endl; +                    << newItem((*itEntry), paramString(key, *itEntry, i), defaultStr, cfg, QString("[%1]").arg(i)) << endl;                  if (cfg.setUserTexts) {                      cpp << userTextsFunctions(*itEntry, cfg, itemVarStr, (*itEntry)->paramName()); @@ -2537,10 +2573,13 @@ int main(int argc, char **argv)          cpp << "  " << varPath("settingsChanged", cfg) << " = 0;" << endl;          cpp << "  return true;" << endl;          cpp << "}" << endl; -    } -    // Add includemoc if they are signals defined. -    if (hasSignals) { +        cpp << endl; +        cpp << "void " << cfg.className << "::" << "itemChanged(quint64 flags) {" << endl; +        cpp << "  " << varPath("settingsChanged", cfg) << " |= flags;" << endl; +        cpp << "}" << endl; + +        // Add includemoc if they are signals defined.          cpp << endl;          cpp << "#include \"" << mocFileName << "\"" << endl;          cpp << endl; | 
