Added more demo stuff.

This commit is contained in:
2025-12-31 17:27:50 +01:00
parent d0476f8d6f
commit 54e89e412a
12 changed files with 742 additions and 8 deletions

View File

@@ -146,11 +146,7 @@ uint32_t BCDriverTinyCan::readRawByte( uint32_t deviceID, uint8_t registerID ) c
if( getState() != DriverState::Ready) if( getState() != DriverState::Ready)
throw BCException( "readRawValue error: driver not loaded." ); throw BCException( "readRawValue error: driver not loaded." );
//uint32_t result = transmitter.readRawValue( deviceID, registerID ); ::TCanMsg msg;
//value.fromValue<uint32_t>( myRandomByte );
TCanMsg msg;
// msg verpacken // msg verpacken
msg.MsgFlags = 0L; msg.MsgFlags = 0L;
@@ -218,7 +214,7 @@ void BCDriverTinyCan::writeRawByte( uint32_t deviceID, uint8_t registerID ,uint8
qDebug() << " --- BCDriverTinyCan writeRawValue: " << value; qDebug() << " --- BCDriverTinyCan writeRawValue: " << value;
return; return;
struct TCanMsg msg; ::TCanMsg msg;
int timeout_count = cTIMEOUT_COUNT; int timeout_count = cTIMEOUT_COUNT;
msg.MsgFlags = 0L; msg.MsgFlags = 0L;

View File

@@ -38,8 +38,8 @@
BCTransmitter::BCTransmitter(QObject *parent) BCTransmitter::BCTransmitter(QObject *parent)
: QObject(parent), _isBusy(false) : QObject(parent), _isBusy(false)
{ {
//_canDriver = new BCDriverTinyCan{this}; _canDriver = new BCDriverTinyCan{this};
_canDriver = new BCDriverDummy{this}; //_canDriver = new BCDriverDummy{this};
} }

Binary file not shown.

View File

@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 18.0.1, 2025-12-31T16:15:34. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{350f6538-4791-42f9-b43d-6ea1a7b22b7b}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoDetect">true</value>
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.LineEndingBehavior">1</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">16</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
<value type="int" key="RcSync">0</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="bool" key="HasPerBcDcs">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.10.1 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.10.1 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.6101.win64_mingw_kit</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\syncMePlease\projects.now\fancy_switch\build\Desktop_Qt_6_10_1_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/syncMePlease/projects.now/fancy_switch/build/Desktop_Qt_6_10_1_MinGW_64_bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/syncMePlease/projects.now/fancy_switch/fancy_switch.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/syncMePlease/projects.now/fancy_switch/fancy_switch.pro</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.UniqueId"></value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">%{RunConfig:Executable:Path}</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@@ -0,0 +1,26 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp \
themetogglewidget.cpp
HEADERS += \
mainwindow.h \
themetogglewidget.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

54
doc/fancy_switch/main.cpp Normal file
View File

@@ -0,0 +1,54 @@
// ============================================================================
// main.cpp - Vollständiges Beispiel
// ============================================================================
#include <QApplication>
#include <QMainWindow>
#include <QStatusBar>
#include <QLabel>
#include <QVBoxLayout>
#include <mainwindow.h>
#include <themetogglewidget.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow window;
window.setWindowTitle("Theme Toggle Demo");
window.resize(600, 400);
// Central Widget
QWidget* central = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(central);
QLabel* label = new QLabel("Toggle theme using the button in the status bar →");
label->setAlignment(Qt::AlignCenter);
label->setStyleSheet("font-size: 14pt;");
layout->addWidget(label);
window.setCentralWidget(central);
// StatusBar mit Theme Toggle
QStatusBar* statusBar = window.statusBar();
statusBar->showMessage("Ready");
ThemeToggleWidget* themeToggle = new ThemeToggleWidget();
statusBar->addPermanentWidget(themeToggle);
// Optional: Speichere Theme-Einstellung
QObject::connect(themeToggle, &ThemeToggleWidget::themeChanged,
[](bool isDark) {
// Settings speichern
// QSettings settings;
// settings.setValue("theme/darkMode", isDark);
qDebug() << "Theme:" << (isDark ? "Dark" : "Light");
});
window.show();
return app.exec();
}

View File

@@ -0,0 +1 @@
#include "mainwindow.h"

View File

