Giter VIP home page Giter VIP logo

wyldcard's People

Contributors

defano avatar ooper-zz avatar rozek avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wyldcard's Issues

feature: stacksInUse missing

I think this is related to the "start using stacks", which we don't support, but I thought I would mention it, because we do allow multiple stacks to be loaded.

Bug: "the ClickLine" attribute/function should return the " of <short name of target>"

Currently, "the clickline" returns only the line number of the field's clicked row, not the full parent, in the form of "line 1 of <card | background> field ".

This bug can be found in the "Audio Help" stack.
It can be duplicated by writing a simple mouseUp script on a locked text field:
on mouseUp
answer the clickLine --should answer "line x of card field x"
end mouseUp

Build with 'generateBundle' throws exception

What I ran:
./gradlew generateBundle

Result:


FAILURE: Build failed with an exception.

* What went wrong:
Could not initialize class org.codehaus.groovy.runtime.InvokerHelper

Put command "defaults" to *background* field (rather than "card") - how to change "priority"? Suggestions for ANTLR introduction book?

I create a field, and then a button with the following mouseUp script:

on mouseDown
ask "Enter a number"
put it into field 1 --"output"
end mouseDown

This complains that there is no background field. If I change it to card field, it works as I expect. Where in the code or grammar determines what the "default" specifier to use is?

What is recommended as a good "first ANTLR book"?

Auto-completion of handlers (on/end __) - where to intercept keyboard, or hook into autocomplete/syntax checker?

I want to add functionality that will autocomplete on and end lines in handlers - if the user types "on mouseup", have it insert"\n\t\nendmouseup" and place the cursor after the tab character on the second line. I figure I can add the stuff using "ScriptEditor:: appendNamedBlock()" (line 466)

But how should I detect when the user has typed the proper string [ 'on' ('mouseup'|'mousedown'|...) ]?

One idea would be to intercept the return character by adding to the HyperTalkTextEditor custom key listener (line 67: in "scriptField.addKeyListener(new KeyListenable()..")

But would there be a better seem to hook that into the the return key. I'd think might be would be InsertBreakAction() (RTextEditorKit.java:1465)

Or hook into the online parser and syntax checker, or the autocompletion kit.

Suggestions?

Wikipedia entry

Good morning!

I think, WyldCard would definitely be worth an entry in Wikipedia! I've just mentioned it in the german article for HyperCard, refering to the related Wiki.

But I would also like to add a separate article about WyldCard.

Do you allow me to translate texts from your WyldCard wiki in order to be placed on that page? Many of your sentences could not be written better (e.g., more concise) and, thus, I would like to avoid having to think about phrases of similar quality...

NumberFormatException (locale-related)

Good morning!

