void ConfigureDlg() { spin19LQty.Binding.AddBinding(Entity, e => e.Water19LCount, w => w.ValueAsInt).InitializeFromSource(); spinOrderMinSumEShopGoods.Binding.AddBinding(Entity, e => e.OrderMinSumEShopGoods, w => w.ValueAsDecimal).InitializeFromSource(); ylabel6LWater.Binding.AddBinding(Entity, e => e.Water6LCount, w => w.LabelProp).InitializeFromSource(); ylabel1500mlBottles.Binding.AddBinding(Entity, e => e.Water1500mlCount, w => w.LabelProp).InitializeFromSource(); ylabel600mlBottles.Binding.AddBinding(Entity, e => e.Water600mlCount, w => w.LabelProp).InitializeFromSource(); vboxDistricts.Visible = Entity.Id > 0; if (Entity.Id > 0) { treeDistricts.ColumnsConfig = ColumnsConfigFactory.Create <District>() .AddColumn("Правило используется в районах:").AddTextRenderer(d => d.DistrictName) .Finish(); treeDistricts.ItemsDataSource = DistrictRuleRepository.GetDistrictsHavingRule(UoW, Entity); } }
private void Configure() { #region TreeViews var colorRed = new Gdk.Color(255, 0, 0); var colorWhite = new Gdk.Color(255, 255, 255); ytreeDistricts.ColumnsConfig = ColumnsConfigFactory.Create <District>() .AddColumn("Код") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.Id.ToString()) .AddColumn("Название") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.DistrictName) .Editable() .AddColumn("Тарифная зона") .HeaderAlignment(0.5f) .AddComboRenderer(x => x.TariffZone) .SetDisplayFunc(x => x.Name) .FillItems(ViewModel.UoW.GetAll <TariffZone>().ToList(), "Нет") .Editing() .AddColumn("Мин. бутылей") .HeaderAlignment(0.5f) .AddTextRenderer(x => x.ObservableCommonDistrictRuleItems.Any() ? x.ObservableCommonDistrictRuleItems.Min(c => c.DeliveryPriceRule.Water19LCount).ToString() : "-" ) .XAlign(0.5f) .AddColumn("") .Finish(); ytreeDistricts.Binding.AddBinding(ViewModel.Entity, e => e.ObservableDistricts, w => w.ItemsDataSource).InitializeFromSource(); ytreeDistricts.Selection.Changed += (sender, args) => { if (ViewModel.IsCreatingNewBorder) { ViewModel.CancelNewBorderCommand.Execute(); toggleNewBorderPreview.Active = false; } ViewModel.SelectedDistrict = ytreeDistricts.GetSelectedObject() as District; }; ytreeScheduleRestrictions.ColumnsConfig = ColumnsConfigFactory.Create <DeliveryScheduleRestriction>() .AddColumn("График") .MinWidth(150) .HeaderAlignment(0.5f) .AddTextRenderer(x => x.DeliverySchedule.Name) .AddColumn("Прием до") .SetTag(acceptBeforeColumnTag) .HeaderAlignment(0.5f) .AddTextRenderer(x => x.AcceptBeforeTitle) .AddSetter((c, r) => c.BackgroundGdk = r.AcceptBefore == null ? colorRed : colorWhite) .Finish(); ytreeScheduleRestrictions.Binding.AddBinding(ViewModel, vm => vm.ScheduleRestrictions, w => w.ItemsDataSource); ytreeScheduleRestrictions.Selection.Changed += (sender, args) => ViewModel.SelectedScheduleRestriction = ytreeScheduleRestrictions.GetSelectedObject() as DeliveryScheduleRestriction; ytreeCommonRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <CommonDistrictRuleItem>() .AddColumn("Цена") .HeaderAlignment(0.5f) .AddNumericRenderer(p => p.Price) .Digits(2) .WidthChars(10) .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0)) .Editing() .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite) .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false) .AddColumn("Правило") .HeaderAlignment(0.5f) .AddTextRenderer(p => p.DeliveryPriceRule.Title) .WrapMode(Pango.WrapMode.WordChar) .WrapWidth(500) .Finish(); ytreeCommonRulePrices.Binding.AddBinding(ViewModel, vm => vm.CommonDistrictRuleItems, w => w.ItemsDataSource); ytreeCommonRulePrices.Selection.Changed += (sender, args) => ViewModel.SelectedCommonDistrictRuleItem = ytreeCommonRulePrices.GetSelectedObject() as CommonDistrictRuleItem; ytreeWeekDayRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <WeekDayDistrictRuleItem>() .AddColumn("Цена") .HeaderAlignment(0.5f) .AddNumericRenderer(p => p.Price) .Digits(2) .WidthChars(10) .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0)) .Editing() .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite) .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false) .AddColumn("Правило") .HeaderAlignment(0.5f) .AddTextRenderer(p => p.DeliveryPriceRule.ToString()) .WrapMode(Pango.WrapMode.WordChar) .WrapWidth(390) .Finish(); ytreeWeekDayRulePrices.Binding.AddBinding(ViewModel, vm => vm.WeekDayDistrictRuleItems, w => w.ItemsDataSource); ytreeWeekDayRulePrices.Selection.Changed += (sender, args) => ViewModel.SelectedWeekDayDistrictRuleItem = ytreeWeekDayRulePrices.GetSelectedObject() as WeekDayDistrictRuleItem; #endregion btnSave.Clicked += (sender, args) => ViewModel.Save(); btnSave.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict || vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnCancel.Clicked += (sender, args) => ViewModel.Close(true, CloseSource.Cancel); ylabelStatusString.Text = ViewModel.Entity.Status.GetEnumTitle(); entryName.Binding.AddBinding(ViewModel.Entity, e => e.Name, w => w.Text).InitializeFromSource(); entryName.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnAddDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanCreateDistrict, w => w.Sensitive).InitializeFromSource(); btnAddDistrict.Clicked += (sender, args) => { ViewModel.AddDistrictCommand.Execute(); ScrollToSelectedDistrict(); }; btnRemoveDistrict.Clicked += (sender, args) => { ViewModel.RemoveDistrictCommand.Execute(); if (ViewModel.SelectedDistrict == null) { RefreshBorders(); } else { ScrollToSelectedDistrict(); } }; btnRemoveDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanDeleteDistrict, w => w.Sensitive).InitializeFromSource(); ytextComment.Binding.AddBinding(ViewModel.Entity, e => e.Comment, w => w.Buffer.Text).InitializeFromSource(); ytextComment.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource(); btnAddCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanEditDistrict, w => w.Sensitive).InitializeFromSource(); btnAddCommonRule.Clicked += (sender, args) => { var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules()) { Mode = OrmReferenceMode.MultiSelect, ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None }; selectRules.ObjectSelected += (o, e) => ViewModel.AddCommonDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>()); Tab.TabParent.AddSlaveTab(this.Tab, selectRules); }; btnRemoveCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedCommonDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource(); btnRemoveCommonRule.Clicked += (sender, args) => ViewModel.RemoveCommonDistrictRuleItemCommand.Execute(); btnToday.TooltipText = "День в день.\nГрафик доставки при создании заказа сегодня и на сегодняшнюю дату доставки."; btnToday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Today; btnMonday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Monday; btnTuesday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Tuesday; btnWednesday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Wednesday; btnThursday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Thursday; btnFriday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Friday; btnSaturday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Saturday; btnSunday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Sunday; btnAddSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource(); btnAddSchedule.Clicked += (sender, args) => { var selectSchedules = new OrmReference(typeof(DeliverySchedule), ViewModel.UoW) { Mode = OrmReferenceMode.MultiSelect }; selectSchedules.ObjectSelected += (o, eventArgs) => { ViewModel.AddScheduleRestrictionCommand.Execute(eventArgs.Subjects.Cast <DeliverySchedule>()); if (ViewModel.SelectedScheduleRestriction != null) { var iter = ytreeScheduleRestrictions.YTreeModel.IterFromNode(ViewModel.SelectedScheduleRestriction); var path = ytreeScheduleRestrictions.YTreeModel.GetPath(iter); ytreeScheduleRestrictions.ScrollToCell(path, ytreeScheduleRestrictions.Columns.FirstOrDefault(), false, 0, 0); } }; Tab.TabParent.AddSlaveTab(this.Tab, selectSchedules); }; btnRemoveSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource(); btnRemoveSchedule.Clicked += (sender, args) => ViewModel.RemoveScheduleRestrictionCommand.Execute(); btnAddAcceptBefore.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource(); btnAddAcceptBefore.Clicked += (sender, args) => { var acceptBeforeTimeViewModel = new SimpleEntityJournalViewModel <AcceptBefore, AcceptBeforeViewModel>( x => x.Name, () => new AcceptBeforeViewModel( EntityUoWBuilder.ForCreate(), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ), node => new AcceptBeforeViewModel( EntityUoWBuilder.ForOpen(node.Id), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ), UnitOfWorkFactory.GetDefaultFactory, ServicesConfig.CommonServices ); acceptBeforeTimeViewModel.SelectionMode = JournalSelectionMode.Single; acceptBeforeTimeViewModel.SetActionsVisible(deleteActionEnabled: false, editActionEnabled: false); acceptBeforeTimeViewModel.OnEntitySelectedResult += (o, eventArgs) => { var node = eventArgs.SelectedNodes.FirstOrDefault(); if (node != null) { ViewModel.AddAcceptBeforeCommand.Execute(ViewModel.UoW.GetById <AcceptBefore>(node.Id)); } }; Tab.TabParent.AddSlaveTab(Tab, acceptBeforeTimeViewModel); }; btnRemoveAcceptBefore.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null && vm.SelectedScheduleRestriction.AcceptBefore != null, w => w.Sensitive) .InitializeFromSource(); btnRemoveAcceptBefore.Clicked += (sender, args) => ViewModel.RemoveAcceptBeforeCommand.Execute(); btnAddWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource(); btnAddWeekDayRule.Clicked += (sender, args) => { var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules()) { Mode = OrmReferenceMode.MultiSelect, ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None }; selectRules.ObjectSelected += (o, e) => ViewModel.AddWeekDayDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>()); Tab.TabParent.AddSlaveTab(this.Tab, selectRules); }; btnRemoveWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource(); btnRemoveWeekDayRule.Clicked += (sender, args) => ViewModel.RemoveWeekDayDistrictRuleItemCommand.Execute(); cmbGeoGroup.ItemsList = ViewModel.UoW.GetAll <GeographicGroup>().ToList(); cmbGeoGroup.Binding.AddBinding(ViewModel, vm => vm.SelectedGeoGroup, w => w.SelectedItem).InitializeFromSource(); cmbGeoGroup.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null, w => w.Sensitive).InitializeFromSource(); cmbWageDistrict.ItemsList = ViewModel.UoW.Session.QueryOver <WageDistrict>().Where(d => !d.IsArchive).List(); cmbWageDistrict.Binding.AddBinding(ViewModel, vm => vm.SelectedWageDistrict, w => w.SelectedItem).InitializeFromSource(); cmbWageDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.CanChangeDistrictWageTypePermissionResult, w => w.Sensitive).InitializeFromSource(); cmbWageDistrict.SetRenderTextFunc <WageDistrict>(x => x.Name); #region GMap btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder == null, w => w.Sensitive).InitializeFromSource(); btnAddBorder.Clicked += (sender, args) => ViewModel.CreateBorderCommand.Execute(); btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder != null, w => w.Sensitive).InitializeFromSource(); btnRemoveBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog($"Удалить границу района {ViewModel.SelectedDistrict.DistrictName}?")) { ViewModel.RemoveBorderCommand.Execute(); RefreshBorders(); } }; btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); btnConfirmNewBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog("Завершить создание границы района?")) { if (ViewModel.NewBorderVertices.Count < 3) { MessageDialogHelper.RunInfoDialog("Нельзя создать границу района меньше чем за 3 точки"); return; } toggleNewBorderPreview.Active = false; ViewModel.ConfirmNewBorderCommand.Execute(); RefreshBorders(); } }; btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); btnCancelNewBorder.Clicked += (sender, args) => { if (MessageDialogHelper.RunQuestionDialog("Отменить создание границы района?")) { ViewModel.CancelNewBorderCommand.Execute(); toggleNewBorderPreview.Active = false; } }; toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource(); toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource(); toggleNewBorderPreview.Toggled += (sender, args) => { if (toggleNewBorderPreview.Active && ViewModel.NewBorderVertices.Any()) { var previewBorder = new GMapPolygon(ViewModel.NewBorderVertices.ToList(), "Предпросмотр новых границ"); newBordersPreviewOverlay.Polygons.Add(previewBorder); } else { newBordersPreviewOverlay.Clear(); } }; cmbMapType.ItemsEnum = typeof(MapProviders); cmbMapType.EnumItemSelected += (sender, args) => gmapWidget.MapProvider = MapProvidersHelper.GetPovider((MapProviders)args.SelectedItem); cmbMapType.SelectedItem = MapProviders.YandexMap; gmapWidget.Position = new PointLatLng(59.93900, 30.31646); gmapWidget.HeightRequest = 150; gmapWidget.HasFrame = true; gmapWidget.Overlays.Add(bordersOverlay); gmapWidget.Overlays.Add(newBordersPreviewOverlay); gmapWidget.Overlays.Add(verticeOverlay); RefreshBorders(); gmapWidget.ButtonPressEvent += (o, args) => { if (args.Event.Button == 1 && ViewModel.IsCreatingNewBorder) { ViewModel.AddNewVertexCommand.Execute(gmapWidget.FromLocalToLatLng((int)args.Event.X, (int)args.Event.Y)); } if (args.Event.Button == 3 && ViewModel.IsCreatingNewBorder) { var marker = verticeOverlay.Markers.FirstOrDefault(m => m.IsMouseOver); if (marker == null) { return; } var pointMarker = new PointLatLng(marker.Position.Lat, marker.Position.Lng); if (ViewModel.NewBorderVertices.Contains(pointMarker)) { Menu popupMenu = new Menu(); var item = new MenuItem("Удалить"); item.Activated += (sender, e) => ViewModel.RemoveNewBorderVertexCommand.Execute(pointMarker); popupMenu.Add(item); popupMenu.ShowAll(); popupMenu.Popup(); } } }; void RefreshBorders() { bordersOverlay.Clear(); foreach (District district in ViewModel.Entity.ObservableDistricts) { if (district.DistrictBorder != null) { bordersOverlay.Polygons.Add(new GMapPolygon( district.DistrictBorder.Coordinates.Select(p => new PointLatLng(p.X, p.Y)).ToList(), district.DistrictName) ); } } } #endregion ViewModel.PropertyChanged += (sender, args) => { Application.Invoke((o, eventArgs) => { switch (args.PropertyName) { case nameof(ViewModel.SelectedWeekDayName): var column = ytreeScheduleRestrictions.ColumnsConfig.GetColumnsByTag(acceptBeforeColumnTag).First(); column.Visible = ViewModel.SelectedWeekDayName == WeekDayName.Today; break; case nameof(ViewModel.SelectedDistrict): if (ViewModel.SelectedDistrict != null) { ytreeDistricts.SelectObject(ViewModel.SelectedDistrict); } break; case nameof(ViewModel.SelectedScheduleRestriction): if (ViewModel.SelectedScheduleRestriction != null) { ytreeScheduleRestrictions.SelectObject(ViewModel.SelectedScheduleRestriction); } break; case nameof(ViewModel.SelectedCommonDistrictRuleItem): if (ViewModel.SelectedCommonDistrictRuleItem != null) { ytreeCommonRulePrices.SelectObject(ViewModel.SelectedCommonDistrictRuleItem); } break; case nameof(ViewModel.SelectedWeekDayDistrictRuleItem): if (ViewModel.SelectedWeekDayDistrictRuleItem != null) { ytreeWeekDayRulePrices.SelectObject(ViewModel.SelectedWeekDayDistrictRuleItem); } break; case nameof(ViewModel.SelectedDistrictBorderVertices): verticeOverlay.Clear(); if (ViewModel.SelectedDistrictBorderVertices != null) { GMapPolygon polygon = new GMapPolygon(ViewModel.SelectedDistrictBorderVertices.ToList(), "polygon"); polygon.Stroke = selectedDistrictBorderPen; verticeOverlay.Polygons.Add(polygon); } break; case nameof(ViewModel.NewBorderVertices): verticeOverlay.Clear(); if (ViewModel.NewBorderVertices != null && ViewModel.NewBorderVertices.Any()) { for (int i = 0; i < ViewModel.NewBorderVertices.Count; i++) { var color = GMarkerGoogleType.red; if (i == 0) { color = GMarkerGoogleType.yellow; } else if (i == ViewModel.NewBorderVertices.Count - 1) { color = GMarkerGoogleType.green; } GMapMarker point = new GMarkerGoogle(ViewModel.NewBorderVertices[i], color); verticeOverlay.Markers.Add(point); } if (toggleNewBorderPreview.Active) { toggleNewBorderPreview.Active = false; toggleNewBorderPreview.Active = true; } } break; } }); }; }