To answer some of my own questions or present new ones:
I gave up on Marshal to file and back for now. Laurent told me that
active_support is planned to be supported in MacRuby 0.6, so instead of
using to_xml/from_xml or to_json/from_json, I took Isaac Kearse's advice
and looked into using plist included in HotCocoa.
I noticed that the read_plist method in HotCocoa 0.5.1 is on the
HotCocoa module as an instance method which would mean I would need to
include HotCocoa in Hash, Array, etc. to call it on one of those
classes, so I did the following to be sure I had both methods on Object
itself:
# HotCocoa 0.5.1 puts a to_plist on Object but a from_plist on HotCocoa.
Having to include HotCocoa in your object in order to call read_plist is
not intuitive and
# may cause adverse effects if having to extend Hash, Array, or Object
with include HotCocoa. So instead, we add the same implementation plus a
few lines to support
# reading from files, etc. like from_json/from_xml in ActiveSupport
implementations do. While at first Object doesn't seem an appropriate
place to put this method,
# it allows any object to have a from_plist class method as a companion
to the to_plist instance method, which is intuitive. Examples:
# Hash.from_plist({:data=>'mydata'}.to_plist),
Array.from_plist(['x','y','z'].to_plist),
AnObject.from_plist(an_object.to_plist)
class Object
# from_plist is the same as the HotCocoa 0.5.1 version. Could remove
it, but keeping it here for now, in case need to debug.
def self.from_plist(data, mutability=:all)
# not sure if this will work
if data.respond_to?(:read)
data = data.read
end
mutability = case mutability
when :none
NSPropertyListImmutable
when :containers_only
NSPropertyListMutableContainers
when :all
NSPropertyListMutableContainersAndLeaves
else
raise ArgumentError, "invalid mutability `#{mutability}'"
end
if data.is_a?(String)
data = data.dataUsingEncoding(NSUTF8StringEncoding)
if data.nil?
raise ArgumentError, "cannot convert string `#{data}' to data"
end
end
#error = Pointer.new(:object)
result = NSPropertyListSerialization.propertyListFromData(data,
mutabilityOption:mutability,
format:nil,
errorDescription:nil)
#raise error[0] if error[0].to_s.size > 0
end
# NSPropertyListSerialization can only take NSData, NSString,
NSNumber, NSDate, NSArray, or NSDictionary object. Container objects
must also contain only these kinds of objects.
# So you must convert everything to either these types or hashes,
arrays, strings, and other simple types before to_plist.
def to_plist(format=:xml)
format = case format
when :xml
NSPropertyListXMLFormat_v1_0
when :binary
NSPropertyListBinaryFormat_v1_0
when :open_step
NSPropertyListOpenStepFormat
else
raise ArgumentError, "invalid format `#{format}'"
end
#error = Pointer.new(:object)
data = NSPropertyListSerialization.dataFromPropertyList(self,
format:format,
errorDescription:nil)
#raise error[0] if error[0].to_s.size > 0
NSMutableString.alloc.initWithData(data, encoding:NSUTF8StringEncoding)
end
end
I also tried out those lines commented above to get the errors currently
swallowed from NSPropertyListSerialization, but didn't get much out of that.
I also learned that those methods on NSPropertyListSerialization don't
support nils or custom class instances, so I ended up writing some
methods to convert my data into a hash containing array of hashes
without any nil values in order to be able to have the to_plist and
from_plist work. It would be nice if this supported custom types (custom
class instances) and nils the way that activesupport's to_xml/from_xml
do (I think), but I didn't have time to work out a solution to that.
And for now I just made closing the window exit the app. I wrote it so
that if you start the app and start a task and kill the app, the task is
still active and timer works even when computer is off (since it is
storing the start_time of the task). It is very simplistic, but it works.
So yay, a working standlone multiple-timer application in
HotCocoa/MacRuby! Let me know if you have any thoughts on this.
Thanks,
Gary
Gary Weaver wrote:
Hello,
I wrote a small application in HotCocoa/MacRuby just to get familiar
with it ( http://github.com/garysweaver/hourz ). MacRuby and HotCocoa
are awesome! I did have a few issues during development that I thought
I'd share in case anyone can assist.
I'm using MacRuby 0.5 and HotCocoa 0.5.1 on OS X 10.6.2, was using
TextMate vs. XCode to develop it. I have some experience with Ruby,
but consider me a newbie to MacRuby, HotCocoa, and Cocoa (and Obj-C
for that matter).
Here is what I ran into:
* If I take a stringValue from a text field, Marshal.dump it to a
file, and then Marshal.load it, and put it back into the text field,
it puts wierd characters in the end of the value like 'Òÿýÿÿÿ'. I
think this might be a result of the class that I'm Marshalling that
contains "include HotCocoa::Behaviors"? Not sure. I wasn't able to
reproduce the issue via macirb using simple array or array of simple
custom class Marshalling to file and back, but I'm able to reproduce
the issue everytime in my app, but the class is more complicated.
* I wasn't able to get File.copy to work so I wrote my own method to
copy a file. Could you provide an example that can copy a file in
MacRuby using File.copy or using FileUtils?
* I wasn't able to set the (HotCocoa) layout_view frame or hidden
properties successfully via calls by a button on_action. I could set
them fine as long as they were called during startup of the
application. For example, I wanted to do the following to hide a
layout_view and replace it with another layout_view and vice versa in
the same area of the window, but these methods only worked if being
called during the initial load. I'm thinking maybe there is some sort
of refresh method I need to call?
def in_add_mode
@edit_view.frame = [0, 0, 0, 0]
@edit_view.hidden = true
@add_view.frame = [0, 0, 0, 40]
@add_view.hidden = false
end
def in_edit_mode
@add_view.frame = [0, 0, 0, 0]
@add_view.hidden = true
@edit_view.frame = [0, 0, 0, 40]
@edit_view.hidden = false
# ...
end
* (window).will_miniaturize { exit } works great to keep the app
active (in the dock) after closing the window, but I don't know what
to call such that I could close the window and then click on the icon
in the dock it then show the window. Also when I close it, it doesn't
appear to be in the hidden state, because the dock menu indicates that
I can hide the window (but it is hidden).
* I couldn't figure out how to access the dock_menu in
HotCocoa/MacRuby (I'm not using XCode or
http://www.echographia.com/blog/2009/02/08/dynamic-dock-menus-in-macruby/
would have helped). I'd like to be able to manage it dynamically in
HotCocoa if possible to be able to choose which Task I'm working on at
the moment without showing the window. It would also be cool to
dynamically change the dock icon when this happens to somehow indicate
which task is being worked on (similar to Thunderbird showing the
number of new messages, maybe I could show a number or some brief text?).
* I couldn't figure out how to alter the "About" part of the
application to provide the authorship, license, and link to the
project, although I know the version number is specified in
config/build.yml. It would also be cool to have full control over that
area and define the window, etc.
* I wasn't sure what the best practice would be to ensure that the
window could be resized if someone somehow is using larger/smaller
fonts, but to keep it from being resized so much that it is unusable.
Maybe the right thing to do is to just specify a defined size/frame
for the window that cannot be changed?
* Note that I might also look into storing the task data as xml or
json. I'd rather it be hand-editable if needed. (I assume I could just
put the array into a hash and use to_xml/from_xml or to_json/from_json.)
Again, thanks so much for all of your work on this. It is really cool
to develop apps for OS X this quickly! (<16 hours total dev time, not
including time to post to GitHub, and a lot of that was research,
documentation, making an icon, etc.)
Thanks in advance for any assistance!
Gary
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
[email protected]
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel