feat: responsive compact mail view + folder unread badges

- CompactMailDelegate: card-based view for narrow panels (<420px)
  * Avatar with hash-based color, sender + date (relative format)
  * Subject line with attachment icon
  * Action buttons: flag, delete, category, more (context menu)
  * Unread highlight with light blue background + bold sender
- MailListView: automatic switch between tree/table (wide) and list/cards (narrow)
  * QStackedWidget with QTreeView + QListView sharing same proxy model
  * resizeEvent threshold at 420px
  * Signals forwarded to MainMainWindow for actions
- FolderTreeDelegate: custom paint for folder tree
  * Unread count badge (blue pill) right-aligned on folder nodes
  * Account nodes bold, folder nodes normal weight
  * Proper indentation per depth level
- MailItemDao::countUnreadByFolderId() for real-time unread counts
- MainMainWindow handlers for compact actions (flag, delete, category, more menu)
This commit is contained in:
2026-08-24 23:25:13 +02:00
parent 705fe32e66
commit 4c4fec7a0a
846 changed files with 498002 additions and 52534 deletions
@@ -0,0 +1,12 @@
# Generated by Boost 1.90.0
set(PACKAGE_VERSION 1.90.0)
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
@@ -0,0 +1,115 @@
# Generated by Boost 1.90.0
if(TARGET Boost::regex)
return()
endif()
if(Boost_VERBOSE OR Boost_DEBUG)
message(STATUS "Found boost_regex ${boost_regex_VERSION} at ${boost_regex_DIR}")
endif()
mark_as_advanced(boost_regex_DIR)
# Compute the include and library directories relative to this file.
get_filename_component(_BOOST_CMAKEDIR "${CMAKE_CURRENT_LIST_DIR}/../" REALPATH)
# If the computed and the original directories are symlink-equivalent, use original
if(EXISTS "/build/boost1.90-Jxx13U/boost1.90-1.90.0/debian/tmp/usr/lib/x86_64-linux-gnu/cmake")
get_filename_component(_BOOST_CMAKEDIR_ORIGINAL "/build/boost1.90-Jxx13U/boost1.90-1.90.0/debian/tmp/usr/lib/x86_64-linux-gnu/cmake" REALPATH)
if(_BOOST_CMAKEDIR STREQUAL _BOOST_CMAKEDIR_ORIGINAL)
set(_BOOST_CMAKEDIR "/build/boost1.90-Jxx13U/boost1.90-1.90.0/debian/tmp/usr/lib/x86_64-linux-gnu/cmake")
endif()
unset(_BOOST_CMAKEDIR_ORIGINAL)
endif()
get_filename_component(_BOOST_INCLUDEDIR "${_BOOST_CMAKEDIR}/../../../include/" ABSOLUTE)
get_filename_component(_BOOST_LIBDIR "${_BOOST_CMAKEDIR}/../" ABSOLUTE)
include(${CMAKE_CURRENT_LIST_DIR}/../BoostDetectToolset-1.90.0.cmake)
if(Boost_DEBUG)
message(STATUS "Scanning ${CMAKE_CURRENT_LIST_DIR}/libboost_regex-variant*.cmake")
endif()
file(GLOB __boost_variants "${CMAKE_CURRENT_LIST_DIR}/libboost_regex-variant*.cmake")
macro(_BOOST_SKIPPED fname reason)
if(Boost_VERBOSE OR Boost_DEBUG)
message(STATUS " [ ] ${fname}")
endif()
list(APPEND __boost_skipped "${fname} (${reason})")
endmacro()
list(LENGTH __boost_variants _BOOST_SINGLE_VARIANT)
if(NOT _BOOST_SINGLE_VARIANT EQUAL 1)
set(_BOOST_SINGLE_VARIANT 0)
endif()
foreach(f IN LISTS __boost_variants)
if(Boost_DEBUG)
message(STATUS " Including ${f}")
endif()
include(${f})
endforeach()
unset(_BOOST_SINGLE_VARIANT)
unset(_BOOST_LIBDIR)
unset(_BOOST_INCLUDEDIR)
unset(_BOOST_CMAKEDIR)
if(NOT __boost_variants AND (Boost_VERBOSE OR Boost_DEBUG))
message(STATUS " Library has no variants and is considered not found")
endif()
if(NOT TARGET Boost::regex)
set(__boost_message "No suitable build variant has been found.")
if(__boost_skipped)
set(__boost_message "${__boost_message}\nThe following variants have been tried and rejected:")
foreach(s IN LISTS __boost_skipped)
set(__boost_message "${__boost_message}\n* ${s}")
endforeach()
endif()
set(boost_regex_FOUND 0)
set(boost_regex_NOT_FOUND_MESSAGE ${__boost_message})
unset(__boost_message)
unset(__boost_skipped)
unset(__boost_variants)
unset(_BOOST_REGEX_DEPS)
return()
endif()
unset(__boost_skipped)
unset(__boost_variants)
if(_BOOST_REGEX_DEPS)
list(REMOVE_DUPLICATES _BOOST_REGEX_DEPS)
if(Boost_VERBOSE OR Boost_DEBUG)
message(STATUS "Adding boost_regex dependencies: ${_BOOST_REGEX_DEPS}")
endif()
endif()
foreach(dep_boost_regex IN LISTS _BOOST_REGEX_DEPS)
set(_BOOST_QUIET)
if(boost_regex_FIND_QUIETLY)
set(_BOOST_QUIET QUIET)
endif()
set(_BOOST_REQUIRED)
if(boost_regex_FIND_REQUIRED)
set(_BOOST_REQUIRED REQUIRED)
endif()
get_filename_component(_BOOST_CMAKEDIR "${CMAKE_CURRENT_LIST_DIR}/../" ABSOLUTE)
find_package(boost_${dep_boost_regex} 1.90.0 EXACT CONFIG ${_BOOST_REQUIRED} ${_BOOST_QUIET} HINTS ${_BOOST_CMAKEDIR})
set_property(TARGET Boost::regex APPEND PROPERTY INTERFACE_LINK_LIBRARIES Boost::${dep_boost_regex})
unset(_BOOST_QUIET)
unset(_BOOST_REQUIRED)
unset(_BOOST_CMAKEDIR)
if(NOT boost_${dep_boost_regex}_FOUND)
set(boost_regex_FOUND 0)
set(boost_regex_NOT_FOUND_MESSAGE "A required dependency, boost_${dep_boost_regex}, has not been found.")
unset(_BOOST_REGEX_DEPS)
return()
endif()
endforeach()
unset(_BOOST_REGEX_DEPS)
@@ -0,0 +1,90 @@
# Generated by Boost 1.90.0
# address-model=64
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "64 bit, need 32")
return()
endif()
# layout=system
# toolset=gcc15
# link=shared
if(DEFINED Boost_USE_STATIC_LIBS)
if(Boost_USE_STATIC_LIBS)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "shared, Boost_USE_STATIC_LIBS=${Boost_USE_STATIC_LIBS}")
return()
endif()
else()
if(WIN32 AND NOT _BOOST_SINGLE_VARIANT)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "shared, default on Windows is static, set Boost_USE_STATIC_LIBS=OFF to override")
return()
endif()
endif()
# runtime-link=shared
if(Boost_USE_STATIC_RUNTIME)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "shared runtime, Boost_USE_STATIC_RUNTIME=${Boost_USE_STATIC_RUNTIME}")
return()
endif()
# runtime-debugging=off
if(Boost_USE_DEBUG_RUNTIME)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "release runtime, Boost_USE_DEBUG_RUNTIME=${Boost_USE_DEBUG_RUNTIME}")
return()
endif()
# threading=multi
# variant=release
if(NOT "${Boost_USE_RELEASE_LIBS}" STREQUAL "" AND NOT Boost_USE_RELEASE_LIBS)
_BOOST_SKIPPED("libboost_regex.so.1.90.0" "release, Boost_USE_RELEASE_LIBS=${Boost_USE_RELEASE_LIBS}")
return()
endif()
if(Boost_VERBOSE OR Boost_DEBUG)
message(STATUS " [x] libboost_regex.so.1.90.0")
endif()
# Create imported target Boost::regex
if(NOT TARGET Boost::regex)
add_library(Boost::regex SHARED IMPORTED)
set_target_properties(Boost::regex PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_BOOST_INCLUDEDIR}"
INTERFACE_COMPILE_DEFINITIONS "BOOST_REGEX_NO_LIB"
)
endif()
# Target file name: libboost_regex.so.1.90.0
get_target_property(__boost_imploc Boost::regex IMPORTED_LOCATION_RELEASE)
if(__boost_imploc)
message(SEND_ERROR "Target Boost::regex already has an imported location '${__boost_imploc}', which is being overwritten with '${_BOOST_LIBDIR}/libboost_regex.so.1.90.0'")
endif()
unset(__boost_imploc)
set_property(TARGET Boost::regex APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(Boost::regex PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE CXX
IMPORTED_LOCATION_RELEASE "${_BOOST_LIBDIR}/libboost_regex.so.1.90.0"
)
set_target_properties(Boost::regex PROPERTIES
MAP_IMPORTED_CONFIG_MINSIZEREL Release
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release
)
set_property(TARGET Boost::regex APPEND
PROPERTY INTERFACE_COMPILE_DEFINITIONS "BOOST_REGEX_DYN_LINK"
)
list(APPEND _BOOST_REGEX_DEPS headers)
@@ -0,0 +1,94 @@
# Generated by Boost 1.90.0
# address-model=64
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
_BOOST_SKIPPED("libboost_regex.a" "64 bit, need 32")
return()
endif()
# layout=system
# toolset=gcc15
# link=static
if(DEFINED Boost_USE_STATIC_LIBS)
if(NOT Boost_USE_STATIC_LIBS)
_BOOST_SKIPPED("libboost_regex.a" "static, Boost_USE_STATIC_LIBS=${Boost_USE_STATIC_LIBS}")
return()
endif()
else()
if(NOT WIN32 AND NOT _BOOST_SINGLE_VARIANT)
_BOOST_SKIPPED("libboost_regex.a" "static, default is shared, set Boost_USE_STATIC_LIBS=ON to override")
return()
endif()
endif()
# runtime-link=shared
if(Boost_USE_STATIC_RUNTIME)
_BOOST_SKIPPED("libboost_regex.a" "shared runtime, Boost_USE_STATIC_RUNTIME=${Boost_USE_STATIC_RUNTIME}")
return()
endif()
# runtime-debugging=off
if(Boost_USE_DEBUG_RUNTIME)
_BOOST_SKIPPED("libboost_regex.a" "release runtime, Boost_USE_DEBUG_RUNTIME=${Boost_USE_DEBUG_RUNTIME}")
return()
endif()
# threading=multi
# variant=release
if(NOT "${Boost_USE_RELEASE_LIBS}" STREQUAL "" AND NOT Boost_USE_RELEASE_LIBS)
_BOOST_SKIPPED("libboost_regex.a" "release, Boost_USE_RELEASE_LIBS=${Boost_USE_RELEASE_LIBS}")
return()
endif()
if(Boost_VERBOSE OR Boost_DEBUG)
message(STATUS " [x] libboost_regex.a")
endif()
# Create imported target Boost::regex
if(NOT TARGET Boost::regex)
add_library(Boost::regex STATIC IMPORTED)
set_target_properties(Boost::regex PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_BOOST_INCLUDEDIR}"
INTERFACE_COMPILE_DEFINITIONS "BOOST_REGEX_NO_LIB"
)
endif()
# Target file name: libboost_regex.a
get_target_property(__boost_imploc Boost::regex IMPORTED_LOCATION_RELEASE)
if(__boost_imploc)
message(SEND_ERROR "Target Boost::regex already has an imported location '${__boost_imploc}', which is being overwritten with '${_BOOST_LIBDIR}/libboost_regex.a'")
endif()
unset(__boost_imploc)
set_property(TARGET Boost::regex APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(Boost::regex PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE CXX
IMPORTED_LOCATION_RELEASE "${_BOOST_LIBDIR}/libboost_regex.a"
)
set_target_properties(Boost::regex PROPERTIES
MAP_IMPORTED_CONFIG_MINSIZEREL Release
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release
)
list(APPEND _BOOST_REGEX_DEPS headers)
if(CMAKE_CONFIGURATION_TYPES)
set_property(TARGET Boost::regex APPEND PROPERTY INTERFACE_LINK_LIBRARIES
"$<$<CONFIG:release>:icudata;icui18n;icuuc>")
else()
set_property(TARGET Boost::regex APPEND PROPERTY INTERFACE_LINK_LIBRARIES
icudata icui18n icuuc)
endif()