diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 27b9f16718..c4cb2fde30 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,14 @@ The license applies to all entries newer than 2009-04-28. */ +2012-08-16 18:52 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + + contrib/hbqt/tests/browarray.prg + + Added: an array browser which also allows to add data rows + to the existing array. This facilitates the understanding + of HBQAbstractItemModel()'s internal working. This commit + answers to many question posted in the mailing-list and + also directed to my mail-box. + 2012-08-15 15:55 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbide/edit.prg ! Fixed: a nasty side-effect of pair-matching; weired editing behaviour. diff --git a/harbour/contrib/hbqt/tests/browarray.prg b/harbour/contrib/hbqt/tests/browarray.prg new file mode 100644 index 0000000000..1d683e7df8 --- /dev/null +++ b/harbour/contrib/hbqt/tests/browarray.prg @@ -0,0 +1,253 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * + * Copyright 2010 Carlos Bacco + * www - http://harbour-project.org + * + */ + +#include "hbqtgui.ch" +#include "hbtrace.ch" +#include "common.ch" + +STATIC oSize +STATIC nCX +STATIC nCY +STATIC aData +STATIC oColorC +STATIC oColorN +STATIC oColorD +STATIC oColorLY +STATIC oColorLN + +#define _method_local_ + +PROCEDURE Main() + LOCAL tb1, mo1, lay1, lay2, bt1, bt2, bt3, hd1, i + LOCAL oWnd, oDA, aStruct +#ifdef _method_local_ + LOCAL oID, oSM +#endif + + hbqt_errorsys() + + SET DATE ANSI + SET CENTURY ON + + oColorN := QColor( 100, 0,100 ) + oColorD := QColor( 150, 100, 0 ) + oColorLY:= QColor( 0, 150, 0 ) + oColorLN:= QColor( 200, 0, 0 ) + + aStruct := {} + AAdd( aStruct, { "Name" , "C", 8, 0 } ) + AAdd( aStruct, { "DOB" , "D", 8, 0 } ) + AAdd( aStruct, { "PAY" , "N", 5, 0 } ) + AAdd( aStruct, { "MARRIED", "L", 1, 0 } ) + + aData := {} + AAdd( aData, { "Andy" , SToD( "20120525" ), 200, .T. } ) + AAdd( aData, { "Tomy" , SToD( "20120617" ), 300, .F. } ) + AAdd( aData, { "Zindal", SToD( "20121213" ), 100, .F. } ) + + oWnd := QMainWindow() + oWnd:resize(640,460 ) + + oDA := QWidget() + oWnd:setCentralWidget( oDA ) + lay1 := QVBoxLayout( oDA ) + + nCX := 0 + nCY := 0 + tb1 := QTableView() + mo1 := HBQAbstractItemModel( {| t, r, x, y| my_browse( aStruct, t, r, x, y ) } ) + tb1:setModel( mo1 ) + +#ifdef _method_local_ + oID := tb1:itemDelegate() + oID:connect( "commitData(QWidget*)", {| w | my_save( w, aStruct, @nCX, @nCY ) } ) + + oSM := tb1:selectionModel() + oSM:connect( "currentChanged(QModelIndex,QModelIndex)", {| n | my_select( n, @nCX, @nCY ) } ) +#else + connect( tb1, aStruct, @nCX, @nCY ) +#endif + + hd1 := tb1:horizontalHeader() + FOR i := 1 To Len( aStruct ) + hd1:resizeSection( i - 1, aStruct[ i, 3 ] * 6 + 60 ) + NEXT + tb1:verticalHeader():setDefaultSectionSize( 24 ) + + oSize := QSize(50,24) + + lay1:addWidget( tb1 ) + + lay2 := QHBoxLayout() + lay1:addlayout( lay2 ) + + ( bt1 := QPushButton() ):SetText( "Add Row" ) + bt1:connect( "clicked()", {|| my_addRow( mo1 ) } ) + + ( bt2 := QPushButton() ):SetText( "Dummy 2" ) + ( bt3 := QPushButton() ):SetText( "Dummy 3" ) + + + lay2:addWidget( bt1 ) + lay2:addStretch() + lay2:addWidget( bt2 ) + lay2:addWidget( bt3 ) + + oWnd:Show() + QApplication():exec() + + RETURN + +STATIC PROCEDURE my_save( qWidget, aStru, nCX, nCY ) + LOCAL cData := qWidget:property( "text" ):toString() + LOCAL nRow := nCY + 1 + LOCAL nCol := nCX + 1 + + SWITCH aStru[ nCol, 2 ] + CASE "C" + aData[ nRow, nCol ] := AllTrim( cData ) + EXIT + CASE "N" + aData[ nRow, nCol ] := Val( cData ) + EXIT + CASE "L" + aData[ nRow, nCol ] := Left( cData, 1 ) $ "YyTt" + EXIT + CASE "D" + aData[ nRow, nCol ] := CToD( cData ) + EXIT + ENDSWITCH + RETURN + +STATIC PROCEDURE my_select( qModelIndex, nCX, nCY ) + + nCX := qModelIndex:column() + nCY := qModelIndex:row() + + RETURN + +STATIC FUNCTION my_browse( aStru, t, role, nX, nY ) + LOCAL nRow := nY + 1 /* Harbour array is 1 based */ + LOCAL nCol := nX + 1 + + SWITCH t + CASE HBQT_QAIM_flags + RETURN Qt_ItemIsEnabled + Qt_ItemIsSelectable + Qt_ItemIsEditable; + + CASE HBQT_QAIM_data + + SWITCH role + CASE Qt_DisplayRole + SWITCH aStru[ nCol, 2 ] + CASE "C" + RETURN AllTrim( aData[ nRow, nCol ] ) + CASE "N" + RETURN hb_ntos( aData[ nRow, nCol ] ) + CASE "L" + RETURN iif( aData[ nRow, nCol ], "Yes", "No" ) + CASE "D" + RETURN DToC( aData[ nRow, nCol ] ) + ENDSWITCH + RETURN "?" + + CASE Qt_EditRole /* Here we can specify different formats for editing*/ + SWITCH aStru[ nCol, 2 ] + CASE "C" + RETURN AllTrim( aData[ nRow, nCol ] ) + CASE "N" + RETURN hb_ntos( aData[ nRow, nCol ] ) + CASE "L" + RETURN iif( aData[ nRow, nCol ], "Y", "N" ) + CASE "D" + RETURN DToC( aData[ nRow, nCol ] ) + ENDSWITCH + RETURN "?" + + CASE Qt_ForegroundRole + SWITCH aStru[ nCol, 2 ] + CASE "N" + RETURN oColorN + CASE "L" + RETURN iif( aData[ nRow, nCol ], oColorLY, oColorLN ) + CASE "D" + RETURN oColorD + ENDSWITCH + RETURN NIL + + CASE Qt_BackgroundRole + RETURN NIL + + CASE Qt_TextAlignmentRole + SWITCH aStru[ nCol, 2 ] + CASE "C" + RETURN Qt_AlignVCenter + Qt_AlignLeft + CASE "N" + RETURN Qt_AlignVCenter + Qt_AlignRight + ENDSWITCH + RETURN Qt_AlignCenter + ENDSWITCH + RETURN NIL + + CASE HBQT_QAIM_headerData + SWITCH role + CASE Qt_DisplayRole + IF nX == Qt_Horizontal + RETURN aStru[ nRow, 1 ] + ELSE + RETURN hb_NToS( nRow ) + ENDIF + + CASE Qt_TextAlignmentRole + IF nX == Qt_Horizontal + RETURN Qt_AlignCenter + ELSE + RETURN Qt_AlignVCenter + Qt_AlignRight + ENDIF + + CASE Qt_SizeHintRole + RETURN oSize + ENDSWITCH + RETURN NIL + + CASE HBQT_QAIM_rowCount + RETURN Len( aData ) + + CASE HBQT_QAIM_columnCount + RETURN Len( aStru ) + ENDSWITCH + + RETURN NIL + +STATIC FUNCTION connect( tb1, aStruct, nCX1, nCY1 ) + LOCAL oID, oSM + + oID := tb1:itemDelegate() + oID:connect( "commitData(QWidget*)", {| w | my_save( w, aStruct, @nCX1, @nCY1 ) } ) + + oSM := tb1:selectionModel() + oSM:connect( "currentChanged(QModelIndex,QModelIndex)", {| n | my_select( n, @nCX1, @nCY1 ) } ) + + RETURN NIL + +STATIC FUNCTION my_addRow( oHBQAbsModel ) + + STATIC nPay := 400 + nPay += 30 + + AAdd( aData, { "Kitty", SToD( "20120625" ), nPay, .T. } ) + + oHBQAbsModel:reset() /* Re-populate the model */ + + RETURN .T. + +/*----------------------------------------------------------------------*/ +