TweetFollow Us on Twitter

Split Button
Volume Number:7
Issue Number:6
Column Tag:HyperChat

Splitting Your Sides

By Carl J. Manaster, Globe, AZ

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

[Carl is a mining engineer and programmer whose appreciation for environments such as HyperCard and THINK Pascal is enhanced by painful memories of dBase and FORTRAN.]

Objectives

It’s endemic among HyperCard fans to try to “fill in” the gaps left by Apple. Such supplements often take the form of XCMDs and XFCNs, offering everything from standard file calls to color windows. Occasionally, the purists among us like to write these extensions in HyperTalk itself, keeping it “all in the family,” as it were. (Also, having once used TCL or MacApp, it’s hard to imagine going back to writing Pascal without such crutches - and they don’t help with code resources!)

One thing missing from HyperCard is polygonal buttons - arbitrary shapes that behave like a button. The need for these has been apparent since the first release and its Clip Art stack, where the user clicks on certain parts of the pictures to travel to related cards. Since it’s all done with transparent (rectangular) buttons, there’s a great deal of “slop” space, where a click that ought to be on a hat (for instance) is really in the rectangle of the man.

There are doubtless XCMDs available that solve this problem, and I’ve seen at least one article describing a HyperTalk-based solution; here is another.

The Basic Solution

My solution is to place buttons over each side of the polygon, and split the message chain along each button’s diagonal. The message to do this is in the stack’s script:

--1

--message split
--syntax: split(orientation,¬
----------------topMessage,bottomMessage)
--where: orientation is “/” or “\”
--topMessage is message to be called if click
------------------was in top half of target
--bottomMessage is message to be called if click
--------------------was in bottom half of target

on split
  put param(2) into topMessage
  put param(3) into bottomMessage
  put (the bottom of the target) - ¬
 (the clickV) into vDiff
  if param(1) is “/”
  then put (the clickH) - (the left of¬
 the target) into hDiff
  else put (the right of the target) - ¬
 (the clickH) into hDiff
  put vDiff * (the width of the target)¬
 > hDiff * (the height of the target)¬
 into doTop
  if doTop
  then send topMessage to target
  else send bottomMessage to target
end split

Each button’s mouseUp script calls split with the appropriate orientation and messages, thereby simulating two adjacent triangular buttons with differing mouseUp messages. With this script and the button tool, buttons can be placed around a polygon to simulate polygonal buttons.

Figure 1 - How a Split Button Simulates a Pair of Triangular Buttons

Getting Fancy

The obvious next step is to make it easier to generate polygonal buttons. The script in Listing #1, makePolyButton, does this. It tracks and records clicks until one is close to the first vertex, outlining the polygon as it is defined.

Figure 2 - Original Image with Polygonal Outline

Once all the vertices of the polygon have been entered, the maximum and minimum horizontal and vertical coördinates are determined, as well as the next-to-maximum and next-to-minimum.

A button is created whose sides are the next-to-extreme coördinates of the polygon’s vertices; most mouseUp messages reaching it will be within the polygon but not within any of the buttons around its edge.

Figure 3 - Polygon with Interior Button

Lastly, for each side of the polygon, a button is created whose mouseUp handler uses the split message to choose between the two messages that are passed to makePolyButton as parameters.

Figure 4 - Polygon with Border Buttons

Limitations and Flaws

Like most solutions, this one is imperfect; here are some of the problems associated with my implementation of polygonal buttons:

No AutoHilite or Outline

Because polygonal buttons have no single data structure where they are defined, autoHiliting is out of the question. Outlining is not impossible - a script could be written that included:

--2

choose line tool
if the script of the target¬
contains “split” and the script of¬
the target contains “/” then drag 

but it would not behave like normal outlining: painting would obscure it; moving the button would neither erase the old outline nor draw the new one; even if this were solved, erasing the old could mess up the paint layer with traces of white It is best to accept that outlining is not a feature of these polygonal buttons.

Sharp Corners Confuse

It is possible to generate polygons that are not modelled well with this technique. Indeed, the polygon used in Figures 2-4 shows some space that will report an “inside” message when certain “outside” areas are clicked (the upper right corner of the interior button, whose message is “inside”, extends beyond where border buttons cover it.) Similar mis-routing of the message chain can occur when the angles of a polygon are too sharp, and one border button overlaps another. This problem can be overcome by tweaking with the button tool, but even without such tweaking there is much less slop space than with plain, rectangular buttons.

Conclusions

The Spectrum of Solutions

