예제 #1
0
 public void DeriveWithSelectorRemoveTwo() 
 {
     var list = new RxList<string>("1", "2", "3");
     var derived = list.Derive(x => int.Parse(x));
     list.RemoveRange(new[] { "1", "3" });
     Assert.AreEqual(2, derived[0]);
 }
예제 #2
0
파일: DFBind.cs 프로젝트: Hengle/Tetris-1
        /*********** One-way binds ***********/

        public static ISubscription bind <A>(
            this RxList <A> list, int max, string maxName,
            Fn <int, IObservable <Option <A> >, ISubscription> bindObservable
            )
        {
            var subscription = list.rxSize.subscribe(size => {
                if (size > max)
                {
                    throw new Exception(String.Format(
                                            "Max {0} {1} are supported in view, " +
                                            "but list size was exceeded.", max, maxName
                                            ));
                }
            });
            var enumeration = Enumerable.Range(0, max).Select(i => {
                var observable = list.rxElement(i);
                return(bindObservable(i, observable));
            }).ToList(); /** Eagerly evaluate to bind **/

            return(new Subscription(() => {
                subscription.unsubscribe();
                foreach (var s in enumeration)
                {
                    s.unsubscribe();
                }
            }));
        }
예제 #3
0
        private void MapChildrenToDb <TModel, TDatabase>(RxList <TModel> modelObjects, List <TDatabase> dbObjects)
            where TModel : IdObject
            where TDatabase : IIdObject, new()
        {
            if (modelObjects == null)
            {
                return;
            }

            foreach (var modelObject in modelObjects)
            {
                object    dbObjectFromCache;
                TDatabase dbObject;
                if (cache.TryGetValue(modelObject, out dbObjectFromCache))
                {
                    dbObject = (TDatabase)dbObjectFromCache;
                }
                else
                {
                    dbObject = new TDatabase();
                    Bind(modelObject, dbObject);
                    dbObjects.Add(dbObject);
                }
                MapScalarsToDb(modelObject, dbObject);
            }
        }
예제 #4
0
 public void DeriveWithSelectorAdd()
 {
     var list = new RxList<string>("1");
     var derived = list.Derive(x => int.Parse(x));
     list.Add("2");
     Assert.AreEqual(1, derived[0]);
     Assert.AreEqual(2, derived[1]);
 }
예제 #5
0
 public void DeriveWithSelectorInitialState()
 {
     var list = new RxList<string>("1", "2", "3");
     var derived = list.Derive(x => int.Parse(x));
     Assert.AreEqual(1, derived[0]);
     Assert.AreEqual(2, derived[1]);
     Assert.AreEqual(3, derived[2]);
 }
예제 #6
0
 public void DeriveRemovesOnModified()
 {
     var list = new RxList<string>("1", "2", "3");
     int removed = -1;
     list.Derive(x => int.Parse(x), x => removed = x);
     list[0] = "5";
     Assert.AreEqual(1, removed);
 }
예제 #7
0
 public void DeriveWithSelectorInsertTwo()
 {
     var list = new RxList<string>("2");
     var derived = list.Derive(x => int.Parse(x));
     list.InsertRange(new[] { new RxListItem<string>(0, "1"), new RxListItem<string>(1, "3") });
     Assert.AreEqual(1, derived[0]);
     Assert.AreEqual(2, derived[1]);
     Assert.AreEqual(3, derived[2]);
 }
예제 #8
0
 public void DeriveWithSelectorModifyOne()
 {
     var list = new RxList<string>("1", "2", "3");
     var derived = list.Derive(x => int.Parse(x));
     list[1] = "4";
     Assert.AreEqual(1, derived[0]);
     Assert.AreEqual(4, derived[1]);
     Assert.AreEqual(3, derived[2]);
 }
예제 #9
0
 public void DeriveWithSelectorModifyTwo()
 {
     var list = new RxList<string>("1", "2", "3");
     var derived = list.Derive(x => int.Parse(x));
     list.ModifyRange(new[] { new RxListItem<string>(0, "4"), new RxListItem<string>(2, "5") });
     Assert.AreEqual(4, derived[0]);
     Assert.AreEqual(2, derived[1]);
     Assert.AreEqual(5, derived[2]);
 }