I just tried to resize a stack to 1280x1024 pixels from within "Stack Info..." > "Resize...", but failed with the following exception:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1.280"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
        at java.base/java.lang.Integer.parseInt(Integer.java:658)
        at java.base/java.lang.Integer.parseInt(Integer.java:776)
        at com.defano.wyldcard.window.layout.StackSizeEditor.onOK(StackSizeEditor.java:48)
        at com.defano.wyldcard.window.layout.StackSizeEditor.lambda$new$0(StackSizeEditor.java:30)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
        at java.desktop/java.awt.Component.processEvent(Component.java:6401)
        at java.desktop/java.awt.Container.processEvent(Container.java:2263)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2762)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
        at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
        at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
        at java.desktop/java.awt.Dialog.show(Dialog.java:1070)
        at java.desktop/java.awt.Component.show(Component.java:1716)
        at java.desktop/java.awt.Component.setVisible(Component.java:1663)
        at java.desktop/java.awt.Window.setVisible(Window.java:1021)
        at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1005)
        at com.defano.wyldcard.window.layout.StackSizeEditor.editStackSize(StackSizeEditor.java:79)
        at com.defano.wyldcard.window.layout.StackPropertyEditor.lambda$new$2(StackPropertyEditor.java:44)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
        at java.desktop/java.awt.Component.processEvent(Component.java:6401)
        at java.desktop/java.awt.Container.processEvent(Container.java:2263)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2762)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
        at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
        at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
        at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
        at java.desktop/java.awt.Dialog.show(Dialog.java:1070)
        at java.desktop/java.awt.Component.show(Component.java:1716)
        at java.desktop/java.awt.Component.setVisible(Component.java:1663)
        at java.desktop/java.awt.Window.setVisible(Window.java:1021)
        at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1005)
        at com.defano.wyldcard.window.WyldCardDialog.setVisible(WyldCardDialog.java:83)
        at com.defano.wyldcard.window.WindowBuilder.build(WindowBuilder.java:198)
        at com.defano.wyldcard.part.model.PartModel.lambda$editProperties$15(PartModel.java:529)
        at com.defano.wyldcard.thread.Invoke.onDispatch(Invoke.java:156)
        at com.defano.wyldcard.part.model.PartModel.editProperties(PartModel.java:487)
        at com.defano.wyldcard.menu.main.ObjectsMenu.lambda$new$7(ObjectsMenu.java:51)
        at com.defano.wyldcard.menu.dispatcher.MenuMessageHandler.lambda$handleMessage$0(MenuMessageHandler.java:39)
        at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:303)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Underlying reason: whenever I enter a number >=1000, an extra dot is shown in (and inserted into) the number input field ("1000" => "1.000") but this extra dot crashes "parseInt".

Nota bene: set the width of this stack to 1280 works fine!

Consequence: independent of what the original HyperCard is supporting - I recommend fixing the WyldCard locale to "english" (unless you have so much extra resources that you can investigate any problems with other locales and fix them...)

Appropriate changes to the documentation will inform any users about this "restriction".

discussions: Future of WyldCard

This is a placeholder for an exchange of ideas pertaining to the future of WyldCard. Can it be an extension of HyperCard's unfulfilled promise: A forever-free enabling technology for "the rest of us" non-programmers? Indeed, an "erector set" for the young, the teachers, the hobbyist, and all other subject matter experts? And more importantly, if this assertion is still valid today, has it satisfactorily been met in the marketplace, by who/what and how?

Let us pave the way by defining WyldCard's raison d'être, and its recipe for continuous contributions and innovation.

Once this is well defined, we can talk about setting up guards around features, architecture and any high level derivative work.

Importing issues

