Moved out boost limits content from boost box.
This commit is contained in:
parent
d7e57e42d8
commit
d82c422ea1
|
@ -48,25 +48,6 @@ void BoostBox(
|
||||||
|
|
||||||
const auto full = !data.boost.nextLevelBoosts;
|
const auto full = !data.boost.nextLevelBoosts;
|
||||||
|
|
||||||
if (data.boost.mine && data.boost.boosts > 0) {
|
|
||||||
--data.boost.boosts;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
data.boost.nextLevelBoosts = data.boost.boosts
|
|
||||||
+ (data.boost.mine ? 1 : 0);
|
|
||||||
data.boost.thisLevelBoosts = 0;
|
|
||||||
if (data.boost.level > 0) {
|
|
||||||
--data.boost.level;
|
|
||||||
}
|
|
||||||
} else if (data.boost.mine
|
|
||||||
&& data.boost.level > 0
|
|
||||||
&& data.boost.boosts < data.boost.thisLevelBoosts) {
|
|
||||||
--data.boost.level;
|
|
||||||
data.boost.nextLevelBoosts = data.boost.thisLevelBoosts;
|
|
||||||
data.boost.thisLevelBoosts = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
rpl::variable<bool> you = false;
|
rpl::variable<bool> you = false;
|
||||||
bool submitted = false;
|
bool submitted = false;
|
||||||
|
@ -74,98 +55,14 @@ void BoostBox(
|
||||||
const auto state = box->lifetime().make_state<State>(State{
|
const auto state = box->lifetime().make_state<State>(State{
|
||||||
.you = data.boost.mine,
|
.you = data.boost.mine,
|
||||||
});
|
});
|
||||||
box->addTopButton(st::boxTitleClose, [=] {
|
|
||||||
box->closeBox();
|
|
||||||
});
|
|
||||||
|
|
||||||
const auto addSkip = [&](int skip) {
|
FillBoostLimit(
|
||||||
box->addRow(object_ptr<Ui::FixedHeightWidget>(box, skip));
|
|
||||||
};
|
|
||||||
|
|
||||||
addSkip(st::boostSkipTop);
|
|
||||||
|
|
||||||
const auto levelWidth = [&](int add) {
|
|
||||||
return st::normalFont->width(
|
|
||||||
tr::lng_boost_level(tr::now, lt_count, data.boost.level + add));
|
|
||||||
};
|
|
||||||
const auto paddings = 2 * st::premiumLineTextSkip;
|
|
||||||
const auto labelLeftWidth = paddings + levelWidth(0);
|
|
||||||
const auto labelRightWidth = paddings + levelWidth(1);
|
|
||||||
const auto ratio = [=](int boosts) {
|
|
||||||
const auto min = std::min(
|
|
||||||
data.boost.boosts,
|
|
||||||
data.boost.thisLevelBoosts);
|
|
||||||
const auto max = std::max({
|
|
||||||
data.boost.boosts,
|
|
||||||
data.boost.nextLevelBoosts,
|
|
||||||
1,
|
|
||||||
});
|
|
||||||
Assert(boosts >= min && boosts <= max);
|
|
||||||
const auto count = (max - min);
|
|
||||||
const auto index = (boosts - min);
|
|
||||||
if (!index) {
|
|
||||||
return 0.;
|
|
||||||
} else if (index == count) {
|
|
||||||
return 1.;
|
|
||||||
} else if (count == 2) {
|
|
||||||
return 0.5;
|
|
||||||
}
|
|
||||||
const auto available = st::boxWideWidth
|
|
||||||
- st::boxPadding.left()
|
|
||||||
- st::boxPadding.right();
|
|
||||||
const auto average = available / float64(count);
|
|
||||||
const auto first = std::max(average, labelLeftWidth * 1.);
|
|
||||||
const auto last = std::max(average, labelRightWidth * 1.);
|
|
||||||
const auto other = (available - first - last) / (count - 2);
|
|
||||||
return (first + (index - 1) * other) / available;
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto min = std::min(
|
|
||||||
data.boost.boosts,
|
|
||||||
data.boost.thisLevelBoosts);
|
|
||||||
const auto now = data.boost.boosts;
|
|
||||||
const auto max = (data.boost.nextLevelBoosts > min)
|
|
||||||
? (data.boost.nextLevelBoosts)
|
|
||||||
: (data.boost.boosts > 0)
|
|
||||||
? data.boost.boosts
|
|
||||||
: 1;
|
|
||||||
auto bubbleRowState = state->you.value(
|
|
||||||
) | rpl::map([=](bool mine) {
|
|
||||||
const auto index = mine ? (now + 1) : now;
|
|
||||||
return Premium::BubbleRowState{
|
|
||||||
.counter = index,
|
|
||||||
.ratio = ratio(index),
|
|
||||||
.dynamic = true,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
Premium::AddBubbleRow(
|
|
||||||
box->verticalLayout(),
|
|
||||||
st::boostBubble,
|
|
||||||
BoxShowFinishes(box),
|
BoxShowFinishes(box),
|
||||||
rpl::duplicate(bubbleRowState),
|
state->you.value(),
|
||||||
max,
|
|
||||||
true,
|
|
||||||
nullptr,
|
|
||||||
&st::premiumIconBoost);
|
|
||||||
addSkip(st::premiumLineTextSkip);
|
|
||||||
|
|
||||||
const auto level = [](int level) {
|
|
||||||
return tr::lng_boost_level(tr::now, lt_count, level);
|
|
||||||
};
|
|
||||||
auto ratioValue = std::move(
|
|
||||||
bubbleRowState
|
|
||||||
) | rpl::map([](const Premium::BubbleRowState &state) {
|
|
||||||
return state.ratio;
|
|
||||||
});
|
|
||||||
Premium::AddLimitRow(
|
|
||||||
box->verticalLayout(),
|
box->verticalLayout(),
|
||||||
st::boostLimits,
|
data);
|
||||||
Premium::LimitRowLabels{
|
|
||||||
.leftLabel = level(data.boost.level),
|
box->addTopButton(st::boxTitleClose, [=] { box->closeBox(); });
|
||||||
.rightLabel = level(data.boost.level + 1),
|
|
||||||
.dynamic = true,
|
|
||||||
},
|
|
||||||
std::move(ratioValue));
|
|
||||||
|
|
||||||
const auto name = data.name;
|
const auto name = data.name;
|
||||||
auto title = state->you.value() | rpl::map([=](bool your) {
|
auto title = state->you.value() | rpl::map([=](bool your) {
|
||||||
|
@ -275,4 +172,119 @@ void BoostBox(
|
||||||
}, button->lifetime());
|
}, button->lifetime());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FillBoostLimit(
|
||||||
|
rpl::producer<> showFinished,
|
||||||
|
rpl::producer<bool> you,
|
||||||
|
not_null<VerticalLayout*> container,
|
||||||
|
BoostBoxData data) {
|
||||||
|
const auto full = !data.boost.nextLevelBoosts;
|
||||||
|
|
||||||
|
if (data.boost.mine && data.boost.boosts > 0) {
|
||||||
|
--data.boost.boosts;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
data.boost.nextLevelBoosts = data.boost.boosts
|
||||||
|
+ (data.boost.mine ? 1 : 0);
|
||||||
|
data.boost.thisLevelBoosts = 0;
|
||||||
|
if (data.boost.level > 0) {
|
||||||
|
--data.boost.level;
|
||||||
|
}
|
||||||
|
} else if (data.boost.mine
|
||||||
|
&& data.boost.level > 0
|
||||||
|
&& data.boost.boosts < data.boost.thisLevelBoosts) {
|
||||||
|
--data.boost.level;
|
||||||
|
data.boost.nextLevelBoosts = data.boost.thisLevelBoosts;
|
||||||
|
data.boost.thisLevelBoosts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto addSkip = [&](int skip) {
|
||||||
|
container->add(object_ptr<Ui::FixedHeightWidget>(container, skip));
|
||||||
|
};
|
||||||
|
|
||||||
|
addSkip(st::boostSkipTop);
|
||||||
|
|
||||||
|
const auto levelWidth = [&](int add) {
|
||||||
|
return st::normalFont->width(
|
||||||
|
tr::lng_boost_level(tr::now, lt_count, data.boost.level + add));
|
||||||
|
};
|
||||||
|
const auto paddings = 2 * st::premiumLineTextSkip;
|
||||||
|
const auto labelLeftWidth = paddings + levelWidth(0);
|
||||||
|
const auto labelRightWidth = paddings + levelWidth(1);
|
||||||
|
const auto ratio = [=](int boosts) {
|
||||||
|
const auto min = std::min(
|
||||||
|
data.boost.boosts,
|
||||||
|
data.boost.thisLevelBoosts);
|
||||||
|
const auto max = std::max({
|
||||||
|
data.boost.boosts,
|
||||||
|
data.boost.nextLevelBoosts,
|
||||||
|
1,
|
||||||
|
});
|
||||||
|
Assert(boosts >= min && boosts <= max);
|
||||||
|
const auto count = (max - min);
|
||||||
|
const auto index = (boosts - min);
|
||||||
|
if (!index) {
|
||||||
|
return 0.;
|
||||||
|
} else if (index == count) {
|
||||||
|
return 1.;
|
||||||
|
} else if (count == 2) {
|
||||||
|
return 0.5;
|
||||||
|
}
|
||||||
|
const auto available = st::boxWideWidth
|
||||||
|
- st::boxPadding.left()
|
||||||
|
- st::boxPadding.right();
|
||||||
|
const auto average = available / float64(count);
|
||||||
|
const auto first = std::max(average, labelLeftWidth * 1.);
|
||||||
|
const auto last = std::max(average, labelRightWidth * 1.);
|
||||||
|
const auto other = (available - first - last) / (count - 2);
|
||||||
|
return (first + (index - 1) * other) / available;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto min = std::min(data.boost.boosts, data.boost.thisLevelBoosts);
|
||||||
|
const auto now = data.boost.boosts;
|
||||||
|
const auto max = (data.boost.nextLevelBoosts > min)
|
||||||
|
? (data.boost.nextLevelBoosts)
|
||||||
|
: (data.boost.boosts > 0)
|
||||||
|
? data.boost.boosts
|
||||||
|
: 1;
|
||||||
|
auto bubbleRowState = (
|
||||||
|
std::move(you)
|
||||||
|
) | rpl::map([=](bool mine) {
|
||||||
|
const auto index = mine ? (now + 1) : now;
|
||||||
|
return Premium::BubbleRowState{
|
||||||
|
.counter = index,
|
||||||
|
.ratio = ratio(index),
|
||||||
|
.dynamic = true,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
Premium::AddBubbleRow(
|
||||||
|
container,
|
||||||
|
st::boostBubble,
|
||||||
|
std::move(showFinished),
|
||||||
|
rpl::duplicate(bubbleRowState),
|
||||||
|
max,
|
||||||
|
true,
|
||||||
|
nullptr,
|
||||||
|
&st::premiumIconBoost);
|
||||||
|
addSkip(st::premiumLineTextSkip);
|
||||||
|
|
||||||
|
const auto level = [](int level) {
|
||||||
|
return tr::lng_boost_level(tr::now, lt_count, level);
|
||||||
|
};
|
||||||
|
auto ratioValue = std::move(
|
||||||
|
bubbleRowState
|
||||||
|
) | rpl::map([](const Premium::BubbleRowState &state) {
|
||||||
|
return state.ratio;
|
||||||
|
});
|
||||||
|
Premium::AddLimitRow(
|
||||||
|
container,
|
||||||
|
st::boostLimits,
|
||||||
|
Premium::LimitRowLabels{
|
||||||
|
.leftLabel = level(data.boost.level),
|
||||||
|
.rightLabel = level(data.boost.level + 1),
|
||||||
|
.dynamic = true,
|
||||||
|
},
|
||||||
|
std::move(ratioValue));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
|
|
||||||
class GenericBox;
|
class GenericBox;
|
||||||
|
class VerticalLayout;
|
||||||
|
|
||||||
struct BoostCounters {
|
struct BoostCounters {
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
@ -29,4 +30,10 @@ void BoostBox(
|
||||||
BoostBoxData data,
|
BoostBoxData data,
|
||||||
Fn<void(Fn<void(bool)>)> boost);
|
Fn<void(Fn<void(bool)>)> boost);
|
||||||
|
|
||||||
|
void FillBoostLimit(
|
||||||
|
rpl::producer<> showFinished,
|
||||||
|
rpl::producer<bool> you,
|
||||||
|
not_null<VerticalLayout*> container,
|
||||||
|
BoostBoxData data);
|
||||||
|
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
Loading…
Reference in New Issue