Beispiel #1
0
        public void _onTapDown(TapDownDetails details)
        {
            setState(() => {
                _childHidden = true;
            });
            Rect childRect = CupertinoContextMenuUtils._getRect(_childGlobalKey);

            _decoyChildEndRect = CupertinoContextMenuUtils.fromCenter(
                center: childRect.center,
                width: childRect.width * CupertinoContextMenuUtils._kOpenScale,
                height: childRect.height * CupertinoContextMenuUtils._kOpenScale
                );
            _lastOverlayEntry = new OverlayEntry(
                opaque: false,
                builder: (BuildContext context) => {
                return(new _DecoyChild(
                           beginRect: childRect,
                           child: widget.child,
                           controller: _openController,
                           endRect: _decoyChildEndRect
                           ));
            }
                );
            Overlay.of(context).insert(_lastOverlayEntry);
            _openController.forward();
        }
Beispiel #2
0
 public static void createView(CustomToastItem toastItem)
 {
     _overlayState = Overlay.of(context: toastItem.context);
     _overlayEntry = new OverlayEntry(
         _context => new CustomToastWidget(
             gravity: toastItem.gravity,
             new Container(
                 width: MediaQuery.of(context: _context).size.width,
                 alignment: Alignment.center,
                 child: new Container(
                     decoration: new BoxDecoration(
                         color: toastItem.backgroundColor,
                         borderRadius: BorderRadius.circular(radius: toastItem.radius)
                         ),
                     margin: EdgeInsets.symmetric(horizontal: 20),
                     padding: EdgeInsets.fromLTRB(16, 10, 16, 10),
                     child: new Text(
                         data: toastItem.message,
                         style: CTextStyle.PLargeTitle.copyWith(color: toastItem.textColor)
                         )
                     )
                 )
             )
         );
     _isVisible = true;
     _overlayState.insert(entry: _overlayEntry);
     _timer = Window.instance.run((TimeSpan)toastItem.duration, callback: dismiss);
 }
Beispiel #3
0
        public void _onDecoyAnimationStatusChange(AnimationStatus animationStatus)
        {
            switch (animationStatus)
            {
            case AnimationStatus.dismissed:
                if (_route == null)
                {
                    setState(() => {
                        _childHidden = false;
                    });
                }
                _lastOverlayEntry?.remove();
                _lastOverlayEntry = null;
                break;

            case AnimationStatus.completed:
                setState(() => {
                    _childHidden = true;
                });
                _openContextMenu();
                SchedulerBinding.instance.addPostFrameCallback((TimeSpan timestamp) => {
                    _lastOverlayEntry?.remove();
                    _lastOverlayEntry = null;
                    _openController.reset();
                });
                break;

            default:
                return;
            }
        }
Beispiel #4
0
        void _createNewEntry()
        {
            RenderBox box    = context.findRenderObject() as RenderBox;
            Offset    target = box.localToGlobal(box.size.center(Offset.zero));

            Widget overlay = new Directionality(
                textDirection: Directionality.of(context),
                child: new _TooltipOverlay(
                    message: widget.message,
                    height: height,
                    padding: padding,
                    margin: margin,
                    decoration: decoration,
                    textStyle: textStyle,
                    animation: new CurvedAnimation(
                        parent: _controller,
                        curve: Curves.fastOutSlowIn
                        ),
                    target: target,
                    verticalOffset: verticalOffset,
                    preferBelow: preferBelow
                    )
                );

            _entry = new OverlayEntry(builder: (BuildContext context) => overlay);
            Overlay.of(context, debugRequiredFor: widget).insert(_entry);
        }
Beispiel #5
0
        bool ensureTooltopVisible()
        {
            if (this._entry != null)
            {
                this._timer?.cancel();
                this._timer = null;
                this._controller.forward();
                return(false);
            }

            RenderBox box    = (RenderBox)this.context.findRenderObject();
            Offset    target = box.localToGlobal(box.size.center(Offset.zero));

            Widget overlay = new _TooltipOverlay(
                message: this.widget.message,
                height: this.widget.height,
                padding: this.widget.padding,
                animation: new CurvedAnimation(
                    parent: this._controller,
                    curve: Curves.fastOutSlowIn),
                target: target,
                verticalOffset: this.widget.verticalOffset,
                preferBelow: this.widget.preferBelow
                );

            this._entry = new OverlayEntry(builder: (BuildContext context) => overlay);
            Overlay.of(this.context, debugRequiredFor: this.widget).insert(this._entry);
            GestureBinding.instance.pointerRouter.addGlobalRoute(this._handlePointerEvent);
            this._controller.forward();
            return(true);
        }