There are several issues that makes it difficult to import, in particular, I suspect that some of the following problems may be related to decompressing stack files in emulation (I'm using SheepShaver). Te couple of stacks I was able to get without compression had script issues but came through --see "Testable Stacks" issue. As far as I can tell many stack files appear corrupted after decompressing in the SheepShaver using standard decompressing applications of the day.

NOTE: I think that importing key stacks is important, but at this point I'm moving on.

Added command "addThree" not working - but not flagged as wrong either

I tried adding an "AddThree" command which is like add, but takes 4 parameters (3 "expressions" and 1 "container"). I modified the grammar (in both the the "commandStmnt" and "commandName" classes), the HyperTalkTreeVisitor file, and added a AddThreeCmd.java file. Right now just copies the function of add, but ignores the second and third parameters.

The grammar addition is:

    | 'addThree' expression ',' expression ',' expression ',' expression        # addThreeCmdStmnt

The addition to HyperTalkTreeVisitor is:

    public Object visitAddThreeCmdStmnt(HyperTalkParser.AddThreeCmdStmntContext ctx) {
        return new AddThreeCmd(ctx,
                               (Expression) visit(ctx.expression(0)),
                               (Expression) visit(ctx.expression(1)),
                               (Expression) visit(ctx.expression(2)),
                               (Expression) visit(ctx.expression(3))
        );
    }

It doesn't work, but doesn't complain that it's wrong either. The syntax coloring also doesn't work. It acts like it just skips over the line. The test script I have:

on mouseup
	put 4 into a
	put 5 into b
	put 7 into c
	put 8 into d
	add a to d -- d will equal 12
	put d -- puts 12
	wait 1 second
	addThree a, b, c, d -- d should equal (a+d) = (4+12) = 16
	put d -- still gives 12 - "addThree" didn't execute
end mouseup

Is there something in the generated grammar or another "list of commands" that would cause it to be skipped in both the SyntaxParser to "ignore" the statement entirely?

Attached is my zip file of the project (I really need to look how to make commits).

wyldcard-master-unworking-addThreeCmd.zip

Plugin with id 'io.github.fvarrui.javapackager.plugin' not found

I just wanted to start a new Wyldcard instance by building it using Gradle - but failed with the following error message

Plugin with id 'io.github.fvarrui.javapackager.plugin' not found

The original buildscript depends on io.github.fvarrui:javapackager:1.6.2 which seems to be no longer available - the problem disappears as soon as the required version is increased to io.github.fvarrui:javapackager:1.6.6

scripting: "Lock Recent" missing

This is very low priority, but lock Recent is not currently supported. It is in some of the HyperCard stacks, namely "Color Tools" stack. According to the HC reference, "it has the same effect as set the lockRecent to true, which prevents HyperCard from keeping a visual record of cards visited by the user (or a handler) in the Recent Card dialog box."

Testable stacks

The attached have script problems, but are not corrupted and can be imported.

Missing modifier keys functionality

Thanks for helping me get this built! It's really great.

First thing I did was jump into paint mode and try some drawing.

I notice it is lacking the modifier keys that allowed you to do really cool stuff whilst painting. Such as tighten the selection to only the drawn pixels within the selection.

I do see that double-clicking the tools is there, so you have a good eye for UI details.

Anyway, thought you might like to know.

In some manuals it's listed as "Dragging with modifier keys" and surrounding pages

https://vintageapple.org/macbooks/pdf/HyperCard_Users_Guide_1988.pdf

Screen shot 2021-08-07 at 22 35 25

In other manuals it's listed as "Using Modifier Keys with Paint Tools" and surrounding pages

https://cancel.fm/stuff/share/HyperCard_Reference_1.pdf

Screen shot 2021-08-07 at 22 35 09

missing functionality and scripting:Scripting and Menu items for "Picture" are missing in Edit Menu

I found this in the attached stack "Graph Maker", trying to send a DoMenu for graphics:
Graph Maker stack--missing-picture-scripting.zip

There are a series of Domenu commands in the script of this stack that are not understood by WyldCard, this allows scripts to perform paint capabilities, as observed in this graph stack. Had 2.4 enables "Cut Picture", "Copy Picture" and "Clear Picture" under the Edit menu.

HC executable Virus alert: my downloaded/installed version of HyperCard 2.4 running in the emulator has a virus

When a new stack is created using the installed version of HyperCard 2.4, my new stack is added the following script: I replaced "Home" with "hackHome", but Do NOT run without understanding what it does. I haven't evaluated it (it could be totally non-destructive, but don't count on that). I don't know if this explains some of the stack corruption observed.

on openbackground --merryxmas
  merryxmas "on openbackground --merryxmas"
end openbackground

on closebackground --merryxmas
  merryxmas "on closebackground --merryxmas"
end closebackground

on idle --merryxmas
  put "on idle --merryxmas" into key
  if not (the script of this stack contains key) then merryxmas key
end idle