예제 #10
0
        public MainWindowModel(Func<SelectFileType, string, string, string> selectFile)
        {
            this.selectFile = selectFile;

            var canAddChild = this.ObserveProperty(x => x.SelectedItem).Select(x => x is ApiCollectionModel);

            AddApi = RxFunction.CreateAsync(async () => await OnAddApi(null));
            AddApiCollection = RxFunction.CreateAsync(async () => await OnAddApiCollection(null));
            AddChildApi = RxFunction.CreateAsync(async () => await OnAddApi((ApiCollectionModel)SelectedItem), canAddChild);
            AddChildApiCollection = RxFunction.CreateAsync(async () => await OnAddApiCollection((ApiCollectionModel)SelectedItem), canAddChild);
            Export = RxCommand.Create(OnExport);
            Import = RxCommand.CreateAsync(OnImport);
            Title = "Restless";
            Items = new RxList<ApiItemModel>();
            Methods = httpMethods.ToList();
            OutputTypes = outputTypes.ToList();

            SplitterPosition = Settings.Default.MainWindowSplitterPosition;
            ApiSplitterPosition = Settings.Default.ApiPanelSplitterPosition;
            this.ObservePropertyChange(x => x.SplitterPosition).Throttle(TimeSpan.FromSeconds(1)).Subscribe(x =>
            {
                Settings.Default.MainWindowSplitterPosition = x;
                Settings.Default.Save();
            });
            this.ObservePropertyChange(x => x.ApiSplitterPosition).Throttle(TimeSpan.FromSeconds(1)).Subscribe(x =>
            {
                Settings.Default.ApiPanelSplitterPosition = x;
                Settings.Default.Save();
            });

            ApiItemModel selectedItem = null;
            this.ObservePropertyChange(x => x.SelectedItem).Subscribe(x =>
            {
                if (selectedItem != null)
                    selectedItem.IsSelected = false;
                selectedItem = x;
                if (selectedItem != null)
                    selectedItem.IsSelected = true;
            });

            Repository = new DbRepository(new RestlessDb());

            Task.Run(async () =>
            {
                await Repository.Initialize();
                await Repository.Load();
                foreach (var apiItem in Repository.Items)
                {
                    if (apiItem is Api)
                        Items.Add(new ApiModel(this, null, (Api)apiItem));
                    else
                        Items.Add(new ApiCollectionModel(this, null, (ApiCollection)apiItem));
                }                
            });

            DeleteSelectedItem = RxCommand.CreateAsync(OnDeleteSelectedItem);
        }
예제 #11
0
        public void ItemsRemoved()
        {
            var list = new RxList<string>("1", "2", "3", "4");
            string[] items = null;
            list.ItemsRemoved.Subscribe(x => items = x.ToArray());

            list.RemoveRange(new[] { "2", "4" });
            Assert.AreEqual("2", items[0]);
            Assert.AreEqual("4", items[1]);
        }
예제 #12
0
        public void ItemsAdded()
        {
            var list = new RxList<string>();
            string[] items = null;
            list.ItemsAdded.Subscribe(x => items = x.ToArray());

            list.AddRange(new[] { "1", "2" });
            Assert.AreEqual("1", items[0]);
            Assert.AreEqual("1", list[0]);
            Assert.AreEqual("2", items[1]);
            Assert.AreEqual("2", list[1]);
        }
예제 #13
0
파일: DFBind.cs 프로젝트: Hengle/Tetris-1
 public static ISubscription bind <A, Control>(
     this RxList <A> list, int max, string maxName,
     Fn <int, Control> getControl, Act <Control, A> onChange
     ) where Control : dfControl
 {
     return(list.bind(max, maxName, (i, observable) => {
         var control = getControl(i);
         return observable.subscribe(opt => {
             control.SetIsActive(opt.isDefined);
             opt.each(v => onChange(control, v));
         });
     }));
 }
예제 #14
0
        public void ItemAdded()
        {
            var list = new RxList<string>();
            string item = null;
            list.ItemAdded.Subscribe(x => item = x);

            list.Add("1");
            Assert.AreEqual("1", item);
            Assert.AreEqual("1", list[0]);
            list.Add("2");
            Assert.AreEqual("2", item);
            Assert.AreEqual("2", list[1]);
        }