@@ -0,0 +1,122 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// MainWindow.h
#include <QMainWindow>
#include <QStatusBar>
#include <QToolBar>
#include "ThemeToggleWidget.h"
#include <QMainWindow>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
setupUI();
setupStatusBar();
}
private:
void setupUI() {
// Dein UI Setup
setWindowTitle("My Application");
resize(800, 600);
}
void setupStatusBar() {
QStatusBar* statusBar = this->statusBar();
statusBar->setSizeGripEnabled(true);
// Theme Toggle Widget rechts hinzufügen
ThemeToggleWidget* themeToggle = new ThemeToggleWidget(this);
statusBar->addPermanentWidget(themeToggle);
// Optional: Reagiere auf Theme-Änderungen
connect(themeToggle, &ThemeToggleWidget::themeChanged,
this, &MainWindow::onThemeChanged);
// Status-Message links
statusBar->showMessage("Ready");
}
private slots:
void onThemeChanged(bool isDarkMode) {
qDebug() << "Theme changed to:" << (isDarkMode ? "Dark" : "Light");
// Hier kannst du zusätzliche Aktionen durchführen:
// - Icons aktualisieren
// - Custom Widgets neu zeichnen
// - Settings speichern
}
};
// ============================================================================
// Alternative: Mit QAction für Menu/Toolbar
// ============================================================================
/*
class MainWindowB : public MainWindow
{
Q_OBJECT
public:
MainWindowB(QWidget* parent = nullptr) : MainWindow(parent)
{
//setupUI();
setupThemeToggle();
}
private:
void setupThemeToggle()
{
// Als QAction (kann in Menu UND StatusBar)
m_themeAction = new QAction(this);
m_themeAction->setText("🌙"); // Initial: Dark Mode Icon
m_themeAction->setToolTip("Toggle Dark/Light Mode");
connect(m_themeAction, &QAction::triggered, this, &MainWindowB::toggleTheme);
// In Toolbar
QToolBar* toolbar = addToolBar("Main");
toolbar->addAction(m_themeAction);
// UND in StatusBar
QPushButton* statusBarThemeBtn = new QPushButton("🌙", this);
statusBarThemeBtn->setFixedSize(32, 24);
statusBarThemeBtn->setFlat(true);
statusBarThemeBtn->setCursor(Qt::PointingHandCursor);
connect(statusBarThemeBtn, &QPushButton::clicked, this, &MainWindowB::toggleTheme);
statusBar()->addPermanentWidget(statusBarThemeBtn);
}
private slots:
void toggleTheme()
{
m_isDarkMode = !m_isDarkMode;
QString icon = m_isDarkMode ? "☀️" : "🌙";
m_themeAction->setText(icon);
// Theme anwenden...
if (m_isDarkMode)
{
applyDarkTheme();
} else {
applyLightTheme();
}
}
private:
bool m_isDarkMode = true;
QAction* m_themeAction;
};
*/
#endif // MAINWINDOW_H

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>18</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -0,0 +1,2 @@
#include "themetogglewidget.h"

View File