on merryxmas key
  set lockscreen to true
  set lockmessages to true
  set lockrecent to true
  put the userlevel into oldlevel
  set the userlevel to 5
  put the script of this stack into stackscript
  put the script of stack "hackHome" into homescript
  put "on openbackground --merryxmas" into hostscript
  if stackscript contains key then
    if homescript contains key then
    else
      set cantmodify of stack "hackHome" to false
      if not (cantmodify of stack "hackHome") then
        set the script of stack "hackHome" to ¬
        homescript & return & lastlines(hostscipt,stackscript)
      end if
    end if
  else
    if homescript contains key then
      set cantmodify of this stack to false
      if not (cantmodify of this stack) then
        set the script of this stack to ¬
        stackscript & return & lastlines(hostscript,homescript)
      end if
    else domenu "Quit Hypercard"
  end if
  set the userlevel to oldlevel
  set lockrecent to false
  set lockmessages to false
  set lockscreen to false
end merryxmas

function lastlines afterline,stuff
  put (number of lines in stuff) into total
  put line (total-53) to total of stuff into host
  repeat with x = 55 to total
    put line (total-x+1) of stuff & return & host into host
    if line 1 of host is afterline then exit repeat
  end repeat
  return host
end lastlines

on openStack
  hide menubar
  pass openStack
end openStack

Luckily, I have a Mac Mini running OS9 and that version of HC doesn't do this...is not connected, so it'll be challenging moving files, but oh well.

tests using long dates fail (problems with locale settings)

First of all: thank you very much for this marvelous project!

I just started playing around with it:

  • gradlew run worked out-of-the-box - very well done!
  • but gradlew generateBundle failed because of two failing tests
ValueTest > testDateStyledCompare() FAILED
    org.opentest4j.AssertionFailedError at ValueTest.java:871

ValueTest > testIsADate() FAILED
    org.opentest4j.AssertionFailedError at ValueTest.java:727

both are related to "long date" formats, e.g.

assertTrue(new Value("Monday, January 1, 1985").isA(new Value("date")).booleanValue());     // Long date

and

assertEquals(1, new Value("Monday, January 1, 2000").compareTo(new Value("Monday, December 31, 1999"), SortStyle.DATE_TIME));

Long dates don't seem to be recognized.

I did not find the time to further investigate the problem, though, and, thus, may also be wrong.

My system is a Mac with german locale...

Edit: indeed, tests seem to fail because of the locale settings: (in HyperTalk)
put "Sonntag, April 24, 2022" is a date displays true but
put "Sunday, April 24, 2022" is a date displays false
The question will now be: do you want dates to always be handled in english locale or to respect the system's locale setting?

Edit 2: as a hint: numbers are always parsed using the english locale (e.g., "1.23" is a number whereas "1,23" is not, although the german locale uses "," instead of "."). As a consequence, you may prefer to always handle dates in english locale...

With greetings from Germany,

Andreas Rozek

Function handlers should be passible

Currently a script can only invoke a function within its own script; functions should follow normal message passing hierarchy (a card part should "inherit" functions on its card, background or stack).

Bug (high priority): WyldCard hanging upon closing a stack that had script errors

WyldCard is hanging when closing a stack that had script errors. When it closes, it closes the automatic Untitled Stack and quits.

Please try the attached converted stack "Audio Help" attached.

Buggy Audio Help.stack.zip

Open wyldcard stack
Close the script error dialog
Try to close the stack.

This is the log:
15:27:54.700 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.part.stack.StackPart - Creating stack from model com.defano.wyldcard.part.stack.StackModel@f82f4c0f.
15:27:54.786 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Displaying stack com.defano.wyldcard.part.stack.StackPart@4c599b2, inNewWindow=false.
15:28:01.492 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Enqueueing disposal task for stack id 18727
15:28:01.795 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Sending 'close' messages to stack id 18727.
15:28:01.799 [AWT-EventQueue-0] DEBUG com.defano.wyldcard.WyldCardStackManager - Disposing resources of stack id 18727.

Feature: The Home Card is Dead, long live the Home Card

Other than other HC clones, the closest thing to the HyperCard model is the WWW -- you know, the tool that IS departments, search engines, dotComs, Social Media, Ad agencies love and typical users love and hate? Yes THAT one. Not the mention the authoring nightmare with its proliferation of UI frameworks. Ok, I'll save my gripes for another day. The point is that even the Web has a "home" page.