예제 #15
0
        public void Added()
        {
            var list = new RxList<string>();
            var item = new RxListItem<string>();
            list.Added.Subscribe(x => item = x);

            list.Add("1");
            Assert.AreEqual(0, item.Index);
            Assert.AreEqual("1", item.Value);
            Assert.AreEqual("1", list[0]);
            list.Add("2");
            Assert.AreEqual(1, item.Index);
            Assert.AreEqual("2", item.Value);
            Assert.AreEqual("2", list[1]);
        }
예제 #16
0
        protected ApiItemModel(MainWindowModel mainWindow, ApiCollectionModel parent, ApiItem item)
        {
            MainWindow = mainWindow;
            Parent = parent;
            ItemModel = item;
            Items = new RxList<ApiItemModel>();

            this.ObservePropertyChange(x => x.IsSelected).Subscribe(x =>
            {
                if (x)
                {
                    var current = Parent;
                    while (current != null)
                    {
                        current.IsExpanded = true;
                        current = current.Parent;
                    }
                    MainWindow.SelectedItem = this;
                }
            });
        }
예제 #17
0
        public void ItemRemoved()
        {
            var list = new RxList<string>("1", "2");
            string item = null;
            list.ItemRemoved.Subscribe(x => item = x);

            list.Remove("1");
            Assert.AreEqual("1", item);

            list.Remove("2");
            Assert.AreEqual("2", item);

            list = new RxList<string>("1", "2");
            list.ItemRemoved.Subscribe(x => item = x);

            list.Remove("2");
            Assert.AreEqual("2", item);

            list.Remove("1");
            Assert.AreEqual("1", item);
        }
예제 #18
0
        protected ApiItemModel(MainWindowModel mainWindow, ApiCollectionModel parent, ApiItem item)
        {
            MainWindow = mainWindow;
            Parent     = parent;
            ItemModel  = item;
            Items      = new RxList <ApiItemModel>();

            this.ObservePropertyChange(x => x.IsSelected).Subscribe(x =>
            {
                if (x)
                {
                    var current = Parent;
                    while (current != null)
                    {
                        current.IsExpanded = true;
                        current            = current.Parent;
                    }
                    MainWindow.SelectedItem = this;
                }
            });
        }
예제 #19
0
        public static void SetUpSync <TViewModel, TModel>(
            this RxList <TViewModel> list,
            DbRepository repository,
            RxList <TModel> modelList,
            Func <TViewModel, TModel> newModelObject
            )
            where TViewModel : IIdObject, IRxObject
            where TModel : IdObject
        {
            Action <TViewModel, TModel> bind = (viewModel, model) =>
            {
                viewModel.Changed.Where(y => y.Property.Name != nameof(IdObject.Id)).Subscribe(y =>
                {
                    model.GetType().GetProperty(y.Property.Name)?.SetValue(model, y.NewValue);
                });
            };
            var modelsById = modelList.ToDictionary(x => x.Id);

            foreach (var item in list)
            {
                bind(item, modelsById[item.Id]);
            }
            list.ItemAdded.Subscribe(async viewModel =>
            {
                viewModel.ObservePropertyChange(y => y.Id).SubscribeOnce(y => viewModel.Id = y);
                var newModel = newModelObject(viewModel);
                bind(viewModel, newModel);
                modelList.Add(newModel);
                await repository.WaitForIdle();
            });
            list.ItemRemoved.Subscribe(viewModel =>
            {
                var model = modelList.Single(x => x.Id == viewModel.Id);
                modelList.Remove(model);
            });
        }
예제 #20
0
 public void MoveDifferentItem()
 {
     var list = new RxList<int>(1, 2, 3);
     list.Move(1, 2);
     Assert.AreEqual(2, list[2]);
 }
예제 #21
0
        public void MovedItem()
        {
            var list = new RxList<string>("1a", "2a");

            var item = new RxListMovedItem<string>();
            list.Moved.Subscribe(x => item = x);

            list.Move(1, "1a");
            Assert.AreEqual(0, item.FromIndex);
            Assert.AreEqual(1, item.ToIndex);
            Assert.AreEqual("1a", item.Value);
            Assert.AreEqual("2a", list[0]);
            Assert.AreEqual("1a", list[1]);
        }
