diff options
author | Tor Norbye <tnorbye@google.com> | 2012-05-07 16:25:52 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2012-05-08 16:36:50 -0700 |
commit | ccd4c42d08b1f6b3fe88c68a6e6c1fc74b058de3 (patch) | |
tree | dbb40bbed0122e8d2b5dfb421c7b36b5ad775a58 | |
parent | 744109a2331c46902d5c978067fbebb1855763ee (diff) | |
download | sdk-ccd4c42d08b1f6b3fe88c68a6e6c1fc74b058de3.zip sdk-ccd4c42d08b1f6b3fe88c68a6e6c1fc74b058de3.tar.gz sdk-ccd4c42d08b1f6b3fe88c68a6e6c1fc74b058de3.tar.bz2 |
Asset Studio: Add no-background option, and support embedding
This changeset improves the asset studio wizard in two ways:
- First, it adds support for having no background shape (which the web
version has added)
- Second, it adds a "value holder" class which holds the current (as
well as initial) state of the various configuration parameters for
the icon generator. This allows the same code to be used to generate
icons programatically, and also allows reuse of the asset studio
wizard pages in different wizards and with custom initial state.
For example, the New Project wizard can now embed the asset studio
page and preconfigure it to generate launcher icons.
Change-Id: I9eac396325214af8309447083ff9dcb9e59645ab
7 files changed, 343 insertions, 172 deletions
diff --git a/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java b/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java index fa81392..0124000 100644 --- a/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java +++ b/assetstudio/src/com/android/assetstudiolib/GraphicGenerator.java @@ -59,6 +59,8 @@ public abstract class GraphicGenerator { /** Shapes that can be used for icon backgrounds */ public static enum Shape { + /** No background */ + NONE("none"), /** Circular background */ CIRCLE("circle"), /** Square background */ diff --git a/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java b/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java index 4e0534d..b3e327b 100644 --- a/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java +++ b/assetstudio/src/com/android/assetstudiolib/LauncherIconGenerator.java @@ -42,12 +42,17 @@ public class LauncherIconGenerator extends GraphicGenerator { density = launcherOptions.density.getResourceValue(); } String shape = launcherOptions.shape.id; - BufferedImage mBackImage = context.loadImageResource("/images/launcher_stencil/" + BufferedImage mBackImage = null; + BufferedImage mForeImage = null; + BufferedImage mMaskImage = null; + if (launcherOptions.shape != Shape.NONE) { + mBackImage = context.loadImageResource("/images/launcher_stencil/" + shape + "/" + density + "/back.png"); - BufferedImage mForeImage = context.loadImageResource("/images/launcher_stencil/" + mForeImage = context.loadImageResource("/images/launcher_stencil/" + shape + "/" + density + "/" + launcherOptions.style.id + ".png"); - BufferedImage mMaskImage = context.loadImageResource("/images/launcher_stencil/" + mMaskImage = context.loadImageResource("/images/launcher_stencil/" + shape + "/" + density + "/mask.png"); + } float scaleFactor = GraphicGenerator.getMdpiScaleFactor(launcherOptions.density); if (launcherOptions.isWebGraphic) { @@ -59,14 +64,18 @@ public class LauncherIconGenerator extends GraphicGenerator { BufferedImage outImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height); Graphics2D g = (Graphics2D) outImage.getGraphics(); - g.drawImage(mBackImage, 0, 0, null); + if (mBackImage != null) { + g.drawImage(mBackImage, 0, 0, null); + } BufferedImage tempImage = Util.newArgbBufferedImage(imageRect.width, imageRect.height); Graphics2D g2 = (Graphics2D) tempImage.getGraphics(); - g2.drawImage(mMaskImage, 0, 0, null); - g2.setComposite(AlphaComposite.SrcAtop); - g2.setPaint(new Color(launcherOptions.backgroundColor)); - g2.fillRect(0, 0, imageRect.width, imageRect.height); + if (mMaskImage != null) { + g2.drawImage(mMaskImage, 0, 0, null); + g2.setComposite(AlphaComposite.SrcAtop); + g2.setPaint(new Color(launcherOptions.backgroundColor)); + g2.fillRect(0, 0, imageRect.width, imageRect.height); + } if (launcherOptions.crop) { Util.drawCenterCrop(g2, launcherOptions.sourceImage, targetRect); @@ -75,7 +84,9 @@ public class LauncherIconGenerator extends GraphicGenerator { } g.drawImage(tempImage, 0, 0, null); - g.drawImage(mForeImage, 0, 0, null); + if (mForeImage != null) { + g.drawImage(mForeImage, 0, 0, null); + } g.dispose(); g2.dispose(); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java index 29cb910..58dd332 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java @@ -19,7 +19,7 @@ package com.android.ide.eclipse.adt.internal.assetstudio; /** * The type of asset to create: launcher icon, menu icon, etc. */ -enum AssetType { +public enum AssetType { /** Launcher icon to be shown in the application list */ LAUNCHER("Launcher Icons", "ic_launcher"), //$NON-NLS-2$ diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java index 15b1f05..a26a22e 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java @@ -21,7 +21,6 @@ import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.Project import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator; import com.android.resources.ResourceFolderType; -import org.eclipse.core.resources.IProject; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; @@ -41,25 +40,19 @@ import org.eclipse.swt.widgets.Text; /** Page for choosing the type of asset to create, as well as the target project */ public class ChooseAssetTypePage extends WizardPage implements SelectionListener, ModifyListener { + private final CreateAssetSetWizardState mValues; private ProjectCombo mProjectButton; private Button mClipboardButton; - private IProject mProject; private Text mNameText; - /** - * The type of asset being created. This field is static such that when you - * bring up the wizard repeatedly (for example to create multiple - * notification icons) you don't have to keep selecting the same type over - * and over. - */ - private static AssetType sType = AssetType.LAUNCHER; private boolean mNameModified; private Label mResourceName; /** * Create the wizard. */ - public ChooseAssetTypePage() { + public ChooseAssetTypePage(CreateAssetSetWizardState values) { super("chooseAssetTypePage"); + mValues = values; setTitle("Choose Icon Set Type"); setDescription("Select the type of icon set to create:"); } @@ -80,7 +73,7 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener Button button = new Button(container, SWT.RADIO); button.setData(type); button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); - button.setSelection(type == sType); + button.setSelection(type == mValues.type); button.setText(type.getDisplayName()); button.addSelectionListener(this); } @@ -96,7 +89,7 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener ProjectChooserHelper helper = new ProjectChooserHelper(getShell(), null /* filter */); - mProjectButton = new ProjectCombo(helper, container, mProject); + mProjectButton = new ProjectCombo(helper, container, mValues.project); mProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); mProjectButton.addSelectionListener(this); @@ -135,8 +128,10 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener if (!mNameModified) { // Default name suggestion, possibly as a suffix, e.g. "ic_menu_<name>" String replace = "name"; - String suggestedName = String.format(getAssetType().getDefaultNameFormat(), replace); + String suggestedName = String.format(mValues.type.getDefaultNameFormat(), replace); mNameText.setText(suggestedName); + mValues.outputName = suggestedName; + updateResourceLabel(); mNameModified = false; int start = suggestedName.indexOf(replace); @@ -154,24 +149,16 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener mResourceName.setText("@drawable/" + getOutputName()); //$NON-NLS-1$ } - void setProject(IProject project) { - mProject = project; - } - - IProject getProject() { - return mProject; - } - @Override public boolean canFlipToNextPage() { - return mProject != null; + return mValues.project != null; } @Override public void widgetSelected(SelectionEvent e) { Object source = e.getSource(); if (source == mProjectButton) { - mProject = mProjectButton.getSelectedProject(); + mValues.project = mProjectButton.getSelectedProject(); validatePage(); } else if (source == mClipboardButton) { Clipboard clipboard = new Clipboard(getShell().getDisplay()); @@ -184,7 +171,8 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener // User selected a different asset type to be created Object data = ((Button) source).getData(); if (data instanceof AssetType) { - sType = (AssetType) data; + mValues.type = (AssetType) data; + CreateAssetSetWizardState.sLastType = mValues.type; updateAssetType(); } } @@ -199,24 +187,21 @@ public class ChooseAssetTypePage extends WizardPage implements SelectionListener Object source = e.getSource(); if (source == mNameText) { mNameModified = true; + mValues.outputName = mNameText.getText().trim(); updateResourceLabel(); } validatePage(); } - String getOutputName() { + private String getOutputName() { return mNameText.getText().trim(); } - AssetType getAssetType() { - return sType; - } - private void validatePage() { String error = null; - if (getProject() == null) { + if (mValues.project == null) { error = "Please select an Android project."; } else { String outputName = getOutputName(); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java index 105892a..1f45570 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java @@ -92,6 +92,7 @@ import javax.imageio.ImageIO; */ public class ConfigureAssetSetPage extends WizardPage implements SelectionListener, GraphicGeneratorContext, ModifyListener { + private final CreateAssetSetWizardState mValues; private static final int PREVIEW_AREA_WIDTH = 120; @@ -102,6 +103,8 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen */ private static boolean SUPPORT_LAUNCHER_ICON_TYPES = false; + private boolean mShown; + private Composite mConfigurationArea; private Button mImageRadio; private Button mClipartRadio; @@ -112,6 +115,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen private Label mPercentLabel; private Button mCropRadio; private Button mCenterRadio; + private Button mNoShapeRadio; private Button mSquareRadio; private Button mCircleButton; private Button mBgButton; @@ -132,7 +136,6 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen private RGB mBgColor; private RGB mFgColor; private Text mText; - private String mSelectedClipart; /** Most recently set image path: preserved across wizard sessions */ private static String sImagePath; @@ -151,11 +154,17 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen private Label mEffectsLabel; private Composite mEffectsComposite; + private boolean mIgnore; + /** * Create the wizard. + * + * @param values the wizard state */ - public ConfigureAssetSetPage() { + public ConfigureAssetSetPage(CreateAssetSetWizardState values) { super("configureAssetPage"); + mValues = values; + setTitle("Configure Icon Set"); setDescription("Configure the attributes of the icon set"); } @@ -261,7 +270,6 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen textLabel.setText("Text:"); mText = new Text(mTextForm, SWT.BORDER); - mText.setText("Aa"); mText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); mText.addModifyListener(this); @@ -292,12 +300,11 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen // This doesn't work right -- not sure why. For now just use a plain slider // and subtract 10 from it to get the real range. //mPaddingSlider.setValues(0, -10, 50, 0, 1, 10); - mPaddingSlider.setSelection(10 + 15); + //mPaddingSlider.setSelection(10 + 15); mPaddingSlider.addSelectionListener(this); mPercentLabel = new Label(mConfigurationArea, SWT.NONE); mPercentLabel.setText(" 15%"); // Enough available space for -10% - mScalingLabel = new Label(mConfigurationArea, SWT.NONE); mScalingLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); mScalingLabel.setText("Foreground Scaling:"); @@ -324,10 +331,14 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen mShapeComposite = new Composite(mConfigurationArea, SWT.NONE); mShapeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1)); - GridLayout gl_mShapeComposite = new GridLayout(5, false); + GridLayout gl_mShapeComposite = new GridLayout(6, false); gl_mShapeComposite.horizontalSpacing = 0; mShapeComposite.setLayout(gl_mShapeComposite); + mNoShapeRadio = new Button(mShapeComposite, SWT.FLAT | SWT.TOGGLE); + mNoShapeRadio.setText("None"); + mNoShapeRadio.addSelectionListener(this); + mSquareRadio = new Button(mShapeComposite, SWT.FLAT | SWT.TOGGLE); mSquareRadio.setSelection(true); mSquareRadio.setText("Square"); @@ -427,17 +438,11 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen // Initial color Display display = parent.getDisplay(); - //updateColor(display, new RGB(0xa4, 0xc6, 0x39), true /*background*/); - updateColor(display, new RGB(0xff, 0x00, 0x00), true /*background*/); - updateColor(display, new RGB(0x00, 0x00, 0x00), false /*background*/); - - // Start out showing the image form - //mImageRadio.setSelection(true); - //chooseForegroundTab(mImageRadio, mImageForm); - // No, start out showing the text, since the user doesn't have to enter anything - // initially and we still get images - mTextRadio.setSelection(true); - chooseForegroundTab(mTextRadio, mTextForm); + updateColor(display, mValues.background, true /*background*/); + updateColor(display, mValues.foreground, false /*background*/); + + setSourceType(mValues.sourceType); + new Label(mConfigurationArea, SWT.NONE); new Label(mConfigurationArea, SWT.NONE); new Label(mConfigurationArea, SWT.NONE); @@ -482,6 +487,8 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen // that method is called when the wizard is created, and we want to wait until the // user has chosen a project before attempting to look up the right default image to use if (visible) { + mShown = true; + // Clear out old previews - important if the user goes back to page one, changes // asset type and steps into page 2 - at that point we arrive here and we might // display the old previews for a brief period until the preview delay timer expires. @@ -492,15 +499,14 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen // Update asset type configuration: will show/hide parameter controls depending // on which asset type is chosen - CreateAssetSetWizard wizard = (CreateAssetSetWizard) getWizard(); - AssetType type = wizard.getAssetType(); + AssetType type = mValues.type; assert type != null; configureAssetType(type); // Initial image - use the most recently used image, or the default launcher // icon created in our default projects, if there if (sImagePath == null) { - IProject project = wizard.getProject(); + IProject project = mValues.project; if (project != null) { IResource icon = project.findMember("res/drawable-hdpi/icon.png"); //$NON-NLS-1$ if (icon != null) { @@ -511,8 +517,42 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen } } if (sImagePath != null) { + mValues.imagePath = new File(sImagePath); mImagePathText.setText(sImagePath); } + + try { + mIgnore = true; + + mTrimCheckBox.setSelection(mValues.trim); + + // This doesn't work right -- not sure why. For now just use a plain slider + // and subtract 10 from it to get the real range. + //mPaddingSlider.setValues(0, -10, 50, 0, 1, 10); + //mPaddingSlider.setSelection(10 + 15); + mPaddingSlider.setSelection(mValues.padding + 10); + mPercentLabel.setText(Integer.toString(mValues.padding) + '%'); + + if (mValues.imagePath != null) { + mImagePathText.setText(mValues.imagePath.getPath()); + } + + if (mValues.text != null) { + mText.setText(mValues.text); + } + + setSourceType(mValues.sourceType); + setShape(mValues.shape); + + // Initial color + Display display = mPreviewArea.getDisplay(); + //updateColor(display, new RGB(0xa4, 0xc6, 0x39), true /*background*/); + updateColor(display, mValues.background, true /*background*/); + updateColor(display, mValues.foreground, false /*background*/); + } finally { + mIgnore = false; + } + validatePage(); requestUpdatePreview(true /*quickly*/); @@ -523,13 +563,25 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen } } + private void setSourceType(CreateAssetSetWizardState.SourceType sourceType) { + if (sourceType == CreateAssetSetWizardState.SourceType.IMAGE) { + chooseForegroundTab(mImageRadio, mImageForm); + } else if (sourceType == CreateAssetSetWizardState.SourceType.CLIPART) { + chooseForegroundTab(mClipartRadio, mClipartForm); + } else if (sourceType == CreateAssetSetWizardState.SourceType.TEXT) { + updateFontLabel(mFontButton.getFont()); + chooseForegroundTab(mTextRadio, mTextForm); + mText.setFocus(); + } + } + private boolean validatePage() { String error = null; //String warning = null; if (mImageRadio.getSelection()) { - String path = mImagePathText.getText().trim(); - if (path.length() == 0) { + String path = mValues.imagePath != null ? mValues.imagePath.getPath() : null; + if (path == null || path.length() == 0) { error = "Select an image"; } else if (!(new File(path).exists())) { error = String.format("%1$s does not exist", path); @@ -538,13 +590,12 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen sImagePath = path; } } else if (mTextRadio.getSelection()) { - String text = mText.getText().trim(); - if (text.length() == 0) { + if (mValues.text.length() == 0) { error = "Enter text"; } } else { assert mClipartRadio.getSelection(); - if (mSelectedClipart == null) { + if (mValues.clipartName == null) { error = "Select clip art"; } } @@ -565,16 +616,22 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen @Override public boolean isPageComplete() { // Force user to reach second page before hitting Finish - return isCurrentPage(); + return mShown; } // ---- Implements ModifyListener ---- @Override public void modifyText(ModifyEvent e) { + if (mIgnore) { + return; + } + if (e.getSource() == mImagePathText) { + mValues.imagePath = new File(mImagePathText.getText().trim()); requestUpdatePreview(false); } else if (e.getSource() == mText) { + mValues.text = mText.getText().trim(); requestUpdatePreview(false); } @@ -590,15 +647,22 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen @Override public void widgetSelected(SelectionEvent e) { + if (mIgnore) { + return; + } + Object source = e.getSource(); boolean updateQuickly = true; // Tabs if (source == mImageRadio) { + mValues.sourceType = CreateAssetSetWizardState.SourceType.IMAGE; chooseForegroundTab((Button) source, mImageForm); } else if (source == mClipartRadio) { + mValues.sourceType = CreateAssetSetWizardState.SourceType.CLIPART; chooseForegroundTab((Button) source, mClipartForm); } else if (source == mTextRadio) { + mValues.sourceType = CreateAssetSetWizardState.SourceType.TEXT; updateFontLabel(mFontButton.getFont()); chooseForegroundTab((Button) source, mTextForm); mText.setFocus(); @@ -609,6 +673,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen FileDialog dialog = new FileDialog(mPickImageButton.getShell(), SWT.OPEN); String file = dialog.open(); if (file != null) { + mValues.imagePath = new File(file); mImagePathText.setText(file); } } @@ -622,11 +687,14 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen mCropRadio.setSelection(false); } if (source == mSquareRadio) { - mSquareRadio.setSelection(true); - mCircleButton.setSelection(false); + mValues.shape = GraphicGenerator.Shape.SQUARE; + setShape(mValues.shape); } else if (source == mCircleButton) { - mCircleButton.setSelection(true); - mSquareRadio.setSelection(false); + mValues.shape = GraphicGenerator.Shape.CIRCLE; + setShape(mValues.shape); + } else if (source == mNoShapeRadio) { + mValues.shape = GraphicGenerator.Shape.NONE; + setShape(mValues.shape); } if (SUPPORT_LAUNCHER_ICON_TYPES) { @@ -645,6 +713,10 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen } } + if (source == mTrimCheckBox) { + mValues.trim = mTrimCheckBox.getSelection(); + } + if (source == mHoloDarkRadio) { mHoloDarkRadio.setSelection(true); mHoloLightRadio.setSelection(false); @@ -683,7 +755,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen // Clicked on some of the sample art if (event.widget instanceof ImageControl) { ImageControl image = (ImageControl) event.widget; - mSelectedClipart = (String) image.getData(); + mValues.clipartName = (String) image.getData(); close(); for (Control c : mClipartPreviewPanel.getChildren()) { @@ -691,8 +763,8 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen } if (mClipartPreviewPanel.getChildren().length == 0) { try { - BufferedImage icon = - GraphicGenerator.getClipartIcon(mSelectedClipart); + BufferedImage icon = GraphicGenerator.getClipartIcon( + mValues.clipartName); if (icon != null) { Display display = mClipartForm.getDisplay(); Image swtImage = SwtUtils.convertToSwt(display, icon, @@ -746,6 +818,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen if (rgb != null) { // Dispose the old color, create the // new one, and set into the label + mValues.background = rgb; updateColor(mBgButton.getDisplay(), rgb, true /*background*/); } } else if (source == mFgButton) { @@ -756,6 +829,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen if (rgb != null) { // Dispose the old color, create the // new one, and set into the label + mValues.foreground = rgb; updateColor(mFgButton.getDisplay(), rgb, false /*background*/); } } @@ -782,6 +856,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen } if (source == mPaddingSlider) { + mValues.padding = getPadding(); mPercentLabel.setText(Integer.toString(getPadding()) + '%'); // When dragging the slider, only do periodic updates @@ -791,6 +866,24 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen requestUpdatePreview(updateQuickly); } + private void setShape(GraphicGenerator.Shape shape) { + if (shape == GraphicGenerator.Shape.SQUARE) { + mSquareRadio.setSelection(true); + mCircleButton.setSelection(false); + mNoShapeRadio.setSelection(false); + } else if (shape == GraphicGenerator.Shape.CIRCLE) { + mCircleButton.setSelection(true); + mSquareRadio.setSelection(false); + mNoShapeRadio.setSelection(false); + } else if (shape == GraphicGenerator.Shape.NONE) { + mNoShapeRadio.setSelection(true); + mCircleButton.setSelection(false); + mSquareRadio.setSelection(false); + } else { + assert false : shape; + } + } + private void updateFontLabel(Font f) { FontData[] fd = f.getFontData(); FontData primary = fd[0]; @@ -909,86 +1002,90 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen mPreviewArea.layout(true); } - Map<String, Map<String, BufferedImage>> generateImages(boolean previewOnly) { + public Map<String, Map<String, BufferedImage>> generateImages(boolean previewOnly) { // Map of ids to images: Preserve insertion order (the densities) Map<String, Map<String, BufferedImage>> categoryMap = new LinkedHashMap<String, Map<String, BufferedImage>>(); - CreateAssetSetWizard wizard = (CreateAssetSetWizard) getWizard(); - AssetType type = wizard.getAssetType(); - boolean crop = mTrimCheckBox.getSelection(); + AssetType type = mValues.type; + boolean trim = mValues.trim; BufferedImage sourceImage = null; - if (mImageRadio.getSelection()) { - // Load the image - // TODO: Only do this when the source image type is image - String path = mImagePathText.getText().trim(); - if (path.length() == 0) { - setErrorMessage("Enter a filename"); - return Collections.emptyMap(); - } - File file = new File(path); - if (!file.exists()) { - setErrorMessage(String.format("%1$s does not exist", file.getPath())); - return Collections.emptyMap(); - } - - setErrorMessage(null); - sourceImage = getImage(path, false); - if (sourceImage != null) { - if (crop) { - sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); + switch (mValues.sourceType) { + case IMAGE: { + // Load the image + // TODO: Only do this when the source image type is image + String path = mValues.imagePath != null ? mValues.imagePath.getPath() : ""; + if (path.length() == 0) { + setErrorMessage("Enter a filename"); + return Collections.emptyMap(); } - int padding = getPadding(); - if (padding != 0) { - sourceImage = Util.paddedImage(sourceImage, padding); + File file = new File(path); + if (!file.exists()) { + setErrorMessage(String.format("%1$s does not exist", file.getPath())); + return Collections.emptyMap(); } - } - } else if (mTextRadio.getSelection()) { - String text = mText.getText(); - TextRenderUtil.Options options = new TextRenderUtil.Options(); - options.font = getSelectedFont(); - int color; - if (type.needsColors()) { - color = 0xFF000000 | (mFgColor.red << 16) | (mFgColor.green << 8) | mFgColor.blue; - } else { - color = 0xFFFFFFFF; - } - options.foregroundColor = color; - sourceImage = TextRenderUtil.renderTextImage(text, getPadding(), options); - if (crop) { - sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); + setErrorMessage(null); + sourceImage = getImage(path, false); + if (sourceImage != null) { + if (trim) { + sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); + } + if (mValues.padding != 0) { + sourceImage = Util.paddedImage(sourceImage, mValues.padding); + } + } + break; } + case CLIPART: { + try { + sourceImage = GraphicGenerator.getClipartImage(mValues.clipartName); - int padding = getPadding(); - if (padding != 0) { - sourceImage = Util.paddedImage(sourceImage, padding); - } - } else { - assert mClipartRadio.getSelection(); - assert mSelectedClipart != null; - try { - sourceImage = GraphicGenerator.getClipartImage(mSelectedClipart); + if (trim) { + sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); + } - if (crop) { - sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); - } + if (type.needsColors()) { + int color = 0xFF000000 | (mFgColor.red << 16) | (mFgColor.green << 8) + | mFgColor.blue; + Paint paint = new java.awt.Color(color); + sourceImage = Util.filledImage(sourceImage, paint); + } + int padding = mValues.padding; + if (padding != 0) { + sourceImage = Util.paddedImage(sourceImage, padding); + } + } catch (IOException e) { + AdtPlugin.log(e, null); + return categoryMap; + } + break; + } + case TEXT: { + String text = mValues.text; + TextRenderUtil.Options options = new TextRenderUtil.Options(); + options.font = getSelectedFont(); + int color; if (type.needsColors()) { - int color = 0xFF000000 | (mFgColor.red << 16) | (mFgColor.green << 8) - | mFgColor.blue; - Paint paint = new java.awt.Color(color); - sourceImage = Util.filledImage(sourceImage, paint); + color = 0xFF000000 + | (mFgColor.red << 16) | (mFgColor.green << 8) | mFgColor.blue; + } else { + color = 0xFFFFFFFF; } + options.foregroundColor = color; + sourceImage = TextRenderUtil.renderTextImage(text, mValues.padding, options); - int padding = getPadding(); + if (trim) { + sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB); + } + + int padding = mValues.padding; if (padding != 0) { sourceImage = Util.paddedImage(sourceImage, padding); } - } catch (IOException e) { - AdtPlugin.log(e, null); - return categoryMap; + break; } } @@ -999,8 +1096,14 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen generator = new LauncherIconGenerator(); LauncherIconGenerator.LauncherOptions launcherOptions = new LauncherIconGenerator.LauncherOptions(); - launcherOptions.shape = mCircleButton.getSelection() - ? GraphicGenerator.Shape.CIRCLE : GraphicGenerator.Shape.SQUARE; + if (mCircleButton.getSelection()) { + launcherOptions.shape = GraphicGenerator.Shape.CIRCLE; + } else if (mSquareRadio.getSelection()) { + launcherOptions.shape = GraphicGenerator.Shape.SQUARE; + } else { + assert mNoShapeRadio.getSelection(); + launcherOptions.shape = GraphicGenerator.Shape.NONE; + } launcherOptions.crop = mCropRadio.getSelection(); if (SUPPORT_LAUNCHER_ICON_TYPES) { @@ -1038,8 +1141,7 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen generator = new NotificationIconGenerator(); NotificationIconGenerator.NotificationOptions notificationOptions = new NotificationIconGenerator.NotificationOptions(); - notificationOptions.shape = mCircleButton.getSelection() - ? GraphicGenerator.Shape.CIRCLE : GraphicGenerator.Shape.SQUARE; + notificationOptions.shape = mValues.shape; options = notificationOptions; break; } @@ -1054,11 +1156,15 @@ public class ConfigureAssetSetPage extends WizardPage implements SelectionListen options.sourceImage = sourceImage; - IProject project = wizard.getProject(); - Pair<Integer, Integer> v = ManifestInfo.computeSdkVersions(project); - options.minSdk = v.getFirst(); + IProject project = mValues.project; + if (mValues.minSdk != -1) { + options.minSdk = mValues.minSdk; + } else { + Pair<Integer, Integer> v = ManifestInfo.computeSdkVersions(project); + options.minSdk = v.getFirst(); + } - String baseName = wizard.getBaseName(); + String baseName = mValues.outputName; generator.generate(null, categoryMap, this, options, baseName); return categoryMap; diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java index f42960c..0b5fc8e 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java @@ -71,6 +71,7 @@ public class CreateAssetSetWizard extends Wizard implements INewWizard { private ConfigureAssetSetPage mConfigureAssetPage; private IProject mInitialProject; private List<IResource> mCreatedFiles; + private CreateAssetSetWizardState mValues = new CreateAssetSetWizardState(); /** Creates a new asset set wizard */ public CreateAssetSetWizard() { @@ -79,24 +80,21 @@ public class CreateAssetSetWizard extends Wizard implements INewWizard { @Override public void addPages() { - mChooseAssetPage = new ChooseAssetTypePage(); - mChooseAssetPage.setProject(mInitialProject); - mConfigureAssetPage = new ConfigureAssetSetPage(); + mValues.project = mInitialProject; + + mChooseAssetPage = new ChooseAssetTypePage(mValues); + mConfigureAssetPage = new ConfigureAssetSetPage(mValues); addPage(mChooseAssetPage); addPage(mConfigureAssetPage); } - String getBaseName() { - return mChooseAssetPage.getOutputName(); - } - @Override public boolean performFinish() { Map<String, Map<String, BufferedImage>> categories = mConfigureAssetPage.generateImages(false); - IProject project = getProject(); + IProject project = mValues.project; // Write out the images into the project boolean yesToAll = false; @@ -236,28 +234,10 @@ public class CreateAssetSetWizard extends Wizard implements INewWizard { } } - /** - * Returns the project to be used by the wizard (which may differ from the - * project initialized by {@link #init(IWorkbench, IStructuredSelection)} or - * set by {@link #setProject(IProject)} if the user changes the project - * in the first page of the wizard. - */ - IProject getProject() { - if (mChooseAssetPage != null) { - return mChooseAssetPage.getProject(); - } else { - return mInitialProject; - } - } - /** Sets the initial project to be used by the wizard */ void setProject(IProject project) { mInitialProject = project; - } - - /** Returns the {@link AssetType} to create */ - AssetType getAssetType() { - return mChooseAssetPage.getAssetType(); + mValues.project = project; } @Override @@ -265,9 +245,7 @@ public class CreateAssetSetWizard extends Wizard implements INewWizard { setHelpAvailable(false); mInitialProject = guessProject(selection); - if (mChooseAssetPage != null) { - mChooseAssetPage.setProject(mInitialProject); - } + mValues.project = mInitialProject; } private IProject guessProject(IStructuredSelection selection) { diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java new file mode 100644 index 0000000..624a99a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.ide.eclipse.adt.internal.assetstudio; + +import com.android.assetstudiolib.GraphicGenerator.Shape; + +import org.eclipse.core.resources.IProject; +import org.eclipse.swt.graphics.RGB; + +import java.io.File; + +/** + * Value object for the AssetStudio wizard. These values are both set by the + * wizard as well as read by the wizard initially, so passing in a configured + * {@link CreateAssetSetWizardState} to the icon generator is possible. + */ +public class CreateAssetSetWizardState { + /** + * The type of asset being created. This field is static such that when you + * bring up the wizard repeatedly (for example to create multiple + * notification icons) you don't have to keep selecting the same type over + * and over. + */ + public static AssetType sLastType = AssetType.LAUNCHER; + + /** The type of asset to be created */ + public AssetType type = sLastType; + + /** The base name to use for the created icons */ + public String outputName; + + /** The minimum SDK being targeted */ + public int minSdk = -1; + + /** The project to create the icons into */ + public IProject project; + + /** Whether empty space around the source image should be trimmed */ + public boolean trim; + + /** The type of source the icon is being created from */ + public SourceType sourceType = SourceType.TEXT; + + /** If {@link #sourceType} is a {@link SourceType#CLIPART}, the name of the clipart image */ + public String clipartName; + + /** If {@link #sourceType} is a {@link SourceType#IMAGE}, the path to the input image */ + public File imagePath; + + /** If {@link #sourceType} is a {@link SourceType#TEXT}, the text to render */ + public String text = "aA"; + + /** The amount of padding to add around the source image */ + public int padding = 15; + + /** The background shape */ + public Shape shape = Shape.SQUARE; + + /** The background color to use for the shape (unless the shape is {@link Shape#NONE} */ + public RGB background = new RGB(0xff, 0x00, 0x00); + + /** The background color to use for the text or clipart (unless shape is {@link Shape#NONE} */ + public RGB foreground = new RGB(0x00, 0x00, 0x00); + + /** Types of sources that the asset studio can use to generate icons from */ + public enum SourceType { + /** Generate the icon using the image pointed to by {@link #imagePath} */ + IMAGE, + + /** Generate the icon using the clipart named by {@link #clipartName} */ + CLIPART, + + /** Generate the icon using the text in {@link #text} */ + TEXT + } +} |