From b9ecc078ca4759f7df79a78fa49b205eba6de414 Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Sun, 28 Jun 2009 16:32:03 +0000 Subject: [PATCH] 2009-06-28 09:19 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/hbxbp/xbp.ch * harbour/contrib/hbxbp/xbpdialog.prg * harbour/contrib/hbxbp/xbpmle.prg * harbour/contrib/hbxbp/xbpwindow.prg + Implemented fonts management. :setFontCompoundName( "10.Tohama italics" ) Started XBP_PP_* implementation. NOTE: This implementation is based on QT's powerful mechanism of CSS inspired Cascading Style Sheets. It effectively means that look-and-feel of the requested parameters are guaranted to be rendered irrespective of the platform. This also means that a "true" inheritance is achieved in the widgets. For example, if you set the color and font of a top-level dialog, all children of it will also inherit it. Xbase++ also documents this behavior but also notify that some of the widgets do not respond to this request, i.e., XbpPushButton(), XbpTabPage(), etc. But in Harbour-QT-Xbase++ it is possible, and, by all means desirable. Anyway, I am more interested what the group think. It will be heartening if some real-time Xbase++ users participate on the subject. I do not want to cook my own food. * harbour/contrib/hbxbp/tests/demoxbp.prg ! Demonstrated to use fonts and inheritance. Please play. --- harbour/ChangeLog | 28 +++++++ harbour/contrib/hbxbp/tests/demoxbp.prg | 45 +++++++---- harbour/contrib/hbxbp/xbp.ch | 77 ++++++++++++++++++- harbour/contrib/hbxbp/xbpdialog.prg | 4 + harbour/contrib/hbxbp/xbpmle.prg | 8 +- harbour/contrib/hbxbp/xbpwindow.prg | 99 ++++++++++++++----------- 6 files changed, 200 insertions(+), 61 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 03224d532f..86503c0bc1 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,34 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-06-28 09:19 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * harbour/contrib/hbxbp/xbp.ch + * harbour/contrib/hbxbp/xbpdialog.prg + * harbour/contrib/hbxbp/xbpmle.prg + * harbour/contrib/hbxbp/xbpwindow.prg + + Implemented fonts management. + :setFontCompoundName( "10.Tohama italics" ) + Started XBP_PP_* implementation. + NOTE: This implementation is based on QT's powerful mechanism + of CSS inspired Cascading Style Sheets. It effectively + means that look-and-feel of the requested parameters are + guaranted to be rendered irrespective of the platform. + This also means that a "true" inheritance is achieved + in the widgets. For example, if you set the color and + font of a top-level dialog, all children of it will also + inherit it. Xbase++ also documents this behavior but + also notify that some of the widgets do not respond to + this request, i.e., XbpPushButton(), XbpTabPage(), etc. + But in Harbour-QT-Xbase++ it is possible, and, by + all means desirable. + + Anyway, I am more interested what the group think. It will + be heartening if some real-time Xbase++ users participate + on the subject. I do not want to cook my own food. + + * harbour/contrib/hbxbp/tests/demoxbp.prg + ! Demonstrated to use fonts and inheritance. Please play. + 2009-06-28 18:09 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbqt/qth/QFtp.qth * contrib/hbqt/qth/QHttp.qth diff --git a/harbour/contrib/hbxbp/tests/demoxbp.prg b/harbour/contrib/hbxbp/tests/demoxbp.prg index 00760f88f6..5534707ccc 100644 --- a/harbour/contrib/hbxbp/tests/demoxbp.prg +++ b/harbour/contrib/hbxbp/tests/demoxbp.prg @@ -67,7 +67,7 @@ PROCEDURE Main() /*----------------------------------------------------------------------*/ PROCEDURE BuildADialog() - LOCAL oDlg, mp1, mp2, oXbp, nEvent, aSize, aTabs + LOCAL oDlg, mp1, mp2, oXbp, nEvent, aSize, aTabs, oDa LOCAL nThread := ThreadID() LOCAL cThread := hb_ntos( nThread ) @@ -77,6 +77,9 @@ PROCEDURE BuildADialog() oDlg:close := {|| MsgBox( "You can also close me by pressing [ESC]" ), .T. } oDlg:killDisplayFocus := {|| hb_OutDebug( "Loosing Display Focus" ) } SetAppWindow( oDlg ) + oDlg:show() + + oDa := oDlg:drawingArea /* Obtain desktop dimensions */ aSize := AppDesktop():currentSize() @@ -85,11 +88,12 @@ PROCEDURE BuildADialog() ( aSize[ 2 ] - oDlg:currentSize()[ 2 ] ) / 2 } ) /* Callback to report the mouse moves */ - // oDlg:drawingArea:motion := {|| hb_outDebug( "MouseMove: "+cThread ) } + // oDa:motion := {|| hb_outDebug( "MouseMove: "+cThread ) } /* Make background color of :drawingArea different */ - //oDlg:drawingArea:setColorBG( GraMakeRGBColor( { 134,128,164 } ) ) - //oDlg:drawingArea:setColorFG( GraMakeRGBColor( { 40,120,100 } ) ) + oDa:setColorBG( GraMakeRGBColor( { 134,128,200 } ) ) + oDa:setFontCompoundName( "10.Tohama italics" ) + oDa:setColorFG( GraMakeRGBColor( { 255,255,255 } ) ) /* Install menu system */ Build_MenuBar() @@ -98,7 +102,7 @@ PROCEDURE BuildADialog() Build_StatusBar( oDlg ) /* Install Toolbar */ - Build_ToolBar( oDlg:drawingArea ) + Build_ToolBar( oDa ) /* Install Tab Pages */ aTabs := Build_TabPages( oDlg ) @@ -116,10 +120,10 @@ PROCEDURE BuildADialog() Build_ListBox( aTabs[ 1 ] ) /* Install Push Buttons */ - Build_PushButton( oDlg:drawingArea ) + Build_PushButton( oDa ) /* Install Single Line Edits */ - Build_SLEs( oDlg:drawingArea ) + Build_SLEs( oDa ) /* Install Multi-Line Edit */ Build_MLE( aTabs[ 2 ] ) @@ -131,7 +135,7 @@ PROCEDURE BuildADialog() Build_SpinButtons( aTabs[ 3 ] ) /* Install Combo Box */ - Build_ComboBox( oDlg:drawingArea ) + Build_ComboBox( oDa ) /* Install TreeView */ Build_TreeView( aTabs[ 4 ] ) @@ -166,6 +170,7 @@ PROCEDURE AppSys() FUNCTION Hb_OutDebug();RETURN nil FUNCTION Hb_Symbol_Unused();RETURN nil FUNCTION Hb_NtoS( n );RETURN ltrim( str( n ) ) +FUNCTION Hb_ThreadStart();RETURN nil #endif /*----------------------------------------------------------------------*/ @@ -230,6 +235,8 @@ STATIC FUNCTION Build_MenuBar() oSubMenu:setColorBG( GraMakeRGBColor( { 134,128,250 } ) ) oSubMenu:setColorFG( GraMakeRGBColor( { 255, 1, 1 } ) ) + + #ifdef __HARBOUR__ #if 0 oSubMenu := XbpMenu():new( oMenuBar ):create() oSubMenu:title := "~Dialogs" @@ -242,6 +249,7 @@ STATIC FUNCTION Build_MenuBar() oMenuBar:addItem( { oSubMenu, NIL } ) #endif + #endif Return nil @@ -426,9 +434,6 @@ FUNCTION Build_TabPages( oDlg ) oTab1:caption := "ListView" oTab1:create() oTab1:TabActivate := {|| oTab2:minimize(), oTab3:minimize(), oTab4:minimize(), oTab1:maximize() } - #if 0 - oTab1:setColorBG( GraMakeRGBColor( {198,198,198} ) ) - #endif // Second tab page is minimized oTab2 := XbpTabPage():new( oDlg:drawingArea, , { 510, 20 }, { 360, nHeight } ) @@ -456,6 +461,8 @@ FUNCTION Build_TabPages( oDlg ) oTab4:TabActivate := ; {|x,y,oTab| x := y, oTab1:minimize(), oTab2:minimize(), oTab3:minimize(), oTab4:maximize() } + oTab4:setColorBG( GraMakeRGBColor( {198,198,198} ) ) + RETURN { oTab1, oTab2, oTab3, oTab4 } /*----------------------------------------------------------------------*/ @@ -478,7 +485,7 @@ FUNCTION Build_ListBox( oWnd ) oListBox:ItemSelected := {|mp1, mp2, obj| mp1:=oListBox:getData(), ; mp2:=oListBox:getItem( mp1 ), MsgBox( "itemSelected: "+mp2 ) } - #if 0 + #if 1 oListBox:setColorBG( GraMakeRGBColor( {227,12,110} ) ) oListBox:setColorBG( GraMakeRGBColor( { 27,12, 45} ) ) #endif @@ -510,14 +517,14 @@ FUNCTION Build_ScrollBar( oWnd ) oXbpH := XbpScrollbar():new() oXbpH:type := XBPSCROLL_HORIZONTAL - oXbpH:range := { 1, 100 } - oXbpH:create( oWnd, , { 10,nHeight-50 }, { nWidth-40,nFat } ) + oXbpH:range := { 1, 100 } //50 + oXbpH:create( oWnd, , { 10,nHeight-30 }, { nWidth-40,nFat } ) oXbpH:scroll := {|| oXbpV:setData( oXbpH:getData() ) } oXbpV := XbpScrollbar():new() oXbpV:type := XBPSCROLL_VERTICAL oXbpV:range := { 1, 100 } - oXbpV:create( oWnd, , { nWidth-30,10 }, { nFat,nHeight-60 } ) + oXbpV:create( oWnd, , { nWidth-30,10 }, { nFat,nHeight-40 } ) oXbpV:scroll := {|| oXbpH:setData( oXbpV:getData() ) } RETURN nil @@ -538,6 +545,8 @@ FUNCTION Build_SLEs( oWnd ) //oXbp:setInputFocus := { |x,y,oSLE| oSLE:getData(), Qt_QDebug( "Var A =" + cVarA ) } //oXbp:setInputFocus := { |x,y,oSLE| oSLE:getData() } + oXbp:setColorBG( GraMakeRGBColor( { 170,170,170 } ) ) + oXbp := XbpSLE():new() oXbp:autoTab := .T. oXbp:bufferLength := 20 @@ -549,6 +558,8 @@ FUNCTION Build_SLEs( oWnd ) // when the input focus is lost oXbp:killInputFocus := { |x,y,oSLE| oSLE:getData(), MsgBox( "Var B =" + cVarB ) } + oXbp:setColorBG( GraMakeRGBColor( { 190,190,190 } ) ) + RETURN nil /*----------------------------------------------------------------------*/ @@ -568,6 +579,10 @@ FUNCTION Build_MLE( oWnd ) // via :dataLink oMLE:setData() + oMLE:setColorBG( GraMakeRGBColor( { 190,190,0 } ) ) + oMLE:setColorFG( GraMakeRGBColor( { 0,0,0 } ) ) + oMLE:setFontCompoundName( "14.Courier New bold normal" ) + RETURN nil /*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbxbp/xbp.ch b/harbour/contrib/hbxbp/xbp.ch index 38a01cf032..f5fe9f7d95 100644 --- a/harbour/contrib/hbxbp/xbp.ch +++ b/harbour/contrib/hbxbp/xbp.ch @@ -106,11 +106,86 @@ #define XBPLISTBOX_MM_SINGLE 1 -/* Generic Pres Parameters */ #define XBP_PP_FGCLR 2 #define XBP_PP_BGCLR 4 +#define XBP_PP_HILITE_FGCLR 6 +#define XBP_PP_HILITE_BGCLR 8 +#define XBP_PP_DISABLED_FGCLR 10 +#define XBP_PP_DISABLED_BGCLR 12 +#define XBP_PP_BORDER_CLR 14 #define XBP_PP_COMPOUNDNAME 15 #define XBP_PP_FONT 16 +#define XBP_PP_ACTIVE_CLR 19 +#define XBP_PP_INACTIVE_CLR 21 +#define XBP_PP_ACTIVETEXT_FGCLR 23 +#define XBP_PP_ACTIVETEXT_BGCLR 25 +#define XBP_PP_INACTIVETEXT_FGCLR 27 +#define XBP_PP_INACTIVETEXT_BGCLR 29 +#define XBP_PP_CAPTION 50 +#define XBP_PP_ALIGNMENT 52 +#define XBP_PP_ORIGIN 300 + +#define XBP_PP_MENU_FGCLR 32 +#define XBP_PP_MENU_BGCLR 34 +#define XBP_PP_MENU_HILITE_FGCLR 36 +#define XBP_PP_MENU_HILITE_BGCLR 38 +#define XBP_PP_MENU_DISABLED_FGCLR 40 +#define XBP_PP_MENU_DISABLED_BGCLR 42 + + +#define XBPSYSCLR_BUTTONTEXT ( -58 ) +#define XBPSYSCLR_INFOBACKGROUND ( -57 ) +#define XBPSYSCLR_INFOTEXT ( -56 ) +#define XBPSYSCLR_3DHIGHLIGHT ( -55 ) +#define XBPSYSCLR_3DLIGHT ( -54 ) +#define XBPSYSCLR_3DFACE ( -53 ) +#define XBPSYSCLR_3DSHADOW ( -52 ) +#define XBPSYSCLR_3DDARKSHADOW ( -51 ) +#define XBPSYSCLR_SHADOWHILITEBGND ( -50 ) +#define XBPSYSCLR_SHADOWHILITEFGND ( -49 ) +#define XBPSYSCLR_SHADOWTEXT ( -48 ) +#define XBPSYSCLR_ENTRYFIELD ( -47 ) +#define XBPSYSCLR_MENUDISABLEDTEXT ( -46 ) +#define XBPSYSCLR_MENUHILITE ( -45 ) +#define XBPSYSCLR_MENUHILITEBGND ( -44 ) +#define XBPSYSCLR_PAGEBACKGROUND ( -43 ) +#define XBPSYSCLR_FIELDBACKGROUND ( -42 ) +#define XBPSYSCLR_BUTTONLIGHT ( -41 ) +#define XBPSYSCLR_BUTTONMIDDLE ( -40 ) +#define XBPSYSCLR_BUTTONDARK ( -39 ) +#define XBPSYSCLR_BUTTONDEFAULT ( -38 ) +#define XBPSYSCLR_TITLEBOTTOM ( -37 ) +#define XBPSYSCLR_SHADOW ( -36 ) +#define XBPSYSCLR_ICONTEXT ( -35 ) +#define XBPSYSCLR_DIALOGBACKGROUND ( -34 ) +#define XBPSYSCLR_HILITEFOREGROUND ( -33 ) +#define XBPSYSCLR_HILITEBACKGROUND ( -32 ) +#define XBPSYSCLR_INACTIVETITLETEXTBGND ( -31 ) +#define XBPSYSCLR_ACTIVETITLETEXTBGND ( -30 ) +#define XBPSYSCLR_INACTIVETITLETEXT ( -29 ) +#define XBPSYSCLR_ACTIVETITLETEXT ( -28 ) +#define XBPSYSCLR_OUTPUTTEXT ( -27 ) +#define XBPSYSCLR_WINDOWSTATICTEXT ( -26 ) +#define XBPSYSCLR_SCROLLBAR ( -25 ) +#define XBPSYSCLR_BACKGROUND ( -24 ) +#define XBPSYSCLR_ACTIVETITLE ( -23 ) +#define XBPSYSCLR_INACTIVETITLE ( -22 ) +#define XBPSYSCLR_MENU ( -21 ) +#define XBPSYSCLR_WINDOW ( -20 ) +#define XBPSYSCLR_WINDOWFRAME ( -19 ) +#define XBPSYSCLR_MENUTEXT ( -18 ) +#define XBPSYSCLR_WINDOWTEXT ( -17 ) +#define XBPSYSCLR_TITLETEXT ( -16 ) +#define XBPSYSCLR_ACTIVEBORDER ( -15 ) +#define XBPSYSCLR_INACTIVEBORDER ( -14 ) +#define XBPSYSCLR_APPWORKSPACE ( -13 ) +#define XBPSYSCLR_HELPBACKGROUND ( -12 ) +#define XBPSYSCLR_HELPTEXT ( -11 ) +#define XBPSYSCLR_HELPHILITE ( -10 ) + +#define XBPSYSCLR_TRANSPARENT ( -255 ) + + #define XBPSLE_LEFT 1 #define XBPSLE_RIGHT 2 diff --git a/harbour/contrib/hbxbp/xbpdialog.prg b/harbour/contrib/hbxbp/xbpdialog.prg index 0e6f1bcdcf..2f1685a590 100644 --- a/harbour/contrib/hbxbp/xbpdialog.prg +++ b/harbour/contrib/hbxbp/xbpdialog.prg @@ -137,6 +137,8 @@ METHOD XbpDialog:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible ) ::drawingArea := XbpDrawingArea():new( self, , {0,0}, ::aSize, , .t. ):create() ::oWidget:setCentralWidget( QT_PTROF( ::drawingArea:oWidget ) ) + //::setQtProperty() + ::setPosAndSize() IF ::visible ::show() @@ -288,6 +290,8 @@ METHOD XbpDrawingArea:create( oParent, oOwner, aPos, aSize, aPresParams, lVisibl ::oWidget:setMouseTracking( .T. ) ::oWidget:setFocusPolicy( 2 ) + //::setQtProperty() /* Using it for one-to-one style sheet management */ + ::oParent:addChild( SELF ) /* Connects All Event Handlers */ diff --git a/harbour/contrib/hbxbp/xbpmle.prg b/harbour/contrib/hbxbp/xbpmle.prg index 2cee37f267..75ccaf3aef 100644 --- a/harbour/contrib/hbxbp/xbpmle.prg +++ b/harbour/contrib/hbxbp/xbpmle.prg @@ -221,9 +221,11 @@ METHOD XbpMLE:setStyle() aadd( txt_, ' ' ) aadd( txt_, ' QTextEdit { ' ) - aadd( txt_, ' background-color: white; ' ) - aadd( txt_, ' background-image: url(new.png); ' ) - aadd( txt_, ' background-attachment: scroll; ' ) + //aadd( txt_, ' background-color: white; ' ) + //aadd( txt_, ' background-image: url(new.png); ' ) + //aadd( txt_, ' background-attachment: scroll; ' ) + aadd( txt_, ' background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, ' ) + aadd( txt_, ' stop:0 white, stop:1 darkgray); ' ) aadd( txt_, ' } ' ) #if 0 aadd( txt_, 'If the background-image is to be fixed with the viewport: ' ) diff --git a/harbour/contrib/hbxbp/xbpwindow.prg b/harbour/contrib/hbxbp/xbpwindow.prg index 52315199b6..429573e7f9 100644 --- a/harbour/contrib/hbxbp/xbpwindow.prg +++ b/harbour/contrib/hbxbp/xbpwindow.prg @@ -77,8 +77,16 @@ CLASS XbpWindow INHERIT XbpPartHandler + CLASSDATA nProperty INIT 0 + DATA qtProperty INIT "" + /* Called in the initializer - Unique in the application */ + METHOD getProperty() INLINE "PROP" + hb_ntos( ++::nProperty ) + /* After object is physically created, set unique property to 1 */ + METHOD setQtProperty() INLINE ::oWidget:setProperty( ::qtProperty, 1 ) + DATA cargo INIT "" DATA styleSheet INIT "" + METHOD setStyleSheet() /* CONFIGURATION */ DATA animate INIT .F. @@ -291,6 +299,8 @@ METHOD XbpWindow:init( oParent, oOwner, aPos, aSize, aPresParams, lVisible ) ::XbpPartHandler:init( oParent, oOwner ) + ::qtProperty := ::getProperty() + RETURN Self /*----------------------------------------------------------------------*/ @@ -722,6 +732,15 @@ METHOD XbpWindow:lockUpdate() /*----------------------------------------------------------------------*/ +METHOD XbpWindow:setStyleSheet( cNewSheet ) + LOCAL cSheet := ::oWidget:styleSheet() + + ::oWidget:setStyleSheet( cSheet + " " + cNewSheet ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + METHOD XbpWindow:setColorBG( nRGB ) #if 0 LOCAL cClass := __ObjGetClsName( self ) @@ -745,7 +764,7 @@ METHOD XbpWindow:setColorBG( nRGB ) LOCAL oColor := QColor():new( nRGB ) - ::oWidget:setStyleSheet( "background-color: "+ oColor:name +";" ) + ::setStyleSheet( "background-color: "+ oColor:name +";" ) RETURN Self @@ -775,12 +794,48 @@ METHOD XbpWindow:setColorFG( nRGB ) LOCAL oColor := QColor():new( nRGB ) - ::oWidget:setStyleSheet( "color: "+ oColor:name +";" ) + ::setStyleSheet( "color: "+ oColor:name +";" ) RETURN Self /*----------------------------------------------------------------------*/ +METHOD XbpWindow:setFontCompoundName( xFont ) + LOCAL cOldFont, s, n, nPoint, cFont, cAttr, cFace + LOCAL aAttr := { "normal","italic","bold" } + + cOldFont := ::fnt_COMMPOUNDNAME + + IF hb_isNumeric( cFont ) + + ELSE + IF !empty( xFont ) + cFont := xFont + s := lower( cFont ) + n := ascan( aAttr, {|e| at( e, cFont ) > 0 } ) + IF n > 0 + cAttr := aAttr[ n ] + n := at( cAttr, s ) + cFont := substr( cFont,1,n-1 ) + ELSE + cAttr := "normal" + ENDIF + IF ( n := at( ".", cFont ) ) > 0 + nPoint := val( substr( cFont,1,n-1 ) ) + cFont := substr( cFont,n+1 ) + ELSE + nPoint := 0 + ENDIF + cFace := alltrim( cFont ) + + ::setStyleSheet( 'font-family: "'+ cFace +'"; font-style: '+ cAttr +'; font-size: '+ hb_ntos( nPoint )+'pt;' ) + ENDIF + ENDIF + + RETURN cOldFont + +/*----------------------------------------------------------------------*/ + METHOD XbpWindow:setModalState() RETURN Self @@ -902,46 +957,6 @@ METHOD XbpWindow:setFont() /*----------------------------------------------------------------------*/ -METHOD XbpWindow:setFontCompoundName( xFont ) - LOCAL cOldFont, s, n, nPoint, cFont, cAttr, cFace - LOCAL aAttr := { "normal","italic","bold" } - - cOldFont := ::fnt_COMMPOUNDNAME - - IF hb_isNumeric( cFont ) - - ELSE - IF !empty( xFont ) - cFont := xFont - s := lower( cFont ) - n := ascan( aAttr, {|e| at( e, cFont ) > 0 } ) - IF n > 0 - cAttr := aAttr[ n ] - n := at( cAttr, s ) - cFont := substr( cFont,1,n-1 ) - ELSE - cAttr := "normal" - ENDIF - - IF ( n := at( ".", cFont ) ) > 0 - nPoint := val( substr( cFont,1,n-1 ) ) - cFont := substr( cFont,n+1 ) - ELSE - nPoint := 0 - ENDIF - - cFace := alltrim( cFont ) - - HB_SYMBOL_UNUSED( cFace ) - HB_SYMBOL_UNUSED( cAttr ) - HB_SYMBOL_UNUSED( nPoint ) - ENDIF - ENDIF - - RETURN cOldFont - -/*----------------------------------------------------------------------*/ - METHOD XbpWindow:setPresParam() RETURN Self