예제 #22
0
 public void MoveSameItem()
 {
     var list = new RxList<int>(1, 2, 3);
     list.Move(2, 2);
     Assert.AreEqual(3, list[2]);
 }
 static RxGroupListForm()
 {
     RxGroupListForm.data = new RxList();
 }
예제 #24
0
        public void RangeRemoved()
        {
            var list = new RxList<string>("1", "2", "3", "4");
            RxListItem<string>[] items = null;
            list.RangeRemoved.Subscribe(x => items = x.ToArray());

            list.RemoveRange(new[] { "2", "4" });
            Assert.AreEqual(1, items[0].Index);
            Assert.AreEqual("2", items[0].Value);
            Assert.AreEqual(3, items[1].Index);
            Assert.AreEqual("4", items[1].Value);
            Assert.AreEqual("1", list[0]);
            Assert.AreEqual("3", list[1]);
        }
예제 #25
0
        public void Modified()
        {
            var list = new RxList<string>("1a", "2a");

            var item = new RxListModifiedItem<string>();
            list.Modified.Subscribe(x => item = x);

            list[1] = "2b";
            Assert.AreEqual(1, item.Index);
            Assert.AreEqual("2a", item.OldValue);
            Assert.AreEqual("2b", item.NewValue);
        }
예제 #26
0
        public void Removed()
        {
            var list = new RxList<string>("1", "2");
            var item = new RxListItem<string>();
            list.Removed.Subscribe(x => item = x);

            list.Remove("1");
            Assert.AreEqual(0, item.Index);
            Assert.AreEqual("1", item.Value);

            list.Remove("2");
            Assert.AreEqual(0, item.Index);
            Assert.AreEqual("2", item.Value);

            list = new RxList<string>("1", "2");
            list.Removed.Subscribe(x => item = x);

            list.Remove("2");
            Assert.AreEqual(1, item.Index);
            Assert.AreEqual("2", item.Value);

            list.Remove("1");
            Assert.AreEqual(0, item.Index);
            Assert.AreEqual("1", item.Value);
        }
예제 #27
0
 public void DeriveRemovesOnRemoved()
 {
     var list = new RxList<string>("1", "2", "3");
     int removed = -1;
     list.Derive(x => int.Parse(x), x => removed = x);
     list.Remove("2");
     Assert.AreEqual(2, removed);
 }
예제 #28
0
        public MainWindowModel(Func <SelectFileType, string, string, string> selectFile)
        {
            this.selectFile = selectFile;

            var canAddChild = this.ObserveProperty(x => x.SelectedItem).Select(x => x is ApiCollectionModel);

            AddApi                = RxFunction.CreateAsync(async() => await OnAddApi(null));
            AddApiCollection      = RxFunction.CreateAsync(async() => await OnAddApiCollection(null));
            AddChildApi           = RxFunction.CreateAsync(async() => await OnAddApi((ApiCollectionModel)SelectedItem), canAddChild);
            AddChildApiCollection = RxFunction.CreateAsync(async() => await OnAddApiCollection((ApiCollectionModel)SelectedItem), canAddChild);
            Export                = RxCommand.Create(OnExport);
            Import                = RxCommand.CreateAsync(OnImport);
            Title       = "Restless";
            Items       = new RxList <ApiItemModel>();
            Methods     = httpMethods.ToList();
            OutputTypes = outputTypes.ToList();

            SplitterPosition    = Settings.Default.MainWindowSplitterPosition;
            ApiSplitterPosition = Settings.Default.ApiPanelSplitterPosition;
            this.ObservePropertyChange(x => x.SplitterPosition).Throttle(TimeSpan.FromSeconds(1)).Subscribe(x =>
            {
                Settings.Default.MainWindowSplitterPosition = x;
                Settings.Default.Save();
            });
            this.ObservePropertyChange(x => x.ApiSplitterPosition).Throttle(TimeSpan.FromSeconds(1)).Subscribe(x =>
            {
                Settings.Default.ApiPanelSplitterPosition = x;
                Settings.Default.Save();
            });

            ApiItemModel selectedItem = null;

            this.ObservePropertyChange(x => x.SelectedItem).Subscribe(x =>
            {
                if (selectedItem != null)
                {
                    selectedItem.IsSelected = false;
                }
                selectedItem = x;
                if (selectedItem != null)
                {
                    selectedItem.IsSelected = true;
                }
            });

            Repository = new DbRepository(new RestlessDb());

            Task.Run(async() =>
            {
                await Repository.Initialize();
                await Repository.Load();
                foreach (var apiItem in Repository.Items)
                {
                    if (apiItem is Api)
                    {
                        Items.Add(new ApiModel(this, null, (Api)apiItem));
                    }
                    else
                    {
                        Items.Add(new ApiCollectionModel(this, null, (ApiCollection)apiItem));
                    }
                }
            });

            DeleteSelectedItem = RxCommand.CreateAsync(OnDeleteSelectedItem);
        }
