Labs/Jetpack/Reboot/JEP/102

From MozillaWiki
< Labs‎ | Jetpack‎ | Reboot‎ | JEP
Revision as of 20:30, 3 March 2010 by Aza (talk | contribs)
Jump to navigation Jump to search

JEP 102 - Single UI Element

  • Champion: Aza Raskin - aza@mozilla.com
    • Other Peeps: Alex Faaborg
  • Status: Under Review
  • Bug Ticket:
  • Type: API


Proposal

20100205-pc8ufm5fsqu9tq92gmg2nrrgms.png

/**
Creates a new simple feature, whose properties are that it has a small 32x32
pixel display, as well as a larger display that defaults to 350px by 450px.
@constructor
@param options {object}
  @prop content {uri|html|xml|window}
        This is the small view of the feature.
        uri: A link to the URL of either an icon, or a webpage
        html: A html string that will be shown in the small view
        xml: E4X version of the above
        window: a reference to a DOM window object
  @prop [panel] {uri|html|xml|window|panel}
        See above descriptions.
        panel: A reference to a panel object
        If a panel is specified then the default action is that a 
        click on the content area opens the panel. If you wish 
        to over-ride this behavior you do it in the standard way:
        by creating a new widget.onClick that returns false, or
        calls event.preventDefault().
  @prop [on*] {function}
        You can optionally place event handlers in the constructor.
**/
widget = require("basic-widget").Widget(options);
// Using the convention that constructors can optionall
// take new or not.

/**
Event handlers
@method
@param callback {function}
Potential to be all standard events. But for now: click, mouseover, mouseout
**/
widget.on*( callback ) //f.e., widget.onClick()

/**
Remove event handlers. Without any arguments, all bound events are removed.
If the function that was passed to bind is provided, only that specific event handler is removed.
@method
@param [callback] {function}
**/
widget.on*.unbind( [callback] )

/**
Enumerates all event handlers of the type specified, returning
a list of event handlers.
@method
**/
widget.on*.list( )

/**
Removes the widget from the interface.
@method
**/
widget.destory()


/**
@prop [content] {canvas|window}
      If there was a image passed into the constructor this will be a canvas
      you can draw on. It updates the displayed icon in real time. If there
      was a page, then this is a window element.
@prop [panel] {panel}
      A reference to the panel object.
**/
feature.property
  • How hard is it to implement? Hard.

Notes

  • Do we want a widget.listEventsHandlers()?

Key Issues

  • What are the conditions that we should impose on add-ons being included in this UI element.
  • Need to figure out ContentFrames.
  • The code new require("simple-feature").Feature(options) is actually wrong due to the way the new operator works, which would, this code, regard require as a constructor. The correct code would be new (require("simple-feature")).Feature(options). Then let's simplify to

require("basic-widget").Widget(options) without the new, using the auto-constructor pattern.


Dependencies & Requirements

  • JEP 103 - Panel
  • ContentFrame
  • Update-allowable implementation of "icon" - may share similar implementation of content area with Panel and other JEPs

Use Cases

  • Create a email notifier that shows you a small view that has the latest count/sparkline of emails yet to be read, and when you click on it it shows the detailed information about those unread messages.
  • A clock, which has no detail view. Similarly, an x-eyes reimplementation (the eyes follow your cursor around).
  • A Stumble Upon-style interface, where the small view allows you to upvote/downvote a page, and when a triangle is clicked shows a detailed view of ratings of this page.
  • Snow-globe, where when you click it causes the snow to swirl around the page you are looking at. Clicking a little gear opens a detailed view for setting the color and strength of the snow storm. (Like the previous case.)
  • An expanding search interface. It is displayed as a small search box. When you click in it, the search box expands in width with a quick animation. As you start typing, a panel appears which has search results listed in which you can arrow up/down, or mouse to.

Examples

function Snowglobe(win){
  // ...
}

var globes = {};

widget = require("basic-widget").Widget({
  content: "snowglobe.png",
  onClick: function(){
    tabs = require("tabs");
    var win = tabs.focused.contentWindow;
    if( !globes[win] ) globes[win] = new Snowglobe(win);
    globes[win].shake();
  }
});
widget = require("basic-widget").Widget({
  content: "http://reddit.com/favicon",
  panel: "http://m.reddit.com"
})
widget = require("basic-widget").Widget({
  content: "http://wikipedia.com/favicon",
  panel: "Loading..."
})

widget.onClick(function(){
  var sel = require("selection").text;
  var url = "http://wikipedia.com/search?q=" + sel;
  widget.panel.load(url);
});