⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rowdragpl.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{    int xOfs = (inRect.width - ICON_TRIAN_WIDTH)/2;    wxBrush br( mTrianInnerColor, wxSOLID );    dc.SetBrush( br );    dc.SetPen( mpLayout->mBlackPen );    wxPoint points[3];    points[0].x = inRect.x + xOfs;    points[0].y = inRect.y;    points[1].x = inRect.x + xOfs + ICON_TRIAN_WIDTH;    points[1].y = inRect.y;    points[2].x = inRect.x + xOfs + ICON_TRIAN_WIDTH/2;    points[2].y = inRect.y + ICON_TRIAN_HEIGHT;    dc.DrawPolygon( 3, points );    // higlight upper-right edge of triangle    dc.SetPen( mpLayout->mLightPen );    dc.DrawLine( points[2].x, points[2].y,                 points[1].x, points[1].y );    dc.SetBrush( wxNullBrush );}void cbRowDragPlugin::DrawTrianRight( wxRect& inRect, wxDC& dc ){    int yOfs = (inRect.height - ICON_TRIAN_WIDTH)/2;    wxBrush br( mTrianInnerColor, wxSOLID );    dc.SetBrush( br );    dc.SetPen( mpLayout->mBlackPen );    wxPoint points[3];    points[0].x = inRect.x;    points[0].y = inRect.y + yOfs + ICON_TRIAN_WIDTH;    points[1].x = inRect.x;    points[1].y = inRect.y + yOfs;    points[2].x = inRect.x + ICON_TRIAN_HEIGHT;    points[2].y = inRect.y + yOfs + ICON_TRIAN_WIDTH/2;    dc.DrawPolygon( 3, points );    // higlight upper-right edge of triangle    dc.SetPen( mpLayout->mLightPen );    dc.DrawLine( points[0].x, points[0].y,                 points[2].x, points[2].y );    dc.SetBrush( wxNullBrush );}void cbRowDragPlugin::Draw3DPattern( wxRect& inRect, wxDC& dc ){    for( int y = inRect.y; y < inRect.y + inRect.height; y+=3 )            for( int x = inRect.x; x < inRect.x + inRect.width; x+=3 )        {            dc.SetPen( mpLayout->mLightPen );            dc.DrawPoint( x,y );            dc.SetPen( mpLayout->mBlackPen );            dc.DrawPoint( x+1, y+1 );        }}void cbRowDragPlugin::DrawRombShades( wxPoint& p1, wxPoint& p2,                                       wxPoint& p3, wxPoint& p4,                                      wxDC& dc ){    dc.SetPen( mpLayout->mLightPen );    dc.DrawLine( p1.x, p1.y, p2.x, p2.y );    dc.DrawLine( p2.x, p2.y, p3.x, p3.y );    dc.SetPen( mpLayout->mDarkPen );    dc.DrawLine( p3.x, p3.y, p4.x, p4.y );    dc.DrawLine( p4.x, p4.y, p1.x, p1.y );}void cbRowDragPlugin::DrawOrtoRomb( wxRect& inRect, wxDC& dc, const wxBrush& bkBrush ){    dc.SetBrush( bkBrush );    dc.SetPen( mpLayout->mBlackPen );    wxPoint points[4];    if ( inRect.width > inRect.height )    {        // horizontal orienation        points[0].x = inRect.x;        points[0].y = inRect.y + inRect.height;        points[1].x = inRect.x;        points[1].y = inRect.y;        points[2].x = inRect.x + inRect.width;        points[2].y = inRect.y;        points[3].x = inRect.x + inRect.width - COLLAPSED_ICON_HEIGHT;        points[3].y = inRect.y + inRect.height;        dc.DrawPolygon( 4, points );        // squeeze romb's bounds to create an inner-shade shape        ++points[0].x;        --points[0].y;        ++points[1].x;        ++points[1].y;        --points[2].x; --points[2].x;        ++points[2].y;        --points[3].y;        DrawRombShades( points[0], points[1], points[2], points[3], dc );    }    else    {        // vertical orientation        points[0].x = inRect.x + inRect.width;        points[0].y = inRect.y + inRect.height;        points[1].x = inRect.x;        points[1].y = inRect.y + inRect.height;        points[2].x = inRect.x;        points[2].y = inRect.y;        points[3].x = inRect.x + inRect.width;        points[3].y = inRect.y + COLLAPSED_ICON_HEIGHT;        dc.DrawPolygon( 4, points );        // squeeze romb's bounds to create an inner-shade shape        --points[0].y ;        --points[0].x;        ++points[1].x;        --points[1].y;        ++points[2].y; ++points[2].y;        ++points[2].x;        --points[3].x;        DrawRombShades( points[1], points[2], points[3], points[0], dc );    }    dc.SetBrush( wxNullBrush );}void cbRowDragPlugin::DrawRomb( wxRect& inRect, wxDC& dc, const wxBrush& bkBrush ){    wxPoint points[4];    dc.SetBrush( bkBrush );    dc.SetPen( mpLayout->mBlackPen );    if ( inRect.width > inRect.height )    {        // horizontal orientation        points[0].x = inRect.x;        points[0].y = inRect.y + inRect.height;        points[1].x = inRect.x + COLLAPSED_ICON_HEIGHT;        points[1].y = inRect.y;        points[2].x = inRect.x + inRect.width;        points[2].y = inRect.y;        points[3].x = inRect.x + inRect.width - COLLAPSED_ICON_HEIGHT;        points[3].y = inRect.y + inRect.height;        dc.DrawPolygon( 4, points );        // squeeze romb's bounds to create an inner-shade shape        ++points[0].x ;++points[0].x ;        --points[0].y;        ++points[1].y;        --points[2].x; --points[2].x;        ++points[2].y;        //--points[3].x ;        --points[3].y;        DrawRombShades( points[0], points[1], points[2], points[3], dc );    }    else    {        // vertical orientation        points[0].x = inRect.x + inRect.width;        points[0].y = inRect.y + inRect.height;        points[1].x = inRect.x;        points[1].y = inRect.y + inRect.height - COLLAPSED_ICON_HEIGHT;        points[2].x = inRect.x;        points[2].y = inRect.y;        points[3].x = inRect.x + inRect.width;        points[3].y = inRect.y + COLLAPSED_ICON_HEIGHT;        dc.DrawPolygon( 4, points );        // squeeze romb's bounds to create an inner-shade shape        --points[0].y ;--points[0].y ;        --points[0].x;        ++points[1].x;        ++points[2].y; ++points[2].y;        ++points[2].x;        --points[3].x;        DrawRombShades( points[1], points[2], points[3], points[0], dc );    }    dc.SetBrush( wxNullBrush );}void cbRowDragPlugin::DrawRectShade( wxRect& inRect, wxDC& dc,                                      int level, const wxPen& upperPen, const wxPen& lowerPen ){    // upper shade    dc.SetPen( upperPen );    dc.DrawLine( inRect.x - level,                  inRect.y - level,                  inRect.x + inRect.width - 1 + level,                  inRect.y - level);    dc.DrawLine( inRect.x - level, inRect.y - level,                 inRect.x - level, inRect.y + inRect.height - 1 + level );    // lower shade    dc.SetPen( lowerPen );    dc.DrawLine( inRect.x - level,                  inRect.y + inRect.height - 1 + level,                 inRect.x + inRect.width  + level,                 inRect.y + inRect.height - 1 + level);    dc.DrawLine( inRect.x + inRect.width - 1 + level,                 inRect.y - level,                 inRect.x + inRect.width - 1 + level,                 inRect.y + inRect.height + level);    dc.SetBrush( wxNullBrush );}void cbRowDragPlugin::Draw3DRect( wxRect& inRect, wxDC& dc, const wxBrush& bkBrush ){    dc.SetPen( mpLayout->mNullPen );    dc.SetBrush( bkBrush );    dc.DrawRectangle( inRect.x, inRect.y,                      inRect.width, inRect.height );    DrawRectShade( inRect, dc, 0, mpLayout->mLightPen, mpLayout->mDarkPen );}int  cbRowDragPlugin::GetCollapsedIconsPos(){    RowArrayT& rows = mpPane->GetRowList();    if ( rows.GetCount() == 0 )     {        if ( mpPane->IsHorizontal() )                        return mpPane->mBoundsInParent.y + mpPane->mTopMargin;        else            return mpPane->mBoundsInParent.x + mpPane->mLeftMargin;    }    wxRect& bounds = rows[ rows.GetCount() - 1 ]->mBoundsInParent;    if ( mpPane->IsHorizontal() )        return bounds.y + bounds.height + 1;    else        return bounds.x + bounds.width  + 1;}void cbRowDragPlugin::GetRowHintRect( cbRowInfo* pRow, wxRect& rect ){    wxRect& bounds = pRow->mBoundsInParent;    if ( mpPane->IsHorizontal() )    {        rect.x = bounds.x - ROW_DRAG_HINT_WIDTH - 1;        rect.y = bounds.y;        rect.width = ROW_DRAG_HINT_WIDTH;        rect.height = bounds.height;    }    else    {        rect.x = bounds.x;        rect.y = bounds.y + bounds.height + 1;        rect.width = bounds.width;        rect.height = ROW_DRAG_HINT_WIDTH;    }}void cbRowDragPlugin::GetCollapsedInconRect( int iconIdx, wxRect& rect ){    int upper = GetCollapsedIconsPos();    int right = (iconIdx == 0 )                 ? 0 : iconIdx * (COLLAPSED_ICON_WIDTH - COLLAPSED_ICON_HEIGHT);    if ( mpPane->IsHorizontal() )    {        rect.x = mpPane->mBoundsInParent.x + mpPane->mLeftMargin - ROW_DRAG_HINT_WIDTH - 1                 + right;        rect.y = upper;        rect.width  = COLLAPSED_ICON_WIDTH;        rect.height = COLLAPSED_ICON_HEIGHT;    }    else    {         rect.x = upper;         rect.y = mpPane->mBoundsInParent.y + mpPane->mBoundsInParent.height                  - mpPane->mBottomMargin + ROW_DRAG_HINT_WIDTH + 1                 - right - COLLAPSED_ICON_WIDTH;        rect.height = COLLAPSED_ICON_WIDTH;        rect.width  = COLLAPSED_ICON_HEIGHT;    }}/*** overridables ***/void cbRowDragPlugin::DrawCollapsedRowIcon( int index, wxDC& dc, bool isHighlighted ){    wxRect rect;    GetCollapsedInconRect( index, rect );    wxBrush  hiBrush ( mHightColor, wxSOLID );    wxBrush  lowBrush( mLowColor,   wxSOLID );    wxBrush& curBrush = ( isHighlighted ) ? hiBrush : lowBrush;    if ( mpPane->IsHorizontal() )    {                         if ( index == 0 )            DrawOrtoRomb( rect, dc, curBrush );        else            DrawRomb( rect, dc, curBrush );        int triOfs = (index == 0) ? TRIANGLE_OFFSET : TRIANGLE_OFFSET + COLLAPSED_ICON_HEIGHT;        wxRect triRect;        triRect.x = triOfs + rect.x;        triRect.width = ICON_TRIAN_HEIGHT;        triRect.y = rect.y;        triRect.height = rect.height;        DrawTrianRight( triRect, dc );        wxRect patRect;        patRect.x      = triOfs + ICON_TRIAN_HEIGHT + TRIANGLE_TO_PAT_GAP + rect.x;        patRect.y      = rect.y + PAT_OFFSET;         patRect.width  = rect.width - (patRect.x - rect.x) - COLLAPSED_ICON_HEIGHT - PAT_OFFSET;        patRect.height = rect.height - PAT_OFFSET*2;        Draw3DPattern( patRect, dc );    }    else    {        if ( index == 0 )            DrawOrtoRomb( rect, dc, curBrush );        else            DrawRomb( rect, dc, curBrush );        int triOfs = (index == 0)                      ? TRIANGLE_OFFSET + ICON_TRIAN_HEIGHT                     : TRIANGLE_OFFSET + COLLAPSED_ICON_HEIGHT + ICON_TRIAN_HEIGHT;        wxRect triRect;        triRect.y      = rect.y + rect.height - triOfs;        triRect.x      = rect.x;        triRect.width  = rect.width;        triRect.height = ICON_TRIAN_HEIGHT;        DrawTrianUp( triRect, dc );        wxRect patRect;        patRect.y      = rect.y + COLLAPSED_ICON_HEIGHT + PAT_OFFSET;        patRect.x      = rect.x + PAT_OFFSET;         patRect.width  = rect.width - 2*PAT_OFFSET ;        patRect.height = rect.height - triOfs - 2*PAT_OFFSET - COLLAPSED_ICON_HEIGHT;        Draw3DPattern( patRect, dc );    }}void cbRowDragPlugin::DrawRowDragHint( cbRowInfo* pRow , wxDC& dc, bool isHighlighted ){    wxRect rect;    GetRowHintRect( pRow, rect );    wxBrush  hiBrush ( mHightColor, wxSOLID );    wxBrush  lowBrush( mLowColor,   wxSOLID );    wxBrush& curBrush = ( isHighlighted ) ? hiBrush : lowBrush;    Draw3DRect( rect, dc, curBrush );    if ( mpPane->IsHorizontal() )    {        wxRect triRect;        triRect.y       = rect.y + TRIANGLE_OFFSET;        triRect.x       = rect.x;        triRect.width  = rect.width;        triRect.height = ICON_TRIAN_HEIGHT;        DrawTrianDown( triRect, dc );        wxRect patRect;        patRect.x      = rect.x + PAT_OFFSET;        patRect.y      = rect.y + TRIANGLE_OFFSET + ICON_TRIAN_HEIGHT + TRIANGLE_TO_PAT_GAP;        patRect.width  = rect.width - 2*PAT_OFFSET;        patRect.height = rect.height - ( patRect.y - rect.y ) - PAT_OFFSET;        Draw3DPattern( patRect, dc );        dc.SetPen( mpLayout->mLightPen );        dc.DrawLine( rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height );    }    else    {        wxRect triRect;        triRect.x       = rect.x + TRIANGLE_OFFSET;        triRect.y       = rect.y;        triRect.height = rect.height;        triRect.width  = ICON_TRIAN_HEIGHT;        DrawTrianRight( triRect, dc );        wxRect patRect;        patRect.y      = rect.y + PAT_OFFSET;        patRect.x      = rect.x + TRIANGLE_OFFSET + ICON_TRIAN_HEIGHT + TRIANGLE_TO_PAT_GAP;        patRect.height = rect.height - 2*PAT_OFFSET;        patRect.width  = rect.width - ( patRect.x - rect.x ) - PAT_OFFSET;        Draw3DPattern( patRect, dc );        dc.SetPen( mpLayout->mLightPen );        dc.DrawLine( rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height );    }}void cbRowDragPlugin::DrawRowsDragHintsBorder( wxDC& WXUNUSED(dc) ){    // FIXME:: what was that?}void cbRowDragPlugin::DrawCollapsedRowsBorder( wxDC& dc ){    int colRowOfs = GetCollapsedIconsPos();    wxRect& bounds = mpPane->mBoundsInParent;    wxBrush bkBrush( mpLayout->mGrayPen.GetColour(), wxSOLID );    dc.SetBrush( bkBrush );    dc.SetPen( mpLayout->mDarkPen );    if ( mpPane->IsHorizontal() )            dc.DrawRectangle( bounds.x + mpPane->mLeftMargin - ROW_DRAG_HINT_WIDTH - 1,                          colRowOfs,                          bounds.width - mpPane->mLeftMargin - mpPane->mRightMargin + 2 + ROW_DRAG_HINT_WIDTH,                          COLLAPSED_ICON_HEIGHT + 1);    else        dc.DrawRectangle( colRowOfs,                          bounds.y + mpPane->mTopMargin - 1,                          COLLAPSED_ICON_HEIGHT + 1,                          bounds.height - mpPane->mTopMargin - mpPane->mBottomMargin                           - ROW_DRAG_HINT_WIDTH - 2 );    dc.SetBrush( wxNullBrush );}static inline bool rect_contains_point( const wxRect& rect, int x, int y ){    return ( x >= rect.x &&             y >= rect.y &&             x <  rect.x + rect.width  &&             y <  rect.y + rect.height );}bool cbRowDragPlugin::HitTestCollapsedRowIcon( int iconIdx, const wxPoint& pos ){    wxRect bounds;    GetCollapsedInconRect( iconIdx, bounds );    return rect_contains_point( bounds, pos.x, pos.y );}bool cbRowDragPlugin::HitTestRowDragHint( cbRowInfo* pRow, const wxPoint& pos ){    wxRect bounds;    GetRowHintRect( pRow, bounds );    return rect_contains_point( bounds, pos.x, pos.y );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -