Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Vue Special Syntax
- `v-if/v-else-if/v-else`.
- `v-for` (does not support int index e.g.: `value, key, index`).
- `v-on`.
- `v-on:(click:mousedown|mouseup|mouseover|mouseout)[.[ctrl|alt|meta|shift|exact]]`.
- `v-on:(click|mousedown|mouseup|mouseover|mouseout)[.[ctrl|alt|meta|shift|exact]]`.
- `v-on:(keyup|keydown|keypress)[.][<key_code>]`.
- `v-on:change`.
- Attributes starting with `:` are treated as `v-bind:...`.
Expand Down
26 changes: 0 additions & 26 deletions src/imvue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,32 +257,6 @@ namespace ImVue {
return;
}

if(!mConfigured) {
// register some built-in element types
mCtx->factory->element<Document>("template");
mCtx->factory->element<Element>("__element__")
.handler<MouseEventHandler>("click")
.handler<MouseEventHandler>("mousedown")
.handler<MouseEventHandler>("mouseup")
.handler<MouseEventHandler>("mouseover")
.handler<MouseEventHandler>("mouseout")
.handler<MouseEventHandler>("mouseout")
.handler<ChangeEventHandler>("change")
.handler<KeyboardEventHandler>("keydown")
.handler<KeyboardEventHandler>("keyup")
.handler<KeyboardEventHandler>("keypress")
.attribute("id", &Element::id)
.attribute("key", &Element::key)
.attribute("ref", &Element::ref);

mCtx->factory->element<Slot>("slot");

mCtx->factory->element<SvgImage>("svg-image")
.attribute("size", &SvgImage::size)
.attribute("src", &SvgImage::src, true)
.attribute("tint-col", &SvgImage::tint_col);
}

mScriptState = mCtx->script;

std::stringstream ss;
Expand Down
27 changes: 26 additions & 1 deletion src/imvue_element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ namespace ImVue {
, mScriptContext(0)
, mInvalidFlags(0)
, mFlags(0)
, mRequiredAttrsCount(0)
, mConfigured(false)
{
}
Expand Down Expand Up @@ -349,6 +350,9 @@ namespace ImVue {
Attribute* reader = mBuilder->get(id);
if(reader) {
reader->read(id, value, this, mScriptState, flags, fields);
if(reader->required) {
mRequiredAttrsCount++;
}
return true;
}

Expand All @@ -366,6 +370,7 @@ namespace ImVue {
}

int flags = mConfigured ? 0 : Attribute::BIND_LISTENERS;
mRequiredAttrsCount = 0;

for(const rapidxml::xml_attribute<>* a = mNode->first_attribute(); a; a = a->next_attribute()) {
readProperty(a->name(), a->value(), flags);
Expand All @@ -376,6 +381,26 @@ namespace ImVue {
if(ref && mScriptState) {
mScriptState->addReference(ref, this);
}

const ElementBuilder::RequiredAttrs& requiredAttrs = mBuilder->getRequiredAttrs();
if(mRequiredAttrsCount != requiredAttrs.size()) {
std::map<const char*, bool, CmpChar> visited;
// failed validation, now scan props and detect which one is missing
for(const rapidxml::xml_attribute<>* a = mNode->first_attribute(); a; a = a->next_attribute()) {
visited[a->name()] = true;
}

std::stringstream missed;
for(int i = 0; i < requiredAttrs.size(); ++i) {
const char* name = requiredAttrs[i];
if(!visited[name]) {
missed << (missed.str().empty() ? "" : ", ") << '"' << name << '"';
}
}

IMVUE_EXCEPTION(ElementError, "failed to build element %s, missing required properties %s", getType(), missed.str().c_str());
return false;
}
return enabled;
}

Expand Down Expand Up @@ -483,7 +508,7 @@ namespace ImVue {

EventHandler* handler = builder->createHandler(handlerName, fullName, value);
if(!handler) {
IMVUE_EXCEPTION(ElementError, "failed create handler of type %s", handlerName);
IMVUE_EXCEPTION(ElementError, "failed to create handler of type %s", handlerName);
return;
}
mHandlers[name] = handler;
Expand Down
Loading