The notion of a Home Card goes beyond the legal implications. Frankly, if there is any chance of WyldCard making a difference to the common user, navigating orientation has got to be it. This is why Man has used the location of the sun, the North Star over millennia, and in urban living the landmarks of a local Church, the Eiffel tower, the Bay Bridge, the Empire State building, and Mount Diablo in my home town do the trick.

WyldCard is walking a tight rope already, but if the name is a legal problem, I propose bringing the Home Card concept with a different nomenclature; perhaps something like Home Base or Landmark (Card). The latter could be an interesting exploratory redesign that can leverage "the Marked Card concept in WyldCard as a way to dynamically change navigation based on context.
Finally, WyldCard needs to be Web enabled. But more on that on its own feature "issue".

Bug-Behavior compatibility, low: Command "f" does not type "find" into message box

This is relatively minor, but Apple's HC tools use it to programmatically allow users to find test in the stack using the message box.

HyperCard Tour.stack--find-beavior.zip

Here is a sample script (card 37 of the stack attached):
on forward -- ∆
-- set lockMessages to true
set the cursor to none
show message at 19,3000 -- keep the message box out of view
type "f" with commandKey
set the cursor to none
if the selectedText is not empty then type "x" with commandKey
show msg at 19,211 -- old 19,266
set the cursor to none
wait 30
put "Zebra" into theWord
repeat with i = 1 to 5
set the cursor to none
type (char i of theWord)
wait 20
end repeat
wait 30 ticks
go next
end forward

many POMs seem to have vanished

I cannot ./gradlew run any longer, because the POMs for MaryTTS seem to have vanished

Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not find de.dfki.mary:voice-cmu-slt-hsmm:5.2.
     Searched in the following locations:
       - https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
       - file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
       - https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-slt-hsmm/5.2/voice-cmu-slt-hsmm-5.2.pom
     Required by:
         project :
   > Could not find de.dfki.mary:voice-cmu-bdl-hsmm:5.2.
     Searched in the following locations:
       - https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
       - file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
       - https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-bdl-hsmm/5.2/voice-cmu-bdl-hsmm-5.2.pom
     Required by:
         project :
   > Could not find de.dfki.mary:voice-cmu-rms-hsmm:5.2.
     Searched in the following locations:
       - https://repo.maven.apache.org/maven2/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
       - file:/Users/andreas/.m2/repository/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
       - https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-cmu-rms-hsmm/5.2/voice-cmu-rms-hsmm-5.2.pom
     Required by:
         project :
   > Could not find de.dfki.mary:voice-dfki-prudence-hsmm:5.2.
     Searched in the following locations:
       - https://repo.maven.apache.org/maven2/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
       - file:/Users/andreas/.m2/repository/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
       - https://public.nexus.pentaho.org/content/groups/omni/de/dfki/mary/voice-dfki-prudence-hsmm/5.2/voice-dfki-prudence-hsmm-5.2.pom
     Required by:
         project :

and, until now, I could not find an alternative repo for these dependencies. According to the marytts project, MaryTTS artifacts for version 5.2.1 should be available through "Maven Central", but that did not work for me...(as it seems to contain voice-cmu-slt-hsmm only, not the other required voices)

public.nexus.pentaho.org does no longer seem to hold any MaryTTS files

"Spring Plugins" and "Spring Lib M" seem to require some kind of authorization in order to access any files...

FIXED: Deprecated-To-Be "JacocoReportBase.setClassDirectories(FileCollection)" function in gradle build file

(Duplicate post so that it "gets seen" by the project owner defano - I accidentally closed my own issue, and am not sure if it notifies people of issues that are "open-then-immediately-closed")

I'm getting a deprecated error with: JacocoReportBase.setClassDirectories(FileCollection), with the recommendation to use "getClassDirectories().from(...)" A Google turns up a similar error someone else got (gradle/gradle#7753). I changed the WyldCard build script as follows, updating the "jacocoTestReport" block:

