public TabControllerModel(
     MainReducer reducer,
     PageControllerReducer controllerReducer,
     TabPageHost host)
 {
     reducer.Select(state => state.DragData).Subscribe(data => {
         if (data == null)
         {
             foreach (var tabItem in this.Tabs)
             {
                 tabItem.MouseMove -= OpenTabOnHover;
             }
         }
         else
         {
             foreach (var tabItem in this.Tabs)
             {
                 tabItem.MouseMove += OpenTabOnHover;
             }
         }
     });
     reducer.Select(state => state.FullscreenMode)
     .Subscribe(isFullscreen => this.IsHeaderVisible = !isFullscreen);
     host.WhenTabAdded
     .ObserveOnDispatcher(DispatcherPriority.Background)
     .Subscribe(tab => {
         this.Tabs.Add(tab);
         this.ActiveTab = tab;
         if (this.ActiveTab == null)
         {
             return;
         }
         this.ActiveTab.AllowDrop = true;
     });
     host.WhenTabClosed
     .ObserveOnDispatcher(DispatcherPriority.Background)
     .Subscribe(RemoveTab);
     this.WhenAnyValue(model => model.ActiveTab)
     .Where(LambdaHelper.NotNull)
     .ObserveOnDispatcher(DispatcherPriority.Background)
     .Subscribe(tab => {
         tab.IsSelected   = true;
         var activeTabUid = tab.Uid;
         var hostPage     = host.Pages.GetOrDefault(activeTabUid);
         if (hostPage == default)
         {
             return;
         }
         controllerReducer.DispatchSetValueAction(state => state.SelectedPage,
                                                  hostPage.Token);
     });
 }
Beispiel #2
0
        public PageControllerModel(
            PageControllerToken token,
            ModuleActivator activator,
            PageControllerReducer reducer,
            SerialUtil serialUtil,
            MainReducer mainReducer,
            WindowPageHost windowPageHost,
            DatabaseManager databaseManager,
            DatabaseBackupService databaseBackupService
            )
        {
            _activator             = activator;
            _windowPageHost        = windowPageHost;
            _databaseManager       = databaseManager;
            _databaseBackupService = databaseBackupService;
            this._serialUtil       = serialUtil;
            InitHandlers();
            ActivateContent(token);

            this.WhenActivated((c) => {
                mainReducer.Select(state => state.FullscreenMode)
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(isFullScreen => this.MenuVisibility = !isFullScreen)
                .DisposeWith(c);
                reducer.Select(state => state.SelectedPage)
                .Where(LambdaHelper.NotNull)
                .WithLatestFrom(reducer.Select(state => state.Controls), LambdaHelper.ToTuple)
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(tuple => {
                    var(selectedPage, controlsDict) = tuple;
                    var controls = selectedPage == null
                            ? new List <ButtonConfig>()
                            : controlsDict.GetOrDefault(selectedPage.Id) ?? new List <ButtonConfig>();
                    SetActionButtons(controls);
                })
                .DisposeWith(c);
                _serialUtil.ConnectionStatus
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Select(status => status.IsConnected)
                .Subscribe(status => {
                    this.ReaderMenuText = status
                            ? Localization["Отключить считыватель"]
                            : Localization["Включить считыватель"];
                })
                .DisposeWith(c);
            });
        }
        public WindowSubscriptionContainer(
            Window window,
            IModuleToken token,
            MainReducer reducer
            )
        {
            _window  = window;
            _token   = token;
            _reducer = reducer;

            window.KeyDown    += OnWindowOnKeyDown;
            token.Deactivated += OuterDeactivationHandler;
            window.Closed     += DeactivationHandler;
            _subscription      = reducer.Select(state => state.FullscreenMode)
                                 .Subscribe(isFullscreen => {
                window.WindowStyle = isFullscreen ? WindowStyle.None : WindowStyle.SingleBorderWindow;
                window.WindowState = isFullscreen ? WindowState.Maximized : WindowState.Normal;
            });
        }
 public WindowPageHost(IModuleToken token, ModuleActivator activator, MainReducer reducer) : base(activator)
 {
     _token   = token;
     _reducer = reducer;
 }
