예제 #1
0
 public void Release(TabletReference tablet, IDeviceReport report)
 {
     if (Enum.TryParse <MouseButton>(Button, true, out var mouseButton))
     {
         Pointer?.MouseUp(mouseButton);
     }
 }
예제 #2
0
 private void PostDebugReport(TabletReference tablet, IDeviceReport report)
 {
     if (report != null && tablet != null)
     {
         DeviceReport?.Invoke(this, new DebugReportData(tablet, report));
     }
 }
예제 #3
0
 public void Release(TabletReference tablet, IDeviceReport report)
 {
     if (!string.IsNullOrWhiteSpace(Key))
     {
         Keyboard.Release(Key);
     }
 }
예제 #4
0
        public T Construct <T>(IServiceManager provider, TabletReference tabletReference = null) where T : class
        {
            var obj = Construct <T>(tabletReference, false);

            PluginManager.Inject(provider, obj);
            TriggerEventMethods(obj, tabletReference);
            return(obj);
        }
예제 #5
0
        private void HandleTabletReport(TabletReference tablet, PenSpecifications pen, ITabletReport report)
        {
            float pressurePercent = (float)report.Pressure / (float)pen.MaxPressure * 100f;

            if (report is IEraserReport eraserReport && eraserReport.Eraser)
            {
                Eraser?.Invoke(tablet, report, pressurePercent);
            }
 public void Invoke(TabletReference tablet, IDeviceReport report)
 {
     if (report is ITabletReport tabletReport)
     {
         float pressure = (float)tabletReport.Pressure / (float)tablet.Properties.Specifications.Pen.MaxPressure;
         bool  isEraser = report is IEraserReport eraserReport ? eraserReport.Eraser : false;
         Tablet.SetPressure(pressure, isEraser);
     }
 }
        public Area Convert(TabletReference tablet, double w, double h, double x, double y)
        {
            double conversionFactor = XP_PEN_AREA_CONSTANT;
            var    width            = w / conversionFactor;
            var    height           = h / conversionFactor;
            var    offsetX          = (width / 2) + (x / conversionFactor);
            var    offsetY          = (height / 2) + (y / conversionFactor);

            return(new Area((float)width, (float)height, new Vector2((float)offsetX, (float)offsetY), 0f));
        }
예제 #8
0
        private void HandleTabletReport(TabletReference tablet, PenSpecifications pen, ITabletReport report)
        {
            float pressurePercent = (float)report.Pressure / (float)pen.MaxPressure * 100f;

            if (report is IEraserReport eraserReport && eraserReport.Eraser)
            {
                bool threshold = pressurePercent > EraserActivationPressure;
                InvokeBinding(tablet, report, EraserBinding, EraserState, threshold);
                EraserState = threshold;
            }
예제 #9
0
 public void Invoke(TabletReference tablet, IDeviceReport report)
 {
     if (report is ITabletReport tabletReport)
     {
         float pressure = (float)tabletReport.Pressure / (float)tablet.Properties.Specifications.Pen.MaxPressure;
         Tablet.SetPressure(pressure);
         Tablet.SetButtonState(0, tabletReport.PenButtons[0]);
         Tablet.SetButtonState(1, tabletReport.PenButtons[1]);
     }
 }
예제 #10
0
        public Area Convert(TabletReference tablet, double top, double left, double bottom, double right)
        {
            double conversionFactor = GetConversionFactor(tablet);
            var    width            = (right - left) / conversionFactor;
            var    height           = (bottom - top) / conversionFactor;
            var    offsetX          = (width / 2) + (left / conversionFactor);
            var    offsetY          = (height / 2) + (top / conversionFactor);

            return(new Area((float)width, (float)height, new Vector2((float)offsetX, (float)offsetY), 0f));
        }
예제 #11
0
        public Area Convert(TabletReference tablet, double up, double left, double down, double right)
        {
            var digitizer = tablet.Properties.Specifications.Digitizer;

            var width   = (right - left) * digitizer.Width;
            var height  = (down - up) * digitizer.Height;
            var offsetX = (width / 2) + (left * digitizer.Width);
            var offsetY = (height / 2) + (up * digitizer.Height);

            return(new Area((float)width, (float)height, new Vector2((float)offsetX, (float)offsetY), 0f));
        }
        protected override void HandleTabletReference(TabletReference tabletReference)
        {
            var digitizer = tabletReference.Properties.Specifications.Digitizer;

            this.mmScale = new Vector3
            {
                X = digitizer.Width / digitizer.MaxX,
                Y = digitizer.Height / digitizer.MaxY,
                Z = 1  // passthrough
            };
        }
예제 #13
0
        public T Construct <T>(TabletReference tabletReference = null, bool trigger = true) where T : class
        {
            var obj = AppInfo.PluginManager.ConstructObject <T>(Path);

            ApplySettings(obj);
            if (trigger)
            {
                TriggerEventMethods(obj, tabletReference);
            }
            return(obj);
        }
예제 #14
0
        public virtual void Invoke(TabletReference tablet, IDeviceReport report, bool newState)
        {
            if (Binding is IStateBinding stateBinding)
            {
                if (newState && !PreviousState)
                {
                    stateBinding.Press(tablet, report);
                }
                else if (!newState && PreviousState)
                {
                    stateBinding.Release(tablet, report);
                }
            }

            PreviousState = newState;
        }
예제 #15
0
        public void HandleBinding(TabletReference tablet, IDeviceReport report)
        {
            if (tablet == null)
            {
                return;
            }

            var pen = tablet.Properties.Specifications.Pen;

            if (report is ITabletReport tabletReport && pen.ActiveReportID.IsInRange(tabletReport.ReportID))
            {
                HandleTabletReport(tablet, pen, tabletReport);
            }
            if (report is IAuxReport auxReport)
            {
                HandleAuxiliaryReport(tablet, auxReport);
            }
        }
예제 #16
0
        private void Select(TabletReference tablet)
        {
            if (tablet.Identifiers?.FirstOrDefault()?.VendorID is int vendorId)
            {
                var vendor = (DeviceVendor)vendorId;
                converterList.Select(t => t.Vendor.HasFlag(vendor));
                applyButton.Enabled = true;
                selectedTablet      = tablet;
            }
            else
            {
                // Deselect if no tablet is detected
                converterList.SelectedIndex = -1;
                selectedTablet = null;

                MessageBox.Show("No tablet detected.", MessageBoxType.Error);
                this.Close();
            }
        }
예제 #17
0
        public void HandleBinding(TabletReference tablet, IDeviceReport report)
        {
            if (tablet == null)
            {
                return;
            }

            if (report is ITabletReport tabletReport)
            {
                HandleTabletReport(tablet, tablet.Properties.Specifications.Pen, tabletReport);
            }
            if (report is IAuxReport auxReport)
            {
                HandleAuxiliaryReport(tablet, auxReport);
            }
            if (report is IMouseReport mouseReport)
            {
                HandleMouseReport(tablet, mouseReport);
            }
        }
        public void Invoke(TabletReference tablet, IDeviceReport report, float value)
        {
            bool newState = value > ActivationThreshold;

            if (report is ITabletReport tabletReport)
            {
                if (!newState)
                {
                    tabletReport.Pressure = 0;
                }
                else // remap pressure when beyond threshold
                {
                    var maxPressure      = tablet.Properties.Specifications.Pen.MaxPressure;
                    var remappedPressure = (value - ActivationThreshold) / (100f - ActivationThreshold);
                    tabletReport.Pressure = (uint)(maxPressure * remappedPressure);
                }
            }

            base.Invoke(tablet, report, newState);
        }
예제 #19
0
        protected double GetConversionFactor(TabletReference tablet)
        {
            var digitizer = tablet.Properties.Specifications.Digitizer;

            return(digitizer.MaxX / digitizer.Width);
        }
예제 #20
0
        private void SetBindingHandlerCollectionSettings(IServiceManager serviceManager, PluginSettingStoreCollection collection, Dictionary <int, BindingState?> targetDict, TabletReference tabletReference)
        {
            for (int index = 0; index < collection.Count; index++)
            {
                var binding = collection[index]?.Construct <IBinding>(serviceManager, tabletReference);
                var state   = binding == null ? null : new BindingState
                {
                    Binding = binding
                };

                if (!targetDict.TryAdd(index, state))
                {
                    targetDict[index] = state;
                }
            }
        }
예제 #21
0
        private void SetBindingHandlerSettings(InputDeviceTree dev, IOutputMode outputMode, BindingSettings settings, TabletReference tabletReference)
        {
            string group          = dev.Properties.Name;
            var    bindingHandler = new BindingHandler(outputMode);

            var    bindingServiceProvider = new ServiceManager();
            object?pointer = outputMode switch
            {
                AbsoluteOutputMode absoluteOutputMode => absoluteOutputMode.Pointer,
                RelativeOutputMode relativeOutputMode => relativeOutputMode.Pointer,
                  _ => null
            };

            if (pointer is IMouseButtonHandler mouseButtonHandler)
            {
                bindingServiceProvider.AddService(() => mouseButtonHandler);
            }

            var tip = bindingHandler.Tip = new ThresholdBindingState
            {
                Binding = settings.TipButton?.Construct <IBinding>(bindingServiceProvider, tabletReference),

                ActivationThreshold = settings.TipActivationThreshold
            };

            if (tip.Binding != null)
            {
                Log.Write(group, $"Tip Binding: [{tip.Binding}]@{tip.ActivationThreshold}%");
            }

            var eraser = bindingHandler.Eraser = new ThresholdBindingState
            {
                Binding             = settings.EraserButton?.Construct <IBinding>(bindingServiceProvider, tabletReference),
                ActivationThreshold = settings.EraserActivationThreshold
            };

            if (eraser.Binding != null)
            {
                Log.Write(group, $"Eraser Binding: [{eraser.Binding}]@{eraser.ActivationThreshold}%");
            }

            if (settings.PenButtons != null && settings.PenButtons.Any(b => b?.Path != null))
            {
                SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.PenButtons, bindingHandler.PenButtons, tabletReference);
                Log.Write(group, $"Pen Bindings: " + string.Join(", ", bindingHandler.PenButtons.Select(b => b.Value?.Binding)));
            }

            if (settings.AuxButtons != null && settings.AuxButtons.Any(b => b?.Path != null))
            {
                SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.AuxButtons, bindingHandler.AuxButtons, tabletReference);
                Log.Write(group, $"Express Key Bindings: " + string.Join(", ", bindingHandler.AuxButtons.Select(b => b.Value?.Binding)));
            }

            if (settings.MouseButtons != null && settings.MouseButtons.Any(b => b?.Path != null))
            {
                SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.MouseButtons, bindingHandler.MouseButtons, tabletReference);
                Log.Write(group, $"Mouse Button Bindings: [" + string.Join("], [", bindingHandler.MouseButtons.Select(b => b.Value?.Binding)) + "]");
            }

            var scrollUp = bindingHandler.MouseScrollUp = new BindingState
            {
                Binding = settings.MouseScrollUp?.Construct <IBinding>(bindingServiceProvider, tabletReference)
            };

            var scrollDown = bindingHandler.MouseScrollDown = new BindingState
            {
                Binding = settings.MouseScrollDown?.Construct <IBinding>(bindingServiceProvider, tabletReference)
            };

            if (scrollUp.Binding != null || scrollDown.Binding != null)
            {
                Log.Write(group, $"Mouse Scroll: Up: [{scrollUp?.Binding}] Down: [{scrollDown?.Binding}]");
            }
        }