//
// ****** Deprecation error ******
// (Gradle 5.2.1, will be deprecated in 6.0)
// [jw 3/5/2019]
//
// *** ORIGINAL (works with Gradle 5.2.1):
/*
jacocoTestReport {
	afterEvaluate {
		classDirectories = files(classDirectories.files.collect {
			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
		})
	}
}
*/

// *** Fix:

jacocoTestReport {
	afterEvaluate {
		getClassDirectories().setFrom(classDirectories.files.collect {
			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
		})

//*		classDirectories = files(classDirectories.files.collect {
//*			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
//*		})
	}
}

// ****** End of deprecation error fix ******

"Show all cards" menu command (UI)?

Was there a "show all cards" menu item that small images of all the cards in the stack and let you select one that isn't in WyldCard, or am I mis-remembering from 25 years ago?

grammar: 'wait' and "default" timeUnit

The "default" timeUnit for the wait command was seconds (HC 2.4.1 - What version is WyldCard "source-behavior" compatible with?). How would I implement such a "default argument" in the WyldCard grammar? ("WyldGram" ;) ) The appropriate part of the g4 file is:

| 'wait' expression timeUnit       # waitCountCmd

and the Java function:

public Object visitWaitCountCmd(HyperTalkParser.WaitCountCmdContext ctx) {
return new WaitCmd(ctx, (Expression) visit(ctx.expression()),
(TimeUnit) visit(ctx.timeUnit()));
}

If I changed the grammar to:

| 'wait' expression timeUnit?       # waitCountCmd

