Skip to content

[stable-33.0] Feature/ses 578 dark mode tray - #24

Closed
borisbaltesbrickmakers wants to merge 957 commits into
stable-33.0from
feature/SES-578_DarkMode_Tray
Closed

[stable-33.0] Feature/ses 578 dark mode tray#24
borisbaltesbrickmakers wants to merge 957 commits into
stable-33.0from
feature/SES-578_DarkMode_Tray

Conversation

@borisbaltesbrickmakers

Copy link
Copy Markdown
Collaborator

No description provided.

chaetty and others added 30 commits July 27, 2026 14:46
to fix font color issue
@borisbaltesbrickmakers borisbaltesbrickmakers added the approved Done Changes for Customization Service. label Aug 21, 2026
@borisbaltesbrickmakers borisbaltesbrickmakers changed the title [Stable-33.0] Feature/ses 578 dark mode tray [stable-33.0] Feature/ses 578 dark mode tray Aug 21, 2026
borisbaltesbrickmakers and others added 26 commits August 21, 2026 09:02
QWindows11Style's native checkmark is too faint against the checked box.
Rather than repainting the whole indicator (losing native hover/disabled
nuance), keep the native box/border painting and just overlay a bolder
checkmark in QPalette::HighlightedText - correct against the box's actual
(system-dependent) accent color in both light and dark. Covers both plain
QCheckBox widgets (PE_IndicatorCheckBox) and tree/list-view checkboxes
like the selective-sync folder tree (PE_IndicatorItemViewItemCheck).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nch files

Ran both skills over every file changed on this branch that wasn't
already tracked. New color-map findings: black() text on dialogBackgroundColor()
in MoreOptionsButtonStyle::buttonFontColor() (buttonstyle.h:324, likely near-
unreadable in dark mode), plus repeat confirmations of already-known fixed-value
getters (menuPressedTextColor, wizardHeaderBackgroundColor, white/black,
syncProgressColor, buttonPrimaryHoverColor). New drift-map findings: real logic
changes hiding under mostly-additive styling diffs in foldercreationdialog.cpp
(dropped accept() exists-guard, renamed ui element) and ignorelisttablewidget.cpp
(slotAddPattern rebuilt), plus UserLine.qml as the most heavily rewritten file
in the map (diff exceeds the whole stable file).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
setWindowFlag(Qt::Window, true) is a no-op on a QDialog since Qt::Dialog
already includes the Qt::Window bit (Dialog = 0x2 | Window). The dialog
type never actually changes, so it keeps QDialog's default hints
(title/sysmenu/close) which lack minimize/maximize - a regression from
an earlier refactor that replaced the old windowFlags() bitmask trick
with two separate setWindowFlag() calls. Request WindowMinMaxButtonsHint
explicitly instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nav border

Settings and Tray now share the same background color scheme:

- Revert the panelBackgroundColor() card-panel styling from b9e5305
  (generalsettings.cpp/accountsettings.cpp + the getter itself in
  basetheme.h) - a reference screenshot of the target build shows a flat,
  uniform Settings background with no distinct panels, so the "matches
  stable-33.0" rationale for introducing it did not hold up.
- Add a right border to the SettingsDialog navigation sidebar
  (#settings_navigation_scroll) via the existing menuBorderColor(), since
  it no longer has its own background to separate it from the content area.

Logged in DECISIONS.md and COLOR_MAP.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…r remaining SES-578 files

Replace the round-based DRIFT_MAP.md sections with one flat table (no
history), and add the four SES-578-touched files that weren't covered
yet: systray.cpp, CMakeLists.txt, sesstyle.cpp/.h.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Qt's native "windows11" widget style (used on Windows 11 since the
OS-version-based style switch) requests rounded window corners from DWM
itself as part of matching the native Fluent look. Confirmed by forcing
Fusion as the base style and observing DWMWA_WINDOW_CORNER_PREFERENCE
drop from Round(2) back to Default(0), matching stable-33.0 (which has
no sesStyle/native-style selection at all). Explicitly request
DWMWCP_DONOTROUND instead of reverting the style choice, since that
style is also what fixed the dark-mode QTreeView branch arrows.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
customizeStyle() themed connectLabel and syncFoldersPanelTitle but
missed encryptionMessageLabel, so its text color stayed fixed while
the Settings page background switched with the theme.
…corner radius

Re-introduces the checkmark-contrast fix from the reverted 91586b5, but
this time drawing our own box fill/border too instead of leaving the native
QWindows11Style accent color in place:

- basetheme.h: new checkboxCheckmarkColor() - white in Light Mode, black in
  Dark Mode, deliberately inverted from the native contrast.
