11 #include <QHeaderView> 16 #include <xmlsettingsdialog/basesettingsmanager.h> 22 QList<int> RedistributeWidths (
int totalWidth,
const Widths& widths)
24 const int occupiedWidth = std::accumulate (widths.begin (), widths.end (), 0,
25 [] (
auto acc,
auto elem) {
return acc + elem.value_or (0); });
26 const int missingCount =
std::count (widths.begin (), widths.end (), std::nullopt);
28 const auto widthPerMissing = missingCount ?
29 std::max (1, (totalWidth - occupiedWidth) / missingCount) :
33 result.reserve (widths.size ());
34 for (
const auto& w : widths)
35 result << w.value_or (widthPerMissing);
39 QList<int> RedistributeWidths (
int totalWidth,
const Factors& factors)
41 const auto totalFactors = std::accumulate (factors.begin (), factors.end (), 0);
44 result.reserve (factors.size ());
45 for (
auto size : factors)
46 result << size * totalWidth / totalFactors;
52 return Visit (initial, [&] (
const auto& value) {
return RedistributeWidths (totalWidth, value); });
55 QList<int> FromVariantList (
const QVariantList& list)
58 result.reserve (list.size ());
59 for (
const auto& var : list)
62 result << var.toInt (&ok);
69 QVariantList ToVariantList (
const QList<int>& list)
72 result.reserve (list.size ());
79 auto SingleRun (F&&
f)
81 return [
f = std::forward<F> (
f)] (QEvent*, QObject& pThis)
mutable 83 std::invoke (std::forward<F> (
f));
90 void OnResize (QWidget& widget, F&&
f)
92 widget.installEventFilter (MakeLambdaEventFilter<QEvent::Resize> (SingleRun (std::move (
f)), widget));
101 auto widths = FromVariantList (params.
XSM_.Property (params.
Id_, {}).value<QVariantList> ());
102 if (widths.isEmpty ())
103 widths = RedistributeWidths (splitter.width (), params.
Initial_);
104 splitter.setSizes (widths);
108 QObject::connect (&splitter,
109 &QSplitter::splitterMoved,
111 [&xsm = params.
XSM_,
id = params.
Id_, &splitter]
113 xsm.setProperty (id.c_str (), ToVariantList (splitter.sizes ()));
122 const auto state = params.
XSM_.Property (params.
Id_, QByteArray {}).toByteArray ();
123 if (state.isEmpty () || !header.restoreState (state))
125 const auto scrollWidth = header.style ()->pixelMetric (QStyle::PM_ScrollBarExtent);
126 const auto slack = 10;
127 const auto totalWidth = header.width () - scrollWidth - slack;
128 const auto& widths = RedistributeWidths (totalWidth, params.
Initial_);
129 for (
int i = 0; i < widths.size (); ++i)
130 header.resizeSection (i, widths.at (i));
135 const auto saver =
Throttled (5s, &header,
136 [&xsm = params.
XSM_,
id = params.
Id_, &header] { xsm.setProperty (id.c_str (), header.saveState ()); });
137 QObject::connect (&header,
138 &QHeaderView::sectionMoved,
140 QObject::connect (&header,
141 &QHeaderView::sectionResized,
constexpr detail::AggregateType< detail::AggregateFunction::Count, Ptr > count
void SetupStateSaver(QSplitter &splitter, const StateSaverParams ¶ms)
constexpr detail::AggregateType< detail::AggregateFunction::Max, Ptr > max
BaseSettingsManager & XSM_
std::variant< Widths, Factors > InitialDistr
auto Visit(const Either< Left, Right > &either, Args &&... args)
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
auto Throttled(std::chrono::milliseconds ms, QObject *parent, F &&f)