From 316d4f4b524c917fc06e854a7b2982efd707e948 Mon Sep 17 00:00:00 2001 From: forbes Date: Mon, 26 Jan 2026 06:36:00 -0600 Subject: [PATCH] fix assy joint flip behaviour to not overconstrain on three distance joints --- CMakeLists.txt | 32 +- banner-logo-light.png | Bin 0 -> 18698 bytes kindred-logo.svg | 106 ++ resources/branding/generate-icons.sh | 98 ++ resources/branding/generate-splash.py | 214 +++ resources/branding/kindred-logo.svg | 106 ++ .../hicolor/128x128/apps/kindred-create.png | Bin 0 -> 3931 bytes .../hicolor/16x16/apps/kindred-create.png | Bin 0 -> 491 bytes .../hicolor/24x24/apps/kindred-create.png | Bin 0 -> 721 bytes .../hicolor/256x256/apps/kindred-create.png | Bin 0 -> 7865 bytes .../hicolor/32x32/apps/kindred-create.png | Bin 0 -> 982 bytes .../hicolor/48x48/apps/kindred-create.png | Bin 0 -> 1493 bytes .../hicolor/512x512/apps/kindred-create.png | Bin 0 -> 16341 bytes .../hicolor/64x64/apps/kindred-create.png | Bin 0 -> 1954 bytes .../hicolor/scalable/apps/kindred-create.svg | 106 ++ resources/icons/kindred-create.icns | Bin 0 -> 30648 bytes resources/icons/kindred-create.ico | Bin 0 -> 109906 bytes resources/kindred-create.desktop | 13 + resources/kindred-create.xml | 11 + .../KindredCreate/KindredCreate.cfg | 109 ++ .../KindredCreate/KindredCreate.qss | 1229 +++++++++++++++++ resources/preferences/package.xml | 18 + src/Gui/Dialogs/DlgAbout.cpp | 9 +- src/Gui/Icons/kindred-create.svg | 106 ++ src/Gui/Icons/kindredcreateabout.png | Bin 0 -> 3875 bytes src/Gui/Icons/kindredcreatesplash.png | Bin 0 -> 11258 bytes src/Gui/Icons/kindredcreatesplash_2x.png | Bin 0 -> 25202 bytes src/Gui/Icons/resource.qrc | 4 + src/Gui/PreferencePacks/CMakeLists.txt | 1 + .../KindredCreate/KindredCreate.cfg | 109 ++ .../KindredCreate/KindredCreate.qss | 1229 +++++++++++++++++ src/Gui/PreferencePacks/package.xml | 25 +- src/Gui/SplashScreen.cpp | 4 +- src/Gui/Stylesheets/CMakeLists.txt | 1 + src/Gui/Stylesheets/KindredCreate.qss | 1229 +++++++++++++++++ src/Main/FreeCADGuiPy.cpp | 10 +- src/Main/MainCmd.cpp | 14 +- src/Main/MainGui.cpp | 28 +- src/Main/MainPy.cpp | 4 +- src/Main/freecad.rc.cmake | 14 +- src/Main/freecadCmd.rc.cmake | 14 +- src/Mod/Assembly/App/AssemblyObject.cpp | 71 +- tests/assytest.20260126-040101.FCBak | Bin 0 -> 32511 bytes tests/assytest.FCStd | Bin 0 -> 37880 bytes tests/assytestpart.FCStd | Bin 0 -> 15561 bytes 45 files changed, 4851 insertions(+), 63 deletions(-) create mode 100644 banner-logo-light.png create mode 100644 kindred-logo.svg create mode 100755 resources/branding/generate-icons.sh create mode 100755 resources/branding/generate-splash.py create mode 100644 resources/branding/kindred-logo.svg create mode 100644 resources/icons/hicolor/128x128/apps/kindred-create.png create mode 100644 resources/icons/hicolor/16x16/apps/kindred-create.png create mode 100644 resources/icons/hicolor/24x24/apps/kindred-create.png create mode 100644 resources/icons/hicolor/256x256/apps/kindred-create.png create mode 100644 resources/icons/hicolor/32x32/apps/kindred-create.png create mode 100644 resources/icons/hicolor/48x48/apps/kindred-create.png create mode 100644 resources/icons/hicolor/512x512/apps/kindred-create.png create mode 100644 resources/icons/hicolor/64x64/apps/kindred-create.png create mode 100644 resources/icons/hicolor/scalable/apps/kindred-create.svg create mode 100644 resources/icons/kindred-create.icns create mode 100644 resources/icons/kindred-create.ico create mode 100644 resources/kindred-create.desktop create mode 100644 resources/kindred-create.xml create mode 100644 resources/preferences/KindredCreate/KindredCreate.cfg create mode 100644 resources/preferences/KindredCreate/KindredCreate.qss create mode 100644 resources/preferences/package.xml create mode 100644 src/Gui/Icons/kindred-create.svg create mode 100644 src/Gui/Icons/kindredcreateabout.png create mode 100644 src/Gui/Icons/kindredcreatesplash.png create mode 100644 src/Gui/Icons/kindredcreatesplash_2x.png create mode 100644 src/Gui/PreferencePacks/KindredCreate/KindredCreate.cfg create mode 100644 src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss create mode 100644 src/Gui/Stylesheets/KindredCreate.qss create mode 100644 tests/assytest.20260126-040101.FCBak create mode 100644 tests/assytest.FCStd create mode 100644 tests/assytestpart.FCStd diff --git a/CMakeLists.txt b/CMakeLists.txt index a9e68dc1aa..9cbf373c90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,17 +48,37 @@ if(FREECAD_USE_CCACHE) endif() endif() -project(FreeCAD) +project(KindredCreate) -set(PACKAGE_VERSION_MAJOR "1") -set(PACKAGE_VERSION_MINOR "2") -set(PACKAGE_VERSION_PATCH "0") # number of patch release (e.g. "4" for the 0.18.4 release) -set(PACKAGE_VERSION_SUFFIX "dev") # either "dev" for development snapshot or "" (empty string) -set(PACKAGE_BUILD_VERSION "0") # used when the same FreeCAD version will be re-released (for example using an updated LibPack) +# Kindred Create version +set(KINDRED_CREATE_VERSION_MAJOR "0") +set(KINDRED_CREATE_VERSION_MINOR "1") +set(KINDRED_CREATE_VERSION_PATCH "0") +set(KINDRED_CREATE_VERSION "${KINDRED_CREATE_VERSION_MAJOR}.${KINDRED_CREATE_VERSION_MINOR}.${KINDRED_CREATE_VERSION_PATCH}") + +# Underlying FreeCAD version +set(FREECAD_VERSION_MAJOR "1") +set(FREECAD_VERSION_MINOR "0") +set(FREECAD_VERSION_PATCH "0") +set(FREECAD_VERSION "${FREECAD_VERSION_MAJOR}.${FREECAD_VERSION_MINOR}.${FREECAD_VERSION_PATCH}") + +# Package version (used for build system compatibility) +set(PACKAGE_VERSION_MAJOR ${KINDRED_CREATE_VERSION_MAJOR}) +set(PACKAGE_VERSION_MINOR ${KINDRED_CREATE_VERSION_MINOR}) +set(PACKAGE_VERSION_PATCH ${KINDRED_CREATE_VERSION_PATCH}) +set(PACKAGE_VERSION_SUFFIX "") # either "dev" for development snapshot or "" (empty string) +set(PACKAGE_BUILD_VERSION "0") # used when the same version will be re-released set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}") set(PACKAGE_STRING "${PROJECT_NAME} ${PACKAGE_VERSION}") +# Pass Kindred Create version to compiler +add_definitions(-DKINDRED_CREATE_VERSION="${KINDRED_CREATE_VERSION}") +add_definitions(-DKINDRED_CREATE_VERSION_MAJOR=${KINDRED_CREATE_VERSION_MAJOR}) +add_definitions(-DKINDRED_CREATE_VERSION_MINOR=${KINDRED_CREATE_VERSION_MINOR}) +add_definitions(-DKINDRED_CREATE_VERSION_PATCH=${KINDRED_CREATE_VERSION_PATCH}) +add_definitions(-DFREECAD_VERSION="${FREECAD_VERSION}") + # include local modules include(CheckCXXCompilerFlag) include(AddFileDependencies) diff --git a/banner-logo-light.png b/banner-logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..92a005ef1bed1f08043bc7cd087610ccebec47a4 GIT binary patch literal 18698 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 + + + + + + + + + + + + + + diff --git a/resources/branding/generate-icons.sh b/resources/branding/generate-icons.sh new file mode 100755 index 0000000000..ce8a2937bb --- /dev/null +++ b/resources/branding/generate-icons.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# generate-icons.sh - Generate application icons for Kindred Create +# +# This script generates icon files for all platforms from the source SVG. +# Prerequisites: +# - Inkscape (SVG to PNG conversion) +# - ImageMagick (ICO generation for Windows) +# - png2icns or iconutil (ICNS generation for macOS) +# +# Usage: ./generate-icons.sh + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SVG_SOURCE="$SCRIPT_DIR/kindred-logo.svg" +OUTPUT_DIR="$SCRIPT_DIR/../icons" + +# Check for source file +if [ ! -f "$SVG_SOURCE" ]; then + echo "Error: Source SVG not found at $SVG_SOURCE" + echo "Please place kindred-logo.svg in the branding directory." + exit 1 +fi + +# Check for Inkscape +if ! command -v inkscape &> /dev/null; then + echo "Error: Inkscape is required but not installed." + echo "Install with: sudo apt install inkscape (Debian/Ubuntu)" + exit 1 +fi + +echo "Generating icons from $SVG_SOURCE..." + +# Generate PNGs for Linux/hicolor icon theme +for size in 16 24 32 48 64 128 256 512; do + dir="$OUTPUT_DIR/hicolor/${size}x${size}/apps" + mkdir -p "$dir" + echo " Generating ${size}x${size} PNG..." + inkscape -w $size -h $size "$SVG_SOURCE" -o "$dir/kindred-create.png" 2>/dev/null +done + +# Copy SVG for scalable +mkdir -p "$OUTPUT_DIR/hicolor/scalable/apps" +cp "$SVG_SOURCE" "$OUTPUT_DIR/hicolor/scalable/apps/kindred-create.svg" +echo " Copied scalable SVG" + +# Generate Windows ICO (requires ImageMagick) +if command -v convert &> /dev/null; then + echo " Generating Windows ICO..." + convert \ + "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/24x24/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/48x48/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/64x64/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" \ + "$OUTPUT_DIR/kindred-create.ico" + echo " Created kindred-create.ico" +else + echo " Warning: ImageMagick not found, skipping ICO generation." + echo " Install with: sudo apt install imagemagick" +fi + +# Generate macOS ICNS (requires png2icns or iconutil) +if command -v png2icns &> /dev/null; then + echo " Generating macOS ICNS..." + png2icns "$OUTPUT_DIR/kindred-create.icns" \ + "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" + echo " Created kindred-create.icns" +elif command -v iconutil &> /dev/null; then + echo " Generating macOS ICNS using iconutil..." + ICONSET_DIR="$OUTPUT_DIR/kindred-create.iconset" + mkdir -p "$ICONSET_DIR" + cp "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" "$ICONSET_DIR/icon_16x16.png" + cp "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" "$ICONSET_DIR/icon_16x16@2x.png" + cp "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" "$ICONSET_DIR/icon_32x32.png" + cp "$OUTPUT_DIR/hicolor/64x64/apps/kindred-create.png" "$ICONSET_DIR/icon_32x32@2x.png" + cp "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" "$ICONSET_DIR/icon_128x128.png" + cp "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" "$ICONSET_DIR/icon_128x128@2x.png" + cp "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" "$ICONSET_DIR/icon_256x256.png" + cp "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" "$ICONSET_DIR/icon_256x256@2x.png" + cp "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" "$ICONSET_DIR/icon_512x512.png" + iconutil -c icns "$ICONSET_DIR" -o "$OUTPUT_DIR/kindred-create.icns" + rm -rf "$ICONSET_DIR" + echo " Created kindred-create.icns" +else + echo " Warning: Neither png2icns nor iconutil found, skipping ICNS generation." + echo " Install png2icns with: sudo apt install icnsutils" +fi + +echo "" +echo "Icon generation complete!" +echo "Output directory: $OUTPUT_DIR" diff --git a/resources/branding/generate-splash.py b/resources/branding/generate-splash.py new file mode 100755 index 0000000000..7df5e67109 --- /dev/null +++ b/resources/branding/generate-splash.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 +""" +Generate Kindred Create splash screen and about images. + +This script creates branded splash screens with: +- Rounded dark rectangle background (Catppuccin Mocha base #1e1e2e) +- Kindred logo centered +- "Kindred Create" title text +- Version string + +Requirements: + pip install Pillow cairosvg + +Usage: + python generate-splash.py [--version VERSION] [--freecad-version FREECAD_VERSION] +""" + +import argparse +import os +import sys +from pathlib import Path + +try: + from PIL import Image, ImageDraw, ImageFont +except ImportError: + print("Error: Pillow is required. Install with: pip install Pillow") + sys.exit(1) + +try: + import cairosvg +except ImportError: + print("Warning: cairosvg not found. Will try alternative SVG conversion.") + cairosvg = None + +# Catppuccin Mocha colors +COLORS = { + 'base': '#1e1e2e', + 'surface0': '#313244', + 'text': '#cdd6f4', + 'subtext0': '#a6adc8', + 'blue': '#89b4fa', + 'lavender': '#b4befe', +} + +def hex_to_rgb(hex_color): + """Convert hex color to RGB tuple.""" + hex_color = hex_color.lstrip('#') + return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + +def create_rounded_rectangle(draw, bbox, radius, fill): + """Draw a rounded rectangle.""" + x1, y1, x2, y2 = bbox + draw.rounded_rectangle(bbox, radius=radius, fill=fill) + +def load_svg_as_image(svg_path, width, height): + """Load an SVG file and convert to PIL Image at specified size.""" + if cairosvg: + import io + png_data = cairosvg.svg2png(url=str(svg_path), output_width=width, output_height=height) + return Image.open(io.BytesIO(png_data)).convert('RGBA') + else: + # Fallback: try using inkscape command line + import subprocess + import tempfile + with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp: + tmp_path = tmp.name + try: + subprocess.run([ + 'inkscape', '-w', str(width), '-h', str(height), + str(svg_path), '-o', tmp_path + ], check=True, capture_output=True) + img = Image.open(tmp_path).convert('RGBA') + return img + finally: + if os.path.exists(tmp_path): + os.unlink(tmp_path) + +def get_font(size, bold=False): + """Get a font, falling back to default if not available.""" + font_names = [ + '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf' if bold else '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', + '/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf' if bold else '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf', + '/usr/share/fonts/TTF/DejaVuSans-Bold.ttf' if bold else '/usr/share/fonts/TTF/DejaVuSans.ttf', + ] + for font_name in font_names: + if os.path.exists(font_name): + return ImageFont.truetype(font_name, size) + # Fallback to default + return ImageFont.load_default() + +def create_splash(output_path, logo_path, width, height, version, freecad_version, scale=1): + """Create a splash screen image.""" + # Scale dimensions + w = int(width * scale) + h = int(height * scale) + radius = int(16 * scale) + padding = int(30 * scale) + + # Create image with transparent background + img = Image.new('RGBA', (w, h), (0, 0, 0, 0)) + draw = ImageDraw.Draw(img) + + # Draw rounded rectangle background + bg_color = hex_to_rgb(COLORS['base']) + create_rounded_rectangle(draw, (padding, padding, w - padding, h - padding), radius, bg_color) + + # Load and place logo + logo_max_width = int(300 * scale) + logo_max_height = int(150 * scale) + + try: + logo = load_svg_as_image(logo_path, logo_max_width, logo_max_height) + # Center logo horizontally, place in upper portion + logo_x = (w - logo.width) // 2 + logo_y = int(80 * scale) + img.paste(logo, (logo_x, logo_y), logo) + except Exception as e: + print(f"Warning: Could not load logo: {e}") + logo_y = int(80 * scale) + + # Draw "Kindred Create" title + title_font = get_font(int(24 * scale), bold=True) + title = "Kindred Create" + title_bbox = draw.textbbox((0, 0), title, font=title_font) + title_width = title_bbox[2] - title_bbox[0] + title_x = (w - title_width) // 2 + title_y = int(250 * scale) + draw.text((title_x, title_y), title, fill=hex_to_rgb(COLORS['text']), font=title_font) + + # Draw version string + version_font = get_font(int(12 * scale)) + version_str = f"v{version} (FreeCAD {freecad_version})" + version_bbox = draw.textbbox((0, 0), version_str, font=version_font) + version_width = version_bbox[2] - version_bbox[0] + version_x = (w - version_width) // 2 + version_y = title_y + int(35 * scale) + draw.text((version_x, version_y), version_str, fill=hex_to_rgb(COLORS['subtext0']), font=version_font) + + # Save + img.save(output_path, 'PNG') + print(f"Created: {output_path}") + +def create_about(output_path, logo_path, width, height, scale=1): + """Create an about dialog image.""" + # Scale dimensions + w = int(width * scale) + h = int(height * scale) + + # Create image + img = Image.new('RGBA', (w, h), hex_to_rgb(COLORS['base']) + (255,)) + draw = ImageDraw.Draw(img) + + # Load and place logo + logo_max_width = int(200 * scale) + logo_max_height = int(100 * scale) + + try: + logo = load_svg_as_image(logo_path, logo_max_width, logo_max_height) + logo_x = (w - logo.width) // 2 + logo_y = int(30 * scale) + img.paste(logo, (logo_x, logo_y), logo) + except Exception as e: + print(f"Warning: Could not load logo: {e}") + + # Save + img.save(output_path, 'PNG') + print(f"Created: {output_path}") + +def main(): + parser = argparse.ArgumentParser(description='Generate Kindred Create splash screens') + parser.add_argument('--version', default='0.1.0', help='Kindred Create version') + parser.add_argument('--freecad-version', default='1.0.0', help='FreeCAD version') + args = parser.parse_args() + + script_dir = Path(__file__).parent + logo_path = script_dir / 'kindred-logo.svg' + icons_dir = script_dir.parent.parent / 'src' / 'Gui' / 'Icons' + + if not logo_path.exists(): + print(f"Error: Logo not found at {logo_path}") + sys.exit(1) + + # Create splash screens (600x400 as per spec) + create_splash( + icons_dir / 'kindredcreatesplash.png', + logo_path, + 600, 400, + args.version, + args.freecad_version, + scale=1 + ) + + # Create 2x version for HiDPI + create_splash( + icons_dir / 'kindredcreatesplash_2x.png', + logo_path, + 600, 400, + args.version, + args.freecad_version, + scale=2 + ) + + # Create about image + create_about( + icons_dir / 'kindredcreateabout.png', + logo_path, + 400, 200, + scale=1 + ) + + print("\nSplash screen generation complete!") + +if __name__ == '__main__': + main() diff --git a/resources/branding/kindred-logo.svg b/resources/branding/kindred-logo.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/resources/branding/kindred-logo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/hicolor/128x128/apps/kindred-create.png b/resources/icons/hicolor/128x128/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..a80ca78828df1f01b02a72b993dd221fc6047ff4 GIT binary patch literal 3931 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 literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/24x24/apps/kindred-create.png b/resources/icons/hicolor/24x24/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..e353d527c55f249c574e10e85a37f5abc872a9a1 GIT binary patch literal 721 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 DcF3w! literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/32x32/apps/kindred-create.png b/resources/icons/hicolor/32x32/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..852acb2719db7419fea117dc881d5cfd9bba8fbd GIT binary patch literal 982 zcmV;{11bE8P)#BX8(ysqZ(MgJpG&mGGJl(tj(!DK~hBwZT|K7 z1T15AHB_hwtl8fgXr_&>o4x*cJv0MEMD1-oXV!N-AKjMTA_2e;Gynl91azRyfy*cP z_+T9Gy;!2z0DS#xT$={pn!G#y$F$3Y1>1J_9!X+N->MDr@tPC{q<9o=2m{;GJ8A#V z3A#Nwb0=rUEPOk-jH^oQWoF$JAeroTOo+ofQrjb@v>G0|dd0J_TkPP2b9T^7+z){F zzqe~d_;PCM8v;b6akM?r5nJ1_y6LR|U{~+U;_A31e)_XPuL-xKbS*`dg%s;IN z9VfNUgt*k-x5tWG@fiUCU}*FLa-}PHb87{aI#8}tAOz52u!u*1L%+vr4=UpId@*}2 zZ2znkR z_8Ys`zY-;CKBqig$LT9)y^2;Jy6&ALv!Z_ffH0%wL()_3>!5wqO7YZHxX>x&*KUu;>8)0t7~6NmywUkN^Mx07*qoM6N<$ Eg3=7iGXMYp literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/48x48/apps/kindred-create.png b/resources/icons/hicolor/48x48/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..5151c6602aa161167b6f4e7e2680d9b80e13047e GIT binary patch literal 1493 zcmV;`1uFW9P)ZeeNdcDvhccegWh{yr!K$=++bY0}^0 z4gy%8cL8BEy*ihETocFHhWmrTU?P)t+(y7u)Q_0q z+qpJYka+-T^jUcIks)G%IU{l2l}$S?0Su#VBY5(m9>~vbq`F-ge5Ep2$;47RaT&o z0*NFHnLX16PuP6H+^nl3E=ouCj(&F64%mcat0tG+3@<`lZbfbtQF*SdvkUi ziiYsr#V`)Gm0`o8k;0w-%loaBXuIwp0Q>)nUH>DUCg&nHJpShaESx`mUS8$_VBNeH z$P!`uArEdu9GYwy&=*o=KZE0C8#`gKL-6HIrL)7i8k0`Xwk+-8g*7 zjg!}$1=W6az8vj0R3he21_ruLX47U2U>N=<0NPZm)u5?%enAFq(Q@w^5CLy|>w(B~ zw;moP>^`C~5#qAt*qKY8Hh``-dL@=VRV0NUo4pc5#hrIG+I09mGjZ{ziUYrtjfM7hJp1AY_3DS|10 zXhLGaU_}OLPC-r?a61^M0}i$X{aF!F=A}Eh?k4><$}|iD5@yc&oVZjMbeE2BB8(GP zogo6JY^Epx3qTZr2Y^E+))=G;<^U7DoR4`R!w57|qbueSze*C%+0gVfRaI0K9iTnb zffIpK0Qj?Tq-Rsn4P_wh6ic2?tXG>TiNlnhpc8{5`007|A>$ef(T_$$jE(VQ&U_!vf z#Lhduhi&lsNF>-g4xax*LBEtl3mhKLP`RdwWV)Av>gsCEG|QA|w0kh$r@^r@Ay13r v$)taso(fQErUI0jsQ{&BDnO~3^a1_`ERIO9DV2@m00000NkvXXu0mjfC%vL; literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/512x512/apps/kindred-create.png b/resources/icons/hicolor/512x512/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..8769c584cc4089d6716f970a300fd7719eea99ca GIT binary patch literal 16341 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 literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/64x64/apps/kindred-create.png b/resources/icons/hicolor/64x64/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee90de051cc315e76834b311a6d7892e695881f GIT binary patch literal 1954 zcmV;T2VMAyP)!5HB&_h}CE{r7`t_uqXs-ff#|pF1uSOyE~U1mfe|idHgWDlvdcC zb7tX?bpFYFIGOi(p8xaD`#$gUzUPRl@?M4!Hi58F6Ci8?VWTEM*aX5xO@OcogpHa2 zVG{@&H37mV5H_r^30#R(s$-^Ymu9J2dDC=k*R?L@^Nqu*$4UU{bh^G!FzQ6?Ce?@; zfw*f}r!tv0@rBV%^9s7mCLjlZPh3B)m-c73N`8B>NmVoQTz8Nri08?ON zvSsduAjYB3fJ7pFn<$3?bIa->Hr`vHXbU5baIq-Zt}rxeASg}sO3YH~Bg*us5;2wa zyW{-o@HBuySB-_aTzA$_{LlqRCenLQR&^vD_HVjC)bhvYe8FV-vu#`|383E^%=UiX zkA0|1AdyI~Mp*^0`Til_$pg%6blLEc!q}5Mk!nsa@M9mE03u?FvK`>Abcu)GKN8s2 z#(OW)*60F6T~nU%V;hvc6$z=M0N^L_CptW`O z5>&SVJo>?5mbaIx_W9_Ym;DGHKZwUWS}L)-;R1+=rLOs7gt}QxE?XZQni9XJ0Xx@b zsVmo!xd!%gmDt^I0g~}KUj#lR0z22{XsP$zyId0sW;lHL{&7L&u|#6-q`gJpZBRta z*5>v*6eliXIH*zZOh#OnQO|RRVlgvn+fpauHkqCgLEL5)(qOy*L?2%<%(IW=0>z#P zp2C{%x6;`a1L!lX(Ix%;{e^3d4G);B!=U;IG&B`U41%RMg-F^P?VBW!Vtx%qUu+I zE8I`G%zX0VPF}N%l~CZvi$P3-JH!@eD&of zwyz0%h`S~{g(qKZVbl?Tb0T%WpJ=?VA}Au3hkhMkPSdRaOCBI*#i)2Km-3c9rF{uBJApHVBeTuLDmlro}6%-@g+bqo?Ztm1^Dp1y8{utyL~y+ zqSH`?Cw9lVSe&}G(4Dc^x~B;Mfu9Xz&;D*Qn~DWUCKooT>SlmNtqYjZFe4C2Lkw0g zUWEws)3F zz)ufO=WtK7Dt`dKJ~C~5>qEs`m(TZPDzU3bfYz2dA6L9`ya`~N9$)gsW3mCF#pi%_)38{%;G>94UHAOHwxu-Jm21G3 zmzyX#{tMz;1(O|rZy0}k{zAUzq#yeUvuSOayAtGaC|B>6`ic%%zHr~7j{)WG?T4M0 z6QNKv$X+t&%2=H0w>UjuaW-p_8!^Uif6Calr*XXSWo=it`i(zfE1Zb8|3uJFry6GP z$z_iq)g0ORzubIiUMO`%#h9z@cHRgNh9flfr*{-GrGiN`ms&0_@lb!~X@$^@KEh54v zmOjYr=Gj5wToZfG?C0pYV*s{?w<4SEJ2IsKCc&g7J(KHw8aSk?yn5=d*lzXLSK~NW zIM1>3$HyO^zR}4;1p=t5qrztdibKVVbawq~N&-8c&8sK>f~q2LB$I3Nb(=d?sAyBq zWO|Mw`Za*#7yd*4@Icjp5BL3>{AdB7z{c3-$v6vJiv*8a^Atw9JbTYQ}o*2xveRqoU@r^*Y!s9J+HGx(1;Y_CY zrD}Xk1p*!IqOsC?;5We4`r|y19s6DFjb~2ab2mfsQ04alsZ^>#E;URqT5jpeZ+WgZ zu2iazL?Ti*FwlJ=Xxn-{5c&raVdJLwMkq|w1PGfz*r*8*Hi58F6Ci8?VWTEM*aX5x oO@OcogpHa2VG{@&?|A|K2aW``M2fv!6#xJL07*qoM6N<$g4%b!3IG5A literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/scalable/apps/kindred-create.svg b/resources/icons/hicolor/scalable/apps/kindred-create.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/resources/icons/hicolor/scalable/apps/kindred-create.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/kindred-create.icns b/resources/icons/kindred-create.icns new file mode 100644 index 0000000000000000000000000000000000000000..0f544abcbcf18e948b0674bab5f9482a24e928be GIT binary patch literal 30648 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 LKw$hoAohO)uW_MY literal 0 HcmV?d00001 diff --git a/resources/icons/kindred-create.ico b/resources/icons/kindred-create.ico new file mode 100644 index 0000000000000000000000000000000000000000..d8df13ebe71ffa6efd836ef3777f89ed6318b45b GIT binary patch literal 109906 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 + + + Kindred Create Document + Kindred Create Document + + + + + + diff --git a/resources/preferences/KindredCreate/KindredCreate.cfg b/resources/preferences/KindredCreate/KindredCreate.cfg new file mode 100644 index 0000000000..5714f860f7 --- /dev/null +++ b/resources/preferences/KindredCreate/KindredCreate.cfg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KindredCreate.qss + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/preferences/KindredCreate/KindredCreate.qss b/resources/preferences/KindredCreate/KindredCreate.qss new file mode 100644 index 0000000000..6ce5343d31 --- /dev/null +++ b/resources/preferences/KindredCreate/KindredCreate.qss @@ -0,0 +1,1229 @@ + +/* ============================================================================= + Catppuccin Mocha Theme for FreeCAD + Bundled with ztools addon + https://catppuccin.com/ + ============================================================================= */ + +/* ============================================================================= + Global Defaults + ============================================================================= */ + +* { + color: #cdd6f4; + font-family: "Segoe UI", "Ubuntu", "Noto Sans", sans-serif; +} + +QWidget { + background-color: #1e1e2e; + color: #cdd6f4; + selection-background-color: #585b70; + selection-color: #cdd6f4; +} + +/* ============================================================================= + Main Window and MDI Area + ============================================================================= */ + +QMainWindow { + background-color: #181825; +} + +QMainWindow::separator { + background-color: #313244; + width: 4px; + height: 4px; +} + +QMainWindow::separator:hover { + background-color: #cba6f7; +} + +QMdiArea { + background-color: #11111b; +} + +QMdiSubWindow { + background-color: #1e1e2e; + border: 1px solid #45475a; +} + +QMdiSubWindow > QWidget { + background-color: #1e1e2e; +} + +/* ============================================================================= + Menu Bar + ============================================================================= */ + +QMenuBar { + background-color: #181825; + color: #cdd6f4; + border-bottom: 1px solid #313244; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 4px 8px; + border-radius: 4px; +} + +QMenuBar::item:selected { + background-color: #313244; +} + +QMenuBar::item:pressed { + background-color: #45475a; +} + +/* ============================================================================= + Menus + ============================================================================= */ + +QMenu { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px 6px 8px; + border-radius: 4px; +} + +QMenu::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QMenu::item:disabled { + color: #6c7086; +} + +QMenu::separator { + height: 1px; + background-color: #45475a; + margin: 4px 8px; +} + +QMenu::icon { + margin-left: 8px; +} + +QMenu::indicator { + width: 16px; + height: 16px; + margin-left: 4px; +} + +/* ============================================================================= + Toolbars + ============================================================================= */ + +QToolBar { + background-color: #181825; + border: none; + spacing: 2px; + padding: 2px; +} + +QToolBar::handle { + background-color: #45475a; + width: 8px; + margin: 2px; + border-radius: 2px; +} + +QToolBar::handle:horizontal { + width: 8px; +} + +QToolBar::handle:vertical { + height: 8px; +} + +QToolBar::separator { + background-color: #45475a; + width: 1px; + margin: 4px 2px; +} + +/* ============================================================================= + Tool Buttons (Toolbar icons) + ============================================================================= */ + +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + padding: 4px; + margin: 1px; +} + +QToolButton:hover { + background-color: #313244; + border: 1px solid #45475a; +} + +QToolButton:pressed { + background-color: #45475a; +} + +QToolButton:checked { + background-color: #45475a; + border: 1px solid #cba6f7; +} + +QToolButton:disabled { + color: #6c7086; +} + +QToolButton[popupMode="1"] { + padding-right: 16px; +} + +QToolButton::menu-button { + border: none; + width: 14px; +} + +QToolButton::menu-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Push Buttons + ============================================================================= */ + +QPushButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 6px 16px; + min-height: 20px; +} + +QPushButton:hover { + background-color: #45475a; + border-color: #585b70; +} + +QPushButton:pressed { + background-color: #585b70; +} + +QPushButton:checked { + background-color: #cba6f7; + color: #11111b; + border-color: #cba6f7; +} + +QPushButton:disabled { + background-color: #313244; + color: #6c7086; + border-color: #313244; +} + +QPushButton:default { + border: 2px solid #cba6f7; +} + +/* ============================================================================= + Dock Widgets + ============================================================================= */ + +QDockWidget { + background-color: #1e1e2e; + color: #cdd6f4; + titlebar-close-icon: none; + titlebar-normal-icon: none; +} + +QDockWidget::title { + background-color: #181825; + color: #cdd6f4; + padding: 6px; + border-bottom: 1px solid #313244; +} + +QDockWidget::close-button, +QDockWidget::float-button { + background-color: transparent; + border: none; + padding: 2px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background-color: #313244; + border-radius: 4px; +} + +/* ============================================================================= + Tab Widgets + ============================================================================= */ + +QTabWidget::pane { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; + top: -1px; +} + +QTabBar { + background-color: transparent; +} + +QTabBar::tab { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 6px 12px; + margin-right: 2px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:selected { + background-color: #1e1e2e; + color: #cdd6f4; + border-bottom-color: #1e1e2e; +} + +QTabBar::tab:hover:!selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTabBar::tab:disabled { + color: #6c7086; +} + +QTabBar::close-button { + margin-left: 4px; +} + +QTabBar::close-button:hover { + background-color: #f38ba8; + border-radius: 2px; +} + +/* ============================================================================= + Scroll Bars + ============================================================================= */ + +QScrollBar:horizontal { + background-color: #181825; + height: 12px; + margin: 0 12px 0 12px; + border-radius: 6px; +} + +QScrollBar:vertical { + background-color: #181825; + width: 12px; + margin: 12px 0 12px 0; + border-radius: 6px; +} + +QScrollBar::handle:horizontal { + background-color: #45475a; + min-width: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:vertical { + background-color: #45475a; + min-height: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover { + background-color: #585b70; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + width: 12px; + height: 12px; + background-color: #313244; + border-radius: 6px; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + background-color: #45475a; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background-color: transparent; +} + +/* ============================================================================= + Input Fields + ============================================================================= */ + +QLineEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QLineEdit:focus { + border-color: #cba6f7; +} + +QLineEdit:disabled { + background-color: #181825; + color: #6c7086; +} + +QLineEdit:read-only { + background-color: #181825; +} + +QTextEdit, QPlainTextEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QTextEdit:focus, QPlainTextEdit:focus { + border-color: #cba6f7; +} + +/* ============================================================================= + Spin Boxes + ============================================================================= */ + +QSpinBox, QDoubleSpinBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; + padding-right: 20px; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border-color: #cba6f7; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-left: 1px solid #45475a; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover { + background-color: #585b70; +} + +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed { + background-color: #cba6f7; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + width: 8px; + height: 8px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + width: 8px; + height: 8px; +} + +/* ============================================================================= + Combo Boxes + ============================================================================= */ + +QComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + padding-right: 24px; + min-height: 20px; +} + +QComboBox:hover { + border-color: #585b70; +} + +QComboBox:focus { + border-color: #cba6f7; +} + +QComboBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QComboBox::drop-down:hover { + background-color: #585b70; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #45475a; + selection-color: #cdd6f4; + outline: none; +} + +QComboBox QAbstractItemView::item { + padding: 4px 8px; + min-height: 24px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #45475a; +} + +QComboBox QAbstractItemView::item:selected { + background-color: #585b70; +} + +/* ============================================================================= + Check Boxes + ============================================================================= */ + +QCheckBox { + spacing: 8px; + color: #cdd6f4; +} + +QCheckBox:disabled { + color: #6c7086; +} + +QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 4px; + background-color: #313244; +} + +QCheckBox::indicator:hover { + border-color: #cba6f7; +} + +QCheckBox::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QCheckBox::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QCheckBox::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Radio Buttons + ============================================================================= */ + +QRadioButton { + spacing: 8px; + color: #cdd6f4; +} + +QRadioButton:disabled { + color: #6c7086; +} + +QRadioButton::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 9px; + background-color: #313244; +} + +QRadioButton::indicator:hover { + border-color: #cba6f7; +} + +QRadioButton::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QRadioButton::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QRadioButton::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Sliders + ============================================================================= */ + +QSlider::groove:horizontal { + height: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::groove:vertical { + width: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::handle:horizontal { + width: 16px; + height: 16px; + margin: -5px 0; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:vertical { + width: 16px; + height: 16px; + margin: 0 -5px; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + background-color: #b4befe; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #f5c2e7; +} + +QSlider::sub-page:horizontal { + background-color: #cba6f7; + border-radius: 3px; +} + +QSlider::add-page:vertical { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Progress Bars + ============================================================================= */ + +QProgressBar { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + text-align: center; + height: 20px; +} + +QProgressBar::chunk { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Group Boxes + ============================================================================= */ + +QGroupBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 6px; + margin-top: 12px; + padding-top: 8px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 4px; + color: #bac2de; + background-color: #1e1e2e; +} + +/* ============================================================================= + Tree View + ============================================================================= */ + +QTreeView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; + show-decoration-selected: 1; +} + +QTreeView::item { + padding: 4px; + border-radius: 2px; +} + +QTreeView::item:hover { + background-color: #313244; +} + +QTreeView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTreeView::item:selected:active { + background-color: #585b70; +} + +QTreeView::branch { + background-color: transparent; +} + +QTreeView::branch:hover { + background-color: #313244; +} + +QTreeView::branch:selected { + background-color: #45475a; +} + +/* ============================================================================= + List View + ============================================================================= */ + +QListView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; +} + +QListView::item { + padding: 4px; + border-radius: 2px; +} + +QListView::item:hover { + background-color: #313244; +} + +QListView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +/* ============================================================================= + Table View + ============================================================================= */ + +QTableView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + gridline-color: #313244; + outline: none; +} + +QTableView::item { + padding: 4px; +} + +QTableView::item:hover { + background-color: #313244; +} + +QTableView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTableView QTableCornerButton::section { + background-color: #313244; + border: 1px solid #45475a; +} + +/* ============================================================================= + Header Views (for Tables/Trees) + ============================================================================= */ + +QHeaderView { + background-color: #313244; + border: none; +} + +QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: none; + border-right: 1px solid #45475a; + border-bottom: 1px solid #45475a; + padding: 6px 8px; +} + +QHeaderView::section:hover { + background-color: #45475a; + color: #cdd6f4; +} + +QHeaderView::section:checked { + background-color: #45475a; +} + +QHeaderView::down-arrow { + width: 10px; + height: 10px; +} + +QHeaderView::up-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Splitters + ============================================================================= */ + +QSplitter::handle { + background-color: #313244; +} + +QSplitter::handle:horizontal { + width: 4px; +} + +QSplitter::handle:vertical { + height: 4px; +} + +QSplitter::handle:hover { + background-color: #cba6f7; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +QStatusBar { + background-color: #181825; + color: #bac2de; + border-top: 1px solid #313244; +} + +QStatusBar::item { + border: none; +} + +QStatusBar QLabel { + padding: 2px 8px; +} + +/* ============================================================================= + Tooltips + ============================================================================= */ + +QToolTip { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +/* ============================================================================= + Labels + ============================================================================= */ + +QLabel { + color: #cdd6f4; + background-color: transparent; +} + +QLabel:disabled { + color: #6c7086; +} + +/* ============================================================================= + Frames + ============================================================================= */ + +QFrame { + border: none; +} + +QFrame[frameShape="4"] { + /* HLine */ + background-color: #45475a; + max-height: 1px; +} + +QFrame[frameShape="5"] { + /* VLine */ + background-color: #45475a; + max-width: 1px; +} + +/* ============================================================================= + Tool Box (Collapsible sections) + ============================================================================= */ + +QToolBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; +} + +QToolBox::tab { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 8px; +} + +QToolBox::tab:selected { + background-color: #45475a; + border-color: #cba6f7; +} + +QToolBox::tab:hover { + background-color: #45475a; +} + +/* ============================================================================= + Dialog Buttons + ============================================================================= */ + +QDialogButtonBox { + button-layout: 0; +} + +/* ============================================================================= + Date/Time Edits + ============================================================================= */ + +QDateEdit, QTimeEdit, QDateTimeEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; +} + +QDateEdit:focus, QTimeEdit:focus, QDateTimeEdit:focus { + border-color: #cba6f7; +} + +QDateEdit::drop-down, QTimeEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QCalendarWidget { + background-color: #1e1e2e; +} + +QCalendarWidget QToolButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + margin: 2px; +} + +QCalendarWidget QToolButton:hover { + background-color: #45475a; +} + +QCalendarWidget QMenu { + background-color: #313244; +} + +QCalendarWidget QSpinBox { + background-color: #313244; +} + +QCalendarWidget QAbstractItemView { + background-color: #1e1e2e; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* ============================================================================= + Wizard + ============================================================================= */ + +QWizard { + background-color: #1e1e2e; +} + +QWizard QLabel { + color: #cdd6f4; +} + +/* ============================================================================= + FreeCAD Specific Widgets + ============================================================================= */ + +/* Property Editor */ +Gui--PropertyEditor--PropertyEditor { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + qproperty-groupBackground: #313244; + qproperty-groupTextColor: #bac2de; + qproperty-itemBackground: #1e1e2e; +} + +Gui--PropertyEditor--PropertyEditor QLineEdit { + background-color: #313244; + border: 1px solid #45475a; +} + +Gui--PropertyEditor--PropertyEditor QComboBox { + background-color: #313244; +} + +/* Color Button */ +Gui--ColorButton { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 4px; + padding: 2px; +} + +Gui--ColorButton:hover { + border-color: #cba6f7; +} + +/* Workbench Selector */ +Gui--WorkbenchComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +Gui--WorkbenchComboBox:hover { + border-color: #585b70; +} + +Gui--WorkbenchComboBox::drop-down { + background-color: #45475a; + border-left: 1px solid #45475a; + border-radius: 0 4px 4px 0; +} + +/* Task Panel */ +QSint--ActionGroup { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 6px; +} + +QSint--ActionGroup QToolButton { + background-color: #313244; + color: #cdd6f4; + border: none; + border-radius: 4px; + padding: 6px; +} + +QSint--ActionGroup QToolButton:hover { + background-color: #45475a; +} + +QSint--ActionGroup QFrame { + background-color: #1e1e2e; + border: none; + border-radius: 4px; +} + +/* Input Field */ +Gui--InputField { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; +} + +Gui--InputField:focus { + border-color: #cba6f7; +} + +/* Expression Completer */ +Gui--ExpressionCompleter { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +/* Spreadsheet */ +SpreadsheetGui--SheetTableView { + background-color: #1e1e2e; + color: #cdd6f4; + gridline-color: #45475a; + selection-background-color: #45475a; + selection-color: #cdd6f4; +} + +SpreadsheetGui--SheetTableView QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 4px; +} + +/* Python Console */ +Gui--PythonConsole { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #45475a; +} + +/* Python Editor */ +Gui--PythonEditor { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* Report View */ +Gui--DockWnd--ReportOutput { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; +} + +/* DAG View */ +Gui--DAG--Model { + background-color: #1e1e2e; +} + +/* ============================================================================= + Sketcher Specific Styles + ============================================================================= */ + +/* Sketcher constraint colors are handled via preferences, not QSS */ + +/* ============================================================================= + Syntax Highlighting Colors (Python Editor) + Note: These are typically set via FreeCAD preferences, but we define them here + for reference and any widgets that support them. + ============================================================================= */ + +/* + Python Editor Syntax Colors (Catppuccin Mocha): + - Comment: #7f849c + - Number: #fab387 + - String: #a6e3a1 + - Keyword: #cba6f7 + - Class/Def name: #89b4fa + - Operator: #89dceb + - Output: #cdd6f4 + - Error: #f38ba8 +*/ + +/* ============================================================================= + Custom Color Accents by Context + ============================================================================= */ + +/* Success states */ +*[state="success"] { + color: #a6e3a1; +} + +/* Warning states */ +*[state="warning"] { + color: #f9e2af; +} + +/* Error states */ +*[state="error"] { + color: #f38ba8; +} + +/* Info states */ +*[state="info"] { + color: #89b4fa; +} diff --git a/resources/preferences/package.xml b/resources/preferences/package.xml new file mode 100644 index 0000000000..263ed8059c --- /dev/null +++ b/resources/preferences/package.xml @@ -0,0 +1,18 @@ + + + + Kindred Create Preference Packs + Default preference packs for Kindred Create, featuring the Catppuccin Mocha color theme. + 0.1.0 + Kindred Systems LLC + LGPL-2.1-or-later + https://kindredsystems.net + + + + KindredCreate + The default Kindred Create theme based on Catppuccin Mocha - a soothing dark color palette. + + + + diff --git a/src/Gui/Dialogs/DlgAbout.cpp b/src/Gui/Dialogs/DlgAbout.cpp index 4b173a69f7..2dc0d31f1c 100644 --- a/src/Gui/Dialogs/DlgAbout.cpp +++ b/src/Gui/Dialogs/DlgAbout.cpp @@ -328,9 +328,14 @@ void AboutDialog::showCredits() //: Header for the Credits tab of the About screen QString creditsHTML - = QStringLiteral("