- sesstyle.cpp/.h: drawCheckboxIndicator() now paints the whole indicator
  itself (checked fill via the existing buttonPrimaryColor() - the same
  blue PushButtonStyleHelper uses, so it always matches the app's buttons
  in both modes; unchecked fill/border via dialogBackgroundColor()/
  buttonSecondaryBorderColor()) for both PE_IndicatorCheckBox and
  PE_IndicatorItemViewItemCheck (selective-sync folder tree, AccountSettings'
  folder list, the ignore list). Corner radius is approximated per OS
  (#if Q_OS_WIN/Q_OS_MACOS/else) since Qt doesn't expose the native style's
  actual radius to query.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- AccountSettings::customizeStyle(): color fileProviderPanelTitle,
  connectionSettingsPanelTitle (previously untouched, unlike the
  sibling syncFoldersPanelTitle) and selectiveSyncLabel (previously
  only colored under Q_OS_MAC)
- OwncloudAdvancedSetupPage::syncModeLabel: same Q_OS_MAC-only gap
- LinkButton: re-apply WLTheme.settingsLinkColor() on changeEvent
  instead of only once in the constructor
- sesSnackBar: track the active Error/Warning/Success state and
  re-style on changeEvent instead of freezing the color baked in
  at the last setError/Warning/Success call

Confirmed against origin/stable-33.0 that none of these have an
upstream equivalent - all fork-only additions, no merge risk.
…apshot

One-off component-context sweep over every GUI component that differs
from develop_stable-4.0 (the branch's actual fork-off base), redone
after merging feature/SES-578_DarkMode_Tray into develop_stable-33.0
and cross-checked against the pre-merge result for consistency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Point 2 of the merge consistency check said the 7 files newly appearing
in the diff were "new" - misleading, since none were newly created
(main.cpp dates back to 2011). They only newly diverged from
develop_stable-4.0 because commit 70a6a94 touched them for the first
time; verified via zero-diff immediately before that commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both LinkButton::customizeStyle() and sesSnackBar's error/warning/success
style helpers call setStyleSheet() on themselves from within changeEvent()
(reacting to StyleChange/PaletteChange/ThemeChange for reactive dark mode
support). setStyleSheet() unconditionally re-triggers that same event on
the widget, which changeEvent() turns back into another customizeStyle()/
updateStyleSheet() call - unguarded recursion that overflows the stack and
crashes (reproduced via gdb: SIGSEGV in QStringView::toDouble() while deep
in the QLabel style-repolish call chain, confirmed to originate from
LinkButton::customizeStyle() <-> changeEvent()).

Settings dialog crashed on every open because AccountSettings/GeneralSettings
etc. all contain LinkButton instances. Same fix as the already-guarded
SettingsDialog::customizeStyle(): an _updatingStyle bool + QScopedValueRollback
to make the reentrant call a no-op.

Audited every other changeEvent() handler reacting to these three event types
(FolderWizardLocalPath/RemotePath, OwncloudWizard, WebFlowCredentialsDialog,
LegalNotice) - none of them call setStyleSheet() on themselves the same way,
so no further instances of this bug were found.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
develop_stable-4.0 is unmaintained -- nothing flows back into it, ever.
"noch nicht in develop_stable-4.0 gemerged" wrongly implied a future
merge; reworded to plain divergence-since-fork-off language and added
an explicit note that the branch is dead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
sesAccountMenuHeight (40px) was too small for the two text rows (name +
server) once padding is subtracted - the label block's natural height
(~30-32px) exceeded the ~24px available, so it overflowed the row's
bottom edge with no room to breathe. Padding/margin tweaks on the row
itself couldn't fix this since there was no slack to redistribute.

- theme/Style/Style.qml: bump sesAccountMenuHeight to 52 (only consumer
  is UserLine.qml, so no other rows are affected)
- UserLine.qml: reserve 5px via Layout.bottomMargin on the server label,
  now that there's actual room for it to take effect

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The busy indicator and clear-button icon still used palette.placeholderText,
left over from the original stable code before SES-457/SES-578 migrated the
rest of this field (search icon, text, cursor, background, border) to
Style.sesSearchFieldContent. Switch both to root.placeholderColor so all
icons in the field share the same dark-mode-aware color source.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…logs

ResolveConflictsDialog.qml and FileDetailsWindow.qml are native-chrome
ApplicationWindows (unlike MainWindow.qml/FileActionsWindow.qml, which go
frameless via Systray::useNormalWindow() on a normal desktop), so Windows 11's
"windows11"/"FluentWinUI3" style rounded their corners while QWidget-backed
dialogs were already forced square via Application::eventFilter.

Deliberately not reusing that global QApplication event filter here: it
reacts to every QWindow's Show event, including the many transient popups
QtQuick Controls creates internally, and forcing native window creation via
winId() on all of those caused a serious startup hang in an earlier attempt.
Applying the fix explicitly at just these two known dialog-creation call
sites avoids that.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
passwordTextEdit is a plain QtQuick TextEdit, not a Controls item, so it has
no automatic palette binding - its text stayed at the QtQuick default black
regardless of theme, while its background/border already used Style.ses*
colors. Add the same color: Style.sesTrayFontColor already used by the
sibling noteTextArea field in this dialog.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tion guard

settingsdialog.cpp: IONOS_BUILD is unconditionally defined in this fork
(see IONOS.cmake), so the #else branches of customizeStyle() and
TOOLBAR_CSS were dead code -- a full duplicate customizeStyle() using
plain palette() colors (including the card-panel backgrounds already
reverted per the 2026-08-21 decision-log entry) that never compiled.
Dropped both dead branches, kept the WLTheme-driven live versions
unconditional.

foldercreationdialog.cpp: restore the QDir(fullPath).exists() guard in
accept() that was dropped during the snackbar styling rework, updated
to reference ui->errorSnackbar instead of the removed labelErrorMessage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
SesCheckBox only re-themed the text label (color: Style.sesTrayFontColor);
the indicator (box/checkmark) was left to the QtQuick Controls style, which
on Windows 11 is FluentWinUI3 and draws it with native Fluent colors rather
than the SES palette used by the rest of this dialog (password/note field
borders etc.).

Add a custom indicator matching that existing look (Style.sesTrayInputField
border, Style.sesBackgroundColor fill, radius via Style.thickBorderWidth).
Deliberately does not set x/y on the indicator - CheckBox/AbstractButton
already positions it automatically based on padding/leftPadding, and an
earlier attempt that set explicit x/y fought that positioning and produced
visibly inconsistent offsets across the several SesCheckBox instances in
this file (which each set their own padding/spacing/indicator size).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Done Changes for Customization Service.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants