diff --git a/arty.pyw b/arty.pyw new file mode 100644 index 0000000..3823d94 --- /dev/null +++ b/arty.pyw @@ -0,0 +1,125 @@ +import sys +import winput +from PySide2.QtCore import Qt +from PySide2.QtWidgets import QApplication, QMainWindow, QRadioButton, QGroupBox +from PySide2.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget, QLabel, QSpinBox +from PySide2.QtWidgets import QAction +from PySide2.QtGui import QIcon + +WM_MOUSEWHEEL = 0x020A # mouse wheel moved + +class ArtyWidget(QWidget): + + def __init__(self, parent=None): + super().__init__(parent) + + self.radio_type1 = QRadioButton("Type 1: MILRAD 622 - 978") + self.radio_type2 = QRadioButton("Type 2: MILRAD 800 - 1120") + + gbox_layout = QVBoxLayout() + gbox_layout.addWidget(self.radio_type1) + gbox_layout.addWidget(self.radio_type2) + + self.gbox = QGroupBox("Settings (Ctrl+H to hide the window bar)") + self.gbox.setLayout(gbox_layout) + + self.target_range = QSpinBox() + self.target_range.setMinimum(100) + self.target_range.setMaximum(1600) + self.elevation = QSpinBox() + self.elevation.setReadOnly(True) + + font = self.elevation.font() + font.setPointSize(14) + self.target_range.setFont(font) + self.elevation.setFont(font) + + self.radio_type1.toggled.connect(self.toggle_type) + self.radio_type1.setChecked(True) + self.target_range.valueChanged.connect(self.update_elevation) + + layout = QHBoxLayout() + layout.addWidget(QLabel("Range:")) + layout.addWidget(self.target_range) + layout.addWidget(QLabel("Elevation:")) + layout.addWidget(self.elevation) + + main_layout = QVBoxLayout() + main_layout.addWidget(self.gbox) + main_layout.addLayout(layout) + + self.setLayout(main_layout) + + def toggle_type(self): + if self.radio_type1.isChecked(): + self.elevation.setMinimum(622) + self.elevation.setMaximum(978) + else: + self.elevation.setMinimum(800) + self.elevation.setMaximum(1120) + + self.update_elevation(self.target_range.value()) + + def update_elevation(self, value): + x0, x1 = 100, 1600 + if self.radio_type1.isChecked(): + y0, y1 = 978, 622 + else: + y0, y1 = 1120, 800 + + elevation = round(self.interpolator(value, x0, x1, y0, y1)) + self.elevation.setValue(elevation) + + def interpolator(self, x, x0, x1, y0, y1): + return y0 + (y1 - y0) * (x - x0) / (x1 - x0) + + def increment_range(self, mouse_event): + if mouse_event.action == WM_MOUSEWHEEL: + if not self.isActiveWindow(): + current_range = self.target_range.value() + increment = mouse_event.additional_data + self.target_range.setValue(current_range + increment) + + +class ArtyGUI(QMainWindow): + def __init__(self, parent=None): + super().__init__(parent) + self.arty_widget = ArtyWidget(self) + + self.setCentralWidget(self.arty_widget) + self.setWindowTitle("Arty") + self.setWindowIcon(QIcon("icon.png")) + self.setWindowFlag(Qt.WindowStaysOnTopHint) + self.resize(150, 20) + + self.hideBarAction = QAction('&Hide Window Bar', self) + self.hideBarAction.setShortcut('Ctrl+H') + self.hideBarAction.triggered.connect(self.hide_bar) + self.addAction(self.hideBarAction) + + self.quitAction = QAction('&Quit', self) + self.quitAction.setShortcut('Ctrl+Q') + self.quitAction.triggered.connect(qApp.quit) + self.addAction(self.quitAction) + + self.arty_widget.target_range.setFocus() + + def hide_bar(self): + self.setWindowFlag(Qt.FramelessWindowHint) + self.arty_widget.gbox.setTitle("Settings (Ctrl+Q to quit)") + self.show() + self.arty_widget.target_range.setFocus() + + def wheelEvent(self, event): + self.arty_widget.target_range.event(event) + + +if __name__ == "__main__": + app = QApplication(sys.argv) + + arty_gui = ArtyGUI() + arty_gui.show() + + winput.hook_mouse(arty_gui.arty_widget.increment_range) + + sys.exit(app.exec_()) diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..0c9f7eb Binary files /dev/null and b/icon.png differ