Compare commits

..

1 Commits

Author SHA1 Message Date
Uwe Rathmann c7fe25a63e backup branch of the infamous squiek skin 2024-01-25 08:47:15 +01:00
569 changed files with 11589 additions and 15484 deletions

View File

@ -58,6 +58,44 @@ jobs:
},
screenshot_filename: "windows-latest-msvc-qt-6.5.0.jpg",
}
- {
name: "Windows 2019 MSVC Qt5",
os: windows-2019,
artifact: "windows_msvc.7z",
build_type: "Release",
cc: "cl",
cxx: "cl",
environment_script: "C:/Program Files/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat",
archiver: "7z a",
generators: "Visual Studio 16 2019",
cmake:
{
qtversion: "5.15.2",
qtdirkey: "Qt5_DIR",
qtdirvalue: "../Qt/5.15.2/msvc2019_64/lib/cmake/Qt5",
qtprefixpath: "../Qt/5.15.2/msvc2019_64",
},
screenshot_filename: "windows-2019-msvc-qt-5-15-2.jpg",
}
- {
name: "Windows 2019 MSVC Qt6",
os: windows-2019,
artifact: "windows_msvc.7z",
build_type: "Release",
cc: "cl",
cxx: "cl",
environment_script: "C:/Program Files/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat",
archiver: "7z a",
generators: "Visual Studio 16 2019",
cmake:
{
qtversion: "6.5.0",
qtdirkey: "Qt6_DIR",
qtdirvalue: "../Qt/6.5.0/msvc2019_64/lib/cmake/Qt6",
qtprefixpath: "../Qt/6.5.0/msvc2019_64",
},
screenshot_filename: "windows-2019-msvc-qt-6.5.0.jpg",
}
- {
name: "Ubuntu Latest GCC Qt5",
os: ubuntu-latest,
@ -97,9 +135,47 @@ jobs:
},
screenshot_filename: "ubuntu-latest-gcc-qt-6.5.0.jpg",
}
- {
name: "Ubuntu GCC 9 Qt5",
os: ubuntu-latest,
artifact: "ubuntu_gcc9.7z",
build_type: "Release",
cc: "gcc",
cxx: "g++",
archiver: "7z a",
generators: "Ninja",
env: { DISPLAY: ":1" },
cmake:
{
qtversion: "5.15.2",
qtdirkey: "Qt5_DIR",
qtdirvalue: "../Qt/5.15.2/gcc_64/lib/cmake/Qt5",
qtprefixpath: "../Qt/5.15.2/gcc_64",
},
screenshot_filename: "ubuntu-latest-gcc-9-qt-5-15-2.jpg",
}
- {
name: "Ubuntu GCC 9 Qt6",
os: ubuntu-latest,
artifact: "ubuntu_gcc9.7z",
build_type: "Release",
cc: "gcc",
cxx: "g++",
archiver: "7z a",
generators: "Ninja",
env: { DISPLAY: ":1" },
cmake:
{
qtversion: "6.5.0",
qtdirkey: "Qt6_DIR",
qtdirvalue: "../Qt/6.5.0/gcc_64/lib/cmake/Qt6",
qtprefixpath: "../Qt/6.5.0/gcc_64",
},
screenshot_filename: "ubuntu-latest-gcc-9-qt-6.5.0.jpg",
}
- {
name: "macOS Latest Clang Qt5",
os: macos-13,
os: macos-latest,
artifact: "macos_clang.7z",
build_type: "Release",
cc: "clang",
@ -162,11 +238,46 @@ jobs:
cmake --version
gcc --version
- name: Install dependencies on ubuntu9
if: startsWith(matrix.config.name, 'Ubuntu GCC 9')
run: |
echo Update gcc-9 =======================================================================
echo gcc version before
gcc --version
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install ninja-build cmake gcc-9 g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
echo gcc version after
gcc --version
echo Update ninja =======================================================================
echo ninja version before
ninja --version
# wget https://github.com/ninja-build/ninja/releases/download/v1.10.0/ninja-linux.zip
wget https://github.com/ninja-build/ninja/releases/latest/download/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin/
sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force
echo ninja version after
ninja --version
echo Update cmake =======================================================================
echo cmake version before
cmake --version
# curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2
# wget https://github.com/Kitware/CMake/releases/latest/download/cmake-3.16.5-Linux-x86_64.sh
cmake_version=$(curl --silent "https://api.github.com/repos/Kitware/CMake/releases/latest" | sed -n 's/.*tag_name":\s"\(.*\)".*/\1/p' | head -2 | cut -c 2-)
echo cmake download latest v$cmake_version version
wget https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version-Linux-x86_64.sh
chmod +x cmake-$cmake_version-Linux-x86_64.sh
sudo mkdir /opt/cmake
sudo ./cmake-$cmake_version-Linux-x86_64.sh --prefix=/opt/cmake --skip-license
sudo update-alternatives --install /usr/bin/cmake cmake /opt/cmake/bin/cmake 1 --force
echo cmake version after
cmake --version
- name: Install dependencies on macos
if: startsWith(matrix.config.os, 'macos')
run: |
find /opt/homebrew/ -name EXTERNALLY-MANAGED|xargs rm
brew install cmake ninja
brew install p7zip cmake ninja
ninja --version
cmake --version
@ -193,28 +304,46 @@ jobs:
run: |
sudo apt-get install -y imagemagick
#- name: Cache Qt5
# if: endsWith(matrix.config.name, 'Qt5')
# id: cache-qt-5-15
# uses: actions/cache@v1 # not v2!
# with:
# path: ../Qt/5.15.2
# key: ${{ runner.os }}-QtCache-Qt5
#
#- name: Cache Qt6
# if: endsWith(matrix.config.name, 'Qt6')
# id: cache-qt-6-2
# uses: actions/cache@v1 # not v2!
# with:
# path: ../Qt/6.5.0
# key: ${{ runner.os }}-QtCache-Qt6
- name: Install Qt5
if: endsWith(matrix.config.name, 'Qt5')
uses: jurplel/install-qt-action@v4
uses: jurplel/install-qt-action@v3
with:
version: "5.15.2"
target: "desktop"
install-deps: "true"
modules: "qtwebengine"
cached: ${{ steps.cache-qt-5-15.outputs.cache-hit }}
setup-python: "false"
tools: ""
set-env: "true"
tools-only: "false"
- name: Install Qt6
if: endsWith(matrix.config.name, 'Qt6')
uses: jurplel/install-qt-action@v4
uses: jurplel/install-qt-action@v3
with:
version: "6.5.0"
target: "desktop"
install-deps: "true"
modules: "qtwebengine qtshadertools"
cached: ${{ steps.cache-qt-6-2.outputs.cache-hit }}
setup-python: "false"
tools: ""
set-env: "true"
tools-only: "false"
@ -278,7 +407,7 @@ jobs:
./qskinny_build/examples/bin/iotdashboard --screenshot ${{ matrix.config.screenshot_filename }} &
sleep 10
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v3
with:
name: ${{ matrix.config.screenshot_filename }}
path: ${{ matrix.config.screenshot_filename }}
@ -301,7 +430,7 @@ jobs:
if: startsWith(matrix.config.name, 'Ubuntu')
run: |
killall iotdashboard
# killall Xvfb
killall Xvfb
- name: Configure ( CMake Integration Test )
shell: bash
@ -317,7 +446,29 @@ jobs:
-DQSkinny_DIR:PATH=$GITHUB_WORKSPACE/qskinny_install/lib/cmake/QSkinny
- name: Build ( CMake Integration Test )
env:
DISPLAY: ":1"
shell: bash
run: cmake --build qskinny_build_test --config ${{ matrix.config.build_type }}
# - name: Pack
# shell: bash
# working-directory: instdir
# run: |
# ls -laR
# ${{ matrix.config.archiver }} ../${{ matrix.config.artifact }} .
# - name: Upload
# uses: actions/upload-artifact@v1
# with:
# path: ./${{ matrix.config.artifact }}
# name: ${{ matrix.config.artifact }}
# - name: Upload release asset
# if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'created')
# uses: actions/upload-release-asset@v1
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# with:
# upload_url: ${{ github.event.release.upload_url }}
# asset_path: ./${{ matrix.config.artifact }}
# asset_name: ${{ matrix.config.artifact }}.zip
# asset_content_type: application/zip

View File

@ -18,9 +18,9 @@ macro(qsk_setup_options)
# we actually want to use cmake_dependent_option - minimum cmake version ??
option( BUILD_TOOLS_STANDALONE "Build tools without qskinny library dependency" ON )
option( BUILD_SVG2QVG_STANDALONE "Build svg2qvg without qskinny library dependency" ON )
if( NOT BUILD_TOOLS )
set( BUILD_TOOLS_STANDALONE OFF )
set( BUILD_SVG2QVG_STANDALONE OFF )
endif()
if( NOT BUILD_INPUTCONTEXT )
@ -130,22 +130,6 @@ install(
COMPONENT
Devel)
# install cmake helper scripts
install(
FILES
${QSK_CMAKE_DIR}/scripts/QSkinnySvg2Qvg.lin.sh
${QSK_CMAKE_DIR}/scripts/QSkinnySvg2Qvg.mac.sh
${QSK_CMAKE_DIR}/scripts/QSkinnySvg2Qvg.win.bat
DESTINATION
${PACKAGE_LOCATION}/scripts
PERMISSIONS
OWNER_READ OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
COMPONENT
Devel)
# Build other libraries
if(BUILD_QML_EXPORT)
add_subdirectory(qmlexport)

View File

@ -14,31 +14,8 @@ a) HCT color system
SPDX-License-Identifier: Apache License 2.0
Copyright (C) 2021 Google LLC
b) Cassowary constraint solving algorithm ( examples )
b) Cassowary constraint solving algorithm
Code: https://github.com/nucleic/kiwi
SPDX-License-Identifier: BSD 3-Clause "New" or "Revised" License
Copyright (c) 2013, Nucleic Development Team
fonts ( needed for the Material3/Fluent2 skin )
a) Material3 Icons
Code: https://github.com/google/material-design-icons
SPDX-License-Identifier: Apache License 2.0
b) Roboto Fonts
Code: https://github.com/googlefonts/roboto-classic
SPDX-License-Identifier: SIL Open Font License 1.1
Copyright 2011 The Roboto Project Authors
c) Fluent2 Icons
Code: https://github.com/microsoft/fluentui-system-icons
SPDX-License-Identifier: MIT License
d) Segoe-UI Fonts
Code: https://github.com/mrbvrz/segoe-ui-linux
License: https://github.com/mrbvrz/segoe-ui-linux/blob/master/license.txt

View File

@ -1,4 +1,3 @@
include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyTools.cmake" OPTIONAL)
include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyToolsTargets.cmake" OPTIONAL)
include("${CMAKE_CURRENT_LIST_DIR}/QSkinnyQmlExportTargets.cmake" OPTIONAL)

View File

@ -8,41 +8,11 @@
function(qsk_svg2qvg SVG_FILENAME QVG_FILENAME)
get_filename_component(QVG_FILENAME ${QVG_FILENAME} ABSOLUTE)
get_filename_component(SVG_FILENAME ${SVG_FILENAME} ABSOLUTE)
if(TARGET Qt6::Svg)
set(QtSvgTarget Qt6::Svg)
elseif(TARGET Qt5::Svg)
set(QtSvgTarget Qt5::Svg)
endif()
# find svg2qvg target location
get_target_property(Svg2QvgLocation Qsk::Svg2Qvg LOCATION)
get_filename_component(Svg2QvgDirectory ${Svg2QvgLocation} DIRECTORY)
message(STATUS "Svg2QvgLocation: ${Svg2QvgLocation}")
message(STATUS "Svg2QvgDirectory: ${Svg2QvgDirectory}")
# find qt svg target location
get_target_property(QtSvgTargetLocation ${QtSvgTarget} LOCATION)
get_filename_component(QtSvgTargetDirectory ${QtSvgTargetLocation} DIRECTORY)
message(STATUS "QtSvgTargetLocation: ${QtSvgTargetLocation}")
message(STATUS "QtSvgTargetDirectory: ${QtSvgTargetDirectory}")
# select platform specific wrapper script
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
set(script ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/scripts/QSkinnySvg2Qvg.win.bat)
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(script ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/scripts/QSkinnySvg2Qvg.mac.sh)
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
set(script ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/scripts/QSkinnySvg2Qvg.lin.sh)
else()
message(FATAL "Unsupported operating system")
endif()
add_custom_command(
COMMAND ${script} ${Svg2QvgLocation} ${SVG_FILENAME} ${QVG_FILENAME} ${QtSvgTargetDirectory}
COMMAND svg2qvg ${SVG_FILENAME} ${QVG_FILENAME}
OUTPUT ${QVG_FILENAME}
DEPENDS ${SVG_FILENAME}
COMMENT "Compiling ${SVG_FILENAME} to ${QVG_FILENAME}"
VERBATIM)
WORKING_DIRECTORY $<TARGET_FILE_DIR:${Qt}::Svg>
COMMENT "Compiling ${SVG_FILENAME} to ${QVG_FILENAME}")
endfunction()

View File

