VirtualBox

Changeset 103403 in vbox


Ignore:
Timestamp:
Feb 17, 2024 1:51:52 AM (10 months ago)
Author:
vboxsync
Message:

VBoxDbg: Added sorting to the statistics as well as filtering out unused rows by default.

Location:
trunk/src/VBox/Debugger
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/VBoxDbgStatsQt.cpp

    r102839 r103403  
    3737#include <QSpinBox>
    3838#include <QLabel>
     39#include <QCheckBox>
    3940#include <QClipboard>
    4041#include <QApplication>
     
    4546#include <QContextMenuEvent>
    4647#include <QHeaderView>
     48#include <QSortFilterProxyModel>
    4749
    4850#include <iprt/errcore.h>
     
    6062/** The number of column. */
    6163#define DBGGUI_STATS_COLUMNS    9
     64
     65/** Enables the sorting and filtering. */
     66#define VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
    6267
    6368
     
    545550    void logTree(QModelIndex &a_rRoot, bool a_fReleaseLog) const;
    546551
    547 protected:
    548552    /** Gets the unit. */
    549553    static QString strUnit(PCDBGGUISTATSNODE pNode);
    550554    /** Gets the value/times. */
    551555    static QString strValueTimes(PCDBGGUISTATSNODE pNode);
     556    /** Gets the value/times. */
     557    static uint64_t getValueTimesAsUInt(PCDBGGUISTATSNODE pNode);
    552558    /** Gets the minimum value. */
    553559    static QString strMinValue(PCDBGGUISTATSNODE pNode);
     560    /** Gets the minimum value. */
     561    static uint64_t getMinValueAsUInt(PCDBGGUISTATSNODE pNode);
    554562    /** Gets the average value. */
    555563    static QString strAvgValue(PCDBGGUISTATSNODE pNode);
     564    /** Gets the average value. */
     565    static uint64_t getAvgValueAsUInt(PCDBGGUISTATSNODE pNode);
    556566    /** Gets the maximum value. */
    557567    static QString strMaxValue(PCDBGGUISTATSNODE pNode);
     568    /** Gets the maximum value. */
     569    static uint64_t getMaxValueAsUInt(PCDBGGUISTATSNODE pNode);
    558570    /** Gets the total value. */
    559571    static QString strTotalValue(PCDBGGUISTATSNODE pNode);
     572    /** Gets the total value. */
     573    static uint64_t getTotalValueAsUInt(PCDBGGUISTATSNODE pNode);
    560574    /** Gets the delta value. */
    561575    static QString strDeltaValue(PCDBGGUISTATSNODE pNode);
    562576
     577
     578protected:
    563579    /**
    564580     * Destroys a node and all its children.
     
    585601    /** @name Overridden QAbstractItemModel methods
    586602     * @{ */
    587     virtual int columnCount(const QModelIndex &a_rParent) const;
    588     virtual QVariant data(const QModelIndex &a_rIndex, int a_eRole) const;
    589     virtual Qt::ItemFlags flags(const QModelIndex &a_rIndex) const;
    590     virtual bool hasChildren(const QModelIndex &a_rParent) const;
    591     virtual QVariant headerData(int a_iSection, Qt::Orientation a_ePrientation, int a_eRole) const;
    592     virtual QModelIndex index(int a_iRow, int a_iColumn, const QModelIndex &a_rParent) const;
    593     virtual QModelIndex parent(const QModelIndex &a_rChild) const;
    594     virtual int rowCount(const QModelIndex &a_rParent) const;
    595     ///virtual void sort(int a_iColumn, Qt::SortOrder a_eOrder);
     603    virtual int columnCount(const QModelIndex &a_rParent) const RT_OVERRIDE;
     604    virtual QVariant data(const QModelIndex &a_rIndex, int a_eRole) const RT_OVERRIDE;
     605    virtual Qt::ItemFlags flags(const QModelIndex &a_rIndex) const RT_OVERRIDE;
     606    virtual bool hasChildren(const QModelIndex &a_rParent) const RT_OVERRIDE;
     607    virtual QVariant headerData(int a_iSection, Qt::Orientation a_ePrientation, int a_eRole) const RT_OVERRIDE;
     608    virtual QModelIndex index(int a_iRow, int a_iColumn, const QModelIndex &a_rParent) const RT_OVERRIDE;
     609    virtual QModelIndex parent(const QModelIndex &a_rChild) const RT_OVERRIDE;
     610    virtual int rowCount(const QModelIndex &a_rParent) const RT_OVERRIDE;
     611    ///virtual void sort(int a_iColumn, Qt::SortOrder a_eOrder) RT_OVERRIDE;
    596612    /** @}  */
    597613};
     
    640656    PCVMMR3VTABLE m_pVMM;
    641657};
     658
     659
     660#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     661/**
     662 * Model using the VM / STAM interface as data source.
     663 */
     664class VBoxDbgStatsSortFileProxyModel : public QSortFilterProxyModel
     665{
     666public:
     667    /**
     668     * Constructor.
     669     *
     670     * @param   a_pParent       The parent object.
     671     */
     672    VBoxDbgStatsSortFileProxyModel(QObject *a_pParent);
     673
     674    /** Destructor */
     675    virtual ~VBoxDbgStatsSortFileProxyModel()
     676    {}
     677
     678    /** Sets whether or not to show unused rows (all zeros). */
     679    void setShowUnusedRows(bool a_fHide);
     680
     681protected:
     682    /**
     683     * Converts an index to a node pointer.
     684     *
     685     * @returns Pointer to the node, NULL if invalid reference.
     686     * @param   a_rIndex        Reference to the index
     687     */
     688    inline PDBGGUISTATSNODE nodeFromIndex(const QModelIndex &a_rIndex) const
     689    {
     690        if (RT_LIKELY(a_rIndex.isValid()))
     691            return (PDBGGUISTATSNODE)a_rIndex.internalPointer();
     692        return NULL;
     693    }
     694
     695    /** Does the row filtering. */
     696    bool filterAcceptsRow(int a_iSrcRow,  const QModelIndex &a_rSrcParent) const RT_OVERRIDE;
     697    /** For implementing the sorting. */
     698    bool lessThan(const QModelIndex &a_rSrcLeft, const QModelIndex &a_rSrcRight) const RT_OVERRIDE;
     699
     700    /** Whether to show unused rows (all zeros) or not. */
     701    bool m_fShowUnusedRows;
     702};
     703#endif /* VBOXDBG_WITH_SORTED_AND_FILTERED_STATS */
    642704
    643705
     
    9751037    else
    9761038    {
    977         beginInsertRows(createIndex(pParent->iSelf, 0, pParent), 0, 0);
     1039        beginInsertRows(createIndex(pParent->iSelf, 0, pParent), iPosition, iPosition);
    9781040        pNode = createAndInsertNode(pParent, pszName, cchName, iPosition);
    9791041        endInsertRows();
     
    22192281
    22202282    /* root?  */
    2221     AssertReturn(a_rParent.isValid(), QModelIndex());
     2283    AssertReturn(a_rParent.isValid() || (iRow == 0 && iColumn >= 0), QModelIndex());
    22222284    AssertMsgReturn(iRow == 0 && (unsigned)iColumn < DBGGUI_STATS_COLUMNS, ("iRow=%d iColumn=%d", iRow, iColumn), QModelIndex());
    22232285    return createIndex(0, iColumn, m_pRoot);
     
    23682430
    23692431
     2432/*static*/ uint64_t
     2433VBoxDbgStatsModel::getValueTimesAsUInt(PCDBGGUISTATSNODE pNode)
     2434{
     2435    switch (pNode->enmType)
     2436    {
     2437        case STAMTYPE_COUNTER:
     2438            return pNode->Data.Counter.c;
     2439
     2440        case STAMTYPE_PROFILE:
     2441        case STAMTYPE_PROFILE_ADV:
     2442            return pNode->Data.Profile.cPeriods;
     2443
     2444        case STAMTYPE_RATIO_U32:
     2445        case STAMTYPE_RATIO_U32_RESET:
     2446            return RT_MAKE_U64(pNode->Data.RatioU32.u32A, pNode->Data.RatioU32.u32B);
     2447
     2448        case STAMTYPE_CALLBACK:
     2449            return UINT64_MAX;
     2450
     2451        case STAMTYPE_U8:
     2452        case STAMTYPE_U8_RESET:
     2453        case STAMTYPE_X8:
     2454        case STAMTYPE_X8_RESET:
     2455            return pNode->Data.u8;
     2456
     2457        case STAMTYPE_U16:
     2458        case STAMTYPE_U16_RESET:
     2459        case STAMTYPE_X16:
     2460        case STAMTYPE_X16_RESET:
     2461            return pNode->Data.u16;
     2462
     2463        case STAMTYPE_U32:
     2464        case STAMTYPE_U32_RESET:
     2465        case STAMTYPE_X32:
     2466        case STAMTYPE_X32_RESET:
     2467            return pNode->Data.u32;
     2468
     2469        case STAMTYPE_U64:
     2470        case STAMTYPE_U64_RESET:
     2471        case STAMTYPE_X64:
     2472        case STAMTYPE_X64_RESET:
     2473            return pNode->Data.u64;
     2474
     2475        case STAMTYPE_BOOL:
     2476        case STAMTYPE_BOOL_RESET:
     2477            return pNode->Data.f;
     2478
     2479        default:
     2480            AssertMsgFailed(("%d\n", pNode->enmType));
     2481            RT_FALL_THRU();
     2482        case STAMTYPE_INVALID:
     2483            return UINT64_MAX;
     2484    }
     2485}
     2486
     2487
    23702488/*static*/ QString
    23712489VBoxDbgStatsModel::strMinValue(PCDBGGUISTATSNODE pNode)
     
    23862504
    23872505
     2506/*static*/ uint64_t
     2507VBoxDbgStatsModel::getMinValueAsUInt(PCDBGGUISTATSNODE pNode)
     2508{
     2509    switch (pNode->enmType)
     2510    {
     2511        case STAMTYPE_PROFILE:
     2512        case STAMTYPE_PROFILE_ADV:
     2513            if (pNode->Data.Profile.cPeriods)
     2514                return pNode->Data.Profile.cTicksMin;
     2515            return 0; /* cTicksMin is set to UINT64_MAX */
     2516        default:
     2517            return UINT64_MAX;
     2518    }
     2519}
     2520
     2521
    23882522/*static*/ QString
    23892523VBoxDbgStatsModel::strAvgValue(PCDBGGUISTATSNODE pNode)
     
    24042538
    24052539
     2540/*static*/ uint64_t
     2541VBoxDbgStatsModel::getAvgValueAsUInt(PCDBGGUISTATSNODE pNode)
     2542{
     2543    switch (pNode->enmType)
     2544    {
     2545        case STAMTYPE_PROFILE:
     2546        case STAMTYPE_PROFILE_ADV:
     2547            if (pNode->Data.Profile.cPeriods)
     2548                return pNode->Data.Profile.cTicks / pNode->Data.Profile.cPeriods;
     2549            return 0;
     2550        default:
     2551            return UINT64_MAX;
     2552    }
     2553}
     2554
     2555
     2556
    24062557/*static*/ QString
    24072558VBoxDbgStatsModel::strMaxValue(PCDBGGUISTATSNODE pNode)
     
    24202571
    24212572
     2573/*static*/ uint64_t
     2574VBoxDbgStatsModel::getMaxValueAsUInt(PCDBGGUISTATSNODE pNode)
     2575{
     2576    switch (pNode->enmType)
     2577    {
     2578        case STAMTYPE_PROFILE:
     2579        case STAMTYPE_PROFILE_ADV:
     2580            return pNode->Data.Profile.cTicksMax;
     2581        default:
     2582            return UINT64_MAX;
     2583    }
     2584}
     2585
     2586
    24222587/*static*/ QString
    24232588VBoxDbgStatsModel::strTotalValue(PCDBGGUISTATSNODE pNode)
     
    24322597        default:
    24332598            return "";
     2599    }
     2600}
     2601
     2602
     2603/*static*/ uint64_t
     2604VBoxDbgStatsModel::getTotalValueAsUInt(PCDBGGUISTATSNODE pNode)
     2605{
     2606    switch (pNode->enmType)
     2607    {
     2608        case STAMTYPE_PROFILE:
     2609        case STAMTYPE_PROFILE_ADV:
     2610            return pNode->Data.Profile.cTicks;
     2611        default:
     2612            return UINT64_MAX;
    24342613    }
    24352614}
     
    28563035/*
    28573036 *
     3037 *      V B o x D b g S t a t s S o r t F i l e P r o x y M o d e l
     3038 *      V B o x D b g S t a t s S o r t F i l e P r o x y M o d e l
     3039 *      V B o x D b g S t a t s S o r t F i l e P r o x y M o d e l
     3040 *
     3041 *
     3042 */
     3043
     3044#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     3045
     3046VBoxDbgStatsSortFileProxyModel::VBoxDbgStatsSortFileProxyModel(QObject *a_pParent)
     3047    : QSortFilterProxyModel(a_pParent)
     3048    , m_fShowUnusedRows(false)
     3049{
     3050
     3051}
     3052
     3053
     3054bool
     3055VBoxDbgStatsSortFileProxyModel::filterAcceptsRow(int a_iSrcRow, const QModelIndex &a_rSrcParent) const
     3056{
     3057    if (!m_fShowUnusedRows)
     3058    {
     3059        PDBGGUISTATSNODE const pParent = nodeFromIndex(a_rSrcParent);
     3060        if (pParent)
     3061        {
     3062            if ((unsigned)a_iSrcRow < pParent->cChildren)
     3063            {
     3064                PDBGGUISTATSNODE const pNode = pParent->papChildren[a_iSrcRow];
     3065                if (pNode) /* paranoia */
     3066                {
     3067                    /* Only relevant for leaf nodes. */
     3068                    if (pNode->cChildren == 0)
     3069                    {
     3070                        if (pNode->enmState != kDbgGuiStatsNodeState_kInvalid)
     3071                        {
     3072                            if (pNode->i64Delta == 0)
     3073                            {
     3074                                /* Is the cached statistics value zero? */
     3075                                switch (pNode->enmType)
     3076                                {
     3077                                    case STAMTYPE_COUNTER:
     3078                                        if (pNode->Data.Counter.c != 0)
     3079                                            break;
     3080                                        return false;
     3081
     3082                                    case STAMTYPE_PROFILE:
     3083                                    case STAMTYPE_PROFILE_ADV:
     3084                                        if (pNode->Data.Profile.cPeriods)
     3085                                            break;
     3086                                        return false;
     3087
     3088                                    case STAMTYPE_RATIO_U32:
     3089                                    case STAMTYPE_RATIO_U32_RESET:
     3090                                        if (pNode->Data.RatioU32.u32A || pNode->Data.RatioU32.u32B)
     3091                                            break;
     3092                                        return false;
     3093
     3094                                    case STAMTYPE_CALLBACK:
     3095                                        if (pNode->Data.pStr && !pNode->Data.pStr->isEmpty())
     3096                                            break;
     3097                                        return false;
     3098
     3099                                    case STAMTYPE_U8:
     3100                                    case STAMTYPE_U8_RESET:
     3101                                    case STAMTYPE_X8:
     3102                                    case STAMTYPE_X8_RESET:
     3103                                        if (pNode->Data.u8)
     3104                                            break;
     3105                                        return false;
     3106
     3107                                    case STAMTYPE_U16:
     3108                                    case STAMTYPE_U16_RESET:
     3109                                    case STAMTYPE_X16:
     3110                                    case STAMTYPE_X16_RESET:
     3111                                        if (pNode->Data.u16)
     3112                                            break;
     3113                                        return false;
     3114
     3115                                    case STAMTYPE_U32:
     3116                                    case STAMTYPE_U32_RESET:
     3117                                    case STAMTYPE_X32:
     3118                                    case STAMTYPE_X32_RESET:
     3119                                        if (pNode->Data.u32)
     3120                                            break;
     3121                                        return false;
     3122
     3123                                    case STAMTYPE_U64:
     3124                                    case STAMTYPE_U64_RESET:
     3125                                    case STAMTYPE_X64:
     3126                                    case STAMTYPE_X64_RESET:
     3127                                        if (pNode->Data.u64)
     3128                                            break;
     3129                                        return false;
     3130
     3131                                    case STAMTYPE_BOOL:
     3132                                    case STAMTYPE_BOOL_RESET:
     3133                                        /* not possible to detect */
     3134                                        return false;
     3135
     3136                                    case STAMTYPE_INVALID:
     3137                                        break;
     3138
     3139                                    default:
     3140                                        AssertMsgFailedBreak(("enmType=%d\n", pNode->enmType));
     3141                                }
     3142                            }
     3143                        }
     3144                        else
     3145                            return false;
     3146                    }
     3147                }
     3148            }
     3149        }
     3150    }
     3151    return true;
     3152}
     3153
     3154
     3155bool
     3156VBoxDbgStatsSortFileProxyModel::lessThan(const QModelIndex &a_rSrcLeft, const QModelIndex &a_rSrcRight) const
     3157{
     3158    PCDBGGUISTATSNODE const pLeft  = nodeFromIndex(a_rSrcLeft);
     3159    PCDBGGUISTATSNODE const pRight = nodeFromIndex(a_rSrcRight);
     3160    if (pLeft == pRight)
     3161        return false;
     3162    if (pLeft && pRight)
     3163    {
     3164        if (pLeft->pParent == pRight->pParent)
     3165        {
     3166            switch (a_rSrcLeft.column())
     3167            {
     3168                case 0:
     3169                    return RTStrCmp(pLeft->pszName, pRight->pszName) < 0;
     3170                case 1:
     3171                    return RTStrCmp(pLeft->pszUnit, pRight->pszUnit) < 0;
     3172                case 2:
     3173                    return VBoxDbgStatsModel::getValueTimesAsUInt(pLeft) < VBoxDbgStatsModel::getValueTimesAsUInt(pRight);
     3174                case 3:
     3175                    return pLeft->i64Delta < pRight->i64Delta;
     3176                case 4:
     3177                    return VBoxDbgStatsModel::getMinValueAsUInt(pLeft) < VBoxDbgStatsModel::getMinValueAsUInt(pRight);
     3178                case 5:
     3179                    return VBoxDbgStatsModel::getAvgValueAsUInt(pLeft) < VBoxDbgStatsModel::getAvgValueAsUInt(pRight);
     3180                case 6:
     3181                    return VBoxDbgStatsModel::getMaxValueAsUInt(pLeft) < VBoxDbgStatsModel::getMaxValueAsUInt(pRight);
     3182                case 7:
     3183                    return VBoxDbgStatsModel::getTotalValueAsUInt(pLeft) < VBoxDbgStatsModel::getTotalValueAsUInt(pRight);
     3184                case 8:
     3185                    if (pLeft->pDescStr == pRight->pDescStr)
     3186                        return false;
     3187                    if (!pLeft->pDescStr)
     3188                        return true;
     3189                    if (!pRight->pDescStr)
     3190                        return false;
     3191                    return *pLeft->pDescStr < *pRight->pDescStr;
     3192                default:
     3193                    AssertCompile(DBGGUI_STATS_COLUMNS == 9);
     3194                    return true;
     3195            }
     3196        }
     3197        return false;
     3198    }
     3199    return !pLeft;
     3200}
     3201
     3202
     3203void
     3204VBoxDbgStatsSortFileProxyModel::setShowUnusedRows(bool a_fHide)
     3205{
     3206    if (a_fHide != m_fShowUnusedRows)
     3207    {
     3208        m_fShowUnusedRows = a_fHide;
     3209        invalidateRowsFilter();
     3210    }
     3211}
     3212
     3213
     3214#endif /* VBOXDBG_WITH_SORTED_AND_FILTERED_STATS */
     3215
     3216
     3217
     3218/*
     3219 *
    28583220 *      V B o x D b g S t a t s V i e w
    28593221 *      V B o x D b g S t a t s V i e w
     
    28643226
    28653227
    2866 VBoxDbgStatsView::VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pModel, VBoxDbgStats *a_pParent/* = NULL*/)
    2867     : QTreeView(a_pParent), VBoxDbgBase(a_pDbgGui), m_pModel(a_pModel), m_PatStr(), m_pParent(a_pParent),
    2868     m_pLeafMenu(NULL), m_pBranchMenu(NULL), m_pViewMenu(NULL), m_pCurMenu(NULL), m_CurIndex()
    2869 
     3228VBoxDbgStatsView::VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pVBoxModel,
     3229                                   VBoxDbgStatsSortFileProxyModel *a_pProxyModel, VBoxDbgStats *a_pParent/* = NULL*/)
     3230    : QTreeView(a_pParent)
     3231    , VBoxDbgBase(a_pDbgGui)
     3232    , m_pVBoxModel(a_pVBoxModel)
     3233    , m_pProxyModel(a_pProxyModel)
     3234    , m_pModel(NULL)
     3235    , m_PatStr()
     3236    , m_pParent(a_pParent)
     3237    , m_pLeafMenu(NULL)
     3238    , m_pBranchMenu(NULL)
     3239    , m_pViewMenu(NULL)
     3240    , m_pCurMenu(NULL)
     3241    , m_CurIndex()
    28703242{
    28713243    /*
     
    28733245     */
    28743246    setRootIsDecorated(true);
     3247    if (a_pProxyModel)
     3248    {
     3249        m_pModel = a_pProxyModel;
     3250        a_pProxyModel->setSourceModel(a_pVBoxModel);
     3251    }
     3252    else
     3253        m_pModel = a_pVBoxModel;
    28753254    setModel(m_pModel);
    2876     QModelIndex RootIdx = m_pModel->getRootIndex(); /* This should really be QModelIndex(), but Qt on darwin does wrong things then. */
     3255    QModelIndex RootIdx = myGetRootIndex(); /* This should really be QModelIndex(), but Qt on darwin does wrong things then. */
    28773256    setRootIndex(RootIdx);
    28783257    setItemsExpandable(true);
     
    28803259    setSelectionBehavior(SelectRows);
    28813260    setSelectionMode(SingleSelection);
    2882     /// @todo sorting setSortingEnabled(true);
     3261    if (a_pProxyModel)
     3262        setSortingEnabled(true);
    28833263
    28843264    /*
     
    29703350
    29713351#define DELETE_IT(m) if (m) { delete m; m = NULL; } else do {} while (0)
    2972     DELETE_IT(m_pModel);
     3352    DELETE_IT(m_pProxyModel);
     3353    DELETE_IT(m_pVBoxModel);
    29733354
    29743355    DELETE_IT(m_pLeafMenu);
     
    29923373{
    29933374    m_PatStr = rPatStr;
    2994     if (m_pModel->updateStatsByPattern(rPatStr))
    2995         setRootIndex(m_pModel->getRootIndex()); /* hack */
     3375    if (m_pVBoxModel->updateStatsByPattern(rPatStr))
     3376        setRootIndex(myGetRootIndex()); /* hack */
     3377}
     3378
     3379
     3380void
     3381VBoxDbgStatsView::setShowUnusedRows(bool a_fHide)
     3382{
     3383#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     3384    if (m_pProxyModel)
     3385        m_pProxyModel->setShowUnusedRows(a_fHide);
     3386#else
     3387    RT_NOREF_PV(a_fHide);
     3388#endif
    29963389}
    29973390
     
    30163409    VBoxDbgStatsView *pThis = (VBoxDbgStatsView *)pvUser;
    30173410
    3018     pThis->setExpanded(a_rIndex, true);
    3019 
    3020     QModelIndex ParentIndex = pThis->m_pModel->parent(a_rIndex);
     3411    QModelIndex ParentIndex; /* this isn't 100% optimal */
     3412    if (pThis->m_pProxyModel)
     3413    {
     3414        QModelIndex const ProxyIndex = pThis->m_pProxyModel->mapFromSource(a_rIndex);
     3415
     3416        ParentIndex = pThis->m_pModel->parent(ProxyIndex);
     3417    }
     3418    else
     3419    {
     3420        pThis->setExpanded(a_rIndex, true);
     3421
     3422        ParentIndex = pThis->m_pModel->parent(a_rIndex);
     3423    }
    30213424    while (ParentIndex.isValid() && !pThis->isExpanded(ParentIndex))
    30223425    {
     
    30333436VBoxDbgStatsView::expandMatching(const QString &rPatStr)
    30343437{
    3035     m_pModel->iterateStatsByPattern(rPatStr, expandMatchingCallback, this);
     3438    m_pVBoxModel->iterateStatsByPattern(rPatStr, expandMatchingCallback, this);
    30363439}
    30373440
     
    30813484    if (pMenu)
    30823485    {
    3083         m_pRefreshAct->setEnabled(!Idx.isValid() || Idx == m_pModel->getRootIndex());
     3486        m_pRefreshAct->setEnabled(!Idx.isValid() || Idx == myGetRootIndex());
    30843487        m_CurIndex = Idx;
    30853488        m_pCurMenu = pMenu;
     
    30963499
    30973500
     3501QModelIndex
     3502VBoxDbgStatsView::myGetRootIndex(void) const
     3503{
     3504    if (!m_pProxyModel)
     3505        return m_pVBoxModel->getRootIndex();
     3506    return m_pProxyModel->mapFromSource(m_pVBoxModel->getRootIndex());
     3507}
     3508
     3509
    30983510void
    30993511VBoxDbgStatsView::headerContextMenuRequested(const QPoint &a_rPos)
     
    31053517    {
    31063518        m_pRefreshAct->setEnabled(true);
    3107         m_CurIndex = m_pModel->getRootIndex();
     3519        m_CurIndex = myGetRootIndex();
    31083520        m_pCurMenu = m_pViewMenu;
    31093521
     
    31403552{
    31413553    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
    3142     if (!Idx.isValid() || Idx == m_pModel->getRootIndex())
    3143     {
    3144         if (m_pModel->updateStatsByPattern(m_PatStr))
    3145             setRootIndex(m_pModel->getRootIndex()); /* hack */
     3554    if (!Idx.isValid() || Idx == myGetRootIndex())
     3555    {
     3556        if (m_pVBoxModel->updateStatsByPattern(m_PatStr))
     3557            setRootIndex(myGetRootIndex()); /* hack */
    31463558    }
    31473559    else
    3148         m_pModel->updateStatsByIndex(Idx);
     3560    {
     3561        if (m_pProxyModel)
     3562            Idx = m_pProxyModel->mapToSource(Idx);
     3563        m_pVBoxModel->updateStatsByIndex(Idx);
     3564    }
    31493565}
    31503566
     
    31543570{
    31553571    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
    3156     if (!Idx.isValid() || Idx == m_pModel->getRootIndex())
    3157         m_pModel->resetStatsByPattern(m_PatStr);
     3572    if (!Idx.isValid() || Idx == myGetRootIndex())
     3573        m_pVBoxModel->resetStatsByPattern(m_PatStr);
    31583574    else
    3159         m_pModel->resetStatsByIndex(Idx);
     3575    {
     3576        if (m_pProxyModel)
     3577            Idx = m_pProxyModel->mapToSource(Idx);
     3578        m_pVBoxModel->resetStatsByIndex(Idx);
     3579    }
    31603580}
    31613581
     
    31653585{
    31663586    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
    3167     m_pModel->copyTreeToClipboard(Idx);
     3587    if (m_pProxyModel)
     3588        Idx = m_pProxyModel->mapToSource(Idx);
     3589    m_pVBoxModel->copyTreeToClipboard(Idx);
    31683590}
    31693591
     
    31733595{
    31743596    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
    3175     m_pModel->logTree(Idx, false /* a_fReleaseLog */);
     3597    if (m_pProxyModel)
     3598        Idx = m_pProxyModel->mapToSource(Idx);
     3599    m_pVBoxModel->logTree(Idx, false /* a_fReleaseLog */);
    31763600}
    31773601
     
    31813605{
    31823606    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
    3183     m_pModel->logTree(Idx, true /* a_fReleaseLog */);
     3607    if (m_pProxyModel)
     3608        Idx = m_pProxyModel->mapToSource(Idx);
     3609    m_pVBoxModel->logTree(Idx, true /* a_fReleaseLog */);
    31843610}
    31853611
     
    32553681    connect(pSB, SIGNAL(valueChanged(int)), this, SLOT(setRefresh(int)));
    32563682
     3683#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     3684    QCheckBox *pCheckBox = new QCheckBox("Show unused");
     3685    pHLayout->addWidget(pCheckBox);
     3686    pCheckBox->setMaximumSize(pCheckBox->sizeHint());
     3687    connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(sltShowUnusedRowsChanged(int)));
     3688#endif
     3689
    32573690    /*
    32583691     * Create the tree view and setup the layout.
    32593692     */
    32603693    VBoxDbgStatsModelVM *pModel = new VBoxDbgStatsModelVM(a_pDbgGui, m_PatStr, NULL, a_pDbgGui->getVMMFunctionTable());
    3261     m_pView = new VBoxDbgStatsView(a_pDbgGui, pModel, this);
     3694#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     3695    VBoxDbgStatsSortFileProxyModel *pProxyModel = new VBoxDbgStatsSortFileProxyModel(this);
     3696    m_pView = new VBoxDbgStatsView(a_pDbgGui, pModel, pProxyModel, this);
     3697#else
     3698    m_pView = new VBoxDbgStatsView(a_pDbgGui, pModel, NULL, this);
     3699#endif
    32623700
    32633701    QWidget *pHBox = new QWidget;
     
    33693807        m_pPatCB->setFocus(Qt::ShortcutFocusReason);
    33703808}
     3809
     3810
     3811void
     3812VBoxDbgStats::sltShowUnusedRowsChanged(int a_iState)
     3813{
     3814#ifdef VBOXDBG_WITH_SORTED_AND_FILTERED_STATS
     3815    m_pView->setShowUnusedRows(a_iState != Qt::Unchecked);
     3816#else
     3817    RT_NOREF_PV(a_iState);
     3818#endif
     3819}
  • trunk/src/VBox/Debugger/VBoxDbgStatsQt.h

    r98103 r103403  
    4141class VBoxDbgStats;
    4242class VBoxDbgStatsModel;
     43class VBoxDbgStatsSortFileProxyModel;
    4344
    4445/** Pointer to a statistics sample. */
     
    6162     * Creates a VM statistics list view widget.
    6263     *
    63      * @param   a_pDbgGui   Pointer to the debugger gui object.
    64      * @param   a_pModel    The model. Will take ownership of this and delete it together
    65      *                      with the view later
    66      * @param   a_pParent   Parent widget.
    67      */
    68     VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pModel, VBoxDbgStats *a_pParent = NULL);
     64     * @param   a_pDbgGui       Pointer to the debugger gui object.
     65     * @param   a_pModel        The model. Will take ownership of this and delete it
     66     *                          together with the view later
     67     * @param   a_pProxyModel   The proxy model object to use for sorting and
     68     *                          filtering.
     69     * @param   a_pParent       Parent widget.
     70     */
     71    VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pModel, VBoxDbgStatsSortFileProxyModel *a_pProxyModel,
     72                     VBoxDbgStats *a_pParent = NULL);
    6973
    7074    /** Destructor. */
     
    7377    /**
    7478     * Updates the view with current information from STAM.
     79     *
    7580     * This will indirectly update the m_PatStr.
    7681     *
     
    8085
    8186    /**
     87     * Shows or hides the unused rows.
     88     *
     89     * @param   a_fShow     Whether to show (@c true) or hide (@c false) unused
     90     *                      rows.
     91     */
     92    void setShowUnusedRows(bool a_fShow);
     93
     94    /**
    8295     * Resets the stats items matching the specified pattern.
     96     *
    8397     * This pattern doesn't have to be the one used for update, thus m_PatStr isn't updated.
    8498     *
     
    120134     */
    121135    virtual void contextMenuEvent(QContextMenuEvent *a_pEvt);
     136
     137    /**
     138     * Gets the model index of the root node.
     139     *
     140     * This takes proxy / no-proxy into account.
     141     *
     142     * @returns root index for.
     143     */
     144    QModelIndex myGetRootIndex(void) const;
    122145
    123146protected slots:
     
    143166protected:
    144167    /** Pointer to the data model. */
    145     VBoxDbgStatsModel *m_pModel;
     168    VBoxDbgStatsModel *m_pVBoxModel;
     169    /** Pointer to the proxy data model for sorting & filtering. */
     170    VBoxDbgStatsSortFileProxyModel *m_pProxyModel;
     171    /** Either m_pVBoxModel or m_pProxyModel. */
     172    QAbstractItemModel *m_pModel;
    146173    /** The current selection pattern. */
    147174    QString m_PatStr;
     
    250277    void actFocusToPat();
    251278
     279    /** The 'show unused rows' checkbox changed. */
     280    void sltShowUnusedRowsChanged(int a_iState);
     281
    252282protected:
    253283
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette