Changeset 74

Show
Ignore:
Timestamp:
07/18/08 20:02:57 (2 months ago)
Author:
kaarna
Message:

Menu better. Animator better.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/pihlaja/src/dsss.conf

    r71 r74  
    5050    #buildflags += -debug=GtkOpenGLCanvas 
    5151    #buildflags += -debug=SubWindow 
     52    buildflags += -debug=Menu 
    5253    #buildflags += -debug=Widget 
    5354    #buildflags += -debug=Rectangle 
     
    5859    #buildflags += -debug=FindLeaf #warning: very much output 
    5960    #buildflags += -debug=Animator 
     61    buildflags += -debug=Animator2 
    6062    buildflags += -debug=Image 
    6163} 
  • trunk/pihlaja/src/pihlaja/PihlajaMain.d

    r73 r74  
    3939import shiraz.ui.Window; 
    4040import shiraz.ui.SubWindow; 
     41import shiraz.ui.Menu; 
    4142import shiraz.ui.Paned; 
    4243import shiraz.ui.Button; 
     
    287288        //add(myWindow4); 
    288289        insideButton4 = new Button("؎یراز"); 
    289         insideButton4.signalActivate.attach(&clickHandler3); 
     290        insideButton4.signalActivate.attach(&funnyProgressLoopHandler); 
     291        //insideButton4.signalActivate.attach(&clickHandler3); 
    290292        /* 
    291293        insideButton4.signalMouseButtonPress.attach(&clickHandler3); 
     
    306308        exportProgressBar = new ProgressBar("Exporting..."); 
    307309        myWindow4.add(exportProgressBar); 
    308         exportProgressBar.fraction = 0.7f; 
     310        //exportProgressBar.fraction = 0.7f; 
    309311         
    310312        playButton = new Button("Play"); 
     
    635637            } 
    636638        } 
     639    } 
     640     
     641    void funnyProgressLoopHandler() 
     642    { 
     643        if( exportProgressBar.fraction < 1.0f ) 
     644            exportProgressBar.fractionAnim(1.0f, &funnyProgressLoopHandler); 
     645        else exportProgressBar.fractionAnim(0.0f, &funnyProgressLoopHandler); 
    637646    } 
    638647     
  • trunk/pihlaja/src/shiraz/Shiraz.d

    r73 r74  
    528528         
    529529        my_theme.addValue( "Shiraz.Button.defaultHeight", 0.03f ); 
     530        my_theme.addValue( "Shiraz.WindowHeader.NORMAL.defaultHeight", 0.03f ); 
     531        my_theme.addValue( "Shiraz.WindowHeader.SMALL.defaultHeight", 0.02f ); 
    530532         
    531533         
     
    603605         
    604606        my_theme.addValue( "Shiraz.Button.defaultHeight", 0.03f ); 
     607        my_theme.addValue( "Shiraz.WindowHeader.NORMAL.defaultHeight", 0.03f ); 
     608        my_theme.addValue( "Shiraz.WindowHeader.SMALL.defaultHeight", 0.02f ); 
    605609         
    606610        //Gradients: 
    607611         
    608612        Gradient gradient = new Gradient(); 
    609         gradient.add( 0.0f, 224.0f/255.0f, 224.0f/255.0f, 224.0f/255.0f, 1.0f ); 
    610         gradient.add( 0.35f, 224.0f/255.0f, 224.0f/255.0f, 224.0f/255.0f, 1.0f ); 
    611         gradient.add( 0.66f, 190.0f/255.0f, 190.0f/255.0f, 190.0f/255.0f, 1.0f ); 
    612         gradient.add( 1.0f, 190.0f/255.0f, 190.0f/255.0f, 190.0f/255.0f, 1.0f ); 
     613        gradient.add( 0.0f, 205.0f/255.0f, 205.0f/255.0f, 205.0f/255.0f, 1.0f ); 
     614        gradient.add( 0.35f, 205.0f/255.0f, 205.0f/255.0f, 205.0f/255.0f, 1.0f ); 
     615        gradient.add( 0.66f, 168.0f/255.0f, 168.0f/255.0f, 168.0f/255.0f, 1.0f ); 
     616        gradient.add( 1.0f, 168.0f/255.0f, 168.0f/255.0f, 168.0f/255.0f, 1.0f ); 
    613617        my_theme.addGradient("Image.GRADIENT_2", gradient); 
    614618         
  • trunk/pihlaja/src/shiraz/canvas/Colour.d

    r68 r74  
    2121{ 
    2222public: 
     23 
     24    this() 
     25    { 
     26        set(1.0f, 1.0f, 1.0f, 1.0f); 
     27    } 
    2328 
    2429    this( float sr, float sg, float sb, float sa = 1.0f ) 
  • trunk/pihlaja/src/shiraz/canvas/PlainRectangle.d

    r73 r74  
    4646 
    4747import shiraz.canvas.Draw; 
     48import shiraz.canvas.Colour; 
    4849import shiraz.canvas.ICanvasItem; 
    4950import shiraz.canvas.IShape; 
     
    223224        debug(PlainRectangle) scope(exit) Trace.formatln("PlainRectangle.this(p1,p2) END."); 
    224225        //super(); 
     226 
     227        mainColour = new Colour(); 
     228        prelightColour = new Colour(); 
     229        updatePrelightColour(); 
    225230 
    226231        if (p1 is null || p2 is null) throw new Exception("PlainRectangle.this(p1, p2) Error: Points cannot be null."); 
     
    766771        debug(PlainRectangle) scope(exit) Trace.formatln("PlainRectangle.this() END."); 
    767772         
     773        mainColour = new Colour(); 
     774        prelightColour = new Colour(); 
     775        updatePrelightColour(); 
     776         
    768777        //This defines the default colour of all 
    769778        //widgets and everything. Let it be 18% grey...? 
     
    781790        debug(PlainRectangle) scope(exit) Trace.formatln("PlainRectangle.this(4) END."); 
    782791         
     792        mainColour = new Colour(); 
     793        prelightColour = new Colour(); 
     794        updatePrelightColour(); 
    783795         
    784796        //These won't work as these will 
     
    804816        debug(PlainRectangle) scope(exit) Trace.formatln("PlainRectangle.this(6) END."); 
    805817         
     818        mainColour = new Colour(); 
     819        prelightColour = new Colour(); 
     820        updatePrelightColour(); 
     821         
    806822        _xPos = set_pos_x; 
    807823        _yPos = set_pos_y; 
     
    820836    this( ICanvasItem setme ) 
    821837    { 
     838        mainColour = new Colour(); 
     839        prelightColour = new Colour(); 
     840        updatePrelightColour(); 
     841     
    822842        _xPos = setme.xPos; 
    823843        _yPos = setme.yPos; 
     
    833853    this( PlainRectangle setme ) 
    834854    { 
     855        mainColour = new Colour(); 
     856        prelightColour = new Colour(); 
     857        updatePrelightColour(); 
     858         
    835859        _xPos = setme.xPos; 
    836860        _yPos = setme.yPos; 
     
    16101634    } 
    16111635     
     1636    Colour mainColour; 
     1637    Colour prelightColour; 
     1638    void updatePrelightColour() 
     1639    {    
     1640        if( mainColour.r > 0.8f )//If whitish...make darker. 
     1641        { 
     1642            prelightColour.set( 0.7f*mainColour.r, 0.7f*mainColour.g, 0.7f*mainColour.b, mainColour.a ); 
     1643        } 
     1644        else //otherwise make lighter. 
     1645        { 
     1646            prelightColour.set( 1.3f*mainColour.r, 1.3f*mainColour.g, 1.3f*mainColour.b, mainColour.a ); 
     1647        } 
     1648    } 
     1649     
    16121650    //Colour 
    16131651    float r() { return _colour_data[0]; } 
     
    16301668    void colour( float sr, float sg, float sb, float sa ) 
    16311669    { 
     1670        mainColour.set(sr, sg, sb, sa); 
     1671        updatePrelightColour(); 
    16321672        r = sr; g = sg; b = sb; a = sa; 
    16331673    } 
     
    16371677        if( set.length >= 4 ) 
    16381678        { 
     1679            mainColour.set(set[0], set[1], set[2], set[3]); 
     1680            updatePrelightColour(); 
    16391681            r = set[0]; g = set[1]; b = set[2]; a = set[3]; 
    16401682        } 
  • trunk/pihlaja/src/shiraz/canvas/Rectangle.d

    r73 r74  
    4545import shiraz.canvas.Image; 
    4646import shiraz.canvas.Bezier; 
     47import shiraz.canvas.Colour; 
    4748import shiraz.ui.Animator; 
    4849import shiraz.ui.InputState; 
     
    18821883        //redraw to make them run. 
    18831884        //Should this be moved to Animator? Maybe not. 
     1885        /* 
    18841886        if(animator.length > 0) 
    18851887        { 
     
    18991901             
    19001902        } 
    1901          
     1903        */ 
    19021904        //Trace.formatln("ok anims."); 
    19031905     
     
    19091911        //is simpler. 
    19101912         
    1911         /* 
     1913        if(animator.length > 0) 
     1914        { 
     1915            //Trace.formatln("Animations pending."); 
     1916            invalidate(); 
     1917        } 
     1918         
     1919         
    19121920        LinkSeq!(Animator) to_remove = new LinkSeq!(Animator); 
    19131921         
     
    19221930            anim.removeFromOwner(); 
    19231931        } 
    1924         */ 
     1932         
    19251933        foreach(Rectangle wid; itemList) 
    19261934        { 
     
    19351943        //Trace.formatln("Added animation."); 
    19361944         
     1945        bool should_we_append = true; 
     1946         
     1947        foreach( Animator anim; animator ) 
     1948        { 
     1949            if( anim.combine(set_anim) == false ) 
     1950            { 
     1951                should_we_append = false; 
     1952            } 
     1953        } 
     1954         
     1955        if( should_we_append == true ) 
     1956        { 
     1957            debug(Animator2) Trace.formatln("Added animator to {}. {}", name, set_anim.toString() ); 
     1958             
     1959            animator.append(set_anim); 
     1960        } 
     1961        else 
     1962        { 
     1963            debug(Animator2) Trace.formatln("Didn't add animator to {}.", name); 
     1964        } 
     1965        //else delete set_anim; 
     1966         
     1967        invalidate();//redraw when a new animation is added 
     1968        //to get it started and running. 
     1969         
    19371970        //Temporary limit of 5 animations: 
    1938         if( animator.length < 5 ) 
     1971        /*if( animator.length < 5 ) 
    19391972        { 
    19401973            animator.append( set_anim ); 
    1941             invalidate();//redraw when a new animation is added 
    1942         //to get it started and running. 
    1943         } 
     1974        }*/ 
    19441975    } 
    19451976     
     
    19471978    { 
    19481979        animator.remove( set_anim ); 
     1980        debug(Animator2) Trace.formatln("Removed animator. name: {}, animators.length: {}", name, animator.length ); 
    19491981        invalidate();//just in case this does something usefull. 
    19501982    } 
     
    19752007                to_add = new Animator( this, &scale, null, null ); 
    19762008                to_add.path(to_path); 
     2009                add(to_add); 
    19772010            break; 
    19782011            case DefaultAnimator.LOWER: 
     
    19902023                to_add = new Animator( this, &scale, null, null ); 
    19912024                to_add.path(to_path); 
     2025                add(to_add); 
    19922026            break; 
    19932027            case DefaultAnimator.ROTATE_180: 
     
    20062040                to_add.speed = 2.0; 
    20072041                to_add.path(to_path); 
     2042                add(to_add); 
    20082043            break; 
    20092044            //This is kind of temporary until we get the 
     
    20242059                to_add.speed = 2.0; 
    20252060                to_add.path(to_path); 
     2061                add(to_add); 
    20262062            break; 
    20272063            case DefaultAnimator.ROTATE_360: 
     
    20422078                to_add = new Animator( this, &yRot, null, null ); 
    20432079                to_add.path(to_path); 
     2080                add(to_add); 
    20442081            break; 
    20452082             
     
    21352172        m_isPrelight = true; 
    21362173         
    2137         colourMem( r, g, b, a ); 
    2138          
    2139         if( r > 0.8f )//If whitish...make darker. 
     2174        //colourMem( r, g, b, a ); 
     2175         
     2176        colourAnim( prelightColour.r, prelightColour.g, prelightColour.b, prelightColour.a ); 
     2177         
     2178        /*if( r > 0.8f )//If whitish...make darker. 
    21402179        { 
    21412180            colourAnim( 0.7f*r, 0.7f*g, 0.7f*b, a ); 
     
    21442183        { 
    21452184            colourAnim( 1.3f*r, 1.3f*g, 1.3f*b, a ); 
    2146         } 
     2185        }*/ 
    21472186         
    21482187        invalidate(); 
     
    21532192        m_isPrelight = false; 
    21542193         
    2155         colourAnim( rMem, gMem, bMem, aMem ); 
     2194        //colourAnim( rMem, gMem, bMem, aMem ); 
     2195        colourAnim( mainColour.r, mainColour.g, mainColour.b, mainColour.a ); 
    21562196         
    21572197        invalidate(); 
     
    39684008        Animator to_anim = new Animator(this, &r, &r, null, null, null, null, set_when_finished ); 
    39694009        to_anim.animateTo( to_set, 0.0f, 0.0f ); 
     4010        add(to_anim); 
    39704011    } 
    39714012     
     
    39744015        Animator to_anim = new Animator(this, &g, &g, null, null, null, null, set_when_finished ); 
    39754016        to_anim.animateTo( to_set, 0.0f, 0.0f ); 
     4017        add(to_anim); 
    39764018    } 
    39774019     
     
    39804022        Animator to_anim = new Animator(this, &b, &b, null, null, null, null, set_when_finished ); 
    39814023        to_anim.animateTo( to_set, 0.0f, 0.0f ); 
     4024        add(to_anim); 
    39824025    } 
    39834026     
     
    39864029        Animator to_anim = new Animator(this, &a, &a, null, null, null, null, set_when_finished ); 
    39874030        to_anim.animateTo( to_set, 0.0f, 0.0f ); 
     4031        add(to_anim); 
    39884032    } 
    39894033     
     
    39924036        Animator to_anim = new Animator(this, &r, &r, &g, &g, &b, &b, set_when_finished ); 
    39934037        to_anim.animateTo( to_r, to_g, to_b ); 
     4038        add(to_anim); 
    39944039         
    39954040        Animator to_anim_alpha = new Animator(this, &a, &a, null, null, null, null, set_when_finished ); 
    39964041        to_anim_alpha.animateTo( to_a, 0.0f, 0.0f ); 
     4042        add(to_anim_alpha); 
    39974043    } 
    39984044     
     
    40294075        Animator to_anim = new Animator(this, &xPos, &xPos, &yPos, &yPos, &zPos, &zPos, set_when_finished ); 
    40304076        to_anim.animateTo( to_x, to_y, to_z ); 
     4077        add(to_anim); 
    40314078    } 
    40324079     
     
    40354082        Animator to_anim = new Animator(this, &w, &w, &h, &h, null, null, set_when_finished ); 
    40364083        to_anim.animateTo( to_w, to_h, 0.0f ); 
     4084        add(to_anim); 
    40374085    } 
    40384086     
  • trunk/pihlaja/src/shiraz/ui/Animator.d

    r69 r74  
    5353    void delegate() whenFinished; 
    5454     
    55     float toX
    56     float toY
    57     float toZ
     55    float toX = 0.0f
     56    float toY = 0.0f
     57    float toZ = 0.0f
    5858     
    5959    bool xDone = false; 
     
    6161    bool zDone = false; 
    6262     
    63     ICanvasItem owner;//CHECK name this parent? 
     63    ICanvasItem owner( ICanvasItem set_owner ) { return m_owner = set_owner; } 
     64    ICanvasItem owner() { return m_owner; } 
     65    ICanvasItem m_owner;//CHECK name this parent? 
    6466     
    6567    BezierG1 m_path; 
     
    7880    this( ICanvasItem set_item, float delegate(float) set_x, float delegate(float) set_y, float delegate(float) set_z, void delegate() set_when_finished = null ) 
    7981    { 
     82        //BROKEN!? 
     83     
    8084        animatorType = AnimatorType.ABSOLUTE_PATH; 
    8185         
    82         owner = set_item; 
    83          
    84         if( owner !is null ) 
    85             owner.add( this ); 
    86      
    8786        //get = set_get; 
    8887        setX = set_x; 
     
    9190         
    9291        whenFinished = set_when_finished; 
    93     } 
    94  
     92         
     93        owner = set_item; 
     94         
     95        //if( owner !is null ) 
     96            //owner.add( this ); 
     97    } 
     98 
     99 
     100    //TODO remove set_item from the ctor. 
     101    //It should be set in Rectangle.add( Animator ). 
    95102    this( ICanvasItem set_item, float delegate(float) set_x, float delegate() get_x, float delegate(float) set_y, float delegate() get_y, float delegate(float) set_z, float delegate() get_z, void delegate() set_when_finished = null ) 
    96103    { 
    97104        animatorType = AnimatorType.ABSOLUTE_TO; 
    98105         
    99         owner = set_item; 
    100          
    101         if( owner !is null ) 
    102             owner.add( this ); 
    103      
    104106        speed = 10.0f; 
    105107     
     
    120122        if( setZ is null || getZ is null ) 
    121123            zDone = true; 
     124             
     125        owner = set_item; 
     126         
     127        //if( owner !is null ) 
     128            //owner.add( this ); 
     129    } 
     130     
     131    char[] toString() 
     132    { 
     133        char[] ret = "Animator: "; 
     134        ret ~= "toX: "; 
     135        ret ~= Float.toString(toX); 
     136        ret ~= " toY: "; 
     137        ret ~= Float.toString(toY); 
     138        ret ~= " toZ: "; 
     139        ret ~= Float.toString(toZ); 
     140        return ret; 
     141    } 
     142     
     143    //Returns true if set_anim should be added to the animations in owner. 
     144    //If there's something left there that couldn't be combined with 
     145    //other animators. 
     146    bool combine(Animator set_anim) 
     147    { 
     148        //We presume that the owner is the same. 
     149     
     150        bool checkDelegateCombine( Animator a_anim, float delegate(float) a_dlg, Animator b_anim, float delegate(float) b_dlg ) 
     151        { 
     152            if( a_dlg !is null && a_dlg is b_dlg ) 
     153            { 
     154                return true; 
     155            } 
     156            return false; 
     157        } 
     158     
     159        if( animatorType == AnimatorType.ABSOLUTE_TO && set_anim.animatorType == AnimatorType.ABSOLUTE_TO ) 
     160        { 
     161            //TODO check for other combinations, like if setX is setZ 
     162         
     163            if( xDone == false && checkDelegateCombine( this, setX, set_anim, set_anim.setX ) ) 
     164            { 
     165                debug(Animator2) Trace.formatln("setX was identical. Removing it. toX: {} set_anim.toX: {}", cast(double)toX, cast(double)set_anim.toX ); 
     166                toX = set_anim.toX; 
     167                whenFinished = set_anim.whenFinished; 
     168                set_anim.setX = null; 
     169                set_anim.xDone = true;   
     170                debug(Animator2) Trace.formatln("after. toX: {}", cast(double)toX ); 
     171            } 
     172            if( yDone == false && checkDelegateCombine( this, setY, set_anim, set_anim.setY ) ) 
     173            { 
     174                debug(Animator2) Trace.formatln("setY was identical. Removing it. {}", cast(double)toY ); 
     175                toY = set_anim.toY; 
     176                whenFinished = set_anim.whenFinished; 
     177                set_anim.setY = null; 
     178                set_anim.yDone = true; 
     179            } 
     180            if( zDone == false && checkDelegateCombine( this, setZ, set_anim, set_anim.setZ ) ) 
     181            { 
     182                debug(Animator2) Trace.formatln("setZ was identical. Removing it. {}", cast(double)toZ ); 
     183                toZ = set_anim.toZ; 
     184                whenFinished = set_anim.whenFinished; 
     185                set_anim.setZ = null; 
     186                set_anim.zDone = true; 
     187            } 
     188             
     189            if( set_anim.xDone == true && set_anim.yDone == true && set_anim.zDone == true ) 
     190            { 
     191                return false;//Everything was combined. 
     192            } 
     193            //else 
     194            return true;//There's something left in set_anim. 
     195        } 
    122196    } 
    123197     
  • trunk/pihlaja/src/shiraz/ui/Paned.d

    r68 r74  
    356356        updatePanedControllersXPosFromValue(); 
    357357        return ret; 
     358    } 
     359     
     360    /** 
     361    * No effect because it would screw up the Paned system. 
     362    */ 
     363    void sendToTop( Rectangle wid ) 
     364    { 
     365        debug(Paned) Trace.formatln("Paned.sendToTop(Widget) START."); 
     366        debug(Paned) scope(exit) Trace.formatln("Paned.sendToTop(Widget) STOP."); 
     367         
     368        //No effect because it would screw up the Paned system. 
     369    } 
     370     
     371    /** 
     372    * Bring this widget to be the lowest widget 
     373    * in it's container. No effect because it would screw up the Paned system. 
     374    */ 
     375    void sendToBottom( Rectangle wid ) 
     376    { 
     377        debug(Paned) Trace.formatln("Paned.sendToBottom(Widget) START."); 
     378        debug(Paned) scope(exit) Trace.formatln("Paned.sendToBottom(Widget) STOP."); 
     379         
     380        //No effect because it would screw up the Paned system. 
    358381    } 
    359382     
  • trunk/pihlaja/src/shiraz/ui/ProgressBar.d

    r68 r74  
    2828import shiraz.Shiraz; 
    2929import shiraz.ui.InputState; 
     30import shiraz.ui.Animator; 
    3031import shiraz.ui.Widget; 
    3132import shiraz.canvas.Rectangle; 
     
    138139        //progressRect.x2 = progressRect.x2 - delt; 
    139140        if( progressRect !is null ) 
     141        { 
    140142            progressRect.w = (progressRect.w * fraction); 
     143            progressRect.xPos = -((w*0.5f) - (progressRect.w*0.5f) ); 
     144        } 
    141145    } 
    142146     
     
    152156    } 
    153157    protected float m_fraction = 0.0f; 
     158     
     159    void fractionAnim( float to_set, void delegate() set_when_finished = null ) 
     160    { 
     161        Animator to_anim = new Animator(this, &fraction, &fraction, null, null, null, null, set_when_finished ); 
     162        to_anim.animateTo( to_set, 0.0f, 0.0f ); 
     163        add(to_anim); 
     164    } 
    154165     
    155166    //orientation - left to right etc. 
  • trunk/pihlaja/src/shiraz/ui/SubWindow.d

    r73 r74  
    3232import shiraz.ui.Animator; 
    3333import shiraz.ui.Button; 
    34 import shiraz.ui.Box;//Just for class Menu 
    3534import shiraz.ui.Label; 
    3635import shiraz.canvas.Rectangle; 
     
    391390        if( set_type == WindowHeaderType.NORMAL ) 
    392391        { 
    393             defaultHeight = 0.03f
    394             maxHeight = 0.03f
     392            defaultHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.NORMAL.defaultHeight")
     393            maxHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.NORMAL.defaultHeight")
    395394        } 
    396395        else if ( set_type == WindowHeaderType.SMALL ) 
    397396        { 
    398             defaultHeight = 0.02f
    399             maxHeight = 0.02f
     397            defaultHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.SMALL.defaultHeight")
     398            maxHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.SMALL.defaultHeight")
    400399        } 
    401400         
     
    860859            controlWidget.sizeAnim( controlWidget.parent.w, controlWidget.parent.h ); 
    861860             
    862             //The more detailed API: 
     861            //The more detailed API: BROKEN... needs Rectangle.add(Animator). 
    863862            /* 
    864863            Animator to_anim = new Animator(controlWidget, &controlWidget.xPos, &controlWidget.xPos, &controlWidget.yPos, &controlWidget.yPos, null, null ); 
     
    885884            Animator to_anim = new Animator(controlWidget, &controlWidget.xPos, &controlWidget.xPos, &controlWidget.yPos, &controlWidget.yPos, null, null ); 
    886885            to_anim.animateTo( xPosMem, yPosMem, 0.0f ); 
     886            controlWidget.add(to_anim); 
    887887             
    888888            Animator wh_anim = new Animator(controlWidget, &controlWidget.w, &controlWidget.w, &controlWidget.h, &controlWidget.h, null, null ); 
    889889            wh_anim.animateTo( wMem, hMem, 0.0f ); 
     890            controlWidget.add(wh_anim); 
    890891            /* 
    891892            controlWidget.xPos = xPosMem; 
     
    10431044            //resizeButton.maxWidth = 0.025f; 
    10441045            //resizeButton.maxHeight = 0.025f;//Symmetrical option TODO. 
    1045             resizeButton.defaultSize( 0.03f, 0.03f ); 
     1046            //resizeButton.defaultSize( 0.03f, 0.03f ); 
     1047            if( set_bottom_header_type == WindowHeaderType.NORMAL ) 
     1048            { 
     1049                resizeButton.defaultHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.NORMAL.defaultHeight"); 
     1050                resizeButton.defaultWidth = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.NORMAL.defaultHeight"); 
     1051            } 
     1052            else if ( set_bottom_header_type == WindowHeaderType.SMALL ) 
     1053            { 
     1054                resizeButton.defaultHeight = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.SMALL.defaultHeight"); 
     1055                resizeButton.defaultWidth = g_shiraz.getValueFromTheme("Shiraz.WindowHeader.SMALL.defaultHeight"); 
     1056            } 
    10461057            resizeButton.xPackOptions = PackOptions.SHRINK; 
    10471058            resizeButton.yPackOptions = PackOptions.SHRINK; 
     
    10581069        }//if has_bottomheader 
    10591070 
    1060         signalEnterNotify.attach(&windowHandler); 
    1061         signalLeaveNotify.attach(&windowHandler); 
     1071        //signalEnterNotify.attach(&windowHandler); 
     1072        //signalLeaveNotify.attach(&windowHandler); 
    10621073 
    10631074        if( use_fbo_clipping ) 
     
    13031314    */ 
    13041315     
     1316    /* 
    13051317    void windowHandler( InputState input, Rectangle wid ) 
    13061318    { 
     
    13181330                //sendToTop(); 
    13191331                 
    1320                 /*if( hasAnimators == false ) 
    1321                
    1322                   addDefaultAnimator( DefaultAnimator.RAISE ); 
    1323                 }*/ 
     1332                //if( hasAnimators == false ) 
     1333                //
     1334                //    addDefaultAnimator( DefaultAnimator.RAISE ); 
     1335                //} 
    13241336            break; 
    13251337            case SEventType.LEAVE_NOTIFY: 
     
    13331345        } 
    13341346    } 
     1347    */ 
    13351348     
    13361349    void headerHandler( InputState input, Rectangle wid ) 
     
    15621575} 
    15631576 
    1564 class Menu : public HBox 
    1565 { 
    1566 public: 
    1567     this() 
    1568     { 
    1569         Trace.formatln("Menu.this() START."); 
    1570         scope(exit) Trace.formatln("Menu.this() END."); 
    1571      
    1572         super(); 
    1573         name = "Menu"; 
    1574          
    1575         colour = g_shiraz.getColourFromTheme("Shiraz.Button"); 
    1576         texture = g_shiraz.getTextureFromTheme("Shiraz.Button"); 
    1577          
    1578         //signalMouseButtonPress.attach(&mouseHandler); 
    1579          
    1580         //menuWindows = new LinkSeq!(MenuWindow); 
    1581     } 
    1582      
    1583     void addMenuItem(MenuItem add_item) 
    1584     { 
    1585         add_item.menu = this; 
    1586         add_item.createMenuWindow(this); 
    1587         super.add(add_item); 
    1588     } 
    1589      
    1590     void mouseHandler( InputState input, Rectangle wid ) 
    1591     { 
    1592         input.isHandled = true; 
    1593      
    1594         MenuItem a_item = cast(MenuItem)wid; 
    1595      
    1596         switch( input.eventType ) 
    1597         { 
    1598             default: 
    1599             break; 
    1600             case SEventType.ENTER_NOTIFY: 
    1601                 if( isOpened == true && currentOpenMenuItem !is a_item ) 
    1602                 { 
    1603                     Trace.formatln("Enter_notify menuitem: {}", a_item.name ); 
    1604                     if( currentOpenMenuItem !is null ) 
    1605                         currentOpenMenuItem.hideMenuWindow(); 
    1606                     currentOpenMenuItem = a_item; 
    1607                     a_item.showMenuWindow(); 
    1608                 } 
    1609                 //wid.prelight(); 
    1610                 //wid.sendToTop(); 
    1611             break; 
    1612             case SEventType.LEAVE_NOTIFY: 
    1613                 Trace.formatln("Leave_notify menuitem: {}", a_item.name ); 
    1614                 //wid.unprelight(); 
    1615             break; 
    1616             case SEventType.MOUSE_BUTTON_PRESS: 
    1617                 Trace.formatln("Press menuitem: {}", a_item.name ); 
    1618                 isOpened = true; 
    1619                 currentOpenMenuItem = a_item; 
    1620                 a_item.showMenuWindow(); 
    1621                 //wid.grabInput(); 
    1622                 //wid.sendToTop(); 
    1623             break; 
    1624             case SEventType.MOUSE_BUTTON_RELEASE: 
    1625                 Trace.formatln("Release menuitem: {}", a_item.name ); 
    1626                 //a_item.hideMenuWindow(); 
    1627                 //wid.ungrabInput(); 
    1628             break; 
    1629         } 
    1630      
    1631         if( input.mouse.button[MouseButton.LEFT] == true ) 
    1632         { 
    1633             //myWindow4.moveTo( input.mouse.x, input.mouse.y ); 
    1634             //wid.move( input.mouse.xRel, input.mouse.yRel ); 
    1635             //Trace.formatln( "xrel: {} yrel: {}", input.mouse.xRel, input.mouse.yRel ); 
    1636         } 
    1637     } 
    1638      
    1639     void close() 
    1640     { 
    1641         foreach(Rectangle item; itemList) 
    1642         { 
    1643             (cast(MenuItem)item).hideMenuWindow(); 
    1644         } 
    1645          
    1646         isOpened = false; 
    1647     } 
    1648      
    1649     bool isOpened = false;//TODO make into protected property. 
    1650     MenuItem currentOpenMenuItem; 
    1651      
    1652     //LinkSeq!(MenuWindow) menuWindows; 
    1653 } 
    1654  
    1655 class MenuItem : public Button 
    1656 { 
    1657 public: 
    1658     this(char[] set_name, void delegate() set_on_activate = null  ) 
    1659     { 
    1660         Trace.formatln("MenuItem.this() START."); 
    1661         scope(exit) Trace.formatln("MenuItem.this() END."); 
    1662      
    1663         super(set_name); 
    1664          
    1665         isOutline = false; 
    1666          
    1667         xPackOptions = PackOptions.SHRINK; 
    1668         yPackOptions = PackOptions.SHRINK; 
    1669          
    1670         inPadding = 0.015f; 
    1671         padding = 0.0f; 
    1672          
    1673         texture = null; 
    1674          
    1675         colour = g_shiraz.getColourFromTheme("Shiraz.MenuItem"); 
    1676          
    1677         if( set_on_activate !is null ) 
    1678             signalActivate.attach(set_on_activate); 
    1679          
    1680         /* 
    1681         menuButton = new Button(set_name); 
    1682         menuButton.texture = null; 
    1683         menuButton.padding = 0.0f; 
    1684         add(menuButton); 
    1685         */ 
    1686          
    1687         //keyShortCutLabel = new Label("Key"); 
    1688         //add(keyShortCutLabel); 
    1689          
    1690     } 
    1691      
    1692     void addMenuItem(MenuItem add_item) 
    1693     { 
    1694         if( menu is null ) 
    1695         { 
    1696             Trace.formatln("MenuItem.addMenuItem() ERROR: You have to add the MenuItem to a Menu before adding MenuItems to it."); 
    1697             return; 
    1698         } 
    1699         add_item.menu = menu; 
    1700         if( menuWindow is null ) 
    1701             createMenuWindow(menu); 
    1702             //There should be some more handling of menuitems inside menuitems * 3. 
    1703          
    1704         if( menuWindow !is null ) 
    1705             menuWindow.add(add_item); 
    1706              
    1707         arrange(); 
    1708         invalidate(); 
    1709         menuWindow.arrange(); 
    1710         menuWindow.invalidate(); 
    1711     } 
    1712      
    1713     bool isMainMenu = false; 
    1714     Menu menu; 
    1715      
    1716     void onActivate() 
    1717     { 
    1718         if( isMainMenu == false && menu !is null ) 
    1719             menu.close(); 
    1720         //in super.onActivate(): signalActivate.call(); 
    1721         super.onActivate(); 
    1722     } 
    1723      
    1724     //internal: 
    1725     //RENAME to initForMenu(Menu set_menu) 
    1726     public void createMenuWindow(Menu set_menu) 
    1727     { 
    1728         isMainMenu = true; 
    1729         texture = g_shiraz.getTextureFromTheme("Shiraz.Button"); 
    1730      
    1731         menu = set_menu; 
    1732      
    1733         menuWindow = new MenuWindow(); 
    1734         menuWindow.defaultSize( 0.25f, 0.35f ); 
    1735          
    1736         signalMouseButtonPress.attach(&menu.mouseHandler); 
    1737         signalMouseButtonRelease.attach(&menu.mouseHandler); 
    1738         signalEnterNotify.attach(&menu.mouseHandler); 
    1739         signalLeaveNotify.attach(&menu.mouseHandler); 
    1740          
    1741         arrange(); 
    1742         invalidate(); 
    1743             //signalActivate.attach(&showMenuWindow); 
    1744         //signalMouseButtonPress.attach(&showMenuWindow); 
    1745         //signalMouseButtonRelease.attach(&hideMenuWindow); 
    1746     } 
    1747      
    1748      
    1749     /* 
    1750     void renderChildren(Draw draw) 
    1751     { 
    1752         super.renderChildren(draw); 
    1753          
    1754         if( menuWindow !is null ) 
    1755             menuWindow.render(draw); 
    1756     } 
    1757     */ 
    1758      
    1759     void arrange() 
    1760     { 
    1761         super.arrange(); 
    1762          
    1763         if( menuWindow !is null ) 
    1764         { 
    1765             menuWindow.yPos = yPos2c + ((h*0.5f) + (menuWindow.h*0.5f)); 
    1766             menuWindow.xPos = xPos2c + (menuWindow.w*0.5f) - (w*0.5f); 
    1767         } 
    1768     } 
    1769      
    1770     void showMenuWindowHandler( InputState input, Rectangle wid ) 
    1771     { 
    1772         input.isHandled = true; 
    1773         showMenuWindow(); 
    1774     } 
    1775      
    1776     void showMenuWindow() 
    1777     { 
    1778         if( menuWindow !is null ) 
    1779         { 
    1780             if( menuWindow.a != 1.0f ) 
    1781                 menuWindow.a = 0.0f; 
    1782             if( menuWindow.parent is null ) 
    1783             { 
    1784                 Trace.formatln("Adding menuWindow into rootWindow for the first time."); 
    1785                 rootWindow.addToCanvas( menuWindow ); 
    1786             } 
    1787             menuWindow.show(); 
    1788             menuWindow.sendToTop(); 
    1789             if( menuWindow.a != 1.0f ) 
    1790                 menuWindow.aAnim(1.0f); 
    1791         } 
    1792     } 
    1793      
    1794     void hideMenuWindowHandler( InputState input, Rectangle wid ) 
    1795     { 
    1796         input.isHandled = true; 
    1797         hideMenuWindow(); 
    1798     } 
    1799      
    1800     void hideMenuWindow() 
    1801     { 
    1802         if( menuWindow !is null ) 
    1803         {&nbs