Search in sources :

Example 1 with RenderTask

use of com.android.tools.idea.rendering.RenderTask in project android by JetBrains.

the class DrawableRendererEditor method configureRenderTask.

@NotNull
public static RenderTask configureRenderTask(@NotNull final Module module, @NotNull final Configuration configuration) {
    AndroidFacet facet = AndroidFacet.getInstance(module);
    assert facet != null;
    final RenderService service = RenderService.get(facet);
    RenderTask task = service.createTask(null, configuration, DRAWABLE_RENDER_LOGGER, null);
    assert task != null;
    return task;
}
Also used : RenderTask(com.android.tools.idea.rendering.RenderTask) RenderService(com.android.tools.idea.rendering.RenderService) AndroidFacet(org.jetbrains.android.facet.AndroidFacet) NotNull(org.jetbrains.annotations.NotNull)

Example 2 with RenderTask

use of com.android.tools.idea.rendering.RenderTask in project android by JetBrains.

the class ViewEditorImpl method measureChildren.

@Nullable
@Override
public Map<NlComponent, Dimension> measureChildren(@NotNull NlComponent parent, @Nullable RenderTask.AttributeFilter filter) {
    // TODO: Reuse snapshot!
    Map<NlComponent, Dimension> unweightedSizes = Maps.newHashMap();
    XmlTag parentTag = parent.getTag();
    if (parentTag.isValid()) {
        if (parent.getChildCount() == 0) {
            return Collections.emptyMap();
        }
        Map<XmlTag, NlComponent> tagToComponent = Maps.newHashMapWithExpectedSize(parent.getChildCount());
        for (NlComponent child : parent.getChildren()) {
            tagToComponent.put(child.getTag(), child);
        }
        NlModel model = myScreen.getModel();
        XmlFile xmlFile = model.getFile();
        AndroidFacet facet = model.getFacet();
        RenderService renderService = RenderService.get(facet);
        RenderLogger logger = renderService.createLogger();
        final RenderTask task = renderService.createTask(xmlFile, getConfiguration(), logger, null);
        if (task == null) {
            return null;
        }
        // Measure unweighted bounds
        Map<XmlTag, ViewInfo> map = task.measureChildren(parentTag, filter);
        task.dispose();
        if (map != null) {
            for (Map.Entry<XmlTag, ViewInfo> entry : map.entrySet()) {
                ViewInfo viewInfo = entry.getValue();
                viewInfo = RenderService.getSafeBounds(viewInfo);
                Dimension size = new Dimension(viewInfo.getRight() - viewInfo.getLeft(), viewInfo.getBottom() - viewInfo.getTop());
                NlComponent child = tagToComponent.get(entry.getKey());
                if (child != null) {
                    unweightedSizes.put(child, size);
                }
            }
        }
    }
    return unweightedSizes;
}
Also used : RenderLogger(com.android.tools.idea.rendering.RenderLogger) XmlFile(com.intellij.psi.xml.XmlFile) RenderTask(com.android.tools.idea.rendering.RenderTask) NlModel(com.android.tools.idea.uibuilder.model.NlModel) AndroidFacet(org.jetbrains.android.facet.AndroidFacet) ViewInfo(com.android.ide.common.rendering.api.ViewInfo) NlComponent(com.android.tools.idea.uibuilder.model.NlComponent) RenderService(com.android.tools.idea.rendering.RenderService) XmlTag(com.intellij.psi.xml.XmlTag) Nullable(org.jetbrains.annotations.Nullable)

Example 3 with RenderTask

use of com.android.tools.idea.rendering.RenderTask in project android by JetBrains.

the class ConstraintModel method updateConstraintLayoutRoots.

/**
   * Traverse the hierarchy to find all ConstraintLayout instances
   * and update them. We set all the wrap_content sizes of the ConstraintLayout children
   * from layout lib
   *  @param container
   *
   */
