source: calamares/trunk/fuentes/src/libcalamaresui/utils/DebugWindow.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 17 months ago

sync with github

File size: 6.7 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2015-2016, Teo Mrnjavac <teo@kde.org>
4 *
5 *   Calamares is free software: you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, either version 3 of the License, or
8 *   (at your option) any later version.
9 *
10 *   Calamares is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *   GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "DebugWindow.h"
20#include "utils/CalamaresUtils.h"
21#include "utils/Retranslator.h"
22#include "utils/qjsonmodel.h"
23#include "JobQueue.h"
24#include "Job.h"
25#include "GlobalStorage.h"
26#include "modulesystem/ModuleManager.h"
27#include "modulesystem/Module.h"
28
29#ifdef WITH_PYTHONQT
30#include <gui/PythonQtScriptingConsole.h>
31#include "ViewManager.h"
32#include "viewpages/PythonQtViewStep.h"
33#endif
34
35#include <QJsonDocument>
36#include <QSplitter>
37#include <QStringListModel>
38#include <QTreeView>
39
40namespace Calamares {
41
42DebugWindow::DebugWindow()
43    : QWidget( nullptr )
44{
45    setupUi( this );
46
47    // GlobalStorage page
48    QJsonModel* jsonModel = new QJsonModel( this );
49
50    globalStorageView->setModel( jsonModel );
51    GlobalStorage* gs = JobQueue::instance()->globalStorage();
52
53    connect( gs, &GlobalStorage::changed,
54             this, [ = ]
55    {
56        jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() );
57        globalStorageView->expandAll();
58    } );
59    jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() );
60    globalStorageView->expandAll();
61
62    // JobQueue page
63    jobQueueText->setReadOnly( true );
64    connect( JobQueue::instance(), &JobQueue::queueChanged,
65             this, [ this ]( const JobList& jobs )
66    {
67        QStringList text;
68        for ( const auto &job : jobs )
69        {
70            text.append( job->prettyName() );
71        }
72
73        jobQueueText->setText( text.join( '\n' ) );
74    } );
75
76    // Modules page
77    QStringListModel* modulesModel = new QStringListModel( ModuleManager::instance()->loadedInstanceKeys() );
78    modulesListView->setModel( modulesModel );
79    modulesListView->setSelectionMode( QAbstractItemView::SingleSelection );
80
81    QJsonModel* moduleConfigModel = new QJsonModel( this );
82    moduleConfigView->setModel( moduleConfigModel );
83
84#ifdef WITH_PYTHONQT
85    QPushButton* pythonConsoleButton = new QPushButton;
86    pythonConsoleButton->setText( "Attach Python console" );
87    modulesVerticalLayout->insertWidget( 1, pythonConsoleButton );
88    pythonConsoleButton->hide();
89
90    QObject::connect( pythonConsoleButton, &QPushButton::clicked,
91                      this, [ this, moduleConfigModel ]
92    {
93        QString moduleName = modulesListView->currentIndex().data().toString();
94        Module* module = ModuleManager::instance()->moduleInstance( moduleName );
95        if ( module->interface() != Module::PythonQtInterface ||
96             module->type() != Module::View )
97            return;
98
99        for ( ViewStep* step : ViewManager::instance()->viewSteps() )
100        {
101            if ( step->moduleInstanceKey() == module->instanceKey() )
102            {
103                PythonQtViewStep* pqvs =
104                    qobject_cast< PythonQtViewStep* >( step );
105                if ( pqvs )
106                {
107                    QWidget* consoleWindow = new QWidget;
108
109                    QWidget* console = pqvs->createScriptingConsole();
110                    console->setParent( consoleWindow );
111
112                    QVBoxLayout* layout = new QVBoxLayout;
113                    consoleWindow->setLayout( layout );
114                    layout->addWidget( console );
115
116                    QHBoxLayout* bottomLayout = new QHBoxLayout;
117                    layout->addLayout( bottomLayout );
118
119                    QLabel* bottomLabel = new QLabel( consoleWindow );
120                    bottomLayout->addWidget( bottomLabel );
121                    QString line =
122                        QString( "Module: <font color=\"#008000\"><code>%1</code></font><br/>"
123                                 "Python class: <font color=\"#008000\"><code>%2</code></font>" )
124                            .arg( module->instanceKey() )
125                            .arg( console->property( "classname" ).toString() );
126                    bottomLabel->setText( line );
127
128                    QPushButton* closeButton = new QPushButton( consoleWindow );
129                    closeButton->setText( "&Close" );
130                    QObject::connect( closeButton, &QPushButton::clicked,
131                                      [ consoleWindow ]
132                    {
133                        consoleWindow->close();
134                    } );
135                    bottomLayout->addWidget( closeButton );
136                    bottomLabel->setSizePolicy( QSizePolicy::Expanding,
137                                                QSizePolicy::Preferred );
138
139                    consoleWindow->setParent( this );
140                    consoleWindow->setWindowFlags( Qt::Window );
141                    consoleWindow->setWindowTitle( "Calamares Python console" );
142                    consoleWindow->setAttribute( Qt::WA_DeleteOnClose, true );
143                    consoleWindow->showNormal();
144                    break;
145                }
146            }
147        }
148    } );
149
150#endif
151
152    connect( modulesListView->selectionModel(), &QItemSelectionModel::selectionChanged,
153             this, [ this, moduleConfigModel
154#ifdef WITH_PYTHONQT
155             , pythonConsoleButton
156#endif
157             ]
158    {
159        QString moduleName = modulesListView->currentIndex().data().toString();
160        Module* module = ModuleManager::instance()->moduleInstance( moduleName );
161        if ( module )
162        {
163            moduleConfigModel->loadJson( QJsonDocument::fromVariant( module->configurationMap() ).toJson() );
164            moduleConfigView->expandAll();
165            moduleTypeLabel->setText( module->typeString() );
166            moduleInterfaceLabel->setText( module->interfaceString() );
167#ifdef WITH_PYTHONQT
168            pythonConsoleButton->setVisible(
169                        module->interface() == Module::PythonQtInterface &&
170                        module->type() == Module::View );
171#endif
172        }
173    } );
174
175    connect( crashButton, &QPushButton::clicked,
176             this, [] {
177        CalamaresUtils::crash();
178    } );
179
180    CALAMARES_RETRANSLATE(
181        retranslateUi( this );
182        setWindowTitle( tr( "Debug information" ) );
183    )
184}
185
186
187void
188DebugWindow::closeEvent( QCloseEvent* e )
189{
190    Q_UNUSED( e )
191    emit closed();
192}
193
194} // namespace Calamares
Note: See TracBrowser for help on using the repository browser.