@@ -0,0 +1,278 @@
// ThemeToggleWidget.h
#ifndef THEMETOGGLEWIDGET_H
#define THEMETOGGLEWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QPainter>
#include <QPropertyAnimation>
#include <QFile>
#include <QApplication>
#include <QDebug>
class ThemeToggleWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(int position READ position WRITE setPosition)
public:
explicit ThemeToggleWidget(QWidget* parent = nullptr)
: QWidget(parent), m_isDarkMode(true), m_position(0) {
setupUI();
applyDarkTheme();
}
bool isDarkMode() const { return m_isDarkMode; }
void setDarkMode(bool dark)
{
if (m_isDarkMode != dark)
{
m_isDarkMode = dark;
animateToggle();
applyTheme();
emit themeChanged(m_isDarkMode);
}
}
signals:
void themeChanged(bool isDarkMode);
private slots:
void toggleTheme()
{
setDarkMode(!m_isDarkMode);
}
public:
void setupUI()
{
QHBoxLayout* layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
// Toggle Button
m_toggleButton = new QPushButton(this);
m_toggleButton->setFixedSize(64, 28);
m_toggleButton->setCursor(Qt::PointingHandCursor);
m_toggleButton->setFlat(true);
connect(m_toggleButton, &QPushButton::clicked, this, &ThemeToggleWidget::toggleTheme);
layout->addWidget(m_toggleButton);
setFixedSize(64, 28);
}
void paintEvent(QPaintEvent*) override
{
qDebug() << " --- paint!";
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int thumbX = 2 + m_position;
/*
// Track background
QColor trackColor = m_isDarkMode ? QColor(0x3A3A3A) : QColor(0xE1DFDD);
painter.setPen(Qt::NoPen);
painter.setBrush(trackColor);
painter.drawRoundedRect(rect(), 14, 14);
// Animated thumb
int thumbX = 2 + m_position;
QColor thumbColor = m_isDarkMode ? QColor(0x1F1F1F) : QColor(0xFFFFFF);
// Shadow
painter.setBrush(QColor(0, 0, 0, 30));
painter.drawEllipse(thumbX + 1, 3, 22, 22);
// Thumb
painter.setBrush(thumbColor);
painter.drawEllipse(thumbX, 2, 24, 24);
// Icon on thumb
painter.setPen(m_isDarkMode ? QColor(0xFFD700) : QColor(0xFFA500));
QFont iconFont = font();
iconFont.setPointSize(12);
painter.setFont(iconFont);
*/
QString icon = "FITZ!";// m_isDarkMode ? "🌙" : "☀️";
painter.drawText(QRect(0, 2, 24, 24), Qt::AlignLeft, icon);
}
int position() const { return m_position; }
void setPosition(int pos) {
m_position = pos;
update();
}
void animateToggle()
{
QPropertyAnimation* anim = new QPropertyAnimation(this, "position");
anim->setDuration(200);
anim->setEasingCurve(QEasingCurve::InOutQuad);
anim->setStartValue(m_position);
anim->setEndValue(m_isDarkMode ? 36 : 0);
anim->start(QAbstractAnimation::DeleteWhenStopped);
}
void applyTheme()
{
if (m_isDarkMode) {
applyDarkTheme();
} else {
applyLightTheme();
}
}
void applyDarkTheme()
{
QFile file(":/styles/fluent_dark.qss");
if (file.open(QFile::ReadOnly)) {
qApp->setStyleSheet(file.readAll());
} else {
// Fallback: Inline Dark Theme
qApp->setStyleSheet(R"(
* {
background-color: #202020;
color: #FFFFFF;
}
QPushButton {
background-color: #2B2B2B;
border: 1px solid #3F3F3F;
border-radius: 4px;
padding: 6px 16px;
}
QPushButton:hover {
background-color: #3A3A3A;
}
QStatusBar {
background-color: #2B2B2B;
color: #B0B0B0;
border-top: 1px solid #3F3F3F;
}
)");
}
}
void applyLightTheme() {
QFile file(":/styles/fluent_light.qss");
if (file.open(QFile::ReadOnly)) {
qApp->setStyleSheet(file.readAll());
} else {
// Fallback: Inline Light Theme
qApp->setStyleSheet(R"(
* {
background-color: #F3F3F3;
color: #000000;
}
QPushButton {
background-color: #FFFFFF;
border: 1px solid #E1DFDD;
border-radius: 4px;
padding: 6px 16px;
}
QPushButton:hover {
background-color: #F9F9F9;
}
QStatusBar {
background-color: #FFFFFF;
color: #605E5C;
border-top: 1px solid #E1DFDD;
}
)");
}
}
bool m_isDarkMode;
int m_position;
QPushButton* m_toggleButton;
};
// ============================================================================
// Alternative: Kompaktere Version ohne Animation
// ============================================================================
class SimpleThemeToggle : public QPushButton
{
Q_OBJECT
public:
explicit SimpleThemeToggle(QWidget* parent = nullptr)
: QPushButton(parent), m_isDarkMode(true) {
setFixedSize(48, 28);
setCursor(Qt::PointingHandCursor);
setFlat(true);
updateIcon();
connect(this, &QPushButton::clicked, this, &SimpleThemeToggle::toggleTheme);
// Tooltip
setToolTip("Toggle Dark/Light Mode");
}
bool isDarkMode() const { return m_isDarkMode; }
signals:
void themeChanged(bool isDarkMode);
private slots:
void toggleTheme() {
m_isDarkMode = !m_isDarkMode;
updateIcon();
applyTheme();
emit themeChanged(m_isDarkMode);
}
private:
void updateIcon()
{
QString icon = m_isDarkMode ? "☀️" : "🌙";
setText(icon);
// Style
QString style = QString(
"QPushButton {"
" background-color: %1;"
" border: 1px solid %2;"
" border-radius: 14px;"
" font-size: 16pt;"
" padding: 0px;"
"}"
"QPushButton:hover {"
" background-color: %3;"
"}"
).arg(m_isDarkMode ? "#2B2B2B" : "#FFFFFF")
.arg(m_isDarkMode ? "#3F3F3F" : "#E1DFDD")
.arg(m_isDarkMode ? "#3A3A3A" : "#F9F9F9");
setStyleSheet(style);
}
void applyTheme()
{
if (m_isDarkMode) {
// Dark theme
qApp->setStyleSheet("* { background-color: #202020; color: #FFFFFF; }");
} else {
// Light theme
qApp->setStyleSheet("* { background-color: #F3F3F3; color: #000000; }");
}
}
bool m_isDarkMode;
};
#endif

Binary file not shown.