Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

[Closed] Etcetera Plugin Live! Alerts, prompts, loading views, push, localization and more!

Discussion in 'iOS and tvOS' started by prime31, Oct 18, 2010.

  1. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    Yes, as I said I deleted the Etcetera folder and the iOS Player folder, reimported the Etcetera package, and did a new build. Same two errors. Just did it again and got those same errors.

    If I do a Build in Unity, it opens Xcode, gives me the Etcetera alert, and finishes building in Xcode with no error messages. If I then Build and Run in Xcode, then it gives me those two build errors.

    Also, when I did a Build Run in Unity (as opposed to just Build) I got another, additional error:

    The Info.plist for application at /Users/jabaro/PLM Inc/HS VPL/Software/•iPad Versions/Centripetal Force iPad/iOS Player/build/CentripetalForce.app specifies a CFBundleExecutable of CentripetalForce, which does not exist
     
  2. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, can you screenshot the Etcetera folder in Finder so I can see what files are in there? Build and Run won't work with plugins due to a bug with Unity not completing the post processing. The CreateSurfaceMultisampleBuffers line of code is not in the Etcetera Plugin nor is the Info.plist touched by the plugin...
     
  3. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    See the attached.
     

    Attached Files:

  4. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, I should have been more specific. The Assets/Editor/Etcetera folder was the one I was referring to.
     
  5. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    Yes, I was deleting the wrong Etcetera folder. That fixed the problem. Sorry for my confusion.

    Now that it's running again, I have a problem with showMailComposerWithScreenshot now. I need to hide some things before doing the screen shot, then reset everything after. Previously, I had to hide things in one function, then call the function that does the screen shot from the next Update. Otherwise the screen would not be updated before the screen shot. Now, with showMailComposerWithScreenshot called as a coroutine, things get reset before the screen shot is taken. So now I'm not sure how to update the screen BEFORE the screen shot, then reset AFTER the screen shot.
     
  6. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, you should be able to just hide the items during the current frame then show them on the next frame. The screenshot will wait until the end of the frame to grab the screen.
     
  7. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    That doesn't work. It looks like the screen shot is taking more than one frame before it happens. Currently, in one function I'm hiding stuff and doing the screen shot, then on the next update calling another function that resets the screen. I can see the stuff being hidden then showing again before the screen shot occurs.
     
  8. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, to be 100% certain just wait until the coroutine fully finishes then.
     
  9. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    The only way I know how to do that is to do yield Coroutine. But when I do that, nothing happens at all -- nothing gets hidden (that I can see), and no screen capture occurs. Is there another way to wait until a coroutine finishes?
     
  10. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, as long as you yield the coroutine from a method that returns IEnumerator you should be good to go.
     
  11. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    I'm not sure what that means or what type of variable IEnumerator is (not defined in the scripting reference). Do you mean something like this?

    Code (csharp):
    1. var ie: IEnumerator;
    2. yield StartCoroutine(EtceteraBinding.showMailComposerWithScreenshot(this, "", "Centripetal Force", tStr, false));
    3. return ie;
    If so, it still doesn't work if I yield the coroutine -- no screen shot is taken. Is using StartCoroutine necessary now? I can't go back to the working version I had before?
     
  12. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, the showMailComposerWithScreenshot is an example of exactly what you want to do: it is a method that needs to yield until another coroutine finishes. The only way you can yield to wait for a coroutine is if you are already in a coroutine. If you use it as a template that should get you the behavior you are looking for.
     
  13. petey

    petey

    Joined:
    May 20, 2009
    Posts:
    1,771
    Hey Prime,

    Just wondering if you had a chance to look at that view controller stuff? I tried looking at the code in Xcode but I did't really get that far. One thing I did find though, was that the alerts and the prompts work fine because they are orientated to the keyboard view controller. Do you think you could make the others work the same way? At the moment SMS, email, web view are pretty unusable if the user has locked the screen.
    Sorry to hassle you if you're crazy busy at the moment.

    Pete
     
  14. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @Petey, the orientation of the view controllers is left to iOS. There are some ugly hacks that can be done to manually orient the views but when dealing with a view that you dont own (like the SMS and email view controllers) it is nearly impossible to reorient them and have them look and function correctly. Some of what cropped up with the orientation lock actually looks like it might be a bug. I'll see if I can come up with a clean way to get them behaving with the orientation lock on.
     
  15. petey

    petey

    Joined:
    May 20, 2009
    Posts:
    1,771
    Thanks Prime,
    It would be great if you can get it happening. It worked okay before 3.4
    In 3.3, the lock still forced the mail view to be in portrait, but at least the keyboard would be in the same orientation.
     
  16. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    So you're suggesting this?
    Code (csharp):
    1. yield return StartCoroutine(EtceteraBinding.showMailComposerWithScreenshot(this, "", "Centripetal Force", tStr, false));
    Or maybe this?
    Code (csharp):
    1. yield return mono.StartCoroutine(EtceteraBinding.showMailComposerWithScreenshot(this, "", "Centripetal Force", tStr, false));
    Neither one of those will compile in JS. I have no idea what I'm doing here.
     
  17. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, JS handles coroutines differently than C#. I don't use JS at all due it being a mess of a language (things like this are simple in C# with no ambiguity) so perhaps a JS user could chime in with the correct syntax for this. My guess is that it would be like this:

    function doMailComposer()
    {
    Hide stuff
    yield return EtceteraBinding.showMailComposerWithScreenshot(this, "", "Centripetal Force", tStr, false);
    Show stuff
    }

    Then from some other method you need to kick off that coroutine. I'm not 100% sure of the syntax in JS. I believe it does some sort of magic and doesn't have an explicit StartCorouiine method.

    doMailComposer(); // needs to be proper syntax to call the method in a coroutine. Maybe the method just needs a specific return type?
     
  18. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    That won't compile either. I'm starting to think this is no longer doable. Maybe it needs a completion delegate that is called when the screenshot is finished.
     
  19. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    I spoke too soon. I see that there is indeed a delegate that fires when the mail composer is dismissed. That, in theory, should do what I need. But the delegate does not get called.

    Code (csharp):
    1. function SendScreenShot () {
    2.     // hide some stuff
    3.     EtceteraManager.mailComposerFinished += mailComposerFinished;
    4.     StartCoroutine(EtceteraBinding.showMailComposerWithScreenshot(this, "", "Centripetal Force", tStr, false));
    5. }
    6. // ------------------------------------------
    7.  
    8. function mailComposerFinished (result: String) {
    9.     // show some stuff
    10.     EtceteraManager.mailComposerFinished -= ScreenShotFinished;
    11. }
    Now the stuff gets hidden, and the screen shot gets taken and attached to the mail message. So far, so good. But after the mail composer is dismissed, the routine that shows the stuff again never gets called and the screen is left with stuff hidden. Am I at least getting close?
     
    Last edited: Aug 7, 2011
  20. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, in C# this is dead simple. I'll post C# code and leave it to your poor saps using JS to translate it:

    Code (csharp):
    1. public IEnumerator hideStuffTakeScreenshotAndShowStuff()
    2. {
    3.     // hide UI stuff
    4.    
    5.     yield return StartCoroutine( EtceteraBinding.showMailComposerWithScreenshot( this, string.Empty, "Centripetal Force", string.Empty, false ) );
    6.    
    7.     // show UI stuff
    8. }

    Then somewhere else where you want to take the screenshot simply calling the following will suffice:

    StartCoroutine( hideStuffTakeScreenshotAndShowStuff() );
     
  21. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    Unfortunately, I'm one of those poor saps. Now that I've had some time to play around with this, I've spent the past several hours trying everything I can think of to get this to compile and/or work. If there is a way to get this to work in JS, it is beyond me.

    That's why I thought the delegate would be a better, and simpler solution. That approach has come the closest to working. But since I can't get that to work either, I don't know what else to do other than going back to Unity 3.3, which is not a long-term solution. I guess I'm an out-of-luck poor sap.
     
  22. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    I decided to bite the bullet and try to write this code in C# (which I don't really know). Here's what I came up with:

    Code (csharp):
    1. using UnityEngine;
    2. using System;
    3. using System.Collections;
    4.        
    5.        
    6. public class MyScreenShot : MonoBehaviour
    7. {
    8.     public GameObject viewSettings;
    9.     public GameObject buttonPanel;     
    10.     public GameObject banner1;
    11.     public GameObject banner2;
    12.     public SpriteText panelDateTime;
    13.  
    14.     public IEnumerator SendScreenShot() {
    15.        
    16.         string tStr;
    17.         Debug.Log("Screen Shot");
    18.  
    19.         // hide UI stuff
    20.         DateTime myDateTime = DateTime.Now;
    21.         panelDateTime.text = myDateTime.ToString("h:mm tt, MM-dd-yyyy");
    22.        
    23.         viewSettings.SetActiveRecursively(false);
    24.         buttonPanel.SetActiveRecursively(false);
    25.         banner1.active = true;
    26.         banner2.active = true;
    27.        
    28.         tStr = "Centripetal Force Data";
    29.        
    30.         yield return StartCoroutine(EtceteraBinding.showMailComposerWithScreenshot(this, string.Empty, "Centripetal Force", tStr, false));
    31.        
    32.         // show UI stuff
    33.         viewSettings.SetActiveRecursively(true);
    34.         buttonPanel.SetActiveRecursively(true);
    35.         banner1.active = false;
    36.         banner2.active = false;
    37.     }
    38. }
    I attached this file to an object in the scene and set the public variables in the Inspector. Then I tried calling it from JS:

    MyScreenShot.SendScreenShot();

    But that won't compile (Unknown identifier: 'MyScreenShot'.). I don't know enough about C# to identify the problem. I thought as long as the file name matched the class name, that was all it took.

    To summarize: I can't hide some stuff, take a screen shot, then show some stuff from a single method in JS. I can't get the mailComposerFinished delegate to fire to hide the stuff and take the screen shot in one method, then show the stuff again in another method (in JS). And I can't call a C# version of the method from JS or from an EZGUI button.

    So I don't know what to do. I really hate to tell people that functionality we had two weeks ago is no longer possible. And this one app is the proof of concept for 23 more, similar apps, which I don't want to start on until I have all the functionality worked out in this one first. But I'm to the point where I need to make a decision about whether or not to include this (necessary) capability, and move on.
     
  23. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, in order to be able to just call MyScreenShot.SendScreenShot() (you will actually want that to be StartCoroutine( MyScreenShot.SendScreenShot() ) btw) just make the method static:

    Code (csharp):
    1. public static IEnumerator SendScreenShot()
     
  24. Fierce Waffle

    Fierce Waffle

    Joined:
    Dec 23, 2010
    Posts:
    93
    Ld /Users/fiercewaffle/Library/Developer/Xcode/DerivedData/Unity-iPhone-esbodxikicmvvuamxvrfngsnsbcd/Build/Products/RainbowRush.app/RainbowRush normal armv7
    cd "/Users/fiercewaffle/Desktop/Rainbow Rush"
    setenv IPHONEOS_DEPLOYMENT_TARGET 5.0
    setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2 -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk -L/Users/fiercewaffle/Library/Developer/Xcode/DerivedData/Unity-iPhone-esbodxikicmvvuamxvrfngsnsbcd/Build/Products "-L/Users/fiercewaffle/Desktop/Rainbow Rush" "-L/Users/fiercewaffle/Desktop/Rainbow Rush/Libraries" -F/Users/fiercewaffle/Library/Developer/Xcode/DerivedData/Unity-iPhone-esbodxikicmvvuamxvrfngsnsbcd/Build/Products -filelist /Users/fiercewaffle/Library/Developer/Xcode/DerivedData/Unity-iPhone-esbodxikicmvvuamxvrfngsnsbcd/Build/Intermediates/Unity-iPhone.build/Debug-iphoneos/Unity-iPhone.build/Objects-normal/armv7/RainbowRush.LinkFileList -dead_strip -all_load -weak_framework CoreMotion -miphoneos-version-min=5.0 -framework Foundation -framework UIKit -framework OpenGLES -framework QuartzCore -framework OpenAL -liconv.2 -liPhone-lib -framework AudioToolbox -framework CFNetwork -framework MediaPlayer -framework CoreLocation -framework SystemConfiguration -framework CoreMotion -framework CoreGraphics -weak_framework MessageUI -lz.1.2.3 -o /Users/fiercewaffle/Library/Developer/Xcode/DerivedData/Unity-iPhone-esbodxikicmvvuamxvrfngsnsbcd/Build/Products/RainbowRush.app/RainbowRush

    ld: library not found for -lz.1.2.3
    Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2 failed with exit code 1




    I just bought the plugin. I am running the most recent beta of XCode and iOS off of the developer portal with Unity 3.4 standard iphone license.

    EDIT : This message only appears after building and opening the project in XCode with the Etcetera plugin installed. I am running XCode 4.2 4C139 and iOS 5 beta 4
     
    Last edited: Aug 7, 2011
  25. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @Fierce, it looks like iOS 5 doesnt have the libz 1.2.3 library: "library not found for -lz.1.2.3". You will need to do a couple things to clear up the issue. I'll list the steps here:

    - locate which versions of libz are available with iOS 5: http://cl.ly/94u2
    - open the config.plist file from the Editor/Etecetera folder and change the entry with "libz.1.2.3.dylib" to a version that exists from the first step
    - close Xcode and do a Build followed by Replace to get a fresh Xcode project

    that *should* work for you.
     
  26. Fierce Waffle

    Fierce Waffle

    Joined:
    Dec 23, 2010
    Posts:
    93
    Thank you. Im testing it right now.

    EDIT : Worked great thanks.
     
    Last edited: Aug 7, 2011
  27. Fierce Waffle

    Fierce Waffle

    Joined:
    Dec 23, 2010
    Posts:
    93
    When using showAlertWithTitleMessageAndButtons how can I detect which button was pressed?
     
  28. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @Fierce, listen to the event:
    public static event Action<string> alertButtonClicked;
     
  29. Fierce Waffle

    Fierce Waffle

    Joined:
    Dec 23, 2010
    Posts:
    93
    How would I do this in JavaScript
     
  30. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @Fierce, JavaScript? People still use that junk?!? The syntax for events is identical between JS and C# so just check the *EventListener file or watch our handy video on events http://p31.cc/docs
     
  31. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    That did not fix the original error in the JS script, although it did generate several more in the C# script. But I don't want this to turn into a C# lesson. I know I should probably learn it at some point, but not now. And it's certainly not your responsibility to teach it to me. Right now, I just need to get this screen shot working using JS, or not.

    Since I came the closest with the approach using the delegate, I'm thinking that's the best way to proceed. At least I can get the screen shot taken and the email composer showing. Only problem is I'm left with the screen in a state I don't want it to be in, since the mailComposerFinished method is never called (see my code snippet from 2 days ago). I guess I could just reset the screen the next time anything it touched. That seems like a pretty clunky solution, but the best I've got so far.

    Perhaps there is something I'm doing wrong with setting up the mailComposerFinished delegate? Does it not work from JS? Does it not work with showMailComposerWithScreenshot? Can it not be called in the same method that calls showMailComposerWithScreenshot? If I could get the delegate working, that would solve my problem.
     
    Last edited: Aug 7, 2011
  32. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @John, the mailComposerFinished event is firing fine for me no matter which method is used to show the composer. Do you have an EtceteraManager in your scene (or any previous scene)? (The Xcode logs will let you know if you dont) Do you see anything in the Xcode logs that might have a clue? JS events work the exact same as C# and they even have the same syntax (+=). You should always add your event listeners before performing an action that might fire the event.
     
  33. John-B

    John-B

    Joined:
    Nov 14, 2009
    Posts:
    1,252
    I didn't realize it had to be in the scene. That fixed the problem and everything else. Thanks for all your help and especially your patience.
     
  34. petey

    petey

    Joined:
    May 20, 2009
    Posts:
    1,771
    Hey Prime, thanks for updating Etcetera. Keyboard issues are gone now :) you rOck!
     
  35. JohannChristoph

    JohannChristoph

    Joined:
    Jun 21, 2009
    Posts:
    141
    I have problems with using the enableAntiAliasing-feature of the Etcetera Plugin.

    Unity gives me this error message: 'enableAntiAliasing' is not a member of 'EtceteraBinding'.
    The line of code looks like this: EtceteraBinding.enableAntiAliasing( true, 4);

    My plugin version is: Etcetera_2011-07-27
    Do i use it wrongly?
     
  36. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @Johann, anti aliasing is built into Unity now so the plugin no longer has antialiasing methods. You should delete all Etcetera files before importing the latest release just in case Unity doesn't overwrite the old files.
     
  37. JohannChristoph

    JohannChristoph

    Joined:
    Jun 21, 2009
    Posts:
    141
    @Prime31>@Johann Ah,OK-Thanks!
    Yes, I use different Quality Levels (with different AAs) now, depending on the device.
    Yes I deleted the whole Etcetera Folder, before importing the new package.
     
  38. cybie

    cybie

    Joined:
    Sep 17, 2010
    Posts:
    91
    I am having trouble using EtceteraBinding.showAlertWithTitleMessageAndButton.

    The alert appears, but I am not able to check if the user press which buttons.

    I have

    EtceteraManager.aletButtonClicked += (string) => {Debug.Log("Press");}

    I properly got the above wrong, and I got the following message in the debug console:

    SendMessage: object EtceteraManager no found!

    Please show me how to add an action listener. I am using C#.

    Thanks
    cybie
     
    Last edited: Aug 26, 2011
  39. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @cybie, you need to have an EtceteraManager in your scene.
     
  40. byerdelen

    byerdelen

    Joined:
    Mar 27, 2010
    Posts:
    68
    Hi,
    Am I the only one who has realised the Rate App feature started to have a little problem after the last update of 3.4?
    I use the method of:
    It was working very well, as I have 2 apps published and I checked they are still.
    But now, the same method is giving me:
    "Do you like this game?"
    .............................
    And the buttons

    There is no "Please review the game if you do!" place.
    And if I use:
    Without the hours prompt and launch prompt it works again normally, but I would like to use this one instead using userPrefs myself.
    I checked everything and I am sure it is like that.

    Would you be so kind to check it too Prime31?

    Thanks
     
  41. Hodofca

    Hodofca

    Joined:
    May 9, 2010
    Posts:
    83
    Do you know how i can setup quiet time in Urban Airship? I have only a link with some code for app:
    http://urbanairship.com/docs/apns_test_client.html

    Code (csharp):
    1. NSDate *fromDate;//set with the hour and minute quiet time begins
    2. NSDate *toDate;//set with the hour and minute quiet time ends
    3.  
    4. [[UAPush shared] setQuietTimeFrom:fromDate to:toDate withTimeZone:[NSTimeZone localTimeZone]];
    I dont know what to do with it :confused:
     
  42. byerdelen

    byerdelen

    Joined:
    Mar 27, 2010
    Posts:
    68
    Hi,
    I am trying to finish my social plugins background as a bundle so I am asking many questions, sorry.

    I am trying to use showMailComposerWithAttachment but I do not know what is to put the documents path. Consider I am just putting it to the Projects in Unity so it is not inside a folder.
    And please tell me an example like Example.app/Data..... not like /Applicationsfolder.
     
  43. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @byerdelen, look at the Unity documentation for the Application class. It provides paths to all possible locations where you can store images.
     
  44. byerdelen

    byerdelen

    Joined:
    Mar 27, 2010
    Posts:
    68
    Thank you Prime31! I was checking the documentation of the plugin all the time, now it works.
    And by the way, have you had any time to check the ask for review thing that i asked some posts before? is it a problem fro mthe plugin or is it just me again?
     
  45. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @byerdelen, I can't reproduce what you are seeing. It works fine for me either way. Remember that the prompt will not show for at least 48 hours after install bey default.
     
  46. byerdelen

    byerdelen

    Joined:
    Mar 27, 2010
    Posts:
    68
    Hi, just to show you this code:
    http://imageshack.us/photo/my-images/17/prompt.jpg
    Produces this:
    http://imageshack.us/photo/my-images/11/fotorafw.jpg
    There is no "Please review the game if you do!" place as you see.
    Without the hours value and launch value it works again normally, but I would like to use this one instead using userPrefs myself.
    Before Unity 3.4 and your plugin one before this one, it was working well.
    Also in this one, UNity or xcode is not giving any error at all.
    Do you have any idea what is that?
     
    Last edited: Aug 30, 2011
  47. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    @byerdelen, there isn't enough room for the message in landscape orientation so iOS doesn't show it.
     
  48. byerdelen

    byerdelen

    Joined:
    Mar 27, 2010
    Posts:
    68
    Oh, so that was the problem!
    My other apps were portrait. I think there is no workaround in normal ways. Anycase I am using this one to make it 2 lines just to make others know it:

    Thank you Prime31! With this one completed I have Facebook, Twitter, Mail, Review game, Gamecenter integration bundles completed and fully working so I made it a Unitypackage to put the whole bundle to my next apps directly.

    Thanks alot for your products, without you making those and excellent feedback, surely Unity community will have many things missing!
     
  49. JohannChristoph

    JohannChristoph

    Joined:
    Jun 21, 2009
    Posts:
    141
    The problem that i run into are the Quotation Marks in the code.
    E.g. <font color="blue"> the text of the email that i want to be blue </font>
    The Quotation Marks around the word "blue" conflict with the Etcetera Method, where the text, inside the email, is written in Quotation Marks.
    EtceteraBinding.showMailComposer( "", "Hello", "the text, inside the email", true );

    Or is it, that you just don't use colored text in iOS mails? Cause I've never actually seen it anywhere (though you can paste color formatted text into an email).
     
  50. prime31

    prime31

    Joined:
    Oct 9, 2008
    Posts:
    6,426
    You have to escape quotes with a slash (\)