Beispiel #5
0
        public RegistrationPageModel(
            StudentCardService studentCardService,
            PhotoService photoService,
            TabPageHost tabPageHost,
            WindowPageHost windowPageHost,
            LocalDbContext db,
            RegistrationPageToken token,
            MainReducer mainReducer,
            PageControllerReducer reducer
            )
        {
            _tabPageHost            = tabPageHost;
            _windowPageHost         = windowPageHost;
            _db                     = db;
            _token                  = token;
            _mainReducer            = mainReducer;
            this.StudentCardService = studentCardService;
            this.PhotoService       = photoService;
            this.DoRegister         = ReactiveCommand.Create(() => {
                if (this.AllStudentsMode)
                {
                    foreach (IStudentViewModel selectedStudent in this.SelectedStudents.ToList())
                    {
                        RegisterExtStudent(selectedStudent.Student);
                    }
                }
                else
                {
                    Register();
                }
            });
            this.DoUnRegister             = ReactiveCommand.Create(UnRegister);
            this.OpenStudentLessonHandler = ReactiveCommand.Create(() =>
                                                                   OpenLesson(this.SelectedStudentLessonNote?.Note?.StudentLesson?.Lesson));

            this.ShowStudent = ReactiveCommand.Create(() => {
                var selectedStudent      = _selectedStudent;
                var studentViewPageToken = new StudentViewPageToken("Студент", selectedStudent);
                tabPageHost.AddPageAsync <StudentViewPageModule, StudentViewPageToken>(studentViewPageToken);
            });
            this.AddStudentNote = ReactiveCommand.Create(() => {
                var noteFormToken = new NoteListFormToken("Заметки", () => new StudentLessonNote()
                {
                    StudentLesson = _selectedStudentLesson.StudentLesson,
                    EntityId      = _selectedStudentLesson.StudentLesson.Id
                }, _selectedStudentLesson.StudentLesson.Notes);
                windowPageHost.AddPageAsync <NoteListFormModule, NoteListFormToken>(noteFormToken);
            });
            this.ToggleAllStudentTable = new ButtonConfig {
                Command = ReactiveCommand.Create(() => this.AllStudentsMode = !this.AllStudentsMode),
                Text    = Localization["Все студенты"]
            };
            this.AllStudentsFilter = (o, s) => {
                var student      = ((IStudentViewModel)o).Student;
                var alreadyAdded =
                    IsStudentAlreadyRegistered(RegisteredStudents.Cast <StudentLessonInfoViewModel>(), student) ||
                    IsStudentAlreadyRegistered(LessonStudents.Cast <StudentLessonInfoViewModel>(), student);
                if (alreadyAdded)
                {
                    return(false);
                }
                s = s.ToLowerInvariant();
                return(student.FirstName != null &&
                       student.FirstName.ToLowerInvariant()
                       .Contains(s) ||
                       student.LastName != null &&
                       student.LastName.ToLowerInvariant()
                       .Contains(s) ||
                       student.SecondName != null &&
                       student.SecondName.ToLowerInvariant()
                       .Contains(s));
            };

            InitTableConfigs();
            Init(token.Lesson);
            this.WhenActivated(disposable => {
                this.WhenAnyValue(model => model.TimerState)
                .Where(LambdaHelper.NotNull)
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(state => {
                    this.TimerString = $"{state.TimeLeft:hh\\:mm\\:ss}/{state.CurrentTime:HH:mm:ss}";
                }).DisposeWith(disposable);
                this.WhenAnyValue(model => model.Lesson)
                .Where(LambdaHelper.NotNull)
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(entity => {
                    var groupName  = entity.Group?.Name ?? entity.Stream.Name;
                    var lessonInfo =
                        $"{Localization["common.lesson.type." + entity.LessonType]}: {entity.Order}/{entity.GetLessonsCount()}";
                    this.LessonInfoState = new LessonInfoState {
                        GroupName  = groupName,
                        LessonInfo = lessonInfo,
                        Date       = entity.Date?.ToString("dd.MM.yyyy"),
                        Time       =
                            $"[{entity.Schedule.OrderNumber}] {entity.Schedule.Begin:hh\\:mm} - {entity.Schedule.End:hh\\:mm}"
                    };
                }).DisposeWith(disposable);
                this.WhenAnyValue(model => model.AllStudentsMode)
                .Throttle(TimeSpan.FromMilliseconds(100))
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(b => {
                    this.ToggleAllStudentTable.Text = b ? Localization["Занятие"] : Localization["Все студенты"];
                    if (!b || this.AllStudents.Count != 0)
                    {
                        return;
                    }
                    var studentViewModels = db.Students
                                            .Include(model => model.Groups)
                                            .ToList() // create query and load
                                            .Select(model => new StudentViewModel(model))
                                            .ToList();
                    this.AllStudents.AddRange(studentViewModels);
                }).DisposeWith(disposable);

                this.WhenAnyValue(model => model.IsLessonChecked)
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(b => {
                    if (this.Lesson == null)
                    {
                        return;
                    }

                    this.Lesson.Checked = b;
                    this._db.ThrottleSave();
                }).DisposeWith(disposable);
                this.LessonStudentsTableConfig.SelectedItem
                .Where(LambdaHelper.NotNull)
                .Merge(this.RegisteredStudentsTableConfig.SelectedItem.AsObservable().Where(LambdaHelper.NotNull))
                .Cast <StudentLessonInfoViewModel>()
                .Do(o => this._selectedStudentLesson = o)
                .Select(o => o.StudentLesson.Student)
                .Merge(this.AllStudentsTableConfig.SelectedItem.Where(LambdaHelper.NotNull))
                .Throttle(TimeSpan.FromMilliseconds(200))
                .Subscribe
                (
                    async o => {
                    var studentEntity = o as StudentEntity;
                    _selectedStudent  = studentEntity;
                    await UpdateDescription(studentEntity);
                    await UpdateStudentLessonNotes(studentEntity);
                }
                ).DisposeWith(disposable);

                this.WhenRemoved <LessonEntity>()
                .Where(entities => entities.Any(entity => entity.Id == this.Lesson?.Id))
                .Subscribe(_ => token.Deactivate())
                .DisposeWith(disposable);
                this.WhenRemoved <StudentLessonNote>()
                .Merge(this.WhenAdded <StudentLessonNote>())
                .Merge(this.WhenUpdated <StudentLessonNote>())
                .Where(notes => this._selectedStudent != null &&
                       notes.Any(note => note.StudentLesson._StudentId == this._selectedStudent.Id))
                .ObserveOnDispatcher(DispatcherPriority.Background)
                .Subscribe(_ => UpdateStudentLessonNotes(this._selectedStudent));
                this.StudentCardService.ReadStudentCard.Subscribe(ReadStudentData);
            });
            GetControls()
            .ToObservable()
            .TakeUntil(DestroySubject)
            .Subscribe(controls =>
            {
                reducer.Dispatch(new RegisterControlsAction(token, controls));
            });
        }