Beispiel #6
0
        void _createTipMenu(BuildContext context, ArrowDirection arrowDirection, Offset position, Size size)
        {
            dismiss();
            float triangleY = arrowDirection == ArrowDirection.up
                ? position.dy
                : position.dy - CustomTextSelectionControlsUtils._kToolbarTriangleSize.height
                              - this._getTipMenuHeight(context: context);

            _overlayState = Overlay.of(context: context);
            _overlayEntry = new OverlayEntry(
                _context => Positioned.fill(
                    new GestureDetector(
                        onTap: dismiss,
                        child: new Container(
                            color: CColors.Transparent,
                            child: new Stack(
                                children: new List <Widget> {
                new Positioned(
                    top: triangleY,
                    left: size.width / 2.0f + position.dx - 25 * this.tipMenuItems.Count,
                    child: new _TipMenuContent(
                        tipMenuItems: this.tipMenuItems,
                        arrowDirection: arrowDirection
                        )
                    )
            }
                                )
                            )
                        )
                    )
                );
            _isVisible = true;
            _overlayState.insert(entry: _overlayEntry);
        }
Beispiel #7
0
 protected override void install(OverlayEntry insertionPoint)
 {
     this._controller = this.createAnimationController();
     D.assert(this._controller != null, () => $"{this.GetType()}.createAnimationController() returned null.");
     this._animation = this.createAnimation();
     D.assert(this._animation != null, () => $"{this.GetType()}.createAnimation() returned null.");
     base.install(insertionPoint);
 }
Beispiel #8
0
 void _removeEntry()
 {
     _hideTimer?.cancel();
     _hideTimer = null;
     _showTimer?.cancel();
     _showTimer = null;
     _entry?.remove();
     _entry = null;
 }
 protected static void MapBasePropertiesToDomainModel(OverlayEntry domain, BaseOverlayEntryJsModel zoneOverlayEntryJsModel)
 {
     if (zoneOverlayEntryJsModel.Id != null)
     {
         domain.Id = zoneOverlayEntryJsModel.Id;
     }
     domain.Name  = zoneOverlayEntryJsModel.Name;
     domain.Color = zoneOverlayEntryJsModel.Color;
 }
Beispiel #10
0
 void _removeEntry()
 {
     D.assert(this._entry != null);
     this._timer?.cancel();
     this._timer = null;
     this._entry.remove();
     this._entry = null;
     GestureBinding.instance.pointerRouter.removeGlobalRoute(this._handlePointerEvent);
 }
Beispiel #11
0
        private void RightClickFocusListener()
        {
            if (_rightClickFocus.hasFocus)
            {
            }
            else
            {
                _rightClickEntry?.remove();
                _rightClickEntry = null;
            }

            setState();
        }
 public override void initState()
 {
     base.initState();
     this._listOverlayEntry = new OverlayEntry(
         opaque: true,
         builder: (BuildContext context) => {
         return(new _ReorderableListContent(
                    header: this.widget.header,
                    children: this.widget.children,
                    scrollDirection: this.widget.scrollDirection,
                    onReorder: this.widget.onReorder,
                    padding: this.widget.padding
                    ));
     }
         );
 }