%1

%2

%3

    ") + = QStringLiteral("

    %1

    " + "

    Kindred Systems LLC

    " + "

    Kindred Create is developed by Kindred Systems LLC, Kansas City, Missouri.
    " + "Website:
    https://kindredsystems.net

    " + "

    FreeCAD Project

    " + "

    %2

    %3

      ") .arg(tr("Credits", "Header for the Credits tab of the About screen")) - .arg(tr("FreeCAD would not be possible without the contributions of:")) + .arg(tr("Kindred Create is based on FreeCAD and would not be possible without the contributions of:")) .arg(tr("Individuals", "Header for the list of individual people in the Credits list.")); QTextStream stream(&creditsFile); diff --git a/src/Gui/Icons/kindred-create.svg b/src/Gui/Icons/kindred-create.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/src/Gui/Icons/kindred-create.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/src/Gui/Icons/kindredcreateabout.png b/src/Gui/Icons/kindredcreateabout.png new file mode 100644 index 0000000000000000000000000000000000000000..894ea3a98560f1cd0a3044d808716ddd356d41d9 GIT binary patch literal 3875 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 literal 0 HcmV?d00001 diff --git a/src/Gui/Icons/kindredcreatesplash.png b/src/Gui/Icons/kindredcreatesplash.png new file mode 100644 index 0000000000000000000000000000000000000000..a434229b024b37bab1431f4b8e5070702a993720 GIT binary patch literal 11258 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 literal 0 HcmV?d00001 diff --git a/src/Gui/Icons/kindredcreatesplash_2x.png b/src/Gui/Icons/kindredcreatesplash_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cfeda910fe1e3617dcdc5fa9f28a8681adfa72 GIT binary patch literal 25202 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.png freecadsplash9_2x.png freecadsplash9.png + kindred-create.svg + kindredcreateabout.png + kindredcreatesplash.png + kindredcreatesplash_2x.png Geoassembly.svg Geofeaturegroup.svg Group.svg diff --git a/src/Gui/PreferencePacks/CMakeLists.txt b/src/Gui/PreferencePacks/CMakeLists.txt index c0d86a98e9..64f2092426 100644 --- a/src/Gui/PreferencePacks/CMakeLists.txt +++ b/src/Gui/PreferencePacks/CMakeLists.txt @@ -3,6 +3,7 @@ SET(PreferencePacks_Files ) SET(PreferencePacks_Directories + "KindredCreate" "FreeCAD Classic" "Dark behave" "FreeCAD Light" diff --git a/src/Gui/PreferencePacks/KindredCreate/KindredCreate.cfg b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.cfg new file mode 100644 index 0000000000..5714f860f7 --- /dev/null +++ b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.cfg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KindredCreate.qss + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss new file mode 100644 index 0000000000..6ce5343d31 --- /dev/null +++ b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss @@ -0,0 +1,1229 @@ + +/* ============================================================================= + Catppuccin Mocha Theme for FreeCAD + Bundled with ztools addon + https://catppuccin.com/ + ============================================================================= */ + +/* ============================================================================= + Global Defaults + ============================================================================= */ + +* { + color: #cdd6f4; + font-family: "Segoe UI", "Ubuntu", "Noto Sans", sans-serif; +} + +QWidget { + background-color: #1e1e2e; + color: #cdd6f4; + selection-background-color: #585b70; + selection-color: #cdd6f4; +} + +/* ============================================================================= + Main Window and MDI Area + ============================================================================= */ + +QMainWindow { + background-color: #181825; +} + +QMainWindow::separator { + background-color: #313244; + width: 4px; + height: 4px; +} + +QMainWindow::separator:hover { + background-color: #cba6f7; +} + +QMdiArea { + background-color: #11111b; +} + +QMdiSubWindow { + background-color: #1e1e2e; + border: 1px solid #45475a; +} + +QMdiSubWindow > QWidget { + background-color: #1e1e2e; +} + +/* ============================================================================= + Menu Bar + ============================================================================= */ + +QMenuBar { + background-color: #181825; + color: #cdd6f4; + border-bottom: 1px solid #313244; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 4px 8px; + border-radius: 4px; +} + +QMenuBar::item:selected { + background-color: #313244; +} + +QMenuBar::item:pressed { + background-color: #45475a; +} + +/* ============================================================================= + Menus + ============================================================================= */ + +QMenu { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px 6px 8px; + border-radius: 4px; +} + +QMenu::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QMenu::item:disabled { + color: #6c7086; +} + +QMenu::separator { + height: 1px; + background-color: #45475a; + margin: 4px 8px; +} + +QMenu::icon { + margin-left: 8px; +} + +QMenu::indicator { + width: 16px; + height: 16px; + margin-left: 4px; +} + +/* ============================================================================= + Toolbars + ============================================================================= */ + +QToolBar { + background-color: #181825; + border: none; + spacing: 2px; + padding: 2px; +} + +QToolBar::handle { + background-color: #45475a; + width: 8px; + margin: 2px; + border-radius: 2px; +} + +QToolBar::handle:horizontal { + width: 8px; +} + +QToolBar::handle:vertical { + height: 8px; +} + +QToolBar::separator { + background-color: #45475a; + width: 1px; + margin: 4px 2px; +} + +/* ============================================================================= + Tool Buttons (Toolbar icons) + ============================================================================= */ + +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + padding: 4px; + margin: 1px; +} + +QToolButton:hover { + background-color: #313244; + border: 1px solid #45475a; +} + +QToolButton:pressed { + background-color: #45475a; +} + +QToolButton:checked { + background-color: #45475a; + border: 1px solid #cba6f7; +} + +QToolButton:disabled { + color: #6c7086; +} + +QToolButton[popupMode="1"] { + padding-right: 16px; +} + +QToolButton::menu-button { + border: none; + width: 14px; +} + +QToolButton::menu-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Push Buttons + ============================================================================= */ + +QPushButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 6px 16px; + min-height: 20px; +} + +QPushButton:hover { + background-color: #45475a; + border-color: #585b70; +} + +QPushButton:pressed { + background-color: #585b70; +} + +QPushButton:checked { + background-color: #cba6f7; + color: #11111b; + border-color: #cba6f7; +} + +QPushButton:disabled { + background-color: #313244; + color: #6c7086; + border-color: #313244; +} + +QPushButton:default { + border: 2px solid #cba6f7; +} + +/* ============================================================================= + Dock Widgets + ============================================================================= */ + +QDockWidget { + background-color: #1e1e2e; + color: #cdd6f4; + titlebar-close-icon: none; + titlebar-normal-icon: none; +} + +QDockWidget::title { + background-color: #181825; + color: #cdd6f4; + padding: 6px; + border-bottom: 1px solid #313244; +} + +QDockWidget::close-button, +QDockWidget::float-button { + background-color: transparent; + border: none; + padding: 2px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background-color: #313244; + border-radius: 4px; +} + +/* ============================================================================= + Tab Widgets + ============================================================================= */ + +QTabWidget::pane { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; + top: -1px; +} + +QTabBar { + background-color: transparent; +} + +QTabBar::tab { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 6px 12px; + margin-right: 2px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:selected { + background-color: #1e1e2e; + color: #cdd6f4; + border-bottom-color: #1e1e2e; +} + +QTabBar::tab:hover:!selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTabBar::tab:disabled { + color: #6c7086; +} + +QTabBar::close-button { + margin-left: 4px; +} + +QTabBar::close-button:hover { + background-color: #f38ba8; + border-radius: 2px; +} + +/* ============================================================================= + Scroll Bars + ============================================================================= */ + +QScrollBar:horizontal { + background-color: #181825; + height: 12px; + margin: 0 12px 0 12px; + border-radius: 6px; +} + +QScrollBar:vertical { + background-color: #181825; + width: 12px; + margin: 12px 0 12px 0; + border-radius: 6px; +} + +QScrollBar::handle:horizontal { + background-color: #45475a; + min-width: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:vertical { + background-color: #45475a; + min-height: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover { + background-color: #585b70; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + width: 12px; + height: 12px; + background-color: #313244; + border-radius: 6px; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + background-color: #45475a; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background-color: transparent; +} + +/* ============================================================================= + Input Fields + ============================================================================= */ + +QLineEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QLineEdit:focus { + border-color: #cba6f7; +} + +QLineEdit:disabled { + background-color: #181825; + color: #6c7086; +} + +QLineEdit:read-only { + background-color: #181825; +} + +QTextEdit, QPlainTextEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QTextEdit:focus, QPlainTextEdit:focus { + border-color: #cba6f7; +} + +/* ============================================================================= + Spin Boxes + ============================================================================= */ + +QSpinBox, QDoubleSpinBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; + padding-right: 20px; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border-color: #cba6f7; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-left: 1px solid #45475a; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover { + background-color: #585b70; +} + +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed { + background-color: #cba6f7; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + width: 8px; + height: 8px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + width: 8px; + height: 8px; +} + +/* ============================================================================= + Combo Boxes + ============================================================================= */ + +QComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + padding-right: 24px; + min-height: 20px; +} + +QComboBox:hover { + border-color: #585b70; +} + +QComboBox:focus { + border-color: #cba6f7; +} + +QComboBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QComboBox::drop-down:hover { + background-color: #585b70; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #45475a; + selection-color: #cdd6f4; + outline: none; +} + +QComboBox QAbstractItemView::item { + padding: 4px 8px; + min-height: 24px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #45475a; +} + +QComboBox QAbstractItemView::item:selected { + background-color: #585b70; +} + +/* ============================================================================= + Check Boxes + ============================================================================= */ + +QCheckBox { + spacing: 8px; + color: #cdd6f4; +} + +QCheckBox:disabled { + color: #6c7086; +} + +QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 4px; + background-color: #313244; +} + +QCheckBox::indicator:hover { + border-color: #cba6f7; +} + +QCheckBox::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QCheckBox::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QCheckBox::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Radio Buttons + ============================================================================= */ + +QRadioButton { + spacing: 8px; + color: #cdd6f4; +} + +QRadioButton:disabled { + color: #6c7086; +} + +QRadioButton::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 9px; + background-color: #313244; +} + +QRadioButton::indicator:hover { + border-color: #cba6f7; +} + +QRadioButton::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QRadioButton::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QRadioButton::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Sliders + ============================================================================= */ + +QSlider::groove:horizontal { + height: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::groove:vertical { + width: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::handle:horizontal { + width: 16px; + height: 16px; + margin: -5px 0; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:vertical { + width: 16px; + height: 16px; + margin: 0 -5px; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + background-color: #b4befe; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #f5c2e7; +} + +QSlider::sub-page:horizontal { + background-color: #cba6f7; + border-radius: 3px; +} + +QSlider::add-page:vertical { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Progress Bars + ============================================================================= */ + +QProgressBar { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + text-align: center; + height: 20px; +} + +QProgressBar::chunk { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Group Boxes + ============================================================================= */ + +QGroupBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 6px; + margin-top: 12px; + padding-top: 8px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 4px; + color: #bac2de; + background-color: #1e1e2e; +} + +/* ============================================================================= + Tree View + ============================================================================= */ + +QTreeView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; + show-decoration-selected: 1; +} + +QTreeView::item { + padding: 4px; + border-radius: 2px; +} + +QTreeView::item:hover { + background-color: #313244; +} + +QTreeView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTreeView::item:selected:active { + background-color: #585b70; +} + +QTreeView::branch { + background-color: transparent; +} + +QTreeView::branch:hover { + background-color: #313244; +} + +QTreeView::branch:selected { + background-color: #45475a; +} + +/* ============================================================================= + List View + ============================================================================= */ + +QListView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; +} + +QListView::item { + padding: 4px; + border-radius: 2px; +} + +QListView::item:hover { + background-color: #313244; +} + +QListView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +/* ============================================================================= + Table View + ============================================================================= */ + +QTableView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + gridline-color: #313244; + outline: none; +} + +QTableView::item { + padding: 4px; +} + +QTableView::item:hover { + background-color: #313244; +} + +QTableView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTableView QTableCornerButton::section { + background-color: #313244; + border: 1px solid #45475a; +} + +/* ============================================================================= + Header Views (for Tables/Trees) + ============================================================================= */ + +QHeaderView { + background-color: #313244; + border: none; +} + +QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: none; + border-right: 1px solid #45475a; + border-bottom: 1px solid #45475a; + padding: 6px 8px; +} + +QHeaderView::section:hover { + background-color: #45475a; + color: #cdd6f4; +} + +QHeaderView::section:checked { + background-color: #45475a; +} + +QHeaderView::down-arrow { + width: 10px; + height: 10px; +} + +QHeaderView::up-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Splitters + ============================================================================= */ + +QSplitter::handle { + background-color: #313244; +} + +QSplitter::handle:horizontal { + width: 4px; +} + +QSplitter::handle:vertical { + height: 4px; +} + +QSplitter::handle:hover { + background-color: #cba6f7; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +QStatusBar { + background-color: #181825; + color: #bac2de; + border-top: 1px solid #313244; +} + +QStatusBar::item { + border: none; +} + +QStatusBar QLabel { + padding: 2px 8px; +} + +/* ============================================================================= + Tooltips + ============================================================================= */ + +QToolTip { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +/* ============================================================================= + Labels + ============================================================================= */ + +QLabel { + color: #cdd6f4; + background-color: transparent; +} + +QLabel:disabled { + color: #6c7086; +} + +/* ============================================================================= + Frames + ============================================================================= */ + +QFrame { + border: none; +} + +QFrame[frameShape="4"] { + /* HLine */ + background-color: #45475a; + max-height: 1px; +} + +QFrame[frameShape="5"] { + /* VLine */ + background-color: #45475a; + max-width: 1px; +} + +/* ============================================================================= + Tool Box (Collapsible sections) + ============================================================================= */ + +QToolBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; +} + +QToolBox::tab { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 8px; +} + +QToolBox::tab:selected { + background-color: #45475a; + border-color: #cba6f7; +} + +QToolBox::tab:hover { + background-color: #45475a; +} + +/* ============================================================================= + Dialog Buttons + ============================================================================= */ + +QDialogButtonBox { + button-layout: 0; +} + +/* ============================================================================= + Date/Time Edits + ============================================================================= */ + +QDateEdit, QTimeEdit, QDateTimeEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; +} + +QDateEdit:focus, QTimeEdit:focus, QDateTimeEdit:focus { + border-color: #cba6f7; +} + +QDateEdit::drop-down, QTimeEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QCalendarWidget { + background-color: #1e1e2e; +} + +QCalendarWidget QToolButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + margin: 2px; +} + +QCalendarWidget QToolButton:hover { + background-color: #45475a; +} + +QCalendarWidget QMenu { + background-color: #313244; +} + +QCalendarWidget QSpinBox { + background-color: #313244; +} + +QCalendarWidget QAbstractItemView { + background-color: #1e1e2e; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* ============================================================================= + Wizard + ============================================================================= */ + +QWizard { + background-color: #1e1e2e; +} + +QWizard QLabel { + color: #cdd6f4; +} + +/* ============================================================================= + FreeCAD Specific Widgets + ============================================================================= */ + +/* Property Editor */ +Gui--PropertyEditor--PropertyEditor { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + qproperty-groupBackground: #313244; + qproperty-groupTextColor: #bac2de; + qproperty-itemBackground: #1e1e2e; +} + +Gui--PropertyEditor--PropertyEditor QLineEdit { + background-color: #313244; + border: 1px solid #45475a; +} + +Gui--PropertyEditor--PropertyEditor QComboBox { + background-color: #313244; +} + +/* Color Button */ +Gui--ColorButton { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 4px; + padding: 2px; +} + +Gui--ColorButton:hover { + border-color: #cba6f7; +} + +/* Workbench Selector */ +Gui--WorkbenchComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +Gui--WorkbenchComboBox:hover { + border-color: #585b70; +} + +Gui--WorkbenchComboBox::drop-down { + background-color: #45475a; + border-left: 1px solid #45475a; + border-radius: 0 4px 4px 0; +} + +/* Task Panel */ +QSint--ActionGroup { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 6px; +} + +QSint--ActionGroup QToolButton { + background-color: #313244; + color: #cdd6f4; + border: none; + border-radius: 4px; + padding: 6px; +} + +QSint--ActionGroup QToolButton:hover { + background-color: #45475a; +} + +QSint--ActionGroup QFrame { + background-color: #1e1e2e; + border: none; + border-radius: 4px; +} + +/* Input Field */ +Gui--InputField { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; +} + +Gui--InputField:focus { + border-color: #cba6f7; +} + +/* Expression Completer */ +Gui--ExpressionCompleter { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +/* Spreadsheet */ +SpreadsheetGui--SheetTableView { + background-color: #1e1e2e; + color: #cdd6f4; + gridline-color: #45475a; + selection-background-color: #45475a; + selection-color: #cdd6f4; +} + +SpreadsheetGui--SheetTableView QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 4px; +} + +/* Python Console */ +Gui--PythonConsole { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #45475a; +} + +/* Python Editor */ +Gui--PythonEditor { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* Report View */ +Gui--DockWnd--ReportOutput { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; +} + +/* DAG View */ +Gui--DAG--Model { + background-color: #1e1e2e; +} + +/* ============================================================================= + Sketcher Specific Styles + ============================================================================= */ + +/* Sketcher constraint colors are handled via preferences, not QSS */ + +/* ============================================================================= + Syntax Highlighting Colors (Python Editor) + Note: These are typically set via FreeCAD preferences, but we define them here + for reference and any widgets that support them. + ============================================================================= */ + +/* + Python Editor Syntax Colors (Catppuccin Mocha): + - Comment: #7f849c + - Number: #fab387 + - String: #a6e3a1 + - Keyword: #cba6f7 + - Class/Def name: #89b4fa + - Operator: #89dceb + - Output: #cdd6f4 + - Error: #f38ba8 +*/ + +/* ============================================================================= + Custom Color Accents by Context + ============================================================================= */ + +/* Success states */ +*[state="success"] { + color: #a6e3a1; +} + +/* Warning states */ +*[state="warning"] { + color: #f9e2af; +} + +/* Error states */ +*[state="error"] { + color: #f38ba8; +} + +/* Info states */ +*[state="info"] { + color: #89b4fa; +} diff --git a/src/Gui/PreferencePacks/package.xml b/src/Gui/PreferencePacks/package.xml index 3ecbc6b807..eacd80cc72 100644 --- a/src/Gui/PreferencePacks/package.xml +++ b/src/Gui/PreferencePacks/package.xml @@ -1,12 +1,23 @@ Built-In Preference Packs - Preference Packs included with the FreeCAD distribution + Preference Packs included with the Kindred Create distribution 1.0.0 - MisterMaker + Kindred Systems LLC LGPL2 - https://github.com/FreeCAD/FreeCAD + https://github.com/kindredsystems/create + + KindredCreate + Theme + The default Kindred Create theme based on Catppuccin Mocha - a soothing dark color palette with carefully chosen colors for optimal readability. + 1.0.0 + built-in + default + dark + catppuccin + mocha + FreeCAD Classic Theme @@ -17,8 +28,8 @@ no stylesheet classic theme - - FreeCAD Light + + FreeCAD Light Theme Applies a basic light theme. 1.0.0 @@ -26,8 +37,8 @@ background light - - FreeCAD Dark + + FreeCAD Dark Theme Applies a basic dark theme. 1.0.0 diff --git a/src/Gui/SplashScreen.cpp b/src/Gui/SplashScreen.cpp index 7006911058..656cb64fb2 100644 --- a/src/Gui/SplashScreen.cpp +++ b/src/Gui/SplashScreen.cpp @@ -360,8 +360,8 @@ QPixmap SplashScreen::splashImage() fontExe.setPointSizeF(20.0); QFontMetrics metricExe(fontExe); int l = QtTools::horizontalAdvance(metricExe, title); - if (title == QLatin1String("FreeCAD")) { - l = 0.0; // "FreeCAD" text is already part of the splashscreen, version goes below it + if (title == QLatin1String("Kindred Create")) { + // For Kindred Create splash, we draw the title as part of the dynamic rendering } int w = splash_image.width(); int h = splash_image.height(); diff --git a/src/Gui/Stylesheets/CMakeLists.txt b/src/Gui/Stylesheets/CMakeLists.txt index 717aef4da8..104ff80ae2 100644 --- a/src/Gui/Stylesheets/CMakeLists.txt +++ b/src/Gui/Stylesheets/CMakeLists.txt @@ -1,5 +1,6 @@ SET(Stylesheets_Files + "KindredCreate.qss" "FreeCAD.qss" "defaults.qss" ) diff --git a/src/Gui/Stylesheets/KindredCreate.qss b/src/Gui/Stylesheets/KindredCreate.qss new file mode 100644 index 0000000000..6ce5343d31 --- /dev/null +++ b/src/Gui/Stylesheets/KindredCreate.qss @@ -0,0 +1,1229 @@ + +/* ============================================================================= + Catppuccin Mocha Theme for FreeCAD + Bundled with ztools addon + https://catppuccin.com/ + ============================================================================= */ + +/* ============================================================================= + Global Defaults + ============================================================================= */ + +* { + color: #cdd6f4; + font-family: "Segoe UI", "Ubuntu", "Noto Sans", sans-serif; +} + +QWidget { + background-color: #1e1e2e; + color: #cdd6f4; + selection-background-color: #585b70; + selection-color: #cdd6f4; +} + +/* ============================================================================= + Main Window and MDI Area + ============================================================================= */ + +QMainWindow { + background-color: #181825; +} + +QMainWindow::separator { + background-color: #313244; + width: 4px; + height: 4px; +} + +QMainWindow::separator:hover { + background-color: #cba6f7; +} + +QMdiArea { + background-color: #11111b; +} + +QMdiSubWindow { + background-color: #1e1e2e; + border: 1px solid #45475a; +} + +QMdiSubWindow > QWidget { + background-color: #1e1e2e; +} + +/* ============================================================================= + Menu Bar + ============================================================================= */ + +QMenuBar { + background-color: #181825; + color: #cdd6f4; + border-bottom: 1px solid #313244; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 4px 8px; + border-radius: 4px; +} + +QMenuBar::item:selected { + background-color: #313244; +} + +QMenuBar::item:pressed { + background-color: #45475a; +} + +/* ============================================================================= + Menus + ============================================================================= */ + +QMenu { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px 6px 8px; + border-radius: 4px; +} + +QMenu::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QMenu::item:disabled { + color: #6c7086; +} + +QMenu::separator { + height: 1px; + background-color: #45475a; + margin: 4px 8px; +} + +QMenu::icon { + margin-left: 8px; +} + +QMenu::indicator { + width: 16px; + height: 16px; + margin-left: 4px; +} + +/* ============================================================================= + Toolbars + ============================================================================= */ + +QToolBar { + background-color: #181825; + border: none; + spacing: 2px; + padding: 2px; +} + +QToolBar::handle { + background-color: #45475a; + width: 8px; + margin: 2px; + border-radius: 2px; +} + +QToolBar::handle:horizontal { + width: 8px; +} + +QToolBar::handle:vertical { + height: 8px; +} + +QToolBar::separator { + background-color: #45475a; + width: 1px; + margin: 4px 2px; +} + +/* ============================================================================= + Tool Buttons (Toolbar icons) + ============================================================================= */ + +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + padding: 4px; + margin: 1px; +} + +QToolButton:hover { + background-color: #313244; + border: 1px solid #45475a; +} + +QToolButton:pressed { + background-color: #45475a; +} + +QToolButton:checked { + background-color: #45475a; + border: 1px solid #cba6f7; +} + +QToolButton:disabled { + color: #6c7086; +} + +QToolButton[popupMode="1"] { + padding-right: 16px; +} + +QToolButton::menu-button { + border: none; + width: 14px; +} + +QToolButton::menu-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Push Buttons + ============================================================================= */ + +QPushButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 6px 16px; + min-height: 20px; +} + +QPushButton:hover { + background-color: #45475a; + border-color: #585b70; +} + +QPushButton:pressed { + background-color: #585b70; +} + +QPushButton:checked { + background-color: #cba6f7; + color: #11111b; + border-color: #cba6f7; +} + +QPushButton:disabled { + background-color: #313244; + color: #6c7086; + border-color: #313244; +} + +QPushButton:default { + border: 2px solid #cba6f7; +} + +/* ============================================================================= + Dock Widgets + ============================================================================= */ + +QDockWidget { + background-color: #1e1e2e; + color: #cdd6f4; + titlebar-close-icon: none; + titlebar-normal-icon: none; +} + +QDockWidget::title { + background-color: #181825; + color: #cdd6f4; + padding: 6px; + border-bottom: 1px solid #313244; +} + +QDockWidget::close-button, +QDockWidget::float-button { + background-color: transparent; + border: none; + padding: 2px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background-color: #313244; + border-radius: 4px; +} + +/* ============================================================================= + Tab Widgets + ============================================================================= */ + +QTabWidget::pane { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; + top: -1px; +} + +QTabBar { + background-color: transparent; +} + +QTabBar::tab { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 6px 12px; + margin-right: 2px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:selected { + background-color: #1e1e2e; + color: #cdd6f4; + border-bottom-color: #1e1e2e; +} + +QTabBar::tab:hover:!selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTabBar::tab:disabled { + color: #6c7086; +} + +QTabBar::close-button { + margin-left: 4px; +} + +QTabBar::close-button:hover { + background-color: #f38ba8; + border-radius: 2px; +} + +/* ============================================================================= + Scroll Bars + ============================================================================= */ + +QScrollBar:horizontal { + background-color: #181825; + height: 12px; + margin: 0 12px 0 12px; + border-radius: 6px; +} + +QScrollBar:vertical { + background-color: #181825; + width: 12px; + margin: 12px 0 12px 0; + border-radius: 6px; +} + +QScrollBar::handle:horizontal { + background-color: #45475a; + min-width: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:vertical { + background-color: #45475a; + min-height: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover { + background-color: #585b70; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + width: 12px; + height: 12px; + background-color: #313244; + border-radius: 6px; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + background-color: #45475a; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background-color: transparent; +} + +/* ============================================================================= + Input Fields + ============================================================================= */ + +QLineEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QLineEdit:focus { + border-color: #cba6f7; +} + +QLineEdit:disabled { + background-color: #181825; + color: #6c7086; +} + +QLineEdit:read-only { + background-color: #181825; +} + +QTextEdit, QPlainTextEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QTextEdit:focus, QPlainTextEdit:focus { + border-color: #cba6f7; +} + +/* ============================================================================= + Spin Boxes + ============================================================================= */ + +QSpinBox, QDoubleSpinBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; + padding-right: 20px; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border-color: #cba6f7; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-left: 1px solid #45475a; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover { + background-color: #585b70; +} + +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed { + background-color: #cba6f7; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + width: 8px; + height: 8px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + width: 8px; + height: 8px; +} + +/* ============================================================================= + Combo Boxes + ============================================================================= */ + +QComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + padding-right: 24px; + min-height: 20px; +} + +QComboBox:hover { + border-color: #585b70; +} + +QComboBox:focus { + border-color: #cba6f7; +} + +QComboBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QComboBox::drop-down:hover { + background-color: #585b70; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #45475a; + selection-color: #cdd6f4; + outline: none; +} + +QComboBox QAbstractItemView::item { + padding: 4px 8px; + min-height: 24px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #45475a; +} + +QComboBox QAbstractItemView::item:selected { + background-color: #585b70; +} + +/* ============================================================================= + Check Boxes + ============================================================================= */ + +QCheckBox { + spacing: 8px; + color: #cdd6f4; +} + +QCheckBox:disabled { + color: #6c7086; +} + +QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 4px; + background-color: #313244; +} + +QCheckBox::indicator:hover { + border-color: #cba6f7; +} + +QCheckBox::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QCheckBox::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QCheckBox::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Radio Buttons + ============================================================================= */ + +QRadioButton { + spacing: 8px; + color: #cdd6f4; +} + +QRadioButton:disabled { + color: #6c7086; +} + +QRadioButton::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 9px; + background-color: #313244; +} + +QRadioButton::indicator:hover { + border-color: #cba6f7; +} + +QRadioButton::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QRadioButton::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QRadioButton::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Sliders + ============================================================================= */ + +QSlider::groove:horizontal { + height: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::groove:vertical { + width: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::handle:horizontal { + width: 16px; + height: 16px; + margin: -5px 0; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:vertical { + width: 16px; + height: 16px; + margin: 0 -5px; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + background-color: #b4befe; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #f5c2e7; +} + +QSlider::sub-page:horizontal { + background-color: #cba6f7; + border-radius: 3px; +} + +QSlider::add-page:vertical { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Progress Bars + ============================================================================= */ + +QProgressBar { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + text-align: center; + height: 20px; +} + +QProgressBar::chunk { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Group Boxes + ============================================================================= */ + +QGroupBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 6px; + margin-top: 12px; + padding-top: 8px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 4px; + color: #bac2de; + background-color: #1e1e2e; +} + +/* ============================================================================= + Tree View + ============================================================================= */ + +QTreeView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; + show-decoration-selected: 1; +} + +QTreeView::item { + padding: 4px; + border-radius: 2px; +} + +QTreeView::item:hover { + background-color: #313244; +} + +QTreeView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTreeView::item:selected:active { + background-color: #585b70; +} + +QTreeView::branch { + background-color: transparent; +} + +QTreeView::branch:hover { + background-color: #313244; +} + +QTreeView::branch:selected { + background-color: #45475a; +} + +/* ============================================================================= + List View + ============================================================================= */ + +QListView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; +} + +QListView::item { + padding: 4px; + border-radius: 2px; +} + +QListView::item:hover { + background-color: #313244; +} + +QListView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +/* ============================================================================= + Table View + ============================================================================= */ + +QTableView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + gridline-color: #313244; + outline: none; +} + +QTableView::item { + padding: 4px; +} + +QTableView::item:hover { + background-color: #313244; +} + +QTableView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTableView QTableCornerButton::section { + background-color: #313244; + border: 1px solid #45475a; +} + +/* ============================================================================= + Header Views (for Tables/Trees) + ============================================================================= */ + +QHeaderView { + background-color: #313244; + border: none; +} + +QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: none; + border-right: 1px solid #45475a; + border-bottom: 1px solid #45475a; + padding: 6px 8px; +} + +QHeaderView::section:hover { + background-color: #45475a; + color: #cdd6f4; +} + +QHeaderView::section:checked { + background-color: #45475a; +} + +QHeaderView::down-arrow { + width: 10px; + height: 10px; +} + +QHeaderView::up-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Splitters + ============================================================================= */ + +QSplitter::handle { + background-color: #313244; +} + +QSplitter::handle:horizontal { + width: 4px; +} + +QSplitter::handle:vertical { + height: 4px; +} + +QSplitter::handle:hover { + background-color: #cba6f7; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +QStatusBar { + background-color: #181825; + color: #bac2de; + border-top: 1px solid #313244; +} + +QStatusBar::item { + border: none; +} + +QStatusBar QLabel { + padding: 2px 8px; +} + +/* ============================================================================= + Tooltips + ============================================================================= */ + +QToolTip { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +/* ============================================================================= + Labels + ============================================================================= */ + +QLabel { + color: #cdd6f4; + background-color: transparent; +} + +QLabel:disabled { + color: #6c7086; +} + +/* ============================================================================= + Frames + ============================================================================= */ + +QFrame { + border: none; +} + +QFrame[frameShape="4"] { + /* HLine */ + background-color: #45475a; + max-height: 1px; +} + +QFrame[frameShape="5"] { + /* VLine */ + background-color: #45475a; + max-width: 1px; +} + +/* ============================================================================= + Tool Box (Collapsible sections) + ============================================================================= */ + +QToolBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; +} + +QToolBox::tab { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 8px; +} + +QToolBox::tab:selected { + background-color: #45475a; + border-color: #cba6f7; +} + +QToolBox::tab:hover { + background-color: #45475a; +} + +/* ============================================================================= + Dialog Buttons + ============================================================================= */ + +QDialogButtonBox { + button-layout: 0; +} + +/* ============================================================================= + Date/Time Edits + ============================================================================= */ + +QDateEdit, QTimeEdit, QDateTimeEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; +} + +QDateEdit:focus, QTimeEdit:focus, QDateTimeEdit:focus { + border-color: #cba6f7; +} + +QDateEdit::drop-down, QTimeEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QCalendarWidget { + background-color: #1e1e2e; +} + +QCalendarWidget QToolButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + margin: 2px; +} + +QCalendarWidget QToolButton:hover { + background-color: #45475a; +} + +QCalendarWidget QMenu { + background-color: #313244; +} + +QCalendarWidget QSpinBox { + background-color: #313244; +} + +QCalendarWidget QAbstractItemView { + background-color: #1e1e2e; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* ============================================================================= + Wizard + ============================================================================= */ + +QWizard { + background-color: #1e1e2e; +} + +QWizard QLabel { + color: #cdd6f4; +} + +/* ============================================================================= + FreeCAD Specific Widgets + ============================================================================= */ + +/* Property Editor */ +Gui--PropertyEditor--PropertyEditor { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + qproperty-groupBackground: #313244; + qproperty-groupTextColor: #bac2de; + qproperty-itemBackground: #1e1e2e; +} + +Gui--PropertyEditor--PropertyEditor QLineEdit { + background-color: #313244; + border: 1px solid #45475a; +} + +Gui--PropertyEditor--PropertyEditor QComboBox { + background-color: #313244; +} + +/* Color Button */ +Gui--ColorButton { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 4px; + padding: 2px; +} + +Gui--ColorButton:hover { + border-color: #cba6f7; +} + +/* Workbench Selector */ +Gui--WorkbenchComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +Gui--WorkbenchComboBox:hover { + border-color: #585b70; +} + +Gui--WorkbenchComboBox::drop-down { + background-color: #45475a; + border-left: 1px solid #45475a; + border-radius: 0 4px 4px 0; +} + +/* Task Panel */ +QSint--ActionGroup { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 6px; +} + +QSint--ActionGroup QToolButton { + background-color: #313244; + color: #cdd6f4; + border: none; + border-radius: 4px; + padding: 6px; +} + +QSint--ActionGroup QToolButton:hover { + background-color: #45475a; +} + +QSint--ActionGroup QFrame { + background-color: #1e1e2e; + border: none; + border-radius: 4px; +} + +/* Input Field */ +Gui--InputField { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; +} + +Gui--InputField:focus { + border-color: #cba6f7; +} + +/* Expression Completer */ +Gui--ExpressionCompleter { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +/* Spreadsheet */ +SpreadsheetGui--SheetTableView { + background-color: #1e1e2e; + color: #cdd6f4; + gridline-color: #45475a; + selection-background-color: #45475a; + selection-color: #cdd6f4; +} + +SpreadsheetGui--SheetTableView QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 4px; +} + +/* Python Console */ +Gui--PythonConsole { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #45475a; +} + +/* Python Editor */ +Gui--PythonEditor { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* Report View */ +Gui--DockWnd--ReportOutput { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; +} + +/* DAG View */ +Gui--DAG--Model { + background-color: #1e1e2e; +} + +/* ============================================================================= + Sketcher Specific Styles + ============================================================================= */ + +/* Sketcher constraint colors are handled via preferences, not QSS */ + +/* ============================================================================= + Syntax Highlighting Colors (Python Editor) + Note: These are typically set via FreeCAD preferences, but we define them here + for reference and any widgets that support them. + ============================================================================= */ + +/* + Python Editor Syntax Colors (Catppuccin Mocha): + - Comment: #7f849c + - Number: #fab387 + - String: #a6e3a1 + - Keyword: #cba6f7 + - Class/Def name: #89b4fa + - Operator: #89dceb + - Output: #cdd6f4 + - Error: #f38ba8 +*/ + +/* ============================================================================= + Custom Color Accents by Context + ============================================================================= */ + +/* Success states */ +*[state="success"] { + color: #a6e3a1; +} + +/* Warning states */ +*[state="warning"] { + color: #f9e2af; +} + +/* Error states */ +*[state="error"] { + color: #f38ba8; +} + +/* Info states */ +*[state="info"] { + color: #89b4fa; +} diff --git a/src/Main/FreeCADGuiPy.cpp b/src/Main/FreeCADGuiPy.cpp index 948d18e9e6..62e1893f50 100644 --- a/src/Main/FreeCADGuiPy.cpp +++ b/src/Main/FreeCADGuiPy.cpp @@ -336,11 +336,11 @@ PyMOD_INIT_FUNC(FreeCADGui) try { // clang-format off Base::Interpreter().loadModule("FreeCAD"); - App::Application::Config()["AppIcon"] = "freecad"; - App::Application::Config()["SplashScreen"] = "freecadsplash"; - App::Application::Config()["CopyrightInfo"] = "\xc2\xa9 Juergen Riegel, Werner Mayer, Yorik van Havre and others 2001-2025\n"; - App::Application::Config()["LicenseInfo"] = "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n"; - App::Application::Config()["CreditsInfo"] = "FreeCAD would not be possible without the FreeCAD community.\n"; + App::Application::Config()["AppIcon"] = "kindred-create"; + App::Application::Config()["SplashScreen"] = "kindredcreatesplash"; + App::Application::Config()["CopyrightInfo"] = "\xc2\xa9 2025 Kindred Systems LLC\n"; + App::Application::Config()["LicenseInfo"] = "Kindred Create is licensed under LGPL-3.0-or-later.\nBased on FreeCAD, licensed under LGPL-2.0-or-later.\n"; + App::Application::Config()["CreditsInfo"] = "Kindred Create is based on FreeCAD and would not be possible without the FreeCAD community.\n"; // clang-format on // it's possible that the GUI is already initialized when the Gui version of the executable diff --git a/src/Main/MainCmd.cpp b/src/Main/MainCmd.cpp index 1f14d93c6b..7c24e0ad21 100644 --- a/src/Main/MainCmd.cpp +++ b/src/Main/MainCmd.cpp @@ -45,8 +45,9 @@ using App::Application; using Base::Console; const char sBanner[] - = "(C) 2001-2025 FreeCAD contributors\n" - "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n\n"; + = "(C) 2025 Kindred Systems LLC\n" + "Kindred Create is licensed under LGPL-3.0-or-later.\n" + "Based on FreeCAD (C) 2001-2025 FreeCAD contributors, licensed under LGPL-2.0-or-later.\n\n"; int main(int argc, char** argv) { @@ -63,12 +64,13 @@ int main(int argc, char** argv) #endif // Name and Version of the Application - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; // set the banner (for logging and console) App::Application::Config()["CopyrightInfo"] = sBanner; + App::Application::Config()["MaintainerUrl"] = "https://kindredsystems.net"; try { // Init phase =========================================================== @@ -143,7 +145,7 @@ int main(int argc, char** argv) } // Destruction phase =========================================================== - Console().log("FreeCAD terminating...\n"); + Console().log("Kindred Create terminating...\n"); try { // close open documents @@ -155,7 +157,7 @@ int main(int argc, char** argv) // cleans up Application::destruct(); - Console().log("FreeCAD completely terminated\n"); + Console().log("Kindred Create completely terminated\n"); return 0; } diff --git a/src/Main/MainGui.cpp b/src/Main/MainGui.cpp index 9de976c904..6517d5b03f 100644 --- a/src/Main/MainGui.cpp +++ b/src/Main/MainGui.cpp @@ -53,8 +53,9 @@ void PrintInitHelp(); const char sBanner[] - = "(C) 2001-2025 FreeCAD contributors\n" - "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n\n"; + = "(C) 2025 Kindred Systems LLC\n" + "Kindred Create is licensed under LGPL-3.0-or-later.\n" + "Based on FreeCAD (C) 2001-2025 FreeCAD contributors, licensed under LGPL-2.0-or-later.\n\n"; #if defined(_MSC_VER) void InitMiniDumpWriter(const std::string&); @@ -184,26 +185,25 @@ int main(int argc, char** argv) #endif // Name and Version of the Application - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; - App::Application::Config()["MaintainerUrl"] = "https://freecad.org"; + App::Application::Config()["MaintainerUrl"] = "https://kindredsystems.net"; // set the banner (for logging and console) App::Application::Config()["CopyrightInfo"] = sBanner; - App::Application::Config()["AppIcon"] = "freecad"; - App::Application::Config()["SplashScreen"] = "freecadsplash"; - App::Application::Config()["AboutImage"] = App::Application::isDevelopmentVersion() - ? "freecadaboutdev" - : "freecadabout"; + App::Application::Config()["AppIcon"] = "kindred-create"; + App::Application::Config()["SplashScreen"] = "kindredcreatesplash"; + App::Application::Config()["AboutImage"] = "kindredcreateabout"; + App::Application::Config()["StyleSheet"] = "KindredCreate.qss"; App::Application::Config()["StartWorkbench"] = "PartDesignWorkbench"; // App::Application::Config()["HiddenDockWindow"] = "Property editor"; App::Application::Config()["SplashAlignment"] = "Bottom|Left"; - App::Application::Config()["SplashTextColor"] = "#418FDE"; - App::Application::Config()["SplashWarningColor"] = "#CA333B"; - App::Application::Config()["SplashInfoColor"] = "#000000"; + App::Application::Config()["SplashTextColor"] = "#cdd6f4"; // Catppuccin Mocha text + App::Application::Config()["SplashWarningColor"] = "#f38ba8"; // Catppuccin Mocha red + App::Application::Config()["SplashInfoColor"] = "#a6adc8"; // Catppuccin Mocha subtext0 App::Application::Config()["SplashInfoPosition"] = "6,75"; - App::Application::Config()["DesktopFileName"] = "org.freecad.FreeCAD"; + App::Application::Config()["DesktopFileName"] = "net.kindredsystems.KindredCreate"; try { // Init phase =========================================================== diff --git a/src/Main/MainPy.cpp b/src/Main/MainPy.cpp index c31802f405..6118c26a82 100644 --- a/src/Main/MainPy.cpp +++ b/src/Main/MainPy.cpp @@ -80,8 +80,8 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID /*lpReser PyMOD_INIT_FUNC(FreeCAD) { // Init phase =========================================================== - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; QByteArray path; diff --git a/src/Main/freecad.rc.cmake b/src/Main/freecad.rc.cmake index d0ab6d261f..467d4dbf92 100644 --- a/src/Main/freecad.rc.cmake +++ b/src/Main/freecad.rc.cmake @@ -11,7 +11,7 @@ // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon.ico" -// File info for the FreeCAD.exe +// File info for the kindred-create.exe // 1 VERSIONINFO FILEVERSION ${PACKAGE_VERSION_MAJOR},${PACKAGE_VERSION_MINOR},${PACKAGE_VERSION_PATCH},${PACKAGE_BUILD_VERSION} @@ -20,12 +20,12 @@ BEGIN BEGIN BLOCK "040904b0" // 409 stands for US English BEGIN - VALUE "CompanyName", "${PROJECT_NAME} Team" - VALUE "FileDescription", "${PROJECT_NAME} main executable" - VALUE "InternalName", "FreeCAD.exe" - VALUE "LegalCopyright", "Copyright (C) 2022" - VALUE "OriginalFilename", "FreeCAD.exe" - VALUE "ProductName", "${PROJECT_NAME}" + VALUE "CompanyName", "Kindred Systems LLC" + VALUE "FileDescription", "Kindred Create - Parametric 3D CAD modeler" + VALUE "InternalName", "kindred-create.exe" + VALUE "LegalCopyright", "Copyright (C) 2025 Kindred Systems LLC" + VALUE "OriginalFilename", "kindred-create.exe" + VALUE "ProductName", "Kindred Create" VALUE "ProductVersion", "${PACKAGE_VERSION}${PACKAGE_VERSION_SUFFIX}" END END diff --git a/src/Main/freecadCmd.rc.cmake b/src/Main/freecadCmd.rc.cmake index bc0d408d73..c62d2cdea7 100644 --- a/src/Main/freecadCmd.rc.cmake +++ b/src/Main/freecadCmd.rc.cmake @@ -11,7 +11,7 @@ // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon.ico" -// File info for the FreeCADCmd.exe +// File info for the kindred-create-cmd.exe // 1 VERSIONINFO FILEVERSION ${PACKAGE_VERSION_MAJOR},${PACKAGE_VERSION_MINOR},${PACKAGE_VERSION_PATCH},${PACKAGE_BUILD_VERSION} @@ -20,12 +20,12 @@ BEGIN BEGIN BLOCK "040904b0" // 409 stands for US English BEGIN - VALUE "CompanyName", "${PROJECT_NAME} Team" - VALUE "FileDescription", "${PROJECT_NAME} command line executable" - VALUE "InternalName", "FreeCADCmd.exe" - VALUE "LegalCopyright", "Copyright (C) 2022" - VALUE "OriginalFilename", "FreeCADCmd.exe" - VALUE "ProductName", "${PROJECT_NAME}" + VALUE "CompanyName", "Kindred Systems LLC" + VALUE "FileDescription", "Kindred Create command line executable" + VALUE "InternalName", "kindred-create-cmd.exe" + VALUE "LegalCopyright", "Copyright (C) 2025 Kindred Systems LLC" + VALUE "OriginalFilename", "kindred-create-cmd.exe" + VALUE "ProductName", "Kindred Create" VALUE "ProductVersion", "${PACKAGE_VERSION}${PACKAGE_VERSION_SUFFIX}" END END diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index 6121457e31..859859cecf 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -165,9 +165,8 @@ int AssemblyObject::solve(bool enableRedo, bool updateJCS) jointParts(joints); - if (enableRedo) { - savePlacementsForUndo(); - } + // Always save placements to enable orientation flip detection + savePlacementsForUndo(); try { mbdAssembly->runPreDrag(); @@ -186,8 +185,22 @@ int AssemblyObject::solve(bool enableRedo, bool updateJCS) return -1; } + // Validate that the solve didn't cause any parts to flip orientation + if (!validateNewPlacements()) { + // Restore previous placements - the solve found an invalid configuration + undoSolve(); + lastSolverStatus = -2; + updateSolveStatus(); + return -2; + } + setNewPlacements(); + // Clear undo history if the caller didn't want redo capability + if (!enableRedo) { + clearUndo(); + } + redrawJointPlacements(joints); updateSolveStatus(); @@ -480,8 +493,56 @@ bool AssemblyObject::validateNewPlacements() } } - // TODO: We could do further tests - // For example check if the joints connectors are correctly aligned. + // Check if any part has flipped orientation (rotation > 90 degrees from original) + // This prevents joints from "breaking" when the solver finds an alternate configuration + for (const auto& savedPair : previousPositions) { + App::DocumentObject* obj = savedPair.first; + if (!obj) { + continue; + } + + auto it = objectPartMap.find(obj); + if (it == objectPartMap.end()) { + continue; + } + + std::shared_ptr mbdPart = it->second.part; + if (!mbdPart) { + continue; + } + + Base::Placement newPlacement = getMbdPlacement(mbdPart); + if (!it->second.offsetPlc.isIdentity()) { + newPlacement = newPlacement * it->second.offsetPlc; + } + + const Base::Placement& oldPlc = savedPair.second; + + // Calculate the rotation difference between old and new orientations + Base::Rotation oldRot = oldPlc.getRotation(); + Base::Rotation newRot = newPlacement.getRotation(); + + // Get the relative rotation: how much did the part rotate? + Base::Rotation relativeRot = newRot * oldRot.inverse(); + + // Get the angle of this rotation + Base::Vector3d axis; + double angle; + relativeRot.getRawValue(axis, angle); + + // If the part rotated more than 90 degrees, consider it a flip + // Use 91 degrees to allow for small numerical errors + constexpr double maxAngle = 91.0 * M_PI / 180.0; + if (std::abs(angle) > maxAngle) { + Base::Console().warning( + "Assembly : Ignoring bad solve, part (%s) flipped orientation (%.1f degrees).\n", + obj->getFullLabel(), + std::abs(angle) * 180.0 / M_PI + ); + return false; + } + } + return true; } diff --git a/tests/assytest.20260126-040101.FCBak b/tests/assytest.20260126-040101.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..7d6bc0404fa240129e3fa2787da7b87e4cf74f49 GIT binary patch literal 32511 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 literal 0 HcmV?d00001 diff --git a/tests/assytest.FCStd b/tests/assytest.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..204b7f24b5acc4040ff285f2ef3eb056a3278d3b GIT binary patch literal 37880 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 P(ADMR;m7;?ru%;ZkJWT% literal 0 HcmV?d00001 diff --git a/tests/assytestpart.FCStd b/tests/assytestpart.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..a51de66e301832abf1091e0ae364c96e87c182c5 GIT binary patch literal 15561 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 T4