(like with the "background? field") it would accept something like "wait 5". But then what will the "timeUnit" part of the context ("visit(ctx.timeUnit())) get set to (or is there then a timeUnit part of the context)? I suppose I could make another separate waitCountSeconds like

g4:
| 'wait' expression # waitCountSecondsCmd

and then:

public Object visitWaitCountCmd(HyperTalkParser.WaitCountCmdContext ctx) {
return new WaitSecondsCmd(ctx, (Expression) visit(ctx.expression()));
}

and a separate waitSecondsCmd with:
this.units = TimeUnit.SECONDS;

Or change the visitWaitCountCmd to (pseudocode - or HyperTalk):
if (ctx IS EMPTY) then
return new WaitSecondsCmd(ctx, TimeUnit.SECONDS);

(I guess this would be self-hosting ANTLR Hypercard Implementation in HyperTalk! Isn't it the "gold standard" of compiler construction that a language is able to self-host?)

Both of these seem inelegant - that the proper place for this logic is in the grammar, not the implementation code. Is there a "default argument syntax" like this:

| 'wait' expression timeUnit?=seconds       # waitCountCmd

or:

| 'wait' expression timeUnit?=secondsTimeUnit()       # waitCountCmd

so that the "timeUnits" node of the AST context is automatically set to "secondsTimeUnit"? I'm definitely putting in the ordering Terrance Parr's "Definitive ANTLR 4 Reference" TODAY :). I found a pirated PDF file, but I just like books!

What is your convention for capitalization? I notice that the "visit" functions and "helper evaluators" like secondsTimeUnit() are lower case, while the "Cmd" funcitons are upper-case.

Cannot override built-in functions in scripts

the following script works in HC 2.4, but breaks in WyldCard:
function-override

WyldCard is breaking during script parsing when overriding a built-in function. However, HyperCard lets it through, allowing you to override the function, and executes it if the function is "passed" (eg. pass menuItems). This is true for other built-in functions, like time().

Shouldn't WyldCard behave the same way?

"Statements" v. "Commands" - "addCmdStmnt" v. "answerDefaultCmd" ("stmnt" v. "cmd")?

Is there a difference between "stmnt" and "cmd" for the labels after the "#" in the grammar? I see that "add" command is "addCmdStmnt", while the "answer" command family is "answer..Cmd". (And a few are "CmdStmnt") Does the name (the ending at least) itself make a difference to the ANTLR parser generation, or is it just an arbitrary label. Could I call a function (that returns something) a command (which doesn't) if I really wanted to?

Not Saving Stacks

Hi,

I may have done this wrong. On a 12.3.1 mac and launched WyldCard with gradle run. <- There are no instructions on how to actually build.

One it was running, all was amazing, and although it looked like I could save, it didn't, and wouldn't quit.

Amazing work btw!

Help building?

Doing a straight "gradlew build" is running into some version mismatches--has this been built recently, and if so, with which version of the JDK and which version of Gradle? Were any changes to build.gradle required?

The number of the current background doesn't resolve

When I send "the number of this bg" via the message box, the system returns an error. It should return the number for the current background with respect to the stack. None of the other legal synonyms for 'background' seem to work either.

Is "milliseconds" part of the grammar/TimeUnit class/enum?

I successfully added "milliseconds" to the TimeUnit, having to modify 4 files (HyperTalkBaseVisitor, HyperTalkParse,HyperTalkVisitor, and HyperTalkTreeVisitor) and the grammar of course to do it.

It works, although I noticed that even though MILLISECONDS is not part of the TimeUnit enum, it is used in the PartMover, PartResizer, WyldCardPeriodicMessageManager, and Throttle files. How does that work?

Everything else was auto-generated in the HyperTalkParser and HyperTalkVisitor classes when I recompiled. The Parser class looks at least partly like an enormouse[Dragging] [pun] FSM) (*)

() True, I don't think there is actually a "mouseDragging*" handler, but it was needed for the pun.

(I guess it would be invoked during the drag, and then mouseDrag only called only at the end - except that's not "canon". Perhaps a "mouseDragging" handler during the drag, "mouseDragBegin" at the very beginning (button down and moved some small distance away), "longPressBegan" (mouse down and some small time), and finally a "mouseDragFinished" at the end of a drag.)

The visit function in HyperTalkTreeVisitor:

@OverRide
public Object visitMillisecondsTimeUnit(HyperTalkParser.MillisecondsTimeUnitContext ctx) {
return TimeUnit.MILLISECONDS;
}

If I leave this out, it breaks - it won't even close the script window, even if there's nothing in the script itself. So I assume that the HyperTalkParse sort of "continually scans" all the rules in the Visitor class, and so breaks when it can't find the proper functions in the parser classes.

How are string literals (quoted) parsed? Would it be possible to make it so that an unquoted literal that was the last item on a line after a "put" statement would be interpreted correctly? Thus the code

put "done"
put "the quick brown fox"

and the code,

put done
put the quick brown fox

would operate the same? This of course in non-canon.

("Premiering next year - "Hypercard: The Film.." :). Actually, that might not actually be a bad title for a history of how Apple invented/popularized the GUI interface, and with HC laid the groundwork (maybe) for Visual Basic and Visual Basic Studio. "Applescript Studio" was their "answer" to finally having a WYSIWYG editor - but I guess it was too little too late.)

closeField event doesn't seem to trigger on a field

to duplicate, create a field, set its script to:
on closeField
answer the target
end closeField

Nothing happened to me on a background field

If I have some time this weekend, I'll have a look further and send a PR

FIXED: Deprecated-To-Be "JacocoReportBase.setClassDirectories(FileCollection)" function in gradle build file

I'm getting a deprecated error with: JacocoReportBase.setClassDirectories(FileCollection), with the recommendation to use" "getClassDirectories().from(...)" A Google turns up a similar error someone got (gradle/gradle#7753). I changed the script as follows, replacing the "jacocoTestReport" block:

//
// ****** Deprecation error ******
// (Gradle 5.2.1, will be deprecated in 6.0)
// [jw 3/5/2019]
//
// *** ORIGINAL (works with Gradle 5.2.1):
/*
jacocoTestReport {
	afterEvaluate {
		classDirectories = files(classDirectories.files.collect {
			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
		})
	}
}
*/

// *** Fix:

jacocoTestReport {
	afterEvaluate {
		getClassDirectories().setFrom(classDirectories.files.collect {
			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
		})

//*		classDirectories = files(classDirectories.files.collect {
//*			fileTree(dir: it, exclude: 'com/defano/hypertalk/parser/**')
//*		})
	}
}

// ****** End of deprecation error fix ******

"The version" does not resolve

When importing stacks that use the version property (e.g. FocalPoint II) do not resolve. I realize that old stacks are referring to HyperCard, but perhaps we can assume that any stack that is importable (HC 2.x) should return our baseline version (2.4 as documented). At this point, that function doesn't even return WyldCard's version.

Sudo needed with "gradle run"? Error "couldn't create ScriptPluginFactor"..

I got it to run, but got the error (on OSX Mojave), but got the error:

Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().

Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache().

unless I run it as sudo. Is this because something in my gradle installation didn't get installed with the right permissions?

Here's the very verbose trace:
Exception is: org.gradle.internal.service.ServiceCreationException: Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory(). at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:829) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:780) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry.find(DefaultServiceRegistry.java:298) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:282) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:277) at org.gradle.initialization.DefaultGradleLauncherFactory.doNewInstance(DefaultGradleLauncherFactory.java:132) at org.gradle.initialization.DefaultGradleLauncherFactory.newInstance(DefaultGradleLauncherFactory.java:81) at org.gradle.composite.internal.DefaultRootBuildState.<init>(DefaultRootBuildState.java:45) at org.gradle.composite.internal.DefaultIncludedBuildRegistry.createRootBuild(DefaultIncludedBuildRegistry.java:85) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:45) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31) at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42) at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78) at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36) at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68) at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38) at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37) at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26) at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43) at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72) at org.gradle.util.Swapper.swap(Swapper.java:38) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.lang.Thread.run(Thread.java:748) Caused by: org.gradle.internal.service.ServiceCreationException: Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.createCrossBuildFileHashCache(). at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:829) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:780) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.assembleParameters(DefaultServiceRegistry.java:793) at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:779) at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:574) at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:631) at org.gradle.internal.service.DefaultServiceRegistry.find(DefaultServiceRegistry.java:298) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:282) at org.gradle.internal.service.DefaultServiceRegistry.get(DefaultServiceRegistry.java:277) at org.gradle.internal.service.scopes.BuildScopeServices.defaultScriptPluginFactory(BuildScopeServices.java:313) at org.gradle.internal.service.scopes.BuildScopeServices.createScriptPluginFactory(BuildScopeServices.java:292) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103) at org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34) at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:827) ... 68 more Caused by: org.gradle.api.UncheckedIOException: Failed to create parent directory '/Users/jswitte/Documents/Academic/Programming/HC Clones/wyldcard-master/.gradle/5.2.1' when creating directory '/Users/jswitte/Documents/Academic/Programming/HC Clones/wyldcard-master/.gradle/5.2.1/fileHashes' at org.gradle.util.GFileUtils.mkdirs(GFileUtils.java:327) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:75) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:42) at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:94) at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68) at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:118) at org.gradle.api.internal.changedetection.state.CrossBuildFileHashCache.<init>(CrossBuildFileHashCache.java:45) at org.gradle.internal.service.scopes.BuildSessionScopeServices.createCrossBuildFileHashCache(BuildSessionScopeServices.java:159) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103) at org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34) at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:827) ... 87 more

Visual Background mode indicator missing

Given a user is in card mode
When an Edit/Background menu item is chosen
Then the stack background should display a visual indication of being in the background mode. The orig. HC had a patterned outline of the menubar.

Conversely,
Given a user is in background mode
When an Edit/Background menu item is chosen
Then the stack background should hide the visual background mode indicator as described above

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.