I finally did it. I wrote a decorator mixin to add that triangle on the 
bottom. I am posting it here just in case someone else finds it useful. 
It does have some hardcoded values and some assumptions but it is good 
enough for now.


qx.Mixin.define("qssite.util.MNubbin", {
     properties: {
         showNubbin: {
             nullable: false,
             init: false,
             check: "Boolean",
             apply: "_applyShowNubbin"
         }
     },

     members: {

         _styleShowNubbin: function(styles){

             if (this.isShowNubbin()) {

                 // split <div>'s border bottom style
                 // borderBottom[0]: width
                 // borderBottom[1]: style
                 // borderBottom[2]: color
                 var borderBottom = styles["border-bottom"].split(" ");


                 styles[":before"] = {
                     "content": '""',
                     "position": "absolute",
                     "width": 0,
                     "height": 0,
                     "border-style": "solid",
                     "border-color": "transparent",
                     "border-bottom": 0,
                     "bottom": "-16px",
                     "left": "10px",
                     /* If 1px darken stroke slightly */
                     "border-top-color": borderBottom[2],
                     "border-width": "16px"
                 };

                 //get the size of the overlay
                 var overlay = 
parseInt(styles[":before"]["border-width"]) - parseInt(borderBottom[0]);
                 qx.core.Assert.assertPositiveInteger(overlay,
                                                      "border-bottom 
should be smaller than nubbin's border-width");

                 var position = parseInt(styles[":before"]["left"]) + 
parseInt(borderBottom[0]);

                 styles[":after"] = {
                     "content": '""',
                     "position": "absolute",
                     "width": 0,
                     "height": 0,
                     "border-style": "solid",
                     "border-color": "transparent",
                     "border-bottom": 0,
                     "bottom": (-1) * overlay +1 + "px",
                     "left": position + "px",
                     "border-top-color": styles["background-color"],
                     "border-width": overlay + "px"
                 };
               }

         },

         _applyShowNubbin: function(){
             if (qx.core.Environment.get("qx.debug")) {
                 if (this._isInitialized()) {
                     throw new Error("This decorator is already in-use. 
Modification is not possible anymore!");
                 }
             }
         }
     }
});

How to use

1)
//add a showNubbin property to the widget
qx.Class.patch(qx.ui.decoration.Decorator, qssite.util.MNubbin);

2)
widget.setAppearance("my-awesome-widget");

3)
//add an event listener for the widget for the on "appear" event and
//set visibility to visible.
__onAppear: function(e){
    //set overflow to vissible. It is needed to show the ::before and
    //::after
    qx.bom.element.Style.set(this.getContentElement().getDomElement(), 
"overflow", "visible");
    }

4)
in the decorator set showNubbin to true
  showNubbin: true,


------------------------------------------------------------------------------
_______________________________________________
qooxdoo-devel mailing list
qooxdoo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to