예제 #22
0
        private void SetOutputModeSettings(InputDeviceTree dev, IOutputMode outputMode, Profile profile, TabletReference tabletReference)
        {
            string group = dev.Properties.Name;

            outputMode.Tablet = dev;

            var elements = from store in profile.Filters
                           where store.Enable == true
                           let filter = store.Construct <IPositionedPipelineElement <IDeviceReport> >(tabletReference)
                                        where filter != null
                                        select filter;

            outputMode.Elements = elements.ToList();

            if (outputMode.Elements != null && outputMode.Elements.Count > 0)
            {
                Log.Write(group, $"Filters: {string.Join(", ", outputMode.Elements)}");
            }
        }
예제 #23
0
 public DebugReportData(TabletReference tablet, IDeviceReport report)
 {
     this.Tablet = tablet;
     this.Data   = JToken.FromObject(report);
     this.Path   = report.GetType().FullName;
 }
예제 #24
0
 public void Press(TabletReference tablet, IDeviceReport report)
 {
     SetState(true);
 }
예제 #25
0
 public void SetData(DebugReportData data)
 {
     this.data   = data;
     this.tablet = data.Tablet;
 }
예제 #26
0
 public Profile this[TabletReference tablet]
 {
     set => SetProfile(tablet, value);
예제 #27
0
 public void Release(TabletReference tablet, IDeviceReport report)
 {
     SetState(false);
 }