no windowlist, hightlight widgets
This commit is contained in:
parent
38984339fc
commit
04a4f4a9c7
|
@ -23,12 +23,16 @@ public:
|
|||
|
||||
private slots:
|
||||
void refresh();
|
||||
void currentWindowChanged( int row );
|
||||
void currentObjectChanged( QTreeWidgetItem* new_ );
|
||||
void currentObjectChanged( QTreeWidgetItem* new_, QTreeWidgetItem* old );
|
||||
|
||||
protected:
|
||||
void resetStyleSheet();
|
||||
|
||||
QMainWindow* debugWindow = nullptr;
|
||||
|
||||
QString oldStyleSheet;
|
||||
bool oldStyleSheetValid = false;
|
||||
|
||||
private:
|
||||
Ui::DebugWindow* ui;
|
||||
};
|
||||
|
|
|
@ -16,11 +16,10 @@ QtDebugger::QtDebugger(QObject* parent) : QObject(parent), debugWindow( new QMai
|
|||
debugWindow->show();
|
||||
|
||||
QList<int> sizes;
|
||||
sizes << 40 << 70 << 150 << 490;
|
||||
sizes << 40 << 150 << 490;
|
||||
this->ui->splitter->setSizes( sizes );
|
||||
|
||||
QObject::connect( this->ui->refreshButton, &QPushButton::clicked, this, &QtDebugger::refresh );
|
||||
QObject::connect( this->ui->windowList, &QListWidget::currentRowChanged, this, &QtDebugger::currentWindowChanged );
|
||||
QObject::connect( this->ui->objectTree, &QTreeWidget::currentItemChanged, this, &QtDebugger::currentObjectChanged );
|
||||
|
||||
this->refresh();
|
||||
|
@ -32,56 +31,12 @@ QtDebugger::~QtDebugger() {
|
|||
}
|
||||
|
||||
void QtDebugger::refresh() {
|
||||
this->ui->windowList->clear();
|
||||
this->resetStyleSheet();
|
||||
|
||||
this->ui->objectTree->clear();
|
||||
this->ui->propertiesTree->clear();
|
||||
|
||||
// get windows
|
||||
QWindowList windows = qApp->allWindows();
|
||||
for( const QWindow* win : windows ) {
|
||||
QListWidgetItem* item = new QListWidgetItem( win->title() );
|
||||
if ( win->winId() == debugWindow->winId() ) {
|
||||
// not selectable or anything
|
||||
item->setFlags( item->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled) );
|
||||
}
|
||||
item->setData(Qt::UserRole, win->winId());
|
||||
this->ui->windowList->addItem( item );
|
||||
}
|
||||
|
||||
this->currentWindowChanged( 0 );
|
||||
}
|
||||
|
||||
void QtDebugger::currentWindowChanged( int row ) {
|
||||
this->ui->objectTree->clear();
|
||||
this->ui->propertiesTree->clear();
|
||||
|
||||
if ( row == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// find the window id
|
||||
QListWidgetItem* item = this->ui->windowList->item( row );
|
||||
if( !item ) {
|
||||
return;
|
||||
}
|
||||
QVariant data = item->data(Qt::UserRole);
|
||||
bool ok = true;
|
||||
WId wid = data.toULongLong( &ok );
|
||||
|
||||
// find the window
|
||||
QWindowList windows = qApp->allWindows();
|
||||
auto it = std::find_if( windows.constBegin(), windows.constEnd(), [wid](const QWindow* w){ return w->winId() == wid; } );
|
||||
if( !ok || it == windows.constEnd() ) {
|
||||
qWarning() << "invalid window";
|
||||
return;
|
||||
}
|
||||
const QWindow* win = *it;
|
||||
|
||||
// update the tree
|
||||
QTreeWidgetItem* root = new QTreeWidgetItem( );
|
||||
root->setText( 0, "root" );
|
||||
this->ui->objectTree->insertTopLevelItem( 0, root );
|
||||
|
||||
// update object tree
|
||||
std::function<void(const QObject*, uint32_t, uint32_t, QTreeWidgetItem*)> walkTree = [&](const QObject* obj, uint32_t maxdepth, uint32_t currentDepth, QTreeWidgetItem* root) {
|
||||
if ( !obj ) {
|
||||
return;
|
||||
|
@ -101,13 +56,24 @@ void QtDebugger::currentWindowChanged( int row ) {
|
|||
}
|
||||
};
|
||||
|
||||
QTreeWidgetItem* root = new QTreeWidgetItem( );
|
||||
root->setText( 0, "root" );
|
||||
this->ui->objectTree->insertTopLevelItem( 0, root );
|
||||
|
||||
walkTree( qApp, 128, 0, root);
|
||||
walkTree( win, 128, 0, root);
|
||||
|
||||
// get windows
|
||||
QWidgetList tlWidgets = qApp->topLevelWidgets();
|
||||
for ( QWidget* wdg : tlWidgets ) {
|
||||
walkTree( wdg, 128, 0, root);
|
||||
}
|
||||
}
|
||||
|
||||
void QtDebugger::currentObjectChanged( QTreeWidgetItem* new_ ) {
|
||||
void QtDebugger::currentObjectChanged( QTreeWidgetItem* new_, QTreeWidgetItem* old ) {
|
||||
this->ui->propertiesTree->clear();
|
||||
|
||||
this->resetStyleSheet();
|
||||
|
||||
if ( !new_ ) {
|
||||
qWarning() << "invalid row";
|
||||
return;
|
||||
|
@ -121,6 +87,13 @@ void QtDebugger::currentObjectChanged( QTreeWidgetItem* new_ ) {
|
|||
return;
|
||||
}
|
||||
|
||||
QWidget* widget = qobject_cast<QWidget*>( obj );
|
||||
if ( widget ) {
|
||||
this->oldStyleSheet = widget->styleSheet();
|
||||
this->oldStyleSheetValid = true;
|
||||
widget->setStyleSheet( "background-color: black;" );
|
||||
}
|
||||
|
||||
// update the tree
|
||||
std::function<void(const QMetaObject*)> readProperties
|
||||
= [&] (const QMetaObject* meta) {
|
||||
|
@ -151,3 +124,20 @@ void QtDebugger::currentObjectChanged( QTreeWidgetItem* new_ ) {
|
|||
};
|
||||
readProperties( obj->metaObject() );
|
||||
}
|
||||
|
||||
void QtDebugger::resetStyleSheet() {
|
||||
// get currently selected item
|
||||
QList<QTreeWidgetItem*> items = this->ui->objectTree->selectedItems();
|
||||
if ( this->oldStyleSheetValid && items.size() == 1 ) {
|
||||
QTreeWidgetItem* item = items.at(0);
|
||||
QVariant var = item->data(0, Qt::UserRole);
|
||||
QObject* obj = (QObject*) var.toULongLong();
|
||||
QWidget* widget = qobject_cast<QWidget*>( obj );
|
||||
if ( widget ) {
|
||||
widget->setStyleSheet( this->oldStyleSheet );
|
||||
}
|
||||
|
||||
this->oldStyleSheetValid = false;
|
||||
this->oldStyleSheet.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
<string>Refresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QListWidget" name="windowList"/>
|
||||
<widget class="QTreeWidget" name="objectTree">
|
||||
<property name="indentation">
|
||||
<number>20</number>
|
||||
|
|
Loading…
Reference in New Issue