private void updateConstraintLayoutRoots(WidgetContainer container) {
    if (container == null) {
        return;
    }
    Map<NlComponent, Dimension> wrapContentSizes = Maps.newHashMap();
    if (container instanceof ConstraintWidgetContainer) {
        NlComponent component = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
        Insets padding = component.getPadding(true);
        container.setDimension(pxToDp(component.w - padding.width()), pxToDp(component.h - padding.height()));
        int x = pxToDp(component.x);
        int y = pxToDp(component.y);
        x += pxToDp(padding.left);
        y += pxToDp(padding.top);
        WidgetContainer parentContainer = (WidgetContainer) container.getParent();
        if (parentContainer != null) {
            if (!(parentContainer instanceof ConstraintWidgetContainer)) {
                x = pxToDp(component.x - component.getParent().x);
                y = pxToDp(component.y - component.getParent().y);
            } else {
                x -= parentContainer.getDrawX();
                y -= parentContainer.getDrawY();
            }
        }
        if (container.getX() != x || container.getY() != y) {
            container.setOrigin(x, y);
            container.forceUpdateDrawPosition();
        }
    }
    if (!(container instanceof ConstraintWidgetContainer)) {
        NlComponent component = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
        container.setDimension(pxToDp(component.w), pxToDp(component.h));
    }
    if (container instanceof ConstraintWidgetContainer && container.getChildren().size() > 0) {
        NlComponent root = (NlComponent) ((WidgetCompanion) container.getCompanionWidget()).getWidgetModel();
        XmlTag parentTag = root.getTag();
        if (parentTag.isValid()) {
            Map<XmlTag, NlComponent> tagToComponent = Maps.newHashMapWithExpectedSize(root.getChildCount());
            for (NlComponent child : root.getChildren()) {
                tagToComponent.put(child.getTag(), child);
            }
            XmlFile xmlFile = myNlModel.getFile();
            AndroidFacet facet = myNlModel.getFacet();
            RenderService renderService = RenderService.get(facet);
            RenderLogger logger = renderService.createLogger();
            final RenderTask task = renderService.createTask(xmlFile, myNlModel.getConfiguration(), logger, null);
            if (task != null) {
                // Measure wrap_content bounds
                Map<XmlTag, ViewInfo> map = task.measureChildren(parentTag, new RenderTask.AttributeFilter() {

                    @Override
                    public String getAttribute(@NotNull XmlTag n, @Nullable String namespace, @NotNull String localName) {
                        // Change attributes to wrap_content
                        if (ATTR_LAYOUT_WIDTH.equals(localName) && ANDROID_URI.equals(namespace)) {
                            return VALUE_WRAP_CONTENT;
                        }
                        if (ATTR_LAYOUT_HEIGHT.equals(localName) && ANDROID_URI.equals(namespace)) {
                            return VALUE_WRAP_CONTENT;
                        }
                        return null;
                    }
                });
                task.dispose();
                if (map != null) {
                    for (Map.Entry<XmlTag, ViewInfo> entry : map.entrySet()) {
                        ViewInfo viewInfo = entry.getValue();
                        viewInfo = RenderService.getSafeBounds(viewInfo);
                        Dimension size = new Dimension(viewInfo.getRight() - viewInfo.getLeft(), viewInfo.getBottom() - viewInfo.getTop());
                        NlComponent child = tagToComponent.get(entry.getKey());
                        if (child != null) {
                            wrapContentSizes.put(child, size);
                        }
                    }
                }
            }
        }
    }
    for (ConstraintWidget child : container.getChildren()) {
        NlComponent component = (NlComponent) ((WidgetCompanion) child.getCompanionWidget()).getWidgetModel();
        Dimension dimension = wrapContentSizes.get(component);
        if (dimension != null) {
            child.setWrapWidth(pxToDp((int) dimension.getWidth()));
            child.setWrapHeight(pxToDp((int) dimension.getHeight()));
        }
        if (child instanceof WidgetContainer) {
            updateConstraintLayoutRoots((WidgetContainer) child);
        }
    }
}
Also used : Insets(com.android.tools.idea.uibuilder.model.Insets) RenderLogger(com.android.tools.idea.rendering.RenderLogger) XmlFile(com.intellij.psi.xml.XmlFile) RenderTask(com.android.tools.idea.rendering.RenderTask) AndroidFacet(org.jetbrains.android.facet.AndroidFacet) ViewInfo(com.android.ide.common.rendering.api.ViewInfo) RenderService(com.android.tools.idea.rendering.RenderService) Map(java.util.Map) WeakHashMap(com.intellij.util.containers.WeakHashMap) XmlTag(com.intellij.psi.xml.XmlTag)

Aggregations

RenderService (com.android.tools.idea.rendering.RenderService)3 RenderTask (com.android.tools.idea.rendering.RenderTask)3 AndroidFacet (org.jetbrains.android.facet.AndroidFacet)3 ViewInfo (com.android.ide.common.rendering.api.ViewInfo)2 RenderLogger (com.android.tools.idea.rendering.RenderLogger)2 XmlFile (com.intellij.psi.xml.XmlFile)2 XmlTag (com.intellij.psi.xml.XmlTag)2 Insets (com.android.tools.idea.uibuilder.model.Insets)1 NlComponent (com.android.tools.idea.uibuilder.model.NlComponent)1 NlModel (com.android.tools.idea.uibuilder.model.NlModel)1 WeakHashMap (com.intellij.util.containers.WeakHashMap)1 Map (java.util.Map)1 NotNull (org.jetbrains.annotations.NotNull)1 Nullable (org.jetbrains.annotations.Nullable)1