ensureQpcV4AllPagesPrebuilt method

Future<void> ensureQpcV4AllPagesPrebuilt()

يبني كل صفحات QPC v4 مرة واحدة لتجنّب التقطيع أثناء التقليب.

ملاحظة: التنفيذ يتم على دفعات مع yield لتفادي تجميد واجهة المستخدم.

Implementation

Future<void> ensureQpcV4AllPagesPrebuilt() async {
  if (!isQpcV4Enabled) return;
  await _ensureQpcV4AssetsLoaded();
  final renderer = _qpcV4PageRenderer;
  if (renderer == null) return;

  // لا تعِد البناء إن تم البدء/الاكتمال.
  if (_qpcV4PrebuildAllFuture != null) {
    await _qpcV4PrebuildAllFuture;
    return;
  }

  _qpcV4PrebuildAllFuture = () async {
    if (_qpcV4BlocksByPage.length >= 604) return;
    _qpcV4PrebuildStarted = true;

    // نبني بزمن-ميزانية صغيرة مع تأخير بسيط لتقليل منافسة الـ UI أثناء الاستخدام.
    const totalPages = 604;
    const timeBudgetMs = 3;
    final sw = Stopwatch()..start();

    for (var page = 1; page <= totalPages; page++) {
      if (!isQpcV4Enabled) break;
      if (_qpcV4BlocksByPage.containsKey(page)) continue;
      _qpcV4BlocksByPage[page] = renderer.buildPage(pageNumber: page);

      if (sw.elapsedMilliseconds >= timeBudgetMs) {
        // yield إلى event loop (مع تأخير بسيط) حتى لا ننافس الرسم/الـ gestures.
        await Future<void>.delayed(const Duration(milliseconds: 4));
        sw
          ..reset()
          ..start();
      }
    }

    // لا حاجة لـ update() هنا: الصفحات المعروضة تمت تغذيتها بالفعل عبر prewarmQpcV4Pages.
    // الصفحات البعيدة ستحصل على البيانات عند التقليب إليها.
  }();

  await _qpcV4PrebuildAllFuture;
}