Beispiel #13
0
            public override void initState()
            {
                base.initState();
                _dropDownOverlayBuilder = ctx =>
                {
                    var overlayRenderBox = ctx.findRenderObject() as RenderBox;
                    var renderBox        = context.findRenderObject() as RenderBox;
                    switch (widget._direction)
                    {
                    case DropDownDirection.bottom:
                    {
                        var offset = renderBox.localToGlobal(
                            renderBox.size.bottomLeft(Offset.zero),
                            overlayRenderBox);
                        return(new DropDownOverlay(
                                   top: offset.dy,
                                   left: offset.dx,
                                   color: widget._overlayColor,
                                   border: widget._overlayBorder,
                                   children: widget._items.Select(item => widget._itemBuilder.Invoke(this, item)).ToList()
                                   ));
                    }

                    case DropDownDirection.top:
                    {
                        var offset = renderBox.localToGlobal(Offset.zero, overlayRenderBox);
                        return(new DropDownOverlay(
                                   left: offset.dx,
                                   bottom: overlayRenderBox.size.height - offset.dy,
                                   color: widget._overlayColor,
                                   border: widget._overlayBorder,
                                   children: widget._items.Select(item => widget._itemBuilder.Invoke(this, item)).ToList()
                                   ));
                    }

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                };
                _overlayEntry = new OverlayEntry(_dropDownOverlayBuilder);
                _expanded     = false;
            }
Beispiel #14
0
        public override void initState()
        {
            base.initState();
            SelectedChannelId = string.Empty;
            IsShowChannelInfo = false;
            IsShowDiscovery   = false;

            SchedulerBinding.instance.addPostFrameCallback(value =>
            {
                var overlayEntry = new OverlayEntry(
                    ctx => new MentionPopup(
                        widget.users,
                        widget.members,
                        widget.hasMoreMembers,
                        () => SelectedChannelId
                        )
                    );
                Overlay.of(context).insert(overlayEntry);
            });
        }
 protected static void MapBasePropertiesFromDomainModel(OverlayEntry domain, BaseOverlayEntryJsModel model)
 {
     model.Color = domain.Color;
     model.Id    = domain.Id;
     model.Name  = domain.Name;
 }
Beispiel #16
0
        public override void initState()
        {
            base.initState();
            var channel = widget.channels[widget.selectedChannelId];

            m_MuteController = new SwitchController(channel.isMute);
            m_PinController  = new SwitchController(!string.IsNullOrEmpty(channel.stickTime));
            m_Quiting        = false;
            m_AmIOwner       = widget.members.ContainsKey(channel.id) &&
                               widget.members[channel.id].Any(member =>
                                                              member.user.id == Window.currentUserId && member.role == "owner");
            m_MuteController.addListener(MuteControllerListener);
            m_PinController.addListener(PinControllerListener);
            m_AnimationController = new AnimationController(
                vsync: this,
                duration: new TimeSpan(0, 0, 0, 0, milliseconds: 240)
                );
            m_AnimationController.addListener(() => setState());
            m_AnimationController.addStatusListener(AnimationStatusListener);
            _showCopiedTip = false;

            SchedulerBinding.instance.addPostFrameCallback(value =>
            {
                if (MediaQuery.of(context).size.width < 750)
                {
                    m_AnimationController.forward();
                }

                _copiedTipEntry = new OverlayEntry(buildContext =>
                {
                    var left = 0.0f;
                    if (MediaQuery.of(buildContext).size.width >= 750)
                    {
                        left = 375;
                    }

                    return(new Positioned(
                               top: 64 + 40,
                               left: left,
                               right: 0,
                               child: new IgnorePointer(
                                   child: new Container(
                                       height: 40,
                                       alignment: Alignment.center,
                                       child: new Row(
                                           mainAxisSize: MainAxisSize.min,
                                           children: new List <Widget>
                    {
                        new AnimatedOpacity(
                            opacity: _showCopiedTip ? 1 : 0,
                            duration: new TimeSpan(0, 0, 0, 0, 240),
                            curve: Curves.fastOutSlowIn,
                            child: new Container(
                                decoration: new BoxDecoration(
                                    borderRadius: BorderRadius.circular(20),
                                    color: new Color(0x99000000)
                                    ),
                                padding: EdgeInsets.symmetric(horizontal: 24),
                                alignment: Alignment.center,
                                child: new Text(
                                    "已复制群聊链接,请前往粘贴分享",
                                    style: new TextStyle(
                                        fontSize: 16,
                                        color: new Color(0xffffffff),
                                        fontFamily: "PingFang"
                                        )
                                    )
                                )
                            ),
                    }
                                           )
                                       )
                                   )
                               ));
                });
                Overlay.of(context).insert(_copiedTipEntry);
            });
        }
Beispiel #17
0
        public Z64Rom(Rom rom)
        {
            _rom = rom;

            var identity   = (UInt64)_rom.Header.Crc[0] << 32 | _rom.Header.Crc[1];
            var useOffsets = true;

            if (!_tableOffsets.ContainsKey(identity))
            {
                useOffsets = false;
            }

            TableOffsets offsets;

            if (useOffsets)
            {
                offsets = _tableOffsets[identity];
            }
            else
            {
                offsets = new TableOffsets
                {
                    FileTable = FindFileTable(rom.Data)
                };

                if (offsets.FileTable == 0)
                {
                    throw new ArgumentException("File table not found. Is this a valid Zelda 64 ROM?");
                }
            }

            var fileTablePointers = _rom.GetSegment(offsets.FileTable)
                                    .ToWordGroups(4)
                                    .TakeWhile(g => !g.All(w => w == 0))
                                    .ToList();


            var nameTable =
                useOffsets
                ? _rom.GetSegment(offsets.NameTable)
                .ExtractStrings(fileTablePointers.Count)
                .ToList()
                : new List <string>();

            Files = fileTablePointers
                    .Where(f => f[3] != 0xFFFFFFFF && f[2] != 0xFFFFFFFF)
                    .Select((f, i) => new File(
                                f[0], f[1], f[2], f[3],
                                nameTable.Count > i ? nameTable[i] : null,
                                string.Format("{0:0000}-{1:X8}", i + 1, f[0]),
                                null,
                                _rom
                                ))
                    .ToList();

            CodeFile = Files.Cast <File>().FirstOrDefault(f => f.ContainsString("Yoshitaka Yasumoto"));

            IEnumerable <uint[]> overlaySource;

            if (useOffsets)
            {
                overlaySource = offsets.OverlayTables
                                .SelectMany(o => _rom.GetSegment(o.StartAddress, o.RecordCount * o.RecordSize)
                                            .ToWordGroups(o.RecordSize / sizeof(UInt32))
                                            );
            }
            else
            {
                var ovls = Files.Where(f => f.Type == FileType.Overlay)
                           .Select(o => (UInt64)o.VirtualStart << 32 | o.VirtualEnd)
                           .ToList();

                overlaySource = CodeFile.FindTuples(ovls)
                                .SelectMany(t => Utilities.ReadU32(CodeFile.Contents, t.Value + 12) >= 0x80800000
                    ?
                                            CodeFile.Contents.GetSegment(t.Value, 32)
                                            .ToWordGroups(7)
                    :
                                            // Some overlays in Majora's Mask have the vma start and end addreses
                                            // before the virtual file address pair. Here, we compensate for this
                                            // by checking if the vma end is < 0x80800000 (overlay address space).
                                            // If it is, we prepend the preceding 8 bytes with the rest of the record.
                                            CodeFile.Contents.GetSegment(t.Value - 8, 8)
                                            .Concat(CodeFile.Contents.GetSegment(t.Value, 24))
                                            .ToWordGroups(7));
            }

            Overlays = overlaySource
                       //_rom.GetSegment(offsets.EffectOverlayTable, (int)offsets.EffectOverlayCount * (int)OverlayEntry.EffectRecordSize)
                       .Select(r => OverlayEntry.FromWords(r, Files.FirstOrDefault(f => f.VirtualStart == r[0])))
                       .Where(r => r.VmaStart >= 0x80800000 && r.VmaEnd != 0)
                       .OrderBy(o => o.VmaStart)
                       .ToList();
        }
Beispiel #18
0
        private void OnTapUp(TapUpDetails details)
        {
            if (_rightClickFocus.hasFocus)
            {
                _rightClickEntry?.remove();
                _rightClickEntry = null;
            }

            FocusScope.of(context).requestFocus(new FocusNode());

            if (details.device == InputUtils.MouseLeftKeyDevice &&
                details.kind == PointerDeviceKind.mouse &&
                widget.Msg.attachments.Count > 0 &&
                !widget.Msg.attachments.first().local&&
                !_fetchingUrl)
            {
                _fetchingUrl = true;
                setState();
                var attachment = widget.Msg.attachments.first();
                Get <Attachment>(
                    url: $"/api/cdn-signed/message-attachments/{widget.Msg.id}/{attachment.id}"
                    ).Then(atch =>
                {
                    _fetchingUrl = false;
                    setState();
                    Launch(atch.signedUrl);
                });
            }
            else if (details.device == InputUtils.MouseRightKeyDevice &&
                     details.kind == PointerDeviceKind.mouse)
            {
                var children = new List <Widget>();
                if (widget.Msg.content.isNotEmpty() &&
                    widget.Msg.id.isNotEmpty())
                {
                    children.Add(
                        new GestureDetector(
                            onTap: () =>
                    {
                        Clipboard.setData(
                            new ClipboardData(text: ParseMessageToString(widget.Msg.content, widget.Users)));
                        FocusScope.of(context).requestFocus(new FocusNode());
                    },
                            child: new Container(
                                height: 40,
                                color: new Color(0x00000000),
                                alignment: Alignment.center,
                                child: new Text(
                                    "复制",
                                    style: new TextStyle(
                                        fontSize: 16,
                                        color: new Color(0xff000000),
                                        fontFamily: "PingFang"
                                        )
                                    )
                                )
                            )
                        );
                    children.Add(
                        new Container(
                            height: 1,
                            color: new Color(0xffd8d8d8)
                            )
                        );
                    children.Add(
                        new GestureDetector(
                            onTap: () =>
                    {
                        Sender.currentState.AppendString(
                            $"「{widget.Msg.author.fullName}: {ParseMessageToString(widget.Msg.content, widget.Users)}」\n- - - - - - - - - - - - - - -\n"
                            );
                        SchedulerBinding.instance.addPostFrameCallback(value =>
                                                                       FocusScope.of(context).requestFocus(Sender.currentState.widget.focusNode));
                    },
                            child: new Container(
                                height: 40,
                                color: new Color(0x00000000),
                                alignment: Alignment.center,
                                child: new Text(
                                    "引用",
                                    style: new TextStyle(
                                        fontSize: 16,
                                        color: new Color(0xff000000),
                                        fontFamily: "PingFang"
                                        )
                                    )
                                )
                            )
                        );
                }

                if (widget.Msg.author.id == Window.currentUserId &&
                    widget.Msg.id.isNotEmpty() &&
                    (widget.Msg.attachments.isEmpty() || !widget.Msg.attachments.first().local))
                {
                    if (children.isNotEmpty())
                    {
                        children.Add(
                            new Container(
                                height: 1,
                                color: new Color(0xffd8d8d8)
                                )
                            );
                    }

                    children.Add(
                        new GestureDetector(
                            onTap: () =>
                    {
                        FocusScope.of(context).requestFocus(new FocusNode());
                        Confirm(
                            context,
                            "删除消息",
                            "确认删除此条消息?",
                            () =>
                        {
                            Post <Models.Message>(
                                $"/api/connectapp/v1/messages/{widget.Msg.id}/delete",
                                null
                                ).Then(m => { });
                        },
                            () => { }
                            );
                    },
                            child: new Container(
                                height: 40,
                                color: new Color(0x00000000),
                                alignment: Alignment.center,
                                child: new Text(
                                    "删除",
                                    style: new TextStyle(
                                        fontSize: 16,
                                        color: new Color(0xff000000),
                                        fontFamily: "PingFang"
                                        )
                                    )
                                )
                            )
                        );
                }

                if (children.Count == 0)
                {
                    return;
                }

                var focusScopeNode = FocusScope.of(context);
                _rightClickEntry = new OverlayEntry(buildContext =>
                {
                    return(new GestureDetector(
                               onTap: () => { focusScopeNode.requestFocus(new FocusNode()); },
                               child: new Container(
                                   color: new Color(0x00000000),
                                   child: new Stack(
                                       children: new List <Widget>
                    {
                        new Positioned(
                            left: details.globalPosition.dx,
                            top: details.globalPosition.dy,
                            child: new Container(
                                width: 80,
                                decoration: new BoxDecoration(
                                    borderRadius: BorderRadius.all(6),
                                    boxShadow: new List <BoxShadow>
                        {
                            new BoxShadow(
                                blurRadius: 16,
                                color: new Color(0x33000000)
                                )
                        },
                                    color: new Color(0xffffffff)
                                    ),
                                child: new Column(
                                    children: children
                                    )
                                )
                            )
                    }
                                       )
                                   )
                               ));
                });
                FocusScope.of(context).requestFocus(_rightClickFocus);
                Overlay.of(context).insert(_rightClickEntry);
            }
        }
Beispiel #19
0
        void _createTipMenu(BuildContext context, ArrowDirection arrowDirection, Offset position, Size size)
        {
            dismiss();
            var   width         = MediaQuery.of(context: context).size.width - 32 * this.tipMenuItems.Count;
            float tipMenuHeight = this._getTipMenuHeight(context: context);
            float triangleY     = arrowDirection == ArrowDirection.up
                ? position.dy
                : position.dy - CustomTextSelectionControlsUtils._kToolbarTriangleSize.height
                                  - tipMenuHeight;
            float left;
            float childCenterX = size.width / 2.0f + position.dx;

            if (childCenterX >= width)
            {
                left = width - 32 * this.tipMenuItems.Count - 16;
            }
            else
            {
                left = childCenterX - 32 * this.tipMenuItems.Count;
            }

            List <Widget> children;

            if (arrowDirection == ArrowDirection.down)
            {
                children = new List <Widget> {
                    new Positioned(
                        top: triangleY,
                        left: left,
                        child: new _TipMenuContent(
                            tipMenuItems: this.tipMenuItems
                            )
                        ),
                    new Positioned(
                        top: triangleY + tipMenuHeight,
                        left: childCenterX,
                        child: new _TipMenuTriangle(
                            arrowDirection: arrowDirection
                            )
                        )
                };
            }
            else
            {
                children = new List <Widget> {
                    new Positioned(
                        top: triangleY,
                        left: childCenterX,
                        child: new _TipMenuTriangle(
                            arrowDirection: arrowDirection
                            )
                        ),
                    new Positioned(
                        top: triangleY + CustomTextSelectionControlsUtils._kToolbarTriangleSize.height,
                        left: left,
                        child: new _TipMenuContent(
                            tipMenuItems: this.tipMenuItems
                            )
                        )
                };
            }

            _overlayState = Overlay.of(context: context);
            _overlayEntry = new OverlayEntry(
                _context => Positioned.fill(
                    new GestureDetector(
                        onTap: dismiss,
                        child: new Container(
                            color: CColors.Transparent,
                            child: new Stack(
                                children: children
                                )
                            )
                        )
                    )
                );
            _isVisible = true;
            _overlayState.insert(entry: _overlayEntry);
        }
            public override Widget build(BuildContext context)
            {
                var entries = new List <OverlayEntry>();

                var entry_bg = new OverlayEntry(
                    inner_context => new Container(
                        color: CLColors.white
                        ));

                var entry = new OverlayEntry(
                    inner_context => new Positioned(
                        left: 0.0f,
                        bottom: 0.0f,
                        child: new GestureDetector(
                            onTap: () => { },
                            child: new Draggable <int>(
                                5,
                                child: new Container(
                                    color: CLColors.blue,
                                    width: 30.0f,
                                    height: 30.0f,
                                    constraints: BoxConstraints.tight(new Size(30, 30)),
                                    child: new Center(child: new Text("5"))
                                    ),
                                feedback: new Container(
                                    color: CLColors.green,
                                    width: 30.0f,
                                    height: 30.0f),
                                //maxSimultaneousDrags: 1,
                                childWhenDragging: new Container(
                                    color: CLColors.black,
                                    width: 30.0f,
                                    height: 30.0f,
                                    constraints: BoxConstraints.tight(new Size(30, 30))
                                    )
                                )
                            )
                        )
                    );

                var entry3 = new OverlayEntry(
                    inner_context => new Positioned(
                        left: 0.0f,
                        bottom: 40.0f,
                        child: new GestureDetector(
                            onTap: () => { },
                            child:
                            new Draggable <int>(
                                8,
                                child: new Container(
                                    color: CLColors.background4,
                                    width: 30.0f,
                                    height: 30.0f,
                                    constraints: BoxConstraints.tight(new Size(30, 30)),
                                    child: new Center(child: new Text("8")))
                                ,
                                feedback: new Container(
                                    color: CLColors.green,
                                    width: 30.0f,
                                    height: 30.0f),
                                maxSimultaneousDrags: 1,
                                childWhenDragging: new Container(
                                    color: CLColors.black,
                                    width: 30.0f,
                                    height: 30.0f,
                                    constraints: BoxConstraints.tight(new Size(30, 30))
                                    )
                                )
                            )
                        )
                    );

                var entry2 = new OverlayEntry(
                    inner_context => new DragTargetWidget()
                    );

                entries.Add(entry_bg);
                entries.Add(entry);
                entries.Add(entry2);
                entries.Add(entry3);

                return(new Container(
                           color: CLColors.white,
                           child: new Overlay(
                               initialEntries: entries
                               )
                           ));
            }
        public NitroROM(string path)
        {
            m_Path  = path;
            m_CanRW = false;

            BeginRW();

            m_FileStream.Position = 0x00;
            char[] gametitle = m_BinReader.ReadChars(12);
            if (new string(gametitle) != "S.MARIO64DS\0")
            {
                EndRW();
                throw new Exception("This file isn't a Super Mario 64 DS ROM.");
            }

            m_FileStream.Position = 0x0C;
            uint gamecode = m_BinReader.ReadUInt32();

            m_FileStream.Position = 0x1E;
            byte romversion = m_BinReader.ReadByte();

            switch (gamecode)
            {
            case 0x454D5341:     // ASME / USA
                if (romversion == 0x01)
                {
                    m_Version = Version.USA_v2;

                    m_LevelOvlIDTableOffset = 0x742B4;
                    m_FileTableOffset       = 0x11244;
                    m_FileTableLength       = 1824;
                }
                else
                {
                    m_Version = Version.USA_v1;

                    m_LevelOvlIDTableOffset = 0x73594;
                    m_FileTableOffset       = 0x1123C;
                    m_FileTableLength       = 1824;
                }
                break;

            case 0x4A4D5341: // ASMJ / JAP
                m_Version = Version.JAP;

                m_LevelOvlIDTableOffset = 0x73B38;
                m_FileTableOffset       = 0x1123C;
                m_FileTableLength       = 1824;
                break;

            case 0x504D5341:     // ASMP / EUR
                m_Version = Version.EUR;

                m_LevelOvlIDTableOffset = 0x758C8;
                m_FileTableOffset       = 0x13098;
                m_FileTableLength       = 2058;
                break;

            default:
                m_Version = Version.UNK;
                EndRW();
                throw new Exception("Unknown ROM version. Tell Mega-Mario about it.");
            }

            m_FileStream.Position = 0x28;
            ARM9RAMAddress        = m_BinReader.ReadUInt32();

            m_FileStream.Position  = 0x30;
            ARM7Offset             = m_BinReader.ReadUInt32();
            m_FileStream.Position += 0x04;
            ARM7RAMAddress         = m_BinReader.ReadUInt32();
            ARM7Size = m_BinReader.ReadUInt32();

            m_FileStream.Position = 0x40;
            FNTOffset             = m_BinReader.ReadUInt32();
            FNTSize   = m_BinReader.ReadUInt32();
            FATOffset = m_BinReader.ReadUInt32();
            FATSize   = m_BinReader.ReadUInt32();
            OVTOffset = m_BinReader.ReadUInt32();
            OVTSize   = m_BinReader.ReadUInt32();
            // no need to bother about ARM7 overlays... there's none in SM64DS

            m_FileStream.Position = 0x80;
            m_UsedSize            = m_BinReader.ReadUInt32();
            //m_UsedSize += ROM_END_MARGIN;

            m_FileStream.Position = FNTOffset + 6;
            ushort numdirs  = m_BinReader.ReadUInt16();
            ushort numfiles = (ushort)(FATSize / 8);

            m_DirEntries  = new DirEntry[numdirs];
            m_FileEntries = new FileEntry[numfiles];

            m_FileStream.Position = FATOffset;
            for (ushort f = 0; f < numfiles; f++)
            {
                uint start = m_BinReader.ReadUInt32();
                uint end   = m_BinReader.ReadUInt32();

                FileEntry fe;
                fe.ID            = f;
                fe.InternalID    = 0xFFFF;
                fe.ParentID      = 0;
                fe.Offset        = start;
                fe.Size          = end - start;
                fe.Name          = fe.FullName = "";
                fe.Data          = null;
                m_FileEntries[f] = fe;
            }

            DirEntry root;

            root.ID         = 0xF000;
            root.ParentID   = 0;
            root.Name       = root.FullName = "";
            m_DirEntries[0] = root;

            uint tableoffset = FNTOffset;

            for (ushort d = 0; d < numdirs; d++)
            {
                m_FileStream.Position = tableoffset;
                uint   subtableoffset = FNTOffset + m_BinReader.ReadUInt32();
                ushort first_fileid   = m_BinReader.ReadUInt16();
                ushort cur_fileid     = first_fileid;

                m_FileStream.Position = subtableoffset;
                for (;;)
                {
                    byte type_len = m_BinReader.ReadByte();

                    if (type_len == 0x00)
                    {
                        break;
                    }
                    else if (type_len > 0x80)
                    {
                        DirEntry dir;

                        dir.Name     = new string(m_BinReader.ReadChars(type_len & 0x7F));
                        dir.ID       = m_BinReader.ReadUInt16();
                        dir.ParentID = (ushort)(d + 0xF000);
                        dir.FullName = "";

                        m_DirEntries[dir.ID - 0xF000] = dir;
                    }
                    else if (type_len < 0x80)
                    {
                        char[] _name = m_BinReader.ReadChars(type_len & 0x7F);

                        m_FileEntries[cur_fileid].ParentID = (ushort)(d + 0xF000);
                        m_FileEntries[cur_fileid].Name     = new string(_name);
                        cur_fileid++;
                    }
                }

                tableoffset += 8;
            }

            for (int i = 0; i < m_DirEntries.Length; i++)
            {
                if (m_DirEntries[i].ParentID > 0xF000)
                {
                    m_DirEntries[i].FullName = m_DirEntries[m_DirEntries[i].ParentID - 0xF000].FullName + "/" + m_DirEntries[i].Name;
                }
                else
                {
                    m_DirEntries[i].FullName = m_DirEntries[i].Name;
                }
            }

            for (int i = 0; i < m_FileEntries.Length; i++)
            {
                if (m_FileEntries[i].ParentID > 0xF000)
                {
                    m_FileEntries[i].FullName = m_DirEntries[m_FileEntries[i].ParentID - 0xF000].FullName + "/" + m_FileEntries[i].Name;
                }
                else
                {
                    m_FileEntries[i].FullName = m_FileEntries[i].Name;
                }
            }

            uint numoverlays = OVTSize / 0x20;

            m_OverlayEntries = new OverlayEntry[numoverlays];

            for (uint i = 0; i < numoverlays; i++)
            {
                m_FileStream.Position = OVTOffset + (i * 0x20);
                OverlayEntry oe;

                oe.EntryOffset               = (uint)m_FileStream.Position;
                oe.ID                        = m_BinReader.ReadUInt32();
                oe.RAMAddress                = m_BinReader.ReadUInt32();
                oe.RAMSize                   = m_BinReader.ReadUInt32();
                oe.BSSSize                   = m_BinReader.ReadUInt32();
                oe.StaticInitStart           = this.m_BinReader.ReadUInt32();
                oe.StaticInitEnd             = this.m_BinReader.ReadUInt32();
                oe.FileID                    = (ushort)this.m_BinReader.ReadUInt32();
                oe.Flags                     = this.m_BinReader.ReadUInt32();
                m_OverlayEntries[(int)oe.ID] = oe;
            }

            if (m_Version == Version.EUR)
            {
                //screw the l that looks like a 1
                //            \/
                NitroOverlay ov0 = new NitroOverlay(this, 0);
                //And of course, fix those hardcoded values
                //Who expected a new object to be inserted, anyway?
                m_FileTableOffset = ov0.ReadPointer(0xA4);
                m_FileTableLength = ov0.Read32(0x9C);
            }

            EndRW();

            UpdateStrings();
        }
Beispiel #22
0
        public static void Confirm(
            BuildContext buildContext,
            string title,
            string msg,
            System.Action onConfirmed,
            System.Action onCanceled
            )
        {
            var focusNode = new FocusNode();

            FocusScope.of(buildContext).requestFocus(focusNode);
            OverlayEntry entry = null;

            entry = new OverlayEntry(
                context =>
            {
                return(new Positioned(
                           left: 0,
                           right: 0,
                           top: 0,
                           bottom: 0,
                           child: new GestureDetector(
                               onTap: () =>
                {
                    entry.remove();
                    onCanceled();
                },
                               child: new Container(
                                   color: new Color(0x00000000),
                                   alignment: Alignment.center,
                                   child: new GestureDetector(
                                       onTap: () => { },
                                       child: new Container(
                                           width: 327,
                                           height: 201,
                                           decoration: new BoxDecoration(
                                               borderRadius: BorderRadius.all(6),
                                               color: new Color(0xffffffff),
                                               boxShadow: new List <BoxShadow>
                {
                    new BoxShadow(
                        blurRadius: 16,
                        color: new Color(0x33000000)
                        )
                }
                                               ),
                                           child: new Column(
                                               children: new List <Widget>
                {
                    new Container(
                        height: 56,
                        padding: EdgeInsets.symmetric(horizontal: 24),
                        child: new Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: new List <Widget>
                    {
                        new Text(
                            title,
                            style: new TextStyle(
                                fontSize: 16,
                                color: new Color(0xff212121),
                                fontFamily: "PingFang"
                                )
                            ),
                        new GestureDetector(
                            onTap: () =>
                        {
                            entry.remove();
                            onCanceled();
                        },
                            child: new Icon(
                                IconFont.IconFontClose,
                                size: 24,
                                color: new Color(0xff979a9e)
                                )
                            )
                    }
                            )
                        ),
                    new Container(
                        height: 1,
                        color: new Color(0xfff0f0f0)
                        ),
                    new Expanded(
                        child: new Container(
                            padding: EdgeInsets.only(
                                top: 24,
                                left: 24,
                                right: 24,
                                bottom: 16),
                            child: new Column(
                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                children: new List <Widget>
                    {
                        new Row(
                            children: new List <Widget>
                        {
                            new Container(
                                width: 32,
                                height: 32,
                                margin: EdgeInsets.only(right: 8),
                                decoration: new BoxDecoration(
                                    borderRadius: BorderRadius.all(16),
                                    color: new Color(0x992196f3)
                                    ),
                                child: new Icon(
                                    IconFont.IconFontDelete,
                                    size: 32,
                                    color: new Color(0x992196f3)
                                    )
                                ),
                            new Text(
                                msg,
                                style: new TextStyle(
                                    fontSize: 14,
                                    color: new Color(0xff797979),
                                    fontFamily: "PingFang"
                                    )
                                )
                        }
                            ),
                        new Row(
                            mainAxisAlignment: MainAxisAlignment.end,
                            children: new List <Widget>
                        {
                            new GestureDetector(
                                onTap: () =>
                            {
                                entry.remove();
                                onCanceled();
                            },
                                child: new Container(
                                    width: 72,
                                    height: 40,
                                    decoration: new BoxDecoration(
                                        borderRadius: BorderRadius.all(3),
                                        border: Border.all(
                                            color: new Color(0xffd8d8d8)
                                            ),
                                        color: new Color(0xffffffff)
                                        ),
                                    alignment: Alignment.center,
                                    child: new Text(
                                        "取消"
                                        ),
                                    margin: EdgeInsets.only(right: 16)
                                    )
                                ),
                            new GestureDetector(
                                onTap: () =>
                            {
                                entry.remove();
                                onConfirmed();
                            },
                                child: new Container(
                                    width: 72,
                                    height: 40,
                                    decoration: new BoxDecoration(
                                        borderRadius: BorderRadius.all(3),
                                        color: new Color(0xff2196f3)
                                        ),
                                    alignment: Alignment.center,
                                    child: new Text(
                                        "确认",
                                        style: new TextStyle(
                                            fontSize: 14,
                                            color: new Color(0xffffffff),
                                            fontFamily: "PingFang"
                                            )
                                        )
                                    )
                                )
                        }
                            )
                    }
                                )
                            )
                        )
                }
                                               )
                                           )
                                       )
                                   )
                               )
                           ));
            }
                );
            Overlay.of(buildContext).insert(entry);
        }