There are countless ways in which a polygon may be made to act as a button in HyperCard; the methods differ in degree of resolution. The trade-off is between accuracy of representation on the one hand and programming demands, memory, and speed on the other. The roughest solution is to use rectangular buttons that more-or-less cover the polygon. At the fine end of the spectrum lie solutions such as pixel-sized buttons to fill the polygon, XCMDs, and complex scripts that rely on globals or fields to keep track of the polygon’s vertices.

Split buttons fall somewhere in the middle of the spectrum. The marginal costs over using rectangular buttons (a little programming, slightly more difficulty creating, moving, and deleting, and one more handler in the message chain) are relatively small, and the gains are significant. The accuracy is not as good as the pixel-perfect solutions (both HyperCard- and XCMD- based), but much less programming is required, and split buttons should be much faster than the HyperCard-based solutions.

This via media is realized by using each button to focus information, like relying on an airplane to get across the country and then getting to your house by car. The rough end of the spectrum relies on HyperCard to do all of the work (flying home on a 747); the fine end solutions do all of the work themselves (driving cross-country); split buttons rely on HyperCard for what it’s good at - the rough determination of which rectangular button contained the click - and concentrate on further distilling the information.

Because split buttons represent a compromise, they will not be appropriate for every stack calling for polygonal buttons. Because they represent a good compromise, however, they may find many applications.

LISTING #1 - makePolyButton script
--message makePolyButton
--syntax: makePolyButton(inMessage,outMessage)
----------inMessage is message to be called by 
----------------clicks within the polyButton
----------outMessage is message to be called by 
----------------clicks outside the polyButton

on makePolyButton inMessage,outMessage
 put empty into pointList
 choose line tool
 set the cursor to cross
 wait until the mouseClick
 put the clickLoc into pointList

 repeat
 wait until the mouseClick
 put return & the clickLoc after pointList
 put the number of lines of pointList¬
 into count
 drag from (line count-1 of pointList)¬
 to (line count of pointList)
 if abs(item 1 of last line of pointList¬
 - item 1 of first line of pointList)<2¬
 and abs(item 2 of last line of pointList¬
 - item 2 of first line of pointList)<2¬
 then exit repeat
 end repeat

 put line 1 of pointList into¬
 last line of pointList
 put the number of card buttons into cbCount
 set lockScreen to true
 doMenu revert
 choose button tool

 put item 1 of line 1 of pointList into maxV
 put item 1 of line 2 of pointList into maxPenV
 put item 1 of line 1 of pointList into minV
 put item 1 of line 2 of pointList into minPenV

 put item 2 of line 1 of pointList into maxH
 put item 2 of line 2 of pointList into maxPenH
 put item 2 of line 1 of pointList into minH
 put item 2 of line 2 of pointList into minPenH

 repeat with i=2 to count

 get item 1 of line i of pointList
 if it > maxPenV then--find the largest
 if it > maxV then --and second largest v
 put maxV into maxPenV
 put it into maxV
 else
 put it into maxPenV
 end if
 end if

 if it < minPenV then   --find the smallest
 if it < minV then --and second smallest v
 put minV into minPenV
 put it into minV
 else
 put it into minPenV
 end if
 end if

 get item 2 of line i of pointList
 if it > maxPenH then--find the largest
 if it > maxH then --and second largest h
 put maxH into maxPenH
 put it into maxH
 else
 put it into maxPenH
 end if
 end if

 if it < minPenH then--find the smallest
 if it < minH then --and second smallest h
 put minH into minPenH
 put it into minH
 else
 put it into minPenH
 end if
 end if

 end repeat

 add 1 to cbCount--create the interior button
 doMenu “new button”
 set the style of card button cbCount¬
 to transparent
 set the showName of card button cbCount¬
 to false
 set the autoHilite of card button cbCount¬
 to false
 set the rect of card button cbCount¬
 to minPenV,minPenH,maxPenV,maxPenH
 put “on mouseUp” into theScript
 put return & inMessage after theScript
 put return & “end mouseUp” after theScript
 set the script of card button cbCount¬
 to theScript
 repeat with i=1 to count-1
 add 1 to cbCount--create the edge buttons
 set the cursor to busy
 put line i of pointList into firstPoint
 put line (i+1) of pointList into secondPoint
 doMenu “new button”
 set the name of card button cbCount¬
 to “split” && i

 --determine the coördinates of the button:
 if (item 1 of firstPoint) < (item 1¬
 of secondPoint) then
 put item 1 of firstPoint into top
 put item 1 of secondPoint into bottom
 else
 put item 1 of secondPoint into top
 put item 1 of firstPoint into bottom
 end if
 if (item 2 of firstPoint) > (item 2¬
 of secondPoint) then
 put item 2 of firstPoint into right
 put item 2 of secondPoint into left
 else
 put item 2 of secondPoint into right
 put item 2 of firstPoint into left
 end if

 set the rect of card button cbCount¬
 to top,left,bottom,right
 set the style of card button cbCount¬
 to transparent
 set the showName of card button cbCount¬
 to false
 set the autoHilite of card button cbCount¬
 to false

 --determine the orientation of the
 --”split” of the button:

 put “on mouseUp” into theScript

 if (item 1 of firstPoint) > (item 1¬
 of secondPoint) then
 if (item 2 of firstPoint) > (item 2¬
 of secondPoint) then
 put return & “split “ & quote & “\”¬
 & quote & “,” & inMessage & “,” &¬
 outMessage after theScript
 else
 put return & “split “ & quote & “/”¬
 & quote & “,” & inMessage & “,” &¬
 outMessage after theScript
 end if
 else
 if (item 2 of firstPoint) > (item 2¬
 of secondPoint) then
 put return & “split “ & quote & “/”¬
 & quote & “,” & outMessage & “,” &¬
 inMessage after theScript
 else
 put return & “split “ & quote & “\”¬
 & quote & “,” & outMessage & “,” &¬
 inMessage after theScript
 end if
 end if

 put return & “end mouseUp” after theScript

 set the script of card button cbCount¬
 to theScript
 end repeat

 choose browse tool