예제 #29
0
        public void ObserveElement()
        {
            var one = new TestModel { StringProperty = "1" };
            var two = new TestModel { StringProperty = "2" };
            var list = new RxList<TestModel>(one, two);
            string s = null;
            list.ObserveElementProperty(x => x.StringProperty).Subscribe(x => s = x.Value);

            list[0].StringProperty = "foo";
            Assert.AreEqual("foo", s);

            list.Remove(one);
            one.StringProperty = "bar";
            Assert.AreEqual("foo", s);

            list[0] = new TestModel { StringProperty = "3" };
            Assert.AreEqual("3", s);
        }
예제 #30
0
        public ApiModel(MainWindowModel mainWindow, ApiCollectionModel parent, Api api) : base(mainWindow, parent, api)
        {
            Inputs  = new RxList <ApiInputModel>();
            Outputs = new RxList <ApiOutputModel>();
            Headers = new RxList <ApiHeaderModel>();

            SubscribeForInputs(this.ObservePropertyChange(x => x.Model.Url), () => Model.Url, ApiInputType.Url);
            SubscribeForInputs(this.ObservePropertyChange(x => x.Model.Body).Where(x => ContentTypes.IsText(ContentType)), () => Model.Body, ApiInputType.Body);
            SubscribeForInputs(this.ObservePropertyChange(x => x.Headers).SelectMany(x => x.ObserveElementProperty(y => y.Name)).Merge(this.ObservePropertyChange(x => x.Headers).SelectMany(x => x.ObserveElementProperty(y => y.Value))), () => string.Join("\n", Headers.Select(x => x.Name + "=" + x.Value)), ApiInputType.Header);

            Model = api;
            if (api.Inputs != null)
            {
                Inputs.AddRange(api.Inputs.Select(x => new ApiInputModel
                {
                    Id           = x.Id,
                    Name         = x.Name,
                    DefaultValue = x.DefaultValue,
                    InputType    = x.InputType
                }));
            }
            if (api.Outputs != null)
            {
                Outputs.AddRange(api.Outputs.Select(x => new ApiOutputModel
                {
                    Id         = x.Id,
                    Name       = x.Name,
                    Expression = x.Expression,
                    Type       = x.Type
                }));
            }
            if (api.Headers != null)
            {
                Headers.AddRange(api.Headers.Select(x => new ApiHeaderModel
                {
                    Id    = x.Id,
                    Name  = x.Name,
                    Value = x.Value
                }));
            }
            Send  = RxCommand.CreateAsync(OnSend);
            Reset = RxCommand.Create(OnReset);

            Inputs.SetUpSync(
                MainWindow.Repository,
                Model.Inputs,
                x => new ApiInput {
                Name = x.Name, DefaultValue = "", InputType = x.InputType
            });
            Outputs.SetUpSync(
                MainWindow.Repository,
                Model.Outputs,
                x => new ApiOutput {
                Name = x.Name, Expression = ""
            });
            Headers.SetUpSync(
                MainWindow.Repository,
                Model.Headers,
                _ => new ApiHeader {
                Name = "", Value = ""
            });
        }
예제 #31
0
 private void Awake()
 {
     notifications = new RxList <Notification>();
 }