26
26
#include " Windows/Dialogs/PerformanceCounterSelection.h"
27
27
#include " ui_PerformanceCounterViewer.h"
28
28
29
+ struct SortValue
30
+ {
31
+ enum
32
+ {
33
+ Integer,
34
+ Float
35
+ } type;
36
+ union
37
+ {
38
+ uint64_t u;
39
+ double d;
40
+ } val;
41
+
42
+ SortValue (uint32_t eventID)
43
+ {
44
+ type = Integer;
45
+ val.u = eventID;
46
+ }
47
+
48
+ SortValue (const CounterResult &result, const CounterDescription &description)
49
+ {
50
+ switch (description.resultType )
51
+ {
52
+ case CompType::Float:
53
+ type = Float;
54
+ val.d = result.value .f ;
55
+ break ;
56
+ case CompType::Double:
57
+ type = Float;
58
+ val.d = result.value .d ;
59
+ break ;
60
+
61
+ case CompType::UInt:
62
+ type = Integer;
63
+ if (description.resultByteWidth == 8 )
64
+ val.u = result.value .u64 ;
65
+ else
66
+ val.u = result.value .u32 ;
67
+ }
68
+ }
69
+ };
70
+
71
+ struct CustomSortedTableItem : public QTableWidgetItem
72
+ {
73
+ explicit CustomSortedTableItem (const QString &text, SortValue v)
74
+ : QTableWidgetItem(text), sortVal(v)
75
+ {
76
+ }
77
+ bool operator <(const QTableWidgetItem &other) const
78
+ {
79
+ const CustomSortedTableItem &customother = (const CustomSortedTableItem &)other;
80
+
81
+ if (sortVal.type == SortValue::Integer)
82
+ return sortVal.val .u < customother.sortVal .val .u ;
83
+ return sortVal.val .d < customother.sortVal .val .d ;
84
+ }
85
+
86
+ SortValue sortVal;
87
+ };
88
+
29
89
PerformanceCounterViewer::PerformanceCounterViewer (ICaptureContext &ctx, QWidget *parent)
30
90
: QFrame(parent), ui(new Ui::PerformanceCounterViewer), m_Ctx(ctx)
31
91
{
@@ -38,6 +98,8 @@ PerformanceCounterViewer::PerformanceCounterViewer(ICaptureContext &ctx, QWidget
38
98
39
99
ui->captureCounters ->setEnabled (m_Ctx.LogLoaded ());
40
100
ui->saveCSV ->setEnabled (m_Ctx.LogLoaded ());
101
+
102
+ ui->counterResults ->horizontalHeader ()->setSectionsMovable (true );
41
103
}
42
104
43
105
PerformanceCounterViewer::~PerformanceCounterViewer ()
@@ -48,8 +110,8 @@ PerformanceCounterViewer::~PerformanceCounterViewer()
48
110
delete ui;
49
111
}
50
112
51
- QString PerformanceCounterViewer::FormatCounterResult (const CounterResult &result,
52
- const CounterDescription &description)
113
+ QTableWidgetItem * PerformanceCounterViewer::MakeCounterResultItem (const CounterResult &result,
114
+ const CounterDescription &description)
53
115
{
54
116
QString returnValue;
55
117
@@ -102,7 +164,7 @@ QString PerformanceCounterViewer::FormatCounterResult(const CounterResult &resul
102
164
case CounterUnit::Ratio: break ;
103
165
}
104
166
105
- return returnValue;
167
+ return new CustomSortedTableItem ( returnValue, SortValue (result, description)) ;
106
168
}
107
169
108
170
void PerformanceCounterViewer::CaptureCounters ()
@@ -161,11 +223,14 @@ void PerformanceCounterViewer::CaptureCounters()
161
223
for (int i = 0 ; i < (int )results.size (); ++i)
162
224
{
163
225
int row = eventIdToRow[results[i].eventID ];
226
+
164
227
ui->counterResults ->setItem (row, 0 ,
165
- new QTableWidgetItem (QString::number (results[i].eventID )));
166
- ui->counterResults ->setItem (row, counterIndex[results[i].counterID ] + 1 ,
167
- new QTableWidgetItem (FormatCounterResult (
168
- results[i], counterDescriptions[results[i].counterID ])));
228
+ new CustomSortedTableItem (QString::number (results[i].eventID ),
229
+ SortValue (results[i].eventID )));
230
+
231
+ ui->counterResults ->setItem (
232
+ row, counterIndex[results[i].counterID ] + 1 ,
233
+ MakeCounterResultItem (results[i], counterDescriptions[results[i].counterID ]));
169
234
170
235
ui->counterResults ->item (row, 0 )->setData (Qt::UserRole, results[i].eventID );
171
236
}
0 commit comments