| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2350,6 +2350,81 @@ bool State::ungroupGroupedMediaBlock(const BlockPath &path) { | |||
| 2350 | 2350 | }); | |
| 2351 | 2351 | } | |
| 2352 | 2352 | ||
| 2353 | + bool State::canUngroupGroupedMediaBlocks( | ||
| 2354 | + const PreparedEditSelection &selection) const { | ||
| 2355 | + if (selection.kind != PreparedEditSelectionKind::Blocks) { | ||
| 2356 | + return false; | ||
| 2357 | + } | ||
| 2358 | + const auto range = validateBlockRange(selection.blocks); | ||
| 2359 | + if (!range) { | ||
| 2360 | + return false; | ||
| 2361 | + } | ||
| 2362 | + const auto blocks = blockContainer(range->container); | ||
| 2363 | + if (!blocks) { | ||
| 2364 | + return false; | ||
| 2365 | + } | ||
| 2366 | + for (auto i = range->from; i != range->till; ++i) { | ||
| 2367 | + const auto &block = (*blocks)[i]; | ||
| 2368 | + if (block.kind == BlockKind::GroupedMedia | ||
| 2369 | + && IsGroupableMediaBlock(block)) { | ||
| 2370 | + return true; | ||
| 2371 | + } | ||
| 2372 | + } | ||
| 2373 | + return false; | ||
| 2374 | + } | ||
| 2375 | + | ||
| 2376 | + bool State::ungroupGroupedMediaBlocks( | ||
| 2377 | + const PreparedEditSelection &selection) { | ||
| 2378 | + return applyCheckedMutation(false, [selection](State &candidate) { | ||
| 2379 | + if (!candidate.canUngroupGroupedMediaBlocks(selection)) { | ||
| 2380 | + return CheckedMutationResult<bool>{ .result = false }; | ||
| 2381 | + } | ||
| 2382 | + const auto range = candidate.validateBlockRange(selection.blocks); | ||
| 2383 | + if (!range) { | ||
| 2384 | + return CheckedMutationResult<bool>{ .result = false }; | ||
| 2385 | + } | ||
| 2386 | + auto *blocks = candidate.blockContainer(range->container); | ||
| 2387 | + if (!blocks) { | ||
| 2388 | + return CheckedMutationResult<bool>{ .result = false }; | ||
| 2389 | + } | ||
| 2390 | + auto replacement = std::vector<Block>(); | ||
| 2391 | + replacement.reserve(range->till - range->from); | ||
| 2392 | + for (auto i = range->from; i != range->till; ++i) { | ||
| 2393 | + auto &block = (*blocks)[i]; | ||
| 2394 | + if (block.kind != BlockKind::GroupedMedia | ||
| 2395 | + || !IsGroupableMediaBlock(block)) { | ||
| 2396 | + replacement.push_back(std::move(block)); | ||
| 2397 | + continue; | ||
| 2398 | + } | ||
| 2399 | + auto first = true; | ||
| 2400 | + for (const auto &item : block.mediaItems) { | ||
| 2401 | + auto single = PhotoVideoBlockFromGroupedItem(item); | ||
| 2402 | + if (!single) { | ||
| 2403 | + return CheckedMutationResult<bool>{ .result = false }; | ||
| 2404 | + } | ||
| 2405 | + if (first) { | ||
| 2406 | + single->caption = std::move(block.caption); | ||
| 2407 | + single->anchorId = std::move(block.anchorId); | ||
| 2408 | + first = false; | ||
| 2409 | + } | ||
| 2410 | + replacement.push_back(std::move(*single)); | ||
| 2411 | + } | ||
| 2412 | + } | ||
| 2413 | + blocks->erase( | ||
| 2414 | + blocks->begin() + range->from, | ||
| 2415 | + blocks->begin() + range->till); | ||
| 2416 | + blocks->insert( | ||
| 2417 | + blocks->begin() + range->from, | ||
| 2418 | + std::make_move_iterator(replacement.begin()), | ||
| 2419 | + std::make_move_iterator(replacement.end())); | ||
| 2420 | + candidate.rebuild(); | ||
| 2421 | + return CheckedMutationResult<bool>{ | ||
| 2422 | + .apply = true, | ||
| 2423 | + .result = true, | ||
| 2424 | + }; | ||
| 2425 | + }); | ||
| 2426 | + } | ||
| 2427 | + | ||
| 2353 | 2428 | bool State::removeGroupedItem( | |
| 2354 | 2429 | const BlockPath &path, | |
| 2355 | 2430 | int itemIndex) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -540,6 +540,10 @@ class State final { | |||
| 540 | 540 | const Markdown::PreparedEditSelection &selection, | |
| 541 | 541 | RichPage::GroupedMediaIntent intent); | |
| 542 | 542 | [[nodiscard]] bool ungroupGroupedMediaBlock(const BlockPath &path); | |
| 543 | + [[nodiscard]] bool canUngroupGroupedMediaBlocks( | ||
| 544 | + const Markdown::PreparedEditSelection &selection) const; | ||
| 545 | + [[nodiscard]] bool ungroupGroupedMediaBlocks( | ||
| 546 | + const Markdown::PreparedEditSelection &selection); | ||
| 543 | 547 | [[nodiscard]] bool removeGroupedItem( | |
| 544 | 548 | const BlockPath &path, | |
| 545 | 549 | int itemIndex); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6597,6 +6597,16 @@ void Widget::showStructuralPhotoVideoMenu(QPoint globalPos) { | |||
| 6597 | 6597 | }); | |
| 6598 | 6598 | }, | |
| 6599 | 6599 | &st::menuIconPhotoSet); | |
| 6600 | + if (_state->canUngroupGroupedMediaBlocks(selection)) { | ||
| 6601 | + menu->addAction( | ||
| 6602 | + tr::lng_article_media_ungroup(tr::now), | ||
| 6603 | + [=] { | ||
| 6604 | + [[maybe_unused]] const auto changed = applyMediaBlockChange([=] { | ||
| 6605 | + return _state->ungroupGroupedMediaBlocks(selection); | ||
| 6606 | + }); | ||
| 6607 | + }, | ||
| 6608 | + &st::menuIconExpand); | ||
| 6609 | + } | ||
| 6600 | 6610 | Ui::Menu::CreateAddActionCallback(menu)({ | |
| 6601 | 6611 | .text = tr::lng_box_remove(tr::now), | |
| 6602 | 6612 | .handler = [=] { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments