calamares/0003-calamares.patch

1442 lines
48 KiB
Diff
Raw Normal View History

From c56fc65fc13db133e4e7190d638cad608e3b7579 Mon Sep 17 00:00:00 2001
From: cui-gaoleng <562344211@qq.com>
Date: Fri, 8 Nov 2024 01:04:06 +0800
Subject: [PATCH 1/4] =?UTF-8?q?calamares=E6=96=87=E4=BB=B6=E5=A4=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/calamares/CalamaresApplication.cpp | 605 ++++++++++---------
src/calamares/CalamaresApplication.h | 128 ++--
src/calamares/CalamaresWindow.cpp | 88 +--
src/calamares/CalamaresWindow.h | 100 +--
src/calamares/DebugWindow.cpp | 14 +-
src/calamares/DebugWindow.ui | 314 +++++-----
src/calamares/calamares-3.3.7.code-workspace | 11 +
7 files changed, 646 insertions(+), 614 deletions(-)
create mode 100644 src/calamares/calamares-3.3.7.code-workspace
diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp
index 09d3bfc..a07edad 100644
--- a/src/calamares/CalamaresApplication.cpp
+++ b/src/calamares/CalamaresApplication.cpp
@@ -1,302 +1,303 @@
-/* === This file is part of Calamares - <https://calamares.io> ===
- *
- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
- * SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- * Calamares is Free Software: see the License-Identifier above.
- *
- */
-#include "CalamaresApplication.h"
-
-#include "CalamaresConfig.h"
-#include "CalamaresVersionX.h"
-#include "CalamaresWindow.h"
-#include "progresstree/ProgressTreeView.h"
-
-#include "Branding.h"
-#include "JobQueue.h"
-#include "Settings.h"
-#include "ViewManager.h"
-#include "locale/TranslationsModel.h"
-#include "modulesystem/ModuleManager.h"
-#include "utils/Dirs.h"
-#include "utils/Gui.h"
-#include "utils/Logger.h"
-#include "utils/System.h"
-#ifdef WITH_QML
-#include "utils/Qml.h"
-#endif
-#include "utils/Retranslator.h"
-#include "viewpages/ViewStep.h"
-
-#include <QDir>
-#include <QFileInfo>
-#include <QScreen>
-#include <QTimer>
-
-/// @brief Convenience for "are the settings in debug mode"
-static bool
-isDebug()
-{
- return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode();
-}
-
-CalamaresApplication::CalamaresApplication( int& argc, char* argv[] )
- : QApplication( argc, argv )
- , m_mainwindow( nullptr )
- , m_moduleManager( nullptr )
-{
- // Setting the organization name makes the default cache
- // directory -- where Calamares stores logs, for instance --
- // <org>/<app>/, so we end up with ~/.cache/Calamares/calamares/
- // which is excessively squidly.
- //
- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) );
- setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) );
- setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) );
- setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) );
-
- QFont f = font();
- Calamares::setDefaultFontSize( f.pointSize() );
-}
-
-void
-CalamaresApplication::init()
-{
- Logger::setupLogfile();
- cDebug() << "Calamares version:" << CALAMARES_VERSION;
- cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion();
- cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE;
-#ifdef WITH_PYBIND11
- cDebug() << Logger::SubEntry << "Using PyBind11";
-#endif
-#ifdef WITH_BOOST_PYTHON
- cDebug() << Logger::SubEntry << "Using Boost Python";
-#endif
- cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path();
- cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile();
- cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages();
-
- if ( !Calamares::Settings::instance() )
- {
- cError() << "Must create Calamares::Settings before the application.";
- ::exit( 1 );
- }
- initQmlPath();
- initBranding();
-
- Calamares::installTranslator();
-
- setQuitOnLastWindowClosed( false );
- setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) );
-
- cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done";
-
- initModuleManager(); //also shows main window
-
- cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started";
-}
-
-CalamaresApplication::~CalamaresApplication()
-{
- Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares...";
- Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown.";
-}
-
-CalamaresApplication*
-CalamaresApplication::instance()
-{
- return qobject_cast< CalamaresApplication* >( QApplication::instance() );
-}
-
-CalamaresWindow*
-CalamaresApplication::mainWindow()
-{
- return m_mainwindow;
-}
-
-static QStringList
-brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename )
-{
- QStringList brandingPaths;
- if ( Calamares::isAppDataDirOverridden() )
- {
- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename );
- }
- else
- {
- if ( assumeBuilddir )
- {
- brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename );
- }
- if ( Calamares::haveExtraDirs() )
- {
- for ( auto s : Calamares::extraDataDirs() )
- {
- brandingPaths << ( s + brandingFilename );
- }
- }
- brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename );
- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename );
- }
-
- return brandingPaths;
-}
-
-void
-CalamaresApplication::initQmlPath()
-{
-#ifdef WITH_QML
- if ( !Calamares::initQmlModulesDir() )
- {
- ::exit( EXIT_FAILURE );
- }
-#endif
-}
-
-void
-CalamaresApplication::initBranding()
-{
- QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName();
- if ( brandingComponentName.simplified().isEmpty() )
- {
- cError() << "FATAL: branding component not set in settings.conf";
- ::exit( EXIT_FAILURE );
- }
-
- QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName );
- QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath );
-
- QFileInfo brandingFile;
- bool found = false;
-
- foreach ( const QString& path, brandingFileCandidatesByPriority )
- {
- QFileInfo pathFi( path );
- if ( pathFi.exists() && pathFi.isReadable() )
- {
- brandingFile = pathFi;
- found = true;
- break;
- }
- }
-
- if ( !found || !brandingFile.exists() || !brandingFile.isReadable() )
- {
- cError() << "Cowardly refusing to continue startup without branding."
- << Logger::DebugList( brandingFileCandidatesByPriority );
- if ( Calamares::isAppDataDirOverridden() )
- {
- cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName;
- }
- else
- {
- cError() << "FATAL: none of the expected branding descriptor file paths exist.";
- }
- ::exit( EXIT_FAILURE );
- }
-
- new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() );
-}
-
-void
-CalamaresApplication::initModuleManager()
-{
- m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this );
- connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView );
- m_moduleManager->init();
-}
-
-/** @brief centers the widget @p w on (a) screen
- *
- * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry()
- * placement by iterating over screens and putting Calamares in the first
- * one where it fits; this is *generally* the primary screen.
- *
- * With debugging, it would look something like this (2 screens attached,
- * primary at +1080+240 because I have a very strange X setup). Before
- * being mapped, the Calamares window is at +0+0 but does have a size.
- * The first screen's geometry includes the offset from the origin in
- * screen coordinates.
- *
- * Proposed window size: 1024 520
- * Window QRect(0,0 1024x520)
- * Screen QRect(1080,240 2560x1440)
- * Moving QPoint(1848,700)
- * Screen QRect(0,0 1080x1920)
- *
- */
-static void
-centerWindowOnScreen( QWidget* w )
-{
- QList< QScreen* > screens = qApp->screens();
- QPoint windowCenter = w->rect().center();
- QSize windowSize = w->rect().size();
-
- for ( const auto* screen : screens )
- {
- QSize screenSize = screen->availableGeometry().size();
- if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) )
- {
- w->move( screen->availableGeometry().center() - windowCenter );
- break;
- }
- }
-}
-
-void
-CalamaresApplication::initView()
-{
- cDebug() << "STARTUP: initModuleManager: all modules init done";
- initJobQueue();
- cDebug() << "STARTUP: initJobQueue done";
-
- m_mainwindow = new CalamaresWindow(); //also creates ViewManager
-
- connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps );
- connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed );
-
- QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules );
-
- if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() )
- {
- centerWindowOnScreen( m_mainwindow );
- }
- cDebug() << "STARTUP: CalamaresWindow created; loadModules started";
-}
-
-void
-CalamaresApplication::initViewSteps()
-{
- cDebug() << "STARTUP: loadModules for all modules done";
- m_moduleManager->checkRequirements();
- if ( Calamares::Branding::instance()->windowMaximize() )
- {
- m_mainwindow->setWindowFlag( Qt::FramelessWindowHint );
- m_mainwindow->showMaximized();
- }
- else
- {
- m_mainwindow->show();
- }
-
- cDebug() << "STARTUP: Window now visible and ProgressTreeView populated";
- cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded.";
- Calamares::ViewManager::instance()->onInitComplete();
-}
-
-void
-CalamaresApplication::initFailed( const QStringList& l )
-{
- cError() << "STARTUP: failed modules are" << l;
- m_mainwindow->show();
-}
-
-void
-CalamaresApplication::initJobQueue()
-{
- Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this );
- new Calamares::System( Calamares::Settings::instance()->doChroot(), this );
- Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() );
-}
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
+ * SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+#include "CalamaresApplication.h"
+
+#include "CalamaresConfig.h"
+#include "CalamaresVersionX.h"
+#include "CalamaresWindow.h"
+#include "progresstree/ProgressTreeView.h"
+
+#include "Branding.h"
+#include "JobQueue.h"
+#include "Settings.h"
+#include "ViewManager.h"
+#include "locale/TranslationsModel.h"
+#include "modulesystem/ModuleManager.h"
+#include "utils/Dirs.h"
+#include "utils/Gui.h"
+#include "utils/Logger.h"
+#include "utils/System.h"
+#ifdef WITH_QML
+#include "utils/Qml.h"
+#endif
+#include "utils/Retranslator.h"
+#include "viewpages/ViewStep.h"
+
+#include <QDir>
+#include <QFileInfo>
+#include <QScreen>
+#include <QTimer>
+
+/// @brief Convenience for "are the settings in debug mode"
+static bool
+isDebug()
+{
+ return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode();
+}
+
+CalamaresApplication::CalamaresApplication( int& argc, char* argv[] )
+ : QApplication( argc, argv )
+ , m_mainwindow( nullptr )
+ , m_moduleManager( nullptr )
+{
+ // Setting the organization name makes the default cache
+ // directory -- where Calamares stores logs, for instance --
+ // <org>/<app>/, so we end up with ~/.cache/Calamares/calamares/
+ // which is excessively squidly.
+ //
+ // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) );
+ setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) );
+ setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) );
+ setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) );
+
+ QFont f = font();
+ Calamares::setDefaultFontSize( f.pointSize() );
+}
+
+void
+CalamaresApplication::init()
+{
+ Logger::setupLogfile();
+ cDebug() << "Calamares version:" << CALAMARES_VERSION;
+ cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion();
+ cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE;
+#ifdef WITH_PYBIND11
+ cDebug() << Logger::SubEntry << "Using PyBind11";
+#endif
+#ifdef WITH_BOOST_PYTHON
+ cDebug() << Logger::SubEntry << "Using Boost Python";
+#endif
+ cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path();
+ cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile();
+ cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages();
+
+ if ( !Calamares::Settings::instance() )
+ {
+ cError() << "Must create Calamares::Settings before the application.";
+ ::exit( 1 );
+ }
+ initQmlPath();
+ initBranding();
+
+ Calamares::installTranslator();
+
+ setQuitOnLastWindowClosed( false );
+ setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) );
+
+ cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done";
+
+ initModuleManager(); //also shows main window
+
+ cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started";
+}
+
+CalamaresApplication::~CalamaresApplication()
+{
+ Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares...";
+ Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown.";
+}
+
+CalamaresApplication*
+CalamaresApplication::instance()
+{
+ return qobject_cast< CalamaresApplication* >( QApplication::instance() );
+}
+
+CalamaresWindow*
+CalamaresApplication::mainWindow()
+{
+ return m_mainwindow;
+}
+
+static QStringList
+brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename )
+{
+ QStringList brandingPaths;
+ if ( Calamares::isAppDataDirOverridden() )
+ {
+ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename );
+ }
+ else
+ {
+ if ( assumeBuilddir )
+ {
+ brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename );
+ }
+ if ( Calamares::haveExtraDirs() )
+ {
+ for ( auto s : Calamares::extraDataDirs() )
+ {
+ brandingPaths << ( s + brandingFilename );
+ }
+ }
+ brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename );
+ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename );
+ }
+
+ return brandingPaths;
+}
+
+void
+CalamaresApplication::initQmlPath()
+{
+#ifdef WITH_QML
+ if ( !Calamares::initQmlModulesDir() )
+ {
+ ::exit( EXIT_FAILURE );
+ }
+#endif
+}
+
+void
+CalamaresApplication::initBranding()
+{
+ QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName();
+ if ( brandingComponentName.simplified().isEmpty() )
+ {
+ cError() << "FATAL: branding component not set in settings.conf";
+ ::exit( EXIT_FAILURE );
+ }
+
+ QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName );
+ QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath );
+ cDebug() << "brandingFileCandidatesByPriority" << brandingFileCandidatesByPriority;
+
+ QFileInfo brandingFile;
+ bool found = false;
+
+ foreach ( const QString& path, brandingFileCandidatesByPriority )
+ {
+ QFileInfo pathFi( path );
+ if ( pathFi.exists() && pathFi.isReadable() )
+ {
+ brandingFile = pathFi;
+ found = true;
+ break;
+ }
+ }
+
+ if ( !found || !brandingFile.exists() || !brandingFile.isReadable() )
+ {
+ cError() << "Cowardly refusing to continue startup without branding."
+ << Logger::DebugList( brandingFileCandidatesByPriority );
+ if ( Calamares::isAppDataDirOverridden() )
+ {
+ cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName;
+ }
+ else
+ {
+ cError() << "FATAL: none of the expected branding descriptor file paths exist.";
+ }
+ ::exit( EXIT_FAILURE );
+ }
+
+ new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() );
+}
+
+void
+CalamaresApplication::initModuleManager()
+{
+ m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this );
+ connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView );
+ m_moduleManager->init();
+}
+
+/** @brief centers the widget @p w on (a) screen
+ *
+ * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry()
+ * placement by iterating over screens and putting Calamares in the first
+ * one where it fits; this is *generally* the primary screen.
+ *
+ * With debugging, it would look something like this (2 screens attached,
+ * primary at +1080+240 because I have a very strange X setup). Before
+ * being mapped, the Calamares window is at +0+0 but does have a size.
+ * The first screen's geometry includes the offset from the origin in
+ * screen coordinates.
+ *
+ * Proposed window size: 1024 520
+ * Window QRect(0,0 1024x520)
+ * Screen QRect(1080,240 2560x1440)
+ * Moving QPoint(1848,700)
+ * Screen QRect(0,0 1080x1920)
+ *
+ */
+static void
+centerWindowOnScreen( QWidget* w )
+{
+ QList< QScreen* > screens = qApp->screens();
+ QPoint windowCenter = w->rect().center();
+ QSize windowSize = w->rect().size();
+
+ for ( const auto* screen : screens )
+ {
+ QSize screenSize = screen->availableGeometry().size();
+ if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) )
+ {
+ w->move( screen->availableGeometry().center() - windowCenter );
+ break;
+ }
+ }
+}
+
+void
+CalamaresApplication::initView()
+{
+ cDebug() << "STARTUP: initModuleManager: all modules init done";
+ initJobQueue();
+ cDebug() << "STARTUP: initJobQueue done";
+
+ m_mainwindow = new CalamaresWindow(); //also creates ViewManager
+
+ connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps );
+ connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed );
+
+ QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules );
+
+ if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() )
+ {
+ centerWindowOnScreen( m_mainwindow );
+ }
+ cDebug() << "STARTUP: CalamaresWindow created; loadModules started";
+}
+
+void
+CalamaresApplication::initViewSteps()
+{
+ cDebug() << "STARTUP: loadModules for all modules done";
+ m_moduleManager->checkRequirements();
+ if ( Calamares::Branding::instance()->windowMaximize() )
+ {
+ m_mainwindow->setWindowFlag( Qt::FramelessWindowHint );
+ m_mainwindow->showMaximized();
+ }
+ else
+ {
+ m_mainwindow->show();
+ }
+
+ cDebug() << "STARTUP: Window now visible and ProgressTreeView populated";
+ cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded.";
+ Calamares::ViewManager::instance()->onInitComplete();
+}
+
+void
+CalamaresApplication::initFailed( const QStringList& l )
+{
+ cError() << "STARTUP: failed modules are" << l;
+ m_mainwindow->show();
+}
+
+void
+CalamaresApplication::initJobQueue()
+{
+ Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this );
+ new Calamares::System( Calamares::Settings::instance()->doChroot(), this );
+ Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() );
+}
diff --git a/src/calamares/CalamaresApplication.h b/src/calamares/CalamaresApplication.h
index 77cf3a0..0a99d26 100644
--- a/src/calamares/CalamaresApplication.h
+++ b/src/calamares/CalamaresApplication.h
@@ -1,64 +1,64 @@
-/* === This file is part of Calamares - <https://calamares.io> ===
- *
- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
- * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot <groot@kde.org>
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- * Calamares is Free Software: see the License-Identifier above.
- *
- */
-
-#ifndef CALAMARESAPPLICATION_H
-#define CALAMARESAPPLICATION_H
-
-#include <QApplication>
-
-class CalamaresWindow;
-
-namespace Calamares
-{
-class ModuleManager;
-} // namespace Calamares
-
-
-/**
- * @brief The CalamaresApplication class extends QApplication to handle
- * Calamares startup and lifetime of main components.
- */
-class CalamaresApplication : public QApplication
-{
- Q_OBJECT
-public:
- CalamaresApplication( int& argc, char* argv[] );
- ~CalamaresApplication() override;
-
- /**
- * @brief init handles the first part of Calamares application startup.
- * After the main window shows up, the latter part of the startup sequence
- * (including modules loading) happens asynchronously.
- */
- void init();
- static CalamaresApplication* instance();
-
- /**
- * @brief mainWindow returns the Calamares application main window.
- */
- CalamaresWindow* mainWindow();
-
-private slots:
- void initView();
- void initViewSteps();
- void initFailed( const QStringList& l );
-
-private:
- // Initialization steps happen in this order
- void initQmlPath();
- void initBranding();
- void initModuleManager();
- void initJobQueue();
-
- CalamaresWindow* m_mainwindow;
- Calamares::ModuleManager* m_moduleManager;
-};
-
-#endif // CALAMARESAPPLICATION_H
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
+ * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot <groot@kde.org>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#ifndef CALAMARESAPPLICATION_H
+#define CALAMARESAPPLICATION_H
+
+#include <QApplication>
+
+class CalamaresWindow;
+
+namespace Calamares
+{
+class ModuleManager;
+} // namespace Calamares
+
+
+/**
+ * @brief The CalamaresApplication class extends QApplication to handle
+ * Calamares startup and lifetime of main components.
+ */
+class CalamaresApplication : public QApplication
+{
+ Q_OBJECT
+public:
+ CalamaresApplication( int& argc, char* argv[] );
+ ~CalamaresApplication() override;
+
+ /**
+ * @brief init handles the first part of Calamares application startup.
+ * After the main window shows up, the latter part of the startup sequence
+ * (including modules loading) happens asynchronously.
+ */
+ void init();
+ static CalamaresApplication* instance();
+
+ /**
+ * @brief mainWindow returns the Calamares application main window.
+ */
+ CalamaresWindow* mainWindow();
+
+private slots:
+ void initView();
+ void initViewSteps();
+ void initFailed( const QStringList& l );
+
+private:
+ // Initialization steps happen in this order
+ void initQmlPath();
+ void initBranding();
+ void initModuleManager();
+ void initJobQueue();
+
+ CalamaresWindow* m_mainwindow;
+ Calamares::ModuleManager* m_moduleManager;
+};
+
+#endif // CALAMARESAPPLICATION_H
diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp
index e1892e7..4721cb9 100644
--- a/src/calamares/CalamaresWindow.cpp
+++ b/src/calamares/CalamaresWindow.cpp
@@ -104,20 +104,23 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
Calamares::ViewManager* viewManager,
QWidget* parent,
Qt::Orientation,
- int desiredWidth )
+ int desiredWidth
+ )
{
const Calamares::Branding* const branding = Calamares::Branding::instance();
-
+
QWidget* sideBox = new QWidget( parent );
sideBox->setObjectName( "sidebarApp" );
- QBoxLayout* sideLayout = new QVBoxLayout;
+ QBoxLayout* sideLayout = new QHBoxLayout;
+ sideLayout->addSpacing(10);
sideBox->setLayout( sideLayout );
// Set this attribute into qss file
sideBox->setFixedWidth( desiredWidth );
+ sideBox->setFixedHeight( parent->height()*0.13 );
sideBox->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
- QHBoxLayout* logoLayout = new QHBoxLayout;
+ QBoxLayout* logoLayout = new QVBoxLayout;
sideLayout->addLayout( logoLayout );
logoLayout->addStretch();
QLabel* logoLabel = new QLabel( sideBox );
@@ -132,19 +135,19 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
logoLabel->setPalette( plt );
}
logoLabel->setAlignment( Qt::AlignCenter );
- logoLabel->setFixedSize( 80, 80 );
+ logoLabel->setFixedSize( 388*0.3, 96*0.3 );
logoLabel->setPixmap( branding->image( Calamares::Branding::ProductLogo, logoLabel->size() ) );
- logoLayout->addWidget( logoLabel );
+ logoLayout->addWidget( logoLabel ,2);
logoLayout->addStretch();
-
+ sideLayout->addSpacing(10);
ProgressTreeView* tv = new ProgressTreeView( sideBox );
tv->setModel( viewManager );
tv->setFocusPolicy( Qt::NoFocus );
- sideLayout->addWidget( tv );
-
- QHBoxLayout* extraButtons = new QHBoxLayout;
- sideLayout->addLayout( extraButtons );
+ sideLayout->addWidget( tv ,20);
+ QBoxLayout* extraButtons = new QVBoxLayout;
+ sideLayout->addLayout( extraButtons ,1);
+ sideLayout->addSpacing(15);
const int defaultFontHeight = Calamares::defaultFontHeight();
if ( /* About-Calamares Button enabled */ true )
@@ -154,13 +157,17 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
aboutDialog->setIcon( Calamares::defaultPixmap(
Calamares::Information, Calamares::Original, 2 * QSize( defaultFontHeight, defaultFontHeight ) ) );
CALAMARES_RETRANSLATE_FOR(
- aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "About", "@button" ) );
+ aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "", "@button" ) );
aboutDialog->setToolTip(
- QCoreApplication::translate( "calamares-sidebar", "Show information about Calamares", "@tooltip" ) ); );
+ QCoreApplication::translate( "calamares-sidebar", "Show information about easysoftware", "@tooltip" ) ); );
extraButtons->addWidget( aboutDialog );
aboutDialog->setFlat( true );
aboutDialog->setCheckable( true );
- QObject::connect( aboutDialog, &QPushButton::clicked, debug, &Calamares::DebugWindowManager::about );
+ QObject::connect( aboutDialog, &QPushButton::clicked, [aboutDialog,debug](){
+ aboutDialog->setDown(false);
+ aboutDialog->setChecked(false);
+ debug->about();
+ } );
}
if ( debug && debug->enabled() )
{
@@ -182,6 +189,7 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug,
}
Calamares::unmarginLayout( sideLayout );
+
return sideBox;
}
@@ -246,7 +254,8 @@ getWidgetNavigation( Calamares::DebugWindowManager*,
bottomLayout->addWidget( quit );
}
- bottomLayout->setContentsMargins( 0, 0, 6, 6 );
+
+ bottomLayout->setContentsMargins( 0, 0,40,40 );
navigation->setLayout( bottomLayout );
return navigation;
}
@@ -271,7 +280,7 @@ setDimension( QQuickWidget* w, Qt::Orientation o, int desiredWidth )
// Bound between (16, 64) with a default of 48.
qreal minimumHeight = qBound( qreal( 16 ), w->rootObject() ? w->rootObject()->height() : 48, qreal( 64 ) );
w->setMinimumHeight( int( minimumHeight ) );
- w->setFixedHeight( int( minimumHeight ) );
+ w->setFixedHeight( int( minimumHeight ));
}
w->setResizeMode( QQuickWidget::SizeRootObjectToView );
}
@@ -417,7 +426,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
// Needs to match what's checked in DebugWindow
this->setObjectName( "mainApp" );
-
+ this->setWindowFlags(Qt::FramelessWindowHint);
QSize availableSize = desktopSize( this );
QSize minimumSize( qBound( windowMinimumWidth, availableSize.width(), windowPreferredWidth ),
qBound( windowMinimumHeight, availableSize.height(), windowPreferredHeight ) );
@@ -429,26 +438,26 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
int w = qBound( minimumSize.width(), windowDimensionToPixels( brandingSizes.first ), availableSize.width() );
int h = qBound( minimumSize.height(), windowDimensionToPixels( brandingSizes.second ), availableSize.height() );
-
- cDebug() << Logger::SubEntry << "Proposed window size:" << w << h;
- resize( w, h );
-
- QWidget* baseWidget = this;
- if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) )
- {
- QWidget* label = new QWidget( this );
- QVBoxLayout* l = new QVBoxLayout;
- Calamares::unmarginLayout( l );
- l->addWidget( label );
- setLayout( l );
- label->setObjectName( "backgroundWidget" );
- label->setStyleSheet(
- QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: repeat-xy; }" )
+
+ cDebug() << Logger::SubEntry << "Proposed window size:" << w << h;
+ //resize( availableSize.width(), availableSize.height() );//通用桌面大小作为窗口大小
+ resize( w, h );//通用桌面大小作为窗口大小
+ QWidget* baseWidget = this;
+ if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) )
+ {
+ QWidget* label = new QWidget( this );
+ QVBoxLayout* l = new QVBoxLayout;
+ Calamares::unmarginLayout( l );
+ l->addWidget( label );
+ setLayout( l );
+ label->setObjectName( "backgroundWidget" );
+ label->setFixedSize(availableSize.width(),h);
+ label->setStyleSheet(
+ QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: No repeat; }" )
.arg( branding->imagePath( ImageEntry::ProductWallpaper ) ) );
-
+
baseWidget = label;
}
-
m_viewManager = Calamares::ViewManager::instance( baseWidget );
if ( branding->windowExpands() )
{
@@ -463,7 +472,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
// is too annoying. Instead, leave it up to ignoring-the-quit-
// event, which is also the ViewManager's responsibility.
- QBoxLayout* mainLayout = new QHBoxLayout;
+ QBoxLayout* mainLayout = new QVBoxLayout;
QBoxLayout* contentsLayout = new QVBoxLayout;
contentsLayout->setSpacing( 0 );
@@ -474,7 +483,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
baseWidget,
::getWidgetSidebar,
::getQmlSidebar,
- qBound( 100, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) );
+ qBound( w, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 200 : 290 ));
QWidget* navigation = flavoredWidget( branding->navigationFlavor(),
::orientation( branding->navigationSide() ),
m_debugManager,
@@ -482,9 +491,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
::getWidgetNavigation,
::getQmlNavigation,
64 );
-
// Build up the contentsLayout (a VBox) top-to-bottom
// .. note that the bottom is mirrored wrt. the top
+ sideBox->resize(availableSize.width(),300);
insertIf( contentsLayout, PanelSide::Top, sideBox, branding->sidebarSide() );
insertIf( contentsLayout, PanelSide::Top, navigation, branding->navigationSide() );
contentsLayout->addWidget( m_viewManager->centralWidget() );
@@ -497,7 +506,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
mainLayout->addLayout( contentsLayout );
insertIf( mainLayout, PanelSide::Right, navigation, branding->navigationSide() );
insertIf( mainLayout, PanelSide::Right, sideBox, branding->sidebarSide() );
-
+ connect(m_viewManager, &Calamares::ViewManager::currentStepChanged, [ = ]( int currentStep ) { sideBox->setVisible(currentStep > 0); } );
// layout->count() returns number of things in it; above we have put
// at **least** the central widget, which comes from the view manager,
// both vertically and horizontally -- so if there's a panel along
@@ -510,6 +519,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent )
Calamares::unmarginLayout( contentsLayout );
baseWidget->setLayout( mainLayout );
setStyleSheet( Calamares::Branding::instance()->stylesheet() );
+ cDebug()<<"<---------------------------WindowWindowSize-------------------------------------->"<<this->size();
+ cDebug()<< "<--------------------sideBox->size()-------------------->"<< sideBox->size();
+ this->setFixedSize(this->size());
}
void
diff --git a/src/calamares/CalamaresWindow.h b/src/calamares/CalamaresWindow.h
index f5dd7fe..e2a0fea 100644
--- a/src/calamares/CalamaresWindow.h
+++ b/src/calamares/CalamaresWindow.h
@@ -1,50 +1,50 @@
-/* === This file is part of Calamares - <https://calamares.io> ===
- *
- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
- * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot <groot@kde.org>
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- * Calamares is Free Software: see the License-Identifier above.
- *
- */
-
-#ifndef CALAMARESWINDOW_H
-#define CALAMARESWINDOW_H
-
-#include <QWidget>
-
-#include <memory>
-
-namespace Calamares
-{
-class DebugWindowManager;
-class ViewManager;
-} // namespace Calamares
-
-/**
- * @brief The CalamaresWindow class represents the main window of the Calamares UI.
- */
-class CalamaresWindow : public QWidget
-{
- Q_OBJECT
-public:
- CalamaresWindow( QWidget* parent = nullptr );
- ~CalamaresWindow() override {}
-
-public Q_SLOTS:
- /**
- * This asks the main window to grow to accomodate @p size pixels, to accomodate
- * larger-than-expected window contents. The enlargement may be silently
- * ignored.
- */
- void ensureSize( QSize size );
-
-protected:
- virtual void closeEvent( QCloseEvent* e ) override;
-
-private:
- Calamares::DebugWindowManager* m_debugManager = nullptr;
- Calamares::ViewManager* m_viewManager = nullptr;
-};
-
-#endif // CALAMARESWINDOW_H
+/* === This file is part of Calamares - <https://calamares.io> ===
+ *
+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
+ * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot <groot@kde.org>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * Calamares is Free Software: see the License-Identifier above.
+ *
+ */
+
+#ifndef CALAMARESWINDOW_H
+#define CALAMARESWINDOW_H
+
+#include <QWidget>
+
+#include <memory>
+
+namespace Calamares
+{
+class DebugWindowManager;
+class ViewManager;
+} // namespace Calamares
+
+/**
+ * @brief The CalamaresWindow class represents the main window of the Calamares UI.
+ */
+class CalamaresWindow : public QWidget
+{
+ Q_OBJECT
+public:
+ CalamaresWindow( QWidget* parent = nullptr );
+ ~CalamaresWindow() override {}
+
+public Q_SLOTS:
+ /**
+ * This asks the main window to grow to accomodate @p size pixels, to accomodate
+ * larger-than-expected window contents. The enlargement may be silently
+ * ignored.
+ */
+ void ensureSize( QSize size );
+
+protected:
+ virtual void closeEvent( QCloseEvent* e ) override;
+
+private:
+ Calamares::DebugWindowManager* m_debugManager = nullptr;
+ Calamares::ViewManager* m_viewManager = nullptr;
+};
+
+#endif // CALAMARESWINDOW_H
diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp
index 51b3fca..b28661e 100644
--- a/src/calamares/DebugWindow.cpp
+++ b/src/calamares/DebugWindow.cpp
@@ -242,10 +242,18 @@ DebugWindowManager::about()
QMessageBox::Ok,
nullptr );
Calamares::fixButtonLabels( &mb );
+ mb.setStyleSheet(
+ "QMessageBox {"
+ "border: 1px solid hsl(240,2%,79%);"
+ "border-radius: 5px;"
+ "background-color: #FFFFFF;" // 设置对话框背景颜色
+ "}"
+ );
+ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
mb.setIconPixmap(
- Calamares::defaultPixmap( Calamares::Squid,
- Calamares::Original,
- QSize( Calamares::defaultFontHeight() * 6, Calamares::defaultFontHeight() * 6 ) ) );
+ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg
+ Calamares::Original,
+ QSize( 321/1.9, 297/2 ) ) );
QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() );
if ( layout )
{
diff --git a/src/calamares/DebugWindow.ui b/src/calamares/DebugWindow.ui
index 16cc4a4..649915e 100644
--- a/src/calamares/DebugWindow.ui
+++ b/src/calamares/DebugWindow.ui
@@ -1,157 +1,157 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <author>
-SPDX-FileCopyrightText: 2015 Teo Mrnjavac &lt;teo@kde.org&gt;
-SPDX-License-Identifier: GPL-3.0-or-later
- </author>
- <class>Calamares::DebugWindow</class>
- <widget class="QWidget" name="DebugWindow">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>962</width>
- <height>651</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string notr="true">Form</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="globalStorageTab">
- <attribute name="title">
- <string>GlobalStorage</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QTreeView" name="globalStorageView"/>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="jobQueueTab">
- <attribute name="title">
- <string>JobQueue</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QTextEdit" name="jobQueueText"/>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="modulesTab">
- <attribute name="title">
- <string>Modules</string>
- </attribute>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QListView" name="modulesListView"/>
- </item>
- <item>
- <layout class="QVBoxLayout" name="modulesVerticalLayout">
- <item>
- <layout class="QFormLayout" name="formLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="typeLabel">
- <property name="text">
- <string>Type:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="moduleTypeLabel">
- <property name="text">
- <string>none</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="interfaceLabel">
- <property name="text">
- <string>Interface:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="moduleInterfaceLabel">
- <property name="text">
- <string>none</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QTreeView" name="moduleConfigView"/>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QPushButton" name="crashButton">
- <property name="toolTip">
- <string>Crashes Calamares, so that Dr. Konqi can look at it.</string>
- </property>
- <property name="text">
- <string notr="true">Crash now</string>
- </property>
- <property name="icon">
- <iconset theme="data-error"/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="reloadStylesheetButton">
- <property name="toolTip">
- <string>Reloads the stylesheet from the branding directory.</string>
- </property>
- <property name="text">
- <string>Reload Stylesheet</string>
- </property>
- <property name="icon">
- <iconset theme="preferences-web-browser-stylesheets"/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="widgetTreeButton">
- <property name="toolTip">
- <string>Displays the tree of widget names in the log (for stylesheet debugging).</string>
- </property>
- <property name="text">
- <string>Widget Tree</string>
- </property>
- <property name="icon">
- <iconset theme="view-list-tree"/>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="sendLogButton">
- <property name="toolTip">
- <string>Uploads the session log to the configured pastebin.</string>
- </property>
- <property name="text">
- <string>Send Session Log</string>
- </property>
- <property name="icon">
- <iconset theme="upload-media"/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <author>
+SPDX-FileCopyrightText: 2015 Teo Mrnjavac &lt;teo@kde.org&gt;
+SPDX-License-Identifier: GPL-3.0-or-later
+ </author>
+ <class>Calamares::DebugWindow</class>
+ <widget class="QWidget" name="DebugWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>962</width>
+ <height>651</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="globalStorageTab">
+ <attribute name="title">
+ <string>GlobalStorage</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTreeView" name="globalStorageView"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="jobQueueTab">
+ <attribute name="title">
+ <string>JobQueue</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QTextEdit" name="jobQueueText"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="modulesTab">
+ <attribute name="title">
+ <string>Modules</string>
+ </attribute>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QListView" name="modulesListView"/>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="modulesVerticalLayout">
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="typeLabel">
+ <property name="text">
+ <string>Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="moduleTypeLabel">
+ <property name="text">
+ <string>none</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="interfaceLabel">
+ <property name="text">
+ <string>Interface:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="moduleInterfaceLabel">
+ <property name="text">
+ <string>none</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTreeView" name="moduleConfigView"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QPushButton" name="crashButton">
+ <property name="toolTip">
+ <string>Crashes Calamares, so that Dr. Konqi can look at it.</string>
+ </property>
+ <property name="text">
+ <string notr="true">Crash now</string>
+ </property>
+ <property name="icon">
+ <iconset theme="data-error"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="reloadStylesheetButton">
+ <property name="toolTip">
+ <string>Reloads the stylesheet from the branding directory.</string>
+ </property>
+ <property name="text">
+ <string>Reload Stylesheet</string>
+ </property>
+ <property name="icon">
+ <iconset theme="preferences-web-browser-stylesheets"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="widgetTreeButton">
+ <property name="toolTip">
+ <string>Displays the tree of widget names in the log (for stylesheet debugging).</string>
+ </property>
+ <property name="text">
+ <string>Widget Tree</string>
+ </property>
+ <property name="icon">
+ <iconset theme="view-list-tree"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="sendLogButton">
+ <property name="toolTip">
+ <string>Uploads the session log to the configured pastebin.</string>
+ </property>
+ <property name="text">
+ <string>Send Session Log</string>
+ </property>
+ <property name="icon">
+ <iconset theme="upload-media"/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/calamares/calamares-3.3.7.code-workspace b/src/calamares/calamares-3.3.7.code-workspace
new file mode 100644
index 0000000..100afc6
--- /dev/null
+++ b/src/calamares/calamares-3.3.7.code-workspace
@@ -0,0 +1,11 @@
+{
+ "folders": [
+ {
+ "path": "../../../calamares-3.3.7"
+ },
+ {
+ "path": "../.."
+ }
+ ],
+ "settings": {}
+}
\ No newline at end of file
--
2.43.0