Using variables to change the font-weight
Using the normal font-weight: 400
Using the medium font-weight: 500
Using the bold font-weight: 700
Using the normal font-weight: 400
Using the medium font-weight: 500
Using the bold font-weight: 700
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Dolores similique, sunt quam ea harum libero eligendi maiores tempora iusto cupiditate sequi maxime illum nobis nostrum eius optio sed minus doloribus!
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Dolores similique, sunt quam ea harum libero eligendi maiores tempora iusto cupiditate sequi maxime illum nobis nostrum eius optio sed minus doloribus!
Extends allow us to have a base class that can be extended to other classes.
Like a base class for a button that can be applied to all buttons, and then, we use extends to apply another classes to diferentiate the buttons.
Example:
SASS allow us to work with math operations, so we can define styles that have numeric parameters like width, height, margin, etc., and then we can apply them using math.
Check the example below:
@mixin imageGrid ($qty, $margin) {
width: ((100% - (($qty - 1) * $margin)) / $qty);
.grid {
@include clearfix;
.item {
float: left;
@include imageGrid(3, 1%);
}
| Name | Processor | Battery | Price |
|---|---|---|---|
| Mi A2 | Snapdragon 660 | 3010mAh | R$ 1.099 |
| Mi A2 Lite | Snapdragon 625 | 4000mAh | R$ 990 |
| Mi 8 | Snapdragon 845 | 3400mAh | R$ 2.400 |
| Mi 8 Lite | Snapdragon 660 | 3350mAh | R$ 1.365 |
Using SASS when we create something like a variable, we can also be creating a list. Take the example below:
$roundness: 20px 0 20px 0;
The "roundness" variable have more than one value, and thus it is in essence a list.
This can be used in different ways. See the example below:
$roundness: 20px 0 20px 0;
border-radius: nth($roundness, 1);
The code above tells SASS: - For the border-radius, apply only the first value of the list available in the "roundness" variable, which is 20px.
Also, pay attention that we are using 1 instead of 0. This is because SASS is not zero-based index.
When we create media queries, sometimes it can be hard to find exactly what we are looking for if the project gets big. Using SASS we can make this process simple, since we can apply the media query directly on each item. While this can make us spend time with more code, by applying it to every element we want to modify, we also have much better control.
Example:
Create the mixing for the media query:
@mixin break ($lenght) {
@media only screen and (max-width: $size) {
@content;
}
}
Then we apply the media query to the code element we want:
li {
float: left;
flex: 1;
margin: 0.3rem;
@include break(600px) {
margin: 0.5rem;
}
@include break (1000px) {
margin: 0.8rem 1.2rem;
}
}
Like in many programming languages, SASS also let us use conditional statements for the compiler to interpret what you are looking for.
For example, we can use a mixin that takes any number of values. This is called and argument list. To use it we only need to add "..." to the end of a variable.
A good way to use it would be for media queries. Let's take that we need to use "min" and "max" width for our rules, then we could do like below:
@mixin break (&args...) {
@if length($args) == 1 {
@media (min-width: nth($args, 1)) {
@content;
}
}
@if length($args) == 2 {
@media (min-width: nth($args, 1)
and (max-width: nth($args, 2)) {
@content;
}
}
}
In the example below, "length" is a SASS property (Same as array.lenght), but our variable args tells SASS that we will have more than one argument, then we apply it using the if statement by telling SASS that, if we have more than one arg we will use the second arg also.
See how we could apply the example above to an element:
pre {
font-family: $font-code;
font-size: 1.5rem;
overflow: auto;
@include break (400px, 800px) {
color: pink;
}
}
Also, like in other programming languages, it's possible to use the @else statement to avoid more code if it's needed.
Example:
@mixin break (&args...) {
@if length($args) == 1 {
@media (min-width: nth($args, 1)) {
@content;
}
} @else {
@media (min-width: nth($args, 1)
and (max-width: nth($args, 2)) {
@content;
}
}
}
The list below will be colored using a SASS for loop
Very useful when you don't know how many items there are in the list
Button styles generated using the 'for each' loop in SASS.
Using the for each loop:
$color-btn-names: 'def', 'hot', 'cool'; // names based on the item class
$color-btn-values: $clr-btn-default, $clr-btn-danger, $clr-btn-info; // color variables
@each $name in $color-btn-names {
// We will need to create an Index to be used for the background-color
$ind: index($color-btn-names , $name); // $ind - our index. It's based on the names var.
.btn-#{$name} {
@extend %btn-small; // predefined style
background-color: nth($color-btn-values , $ind);
}
}
.btn-small {
@extend %btn-small;
background: $clr-btn-default;
}
The buttons below were done using the associative arrays in SASS.
Works like an associative array. SASS associative arrays work in a similar way as JavaScript objects using 'key, value' pairs. See the code below:
The associative array:
$color-button: (
colpink: $col-pink,
colpurple: $col-deep-purple,
colcyan: $col-cyan,
colteal: $col-teal
);
Now applying to items:
// $key will have the index - could be any name;
// $value will have the values - could be any name;
@each $key, $value in $color-button {
// We will NOT need to create an index, since we are using the array above.
.botones-#{$key} {
@extend %btn-small;
background-color: $value;
}
}


JS Math
This application teaches primary school students steps of multiplication and long division. It randomly generates numbers and walks the students through each step. In assessment mode, it can generate large number of random questions and find the number of correct answers.
This will be dividend or multiplicand
This will be divisor or multiplier


Drop BPMN diagram from your desktop or
create a new diagram
to get started.
Ooops, we could not display the BPMN 2.0 diagram.
cause of the problem
Download BPMN XML
Upload Image
Image Width:
Upload BPMN XML


GeodePrivAlloc(), GeodePrivFree(), GeodePrivWrite(), GeodePrivRead()
Every geode in the system has a "private data" area, a space set aside in its core block. This private data is used primarily by library geodes, when each of the library's clients uses its own copy of a particular data structure that gets manipulated by the library. The private data mechanism is used in the GEOS implementation of
malloc()
, for example (though you need not know this to use
malloc()
).
Private memory may be allocated, written to, read from, and freed by the library. The library does not have to allocate a block for each geode and maintain its own handle table; the use of the
GeodePriv...()
routines automatically manages this.
GeodePrivAlloc()
reserves a given number of contiguous words for the library within the private data of all geodes in the system. The memory space is reserved but is not actually allocated for a given geode until it is used (written to); this is done for optimization purposes. This routine will return a tag pointing to where the reserved words begin. This tag is used when reading, writing, or freeing the private data. If the memory could not be allocated, the routine will return zero.
GeodePrivWrite()
and
GeodePrivRead()
write to and read from the private data space. They take similar parameters: a geode handle, the tag as returned by
GeodePrivAlloc()
, the total number of words to be written or read, and a pointer to a locked or fixed buffer. In
GeodePrivWrite()
, the buffer will be passed containing the words to be written; in
GeodePrivRead()
, the buffer will be passed empty and returned containing the words read.
Typically, the geode handle passed will be zero; this indicates that the current process (which will be the library's current client) will be the owner of the private data affected. Because the library code will be executing in the thread of a given application, the application geode will be the only one having its private data affected. Thus, a library can use the same code to store different data for each geode that uses it; neither the library nor the geode needs to know that other geodes are also using the same routines.
GeodePrivFree()
frees a given number of words from all geodes' private data. It needs to be passed only the number of words to be freed and the tag as returned by
GeodePrivAlloc()
.


Hi,
I wrote a new low-power sketch for EmonTH V1.4 that counts pulses from a reed switch. This is adapted from code written by Robert Wall here.
I like it because it allows me to debounce the circuit, send the pulse count periodically, and extend battery life. After a month of operation on my gas meter, no pulse lost and the battery voltage didn't change at all.
It requires that your meter is equipped with a reed switch that does not switch too fast. How does it work? The EmonTH sleeps all the time and wakes up every 0.5s in order to poll the state of the input. When catching the sequence 00001111, it detects a rising edge. The total number of pulses is sent every minute.
It means that either the 'on' time or the 'off' time of the pulse exceeds 4*0.5=2s. This is the case with my gas counter. You can easily change the polling period (500ms) to manage different pulse rates for other water meters, gas meters, etc.
This sketch may be easily modified to work on EmonTH V1.5 and also send the temperature/humidity every minute.
Eric
Re: Low-power sketch for reed switch pulse counting on EmonTH
Thank you !
I'll test it soon ;)
Re: Low-power sketch for reed switch pulse counting on EmonTH
Hello,
No result.
It transmit at start the battery power and nothing after. The total blackout...
I puted a pulldown between 3 and 4, tried the other wire to 2, 5 or 6 : no response.
I am beginning to think that my emonth is broken...
Re: Low-power sketch for reed switch pulse counting on EmonTH
What is your emonTH, V1.4 or V1.5?
The pulse input is D2 on the V1.4, D3 on the V1.5 - so you might need to change "const int PULSEPIN=2;"
[ERIC: You need to add that in a comment.]
Re: Low-power sketch for reed switch pulse counting on EmonTH
Hello,
Sorry, i precised it on another thread. It is V1.4.
Connecting my reed is not clear. Where connect it ?
I use a pull-down resistor between pin 4 and ground to fix 0v when no working on reed.
I tried to connect other wire to 3v to send 3v to pin 4 when sollicited.(pin 1).
Re: Low-power sketch for reed switch pulse counting on EmonTH
"Sorry, i precised it on another thread. It is V1.4."
That is what happens when you cross-post. Please do not do that, it wastes everyone's time. You cannot expect anyone to remember a post from 2+ weeks ago on another thread.
"Connecting my reed is not clear. Where connect it ?"
Look at the circuit diagram - you will find it in the Wiki. You will see Pin 4, the pulse input, has provision for a pull-down resistor to GND. Therefore you connect your reed switch between Pin 4 and 3.3 V, which is Pin 2. If no resistor (R2) is fitted on yours (it is underneath the battery holder), use an external 10 kΩ resistor between Pin 4 and Pin 3.
Re: Low-power sketch for reed switch pulse counting on EmonTH
It wasn't a cross-post but an other sketch from Eric :) So i missed to precise it on this one.
Otherwise, thank you for your answer. It confirm my situation : My Emonth doesn't work. For the pull down i didn't put it behind battery pack yet because i wanted to test it before.
You confirm my 3.3V use for it. So, Dig2 is protected and can accept 3v load. I wasn't sure and i supposed that i fused it.
I will make other tests, before to decide to trash it... and buy an other one. I think this one is broken. No transmission after first start and first battery value sent.
Thank you.
Changed JeeLib libraries because i had old one (2014) No way.
Tried to resold weldings : no way. (electronic lab fully equiped)
Re: Low-power sketch for reed switch pulse counting on EmonTH
If you have a programmer, you can try a simple sketch:
With your reed switch and pull-down resistor connected, the LED should come ON for 10 s, after that it should come on when the magnet is near the reed switch, and it should go off when the magnet is away from the reed switch.
Re: Low-power sketch for reed switch pulse counting on EmonTH
Thank you, i test it now.
EDIT :
Working well !
So my connection is good.
Will try to understand sketch programmation... :)
EDIT2 :
Well...
Nothing. No reaction. No back to console too.
Re: Low-power sketch for reed switch pulse counting on EmonTH
So, the problem is either the sketch is not working as it should, or your reed switch is "bouncing" so much that the sketch cannot recognise the transition from 0 to 1.
The main loop runs and then sleeps for 500 ms. Every time, that is every 500 ms, it reads the switch. The last 8 switch states are recorded in the bits in a byte, and when you have 00001111 (0x0F), you have detected the switch closing. If you have a really bad switch, it might be bouncing for a long time. But it should not bounce for more than 500 ms, and the switch must remain in each state long enough to give that bit pattern. i.e. it must be in each state for at least 2 s.
Re: Low-power sketch for reed switch pulse counting on EmonTH
Thank you for your precisions.
Are my fingers and a peace of wire can generate boucing phenomen ?
Ill will try to modify some parameters to taste more things?
Re: Low-power sketch for reed switch pulse counting on EmonTH
Yes, a piece of wire or a very cheap switch are both very good ways to get contact bounce. Using the 'interrupt-driven' pulse sketch, I could see anything up to about 40 pulses with pressing the button once only.
Re: Low-power sketch for reed switch pulse counting on EmonTH
Thank you for the precisions.
Re: Low-power sketch for reed switch pulse counting on EmonTH
Hi,
Attached is a new version of the sketch described above but for EmonTH V1.5.
It also sends the temperature/humidity every minute. It's derived from the emonTH_DHT22_DS18B20_RFM69CW sketch (V1.6.1).
NB : When reading temperature and humidity with the DHT22, one pulse may be ignored because this sensor is very slow (2s).The DS18B20 sensor which is faster (375ms) is less problematic
Eric
Re: Low-power sketch for reed switch pulse counting on EmonTH
Thanks, example has been pushed to github
https://github.com/openenergymonitor/emonTH/commit/4ae519baecd59627ffdbc...


@(clusterDeletionForm: Form[views.data.ClusterDeletionForm], delete:String) @import form._ @main(title = "MongoDB") {
All the instances in the cluster will be completely removed. Do you want to proceed?
@helper.form(routes.GoogleComputeEngineApplication.deleteClusterWizardPost(), 'class -> "form-horizontal") { } @if(flash.containsKey("error")) {


The first textbox will always be a number and lower than the second textbox.
0
1
2
3
4
5
0
1
2
3
4
5


Plugin Information |
|---|
View Release Helper on the plugin site for more information. |
This plugin allows the automation of several release tasks regarding Atlassian JIRA, Confluence, InfluxDB and Twitter.
It offers the following features:
- update / create JIRA Tickets
- update / create JIRA Releases
- publish release notes and artifacts on GitHub
- publish release notes on Confluence
- publish status updates on Twitter
- publish measurement points in an InfluxDB
Configuration
Variables
Build Parameters as well as Environment Variables can be accessed from every field using the ${variablename} syntax.
The plugin will then replace this placeholder with the actual contents of the parameter or variable named variablename.
Credentials
The plugin adds two new credential types to your Jenkins: one for access a certain JIRA Project, and another one for accessing Confluence.
These credentials can be entered using the Jenkins credentials settings, a screenshot of the JIRA credentials dialog is given below.
Note that these dialogs do automatically check whether JIRA / Confluence is accessible using the data you entered.
Adding and Modifying JIRA Tickets
To add or Modify Tickets, add the JIRA Ticket Editor Build-Step to your project.

Afterwards, you can select the modifications to apply to the tickets matching these criteria.
In a similar way, new JIRA Tickets can be published:
Adding and Modifying JIRA Releases
Select the Add / Modify JIRA Project Versions build-step. Using this buildstep, you can modify or add multiple project versions.
If the given version name already exists, it is updated, otherwise a new version for the project is created.
Publishing Release Notes on Confluence
The bundle also offers a build step called Publish Release Notes on Confluence which creates a confluence page.
This confluence page contains a list of tickets, selected using a JQL Query provided by the user.
Below you can see an example configuration, including the page which it creates.
Publishing Releases on GitHub
This feature is available as the Publish A Release on GitHub post-build action.
Using this action, you can create a release on GitHub and upload build artifacts to it.
The release description works in the same manner as for the confluence release notes page.
Twitter Publisher
This build step offers you the possibility to publish a Twitter status update.
The build step checks whether a recent tweet with the same text already exists in order to prevent duplicate tweets.
InfluxDB Publisher
The InfluxDB Publisher build step allows you to add measurement points to an InfluxDB instance.
The measurement points are given to the plugin in the format specified here.
Attachments:
confluenceRelNotes.PNG (image/png)
confPage.PNG (image/png)
jiraVersioning.PNG (image/png)
ticketAdd.PNG (image/png)
ticketModification.PNG (image/png)


public class PenalizedCurvatureLengthFit
extends java.lang.Object
PenalizedCurvatureLengthFit demonstrates the setting up and the usage of the curvature, the length, and
the closeness of fit penalizing spline. This sample shows the following:
- Set up the X Predictor Ordinate and the Y Response Value Set.
- Construct a set of Predictor Ordinates, their Responses, and corresponding Weights to serve as
weighted closeness of fit.
- Construct a rational shape controller with the desired shape controller tension parameters and Global
Scaling.
- Construct the Segment Inelastic Parameter that is C2 (iK = 2 sets it to C2), with First Order Segment
Length Penalty Derivative, Second Order Segment Curvature Penalty Derivative, their Amplitudes, and
without Constraint.
- Construct the base, the base + 1 degree segment builder control.
- Construct the base, the elevated, and the best fit basis spline stretches.
- Compute the segment-by-segment monotonicity for all the three stretches.
- Compute the Stretch Jacobian for all the three stretches.
- Compute the Base Stretch Curvature, Length, and the Best Fit DPE.
- Compute the Elevated Stretch Curvature, Length, and the Best Fit DPE.
- Compute the Best Fit Stretch Curvature, Length, and the Best Fit DPE.


Thank you for registering, now you can login into Virtual Healthcare
Doctor Registration Request Received
Welcome {{ user.name }}!
Thank you for registering as doctor, now you can login into Virtual Healthcare
but you can not access any doctor functions yet until your request is approved by our staff.


Goal
The goal is to push all balls in the goal before timeout.
The timer starts at 10 seconds and every ball destroyed
reset it to 10 second.  Simple enougth.
How to play
Use Arrows to move the ball.
Use 1 to 4 to move the camera position.


CRIMSON TIDE (1995) A Film Review Copyright Dragan Antulov 2001
In the week following WTC bombing, many commentators couldn't fail to notice that America, same as many other countries in history, had its military prepared to fight the past rather than the future war. Same thing can be said for Hollywood, since in many 1990s films Russians continued to be convenient villains and the source of greatest danger for Western world, all that despite the collapse of Soviet Empire and its would-be successors being pathethic losers unable to restore the Evil Empire even in their back yard. One of such examples can be found in the plot of CRIMSON TIDE, 1995 submarine thriller directed by Tony Scott. The story begins with civil war erupting in Russia and anti-Western rebels seizing nuclear base in Vladivostok. American nuclear submarine "USS Alabama", commanded by old and experienced Captain Frank Ramsey (played by Gene Hackman), is sent to Pacific in order to watch over the base and retaliate in case of rebels launching nuclear strike on America. In the last minute his XO is replaced by Lieutenant Ron Hunter (played by Denzel Washington), intellectual whose humanist ideas of waging war create discomfort in no-nonsense Captain. Two of them are going to settle their differences, at least temporarily, as their vessel approcahes hostile waters and gets engaged in conflict with Russian renegade submarine. As a result, the communication equipment is damaged, but not after receiving the order to launch nuclear strike. This order was, however, followed with another one, which is interrupted and can't be deciphred. While Captain Ramsey wants to follow the order and launch the strike, his XO is convinced that the next message represents the cancellation of the original order. Not wanting to risk start of nuclear exchange over communication failure, Hunter starts a mutiny aboard the submarine.
CRIMSON TIDE is not the film that should enter Top 100 lists, but it nevertheless represents one of the brighter spots in the career of Jerry Bruckheimer and Don Simpson. The reason for that can be found in the script by Michael Schiffer that manages to rise above the cliches and predictability of action film formula, and this accomplishment is even more impressive when we consider that CRIMSON TIDE in its original form became the object of script-doctoring by numerous writers like Robert Towne, Steven Zaillian and Quentin Tarantino. Usually the screenwriting by committee produces disastrous results, but not this time. The suspense and the action in this film is clearly constrained within the framework of the plot and terrible dilemma facing the main characters - whether to act and risk starting nuclear holocaust or show restraint and allow mother country to be anihillated. Even more interesting thing about CRIMSON TIDE is that this film doesn't take sides in this debate - both viewpoints are shown to be valid and justifiable under the circumstances. Good direction by Tony Scott and strong acting performances by Hackman, Washington and numerous character actors (among which Viggo Mortensen and George Dzundza are the most impressive) guarantee that this film is going to be as entertaining as it was thought-provoking. Even the usual Hollywood cop out ending and sometimes too boring musical score by Hans Zimmer aren't enough to diminish generally positive impression given by this film, one of the rare 1990s action films that is going to be as engaging now as it was half a decade ago.
RATING: 6/10 (++)
Review written on September 19th 2001
Dragan Antulov a.k.a. Drax E-mail<EMAIL_ADDRESS>http://www.film.purger.com - Filmske recenzije na hrvatskom/Movie Reviews in Croatian
========== X-RAMR-ID: 29555 X-Language: en X-RT-ReviewID: 251135 X-RT-TitleID: 1062363 X-RT-AuthorID: 1307 X-RT-RatingText: 6/10
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


KEDU
!
Home
Register
Pricing
KeduBot
Testimonials
CUSTOMER SERVICE 4.0
Register Today and Explore How Kedu Works!
First Name:
Last Name:
Email:
Phone:
Company:
Position:
Company Location:
Sumbit


Demo of On-Off-Switch
With text
Without text and by using <input type="hidden"> instead of <input type="checkbox">
With custom color and size
These switches have been created automatically by class names
Option One
Option Two
Option Three
Option Four with custom html attributes
Example of native checkbox listeners
Execute $('#on-off-switchdemo6').click()


%inherit file="base.htm" /> <%block name="content">
Your Ordered Items
| Product | Cost | Quantity | Total |
|---|---|---|---|
| Batteries | $1.95 | 5 | $9.75 |
| Lens Cleaner | $4.99 | 2 | $9.98 |
| Video Camera | $299.95 | 1 | $299.95 |
Your Payment Information
| Payment Option |
|---|
Your Shipping Address
| Shipping Address |
|---|
Shipping Option
| Shipping Option |
|---|
| Estimated Arrival | Order Total |
|---|


Volunteer with the Vermont Symphony Orchestra to maintain and develop new features for thier housing management web application
Contributed to the Code for BTV civic hacker community


choose category
Available
Selected
3D - Action
Action
Arcade
Casino & Bar
Classics
Logic
Multiplayer
Top downloads
News
Other
Lord Of The Rings
Sports
Strategy
Superstar
Utilities
Christmas
Racing


DSC Unilag Certificate Generator
Helps generate certificates from a given image template.
Event Name
Image Template
Select Template
None Selected
SpreadSheet File
Select SpreadSheet
None Selected
START
online site builder
© Copyright 2019 LordGhostX - All Rights Reserved


The Nokia 9000i contains has a very specific look and feel which is created through the use of a specific user interface developed for the device. The specific UI contains not only visual representations for GEOS objects, but also additional objects that are particularly tailored for the Nokia 9000i device.
Most of these objects have been grouped into the "Foam" library. This library is a special collection of classes, objects and routines specifically applicable to the Nokia 9000i device. Because of its multi-faceted nature, the Foam library is not a coherent library so much as a "toolbox" of useful widgets.
We will not attempt to cover every piece of the Foam library within this chapter. Instead, we provide a brief overview of the foam UI classes, then delve into the objects which are particularly useful for creating your application.
These objects are:
0 Foam UI Classes Overview
1 FoamSubApplicationClass
1.1 FoamSubApplicationClass Instance Data
1.2 Using a FoamSubApplication Object
2 ComplexMonikerClass
2.1 ComplexMoniker Instance Data
2.2 ComplexMoniker Usage
2.3 ComplexMoniker Messages
3 Convenient Dialog Routines
4 FlashingNoteClass
4.1 FlashingNote Instance Data
4.2 Setting Up the Template
4.3 Initiating and Destroying the Flashing Note
5 FoamProgressDialog
5.1 FoamProgressDialog Instance Data
5.2 Setting Up the Template
5.3 Using a FoamProgressDialog
6 Routines for Lists
The foam library includes many new UI classes. This page lists these classes, briefly describes each class' utility, and displays an annotated snapshot of each UI class.
Inherits:
GenFileSelectorClass
Use a FFileSelectorClass
when you do not need a controller and the associated ComplexMoniker
UI to select a file but only want to display a list of files (if you do want a full controller with complete UI, use FileOpenControlClass
). FFileSelectorClass
objects allow you to get and set the directory path using the FDocumentDir
enum values for the directories which are specific to the Nokia 9000i Communicator.
FFileSelectorClass
file selector.
Include: foam.goh
Reference: FileOpenControlClass
, FFileSelectorClass
.
Inherits:
GenFileSelectorClass
, but is a variant class.
This class is not available on build 4.8.8 or earlier versions of the Communicator.
The ExtendedFileSelectorClass
expands the functionality of any subclass of GenFileSelectorClass
, usually FFileSelectorClass
. It allows multiple files to be selected, optionally provides the user with a search box that narrows the list of files to match the text typed in the search box, and can find files in any directory or subdirectory, not just the directories represented by the enumerated type FDocumentDir
.
Include: foam.goh
Reference: ExtendedFileSelectorClass, FFileSelectorClass.
Inherits:
GenClass
, but is a variant class.
The ComplexMonikerClass
allows developers to create a moniker that contains both text and a bitmap icon. Since the text and icon are referred to generically, it is easy to localize the moniker. A complex moniker is a variant class - its parent class is dynamically created at runtime - so it can assume a variety of forms. The superclass of a ComplexMonikerClass
object may be any child of GenClass
. This allows complex monikers to be:
ComplexMonikerClass
behavior of displaying a text and icon moniker.
Include: foam.goh
Reference: ComplexMonikerClass,
GenTriggerClass,
GenInteractionClass,
GenItemGroupClass,
GenItemClass,
GenBooleanGroupClass,
GenDynamicListClass,
or
ContactListClass
.
Inherits:
ComplexMonikerClass
Applications that require more than four triggers may establish two panes of triggers. The user can toggle between these two panes using two TwoLevelTriggerClass
trigger objects which usually have the monikers "More" or "Back". They are typically put in the fouth slot (slot 3). Since the "More" and "Back" triggers take up two slots, an application which uses two panes of triggers may define up to six of its own triggers.
Include: foam.goh
Reference: TwoLevelTriggerClass
, ComplexMonikerClass
, Nokia 9000i Communicator Topics: UI Conventions
Inherits:
GenApplicationClass
Since the Nokia 9000i Communicator does not have a file manager per se, applications added to the device must be launched through a currently existing application. The FoamSubApplicationClass
specifies in which pre-existing application an add-on application should reside.
Include: foam.goh
Reference: FoamSubApplicationClass
, GenApplicationClass
.
Inherits:
GenInteractionClass
Draws a gray beveled box around its children. It can be used with the
ComplexMoniker variant class to add a moniker label (see FilterListClass
example).
Include: foam.goh
Reference: GreyFrameClass
, GenInteractionClass
.
Inherits:
GenItemGroupClass
GenItemClass
and GenItemGroupClass
work together to display a list of static monikers that the user may choose from. ListWithUserDefinedClass
expands this to allow the user to navigate to an object and input information.
The additional item may be a UnderlinedTextWithListClass
,
TextWithListClass
, or GenValueWithListClass
.
Include: foam.goh
Reference: ListWithUserDefinedClass
, GenItemGroupClass
.
Inherits:
GenGlyphClass
RepeatingGenGlyphClass
is used to create animations. It works be replacing the visMoniker of GenGlyphClass
with the application-defined sequence of bitmapped icons, which it then cycles through. One common use of RepeatingGenGlyphClass
is in dialog boxes which are opened with PutUpDialogViaUIThread()
. This is done so that the animation is processed by another thread and thus doesn't burden the application.
Include: foam.goh
Reference: RepeatingGenGlyphClass
, FoamProgressDialogClass
.
Inherits:
GenInteractionClass
The FlashingNoteClass
is used to flash a note on the screen for a set length of time. The application specifies the minimum and maximum time the note will remain on the screen. If the user presses a key after the note has been on screen for the minimum duration, the note dialog box is dismissed. This dialog runs on its own thread and takes the responsibility for dismissing and destroying itself.
Include: foam.goh
Reference: FlashingNoteClass
, GenInteractionClass
.
Inherits:
GenInteractionClass
The SelfDestroyingDialogClass
is used to put up a dialog box that self-destructs upon dismissal.
Include: foam.goh
Reference: SelfDestroyingDialogClass
, GenInteractionClass
.
Inherits:
GenControlClass
When an application starts a process that may take a while, it is good practice to put up a FoamProgressDialogClass
dialog which notifies the user that the application is working and which indicates the status of the process. This dialog is put up on its own thread. The process is indicated by an animation of gears grinding away and by the status text which the application may append. If the user chooses the provided "Cancel" trigger a message is sent which indicates that the process should be terminated.
Include: foam.goh
Reference: FoamProgressDialogClass
, GenControlClass
.
Inherits:
GenPrimaryClass
This class creates a primary window with a gray background. It is an inappropriate base for most applications because it only draws properly when placed against the left edge of the screen and it puts a gray background behind the trigger menu, thus making them look different from all other Communicator applications.
Include: foam.goh
Reference: GreyGenInteractionClass
, GenPrimaryClass
.
Inherits:
GenGlyphClass
An IndicatorClass
object is a GenGlyph that draws an etched border around itself.
Include: foam.goh
Reference: IndicatorClass
, GenGlyphClass
.
Inherits:
IndicatorClass
This class is a GenGlyph that can draw one or two icons within etched borders from a list of bitmaps. The displayed icons can be changed dynamically.
Include: foam.goh
Reference: IconIndicatorClass
, IndicatorClass
.
Inherits:
IndicatorClass
The LevelIndicatorClass
draws a bitmap followed by a sequence of bitmaps. This is used for displaying a level indicator such as the battery charge. The number of levels or the bitmap label can be changed dynamically.
Include: foam.goh
Reference: LevelIndicatorClass
, IndicatorClass
.
Inherits:
IndicatorClass
This makes a GenInteraction with an etched border.
Include: foam.goh
Reference: IndicatorInteractionClass
, GenInteractionClass
.
Inherits:
TextWithListClass
, which in turn inherits GenTextClass
.
FilterListClass
and FilterTextClass
objects work together to provide the appropriate UI for interactive searches.
Include: foam.goh
Reference: FilterListClass
, FilterTextClass
, TextWithListClass
, GenTextClass
.
Inherits:
VisTextClass
UnderlinedGenTextClass
and UnderlinedVisTextClass
objects behave like the associated TextClass objects except that the text area has a dotted underline. These classes are used extensively for text-entry fields on the Nokia 9000i Communicator.
Include: foam.goh
Reference: UnderlinedGenTextClass
, UnderlinedVisTextClass
, GenTextClass
, VisTextClass
.
Inherits:
GenControlClass
The controllers FoamTextStyleControlClass
, FoamFontControlClass
, FoamPointSizeControlClass
, and/or
FoamJustificationControlClass
attach to a text object and allow the user to change the displayed text styles. These controllers are functionally equivalent to the standard
text object controllers (TextStyleControl
, FontControl
, etc.), but they have UI and features customized for the Nokia 9000i Communicator.
Include: foam.goh
Reference: FoamTextStyleControlClass
, FoamFontControlClass
, FoamPointSizeControlClass
, FoamJustificationControlClass
, GenControlClass
.
Applications may be written to be incorporated into the
Nokia 9000i Communicator as part of a special release.
The Nokia 9000i Communicator does not have a file manager,
per se, to enable launching these applications. The applications
must be launched through a currently existing application.
FoamSubApplicationClass
allows you to indicate under which pre-existing application the new application should reside.
"Add-on" applications for the Nokia 9000i Communicator device, whether included on the device as part of a value-added release, or developed as an aftermarket product, will fall into one of three categories:
For each of these cases, there is an application already on the device that launches the sub-application. Service applications are launched using the SVCAPPS launcher; system applications use the SYSAPPS launcher; extra applications use the EXTRAPPS launcher.
Add-on applications are declared using the FoamSubApplication object, and an instance data field is set within the object indicating the "main" application it should be tied with.
Because a sub-application is not a separate application, special care needs to be taken when the sub-application is closed. This is discussed in Using a FoamSubApplication Object .
FoamSubApplicationClass Instance Data
Using a FoamSubApplication Object
There is only one instance data field in a
FoamSubApplicationClass
object. This field is noted below.
Code Display 2-1 FoamSubApplicationClass Instance Data
@instance FApplication FSAI_launcherApp;
FSAI
_launcherApp
stores an
FApplication
type referring to the application it should reside under.
For FoamSubApplication objects, the following
FApplication
values are the only values that are relevant:
MSG_FSA_RETURN_TO_LAUNCHER
FoamSubApplication objects do not close like other applications. Because of this, they need to provide their own special "Close" trigger. However, FoamSubApplication objects should not simply "close" when the user presses this trigger. Instead, they should send MSG_FSA_RETURN_TO_LAUNCHER to this FoamSubApplication object.
This message changes the
[hardIconBar]
entry of the .INI file for the sub-application to be the launcher application (stored in FSAI_
launcherApp
). This allows the sub-application to seemingly close without closing the parent application. It is the responsibility of the application to provide a "Close" trigger that sends this message to the
FoamSubApplicationClass
object.
The "Close" trigger is declared as a
ComplexMonikerClass
object of type CMT_CLOSE. The ComplexMoniker is discussed more fully in ComplexMonikerClass
.
Code Display 2-2 Using the FoamSubApplicationClass Object
/* * Declare the FoamSubApplication object as you would a normal GenApplication * object. This sub-app will be launched from the Extras application. */
@start AppResource
@object FoamSubApplicationClass MyApp = { GI_comp = @MyPrimary; FSAI_launcherApp = FA_EXTRAS_APP; gcnList(MANUFACTURER_ID_GEOWORKS, GAGCNLT_WINDOWS) = @MyPrimary; GI_visMoniker = list { @MyTextMoniker }; }
@visMoniker MyTextMoniker = "Nokia UI\rSample App";
@end AppResource;
/* * Somewhere in your sub-app, create a CMT_CLOSE trigger. */
@object ComplexMonikerClass CloseTrigger = { ComplexMoniker = GenTriggerClass; CMI_topText = CMT_CLOSE;
GTI_actionMsg = MSG_FSA_RETURN_TO_LAUNCHER; GTI_destination = @TemplateApp;
HINT_SEEK_MENU_BAR; HINT_SEEK_REPLY_BAR;
/* * Close Command triggers should always be in the fourth position (3 because * HINT_SEEK_SLOT refers to zero-based slot positions). */ HINT_SEEK_SLOT = 3;
}
ComplexMonikerClass
is a versatile class that provides powerful behavior with little overhead. A complex moniker serves two purposes. First, it allows a developer to easily create a moniker containing both graphics and text. Second, it allows both text and graphics to be easily localized by referring to both items "generically."
A complex moniker may take a variety of forms.
ComplexMonikerClass
is what's known in GEOS as a "variant" class, which means that the object's parent class is dynamically assigned when the object is visually built.
A complex moniker may contain both a text string and a bitmap. The text string may be either a single line or two lines (separated by a `\r' character in the text buffer). If the text is two lines, it will be right-justified; this allows text strings in the command bar to align properly.
ComplexMonikerClass
contains the following instance data:
Code Display 2-3 ComplexMonikerClass Instance Data
ComplexMoniker ClassName
@instance TextStyle CMI_textStyle = (TS_BOLD);
@instance word CMI_topText;
@instance word CMI_iconBitmap;
@instance byte CMI_fontSize;
Because
ComplexMonikerClass
is a variant class, it needs to have its superclass assigned when it is built. The
ComplexMoniker
keyword represents the parent class of the complex moniker. By setting this keyword to a class name the parent class is changed from the default superclass GenClass
to the specified class. Any child of GenClass
may be a complex moniker superclass. The following are commonly used superclasses:
GenTriggerClass
GenInteractionClass
GenItemGroupClass
GenItemClass
GenBooleanGroupClass
GenDynamicListClass
ContactListClass
Each of these classes will behave quite differently, but all will exhibit the same characteristics in displaying their text and icon monikers that are gained through using
ComplexMonikerClass.
Note that using a ComplexMoniker object will cause the specific UI to ignore any moniker stored in the GI_
visMoniker
instance data field in the above classes.
CMI
_topText
stores the "text" to display. This may be either a Chunkhandle to a text string, or a
ComplexMonikerText
identifier. If the value is a
ComplexMonikerText
identifier, the specific UI will determine what exact text is displayed.
As noted, the text may contain two lines. The top text is limited to COMPLEX_MONIKER_MAX_TOP_TEXT_LENGTH while the bottom is limited to COMPLEX_MONIKER_MAX_BOTTOM_TEXT_LENGTH.
Below is a complete list of types; in most cases the (English) text on the Nokia 9000i device is similar, if not identical, to the text alluded to by the identifier's name. Those cases where the actual text is noticeably different are noted. Using such an identifier is beneficial for localization purposes.
Code Display 2-4 Setting a Complex Moniker's Text
/* * The text in a complex moniker is stored within the CMI_topText instance field. * This text may either be referenced by a ChunkHandle ... */
@object ComplexMonikerClass MyMoniker = { ComplexMoniker = GenTriggerClass; CMI_topText = @MyText; }
/* Use the TCHAR type to ensure the text is DBCS-compliant. */
@chunk TCHAR MyText[] = "Sample Text";
/* * ... or CMI_topText can store a ComplexMonikerText type which indicates the text * generically. */
@object ComplexMonikerClass MyClearTrigger = { ComplexMoniker = GenTriggerClass; CMI_topText = CMT_CLEAR; }
CMI_
iconBitmap
stores the bitmap to display within this moniker. This may either be a ChunkHandle to a Bitmap structure or a member of the
ComplexMonikerBitmap
types. These types are enumerated below:
Again, using a generic identifier eases localization.
You can create your own bitmaps by using the GEOS Icon Editor. To do so, perform the following steps:
BMFormat
of BMF_4BIT). You may also create simple monochrome bitmaps (
BMFormat
of BMF_MONO).|
Icon Editor Color |
Nokia 9000i |
|---|---|
|
WHITE |
WHITE |
|
BLACK |
BLACK |
|
LIGHT_VIOLET |
LIGHT GRAY |
|
DARK_GREEN |
DARK GRAY |
filename
.goh using the following options:@visMoniker Moniker ={
@chunk byte YourIconName
[] = {
size = <...>; style = <...>; color = <...>; aspectRatio = <...>; cachedSize = <...,...>; gstring { GSFillBitmapAtCP(<...>),
GSEndString() }
Your resulting bitmap, ready for inclusion in your app, should look like this:
@chunk byte MyIconName[] = { Bitmap (32,20,BMC_PACKBITS, (BMT_MASK|BMF_4BIT)), 0xfd, 0xff, 0x03, 0xbf, ... };
CMI_
textStyle
stores a GEOS
TextStyle
, defined in
graphics.h
. By default, text is shown as TS_BOLD. The full list of styles appears below:
CMI
_fontSize
stores a font size (in points). There are four pre-established font sizes that you should choose from:
#define FOAM_LARGE_FONT_SIZE 20 #define FOAM_NORMAL_FONT_SIZE 18 #define FOAM_LIGHT_FONT_SIZE 17 #define FOAM_SMALL_FONT_SIZE 16
The large font size is best reserved for commands and title bar monikers. In most other cases, use the normal font size.
The default font can be obtained by those routines or objects that demand a font name by using the
VisTextDefaultFont
value VTDF_RESPONDER.
There are several vardata attributes that you may attach to the Complex Moniker. These are noted below:
Code Display 2-5 ComplexMoniker Vardata
@vardata void ATTR_COMPLEX_MONIKER_PLACE_BITMAP_AT_LEFT;
@vardata void HINT_COMPLEX_MONIKER_DRAW_SEPARATOR; @vardata void HINT_COMPELX_MONIKER_DONT_DRAW_SEPARATOR;
ATTR_COMPLEX_MONIKER_PLACE_BITMAP_AT_LEFT will position the icon bitmap (if any) to the left of the text.
HINT_COMPLEX_MONIKER_DRAW_SEPARATOR
draws a single-line separator below the complex moniker.
HINT_COMPLEX_MONIKER_DONT_DRAW_SEPARATOR
prevents the drawing of a single-line separator below the complex moniker.
MSG_COMPLEX_MONIKER_GET_MONIKER, MSG_COMPLEX_MONIKER_REPLACE_MONIKER
In most cases, you will want to use a ComplexMoniker when you create Command triggers. Command triggers on the Nokia 9000i appear along the right edge of the screen, and correspond to the four off-screen buttons that they abut.
To create a ComplexMoniker command trigger, follow these steps:
ComplexMoniker
keyword to
GenTriggerClass
.
_fontSize
to something other than FOAM_LARGE_FONT_SIZE.)
Code Display 2-6 Complex Moniker Example (GenInteraction)
@object ComplexMonikerClass AboutBox = {
/* This object will behave as a GenInteration (grouping) object */ ComplexMoniker = GenInteractionClass; CMI_topText = @AboutBoxTitle; CMI_iconBitmap = @AboutIcon; GI_comp = @AboutText;
/* Geometry Hints */
HINT_DRAW_IN_BOX; HINT_DRAW_SHADOW; HINT_PLACE_MONIKER_TO_LEFT; HINT_EXPAND_WIDTH_TO_FIT_PARENT; HINT_EXPAND_HEIGHT_TO_FIT_PARENT;
/* ComplexMoniker Hints */
HINT_COMPLEX_MONIKER_DRAW_SEPARATOR; ATTR_COMPLEX_MONIKER_PLACE_BITMAP_AT_LEFT;
}
@chunk TCHAR AboutBoxTitle[] = "CmplxMon Sample Application";
Code Display 2-7 ComplexMoniker Example (GenDynamicList)
@object ComplexMonikerClass CMTextsList = { ComplexMoniker = GenDynamicListClass; CMI_topText = @CMTextsListTitle; CMI_fontSize = FOAM_NORMAL_FONT_SIZE; CMI_iconBitmap = CMB_OPEN_FOLDER; GIGI_destination = process; GIGI_applyMsg = MSG_CMPLXMON_PROCESS_SHOW_CURRENT_CMTEXT; GDLI_queryMsg = MSG_CMPLXMON_PROCESS_GET_CMTEXT;
/* GDLI_numItems will be set at app-launch time. */
HINT_DRAW_IN_BOX; HINT_DRAW_SHADOW; HINT_PLACE_MONIKER_ABOVE; HINT_PLACE_MONIKER_TO_LEFT; HINT_COMPLEX_MONIKER_DRAW_SEPARATOR; HINT_MINIMIZE_CHILD_SPACING; HINT_EXPAND_WIDTH_TO_FIT_PARENT; HINT_EXPAND_HEIGHT_TO_FIT_PARENT; HINT_ITEM_GROUP_SCROLLABLE; ATTR_COMPLEX_MONIKER_PLACE_BITMAP_AT_LEFT; ATTR_GEN_SEND_APPLY_MSG_ON_APPLY_EVEN_IF_NOT_MODIFIED; ATTR_GEN_ITEM_GROUP_STATUS_MSG = MSG_CMPLXMON_PROCESS_SHOW_CURRENT_CMTEXT; } }
Code Display 2-8 ComplexMoniker Example (Command Trigger)
@object ComplexMonikerClass MyCommandTrigger = { ComplexMoniker = GenTriggerClass; CMI_topText = @CommandTextTitle; GTI_actionMsg = MSG_GEN_INTERACTION_INITIATE; GTI_destination = @DialogThatThisTriggerBringsUp; HINT_SEEK_MENU_BAR; HINT_SEEK_REPLY_BAR; HINT_SEEK_SLOT = 0; }
@chunk byte CommandTextTitle[] = "I Commeand Thee!";
MSG_COMPLEX_MONIKER_GET_MONIKER, MSG_COMPLEX_MONIKER_REPLACE_MONIKER
To retrieve a complex moniker, send the ComplexMoniker
MSG_COMPLEX_MONIKER_GET_MONIKER
. This message takes a single argument, a pointer to a structure of type
GetComplexMoniker
. The structure will be filled in with the relevant information by the message.
typedef struct { TextStyle GCM_textStyle; byte GCM_fontSize; ComplexMonikerText GCM_topText; ComplexMonikerBitmap GCM_iconBitmap; } GetComplexMoniker;
Send
MSG_COMPLEX_MONIKER_REPLACE_MONIKER
to replace a complex moniker with a new moniker.
This message takes two arguments: a
ReplaceComplexMoniker
structure and a
ReplaceComplexMonikerChunkHandles
structure.
The
ReplaceComplexMoniker
structure should hold the parameters for the new moniker.
typedef struct { TextStyle RCM_textStyleSet; TextStyle RCM_textStyleClear; word RCM_fontSize; dword RCM_topTextSource; dword RCM_iconBitmapSource; ComplexMonikerSourceType RCM_topTextSourceType; ComplexMonikerSourceType RCM_iconBitmapSourceType; word RCM_iconBitmapSize; RCMOverwrite RCM_overwrite; } ReplaceComplexMoniker;
RCM_
textStyleSet
stores a
TextStyle
record of styles that should be set (masked) on top of any currently existing styles.
RCM
_textStyleClear
stores a
TextStyle
record of styles that should be cleared if they are set among the currently existing styles.
RCM
_fontSize
stores the new font size. Pass 0 to indicate no change.
RCM
_topTextSource
stores a dword value containing, or pointing to, the source for the new text. The type of value stored here is indicated in RCM
_topTextSourceType
.
RCM
_iconBitmapSource
stores a dword value containing, or pointing to, the source for the new bitmap. The type of value stored here is indicated in RCM
_iconBitmapSourceType.
RCM_
topTextSourceType
stores the type of text reference contained in RCM_
topTextSource
.
RCM
_iconBitmapSourceType
stores the type of bitmap reference contained in RCM_
iconBitmapSource
.
RCM_iconBitmapSize
stores the size of the icon bitmap, in bytes.
RCM
_overwrite
indicates whether the existing complex moniker chunks should be overwritten. Pass TRUE if you wish this occur.
MSG_COMPLEX_MONIKER_REPLACE_MONIKER
also passes a
ReplaceComplexMonikerChunkHandles
structure. This structure is used to place returned chunk handles of the text and bitmap.
typedef struct { ChunkHandle RCMCH_topText; word RCMCH_unusedCX; ChunkHandle RCMCH_iconBitmap; word RCMCH_unusedBP; } ReplaceComplexMonikerChunkHandles;
RCMCH
_
topText
contains the ChunkHandle of the text portion of the new complex moniker.
RCMCH
_iconBitmap
contains the ChunkHandle of the bitmap (graphics) portion of the new complex moniker.
The Foam library provides a number of routines useful for displaying simple dialog boxes to the user. Each of these displays a dialog box. The dialog box will have one or more buttons. Most of the functions have a return value; the function's return value will be an
InteractionCommand
value corresponding to which button the user pressed to dismiss the dialog. The
FoamDisplay...NoBlock()
routines don't have an explicit return value; they send a message if the user presses the OK button.
The following routines are available:
FoamDisplayWarning()
,
FoamDisplayWarningNoBlock()
FoamDisplayError()
,
FoamDisplayErrorNoBlock()
FoamDisplayOkCancelWarning()
InteractionCommand
value; if the user presses the OK button, the function returns IC_APPLY.
FoamDisplayQuestion()
FoamDisplayNote()
,
FoamDisplayNoteNoBlock()
FoamDisplayDeleteWarning()
FoamDisplayDeleteWarningNoBlock()
For dialog box types not provided by these functions, you will have to set up your UI, using GenInteraction objects in the usual way--or you may use the
FlashingNoteClass
or
FoamProcessDialogClass
, described later in this chapter.
Sometimes, you may want to send a notification to a user without requiring the user to respond. Ideally, you would like a dialog box to appear on screen for a few seconds, and then go away, or automatically disappear once any key is pressed. You can get this behavior with a
FlashingNoteClass
object.
You can provide the following parameters to a Flashing Note object:
A Flashing Note should be placed as the root of an unattached tree within its own UI block (resource). In this manner, it will act as a template. To initiate the flashing note, call the routine
PutUpDialogViaUIThread(),
passing the optr of the dialog box template. This routine will copy the template resource, attach it to the application tree, and manage its thread of execution. The dialog will be run within the specific UI thread to avoid blocking the application thread.
Initiating and Destroying the Flashing Note
FlashingNoteClass
only contains one piece of instance data, but it also changes the defaults for its superclass,
GenInteractionClass
.
Code Display 2-9 FlashingNoteClass Instance Data
#define FLASHING_NOTE_DEFAULT_DURATION (3*60) /* 3 seconds */ #define FLASHING_NOTE_DEFAULT_MINIMUM_DURATION (1*60) /* 1 second */
@instance word FNI_duration;
@default GII_attrs = GIA_NOT_USER_INITIATABLE | GIA_SYS_MODAL); @default GII_visibility = GIV_DIALOG; @default GII_type = GIT_MULTIPLE_RESPONSE; @default FNI_duration = FLASHING_NOTE_DEFAULT_DURATION;
@vardata word HINT_FLASHING_NOTE_DESTROY_SELF_AFTER_DISMISS; @vardata word ATTR_FLASHING_NOTE_MINIMUM_DURATION;
FNI
_duration
stores the maximum duration (in ticks -- 1/60ths of a second) for the dialog to remain on-screen. Do not set this to zero; doing so will make the dialog box "permanent" and incapable of dismissal.
Usually, a
FlashingNoteClass
object (and its children) should be contained within their own resource. The resource should remain unattached to the application tree. The routine
PutUpDialogViaUIThread()
will take care of copying and attaching the group of objects.
To set up your template, perform the following steps:
notDetachable
.
FlashingNoteClass
object.
duration
instance field to the number of ticks (1/60ths of a second) you wish to have the dialog box on-screen. By default, this is 180 ticks (3 seconds).
ATTR_FLASHING_NOTE_MINIMUM_DURATION
and set it to the number of ticks (1/60ths of a second) to remain on-screen. By default, this is 60 ticks (one second).
HINT_FLASHING_NOTE_DESTROY_SELF_AFTER_DISMISS
if you don't want to manually destroy it.
HINT_WINDOW_NOT_TITLE_BAR
and
HINT_DRAW_IN_BOX
.Code Display 2-10 FlashingNote Template
@start FlashingNoteTemplateResource, notDetachable;
@object FlashingNoteClass FlashingNoteTemplate = { GI_states = @default & ~GS_USABLE; GI_comp = @DialogBoxTemplate; FNI_duration = 600; /* 10 seconds */
HINT_DRAW_IN_BOX; HINT_FLASHING_NOTE_DESTROY_SELF_AFTER_DISMISS; HINT_WINDOW_NO_TITLE_BAR; ATTR_FLASHING_NOTE_MINIMUM_DURATION = 300; /* 5 seconds */ }
/* * We want a separator, so we will create a sub-group interaction as a complex * moniker. */
@chunk TCHAR DialogTemplateText[] = "Flashing Note";
@object ComplexMonikerClass DialogBoxTemplate = { ComplexMoniker = GenInteractionClass; CMI_topText = @DialogTemplateText; CMI_fontSize = FOAM_NORMAL_FONT_SIZE; GI_comp = @DialogText;
HINT_PLACE_MONIKER_ABOVE; HINT_COMPLEX_MONIKER_DRAW_SEPARATOR; HINT_FIXED_SIZE = { SST_PIXELS | FOAM_DEFAULT_BUBBLE_WIDTH, 0 }; }
@chunk TCHAR DialogTextText[] = "This particular flashing note will stay up a minimum \r of 5 seconds, and will dismiss itself if you press any key after that.\r\r\ It will dismiss itself automatically after 10 seconds.\r";
@object GenTextClass DialogText = { GTXI_text = @DialogTextText; GI_attrs = @default | GA_READ_ONLY; }
@end FlashingNoteTemplateResource;
Initiating the flashing note is simple. Simply call
PutUpDialogViaUIThread()
, passing the optr of the root Flashing Note object.
If that object contains
HINT_FLASHING_NOTE_DESTROY_AFTER_DISMISS
, the dialog will be automatically detached and destroyed after it disappears from view (though the template block will remain untouched, of course).
When performing a time-consuming task, it is wise to prevent user frustration and use a FoamProcessDialogClass
which informs the user of the task's progress and offers much-appreciated feedback.
The FoamProgress dialog provides the following functionality:
As with a Flashing Note, a FoamProgress dialog should be placed as the root of an unattached tree within its own UI block (resource). To initiate the Foam Progress dialog, call the routine
PutUpDialogViaUIThread(),
passing the optr of the dialog box template. This routine will copy the template resource, attach it to the application tree, and manage its thread of execution. The dialog will be run within the specific UI thread, avoiding blocking the application thread.
The dialog can be taken down with
TakeDownDialogViaUIThread()
or by placing
HINT_FOAM_PROGRESS_DIALOG_DESTROY_SELF_AFTER_DISMISS
on the object.
FoamProgressDialog Instance Data
FoamProgressDialogClass
contains several pieces of instance data, and also alters the defaults of its superclasses,
GenControlClass
and
GenInteractionClass
.
Code Display 2-11 FoamProgressDialogClass Instance Data
@instance ChunkHandle FPDI_descriptionText = NullChunk; @instance ChunkHandle FPDI_statusText = NullChunk; @instance optr FPDI_cancelDestination = NullOptr; @instance word FPDI_cancelActionMsg = 0;
@vardata void HINT_FOAM_PROGRESS_DIALOG_DESTROY_SELF_AFTER_DISMISS; @vardata void ATTR_FOAM_PROGRESS_DIALOG_DONT_DISMISS_ON_CANCEL;
@default GII_visibility = GIV_POPUP; @default GII_type = GIT_MULTIPLE_RESPONSE; @default GII_attrs = (GIA_NOT_USER_INITIATABLE | GIA_MODAL); @default GI_attrs = GA_SIGNAL_INTERACTION_COMPLETE; @default GI_states = (@default | GS_ENABLED);
_descriptionText
contains text to display to the user, informing them of the task being performed.
statusText
contains text to display next to the status indicator.
_cancelDestination
contains the object that should receive notification (via FPDI
_cancelActionMsg
) if the action is cancelled by the user. The object must be capable of handling cancellation in a clean manner.
cancelActionMsg
stores the message to send if the user cancels the operation. This message will be sent to the FPDI_
cancelDestination
, where it should be handled appropriately.
HINT_FOAM_PROGRESS_DIALOG_DESTROY_SELF_AFTER_DISMISS
indicates that the resource block containing this dialog should be destroyed after the dialog is dismissed. This hint indirectly calls
UserDestroyDialog();
do not use this hint if you will use
TakeDownDialogViaUIThread()
instead.
ATTR_FOAM_PROGRESS_DIALOG_DONT_DISMISS_ON_CANCEL
indicates that the dialog will not be dismissed if the user presses "Cancel." The application is responsible for handling this situation, and eventually dismissing the dialog.
A
FoamProgressDialogClass
object (and its children) should be contained within its own resource. The resource should remain unattached to the application tree. The routine
PutUpDialogViaUIThread()
will take care of copying and attaching the group of objects.
To set up your template, perform the following steps:
notDetachable
.
FoamProgressDialogClass
object.
descriptionText
instance field with text describing the action.
statusText
with text to reside along the status indicator.Code Display 2-12 FoamProgressDialog Template
@start FoamProgressDialogTemplate, notDetachable;
@chunk TCHAR DescriptionText[] = "While, we're waiting a series of dots will appear below."
@chunk TCHAR StatusText[] = "Here are the dots: ";
@object FoamProgressDialogClass ProgressSample = { FPDI_descriptionText = @DescriptionText; FPDI_statusText = @StatusText; GII_attrs = (@default | GIA_SYS_MODAL) & ~GIA_MODAL; GI_states = (@default) & ~GS_USABLE; HINT_DRAW_IN_BOX; }
@end FoamProgressDialogTemplate;
MSG_FOAM_PROGRESS_DIALOG_APPEND_STATUS_TEXT
Code Display 2-13 Using a FoamProgressDialog
static ShowProgressDialog () { optr progressDialog; word i; SemaphoreError semResult; TCHAR statusAppendStr[] = " . ";
progressDialog = PutUpDialogViaUIThread(@FoamProgressDialogTemplate);
for ( i=0; i<5; i++) { semResult = ThreadPTimedSem(cancelSemaphore, 0);
if (semResult == SE_TIMEOUT) { @send ProgressDialog::MSG_MY_PROGRESS_DIALOG_CANCEL_RECEIVED(); break; }
else ( ThreadVSem(cancelSempahore); TimerSkeep(30); @call progressDialog::MSG_FOAM_PROGRESS_DIALOG_APPEND_STATUS_TEXT( statusAAppendStr); } }
TimerSleep(30); TakeDownDialogViaUIThread(progressDialog);
}
/* Handler for MSG_MY_PROGRESS_DIALOG_CANCEL_TRIGGERED */
@method MyProgressDialogClass, MSG_MY_PROGRESS_DIALOG_CANCEL_TRIGGERED { SemaphoreError semResult;
semResult = ThreadPSem(cancelSemaphore);
EC_ERROR_IF( (semResult == SE_TIMEOUT), CANNOT_GRAB_SEMAPHORE_CANCELPROGDIALOG); }
/* Handler for MSG_MY_PROGRESS_DIALOG_CANCEL_RECEIVED */
@method MyProgressDialogClass, MSG_MY_PROGRESS_DIALOG_CANCEL_RECEIVED { ThreadVSem(cancelSemaphore); }
There are two routines useful for presenting the user with a list that is alphabetically sorted and/or presents has multi-column items.
The
FoamGetLexicalOrder()
routine is used for alphabetically ordering strings. It takes a char value and returns a byte-size number. This number represents that character's position in a sorted multi-language "alphabet". If you are presenting the user with a sorted list of strings, this is the routine to use to sort the list.
The
CreateVisMonikerLine()
routine puts together a multi-column visual moniker. It puts the moniker together from an array of strings and/or bitmaps you supply. It returns the optr of the new moniker. It takes the following arguments:
VisMonikerColumn
structures: This data contains the data which will be combined into the multi-column moniker.
The
VisMonikerColumn
structure is defined:
typedef struct { byte VMC_width; /* 0 for bitmaps */ const void * VMC_ptr; Justification VMC_just; TextStyle VMC_style; ColumnBorder VMC_border; } VisMonikerColumn;
For each field, pass a
VMC_width
to specify the number of pixels to allow to draw the text, or 0 to signal that this column is a bitmap.
VMC_ptr
should point to a string buffer if the column contains text; it should point to a simple bitmap if the column contains a bitmap.
When you are done using the multi-column moniker, it is up to you to free its memory. Get the memory block handle from the optr and pass that handle to
MemFree()
.


The Know Phone will keep you safe from everything, including criminals. We are launching the Know-Everything program to erradicate all crime forever. This program compiles all the information gathered in the Know-verse to predict crimes in advance. That way, criminals can be arrested before they commit their crime!
The Know Phone won't only protect you from others but it will also protect you from yourself. Thanks to our new Know-Your-Mind technology, the Know Phone can know what you're thinking at all times in order to maximize your happiness. It requires only a very small probe inserted through your ear and then we have full control. About to run into an Ex that might upset you? We'll change your route. Having a bad day? We'll select items from our Know-Shop that are guarenteed to brighten your day!
No one likes politics so here at Know Phone we simplify it for you. We believe it is important to protect our users from dangerous idealologies. When browsing the internet, we block anything that presents ideas from the wrong political team. How do we determine what is wrong? We let our partners and sponsers in Washington decide to make sure it's correct.


realtimeweb.weatherservice.domain
Class Report
Object
realtimeweb.weatherservice.domain.Report
public class Report
- extends Object
A container for the weather, forecasts, and location information.
|
Constructor Summary |
Report(Map<String,Object> raw)
Internal constructor to create a Report from a json representation. |
| Methods inherited from class Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Report
public Report(Map<String,Object> raw)
- Internal constructor to create a Report from a json representation.
- Parameters:
map
- The raw json data that will be parsed.
getWeather
public Weather getWeather()
- Returns:
- The current weather for this location.
setWeather
public void setWeather(Weather weather)
- Parameters:
The
- current weather for this location.
getLocation
public Location getLocation()
- Returns:
- More detailed information on this location.
setLocation
public void setLocation(Location location)
- Parameters:
More
- detailed information on this location.
getForecasts
public ArrayList<Forecast> getForecasts()
- Returns:
- The forecast for the next 7 days and 7 nights.
setForecasts
public void setForecasts(ArrayList<Forecast> forecasts)
- Parameters:
The
- forecast for the next 7 days and 7 nights.
toString
public String toString()
- Creates a string based representation of this Report.
- Overrides:
toString
in class Object
- Returns:
- String


| Filename | Percent | Threshold | Total | Covered | Uncovered |
|---|
| server/graphQL/schema/typeDefs.ts | 25.00% | 80% | 4 | 1 | 3 |
[{"file":"server/graphQL/schema/typeDefs.ts","line":1,"character":8,"text":"gql","kind":1},{"file":"server/graphQL/schema/typeDefs.ts","line":12,"character":6,"text":"Project","kind":1},{"file":"server/graphQL/schema/typeDefs.ts","line":45,"character":15,"text":"Project","kind":1}]


As we have already seen many functions can be expressed in terms of loops
def sum ( is : List[Int] ) : Int = {
var total = 0
for (i <- is) {
total = total + i
}
total
}
Sums the elements of a list: e.g. sum(List(1,2,3,4)) = 10
def product ( is : List[Int] ) : Int = {
var total = 1
for (i <- is) {
total = total * i
}
total
}
The product of a list: e.g. product(List(1,2,3,4)) = 24
In many programming languages functions can be defined in terms of themselves. Such functions are called recursive.
def sum ( is : List[Int] ) : Int =
if (is.length == 0)
0
else
is.head + sum(is.tail)
Like Java, Scala allows "matching" (switch in Java) against integers with match expressions
def toYesOrNo(choice: Int): String = choice match {
case 1 => "yes"
case 0 => "no"
case _ => "error"
}
If input is 1 return "yes", else if input is 0 return "no", otherwise return "error"
Unlike Java, Scala allows pattern matching on (case) classes:
def isEmpty(ls: List[Int]): Boolean = ls match {
case Nil => true
case x : xs => false
}
If input is Nil (empty list) return true, otherwise return false.
Combinding pattern matching and recursion is very powerful:
def sum ( is : List[Int] ) : Int = is match {
case Nil => 0
case i :: remainder => i + sum(remainder)
}
def product ( is : List[Int] ) : Int = is match {
case Nil => 1
case i :: remainder => i * product(remainder)
}
Do you notice anything similar about sum and product?
R is often called fold for lists of integers.
def fold ( f : (Int, Int) => Int, unit : Int, is : List[Int] ) : Int =
is match {
case Nil => unit
case i :: is => f(i, fold(f, unit, is))
}
val sum = (xs : List[Int]) => fold((x,y) => x + y, 0, xs)
val prodct = (xs : List[Int]) => fold((x,y) => x * y, 1, xs)
$$F_n = F_{n-1} + F_{n-2}$$ with seed values $$F_1 = 1\ and\ F_2 = 1$$
def fib( n : Int) : Int = n match {
case 1 | 2 => n
case _ => fib( n-1 ) + fib( n-2 )
}
Our Scala definition is very similar to the mathematical one!
def fib( n : Int) : Int = n match {
case 1 | 2 => n
case _ => fib( n-1 ) + fib( n-2 )
}
$$F_n = F_{n-1} + F_{n-2}$$ with seed values $$F_1 = 1\ and\ F_2 = 1$$
All objects are data-structures
Many data-structures are naturally expressed recursively
We will look at one such data-structure: Trees.
A widely used data-structure that simulates a hierarchical tree structure, with a root value and subtrees of children, represented as a set of linked nodes.
trait Tree {
def toListInOrder : List[Int]
def toListPreOrder : List[Int]
def toListPostOrder : List[Int]
def toListLevelOrder : List[Int]
}
trait Tree {
def toListInOrder : List[Int] = this match {
case Empty() => Nil
case Leaf(v) => v :: Nil
case Node(l,v,r) => l.toListInOrder ::: (v :: r.toListInOrder)
}
...
}
case class Leaf(v : Int) extends Tree
case class Node(l : Tree, v : Int, r : Tree) extends Tree
case class Empty() extends Tree
A case class supports pattern matching
trait Tree {
def toListPreOrder : List[Int] = this match {
case Empty() => Nil
case Leaf(v) => v :: Nil
case Node(l,v,r) => v :: l.toListPreOrder ::: r.toListPreOrder
}
...
}
trait Tree {
// Left as an exercise for the reader
...
}
def insert( i : Int ) : Tree = this match {
case Empty() => Leaf(i)
case Leaf(v) => if (i < v)
Node(Leaf(i), v, Empty())
else if(i > v)
Node(Empty(), v, Leaf(i))
else
this
case Node(l,v,r) => if (i < v)
// insert in left
Node(l.insert(i), v, r)
else if (i > v)
// insert in right
Node(l, v, r.insert(i))
else
// already in tree
this
}
scala> val t = List(2,6,100,84,23,1,2).
foldRight(Empty() : Tree) ( (x, t) => t.insert(x) )
t: Tree = Node(Leaf(1),2,Node(Leaf(6),23,Node(Empty(),84,Leaf(100))))
scala> t.toListInOrder
res2: List[Int] = List(1, 2, 6, 23, 84, 100)
def sort ( ls : List[Int] ) : List[Int] =
ls.foldRight(Empty() : Tree) ((x, t) => t.insert(x)).toListInOrder


Showing embedded Bokeh chart served by a flask route
Update
Part
sepal
petal
Dimension
width
length
Number of results


Former Kotoko management member Dr. Kwame Baah-Nuakoh heads Ghana FA Club Licensing Board
The Executive Council of the GFA, exercising its powers under Article 52 of the GFA Statutes, has appointed a seven-member Club Licensing Board of the GFA.
The Board will be chaired by economist and former sports journalist, Dr Kwame Baah-Nuakoh, who is also the General Manager, Sustainability at Ghana National Petroleum Corporation (GNPC) and a former management member of Asante Kotoko.
Other members of the Club Licensing Board are George Ankomah Mensah (Vice Chairman), Professor Joseph Kwame Mintah, Mike Bonsu, Mavis Amanor, Rev. Emmanuel Addotey and Joseph Addo.
The GFA's Club Licensing Manager, Emmanuel Newton Dasoberi will act as Secretary to the Board.
The Club Licensing Board has the responsibility of vetting the license application of clubs to ensure compliance with legal, administrative, finance, technical, medical and security requirements of the provisions of the GFA Statutes and the GFA Club Licensing Regulations before issuing licences to clubs.


3 people taken into custody after early morning high-speed chase in Columbia County, police say
by Stephen CohnCOLUMBIA COUNTY, Wis. - The Columbia County Sheriff's Office said three people were arrested early Sunday morning after a high-speed chase in Columbia County.
According to a news release, a 2007 Saturn with three occupants was reported to be fleeing from Lake Delton police after a traffic stop just before 3 a.m.
The release said the car then drove off eastbound on I-90/94 and continued eastbound until reaching Highway 33.
Officials said the car drove over a tire deflation device deployed by the Wisconsin State Parol. Despite having damaged tires, police said the driver of the car continued on Hihgway 78 in Caledonia Township.
The release said the car turned off Highway 78 into a cornfield, which stopped the car.
Police said two of the occupants remained in the car and were taken into custody, while the driver ran into the cornfield. Officials eventually took the driver into custody, too.
The Sheriff's Office said there were no injuries and minimal property damage from the chase.
The Lake Delton Police Department will be the contact agency for the identity of the suspects.


Makerlab is a prototyping workshop available to enrolled KEA students, lecturers, researchers or students from our partner institutions in Nordic Entrepreneurship Hubs.
To use the workshop students have to
complete the intro-course held at Makerlab. Later in the semester Makerlab will also arrange machine specific courses where students gets hands on experience with the machines.
Workshop: Mon-Fri 09-16
Work area: Mon-Fri 09-22
Machines has to be clean and ready for the next user before end of period, and latest 15 minutes before workshop closes.
While waiting for our new home page and booking calendar we have set up a temporary booking system and in the repository you can also find tutorials and assets file needed to prepare your files.
http://kea-makerlab.github.io/hello
The machines listed above can only be booked from Monday to Friday, from 9am til 3.45pm. Students are allowed to book the machines up to 2 hours at a time and maximum 4 hours a week, with exception to the 3D printer, which often requires to run overnight. In this case you should book the printer both days.
All bookings which should be modified or cancelled, are your own responsibility and can be made by logging into the calendar. If you need to cancel a booking, this should be done at least 24 hours in advance. If you haven’t cancelled your booking and don’t turn up, you will receive a warning. After 3 warnings you will be prohibited from using the workshop.
NB: The wood workshop doesn’t require a booking. It is free for use for those who have taken the intro-course, depending on capacity. The table saw and CNC machine cannot be used without the assistance of the workshop managers.
CONTACT INFORMATION
Tel: +45 46 46 03 90
Email<EMAIL_ADDRESS>web:http://kea.dk/kealabs/workshopgbg/event/makerlab-workshop-gbgkea-dk/
You can also follow us on Facebook: KEA Makerlab


A take on shiny’s sliderInput
.
A character string specifying the id of the range input or NULL
.
A number specifying the minimum value of the range input, defaults
to 0
.
A number specifying the maximum value of the range input, defaults
to 100
.
A numeric vector between min
and max
specifying the
default value of the range input.
For rangeInput, a single number, defaults to min
.
For intervalInput, a vector of two numbers specifying the minimum and
maximum of the slider interval, defaults to c(min, max)
.
A number specifying the interval step of the range input,
defaults to 1
.
One of TRUE
or FALSE
specifying if the user can drag the
interval between an interval input’s two sliders defaults to FALSE
. If
TRUE
the slider interval may be dragged with the cursor, otherwise the
interval is not draggable.
A character vector specifying the labels along the slider input.
A character vector specifying the values of the slider input,
defaults to choices
.
One of values
specifying the initial value of the slider
input, defaults to NULL
, in which case the slider input defaults to the
first choice.
One of TRUE
or FALSE
specifying if tick marks are added to
the range input, defaults to FALSE
. If TRUE
tick marks are added,
otherwise if FALSE
tick marks are not added.
One of TRUE
or FALSE
specifying whether the filled portion of
a range or slider input is shown. If FALSE
the filled porition is hidden.
For rangeInput the default is TRUE
.
For sliderInput the default is FALSE
.
A number specifying how many ticks are labeled, defaults to
4
. If snap
is TRUE
, this argument is ignored and tick labels are
based on step
.
One of TRUE
or FALSE
specifying how the range input tick
marks are labeled, defaults to FALSE
. If TRUE
the range input tick
marks are adjusted to align with a multiple of step
. If FALSE
the range
input tick marks are calculeted using labels
.
A character string specifying a prefix for the range input
slider value, defaults to NULL
, in which case a prefix is not prepended.
A character string specifying a suffix for the range input
slider value, defaults to NULL
, in which case a prefix is not appended.
Select from a range of numeric values.
We'll hide the filled portion of the input with fill
and change how tick marks are placed with snap
.
Select an interval from a range of numeric values. Intervals are draggable by default, this can be toggled off with draggable = FALSE
.
Select a value from a set of choices using a slider.


Tennis
Ruby Classes
April 16, 2015
For this week's entry, we'll be getting in to classes in Ruby. This is perhaps one of the most
important basic concepts for a novice programmer to understand. Classes allow you to model objects
or processes from the real world. In technical terms, we say that a class encapsulates information
and behavior about an object. A very generic example is so say that we have a class to represent
a person. It might look something like this:
As you can see above, this type of construction allows me to create multiple person variables to represent different people. This is a powerful concept because that's exactly the way the real world is. Everyone is different. If I called the #print_info method on the alex object, the output on the screen would look like this:
Similarly, if I called that same method on the erica object, I would get her information. This is all great, but I want to model something that is a little more complicated. Another passion of mine since I was about twelve years hold has been tennis. Anyone who has played or has tried to play will tell you that the scoring is not the easiest or most intuitive thing in the world. If I started to get in to all of it, this post would turn in to a novel. I will just be modeling what happens on in one GAME (trust me, it's not what you think). If you want to read more about scoring, you can go here. To model the scoring in one game, I might end up with a class that looks like this:
As you can see, scoring is not an easy thing to keep track of in tennis. After writing this class though, I won't have to worry about it. The code will keep track of it for me. All I need to do is know the player names and call the #point method every with that name as an argument every time I want to award a point to that player. Then, when I call the #score method, I'll always know the current score in tennis terminology. The best thing about it is that it's repeatable and sustainable now matter who is playing the game.
Hopefully this provided you with some insight as to how classes can be useful to model real world objects and behaviors. This could get more complicated if I wanted to actually use classes for the players themselves or try to model an entire tennis match to include the game score, the set score and the match score. This was merely an initial attempt aimed at showing how just a few lines of code inside a class are useful.


nozoom (boolean): - "true" disable zoom for this panorama (both zoom for pult and for mousewheel). Default: false.
sphearic (boolean):
- if your panorama is a sphearic by y-axis (like Moscow and Paris here), you can set "true" here. Default: false.
cylinder (boolean):
- if your panorama is not a cylinder by x-axis (like Giza here), you can set "false" here. Default: true.
add_html (string): - if you want to attach any html string to panorama, you can do it here. Default: empty string.
pultarrows (boolean): - "true" enable pult with arrows, that move panorama to left/top/right/bottom. Default: true.
pultzoom (boolean): - "true" enable zoom buttons on pult. If pult is disabled or if zoom is disabled, this option doesn't matter. Default: true.
pultstep (integer): - size of step in pixels for each pult click. Default: 100px.
shell_class (string): - classname for shell "div". Default: 'pano-images'.
title_class (string): - classname for panorama title. Default: 'pano-title'.
title_text (string): - text for panorama title. Default: 'Panorama'.
bgclass (string): - classname for panorama background. Default: 'pano-img'.
bgsrc (string): - source for panorama background. Default: '/example.jpg'.
bgw (integer): - width of panorama background in pixels for zoom = 1. Default: 4000px.
bgh (integer): - height of panorama background in pixels for zoom = 1. Default: 2000px.
bgx (integer): - start position of panorama background on x-axis. Default: 0px.
bgy (integer): - start position of panorama background on y-axis. Default: 0px.
bgz (integer): - start position of panorama zoom. Default: 1.
bgzmin (integer): - minimal enabled zoom. Default: 1.
bgzmax (integer): - maximal enabled zoom. Default: 5.
bgzstep (integer): - size of zoom-step (both zoom for pult and for mousewheel). Default: 0.1.
links (array): - list of links, that transfer visitor to another panorama. Default: empty array. Each link can accept options below:
content (string): - text caption of link. Default: empty string.
class_name (string): - classname for this link. Default: 'pano-goto'.
x (integer): - link position on x-axis. This value is scale with zoom. Default: 0.
y (integer): - link position on y-axis. This value is scale with zoom. Default: 0.
center_x (integer): - specify x-point for link. This value is not scale with zoom. Default: 0.
center_y (integer): - specify y-point for link. This value is not scale with zoom. Default: 0.
drag (boolean): - set "true" if you want link to be moved along with panorama. Default: false.
set (string): - the panorama key to which the visitor will be transferred. Default: current panorama key.


Stephanie Collins
Contact
Portfolio
About
Portfolio
Hangman
RPG Game
Trivia Game
Rutgers Info Widget
Rock Paper Scissors