@ -20,45 +20,6 @@ function(qsk_add_executable target)
endfunction()
function(qsk_embed_sources target)
# In cross platform scenarios you might need the qvg converter
# tools for the build - not the target - platform. To avoid having
# to build all libraries those tools offer a standalone
# mode that includes some source files instead.
# Some moc files are transitively required:
# - f.e #include <QskGraphic.cpp> -> #include "moc_QskGraphic.cpp"
# Those will be generated when adding the dependency below
add_dependencies(${target} qskinny)
# TODO hack for standalone qvg2svg
get_target_property(qskinny_AUTOGEN_DIR qskinny AUTOGEN_BUILD_DIR)
if (${qskinny_AUTOGEN_DIR} STREQUAL "")
message(FATAL_ERROR "Directory '${qskinny_AUTOGEN_DIR}' doesn't exist")
endif()
# TODO fix multi configuration generators
if(CMAKE_GENERATOR MATCHES "Visual Studio.*")
add_definitions("/I${qskinny_AUTOGEN_DIR}/include_\$(Configuration)")
elseif(CMAKE_GENERATOR MATCHES "Ninja Multi.*")
target_include_directories(${target}
PRIVATE
${qskinny_AUTOGEN_DIR}/include_$<CONFIG>)
else()
target_include_directories(${target} PRIVATE ${qskinny_AUTOGEN_DIR}/include)
endif()
target_include_directories(${target}
PRIVATE
${QSK_SOURCE_DIR}/src/common
${QSK_SOURCE_DIR}/src/graphic)
target_compile_definitions(${target} PRIVATE QSK_STANDALONE)
target_link_libraries(${target} PRIVATE Qt::Gui Qt::GuiPrivate)
endfunction()
function(qsk_add_library target)
if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
@ -86,16 +47,10 @@ function(qsk_add_plugin target TYPE CLASS_NAME)
# So for the moment better don't do:
# qt6_add_plugin(${target} SHARED ${CLASS_NAME} )
if(BUILD_QSKDLL)
set(library_type SHARED)
else()
set(library_type STATIC)
endif()
if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
qt6_add_library(${target} ${library_type})
qt6_add_library(${target} SHARED )
else()
add_library(${target} ${library_type})
add_library(${target} SHARED )
endif()
set_target_properties(${target} PROPERTIES
@ -149,7 +104,7 @@ function(qsk_add_example target)
endfunction()
function(qsk_add_shaders target shader_name)
function(qsk_add_shaders target)
cmake_parse_arguments( arg "" "" "FILES" ${ARGN} )
@ -160,13 +115,7 @@ function(qsk_add_shaders target shader_name)
list(APPEND outfiles "${qsbname}.qsb")
endforeach()
qt6_add_shaders( ${target} ${shader_name} BATCHABLE PRECOMPILE QUIET
qt6_add_shaders( ${target} "qskshaders" BATCHABLE PRECOMPILE QUIET
PREFIX "/qskinny/shaders" ${ARGV} OUTPUTS ${outfiles} )
# pass on OUTPUT_TARGETS to the caller of this function
cmake_parse_arguments(PARSE_ARGV 1 arg "" "OUTPUT_TARGETS" "")
if (arg_OUTPUT_TARGETS)
set(${arg_OUTPUT_TARGETS} ${${arg_OUTPUT_TARGETS}} PARENT_SCOPE)
endif()
endfunction()

View File

@ -54,7 +54,7 @@ macro(qsk_enable_pedantic_flags)
add_compile_options( -Wnon-virtual-dtor )
add_compile_options( -Woverloaded-virtual )
# add_compile_options( -Wfloat-equal )
add_compile_options( -Wfloat-equal )
if ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" )

View File

@ -54,36 +54,16 @@ macro(qsk_setup_Qt)
# C++, but QSkinny itself does not need the WebEngine at all.
if (QT_VERSION_MAJOR VERSION_LESS 6)
find_package(Qt${QT_VERSION_MAJOR} QUIET
OPTIONAL_COMPONENTS WebEngine)
find_package(Qt${QT_VERSION_MAJOR} QUIET
OPTIONAL_COMPONENTS QuickShapes)
find_package(Qt${QT_VERSION_MAJOR} QUIET OPTIONAL_COMPONENTS WebEngine)
set( Qt5WebEngineQuick_FOUND ${Qt5WebEngine_FOUND} )
set( Qt5QuickShapesPrivate_FOUND ${Qt5QuickShapes_FOUND} )
else()
find_package(Qt${QT_VERSION_MAJOR} QUIET
OPTIONAL_COMPONENTS WebEngineCore WebEngineQuick)
find_package(Qt${QT_VERSION_MAJOR} QUIET
OPTIONAL_COMPONENTS QuickShapesPrivate)
find_package(Qt${QT_VERSION_MAJOR} QUIET
OPTIONAL_COMPONENTS QuickDialogs2Utils QuickDialogs2 )
endif()
if( NOT Qt${QT_VERSION_MAJOR}WebEngineQuick_FOUND)
message(STATUS "No Qt/Quick WebEngine support: skipping some unimportant examples")
endif()
if (NOT Qt${QT_VERSION_MAJOR}QuickShapesPrivate_FOUND)
message(STATUS "No Qt/Quick Shapes support: skipping some unimportant examples")
endif()
if( NOT Qt${QT_VERSION_MAJOR}QuickDialogs2_FOUND)
message(STATUS "No Qt/Quick Dialogs2 support: skipping some unimportant examples")
endif()
endif()
endmacro()

View File

@ -1,7 +0,0 @@
#!/bin/bash
SVG2QVG=$1
SVG=$2
QVG=$3
LD_LIBRARY_PATH=$4:$LD_LIBRARY_PATH $SVG2QVG $SVG $QVG

View File

@ -1,10 +0,0 @@
#!/bin/bash
SVG2QVG=$1
SVG=$2
QVG=$3
export DYLD_LIBRARY_PATH=$4:$DYLD_LIBRARY_PATH
otool -L $SVG2QVG
DYLD_LIBRARY_PATH=$4:$DYLD_LIBRARY_PATH $SVG2QVG $SVG $QVG

View File

@ -1,6 +0,0 @@
set SVG2QVG=%1
set SVG=%2
set QVG=%3
set PATH=%4;%PATH%
%SVG2QVG% %SVG% %QVG%

View File

@ -1,3 +1,4 @@
add_subdirectory(squiek)
add_subdirectory(material3)
add_subdirectory(fluent2)
add_subdirectory(fusion)

View File

@ -3,27 +3,13 @@
# SPDX-License-Identifier: BSD-3-Clause
############################################################################
list(APPEND HEADERS
QskFluent2Global.h QskFluent2Theme.h QskFluent2SkinFactory.h
set(SOURCES
QskFluent2Global.h
QskFluent2Theme.h QskFluent2Theme.cpp
QskFluent2Skin.h QskFluent2Skin.cpp
QskFluent2SkinFactory.h QskFluent2SkinFactory.cpp
)
qt_add_resources(SOURCES icons.qrc)
list(APPEND PRIVATE_HEADERS
QskFluent2TextFieldSkinlet.h
)
list(APPEND SOURCES
QskFluent2Theme.cpp
QskFluent2Skin.cpp
QskFluent2SkinFactory.cpp
QskFluent2TextFieldSkinlet.cpp
)
qt_add_resources(SOURCES QskFluent2Icons.qrc)
qsk_add_plugin(fluent2skin skins QskFluent2SkinFactory
${SOURCES} ${HEADERS} ${PRIVATE_HEADERS}
)
set_target_properties(fluent2skin PROPERTIES
DEFINE_SYMBOL QSK_FLUENT2_MAKEDLL
)
qsk_add_plugin(fluent2skin skins QskFluent2SkinFactory ${SOURCES})
set_target_properties(fluent2skin PROPERTIES DEFINE_SYMBOL QSK_FLUENT2_MAKEDLL )

View File

@ -1,7 +0,0 @@
<RCC>
<qresource prefix="/fluent2">
<file>icons/qvg/checkmark.qvg</file>
<file>icons/qvg/chevron_down.qvg</file>
<file>icons/qvg/chevron_up.qvg</file>
</qresource>
</RCC>

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,9 @@ class QSK_FLUENT2_EXPORT QskFluent2Skin : public QskSkin
QskFluent2Skin( QObject* parent = nullptr );
~QskFluent2Skin() override;
void addTheme( QskAspect::Section, const QskFluent2Theme& );
void setup();
enum GraphicRole
{
GraphicRoleFillColorTextDisabled,
@ -31,15 +34,22 @@ class QSK_FLUENT2_EXPORT QskFluent2Skin : public QskSkin
GraphicRoleFillColorTextSecondary,
};
enum FontRole
{
Caption = TinyFont,
Body = DefaultFont,
BodyStrong = SmallFont,
BodyLarge = MediumFont,
Subtitle = LargeFont,
Title = HugeFont,
TitleLarge,
Display,
};
static constexpr QskAspect::Variation Standard = QskAspect::NoVariation;
static constexpr QskAspect::Variation Accent = QskAspect::Large;
protected:
void initHints() override;
private:
void addTheme( QskAspect::Section, const QskFluent2Theme& );
void setupFonts();
void setupGraphicFilters( const QskFluent2Theme& );
void setGraphicColor( GraphicRole, QRgb );

View File

@ -5,8 +5,18 @@
#include "QskFluent2SkinFactory.h"
#include "QskFluent2Skin.h"
#include "QskFluent2Theme.h"
static const QString name = QStringLiteral( "Fluent2" );
static const QString nameLight = QStringLiteral( "Fluent2 Light" );
static const QString nameDark = QStringLiteral( "Fluent2 Dark" );
namespace
{
inline constexpr QRgb rgbGray( int value )
{
return qRgba( value, value, value, 255 );
}
}
QskFluent2SkinFactory::QskFluent2SkinFactory( QObject* parent )
: QskSkinFactory( parent )
@ -19,15 +29,71 @@ QskFluent2SkinFactory::~QskFluent2SkinFactory()
QStringList QskFluent2SkinFactory::skinNames() const
{
return { name };
return { nameLight, nameDark };
}
QskSkin* QskFluent2SkinFactory::createSkin( const QString& skinName )
{
if ( QString::compare( skinName, name, Qt::CaseInsensitive ) == 0 )
return new QskFluent2Skin();
QskSkin::ColorScheme colorScheme;
return nullptr;
if ( QString::compare( skinName, nameLight, Qt::CaseInsensitive ) == 0 )
{
colorScheme = QskSkin::LightScheme;
}
else if ( QString::compare( skinName, nameDark, Qt::CaseInsensitive ) == 0 )
{
colorScheme = QskSkin::DarkScheme;
}
else
{
return nullptr;
}
struct
{
QskSkin::ColorScheme scheme;
QskFluent2Theme::BaseColors baseColors;
QskFluent2Theme::AccentColors accentColors;
QskFluent2Theme theme() const { return { scheme, baseColors, accentColors }; }
} colors[2];
switch( colorScheme )
{
case QskSkin::LightScheme:
{
colors[0].scheme = colorScheme;
colors[0].baseColors = { rgbGray( 243 ), rgbGray( 249 ), rgbGray( 238 ) };
colors[0].accentColors = { 0xff0078d4, 0xff005eb7, 0xff003d92, 0xff001968 };
colors[1].scheme = colorScheme;
colors[1].baseColors = { rgbGray( 249 ), rgbGray( 249 ), rgbGray( 238 ) };
colors[1].accentColors = colors[0].accentColors;
break;
}
case QskSkin::DarkScheme:
{
colors[0].scheme = colorScheme;
colors[0].baseColors = { rgbGray( 32 ), rgbGray( 40 ), rgbGray( 28 ) };
colors[0].accentColors = { 0xff0078d4, 0xff0093f9, 0xff60ccfe, 0xff98ecfe };
colors[1].scheme = colorScheme;
colors[1].baseColors = { rgbGray( 40 ), rgbGray( 44 ), rgbGray( 28 ) };
colors[1].accentColors = colors[0].accentColors;
break;
}
default:;
}
auto skin = new QskFluent2Skin();
skin->addTheme( QskAspect::Body, colors[0].theme() );
skin->addTheme( QskAspect::Header, colors[1].theme() );
skin->addTheme( QskAspect::Footer, colors[1].theme() );
return skin;
}
#include "moc_QskFluent2SkinFactory.cpp"

View File

@ -1,32 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskFluent2TextFieldSkinlet.h"
#include "QskTextField.h"
using Q = QskTextField;
QskFluent2TextFieldSkinlet::QskFluent2TextFieldSkinlet( QskSkin* skin )
: Inherited( skin )
{
}
QskFluent2TextFieldSkinlet::~QskFluent2TextFieldSkinlet()
{
}
QRectF QskFluent2TextFieldSkinlet::subControlRect( const QskSkinnable* skinnable,
const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const
{
return Inherited::subControlRect( skinnable, contentsRect, subControl );
}
QSizeF QskFluent2TextFieldSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
return Inherited::sizeHint( skinnable, which, constraint );
}
#include "moc_QskFluent2TextFieldSkinlet.cpp"

View File

@ -1,29 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_FLUENT2_TEXTFIELD_SKINLET_H
#define QSK_FLUENT2_TEXTFIELD_SKINLET_H
#include "QskFluent2Global.h"
#include "QskTextFieldSkinlet.h"
class QSK_FLUENT2_EXPORT QskFluent2TextFieldSkinlet : public QskTextFieldSkinlet
{
Q_GADGET
using Inherited = QskTextFieldSkinlet;
public:
Q_INVOKABLE QskFluent2TextFieldSkinlet( QskSkin* = nullptr );
~QskFluent2TextFieldSkinlet() override;
QRectF subControlRect( const QskSkinnable*,
const QRectF& rect, QskAspect::Subcontrol ) const override;
QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;
};
#endif

View File

@ -117,7 +117,7 @@ QskFluent2Theme::QskFluent2Theme( QskSkin::ColorScheme colorScheme,
colors.control.defaultColor = rgbGray( 0, 0.0578 );
colors.control.secondary = rgbGray( 0, 0.1622 );
colors.control.onAccentDefault = rgbGray( 255, 0.08 );
colors.control.onAccentDefault = rgbGray( 255.08 );
colors.control.onAccentSecondary = rgbGray( 0, 0.40 );
colors.control.onAccentTertiary = rgbGray( 0, 0.2169 );
colors.control.onAccentDisabled = rgbGray( 0, 0.0578 );

View File

@ -1,26 +0,0 @@
Definitions ( where possible ) taken from:
- https://www.figma.com/file/NAWMapFlXnoOb86Q2H5GKr/Windows-UI-(Community)
The Figma model uses the "Segoe Fluent Icons" [1]. Unfortunately its license is
too restrictive for being included in the QSkinny project. Fortunately similar
icons are also available from the "Fluent UI System Icons" project [2].
However glyph names/numbers and the corresponding unicode values do not match
and can't be taken 1:1 from the Figma model.
"Fluent UI System Icons" offers different icon packages ( as font ):
- FluentSystemIcons-Light.ttf
- FluentSystemIcons-Regular.ttf
- FluentSystemIcons-Filled.ttf
- FluentSystemIcons-Resizable.ttf
For some reason ( might be a bug in the downloaded version ) the checkmark
glyph offered from the "Regular" font ( pixelsize 12 ) is different
( works better ) to the one from the "Resizable" font.
That's why we decided to use the "Regular" font for now.
[1] https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font
[2] https://github.com/microsoft/fluentui-system-icons

View File

@ -0,0 +1,10 @@
<RCC>
<qresource prefix="/fluent2">
<file>icons/qvg/checkmark.qvg</file>
<file>icons/qvg/combo-box-arrow-closed.qvg</file>
<file>icons/qvg/combo-box-arrow-open.qvg</file>
<file>icons/qvg/segmented-button-check.qvg</file>
<file>icons/qvg/spin-box-arrow-down.qvg</file>
<file>icons/qvg/spin-box-arrow-up.qvg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,4 @@
<svg width="11" height="8" viewBox="0 0 11 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.00195312 3.49805C0.00195312 3.36133 0.0507812 3.24414 0.148438 3.14648C0.246094 3.04883 0.363281 3 0.5 3C0.636719 3 0.753906 3.04883 0.851562 3.14648L3.5 5.79492L9.14844 0.146484C9.24609 0.0488281 9.36328 0 9.5 0C9.57031 0 9.63477 0.0136719 9.69336 0.0410156C9.75586 0.0644531 9.80859 0.0996094 9.85156 0.146484C9.89844 0.189453 9.93555 0.242187 9.96289 0.304688C9.99023 0.363281 10.0039 0.427734 10.0039 0.498047C10.0039 0.634766 9.95312 0.753906 9.85156 0.855469L3.85156 6.85547C3.75391 6.95312 3.63672 7.00195 3.5 7.00195C3.36328 7.00195 3.24609 6.95312 3.14844 6.85547L0.148438 3.85547C0.0507812 3.75781 0.00195312 3.63867 0.00195312 3.49805Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 777 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 157 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" transform="rotate(180 4 2.5)" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

View File

@ -0,0 +1,4 @@
<svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.24914 8.12738L1.12164 4.99988L0.0566406 6.05738L4.24914 10.2499L13.2491 1.24988L12.1916 0.192383L4.24914 8.12738Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 246 B

View File

@ -0,0 +1,4 @@
<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.5 1.125C0.5 1.02344 0.537109 0.935547 0.611328 0.861328C0.685547 0.787109 0.773438 0.75 0.875 0.75C0.976562 0.75 1.06445 0.787109 1.13867 0.861328L5 4.7168L8.86133 0.861328C8.93555 0.787109 9.02344 0.75 9.125 0.75C9.22656 0.75 9.31445 0.787109 9.38867 0.861328C9.46289 0.935547 9.5 1.02344 9.5 1.125C9.5 1.22656 9.46289 1.31445 9.38867 1.38867L5.26367 5.51367C5.18945 5.58789 5.10156 5.625 5 5.625C4.89844 5.625 4.81055 5.58789 4.73633 5.51367L0.611328 1.38867C0.537109 1.31445 0.5 1.22656 0.5 1.125Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 631 B

View File

@ -0,0 +1,4 @@
<svg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.5 4.875C0.5 4.77344 0.537109 4.68555 0.611328 4.61133L4.73633 0.486328C4.81055 0.412109 4.89844 0.375 5 0.375C5.10156 0.375 5.18945 0.412109 5.26367 0.486328L9.38867 4.61133C9.46289 4.68555 9.5 4.77344 9.5 4.875C9.5 4.97656 9.46289 5.06445 9.38867 5.13867C9.31445 5.21289 9.22656 5.25 9.125 5.25C9.02344 5.25 8.93555 5.21289 8.86133 5.13867L5 1.2832L1.13867 5.13867C1.06445 5.21289 0.976562 5.25 0.875 5.25C0.773438 5.25 0.685547 5.21289 0.611328 5.13867C0.537109 5.06445 0.5 4.97656 0.5 4.875Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 625 B

View File

@ -1,11 +0,0 @@
#! /bin/sh
function symbol2qvg {
fontfile=FluentSystemIcons-Regular.ttf
glyph2qvg ${fontfile} 12 $1 qvg/$2.qvg
}
symbol2qvg 1724 checkmark
symbol2qvg 1792 chevron_down
symbol2qvg 1816 chevron_up

View File

@ -1,4 +1,5 @@
{
"FactoryId": "Fluent2Factory",
"Skins": [ "Fluent2" ]
"Skins": [ { "Name": "Fluent2 Light", "Scheme": "Light" },
{ "Name": "Fluent2 Dark", "Scheme": "Dark" } ]
}

View File

@ -4,11 +4,10 @@
############################################################################
set(SOURCES
QskFusionGlobal.h
QskFusionPalette.h QskFusionPalette.cpp
QskFusionSkin.h QskFusionSkin.cpp
QskFusionGlobal.h QskFusionSkin.h QskFusionSkin.cpp
QskFusionSkinFactory.h QskFusionSkinFactory.cpp
)
qt_add_resources(SOURCES icons.qrc)
qsk_add_plugin(fusionskin skins QskFusionSkinFactory ${SOURCES})
set_target_properties(fusionskin PROPERTIES DEFINE_SYMBOL QSK_FUSION_MAKEDLL)
set_target_properties(fusionskin PROPERTIES DEFINE_SYMBOL QSK_FUSION_MAKEDLL )

View File

@ -1,181 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskFusionPalette.h"
#include <QskRgbValue.h>
#if 0
extern QPalette qt_fusionPalette();
#endif
namespace
{
inline constexpr QRgb rgbGray( int value )
{
return qRgb( value, value, value );
}
}
QskFusionPalette::QskFusionPalette( QskSkin::ColorScheme colorScheme )
{
using namespace QskRgb;
using P = QPalette;
struct
{
QRgb base, background, text, disabledText, light, midLight, mid, dark,
darkDisabled, highlight, disabledHighlight, shadow, disabledShadow,
hightlightedText, link;
} colors;
if ( colorScheme == QskSkin::DarkScheme )
{
colors.base = rgbGray( 36 );
colors.background = rgbGray( 50 );
colors.text = rgbGray( 240 );
colors.disabledText = rgbGray( 130 );
colors.light = rgbGray( 75 );
colors.midLight = rgbGray( 42 );
colors.mid = rgbGray( 38 );
colors.dark = rgbGray( 33 );
colors.darkDisabled = rgbGray( 190 );
colors.highlight = qRgb( 48, 140, 198 );
colors.disabledHighlight = rgbGray( 145 );
colors.shadow = rgbGray( 25 );
colors.disabledShadow = rgbGray( 36 );
colors.hightlightedText = colors.text;
colors.link = colors.highlight;
}
else
{
colors.base = White;
colors.background = rgbGray( 239 );
colors.text = Black;
colors.disabledText = rgbGray( 190 );
colors.light = White;
colors.midLight = rgbGray( 202 );
colors.mid = rgbGray( 184 );
colors.dark = rgbGray( 159 );
colors.darkDisabled = rgbGray( 190 );
colors.highlight = qRgb( 48, 140, 198 );
colors.disabledHighlight = rgbGray( 145 );
colors.shadow = rgbGray( 118 );
colors.disabledShadow = rgbGray( 177 );
colors.hightlightedText = White;
colors.link = Blue;
}
setColor( P::WindowText, colors.text );
setColor( P::Button, colors.background );
setColor( P::Light, colors.light );
setColor( P::Midlight, colors.midLight );
setColor( P::Dark, colors.dark );
setColor( P::Mid, colors.mid );
setColor( P::Text, colors.text );
setColor( P::BrightText, colors.light );
setColor( P::ButtonText, colors.text );
setColor( P::Base, colors.base );
setColor( P::Window, colors.background );
setColor( P::Shadow, colors.shadow );
setColor( P::AlternateBase, interpolated( colors.base, colors.background, 0.5 ) );
setColor( P::Highlight, colors.highlight );
setColor( P::HighlightedText, colors.hightlightedText );
setColor( P::Link, colors.link);
setColor( P::LinkVisited, Magenta );
setColor( P::ToolTipBase, qRgb( 255, 255, 220 ) );
setColor( P::ToolTipText, Black );
setColor( P::PlaceholderText, toTransparent( colors.text, 128 ) );
// disabled colors
setColor( P::Disabled, P::Text, colors.disabledText );
setColor( P::Disabled, P::WindowText, colors.disabledText );
setColor( P::Disabled, P::ButtonText, colors.disabledText );
setColor( P::Disabled, P::Base, colors.background );
setColor( P::Disabled, P::Dark, colors.darkDisabled );
setColor( P::Disabled, P::Shadow, colors.disabledShadow );
setColor( P::Disabled, P::Highlight, colors.disabledHighlight );
#if QT_VERSION >= QT_VERSION_CHECK( 6, 6, 0 )
setColor( P::Active, P::Accent, active( P::Highlight ) );
setColor( P::Disabled, P::Accent, disabled( P::Highlight ) );
#endif
initExtraColors();
}
QskFusionPalette::QskFusionPalette( const QPalette& palette )
{
using P = QPalette;
for ( int i = 0; i < 2; i++ )
{
const auto group = static_cast< P::ColorGroup >( i );
for ( int j = 0; j < P::NColorRoles; j++ )
{
const auto role = static_cast< P::ColorRole >( j );
m_colors[ group ][ role ] = palette.color( group, role ).rgba();
}
}
initExtraColors();
}
QskFusionPalette::~QskFusionPalette()
{
}
void QskFusionPalette::initExtraColors()
{
using P = QPalette;
outline = QskRgb::darker( active( P::Window ), 140 );
button = active( P::Button );
{
auto c = QColor::fromRgba( button );
const int val = qGray( button );
c = c.lighter( 100 + qMax( 1, ( 180 - val ) / 6 ) );
c.setHsv(c.hue(), c.saturation() * 0.75, c.value() );
button = c.rgba();
}
{
auto c = QColor::fromRgba( button ).toHsv();
c.setHsv( c.hue(), qMin( 255, (int)( c.saturation() ) ),
qMin( 255, (int)( c.value() * 0.9 ) ) );
groove = c.rgba();
}
tabFrame = QskRgb::lighter( button, 104 );
highlightedOutline = active( QPalette::Highlight );
{
highlightedOutline = QskRgb::darker( highlightedOutline, 125 );
auto c = QColor::fromRgba( highlightedOutline );
if ( c.value() > 160 )
{
c.setHsl(c.hue(), c.saturation(), 160 );
highlightedOutline = c.rgba();
}
}
error = QskRgb::DarkRed; // ????
}

View File

@ -1,90 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_FUSION_PALETTE_H
#define QSK_FUSION_PALETTE_H
#include "QskSkin.h"
#include "QskFusionGlobal.h"
#include "QskRgbValue.h"
#include <qpalette.h>
class QskFusionPalette
{
public:
QskFusionPalette( QskSkin::ColorScheme = QskSkin::LightScheme );
QskFusionPalette( const QPalette& );
~QskFusionPalette();
QRgb active( QPalette::ColorRole ) const;
QRgb disabled( QPalette::ColorRole ) const;
QRgb color( QPalette::ColorGroup, QPalette::ColorRole ) const;
QRgb lighter( QPalette::ColorGroup, QPalette::ColorRole, int factor ) const;
QRgb darker( QPalette::ColorGroup, QPalette::ColorRole, int factor ) const;
QRgb outline;
QRgb button;
QRgb groove;
QRgb tabFrame;
QRgb highlightedOutline;
QRgb error;
private:
void initExtraColors();
void setColor( QPalette::ColorRole, QRgb );
void setColor( QPalette::ColorGroup, QPalette::ColorRole, QRgb );
QRgb m_colors[ 2 ][ QPalette::NColorRoles ] = { };
};
inline QRgb QskFusionPalette::color(
QPalette::ColorGroup group, QPalette::ColorRole role ) const
{
Q_ASSERT( group >= 0 && group < 2 );
return m_colors[group][role];
}
inline QRgb QskFusionPalette::lighter( QPalette::ColorGroup group,
QPalette::ColorRole role, int factor ) const
{
return QskRgb::lighter( color( group, role ), factor );
}
inline QRgb QskFusionPalette::darker( QPalette::ColorGroup group,
QPalette::ColorRole role, int factor ) const
{
return QskRgb::darker( color( group, role ), factor );
}
inline QRgb QskFusionPalette::active( QPalette::ColorRole role ) const
{
return m_colors[ QPalette::Active ][ role ];
}
inline QRgb QskFusionPalette::disabled( QPalette::ColorRole role ) const
{
return m_colors[ QPalette::Disabled ][ role ];
}
inline void QskFusionPalette::setColor(
QPalette::ColorRole role, QRgb rgb )
{
setColor( QPalette::Active, role, rgb );
setColor( QPalette::Disabled, role, rgb );
}
inline void QskFusionPalette::setColor(
QPalette::ColorGroup group, QPalette::ColorRole role, QRgb rgb )
{
Q_ASSERT( group >= 0 && group < 2 );
m_colors[group][role] = rgb;
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,7 @@ class QSK_FUSION_EXPORT QskFusionSkin : public QskSkin
using Inherited = QskSkin;
public:
QskFusionSkin( QObject* parent = nullptr );
QskFusionSkin( QskSkin::ColorScheme, QObject* parent = nullptr );
~QskFusionSkin() override;
enum GraphicRole
@ -24,13 +24,9 @@ class QSK_FUSION_EXPORT QskFusionSkin : public QskSkin
GraphicNormal,
GraphicDisabled,
GraphicHighlighted,
GraphicError,
GraphicIndicator
GraphicError
};
protected:
void initHints() override;
private:
void setGraphicColor( GraphicRole, QRgb );
};

View File

@ -6,7 +6,8 @@
#include "QskFusionSkinFactory.h"
#include "QskFusionSkin.h"
static const QString name = QStringLiteral( "Fusion" );
static const QStringList fusionSkinNames =
{ QStringLiteral( "Fusion Light" ), QStringLiteral( "Fusion Dark" ) };
QskFusionSkinFactory::QskFusionSkinFactory( QObject* parent )
: QskSkinFactory( parent )
@ -19,13 +20,16 @@ QskFusionSkinFactory::~QskFusionSkinFactory()
QStringList QskFusionSkinFactory::skinNames() const
{
return { name };
return fusionSkinNames;
}
QskSkin* QskFusionSkinFactory::createSkin( const QString& skinName )
{
if ( QString::compare( skinName, name, Qt::CaseInsensitive ) == 0 )
return new QskFusionSkin();
if ( QString::compare( skinName, fusionSkinNames[0], Qt::CaseInsensitive ) == 0 )
return new QskFusionSkin( QskSkin::LightScheme );
if ( QString::compare( skinName, fusionSkinNames[1], Qt::CaseInsensitive ) == 0 )
return new QskFusionSkin( QskSkin::DarkScheme );
return nullptr;
}

View File

@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/fusion">
<file>icons/qvg/check_small.qvg</file>
<file>icons/qvg/combo-box-arrow-closed.qvg</file>
<file>icons/qvg/combo-box-arrow-open.qvg</file>
<file>icons/qvg/segmented-button-check.qvg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,4 @@
<svg width="12" height="10" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 9.4L0 5.4L1.4 4L4 6.6L10.6 0L12 1.4L4 9.4Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 175 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 157 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" transform="rotate(180 4 2.5)" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

View File

@ -0,0 +1,4 @@
<svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.24914 8.12738L1.12164 4.99988L0.0566406 6.05738L4.24914 10.2499L13.2491 1.24988L12.1916 0.192383L4.24914 8.12738Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 246 B

View File

@ -1,4 +1,5 @@
{
"FactoryId": "FusionFactory",
"Skins": [ "Fusion" ]
"Skins": [ { "Name": "Fusion Light", "Scheme": "Light" },
{ "Name": "Fusion Dark", "Scheme": "Dark" } ]
}

View File

@ -3,30 +3,11 @@
# SPDX-License-Identifier: BSD-3-Clause
############################################################################
list(APPEND HEADERS
QskMaterial3Global.h QskMaterial3Skin.h QskMaterial3SkinFactory.h
set(SOURCES
QskMaterial3Global.h QskMaterial3Skin.h QskMaterial3Skin.cpp
QskMaterial3SkinFactory.h QskMaterial3SkinFactory.cpp
)
qt_add_resources(SOURCES icons.qrc)
list(APPEND PRIVATE_HEADERS
QskMaterial3ProgressBarSkinlet.h
QskMaterial3SliderSkinlet.h
QskMaterial3TextFieldSkinlet.h
)
list(APPEND SOURCES
QskMaterial3Skin.cpp
QskMaterial3SkinFactory.cpp
QskMaterial3ProgressBarSkinlet.cpp
QskMaterial3SliderSkinlet.cpp
QskMaterial3TextFieldSkinlet.cpp
)
qt_add_resources(SOURCES QskMaterial3Icons.qrc)
qsk_add_plugin(material3skin skins QskMaterial3SkinFactory
${SOURCES} ${HEADERS} ${PRIVATE_HEADERS}
)
set_target_properties(material3skin PROPERTIES
DEFINE_SYMBOL QSK_MATERIAL3_MAKEDLL
)
qsk_add_plugin(material3skin skins QskMaterial3SkinFactory ${SOURCES})
set_target_properties(material3skin PROPERTIES DEFINE_SYMBOL QSK_MATERIAL3_MAKEDLL )

View File

@ -1,10 +0,0 @@
<RCC>
<qresource prefix="/m3">
<file>icons/qvg/add.qvg</file>
<file>icons/qvg/arrow_drop_down.qvg</file>
<file>icons/qvg/arrow_drop_up.qvg</file>
<file>icons/qvg/check.qvg</file>
<file>icons/qvg/close.qvg</file>
<file>icons/qvg/remove.qvg</file>
</qresource>
</RCC>

View File

@ -1,94 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskMaterial3ProgressBarSkinlet.h"
#include <QskProgressBar.h>
#include <QskBoxHints.h>
#include <QskMargins.h>
#include <QskClipNode.h>
#include <QskSGNode.h>
using Q = QskProgressBar;
QskMaterial3ProgressBarSkinlet::QskMaterial3ProgressBarSkinlet( QskSkin* skin )
: Inherited( skin )
{
appendNodeRoles( { StopIndicatorRole } );
}
QSGNode* QskMaterial3ProgressBarSkinlet::updateSubNode(
const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
{
auto progressBar = static_cast< const QskProgressBar* >( skinnable );
switch( nodeRole )
{
case GrooveRole:
{
auto clippedNode = QskSGNode::findChildNode( node, GrooveRole );
clippedNode = Inherited::updateSubNode( skinnable, nodeRole, clippedNode );
if ( clippedNode == nullptr )
return nullptr;
auto clipNode = updateGrooveClipNode( progressBar, node );
QskSGNode::setNodeRole( clippedNode, nodeRole );
QskSGNode::setParentNode( clippedNode, clipNode );
return clipNode;
}
case StopIndicatorRole:
{
if ( !( progressBar->isIndeterminate() || progressBar->hasOrigin() ) )
return updateStopIndicatorNode( progressBar, node );
return nullptr;
}
}
return Inherited::updateSubNode( skinnable, nodeRole, node );
}
QSGNode* QskMaterial3ProgressBarSkinlet::updateStopIndicatorNode(
const QskProgressBar* progressBar, QSGNode* node ) const
{
auto rect = progressBar->subControlRect( Q::Groove );
if ( rect.isEmpty() )
return nullptr;
if( progressBar->orientation() == Qt::Horizontal )
rect.setLeft( rect.right() - rect.height() );
else
rect.setBottom( rect.top() + rect.width() );
QskBoxHints hints;
hints.shape = progressBar->boxShapeHint( Q::Fill );
hints.gradient = progressBar->gradientHint( Q::Fill ).endColor();
return updateBoxNode( progressBar, node, rect, hints );
}
QSGNode* QskMaterial3ProgressBarSkinlet::updateGrooveClipNode(
const QskProgressBar* progressBar, QSGNode* node ) const
{
auto rect = progressBar->subControlRect( Q::Fill );
if ( rect.isEmpty() )
return nullptr;
QskMargins margins;
if ( progressBar->orientation() == Qt::Horizontal )
margins.setMargins( rect.height(), 0.0 );
else
margins.setMargins( 0.0, rect.width() );
rect = rect.marginsAdded( margins );
auto clipNode = QskSGNode::ensureNode< QskClipNode >( node );
clipNode->setRegion( progressBar->subControlRect( Q::Groove ), rect );
return clipNode;
}
#include "moc_QskMaterial3ProgressBarSkinlet.cpp"

View File

@ -1,37 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_MATERIAL3_PROGRESSBAR_SKINLET_H
#define QSK_MATERIAL3_PROGRESSBAR_SKINLET_H
#include <QskProgressBarSkinlet.h>
class QskProgressBar;
class QskMaterial3ProgressBarSkinlet : QskProgressBarSkinlet
{
Q_GADGET
using Inherited = QskProgressBarSkinlet;
public:
enum NodeRole
{
StopIndicatorRole = Inherited::RoleCount,
RoleCount
};
Q_INVOKABLE QskMaterial3ProgressBarSkinlet( QskSkin* = nullptr );
protected:
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;
private:
QSGNode* updateStopIndicatorNode( const QskProgressBar*, QSGNode* ) const;
QSGNode* updateGrooveClipNode( const QskProgressBar*, QSGNode* ) const;
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -80,13 +80,7 @@ class QSK_MATERIAL3_EXPORT QskMaterial3Theme
QRgb outlineVariant;
QRgb surfaceContainerHighest;
QRgb surfaceContainerHighest38;
QRgb inverseSurface;
QRgb inverseOnSurface;
QRgb inversePrimary;
QRgb scrim;
QRgb shadow;
QskShadowMetrics elevation0;
@ -98,14 +92,6 @@ class QSK_MATERIAL3_EXPORT QskMaterial3Theme
const qreal focusOpacity = 0.12;
const qreal pressedOpacity = 0.12;
const qreal draggedOpacity = 0.16;
const qreal disabledOpacity = 0.38;
QRgb hoverColor( QRgb foreground, QRgb background ) const;
QRgb focusColor( QRgb foreground, QRgb background ) const;
QRgb pressedColor( QRgb foreground, QRgb background ) const;
QRgb disabledColor( QRgb foreground, QRgb background ) const;
qreal stateOpacity( int state ) const;
QskBoxShapeMetrics shapeExtraSmallTop;
};
@ -117,26 +103,34 @@ class QSK_MATERIAL3_EXPORT QskMaterial3Skin : public QskSkin
using Inherited = QskSkin;
public:
QskMaterial3Skin( const QskMaterial3Theme&, QObject* parent = nullptr );
~QskMaterial3Skin() override;
enum GraphicRole
{
GraphicRoleOnError,
GraphicRoleOnPrimary,
GraphicRoleOnPrimaryContainer,
GraphicRoleOnSecondaryContainer,
GraphicRoleOnSurface,
GraphicRoleOnSurface38,
GraphicRoleOnSurfaceVariant,
GraphicRolePrimary,
GraphicRoleSurface,
GraphicRoleSurfaceContainerHighest,
GraphicRoleSurfaceContainerHighest38,
};
QskMaterial3Skin( QObject* parent = nullptr );
~QskMaterial3Skin() override;
enum FontRole
{
M3BodyMedium = DefaultFont,
M3BodyLarge = LargeFont,
M3HeadlineSmall = SmallFont,
M3LabelLarge = HugeFont,
};
protected:
void initHints() override;
static constexpr QskAspect::Variation Filled = QskAspect::NoVariation;
static constexpr QskAspect::Variation Tonal = QskAspect::Huge;
static constexpr QskAspect::Variation Elevated = QskAspect::Large;
static constexpr QskAspect::Variation Outlined = QskAspect::Small;
static constexpr QskAspect::Variation Text = QskAspect::Tiny;
private:
void setupFonts();

View File

@ -6,7 +6,8 @@
#include "QskMaterial3SkinFactory.h"
#include "QskMaterial3Skin.h"
static const QString name = QStringLiteral( "Material3" );
static const QString materialLightSkinName = QStringLiteral( "Material3 Light" );
static const QString materialDarkSkinName = QStringLiteral( "Material3 Dark" );
QskMaterial3SkinFactory::QskMaterial3SkinFactory( QObject* parent )
: QskSkinFactory( parent )
@ -19,13 +20,21 @@ QskMaterial3SkinFactory::~QskMaterial3SkinFactory()
QStringList QskMaterial3SkinFactory::skinNames() const
{
return { name };
return { materialLightSkinName, materialDarkSkinName };
}
QskSkin* QskMaterial3SkinFactory::createSkin( const QString& skinName )
{
if ( QString::compare( skinName, name, Qt::CaseInsensitive ) == 0 )
return new QskMaterial3Skin();
if ( QString::compare( skinName, materialLightSkinName, Qt::CaseInsensitive ) == 0 )
{
QskMaterial3Theme theme( QskSkin::LightScheme );
return new QskMaterial3Skin( theme );
}
else if ( QString::compare( skinName, materialDarkSkinName, Qt::CaseInsensitive ) == 0 )
{
QskMaterial3Theme theme( QskSkin::DarkScheme );
return new QskMaterial3Skin( theme );
}
return nullptr;
}

View File

@ -1,124 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskMaterial3SliderSkinlet.h"
#include <QskSlider.h>
#include <QskClipNode.h>
#include <QskSGNode.h>
#include <QskFunctions.h>
using Q = QskSlider;
static inline bool qskHasOrigin( const QskSlider* slider )
{
return !qskFuzzyCompare( slider->origin(), slider->minimum() );
}
QskMaterial3SliderSkinlet::QskMaterial3SliderSkinlet( QskSkin* skin )
: Inherited( skin )
{
}
QRectF QskMaterial3SliderSkinlet::subControlRect( const QskSkinnable* skinnable,
const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const
{
if ( subControl == Q::Scale )
{
auto r = Inherited::subControlRect( skinnable, contentsRect, Q::Scale );
const auto handleSize = skinnable->strutSizeHint( Q::Handle );
const auto slider = static_cast< const QskSlider* >( skinnable );
if( slider->orientation() == Qt::Horizontal )
{
const auto m = 0.5 * handleSize.width();
r.adjust( m, 0.0, -m, 0.0 );
}
{
const auto m = 0.5 * handleSize.height();
r.adjust( 0.0, m, 0.0, -m );
}
return r;
}
return Inherited::subControlRect( skinnable, contentsRect, subControl );
}
QSGNode* QskMaterial3SliderSkinlet::updateSubNode(
const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
{
switch( nodeRole )
{
case GrooveRole:
case FillRole:
{
auto clippedNode = QskSGNode::findChildNode( node, nodeRole );
clippedNode = Inherited::updateSubNode( skinnable, nodeRole, clippedNode );
if ( clippedNode )
{
const auto slider = static_cast< const QskSlider* >( skinnable );
auto clipNode = QskSGNode::ensureNode< QskClipNode >( node );
clipNode->setRegion( slider->subControlRect( Q::Panel ),
slider->subControlRect( Q::Handle ) );
QskSGNode::setNodeRole( clippedNode, nodeRole );
QskSGNode::setParentNode( clippedNode, clipNode );
return clipNode;
}
return nullptr;
}
}
return Inherited::updateSubNode( skinnable, nodeRole, node );
}
QVector< qreal > QskMaterial3SliderSkinlet::graduation( const QskSlider* slider ) const
{
QVector< qreal > graduation;
if ( hasGraduation( slider ) )
{
const auto g = Inherited::graduation( slider );
// adding the boundaries
graduation.reserve( g.count() + 2 );
graduation += slider->minimum();
graduation += g;
graduation += slider->maximum();
}
else
{
const auto policy = slider->flagHint< Qsk::Policy >(
Q::Tick | QskAspect::Option, Qsk::Maybe );
if ( policy != Qsk::Never )
{
if ( qskHasOrigin( slider ) )
{
graduation.reserve( 3 );
graduation += slider->minimum();
graduation += slider->origin();
graduation += slider->maximum();
}
else
{
graduation.reserve( 1 );
graduation += slider->maximum();
}
}
}
return graduation;
}
#include "moc_QskMaterial3SliderSkinlet.cpp"

View File

@ -1,36 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskMaterial3TextFieldSkinlet.h"
#include "QskTextField.h"
QskMaterial3TextFieldSkinlet::QskMaterial3TextFieldSkinlet( QskSkin* skin )
: Inherited( skin )
{
}
QskMaterial3TextFieldSkinlet::~QskMaterial3TextFieldSkinlet()
{
}
QRectF QskMaterial3TextFieldSkinlet::subControlRect( const QskSkinnable* skinnable,
const QRectF& contentsRect, QskAspect::Subcontrol subControl ) const
{
return Inherited::subControlRect( skinnable, contentsRect, subControl );
}
QSGNode* QskMaterial3TextFieldSkinlet::updateSubNode(
const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
{
return Inherited::updateSubNode( skinnable, nodeRole, node );
}
QSizeF QskMaterial3TextFieldSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
return Inherited::sizeHint( skinnable, which, constraint );
}
#include "moc_QskMaterial3TextFieldSkinlet.cpp"

View File

@ -1,33 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_MATERIAL3_TEXTFIELD_SKINLET_H
#define QSK_MATERIAL3_TEXTFIELD_SKINLET_H
#include "QskMaterial3Global.h"
#include "QskTextFieldSkinlet.h"
class QSK_MATERIAL3_EXPORT QskMaterial3TextFieldSkinlet : public QskTextFieldSkinlet
{
Q_GADGET
using Inherited = QskTextFieldSkinlet;
public:
Q_INVOKABLE QskMaterial3TextFieldSkinlet( QskSkin* = nullptr );
~QskMaterial3TextFieldSkinlet() override;
QRectF subControlRect( const QskSkinnable*,
const QRectF& rect, QskAspect::Subcontrol ) const override;
QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;
protected:
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;
};
#endif

View File

@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/m3">
<file>icons/qvg/check_small.qvg</file>
<file>icons/qvg/combo-box-arrow-closed.qvg</file>
<file>icons/qvg/combo-box-arrow-open.qvg</file>
<file>icons/qvg/segmented-button-check.qvg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,4 @@
<svg width="12" height="10" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 9.4L0 5.4L1.4 4L4 6.6L10.6 0L12 1.4L4 9.4Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 175 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 157 B

View File

@ -0,0 +1,4 @@
<svg width="8" height="5" viewBox="0 0 8 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.25 0.5L4 4.25L7.75 0.5H0.25Z" transform="rotate(180 4 2.5)" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

View File

@ -0,0 +1,4 @@
<svg width="14" height="11" viewBox="0 0 14 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.24914 8.12738L1.12164 4.99988L0.0566406 6.05738L4.24914 10.2499L13.2491 1.24988L12.1916 0.192383L4.24914 8.12738Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 246 B

View File

@ -1,15 +0,0 @@
#! /bin/sh
function symbol2qvg {
fontfile=MaterialSymbolsOutlined.ttf
glyph2qvg ${fontfile} 24 $1 qvg/$2.qvg
}
symbol2qvg 3067 check
symbol2qvg 3084 close
symbol2qvg 5022 arrow_drop_down
symbol2qvg 5023 arrow_drop_up
symbol2qvg 3082 add
symbol2qvg 3080 remove

View File

@ -1,4 +1,5 @@
{
"FactoryId": "Material3Factory",
"Skins": [ "Material3" ]
"Skins": [ { "Name": "Material3 Light", "Scheme": "Light" },
{ "Name": "Material3 Dark", "Scheme": "Dark" } ]
}

View File

@ -3,12 +3,8 @@
# SPDX-License-Identifier: BSD-3-Clause
############################################################################
set(SOURCES main.cpp)
set(target systemdialogs)
qsk_add_example(${target} ${SOURCES})
target_link_libraries(${target} PRIVATE
Qt::QuickDialogs2UtilsPrivate
Qt::QuickDialogs2Private
qsk_add_plugin(squiekskin skins QskSquiekSkinFactory
QskSquiekGlobal.h QskSquiekSkin.h QskSquiekSkin.cpp
QskSquiekSkinFactory.h QskSquiekSkinFactory.cpp
)
set_target_properties(squiekskin PROPERTIES DEFINE_SYMBOL QSK_SQUIEK_MAKEDLL)

View File

@ -0,0 +1,25 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_SQUIEK_GLOBAL_H
#define QSK_SQUIEK_GLOBAL_H
#include "QskGlobal.h"
#ifdef QSK_DLL
#if defined( QSK_SQUIEK_MAKEDLL ) // create a DLL library
#define QSK_SQUIEK_EXPORT Q_DECL_EXPORT
#else // use a DLL library
#define QSK_SQUIEK_EXPORT Q_DECL_IMPORT
#endif
#endif // QSK_DLL
#ifndef QSK_SQUIEK_EXPORT
#define QSK_SQUIEK_EXPORT
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_SQUIEK_SKIN_H
#define QSK_SQUIEK_SKIN_H
#include "QskSquiekGlobal.h"
#include <QskSkin.h>
#include <memory>
class QSK_SQUIEK_EXPORT QskSquiekSkin : public QskSkin
{
Q_OBJECT
using Inherited = QskSkin;
public:
QskSquiekSkin( QObject* parent = nullptr );
~QskSquiekSkin() override;
private:
void resetColors( const QColor& accent ) override;
void addGraphicRole( int role, const QColor& );
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};
#endif

View File

@ -0,0 +1,33 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "QskSquiekSkinFactory.h"
#include "QskSquiekSkin.h"
static const QString squiekSkinName = QStringLiteral( "Squiek" );
QskSquiekSkinFactory::QskSquiekSkinFactory( QObject* parent )
: QskSkinFactory( parent )
{
}
QskSquiekSkinFactory::~QskSquiekSkinFactory()
{
}
QStringList QskSquiekSkinFactory::skinNames() const
{
return { squiekSkinName };
}
QskSkin* QskSquiekSkinFactory::createSkin( const QString& skinName )
{
if ( QString::compare( skinName, squiekSkinName, Qt::CaseInsensitive ) == 0 )
return new QskSquiekSkin();
return nullptr;
}
#include "moc_QskSquiekSkinFactory.cpp"

View File

@ -0,0 +1,29 @@
/******************************************************************************
* QSkinny - Copyright (C) The authors
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#ifndef QSK_SQUIEK_SKIN_FACTORY_H
#define QSK_SQUIEK_SKIN_FACTORY_H
#include "QskSquiekGlobal.h"
#include <QskSkinFactory.h>
class QSK_SQUIEK_EXPORT QskSquiekSkinFactory : public QskSkinFactory
{
Q_OBJECT
#if defined( QSK_SQUIEK_MAKEDLL )
Q_PLUGIN_METADATA( IID QskSkinFactoryIID FILE "metadata.json" )
Q_INTERFACES( QskSkinFactory )
#endif
public:
QskSquiekSkinFactory( QObject* parent = nullptr );
~QskSquiekSkinFactory() override;
QStringList skinNames() const override;
QskSkin* createSkin( const QString& skinName ) override;
};
#endif

View File

@ -0,0 +1,4 @@
{
"FactoryId": "SquiekFactory",
"Skins": [ { "Name": "Squiek", "Scheme": "Unknown" } ]
}

View File

@ -1,4 +1,4 @@
# Doxyfile 1.9.8
# Doxyfile 1.9.3
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@ -12,16 +12,6 @@
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#
# Note:
#
# Use doxygen to compare the used configuration file with the template
# configuration file:
# doxygen -x [configFile]
# Use doxygen to compare the used configuration file with the template
# configuration file without replacing the environment variables or CMake type
# replacement variables:
# doxygen -x_noenv [configFile]
#---------------------------------------------------------------------------
# Project related configuration options
@ -48,13 +38,13 @@ PROJECT_NAME = QSkinny
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = 0.8.0
PROJECT_NUMBER = 0.0.1
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.
PROJECT_BRIEF = C++/Qt UI toolkit
PROJECT_BRIEF =
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
@ -68,30 +58,18 @@ PROJECT_LOGO =
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
OUTPUT_DIRECTORY = api
OUTPUT_DIRECTORY =
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format
# and will distribute the generated files over these directories. Enabling this
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
# control the number of sub-directories.
# performance problems for the file system.
# The default value is: NO.
CREATE_SUBDIRS = NO
# Controls the number of sub-directories that will be created when
# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
# level increment doubles the number of directories, resulting in 4096
# directories at level 8 which is the default and also the maximum value. The
# sub-directories are organized in 2 levels, the first level always has a fixed
# number of 16 directories.
# Minimum value: 0, maximum value: 8, default value: 8.
# This tag requires that the tag CREATE_SUBDIRS is set to YES.
CREATE_SUBDIRS_LEVEL = 8
# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
@ -103,14 +81,14 @@ ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
# English messages), Korean, Korean-en (Korean with English messages), Latvian,
# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
# Swedish, Turkish, Ukrainian and Vietnamese.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
# Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
@ -358,17 +336,6 @@ MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 5
# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to
# generate identifiers for the Markdown headings. Note: Every identifier is
# unique.
# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a
# sequence number starting at 0 and GITHUB use the lower case version of title
# with any whitespace replaced by '-' and punctuation characters removed.
# The default value is: DOXYGEN.
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
MARKDOWN_ID_STYLE = DOXYGEN
# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by putting a % sign in front of the word or
@ -480,7 +447,7 @@ TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
# during processing. When set to 0 doxygen will based this on the number of
# cores available in the system. You can set it explicitly to a value larger
# than 0 to get more control over the balance between CPU load and processing
@ -493,14 +460,6 @@ LOOKUP_CACHE_SIZE = 0
NUM_PROC_THREADS = 1
# If the TIMESTAMP tag is set different from NO then each generated page will
# contain the date or date and time when the page was generated. Setting this to
# NO can help when comparing the output of multiple runs.
# Possible values are: YES, NO, DATETIME and DATE.
# The default value is: NO.
TIMESTAMP = NO
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@ -582,8 +541,7 @@ HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option
# will also hide undocumented C++ concepts if enabled. This option has no effect
# if EXTRACT_ALL is enabled.
# has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.
HIDE_UNDOC_CLASSES = NO
@ -614,15 +572,14 @@ INTERNAL_DOCS = NO
# filesystem is case sensitive (i.e. it supports files in the same directory
# whose names only differ in casing), the option must be set to YES to properly
# deal with such files in case they appear in the input. For filesystems that
# are not case sensitive the option should be set to NO to properly deal with
# are not case sensitive the option should be be set to NO to properly deal with
# output files written for symbols that only differ in casing, such as for two
# classes, one named CLASS and the other named Class, and to also support
# references to files without having to specify the exact matching casing. On
# Windows (including Cygwin) and MacOS, users should typically set this option
# to NO, whereas on Linux or other Unix flavors it should typically be set to
# YES.
# Possible values are: SYSTEM, NO and YES.
# The default value is: SYSTEM.
# The default value is: system dependent.
CASE_SENSE_NAMES = YES
@ -874,26 +831,11 @@ WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
# undocumented enumeration values. If set to NO, doxygen will accept
# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: NO.
WARN_IF_UNDOC_ENUM_VAL = NO
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
# at the end of the doxygen process doxygen will return with a non-zero status.
# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves
# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not
# write the warning messages in between other messages but write them at the end
# of a run, in case a WARN_LOGFILE is defined the warning messages will be
# besides being in the defined file also be shown at the end of a run, unless
# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case
# the behavior will remain as with the setting FAIL_ON_WARNINGS.
# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT.
# Possible values are: NO, YES and FAIL_ON_WARNINGS.
# The default value is: NO.
WARN_AS_ERROR = NO
@ -904,21 +846,10 @@ WARN_AS_ERROR = NO
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
# In the $text part of the WARN_FORMAT command it is possible that a reference
# to a more specific place is given. To make it easier to jump to this place
# (outside of doxygen) the user can define a custom "cut" / "paste" string.
# Example:
# WARN_LINE_FORMAT = "'vi $file +$line'"
# See also: WARN_FORMAT
# The default value is: at line $line of file $file.
WARN_LINE_FORMAT = "at line $line of file $file"
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr). In case the file specified cannot be opened for writing the
@ -947,21 +878,10 @@ INPUT = . \
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see:
# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
# This tag can be used to specify the character encoding of the source files
# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
# character encoding on a per file pattern basis. Doxygen will compare the file
# name with each pattern and apply the encoding instead of the default
# INPUT_ENCODING) if there is a match. The character encodings are a list of the
# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
# "INPUT_ENCODING" for further information on supported encodings.
INPUT_FILE_ENCODING =
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
@ -973,12 +893,12 @@ INPUT_FILE_ENCODING =
# Note the list of default checked file patterns might differ from the list of
# default file extension mappings.
#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl,
# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php,
# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be
# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
# *.vhdl, *.ucf, *.qsf and *.ice.
FILE_PATTERNS =
@ -1011,22 +931,20 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
EXCLUDE_PATTERNS = *Private.* \
moc*.cpp \
*.moc
EXCLUDE_PATTERNS = *Private.* moc*.cpp *.moc
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
# ANamespace::AClass, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
EXCLUDE_SYMBOLS = QskPainterCommand::PixmapData \
QskPainterCommand::ImageData \
QskPainterCommand::StateData \
QHash \
QList \
std
QskPainterCommand::StateData
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
@ -1069,11 +987,6 @@ IMAGE_PATH = images
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
# Note that doxygen will use the data processed and written to standard output
# for further processing, therefore nothing else, like debug statements or used
# commands (so in case of a Windows batch file always use @echo OFF), should be
# written to standard output.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.
@ -1115,15 +1028,6 @@ FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
# The Fortran standard specifies that for fixed formatted Fortran code all
# characters from position 72 are to be considered as comment. A common
# extension is to allow longer lines before the automatic comment starts. The
# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
# be processed before the automatic comment starts.
# Minimum value: 7, maximum value: 10000, default value: 72.
FORTRAN_COMMENT_AFTER = 72
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
@ -1210,46 +1114,6 @@ USE_HTAGS = NO
VERBATIM_HEADERS = YES
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
# clang parser (see:
# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
# performance. This can be particularly helpful with template rich C++ code for
# which doxygen's built-in parser lacks the necessary type information.
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake.
# The default value is: NO.
CLANG_ASSISTED_PARSING = NO
# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
# tag is set to YES then doxygen will add the directory of each input to the
# include path.
# The default value is: YES.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
CLANG_ADD_INC_PATHS = YES
# If clang assisted parsing is enabled you can provide the compiler with command
# line options that you would normally use when invoking the compiler. Note that
# the include paths will already be set by doxygen for the files and directories
# specified with INPUT and INCLUDE_PATH.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
CLANG_OPTIONS =
# If clang assisted parsing is enabled you can provide the clang parser with the
# path to the directory containing a file called compile_commands.json. This
# file is the compilation database (see:
# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
# options used when the source files were built. This is equivalent to
# specifying the -p option to a clang tool, such as clang-check. These options
# will then be passed to the parser. Any options specified with CLANG_OPTIONS
# will be added as well.
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake.
CLANG_DATABASE_PATH =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
@ -1261,11 +1125,10 @@ CLANG_DATABASE_PATH =
ALPHABETICAL_INDEX = YES
# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
# that should be ignored while generating the index headers. The IGNORE_PREFIX
# tag works for classes, function and member names. The entity will be placed in
# the alphabetical list under the first letter of the entity name that remains
# after removing the prefix.
# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX = Qsk \
@ -1345,15 +1208,10 @@ HTML_STYLESHEET =
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# list). For an example see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = ./customdoxygen.css
HTML_EXTRA_STYLESHEET =
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@ -1365,19 +1223,6 @@ HTML_EXTRA_STYLESHEET = ./customdoxygen.css
HTML_EXTRA_FILES =
# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
# should be rendered with a dark or light theme.
# Possible values are: LIGHT always generate light mode output, DARK always
# generate dark mode output, AUTO_LIGHT automatically set the mode according to
# the user preference, use light mode if no preference is set (the default),
# AUTO_DARK automatically set the mode according to the user preference, use
# dark mode if no preference is set and TOGGLE allow to user to switch between
# light and dark mode via a button.
# The default value is: AUTO_LIGHT.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE = AUTO_LIGHT
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
# this color. Hue is specified as an angle on a color-wheel, see
@ -1387,7 +1232,7 @@ HTML_COLORSTYLE = AUTO_LIGHT
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_HUE = 30
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use gray-scales only. A
@ -1406,7 +1251,16 @@ HTML_COLORSTYLE_SAT = 100
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_GAMMA = 80
HTML_COLORSTYLE_GAMMA = 130
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to YES can help to show when doxygen was last run and thus if the
# documentation is up to date.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_TIMESTAMP = NO
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
# documentation will contain a main index with vertical navigation menus that
@ -1427,13 +1281,6 @@ HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO
# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be
# dynamically folded and expanded in the generated HTML source code.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_CODE_FOLDING = YES
# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
@ -1564,16 +1411,6 @@ BINARY_TOC = NO
TOC_EXPAND = NO
# The SITEMAP_URL tag is used to specify the full URL of the place where the
# generated documentation will be placed on the server by the user during the
# deployment of the documentation. The generated sitemap is called sitemap.xml
# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL
# is specified no sitemap is generated. For information about the sitemap
# protocol see https://www.sitemaps.org
# This tag requires that the tag GENERATE_HTML is set to YES.
SITEMAP_URL =
# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
@ -1749,6 +1586,17 @@ HTML_FORMULA_FORMAT = svg
FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_TRANSPARENT = YES
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details.
@ -2062,16 +1910,9 @@ PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
# mode nothing is printed on the terminal, errors are scrolled as if <return> is
# hit at every error; missing files that TeX tries to input or request from
# keyboard input (\read on a not open input stream) cause the job to abort,
# NON_STOP In nonstop mode the diagnostic message will appear on the terminal,
# but there is no possibility of user interaction just like in batch mode,
# SCROLL In scroll mode, TeX will stop only for missing files to input or if
# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at
# each error, asking for user intervention.
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
# if errors occur, instead of asking the user for help.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@ -2092,6 +1933,14 @@ LATEX_HIDE_INDICES = NO
LATEX_BIB_STYLE = plain
# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
# page will contain the date and time when the page was generated. Setting this
# to NO can help when comparing the output of multiple runs.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_TIMESTAMP = NO
# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
# path from which the emoji images will be read. If a relative path is entered,
# it will be relative to the LATEX_OUTPUT directory. If left blank the
@ -2257,39 +2106,13 @@ DOCBOOK_OUTPUT = docbook
#---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
# the structure of the code including all documentation. Note that this feature
# is still experimental and incomplete at the moment.
# The default value is: NO.
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to Sqlite3 output
#---------------------------------------------------------------------------
# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3
# database with symbols found by doxygen stored in tables.
# The default value is: NO.
GENERATE_SQLITE3 = NO
# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
# in front of it.
# The default directory is: sqlite3.
# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
SQLITE3_OUTPUT = sqlite3
# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
# database file will be recreated with each doxygen run. If set to NO, doxygen
# will warn if an a database file is already found and not modify it.
# The default value is: YES.
# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
SQLITE3_RECREATE_DB = YES
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
@ -2364,8 +2187,7 @@ SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
# RECURSIVE has no effect here.
# preprocessor.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH =
@ -2433,15 +2255,15 @@ TAGFILES =
GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
# will be listed in the class and namespace index. If set to NO, only the
# inherited external classes will be listed.
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be
# listed.
# The default value is: NO.
ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
# in the topic index. If set to NO, only the current project's groups will be
# in the modules index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.
@ -2455,9 +2277,16 @@ EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
#---------------------------------------------------------------------------
# Configuration options related to diagram generator tools
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.
DIA_PATH =
# If set to YES the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.
@ -2466,10 +2295,10 @@ HIDE_UNDOC_RELATIONS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: YES.
# The default value is: NO.
HAVE_DOT = YES
@ -2483,51 +2312,37 @@ HAVE_DOT = YES
DOT_NUM_THREADS = 0
# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
# subgraphs. When you want a differently looking font in the dot files that
# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
# Edge and Graph Attributes specification</a> You need to make sure dot is able
# to find the font, which can be done by putting it in a standard location or by
# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
# directory containing the font. Default graphviz fontsize is 14.
# The default value is: fontname=Helvetica,fontsize=10.
# When you want a differently looking font in the dot files that doxygen
# generates you can specify the font name using DOT_FONTNAME. You need to make
# sure dot is able to find the font, which can be done by putting it in a
# standard location or by setting the DOTFONTPATH environment variable or by
# setting DOT_FONTPATH to the directory containing the font.
# The default value is: Helvetica.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
DOT_FONTNAME = Helvetica
# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
# arrows shapes.</a>
# The default value is: labelfontname=Helvetica,labelfontsize=10.
# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# dot graphs.
# Minimum value: 4, maximum value: 24, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
DOT_FONTSIZE = 10
# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
# around nodes set 'shape=plain' or 'shape=plaintext' <a
# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
# You can set the path where dot can find font specified with fontname in
# DOT_COMMON_ATTR and others dot attributes.
# By default doxygen will tell dot to use the default font as specified with
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# the path where dot can find it using this tag.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH =
# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will
# generate a graph for each documented class showing the direct and indirect
# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
# relations will be shown as texts / links.
# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
# graph for each documented class showing the direct and indirect inheritance
# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
# to TEXT the direct and indirect inheritance relations will be shown as texts /
# links.
# Possible values are: NO, YES, TEXT and GRAPH.
# The default value is: YES.
CLASS_GRAPH = YES
@ -2535,21 +2350,14 @@ CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the
# class with other documented classes. Explicit enabling a collaboration graph,
# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the
# command \collaborationgraph. Disabling a collaboration graph can be
# accomplished by means of the command \hidecollaborationgraph.
# class with other documented classes.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
COLLABORATION_GRAPH = NO
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies. Explicit enabling a group
# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means
# of the command \groupgraph. Disabling a directory graph can be accomplished by
# means of the command \hidegroupgraph. See also the chapter Grouping in the
# manual.
# groups, showing the direct groups dependencies.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@ -2609,9 +2417,7 @@ TEMPLATE_RELATIONS = NO
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
# YES then doxygen will generate a graph for each documented file showing the
# direct and indirect include dependencies of the file with other documented
# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO,
# can be accomplished by means of the command \includegraph. Disabling an
# include graph can be accomplished by means of the command \hideincludegraph.
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@ -2620,10 +2426,7 @@ INCLUDE_GRAPH = YES
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
# the direct and indirect include dependencies of the file with other documented
# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set
# to NO, can be accomplished by means of the command \includedbygraph. Disabling
# an included by graph can be accomplished by means of the command
# \hideincludedbygraph.
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@ -2663,10 +2466,7 @@ GRAPHICAL_HIERARCHY = YES
# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between the
# files in the directories. Explicit enabling a directory graph, when
# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command
# \directorygraph. Disabling a directory graph can be accomplished by means of
# the command \hidedirectorygraph.
# files in the directories.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@ -2682,13 +2482,12 @@ DIR_GRAPH_MAX_DEPTH = 1
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see:
# https://www.graphviz.org/)).
# http://www.graphviz.org/)).
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement).
# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd,
# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd,
# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
# png:gdiplus:gdiplus.
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.
@ -2720,12 +2519,11 @@ DOT_PATH =
DOTFILE_DIRS =
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.
# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).
DIA_PATH =
MSCFILE_DIRS =
# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
@ -2775,6 +2573,18 @@ DOT_GRAPH_MAX_NODES = 20
MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = YES
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
@ -2802,19 +2612,3 @@ GENERATE_LEGEND = NO
# The default value is: YES.
DOT_CLEANUP = YES
# You can define message sequence charts within doxygen comments using the \msc
# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will
# use a built-in version of mscgen tool to produce the charts. Alternatively,
# the MSCGEN_TOOL tag can also specify the name an external tool. For instance,
# specifying prog as the value, doxygen will call the tool as prog -T
# <outfile_format> -o <outputfile> <inputfile>. The external tool should support
# output file formats "png", "eps", "svg", and "ismap".
MSCGEN_TOOL =
# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).
MSCFILE_DIRS =

View File

@ -8,7 +8,7 @@
what is needed to support a layout system, that is on par with what
is known from Qt/Widgets.
\todo Explain: QskItem::geometry(), QskItem::rect(),
\todo Explain: QskQuickItem::geometry(), QskQuickItem::rect(),
QQuickItem::boundingRect(), layoutRect(), contentsRect(),
subControlRect(), focusIndicatorRect(), QQuickItem::clipRect(),
QQuickItem::contains()
@ -22,7 +22,7 @@
A state bit that is set, when QQuickItem::isEnabled() == false.
\extends QskAspect::State
\sa QskItem::setDisabled()
\sa QskQuickItem::setDisabled()
\saqt QQuickItem::enabled
\var QskControl::Hovered
@ -71,7 +71,7 @@
\accessors autoLayoutChildren(), setAutoLayoutChildren()
\sa layoutRect(), layoutHints(), layoutAlignmentHint(),
QskItem::transparentForPositioners
QskQuickItem::transparentForPositioners
\saqt QQuickItem::updatePolish()
\note Auto layouting is similar to what happens when putting several items
@ -274,7 +274,7 @@
\aspect QskControl::Background | QskAspect::Color
\sa setBackground()
\sa QskItem::DebugForceBackground
\sa QskQuickItem::DebugForceBackground
*/
/*!
@ -554,7 +554,7 @@
A control has an impact on the layout calutaions, when:
- isTransparentForPositioner() is false
- QskItem::isVisibleToParent() is true, or RetainSizeWhenHidden is set
- QskQuickItem::isVisibleToParent() is true, or RetainSizeWhenHidden is set
\sa isVisibleToParent(), RetainSizeWhenHidden
*/

View File

@ -53,7 +53,7 @@
The default value
\accessors visiblePolicy(), setVisiblePolicy()
\sa hiddenPolicy, QskItem::isVisibleToParent(), qskIsVisibleToParent()
\sa hiddenPolicy, QskQuickItem::isVisibleToParent(), qskIsVisibleToParent()
\note QskPlacementPolicy::Ignore is stored in the transparentForPositioner
bit in QQuickItem and might have an impact on Qt/Quick layout code.
@ -78,7 +78,7 @@
Sometimes an item wants to have its proper size even when being hidden.
\accessors hiddenPolicy(), setHiddenPolicy()
\sa visiblePolicy, QskItem::isVisibleToParent(), qskIsVisibleToParent()
\sa visiblePolicy, QskQuickItem::isVisibleToParent(), qskIsVisibleToParent()
\note QskPlacementPolicy::Ignore is stored in the transparentForPositioner
bit in QQuickItem and might have an impact on Qt/Quick layout code.

View File

@ -1,25 +1,25 @@
/*!
\class QskItem QskItem.h
\class QskQuickItem QskQuickItem.h
\ingroup Framework
QskItem completes the C++ API of QQuickItem and re-establishs basic
QskQuickItem completes the C++ API of QQuickItem and re-establishs basic
concepts like events. It also offers better control over the operations
happening in the update cycle.
*/
/*!
\enum QskItem::UpdateFlag
\enum QskQuickItem::UpdateFlag
Qt/Quick classes have a tendency to update items too early
and too often. To avoid processing of unwanted operations
QskItem implements a couple of modifications, that
QskQuickItem implements a couple of modifications, that
can be en/disabled individually.
\sa updateFlags(), resetUpdateFlags()
testUpdateFlag(), setUpdateFlag(), resetUpdateFlag()
\var QskItem::UpdateFlag QskItem::DeferredUpdate
\var QskQuickItem::UpdateFlag QskQuickItem::DeferredUpdate
Creating of scene graph nodes is blocked when being invisible.
@ -37,7 +37,7 @@
such as viewport frustrum culling (i.e. hiding items outside of the
window geometry).
\var QskItem::UpdateFlag QskItem::DeferredPolish
\var QskQuickItem::UpdateFlag QskQuickItem::DeferredPolish
Polishing an item is blocked when being invisible.
F.e for all items being derived from QskControl the layout calculations
@ -45,7 +45,7 @@
\saqt QQuickItem::updatePolish(), QQuickItem::polish()
\var QskItem::UpdateFlag QskItem::DeferredLayout
\var QskQuickItem::UpdateFlag QskQuickItem::DeferredLayout
Recalculations of the implicitSize are blocked until being explicitly requested.
@ -54,15 +54,15 @@
without recalculating the actual size hints ( f.e the implicitSize ).
When having layout code that relies on binding the implicit width/height
the QskItem::DeferredLayout flag needs to be disabled.
the QskQuickItem::DeferredLayout flag needs to be disabled.
\note All layout classes offered by the Qt/Quick modules of the Qt Company
( f.e anchors ) do require immediate updates of the implicit size.
\sa QskItem::resetImplicitSize()
\sa QskQuickItem::resetImplicitSize()
\saqt QQuickItem::implicitSize()
\var QskItem::UpdateFlag QskItem::CleanupOnVisibility
\var QskQuickItem::UpdateFlag QskQuickItem::CleanupOnVisibility
Delete scene graph nodes, when the item becomes hidden.
Enabling this mode will reduce the memory footprint, but comes at the cost
@ -70,12 +70,12 @@
\saqt QQuickItem::isVisible()
\var QskItem::UpdateFlag QskItem::PreferRasterForTextures
\var QskQuickItem::UpdateFlag QskQuickItem::PreferRasterForTextures
When creating textures from QskGraphic, prefer the raster paint
engine over the OpenGL paint engine.
\var QskItem::UpdateFlag QskItem::DebugForceBackground
\var QskQuickItem::UpdateFlag QskQuickItem::DebugForceBackground
Always fill the background of the item with a random color.
@ -84,7 +84,7 @@
*/
/*!
\property QskItem::geometry
\property QskQuickItem::geometry
This property holds the geometry of the item relative to its parent item.
When changing the geometry, the item receives a QskEvent::GeometryChange event.
@ -93,7 +93,7 @@
*/
/*!
\property QskItem::rect
\property QskQuickItem::rect
This property returns the internal geometry of the item.
It equals QRect(0, 0, width(), height() ).
@ -102,7 +102,7 @@
*/
/*!
\var QskItem::transparentForPositioners
\var QskQuickItem::transparentForPositioners
When transparentForPositioners is set the item indicates, that it should be excluded
from any layout calculations. This flag is actually a concept of QQuickItem, that
@ -112,7 +112,7 @@
*/
/*!
\property QskItem::tabFence
\property QskQuickItem::tabFence
The tabFence flag can be used to create local tab focus chains. It is usually
used in combination with QQuickItem::ItemIsFocusScope.
@ -125,7 +125,7 @@
*/
/*!
\property QskItem::visibleToParent
\property QskQuickItem::visibleToParent
Flag indicating if an item would become visible if its parentItem() is shown.
The implementation relies on the internal explicitVisible flag, that has not
@ -142,7 +142,7 @@
*/
/*!
\property QskItem::polishOnResize
\property QskQuickItem::polishOnResize
When polishOnResize is set QQuickItem::polish() will be called automatically
whenever the size of the item has been changed. This is usually necessary
@ -153,7 +153,7 @@
*/
/*!
\property QskItem::initiallyPainted
\property QskQuickItem::initiallyPainted
Status flag indicating that there has already been a call
of QQuickItem::updatePaintNode() since the item has become visible.
@ -165,7 +165,7 @@
*/
/*!
\property QskItem::hasChildItems
\property QskQuickItem::hasChildItems
A property indicating if the item has child items.
@ -173,40 +173,40 @@
*/
/*!
\property QskItem::updateFlags
\property QskQuickItem::updateFlags
QskItem offers several tweaks to the Qt/Quick update cycle,
QskQuickItem offers several tweaks to the Qt/Quick update cycle,
that can be en/disabled individually.
The flags are a combination from bits that have been explicitly set
by setUpdateFlag() and those being derived from the aapplication
wide default settings, that can be set with QskSetup.
\sa QskItem::UpdateFlag, QskItem::updateFlags(), QskSetup::itemUpdateFlags()
\sa QskQuickItem::UpdateFlag, QskQuickItem::updateFlags(), QskSetup::itemUpdateFlags()
*/
/*!
\fn QskItem::QskItem
\fn QskQuickItem::QskQuickItem
Sets the QQuickItem::ItemHasContents flag to true.
*/
*!
\fn QskItem::~QskItem
\fn QskQuickItem::~QskQuickItem
Sets the componentComplete to false, so that its about-to-delete state is known
when detaching it from parent/window.
*/
/*!
\fn QskItem::className
\fn QskQuickItem::className
A convenience wrapper for metaObject()->className()
\return Class name
*/
/*!
\fn QskItem::isVisibleTo
\fn QskQuickItem::isVisibleTo
The true case occurs if neither the item itself nor any parent up to but excluding
ancestor has been explicitly hidden.
@ -218,7 +218,7 @@
*/
/*!
\fn QskItem::isVisibleToParent
\fn QskQuickItem::isVisibleToParent
An item might be invisible because it has been explicitly hidden or
one of its ancestors has been hidden. isVisibleToParent() indicates
@ -231,14 +231,14 @@
*/
/*!
\fn QskItem::hasChildItems() const
\fn QskQuickItem::hasChildItems() const
\return true, if the item has child items
\sa hasChildItems
*/
/*!
\fn QskItem::setGeometry( qreal, qreal, qreal, qreal )
\fn QskQuickItem::setGeometry( qreal, qreal, qreal, qreal )
Set the position and the size of an item
@ -252,7 +252,7 @@
*/
/*!
\fn QskItem::setGeometry( const QPointF &, const QSizeF & )
\fn QskQuickItem::setGeometry( const QPointF &, const QSizeF & )
Set the position and the size of an item
@ -261,7 +261,7 @@
*/
/*!
\fn QskItem::setGeometry( const QRectF& )
\fn QskQuickItem::setGeometry( const QRectF& )
Set the position and the size of an item
@ -272,14 +272,14 @@
*/
/*!
\fn QskItem::geometry() const
\fn QskQuickItem::geometry() const
\return Position and size relative to the parent item
\sa geometry, setGeometry()
*/
/*!
\fn QskItem::geometryChange
\fn QskQuickItem::geometryChange
This overloaded notifier calls QQuickItem::polish() depending on the
polishOnResize() flag and forwards the notification to the event queue.
@ -288,14 +288,14 @@
*/
/*!
\fn QskItem::rect() const
\fn QskQuickItem::rect() const
\return Internal geometry of the item, where the position is always at ( 0, 0 )
\sa geometry
*/
/*!
\fn QskItem::implicitSize
\fn QskQuickItem::implicitSize
Qt/Quick offers an oversimplified layout system that is based on the
property bindings of implicit width and height. QSkinny restablishs a layout
@ -308,56 +308,56 @@
\return Implicit size,
\note Layout code that relies on property bindings of the implicit width a height
needs to disable the QskItem::DeferredLayout flag
needs to disable the QskQuickItem::DeferredLayout flag
\sa QskControl::preferredSize(), QskControl::sizeHint()
\saqt QQuickItem::implicitWidth(), QQuickItem::implicitHeight()
*/
/*!
\fn QskItem::setPolishOnResize
\fn QskQuickItem::setPolishOnResize
Set or clear the polishOnResize flag.
\sa polishOnResize
*/
/*!
\fn QskItem::polishOnResize() const
\fn QskQuickItem::polishOnResize() const
\return Value of the polishOnResize flag
\sa setPolishOnResize()
*/
/*!
\fn QskItem::setTransparentForPositioner
\fn QskQuickItem::setTransparentForPositioner
Set or clear the transparentForPositioner flag
\sa isTransparentForPositioner()
*/
/*!
\fn QskItem::isTransparentForPositioner
\fn QskQuickItem::isTransparentForPositioner
\return Value of the transparentForPositioner flag
\sa transparentForPositioner
*/
/*!
\fn QskItem::setTabFence
\fn QskQuickItem::setTabFence
Set or clear the tabFence property
\sa isTabFence()
*/
/*!
\fn QskItem::isTabFence
\fn QskQuickItem::isTabFence
\return Value of the tabFence property
\sa setTransparentForPositioner()
*/
/*!
\fn QskItem::setLayoutMirroring
\fn QskQuickItem::setLayoutMirroring
Change the direction how the content is laid out horizontally.
@ -373,7 +373,7 @@
*/
/*!
\fn QskItem::resetLayoutMirroring
\fn QskQuickItem::resetLayoutMirroring
Clear the layoutMirroring property
@ -381,7 +381,7 @@
*/
/*!
\fn QskItem::layoutMirroring() const
\fn QskQuickItem::layoutMirroring() const
Direction how the content is layed out horizontally.
@ -402,7 +402,7 @@
*/
/*!
\fn QskItem::resetUpdateFlags
\fn QskQuickItem::resetUpdateFlags
Reset all flags to the default settings
@ -410,16 +410,16 @@
*/
/*!
\fn QskItem::updateFlags() const
\fn QskQuickItem::updateFlags() const
\return Flags affecting the item update process
\sa testUpdateFlag(), setUpdateFlag(), updateFlags
*/
/*!
\fn QskItem::setUpdateFlag
\fn QskQuickItem::setUpdateFlag
QskItem offers several tweaks to the Qt/Quick update cycle,
QskQuickItem offers several tweaks to the Qt/Quick update cycle,
that can be en/disables individually.
The default settings for these flags are taken from QskSetup::itemUpdateFlags()
@ -434,7 +434,7 @@
*/
/*!
\fn QskItem::resetUpdateFlag
\fn QskQuickItem::resetUpdateFlag
Reset the value for flag to the default settings from QskSetup. Future
changes of the corresponding bit with QskSetup::setItemUpdateFlag() will affect
@ -445,7 +445,7 @@
*/
/*!
\fn QskItem::testUpdateFlag
\fn QskQuickItem::testUpdateFlag
\param Flag affecting the item update process
\return true, when the corresponding bit is effective
@ -454,7 +454,7 @@
*/
/*!
\fn QskItem::updateFlagsChanged
\fn QskQuickItem::updateFlagsChanged
Signal indicating, that the effective update flags have changed
@ -463,7 +463,7 @@
*/
/*!
\fn QskItem::classBegin
\fn QskQuickItem::classBegin
The QML engine initializes an item as being incomplete by
explicitly calling classBegin(). Once the item
@ -481,7 +481,7 @@
*/
/*!
\fn QskItem::componentComplete
\fn QskQuickItem::componentComplete
The QML engine initilizes an item as being incomplete by
explicitly calling QQuickItem::classBegin(). Once the item
@ -499,7 +499,7 @@
*/
/*!
\fn QskItem::releaseResources
\fn QskQuickItem::releaseResources
This specific hook is called, when the item is about to be removed
from the window it was previously rendering to.
@ -510,7 +510,7 @@
*/
/*!
\fn QskItem::isPolishScheduled
\fn QskQuickItem::isPolishScheduled
\return True, if the item will be polished in the next
scene graph update cycle.
@ -519,21 +519,21 @@
*/
/*!
\fn QskItem::isUpdateNodeScheduled
\fn QskQuickItem::isUpdateNodeScheduled
\return True, if the item will update the paint node in
the next scene graph update cycle
*/
/*!
\fn QskItem::isInitiallyPainted
\fn QskQuickItem::isInitiallyPainted
\return Value of the initiallyPainted property
\sa initiallyPainted
*/
/*!
\fn QskItem::maybeUnresized
\fn QskQuickItem::maybeUnresized
Flag indicating a potential state, where the item is waiting to be
sized by the layout system.
@ -547,7 +547,7 @@
*/
/*!
\fn QskItem::itemFlagsChanged
\fn QskQuickItem::itemFlagsChanged
Signal indicating that at least one if the following attributes has changed:
@ -557,7 +557,7 @@
*/
/*!
\fn QskItem::show
\fn QskQuickItem::show
An alternative way to call setVisible( true ).
Useful for signal/slot connections
@ -567,7 +567,7 @@
*/
/*!
\fn QskItem::hide
\fn QskQuickItem::hide
An alternative way to call setVisible( false ).
Useful for signal/slot connections
@ -577,7 +577,7 @@
*/
/*!
\fn QskItem::setHidden
\fn QskQuickItem::setHidden
Convenience function, equivalent to setVisible( !on ).
@ -586,19 +586,19 @@
*/
/*!
\fn QskItem::setDisabled
\fn QskQuickItem::setDisabled
Convenience function, equivalent to setEnabled( !on ).
\saqt QQuickItem::setEnabled()
*/
/*!
\fn QskItem::resetImplicitSize
\fn QskQuickItem::resetImplicitSize
Notifies the layout system that attributes affecting the layout
system have changed.
If the QskItem::DeferredLayout flag is enabled ( = default )
If the QskQuickItem::DeferredLayout flag is enabled ( = default )
the cached implicitSize() gets invalidated and a QEvent::LayoutRequest is sent
to the parent item ( like QWidget::updateGeometry ).
@ -607,13 +607,13 @@
*/
/*!
\fn QskItem::event
\fn QskQuickItem::event
QskItem handles the additional type of events.
QskQuickItem handles the additional type of events.
For some reason the QQuick classes introduced proprietory notfier hooks
instead of using the well established and powerful concept of events.
QskItem tries to revert this decision by mapping notifications
QskQuickItem tries to revert this decision by mapping notifications
to events, when possible.
The following notification events are added by QSkinny - usually with a
@ -633,28 +633,37 @@
*/
/*!
\fn QskItem::changeEvent
\fn QskQuickItem::changeEvent
This event handler can be reimplemented to handle certain state changes:
- QEvent::StyleChange
- QEvent::ContentsRectChange
- QEvent::FontChange
- QEvent::PaletteChange
- QEvent::ReadOnlyChange
- QEvent::EnabledChange
- QEvent::LocaleChange
- QEvent::ParentChange
- QEvent::LayoutDirectionChange
\param event Qt event
\note QEvent::PaletteChange, QEvent::FontChange are handled, but both event types
do not fit to the themeing concept of QSkinny and are not posted. However
it is possible to post them if an application has a concept, where they
make sense.
*/
/*!
\fn QskItem::geometryChangeEvent
\fn QskQuickItem::geometryChangeEvent
For no known reason QQuickItem propagates changes of position and size
by calling QQuickItem::geometryChange(), instead of using events.
QskItem reestablished the more powerful concept of events by sending/posting
QskQuickItem reestablished the more powerful concept of events by sending/posting
events, that can be preprocessed by event filtering.
\param event Event indicating the geometry change
@ -664,7 +673,7 @@
*/
/*!
\fn QskItem::windowChangeEvent
\fn QskQuickItem::windowChangeEvent
This event handler can be reimplemented to handle situations, where
an item is added, removed or transferred between windows. It corresponds
@ -677,7 +686,7 @@
*/
/*!
\fn QskItem::itemChange
\fn QskQuickItem::itemChange
For no obvious reason Qt/Quick has introduced an additional callback
mechanism beside events and signals.
@ -698,7 +707,7 @@
*/
/*!
\fn QskItem::aboutToShow
\fn QskQuickItem::aboutToShow
A specific hook that is intended to be overloaded by controls that need
to do some specific operations, when an item is painted the first time
@ -711,7 +720,7 @@
*/
/*!
\fn QskItem::mouseUngrabEvent
\fn QskQuickItem::mouseUngrabEvent
Notification, that is overloaded for debuging purposes, without
doing anything beside calling the base class.
@ -720,7 +729,7 @@
*/
/*!
\fn QskItem::touchUngrabEvent
\fn QskQuickItem::touchUngrabEvent
Notification, that is overloaded for debuging purposes, without
doing anything beside calling the base class.

View File

@ -1,182 +0,0 @@
/* Skia overrides for doxygen CSS. */
html {
--blue: rgb(0,114,178);
--green: rgb(0,158,115);
--red: rgb(213,94,0);
--orange: rgb(230,159,0);
--purple: rgb(204,121,167);
--brown: rgb(177,89,40);
--gray: rgb(79,79,79);
--light-blue: rgb(128,185,217);
--light-green: rgb(128,207,185);
--light-red: rgb(234,175,128);
--light-orange: rgb(243,207,128);
--light-purple: rgb(230,188,211);
--light-brown: rgb(216,172,148);
--light-gray: rgb(168,168,168);
--dark-blue: rgb(0,65,101);
--dark-red: rgb(156,44,8);
--white: rgb(254,254,254);
--dark-white: rgb(240,240,240);
--black: rgb(10,10,10);
}
#titlearea {
/* background matches Skia logo. */
background: rgb(248,248,248);
color: var(--blue);
}
#main-nav .sm {
background-image: none;
}
h2.groupheader {
border-bottom: var(--gray);
color: var(--dark-blue);
}
div.qindex, div.navtab{
background-color: var(--light-gray);
border: 1px solid var(--light-blue);
}
a {
color: var(--blue);
}
.contents a:visited {
color: var(--blue);
}
a.qindexHL {
background-color: var(--light-gray);
color: var(--white);
border: 1px double var(--gray);
}
.contents a.qindexHL:visited {
color: var(--white);
}
a.code, a.code:visited, a.line, a.line:visited {
color: var(--blue);
}
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
color: var(--blue);
}
pre.fragment {
border: 1px solid var(--orange);
background-color: var(--dark-white);
}
div.fragment {
background-color: var(--dark-white);
border: 1px solid var(--orange);
}
span.lineno {
border-right: 2px solid var(--green);
background-color: var(-light-gray);
}
span.lineno a {
background-color: var(--light-gray);
}
span.lineno a:hover {
background-color: var(--light-gray);
color: var(--blue);
}
div.ah, span.ah {
background-color: var(--black);
color: var(--white);
border: solid thin var(--gray);
box-shadow: 2px 2px 3px var(light-gray);
background-image: none;
}
td.indexkey {
background-color: var(--light-gray);
border: 1px solid var(--orange);
}
td.indexvalue {
background-color: var(--light-gray);
border: 1px solid var(--orange);
}
tr.memlist {
background-color: var(--light-gray);
}
span.keyword {
color: var(--green);
}
span.keywordtype {
color: var(--brown);
}
span.keywordflow {
color: var(--brown);
}
span.comment {
color: var(--brown);
}
span.charliteral {
color: var(--green);
}
span.vhdldigit {
color: var(--purple);
}
span.vhdlchar {
color: var(--black);
}
blockquote {
background-color: var(--light-gray);
border-left: 2px solid var(--gray);
}
.memtitle {
background-image: none;
}
.memdoc, dl.reflist dd {
background-image: none;
}
.paramname {
color: var(--dark-red);
}
.tabsearch {
background-image: none;
}
.navpath ul {
background-image: none;
}
.navpath li {
background-image: none;
}
.navpath li.navelem a:hover {
color: var(--blue)
}
.navpath li.footer {
background-image:none;
}

View File

@ -4,65 +4,66 @@
You will need:
1. A recent version of doxygen; The currently used version is 1.9.8.
The `doxygen` binary needs to be in the $PATH.
1. The `m4` command, which can be installed with `sudo apt install m4`.
1. The `documentation-xml-website` branch of the Edelhirsch QSkinny repository
at https://github.com/edelhirsch/qskinny/tree/documentation-xml-website .
1. A recent version of doxygen; The currently used version is 1.9.1 built from
github sources. The `doxygen` binary needs to be in the $PATH.
1. A recent version of doxybook2 with some custom patches. The script
`generate-website.sh` should download and build the right version, however
the script might need some adaptation of paths.
For reference, the required version can be found at
https://github.com/edelhirsch/doxybook2/tree/jekyll .
1. A recent version of Jekyll (see https://jekyllrb.com/), which will generate
the static html pages. The currently used jekyll version is 4.2.2.
Also a recent version of bundler is required; this can be installed with:
the static html pages. This and other required packages can be installed via
```
gem install jekyll:4.2.2
gem install jekyll:3.9.0
gem install bundler:2.1.4
```
1. Checkout the repo to generate the website via
`git clone git@github.com:peter-ha/qskinny-website.git`
1. Checkout the live website repository via
There might be some packages missing from the list above; in this case the
Gemfile in the qskinny-website repository might help.
1. Checkout the current website repository via
`git clone git@github.com:qskinny/qskinny.github.io.git`
## Generating the website
### Generating the API documentation with doxygen
```
cd ~/dev/qskinny/doc
export PATH=.:$PATH
doxygen
```
This will generate the documentation into the `api` folder.
Generating the static HTML sites is done with the `generate-website.sh` script
in the `qskinny/doc` directory. The script has some hardcoded paths and probably
needs some adaptation to run correctly.
### Testing and building the website locally
It will do the following:
First copy the generated files from above to the website repo:
1. Generate HTML from doxygen. This step is needed because for some reason when
generating XML from doxygen there are no images with dependency graphs.
*Note*: This step is only executed if the `html` folder doesn't exist,
because otherwise it would take too long.
1. Generate XML from doxygen. The generated XML is used with doxybook2 in the
next step.
*Note*: This step is only executed if the `xml` folder doesn't exist,
because otherwise it would take too long.
1. Generate markdown from XML with doxybook2. This markdown will be used by
Jekyll to either server the website content locally or generate static
HTML from it, see below.
```
cp -r api ~/dev/qskinny-website/docs/
```
### Generating the website locally
Then test the website locally:
When the command line switch `-local` is used with the `generate-website.sh`
script, it will generate the content to a local folder `doxybook-out`. This is
meant to be able to copy selected files to the website directory at
`~/dev/qskinny-website`.
Otherwise, the script will copy the content to the website repository for
uploading (again, paths are hardcoded as of now). So when generating content
for the first time, just run the script without any switches, which should
generate the website to `~/dev/qskinny-website`.
```
cd ~/dev/qskinny-website
bundle exec jekyll serve --livereload
```
### Testing the website locally
Then direct your browser to `http://127.0.0.1:4000/`.
After having generated the website as described above, go to
`~/dev/qskinny-website` and run `jekyll serve --livereload`. This should start
a browser at http://127.0.0.1:4000/, which will display the website.
If all looks good, generate the static HTML website:
### Generating the website publicly
```
bundle exec jekyll build
```
### Publishing the website
Just copy over the generated HTML files to the public website repo and push a
new version of the homepage:
```
cp -r _site/* ~/dev/qskinny.github.io/
cd ~/dev/qskinny.github.io/
git commit -a -m "new version" # you might want to add new files
gith push
```
That's it, the new website is now published at https://qskinny.github.io/ .
When the command line switch `-publish` is used, the script will automatically
generate a new version of the homepage and publish it at
https://qskinny.github.io . This wil only work with the proper user rights of
course.

View File

@ -10,7 +10,7 @@ QSkinny is a UI framework based on the Qt graphic stack and written in
{cpp}. It allows users to write their UIs in {cpp} and/or QML.
.The Fendt Tractor GUI
image::https://www.fendt.com/de/images/5d19bb4e7b260601c8134e14_1673943667_web_de-DE.jpg[Fendt Tractor GUI]
image::https://camo.githubusercontent.com/3eea80daf41ce6a86f08c73353d05000363c4df0/68747470733a2f2f7777772e66656e64742e636f6d2f696e742f67656e6576612d6173736574732f7769646765742f32383239312f6e6577732d332d6c6f772e6a7067[Fendt Tractor GUI]
It is currently being used in the Fendt Tractor GUI project, see the
picture above. For the Fendt Tractor GUI there is no QML used at all;
@ -18,4 +18,4 @@ the whole codebase is written in {cpp}. An overview of how QSkinny fits
into the Qt architecture is depicted below:
.QSkinny sits on top of QtQuick, while QML is optional
image::/doc/tutorials/images/architecture-simple.png[QSkinny architecture]
image::../images/architecture-simple.png[QSkinny architecture]

View File

@ -157,7 +157,7 @@ int main( int argc, char* argv[] )
Now the app is displaying the two buttons:
image::/doc/tutorials/images/writing-first-application.png[An app showing two buttons]
image::../images/writing-first-application.png[An app showing two buttons]
That's it; you just created a QSkinny application from scratch.

View File

@ -27,7 +27,7 @@ text width (which itself depends on the font) and possibly padding and
margins:
.implicit horizontal size hint of a button
image::/doc/tutorials/images/size-hints-calculation.png[implicit horizontal size hint of a button]
image::../images/size-hints-calculation.png[implicit horizontal size hint of a button]
The implicit width of a composited UI element containing a
graphic on the left and a text on the right would be the sum of the elements
@ -75,7 +75,7 @@ label1->setBackgroundColor( Qt::magenta );
....
.control without explicit size hint
image::/doc/tutorials/images/size-hints-1.png[Image without explicit size hint]
image::../images/size-hints-1.png[Image without explicit size hint]
If we set an explicit size hint of 150x60 pixels ourselves for the
preferred size, the control will be rendered differently:
@ -85,7 +85,7 @@ label1->setExplicitSizeHint( Qt::PreferredSize, { 150, 60 } );
....
.control with explicit size hint
image::/doc/tutorials/images/size-hints-2.png[Image with explicit size hint]
image::../images/size-hints-2.png[Image with explicit size hint]
When dealing with standard controls or layouts, the size hints dont
need to be specified explicitly, as it can be deduced from its standard
@ -185,14 +185,14 @@ By default the width of the buttons is determined by its text plus its
margins:
.Size policies with preferred size
image::/doc/tutorials/images/size-policies-horizontal-minimum-1.png[Fixed vs. Minimum size policy]
image::../images/size-policies-horizontal-minimum-1.png[Fixed vs. Minimum size policy]
After growing the window horizontally, the button with the Fixed
horizontal size policy keeps its width, while the button with the
Minimum policy will grow:
.Size policies when increasing window width
image::/doc/tutorials/images/size-policies-horizontal-minimum-2.png[Fixed vs. Minimum size policy]
image::../images/size-policies-horizontal-minimum-2.png[Fixed vs. Minimum size policy]
When shrinking the window below its original size, both buttons stay
with their width: The one on the left because of its `Fixed` size policy,
@ -200,7 +200,7 @@ and the one on the right because it wont shrink below its original size
due to the `Minimum` size policy.
.Size policies when shrinking window width
image::/doc/tutorials/images/size-policies-horizontal-minimum-3.png[Fixed vs. Minimum size policy]
image::../images/size-policies-horizontal-minimum-3.png[Fixed vs. Minimum size policy]
If we change the policy of the right button to `Preferred`, it will shrink
below its original size (even though the text is too wide now):
@ -211,7 +211,7 @@ label2->setText( "size policy: preferred" );
....
.Size policies when changing to preferred size policy
image::/doc/tutorials/images/size-policies-horizontal-minimum-4.png[Fixed vs. Minimum size policy]
image::../images/size-policies-horizontal-minimum-4.png[Fixed vs. Minimum size policy]
=== Types of layouts
@ -240,7 +240,7 @@ horizontalBox->addItem( label3 );
....
.Horizontal layout
image::/doc/tutorials/images/layout-horizontal.png[Horizontal layout]
image::../images/layout-horizontal.png[Horizontal layout]
[source]
....
@ -258,7 +258,7 @@ verticalBox->addItem( label3 );
....
.Vertical layout
image::/doc/tutorials/images/layout-vertical.png[Vertical layout]
image::../images/layout-vertical.png[Vertical layout]
==== Grid layouts (QskGridBox)
@ -292,7 +292,7 @@ gridBox->addItem( label7, 2, 1, 1, 2 );
....
.Grid layout
image::/doc/tutorials/images/layout-grid.png[Grid layout]
image::../images/layout-grid.png[Grid layout]
==== Stack layouts (QskStackBox)
@ -321,7 +321,7 @@ stackBox->setCurrentIndex( 2 );
....
.Stack layout (symbolized)
image::/doc/tutorials/images/layout-stack.png[Stack layout]
image::../images/layout-stack.png[Stack layout]
In this example, "control 3" is stacked on top of the blue and the
cyan control. Controls in a stacked layout can be of different sizes.
@ -366,19 +366,19 @@ When the layout has all the space it needs (but not more), both elements
are rendered with their preferred size:
.Stretch factors with preferred size
image::/doc/tutorials/images/stretch-factors-1.png[Stretch factors preferred size]
image::../images/stretch-factors-1.png[Stretch factors preferred size]
When the layout gets more width, the stretch factors come into play:
.A stretch factor of 1:2
image::/doc/tutorials/images/stretch-factors-2.png[Stretch factors increasing width]
image::../images/stretch-factors-2.png[Stretch factors increasing width]
No matter how wide the layout is, the aspect ratio of 1:2 will always be
kept, meaning that the label on the left will get 33% of the space, and
the label on the right 67%:
.A stretch factor of 1:2 with different widths
image::/doc/tutorials/images/stretch-factors-3.png[Stretch factors even more width]
image::../images/stretch-factors-3.png[Stretch factors even more width]
Stretch factors in QSkinny are the same as in the Qt Graphics View
Framework, see
@ -392,7 +392,7 @@ each other. The example below depicts a UI with a top bar and menu items
on the left:
.A UI with nested layouts
image::/doc/tutorials/images/nesting-layouts.png[Nested layouts]
image::../images/nesting-layouts.png[Nested layouts]
The code to produce the above UI could look like this (setting colors
etc. omitted for brevity):
@ -428,7 +428,7 @@ with the menu buttons is again a vertical layout.
The following diagram makes the layouts visible:
.The layout structure of the UI
image::/doc/tutorials/images/nesting-layouts-architecture.png[Nested layouts architecture]
image::../images/nesting-layouts-architecture.png[Nested layouts architecture]
=== Anchoring in QSkinny

View File

@ -14,7 +14,7 @@ skinlet, and therefore it will read information from both the control
itself as well as read the skin hints from the skin:
.Skinlets query the control and the skin
image::/doc/tutorials/images/skins-1.png[Styling controls]
image::../images/skins-1.png[Styling controls]
For instance, a button skinlet will read the margins from the skin and
the text to render from the button.
@ -44,10 +44,10 @@ has a traditional desktop skin, the other is a flat button with a skin
often found in mobile devices.
.desktop style button
image::/doc/tutorials/images/skinlets-button-1.png[desktop style button]
image::../images/skinlets-button-1.png[desktop style button]
.flat button
image::/doc/tutorials/images/skinlets-button-2.png[flat button]
image::../images/skinlets-button-2.png[flat button]
=== Skin hints
@ -85,7 +85,7 @@ public:
....
.A button styled with skin hints
image::/doc/tutorials/images/skin-hints.png[Button with skin hints]
image::../images/skin-hints.png[Button with skin hints]
When writing a new skin, a developer needs to know which hints to set
for which control. This usually depends on the control itself; however,
@ -154,10 +154,10 @@ public:
....
.button in normal state
image::/doc/tutorials/images/skin-hints-states-1.png[button in normal state]
image::../images/skin-hints-states-1.png[button in normal state]
.button in hovered state
image::/doc/tutorials/images/skin-hints-states-2.png[button in hovered state]
image::../images/skin-hints-states-2.png[button in hovered state]
==== Local skin hints
@ -181,7 +181,7 @@ Taking animations and local skin hints into account, the architecture
diagram now looks like this:
.Skinlets can also read from local skinlets and animators
image::/doc/tutorials/images/skins-2.png[Animators and local skin hints]
image::../images/skins-2.png[Animators and local skin hints]
=== Skinlets
@ -214,7 +214,7 @@ different skinlets, so a more complete version of the architecture
diagram looks like this:
.There is one skinlet for each atomic control
image::/doc/tutorials/images/skins-3.png[Animators and local skin hints]
image::../images/skins-3.png[Animators and local skin hints]
=== Skin factories and switching between skins
@ -298,8 +298,8 @@ Switching between skins will change the look of `QskPushButton`
instances:
.button in `MySkin` (as above)
image::/doc/tutorials/images/skin-hints-states-1.png[button in normal state]
image::../images/skin-hints-states-1.png[button in normal state]
.button in `OtherSkin`
image::/doc/tutorials/images/skin-factory.png[Styling controls]
image::../images/skin-factory.png[Styling controls]

Some files were not shown because too many files have changed in this diff Show More