end makePolyButton
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Logic Pro X 10.1.1 - Music creation and...
Apple Logic Pro X is the most advanced version of Logic ever. Sophisticated new tools for professional songwriting, editing, and mixing are built around a modern interface that's designed to get... Read more
VLC Media Player 2.2.0 - Popular multime...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more
Sound Studio 4.7.8 - Robust audio record...
Sound Studio lets you easily record and professionally edit audio on your Mac. Easily rip vinyls and digitize cassette tapes, or record lectures and voice memos. Prepare for live shows with live... Read more
LibreOffice 4.4.1.2 - Free, open-source...
LibreOffice is an office suite (word processor, spreadsheet, presentations, drawing tool) compatible with other major office suites. The Document Foundation is coordinating development and... Read more
Freeway Pro 7.0.3 - Drag-and-drop Web de...
Freeway Pro lets you build websites with speed and precision... without writing a line of code! With its user-oriented drag-and-drop interface, Freeway Pro helps you piece together the website of... Read more
Cloud 3.3.0 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more
Cyberduck 4.6.5 - FTP and SFTP browser....
Cyberduck is a robust FTP/FTP-TLS/SFTP browser for the Mac whose lack of visual clutter and cleverly intuitive features make it easy to use. Support for external editors and system technologies such... Read more
Firefox 36.0 - Fast, safe Web browser. (...
Firefox for Mac offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals and... Read more
Thunderbird 31.5.0 - Email client from M...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more
VOX 2.4 - Music player that supports man...
VoxIt just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features & support for all audio formats you should ever need... Read more

Get The Whole Story – Lone Wolf Complete...
Get The Whole Story – Lone Wolf Complete is Now Available and On Sale Posted by Jessica Fisher on February 27th, 2015 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Who Wore it Best? The Counting Dead vs....
Like it or not, the “clicker” genre, popularized by cute distractions like Candy Box and Cookie Clicker, seems like it’s here to stay. So Who Wore it Best? takes a look at two recent examples: The Counting Dead and AdVenture Capitalist. | Read more »
Card Crawl, the Mini Deck Building Game,...
Card Crawl, the Mini Deck Building Game, is Coming Soon Posted by Jessica Fisher on February 27th, 2015 [ permalink ] Tinytouchtales and Mexer have announced their new game, | Read more »
Witness an all new puzzle mechanic in Bl...
Well, BlastBall MAX is not one of those games and is bucking trends such as timers, elements of randomness, and tacked-on mechanics in favor of pure puzzle gameplay. When you first boot up the game you’ll see a grid made up of squares that are each... | Read more »
This Princess Has a Dragon and She isn’t...
This Princess Has a Dragon and She isn’t Afraid to Useit. | Read more »
Mecha Showdown Review
Mecha Showdown Review By Lee Hamlet on February 27th, 2015 Our Rating: :: IN A SPINUniversal App - Designed for iPhone and iPad Mecha Showdown replaces traditional buttons with a slot machine mechanic in this robot fighting game,... | Read more »
Reliance Games and Dreamworks Unveil Rea...
Reliance Games and Dreamworks Unveil Real Steel Champions Posted by Ellis Spice on February 27th, 2015 [ permalink ] Reliance Games and Dreamworks have announced that a third game in | Read more »
Sum Idea Review
Sum Idea Review By Jennifer Allen on February 27th, 2015 Our Rating: :: TAXING NUMBERSUniversal App - Designed for iPhone and iPad Sum Idea is a fairly charming but taxing puzzle game.   | Read more »
A New Badland Update Brings Daydream Lev...
A New Badland Update Brings Daydream Levels to Co-Op Posted by Ellis Spice on February 27th, 2015 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Slashing Demons Review
Slashing Demons Review By Lee Hamlet on February 27th, 2015 Our Rating: :: IT'S A LONG WAY TO THE TOPUniversal App - Designed for iPhone and iPad Slashing Demons lacks the depth or scope to take it beyond the point of being just... | Read more »

Price Scanner via MacPrices.net

Apple CEO Tim Cook to Deliver 2015 George Was...
Apple CEO Tim Cook will deliver the George Washington University’s Commencement address to GWU grads on May 17, at which time he will also be awarded an honorary doctorate of public service from the... Read more
Apple restocks refurbished Mac minis for up t...
The Apple Store has restocked Apple Certified Refurbished 2014 Mac minis, with models available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.4GHz... Read more
Save up to $50 on iPad Air 2s, NY tax only, f...
 B&H Photo has iPad Air 2s on sale for $50 off MSRP including free shipping plus NY sales tax only: - 16GB iPad Air 2 WiFi: $469.99 $30 off - 64GB iPad Air 2 WiFi: $549 $50 off - 128GB iPad Air 2... Read more
16GB iPad Air 2 on sale for $447, save $52
Walmart has the 16GB iPad Air 2 WiFi on sale for $446.99 on their online store for a limited time. Choose free shipping or free local store pickup (if available). Sale price for online orders only,... Read more
iMacs on sale for up to $205 off MSRP
B&H Photo has 21″ and 27″ iMacs on sale for up to $205 off MSRP including free shipping plus NY sales tax only: - 21″ 1.4GHz iMac: $1029 $70 off - 21″ 2.7GHz iMac: $1199 $100 off - 21″ 2.9GHz... Read more
Apple Takes 89 Percent Share of Global Smartp...
According to the latest research from Strategy Analytics, global smartphone operating profit reached US$21 billion in Q4 2014. The Android operating system captured a record-low 11 percent global... Read more
New Travel Health App “My Travel Health” iOS...
Rochester, Minnesota based Travel Health and Wellness LLC has announced that its new iOS app help safeguard the user’s health when traveling abroad — “My Travel Health” is now available on the Apple... Read more
Sale! MacBook Airs for up to $115 off MSRP
B&H Photo has MacBook Airs on sale for up to $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 11″ 128GB MacBook Air: $799 100 off MSRP - 11″ 256GB MacBook Air: $999 $100... Read more
15-inch 2.0GHz Retina MacBook Pro (refurbishe...
The Apple Store has Apple Certified Refurbished previous-generation 15″ 2.0GHz Retina MacBook Pros available for $1489 including free shipping plus Apple’s standard one-year warranty. Their price is... Read more
Wither The iPad mini? End Of The Road Imminen...
AppleDailyReport’s Dennis Sellers predicts that the iPad mini is going to be left to wither on the vine, as it were, and then just allowed to fade away — a casualty of the IPhone 6 Plus and other... Read more

Jobs Board

Sr. Technical Services Consultant, *Apple*...
**Job Summary** Apple Professional Services (APS) has an opening for a senior technical position that contributes to Apple 's efforts for strategic and transactional Read more
Event Director, *Apple* Retail Marketing -...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global engagement strategy and team. Delivering an overarching brand Read more
*Apple* Pay - Site Reliability Engineer - Ap...
**Job Summary** Imagine what you could do here. At Apple , great ideas have a way of becoming great products, services, and customer experiences very quickly. Bring Read more
*Apple* Solutions Consultant - Retail Sales...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
*Apple* Solutions Consultant - Retail Sales...
**Job Summary** As an Apple Solutions Consultant (ASC) you are the link between our customers and our products. Your role is to drive the Apple business in a retail Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.