void RKComponentBase::setPropertyValues (QMap<QString, QString> *list) { RK_TRACE (PLUGIN); // TODO: visibility enabledness and requiredness should be excluded, as those are not directly user settable. Perhaps even mark up all properties as user settable or not. for (QMap<QString, QString>::const_iterator it = list->constBegin (); it != list->constEnd (); ++it) { QString mod; RKComponentBase *prop = lookupComponent (it.key (), &mod); if (mod.isEmpty () && prop->isProperty ()) { // found a property static_cast<RKComponentPropertyBase*>(prop)->setValue (it.data ()); } } }
void RKContextHandler::invokeComponent (RKComponentHandle *handle) { RK_TRACE (PLUGIN); RK_ASSERT (handle); // create component RKComponent *component = handle->invoke (0, 0); // set context values for (QHash<QString, RKComponentBase*>::const_iterator it = child_map.constBegin (); it != child_map.constEnd (); ++it) { if (it.key () != "#noid#") { QString id = it.key (); QString remainder; RKComponentBase *client = component->lookupComponent (id, &remainder); RK_ASSERT (it.value ()->isProperty ()); if (!(client && remainder.isEmpty () && client->isProperty () && it.value ()->isProperty ())) { RK_DEBUG (PLUGIN, DL_INFO, "Could not set context property %s", id.toLatin1 ().data ()); continue; } static_cast<RKComponentPropertyBase *> (client)->connectToGovernor (static_cast<RKComponentPropertyBase *> (it.value ()), QString (), false); } } }
RKOptionSet::RKOptionSet (const QDomElement &element, RKComponent *parent_component, QWidget *parent_widget) : RKComponent (parent_component, parent_widget) { RK_TRACE (PLUGIN); XMLHelper *xml = XMLHelper::getStaticHelper (); updating = false; last_known_status = Processing; n_invalid_rows = n_unfinished_rows = 0; min_rows = xml->getIntAttribute (element, "min_rows", 0, DL_INFO); min_rows_if_any = xml->getIntAttribute (element, "min_rows_if_any", 1, DL_INFO); max_rows = xml->getIntAttribute (element, "max_rows", INT_MAX, DL_INFO); // build UI framework QVBoxLayout *layout = new QVBoxLayout (this); switcher = new QStackedWidget (this); layout->addWidget (switcher); user_area = new KVBox (this); switcher->addWidget (user_area); updating_notice = new QLabel (i18n ("Updating status, please wait"), this); switcher->addWidget (updating_notice); update_timer.setInterval (0); update_timer.setSingleShot (true); connect (&update_timer, SIGNAL (timeout()), this, SLOT (slotUpdateUnfinishedRows())); // create some meta properties serialization_of_set = new RKComponentPropertyBase (this, false); addChild ("serialized", serialization_of_set); connect (serialization_of_set, SIGNAL (valueChanged(RKComponentPropertyBase*)), this, SLOT (serializationPropertyChanged(RKComponentPropertyBase*))); row_count = new RKComponentPropertyInt (this, false, 0); row_count->setInternal (true); addChild ("row_count", row_count); // NOTE: read-only return_to_row = active_row = -1; current_row = new RKComponentPropertyInt (this, false, active_row); current_row->setInternal (true); addChild ("current_row", current_row); // NOTE: read-write connect (current_row, SIGNAL (valueChanged(RKComponentPropertyBase*)), this, SLOT (currentRowPropertyChanged(RKComponentPropertyBase*))); // first build the contents, as we will need to refer to the elements inside, later model = 0; display = 0; // will be created from the builder, on demand -> createDisplay () contents_container = new RKComponent (this, user_area); QDomElement content_element = xml->getChildElement (element, "content", DL_ERROR); RKComponentBuilder *builder = new RKComponentBuilder (contents_container, content_element); builder->buildElement (content_element, user_area, false); // NOTE that parent widget != parent component, here, by intention. The point is that the display should not be disabled along with the contents builder->parseLogic (xml->getChildElement (element, "logic", DL_INFO), false); builder->makeConnections (); addChild ("contents", contents_container); connect (standardComponent (), SIGNAL (standardInitializationComplete()), this, SLOT (fetchDefaults())); // create columns XMLChildList options = xml->getChildElements (element, "optioncolumn", DL_WARNING); QStringList visible_column_labels ("#"); // Optionally hidden first row for index for (int i = 0; i < options.size (); ++i) { const QDomElement &e = options.at (i); QString id = xml->getStringAttribute (e, "id", QString (), DL_ERROR); QString label = xml->getStringAttribute (e, "label", QString (), DL_DEBUG); QString governor = xml->getStringAttribute (e, "connect", QString (), DL_INFO); bool external = xml->getBoolAttribute (e, "external", false, DL_INFO); while (child_map.contains (id)) { RK_DEBUG (PLUGIN, DL_ERROR, "optionset already contains a property named %s. Renaming to _%s", qPrintable (id), qPrintable (id)); id = "_" + id; } ColumnInfo col_inf; col_inf.column_name = id; col_inf.external = external; col_inf.governor = governor; if (external && e.hasAttribute ("default")) col_inf.default_value = xml->getStringAttribute (e, "default", QString (), DL_ERROR); RKComponentPropertyStringList *column_property = new RKComponentPropertyStringList (this, false); column_property->setInternal (external); // Yes, looks strange, indeed. External properties should simply not be serialized / restored... addChild (id, column_property); connect (column_property, SIGNAL (valueChanged(RKComponentPropertyBase *)), this, SLOT (columnPropertyChanged(RKComponentPropertyBase *))); if (!label.isEmpty ()) { col_inf.display_index = visible_column_labels.size (); col_inf.column_label = label; visible_column_labels.append (label); visible_columns.append (column_property); } else { col_inf.display_index = -1; } column_map.insert (column_property, col_inf); } keycolumn = 0; QString keycol = xml->getStringAttribute (element, "keycolumn", QString (), DL_DEBUG); if (!keycol.isEmpty ()) { keycolumn = static_cast<RKComponentPropertyStringList*> (child_map.value (keycol)); if (!column_map.contains (keycolumn)) { RK_DEBUG (PLUGIN, DL_ERROR, "optionset does not contain an optioncolumn named %s. Falling back to manual insertion mode", qPrintable (keycol)); keycolumn = 0; } else if (!column_map[keycolumn].external) { RK_DEBUG (PLUGIN, DL_ERROR, "keycolumn (%s) is not marked as external. Falling back to manual insertion mode", qPrintable (keycol)); keycolumn = 0; } else { updating = true; keycolumn->setValue (KEYCOLUMN_UNINITIALIZED_VALUE); updating = false; } } QMap<RKComponentPropertyStringList *, ColumnInfo>::iterator it = column_map.begin (); for (; it != column_map.end (); ++it) { ColumnInfo &ci = it.value (); if (!ci.governor.isEmpty ()) { // there *can* be columns without governor for driven or connected option sets // Establish connections between columns and their respective governors. Since the format differs, the connection is done indirectly, through this component. // So, here, we set up a map of properties to columns, and connect to the change signals. RKComponentBase *governor = contents_container->lookupComponent (ci.governor, &ci.governor_modifier); if (governor && governor->isProperty ()) { RKComponentPropertyBase *gov_prop = static_cast<RKComponentPropertyBase*> (governor); if (ci.external) { if (!ci.governor_modifier.isEmpty ()) { RK_DEBUG (PLUGIN, DL_ERROR, "Cannot connect external column '%s' in optionset to property with modifier (%s).", qPrintable (ci.column_name), qPrintable (ci.governor)); continue; } } columns_to_update.insertMulti (gov_prop, it.key ()); connect (gov_prop, SIGNAL (valueChanged(RKComponentPropertyBase *)), this, SLOT (governingPropertyChanged(RKComponentPropertyBase *))); } else {