diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a74dc6076 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.idea/ +KlipperScreen.conf +__pycache__/ +*.py[cod] +*$py.class +dist/ +build/ +venv/ diff --git a/README.md b/README.md index 2362d9e00..546112910 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # KlipperScreen -## Z-BoltUI -KlipperScreen is touchscreen GUI for Klipper based 3D printers. KlipperScreen interfaces with [Klipper](https://github.com/kevinOConnor/klipper) via [Moonraker](https://github.com/arksine/moonraker). + +KlipperScreen is a touchscreen GUI that interfaces with [Klipper](https://github.com/kevinOConnor/klipper) via [Moonraker](https://github.com/arksine/moonraker). It can switch between multiple printers to access them from a single location, and it doesn't even need to run on the same host, you can install it on another device and configure the IP address to access the printer. + +### Documentation [![Documentation Status](https://readthedocs.org/projects/klipperscreen/badge/?version=latest)](https://klipperscreen.readthedocs.io/en/latest/?badge=latest) + +[Click here to access the documentation.](https://klipperscreen.readthedocs.io/en/latest/) + +### Inspiration +KlipperScreen was inspired by [OctoScreen](https://github.com/Z-Bolt/OctoScreen/) and the need for a touchscreen GUI that +will natively work with [Klipper](https://github.com/kevinOConnor/klipper) and [Moonraker](https://github.com/arksine/moonraker). + +[![Main Menu](docs/img/panels/main_panel.png)](https://klipperscreen.readthedocs.io/en/latest/Panels/) + +[More Screenshots](https://klipperscreen.readthedocs.io/en/latest/Panels/) \ No newline at end of file diff --git a/docs/Changelog.md b/docs/Changelog.md new file mode 100644 index 000000000..a2a77bd43 --- /dev/null +++ b/docs/Changelog.md @@ -0,0 +1,27 @@ +# Changelog + +Breaking changes will be listed here. + +#### [2022 03 21](https://github.com/jordanruthe/KlipperScreen/commit/bc34b3c8d6761c27a0b0c62fc4dfa11442b417f6) +* Default configuration is now merged again. +Fixing [2021 05 20](https://github.com/jordanruthe/KlipperScreen/commit/eb801486928bf02709033dcbc5f0a45ca43b23c1) + +#### [2022 03 10](https://github.com/jordanruthe/KlipperScreen/commit/490dc929bd11e3c4200b999ce7204d84fa0bc184) +* The "Power On Printer" button now requires power_devices under the printer section in KlipperScreen.conf +the power_devices allowed are those defined in the config of moonraker of the printer +The "Power" panel will be in the Menu if there are power devices found + +#### [2022 03 01](https://github.com/jordanruthe/KlipperScreen/commit/49ab84e8d51535d3469d97fdee53099cca6abc39) +* The "Power On Printer" button now requires that the printer name in KlipperScreen.conf +and the power device in moonraker.conf to have the same name. +The "Power" panel will be in the Menu if there are power devices found + +#### [2022 01 11](https://github.com/jordanruthe/KlipperScreen/commit/8a8c6c064cc6d097b1b34a5c42b4001367e545a6) +* The Preheat panel has been deprecated in favor of an all in one Temperature panel + +Remove preheat panel from your Klipperscreen.conf or replace the occurrences of preheat with temperature + +#### [2021 05 20](https://github.com/jordanruthe/KlipperScreen/commit/eb801486928bf02709033dcbc5f0a45ca43b23c1) +* Default configuration is not merged if a user configuration is set for a specific option + +For instance, if `menu __main` is user defined, the main menu will not have any defaults. diff --git a/docs/Configuration.md b/docs/Configuration.md index 58f97a916..da9d241f5 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -1,42 +1,30 @@ # Configuration -The configuration options are outlined below: +Usually you don't need to create a configuration file, but if you need to change something that is not changeable in the UI +create a blank file in `~/klipper_config/KlipperScreen.conf`, if the file already exist then just edit it. -KlipperScreen will search for a configuration file in the following order: - -1. _~/KlipperScreen.conf_ -2. _${KlipperScreen_Directory}/KlipperScreen.conf_ -3. _~/klipper_config/KlipperScreen.conf_ - -If one of those files are found, it will be used over the default configuration. The default configuration will be -merged with the custom configuration, so if you do not define any menus the default menus will be used. - -The default config is included here: (do not edit use as reference) -_${KlipperScreen_Directory}/ks_includes/default.conf_ - -If no config file is found then a new configuration file will be created in: -_~/klipper_config/KlipperScreen.conf_ Or _~/KlipperScreen.conf_ +Write in the file only the options that need to be changed, and restart KlipperScreen. ## Include files -``` +```py [include conf.d/*.conf] # Include another configuration file. Wildcards (*) will expand to match anything. ``` ## Main Options -``` +```py [main] # Invert axis in move panel. Default is False. Change to true to invert invert_x: False invert_y: False invert_z: False -# Time (seconds) before the Job Status page reverts to main menu after a successful job -job_complete_timeout: 30 +# Time in seconds before the Job Status page closes itself after a successful job/print +# 0 means disabled +job_complete_timeout: 0 -# Time (seconds) before the Job Status page reverts to main menu after a successful job. -# If this option is 0, the user must click on a button to go back to the main menu. +# Time in seconds before the Job Status closes itself if an error is encountered job_error_timeout: 0 # Specify the language @@ -45,11 +33,22 @@ language: en # Allows the cursor to be displayed on the screen show_cursor: False + +# Allows to define custom systemctl command for restart like xrdp +service: KlipperScreen + +# If multiple printers are defined, this can be set the name of the one to show at startup. +default_printer: Ender 3 Pro + +# To define a full set of custom menues (instead of merging user entries with default entries) +# set this to False. See Menu section below. +use_default_menu: True + ``` ## Printer Options Multiple printers can be defined -``` +```py # Define printer and name. Name is anything after the first printer word [printer Ender 3 Pro] # Define the moonraker host/port if different from 127.0.0.1 and 7125 @@ -60,11 +59,40 @@ moonraker_api_key: False # Define the z_babystep intervals in a CSV list. Currently only 2 are supported z_babystep_values: 0.01, 0.05 -``` +# Override the movement speed and set a specific for this printer. +# These setting overrides the settings configured in the UI. If specified, +# the values configured in the UI will not be used. +move_speed_xy: 500 +move_speed_z: 300 + +# Define one or more moonraker power devices that turn on this printer (CSV list) +# Default is the printer name +power_devices: example1, example2 + +# Define what items should be shown in titlebar besides the extruder and bed +# the name must be the same as defined in the klipper config +# valid options are temperature_sensors or temperature_fans, or heater_generic +titlebar_items: chamber, MCU, Pi + +# The style of the user defined items in the titlebar +# Can be 'full' indicating that the full name is shown, 'short' for the first letter, or None (default) for no name +titlebar_name_type: None + +# Z probe calibrate position +# By default is the middle of the bed +calibrate_x_position: 100 +calibrate_y_position: 100 + +# Screen DPMS +# By default DPMS is used to turn off the screen, this should prevent burn-in and save power. +# However if you find that your screen doesn't turn off because it doesn't support it +# Setting this to false will just turn the screen black. +use_dpms: True +``` ## Preheat Options -``` +```py [preheat my_temp_setting] # Temperature for the heated bed bed: 40 @@ -72,10 +100,28 @@ bed: 40 extruder: 195 # Temperature for generic heaters heater_generic: 40 +# Temperature controlled fans (temperature_fan in klipper config) +temperature_fan: 40 # optional GCode to run when the option is selected gcode: MY_HEATSOAK_MACRO ``` +There is a special preheat setting named cooldown to do additional things when the _cooldown_ button is pressed +for example: + +```py +[preheat cooldown] +gcode: M107 +``` + +## Bed Screws +```py +[bed_screws] +# Rotation is useful if the screen is not directly in front of the machine. +# Valid values are 0 90 180 270 +rotation: 0 +``` + ## Menu This allows a custom configuration for the menu displayed while the printer is idle. You can use sub-menus to group different items and there are several panel options available. It is possible to have a gcode script run on a menu @@ -83,7 +129,7 @@ button press. There are two menus available in KlipperScreen, __main and __print printer is idle. The __print menu is accessible from the printing status page. A menu item is configured as follows: -``` +```py [menu __main my_menu_item] # To build a sub-menu of this menu item, you would next use [menu __main my_menu_item sub_menu_item] name: Item Name @@ -99,10 +145,10 @@ params: {"script":"G28 X"} # Available variables are listed below. enable: {{ printer.power_devices.count > 0 }} ``` -Available panels are listed here: [docs/panels.md](panels.md) +Available panels are listed here: [docs/panels.md](Panels.md) Certain variables are available for conditional testing of the enable statement: -``` +```py printer.bltouch # Available if bltouch section defined in config printer.gcode_macros.count # Number of gcode macros printer.idle_timeout # Idle timeout section @@ -113,7 +159,7 @@ printer.power_devices.count # Number of power devices configured in Moonraker A sample configuration of a main menu would be as follows: -``` +```py [menu __main homing] name: Homing icon: home @@ -134,3 +180,25 @@ icon: home method: printer.gcode.script params: {"script":"G28"} ``` + +## KlipperScreen behaviour towards configuration + +KlipperScreen will search for a configuration file in the following order: + +1. _~/KlipperScreen.conf_ +2. _${KlipperScreen_Directory}/KlipperScreen.conf_ +3. _~/klipper_config/KlipperScreen.conf_ + +If you need a custom location for the configuration file, you can add -c or --configfile to the systemd file and specify +the location of your configuration file. + +If one of those files are found, it will be merged with the default configuration. +Default Preheat options will be discarded if a custom preheat is found. +If include files are defined then, they will be merged first. + +The default config is included here: (do not edit use as reference) +_${KlipperScreen_Directory}/ks_includes/default.conf_ + +Preferably *do not* copy the entire default.conf file, just configure the settings needed. + +If no config file is found, then when a setting is changed in the settings panel, a new configuration file will be created automatically. diff --git a/docs/Contact.md b/docs/Contact.md index e059c4210..2de0babe1 100644 --- a/docs/Contact.md +++ b/docs/Contact.md @@ -8,6 +8,4 @@ You may submit a GitHub issue request for any problems you are having. ## Klipper Community Discord -The invite link: https://discord.klipper3d.org/ - -Look for the channel `#klipper-screen` +[Look for the channel `#klipper-screen`](https://discord.klipper3d.org/) diff --git a/docs/Hardware.md b/docs/Hardware.md index e7dd2bc80..9e67d0e77 100644 --- a/docs/Hardware.md +++ b/docs/Hardware.md @@ -1,9 +1,6 @@ # Hardware -There are no recommended screens, but here are some guidelines: - -* There is no support for vertical/portrait mode, only widescreen -* Minimum resolution of 480x320 +There are no recommended screens, but the minimum supported resolution is 480x320 #### Hardware known to work @@ -14,68 +11,64 @@ There are no recommended screens, but here are some guidelines: * [3.5" RPi Display](http://www.lcdwiki.com/3.5inch_RPi_Display) * [5" HDMI Display-B](http://lcdwiki.com/5inch_HDMI_Display-B) * [VoCore](https://klipper.discourse.group/t/hardware-known-to-work-with-klipperscreen/35/7) -* [Android Phone](https://klipper.discourse.group/t/hardware-known-to-work-with-klipperscreen/35/8) +* [Android Phone](https://klipper.discourse.group/t/how-to-klipperscreen-on-android-smart-phones/1196) * [WAVESHARE 4.3 inch DSI LCD](https://www.waveshare.com/4.3inch-dsi-lcd.htm) * [DFrobot DFR0550](https://wiki.dfrobot.com/5%27%27TFT-Display_with_Touchscreen_V1.0_SKU_DFR0550) * [More known hardware in the klipper discourse](https://klipper.discourse.group/t/hardware-known-to-work-with-klipperscreen/35) -#### Configuration +### Configuration Follow the manufacturer instructions on how to install your screen. In general if you see a white screen, then it's not properly installed, ensure that you at least see a console, Then ![install](Installation.md) KlipperScreen, if you are having troubles refer to the ![troubleshooting page](Troubleshooting.md) for further information. -#### Touchscreen Calibration -Most people don't need to calibrate, but if you do need to calibrate your touchscreen, follow the below steps. -Run this command: -``` -DISPLAY=:0 xinput_calibrator --list -``` -It will output something such as: -``` -Device "wch.cn USB2IIC_CTP_CONTROL" id=6 +## Touchscreen touch rotation +If your touchscreen isn't registering touches properly after the screen has been rotated, you will need to apply a +transformation matrix. + +First you will need your device name, on a terminal run: + +```sh +DISPLAY=:0 xinput ``` -Find the ID of your display and put it in the following command: +Output: +```sh +⎡ Virtual core pointer id=2 [master pointer (3)] +⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] +⎜ ↳ ADS7846 Touchscreen id=6 [slave pointer (2)] +⎣ Virtual core keyboard id=3 [master keyboard (2)] + ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ``` -DISPLAY=:0 xinput_calibrator -v --device +In this case the device is the ADS7846 Touchscreen, yours may be different + +You can test a change by running: + +```sh +DISPLAY=:0 xinput set-prop "" 'Coordinate Transformation Matrix' ``` -#### Touchscreen touch rotation -If your touchscreen isn't registering touches properly after the screen has been rotated, you will need to apply a -transformation matrix. You can have the matrix be one of the following: +Where the matrix can be one of the following options: * 0°: `1 0 0 0 1 0 0 0 1` * 90° Clockwise: `0 -1 1 1 0 0 0 0 1` * 90° Counter-Clockwise: `0 1 0 -1 0 1 0 0 1` -* 180°: `-1 0 1 0 -1 1 0 0 1` +* 180° (Inverts X and Y): `-1 0 1 0 -1 1 0 0 1` +* invert Y: `-1 0 1 1 1 0 0 0 1` +* invert X: `-1 0 1 0 1 0 0 0 1` -To check the current matrix, you will need your `` -(which can be found via the last section, ex: "wch.cn USB2IIC_CTP_CONTROL"). -Run the following command: `xinput list-props "wch.cn USB2IIC_CTP_CONTROL"` +For example: -It will output something such as: +```sh +DISPLAY=:0 xinput set-prop "ADS7846 Touchscreen" 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1 ``` -Device '': - Device Enabled (115): 1 - Coordinate Transformation Matrix (116): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 - libinput Calibration Matrix (247): -1.000000, 0.000000, 1.000000, 0.000000, -1.000000, 1.000000, 0.000000, 0.000000, 1.000000 - libinput Calibration Matrix Default (248): -1.000000, 0.000000, 1.000000, 0.000000, -1.000000, 1.000000, 0.000000, 0.000000, 1.000000 - libinput Send Events Modes Available (249): 1, 0 - libinput Send Events Mode Enabled (250): 0, 0 - libinput Send Events Mode Enabled Default (251): 0, 0 - Device Node (252): "/dev/input/event0" - Device Product ID (253): 6790, 58083 -``` - -You can verify by checking that the 'Coordinate Transformation Matrix' or 'libinput Calibration Matrix'. - -You can test a change by running: `xinput set-prop "" 'Coordinate Transformation Matrix' ` - -Replace matrix with one of the options above, such as: `1 0 0 0 1 0 0 0 1` To make this permanent, modify the file `/etc/udev/rules.d/51-touchscreen.rules` and add following line: +```sh +ACTION=="add", ATTRS{name}=="", ENV{LIBINPUT_CALIBRATION_MATRIX}="" ``` -ACTION=="add", ATTRS{name}=="", ENV{LIBINPUT_CALIBRATION_MATRIX}="" -``` +More info about input transformation can be found in: + +* [Ubuntu wiki InputCoordinateTransformation](https://wiki.ubuntu.com/X/InputCoordinateTransformation) +* [Libinput docs](https://wayland.freedesktop.org/libinput/doc/1.9.0/absolute_axes.html) diff --git a/docs/Installation.md b/docs/Installation.md index 80eb35cbd..c2bffb3c9 100644 --- a/docs/Installation.md +++ b/docs/Installation.md @@ -1,43 +1,42 @@ # Installation -#### Setup Raspberry Pi -This install process is meant for Raspbian non-desktop version aka Raspbian Lite. +## First steps -If you have installed it on the GUI version, then use `sudo raspi-config` to set boot to console by choosing the following options in order: +Install the screen, following the instructions provided by the manufacturer, Some screens don't neeed extra software but some need to be installed with a script. +It's strongly recommended to test it and ensure your hardware is working with Raspbian, Ubuntu or any distro you like. +Once you stablished that the screen is working, then proceed installing KlipperScreen. -* 1 System Options - * S5 Boot / Auto Login - * B1 Console +## Setup Raspberry Pi +This install process is meant for Raspbian non-desktop version aka Raspbian Lite, but it works on other versions. -#### Klipper and Moonraker Installation +If you want to use it on Raspbian desktop (GUI version), then use `sudo raspi-config` to set boot to console by choosing the following options in order: -Follow the instructions to install Klipper and Moonraker. -* klipper: https://www.klipper3d.org/Installation.html -* moonraker: https://moonraker.readthedocs.io/en/latest/installation/ - -Ensure that 127.0.0.1 is a trusted client for moonraker, such as in this example: -``` -[authorization] -trusted_clients: - 127.0.0.1 +```sh +1System Options +└──S5 Boot / Auto Login + └──B1 Console ``` -Warning: `force_logins: true` is not supported -If you wish to use the update manager feature of moonraker for KlipperScreen, add the following block into the moonraker -configuration: -``` -[update_manager KlipperScreen] -type: git_repo -path: ~/KlipperScreen -origin: https://github.com/jordanruthe/KlipperScreen.git -env: ~/.KlipperScreen-env/bin/python -requirements: scripts/KlipperScreen-requirements.txt -install_script: scripts/KlipperScreen-install.sh -``` +!!! note + Other distros will be different on how to boot to console. + +## Auto install + +[KIAUH](https://github.com/th33xitus/kiauh) is a tool that helps you install or upgrade Klipper, Moonraker, Mainsail, and other extensions. + +![Screenshot](img/install/KIAUH.png) + +You can visit [KIAUH on GitHub](https://github.com/th33xitus/kiauh) to learn more and view its documentation. + + +## Manual Install -#### KlipperScreen Installation +First install [Klipper](https://www.klipper3d.org/Installation.html) and [Moonraker](https://moonraker.readthedocs.io/en/latest/installation/). + +### KlipperScreen Installation Execute the following commands: -``` + +```sh cd ~/ git clone https://github.com/jordanruthe/KlipperScreen.git cd ~/KlipperScreen @@ -45,9 +44,35 @@ cd ~/KlipperScreen ``` This script will install packages that are listed under manual install, create a python virtual environment at -~/.KlipperScreen-env and install a systemd service file. +`~/.KlipperScreen-env` and install a systemd service file. If you need a custom location for the configuration file, you can add -c or --configfile to the systemd file and specify the location of your configuration file. -At this point KlipperScreen should be working, check out the [hardware page](Hardware.md) if you still haven't installed the screen, or head to the [troubleshooting page](Troubleshooting.md) if you are having problems +At this point KlipperScreen should be working, if it doesn't start then go to the [troubleshooting page](Troubleshooting.md) + +## Moonraker configuration + +In moonraker.conf ensure that 127.0.0.1 is a trusted client: + +```py +[authorization] +trusted_clients: + 127.0.0.1 +``` +!!! warning + `force_logins: true` requires the moonraker api key in [KlipperScreen.conf](Configuration.md) + +If you wish to use the update manager feature of moonraker for KlipperScreen, add the following block to the moonraker.conf: + +```py +[update_manager KlipperScreen] +type: git_repo +path: ~/KlipperScreen +origin: https://github.com/jordanruthe/KlipperScreen.git +env: ~/.KlipperScreen-env/bin/python +requirements: scripts/KlipperScreen-requirements.txt +install_script: scripts/KlipperScreen-install.sh +``` +!!! note + If you see warnings in other UIs ignore them until KlipperScreen finishes installing. diff --git a/docs/Panels.md b/docs/Panels.md new file mode 100644 index 000000000..a1807ce5d --- /dev/null +++ b/docs/Panels.md @@ -0,0 +1,115 @@ +# Panels + +### Main Menu +![Main Menu](img/panels/main_panel.png) + +### Job Status +```py +panel: job_status +``` +![Job Status](img/panels/job_status.png) + +### Bed Level +```py +panel: bed_level +``` +![Bed Level](img/panels/bed_level.png) + +The bed level panel has the ability to have preset locations from Klipper. Please see documentation on the following +Klipper Sections: +* [bed_screws](https://www.klipper3d.org/Config_Reference.html#bed_screws) +* [screws_tilt_adjust](https://www.klipper3d.org/Config_Reference.html#screws_tilt_adjust) + +_Important Note: Due to Klipper using the bltouch/probe offsets in screws_tilt_adjust, if a bltouch/probe is enabled_ +_KlipperScreen will add the offset to the defined screw values. This will not occur if bed_screws section is used._ + +This panel will favor screws_tilt_adjust over the bed_screws section. If screws_tilt_adjust is defined, an extra button +for _Screws Calibrate_ will appear. This button runs the SCREWS_TILT_CALCULATE command and shows the results on the +panel. + +### Bed Mesh +```py +panel: bed_mesh +``` +![Bed Mesh](img/panels/bed_mesh.png) + +### Extrude +```py +panel: extrude theme:material-dark +``` +![Extrude](img/panels/extrude.png) + +### Fan +```py +panel: fan +``` +![Fan](img/panels/fan.png) + +### Fine Tune +```py +panel: fine_tune +``` +![Fine Tune Panel](img/panels/fine_tune.png) + +### Gcode Macros +```py +panel: gcode_macros +``` +![Gcode Macros Panel](img/panels/gcode_macros.png) + +### Menu +![Menu Panel](img/panels/menu.png) + +### Move +```py +panel: move +``` +![Move Panel](img/panels/move.png) + +### Network +```py +panel: network +``` +![Network Panel](img/panels/network.png) + +### Power +```py +panel: power +``` +![Power](img/panels/power.png) + +### Print +```py +panel: print +``` +![Print Panel](img/panels/print.png) + +### Settings +```py +panel: settings +``` +![Settings](img/panels/settings.png) + +### System +```py +panel: system +``` +![System Panel](img/panels/system.png) + +### Temperature +```py +panel: temperature +``` +![Temperature](img/panels/temperature.png) + +### Z Calibrate +```py +panel: zcalibrate +``` +![Z Calibrate](img/panels/zcalibrate.png) + +### Limits +```py +panel: limits +``` +![Limits](img/panels/limits.png) diff --git a/docs/Quicktips.md b/docs/Quicktips.md new file mode 100644 index 000000000..771ff59a1 --- /dev/null +++ b/docs/Quicktips.md @@ -0,0 +1,81 @@ +# Quicktips +quick tips, without much explanation + + +## Hide macros, outputs or fans +As you probably already noticed, you can show and hide the gcode macros in the interface settings, +but you can also hide gcode macros by prefixing the name with an underscore. + +```py +[gcode_macro MY_AWESOME_GCODE] +gcode: + _MY_HELPER_CODE +[gcode_macro _MY_HELPER_CODE] +gcode: + M300 +``` + +MY_AWESOME_GCODE appears in your interface settings, _MY_HELPER_CODE not. + +Another example: + +Lets hide a temperature_fan: + +```py +[temperature_fan fan1] +[temperature_fan _fan2] +``` + +fan1 will show in the interface, but _fan2 will be hidden. + + +## Thumbnails +KlipperScreen can display thumbnails in the file browser and as previews in the print status. + + +![Job Status](img/panels/job_status.png) + + +* [PrusaSlicer](#prusaslicer) +* [SuperSlicer](#superslicer) +* [Cura](#cura) +* [ideaMaker](#ideamaker) + +### PrusaSlicer +In “Expert” mode PrusaSlicer has an option in the “Printer Settings” tab to activate previews. +Under General / Firmware. + + +![PrusaSlicer](img/quicktips/PrusaSlicer-thumbnails.png) + + +### SuperSlicer +In “Expert” mode SuperSlicer has some very convenient options in the “Printer Settings” tab to activate and customize the previews. + + +![SuperSlicer](img/quicktips/SuperSlicer-thumbnails.png) + + +### Cura +The Cura plugin [“Cura2Moonraker”](https://github.com/emtrax-ltd/Cura2MoonrakerPlugin) is required for this. + + +![Cura](img/quicktips/Cura-thumbnails.png) + + +### ideaMaker +To enable thumbnails, open the Advanced tab in the printer settings, enable the GCode Thumbnails for Octoprint and Mainsail option and enter your prefered square format image size in the Resolution fields (e.g. 400 X 400). It’s necessary that the thumbnail width and height resolution is equal. + + +![ideaMaker](img/quicktips/IdeaMaker-thumbnails.png) + + +## Layer Progress +PrusaSlicer/SuperSlicer > Printer Settings > Custom Gcode > After layer change Gcode + +`M117 Layer {layer_num+1}/[total_layer_count] : {filament_settings_id[0]}` + +![Layer_progress](img/quicktips/PS_SS_Layer_progress.png) + +## Supported Macros +[Macros](macros.md) diff --git a/docs/Theming.md b/docs/Theming.md index 6d873d20c..9e1d96acc 100644 --- a/docs/Theming.md +++ b/docs/Theming.md @@ -8,7 +8,7 @@ To edit colors and styles, create a css file named `style.css` you can use the c ### Example 1 -``` +```sh cd ~/KlipperScreen/styles mkdir -p mytheme/images cd mytheme @@ -24,10 +24,10 @@ At this point `mytheme` should be on the list of themes, and when you select it Creating a custom background from Mainsail sidebar and this css using Z-bolt icons -``` +```css window { background-image: url("/home/pi/mainsail/img/background.svg");} button {background-color: rgba(0,0,0,0); border-radius:2em;} ``` -![Custom theme example with background](img/theme_example.png) +![Custom theme example with background](img/theming/theme_example.png) diff --git a/docs/Translations.md b/docs/Translations.md index a8f766e02..fcc4e5b24 100644 --- a/docs/Translations.md +++ b/docs/Translations.md @@ -1,6 +1,6 @@ ## Create Translations -You can use a editor such as [poedit](https://poedit.net/) to assist in translations. This guide will assume that you +You can use an editor such as [poedit](https://poedit.net/) to assist in translations. This guide will assume that you will be using poedit. This guide will refer to `language designation`. This can be found from running `echo $LANG` on your pi, as long as you diff --git a/docs/Troubleshooting.md b/docs/Troubleshooting.md index 99020c6fc..9050fdd7e 100644 --- a/docs/Troubleshooting.md +++ b/docs/Troubleshooting.md @@ -1,48 +1,110 @@ -# Troubleshooting This page will have common problems and common solutions to those problems. -## First Steps +# First Steps -The first step to troubleshooting any problem is getting the cause of the error. KlipperScreen log output will occur -in two places. Check for the file `/tmp/KlipperScreen.log` and look at the contents by running -`cat /tmp/KlipperScreen.log` or grabbing the file over WinSCP or another scp program. +The first step to troubleshooting any problem is getting the cause of the error. -If that file is non-existent, there is a problem in KlipperScreen starting up. To get the error output in this case, -run `journalctl -xe -u KlipperScreen`. +* Check for the file `/tmp/KlipperScreen.log` +look at the contents by running `cat /tmp/KlipperScreen.log` or grab the file over WinSCP or another sftp program. +This is the most important file, and should be provided if you ask for support. -## Common Errors +If that file is non-existent, run `journalctl -xe -u KlipperScreen` -### Problems occurring before the log file appears +Check the file `/var/log/Xorg.0.log` where you can find issues with the X server. -This section will detail problems that may happen before the log file has been created. Each section will start with a -relevant line from the journalctl output. - -#### Cannot open virtual Console -``` +## Cannot open virtual Console +If you see this line in the logs: +```sh xf86OpenConsole: Cannot open virtual console 2 (Permission denied) ``` -* Check /etc/X11/Xwrapper.conf +* Run `cat /etc/X11/Xwrapper.config` + This should have the line `allowed_users=anybody` in it -* Check /etc/group -Run the command `cat /etc/group | grep tty`. If you username is not listed under that line, you need to add it with the -following command (if you username is not 'pi' change 'pi' to your username): -`usermode -a -G tty pi` +* Run `cat /etc/group | grep tty` + +If your username is not listed under that line, you need to add it with the following command: + +```sh +usermod -a -G tty pi +``` +(if your username is not 'pi' change 'pi' to your username) + +You may also need: +```sh +sudo apt install xserver-xorg-legacy +``` + +Restart KlipperScreen: +```sh +sudo service KlipperScreen restart +``` + +If it's still failing as a last resort add `needs_root_rights=yes` to `/etc/X11/Xwrapper.config`: +```sh +sudo echo needs_root_rights=yes>>/etc/X11/Xwrapper.config +``` + +restart KS. + +## Screen shows console instead of KlipperScreen -### Problems occurring with the log file +If you have multiple framebuffers, you may need to fix the X11 configuration, +list the available framebuffers and check the current one: +```sh +ls /dev/fb* +cat /usr/share/X11/xorg.conf.d/99-fbturbo.conf | grep /dev/fb +``` -#### Screen shows console instead of KlipperScreen -Run the command `ls /dev/fb*`. If you have multiple devices, you may need to fix the X11 configuration. +If you more than one, try changing it: +```sh +sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf +``` + +for example: change `/dev/fb0` to `/dev/fb1` + +Once you have saved that file, restart KlipperScreen. +```sh +sudo service KlipperScreen restart +``` + +## Screen is all white or blank or no signal + +If the screen never shows the console even during startup, Then it's tipically an improperly installed screen, +follow the manufacturer instructions on how to physically connect the screen and install the proper drivers. + +## Touch not working on debian Bullseye + +Some dsi screens have issues where touch doesn't work with debian bullseye, the current fix +(at least until upstream is fixed) consist in changing the driver: + +Run `raspi-config` > go to Advanced > GL Driver > select G2 and reboot. + +![config](img/troubleshooting/gldriver.png) + +*Or*: + +manually edit `/boot/config.txt` and change: + +```sh +dtoverlay=vc4-kms-v3d +``` + +to: +```sh +dtoverlay=vc4-fkms-v3d +``` +and reboot, that should make the touch work, if your screen is rotated 180 degrees, then you may need to adjust +[the touch rotation](Hardware.md) as described in the Hardware page. -Run the command `cat /usr/share/X11/xorg.conf.d/99-fbturbo.conf | grep /dev/fb`. Try modifying the file ( -`sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf`) and change `/dev/fb0` to a different file listed in the -previous command (i.e. `/dev/fb1`). +## OctoPrint -Once you have saved that file, restart KlipperScreen and it should show up on your display. +KlipperScreen was never intended to be used with OctoPrint, and there is no support for it. -#### Screen is all white or blank +## Other issues -Improperly installed screen, follow the manufacturer instructions on how to physically connect the screen and install the proper drivers. +If you found an issue not listed here, or can't make it work, please provide all the log files +a description of your hw, and a description of the issue when asking for support. diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index ac007b716..000000000 --- a/docs/changelog.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changelog - -Breaking changes will be listed here. - -#### 2021 05 20 -* Default configuration is not merged if a user configuration is set for a specific option - -For instance, if `menu __main` is user defined, the main menu will not have any defaults. diff --git a/docs/img/bed_level.png b/docs/img/bed_level.png deleted file mode 100644 index c76d7285f..000000000 Binary files a/docs/img/bed_level.png and /dev/null differ diff --git a/docs/img/bed_mesh.png b/docs/img/bed_mesh.png deleted file mode 100644 index bfd33c243..000000000 Binary files a/docs/img/bed_mesh.png and /dev/null differ diff --git a/docs/img/extrude.png b/docs/img/extrude.png deleted file mode 100644 index 5074ffe94..000000000 Binary files a/docs/img/extrude.png and /dev/null differ diff --git a/docs/img/fan.png b/docs/img/fan.png deleted file mode 100644 index 8a6529e08..000000000 Binary files a/docs/img/fan.png and /dev/null differ diff --git a/docs/img/fine_tune.png b/docs/img/fine_tune.png deleted file mode 100644 index 8ac6a7931..000000000 Binary files a/docs/img/fine_tune.png and /dev/null differ diff --git a/docs/img/gcode_macros.png b/docs/img/gcode_macros.png deleted file mode 100644 index 36b7e4dfd..000000000 Binary files a/docs/img/gcode_macros.png and /dev/null differ diff --git a/docs/img/install/KIAUH.png b/docs/img/install/KIAUH.png new file mode 100644 index 000000000..3d33a2fea Binary files /dev/null and b/docs/img/install/KIAUH.png differ diff --git a/docs/img/job_status.png b/docs/img/job_status.png deleted file mode 100644 index 42882f4b7..000000000 Binary files a/docs/img/job_status.png and /dev/null differ diff --git a/docs/img/main_panel.png b/docs/img/main_panel.png deleted file mode 100644 index cd00c04fc..000000000 Binary files a/docs/img/main_panel.png and /dev/null differ diff --git a/docs/img/menu.png b/docs/img/menu.png deleted file mode 100644 index ddf569e02..000000000 Binary files a/docs/img/menu.png and /dev/null differ diff --git a/docs/img/move.png b/docs/img/move.png deleted file mode 100644 index 00490d064..000000000 Binary files a/docs/img/move.png and /dev/null differ diff --git a/docs/img/network.png b/docs/img/network.png deleted file mode 100644 index 995528f1e..000000000 Binary files a/docs/img/network.png and /dev/null differ diff --git a/docs/img/panels/bed_level.png b/docs/img/panels/bed_level.png new file mode 100644 index 000000000..1fe56b682 Binary files /dev/null and b/docs/img/panels/bed_level.png differ diff --git a/docs/img/panels/bed_mesh.png b/docs/img/panels/bed_mesh.png new file mode 100644 index 000000000..b7766a963 Binary files /dev/null and b/docs/img/panels/bed_mesh.png differ diff --git a/docs/img/panels/extrude.png b/docs/img/panels/extrude.png new file mode 100644 index 000000000..ee1ea6aba Binary files /dev/null and b/docs/img/panels/extrude.png differ diff --git a/docs/img/panels/fan.png b/docs/img/panels/fan.png new file mode 100644 index 000000000..aa029676b Binary files /dev/null and b/docs/img/panels/fan.png differ diff --git a/docs/img/panels/fine_tune.png b/docs/img/panels/fine_tune.png new file mode 100644 index 000000000..be2359669 Binary files /dev/null and b/docs/img/panels/fine_tune.png differ diff --git a/docs/img/panels/gcode_macros.png b/docs/img/panels/gcode_macros.png new file mode 100644 index 000000000..21c0679ed Binary files /dev/null and b/docs/img/panels/gcode_macros.png differ diff --git a/docs/img/panels/job_status.png b/docs/img/panels/job_status.png new file mode 100644 index 000000000..defd4b898 Binary files /dev/null and b/docs/img/panels/job_status.png differ diff --git a/docs/img/panels/limits.png b/docs/img/panels/limits.png new file mode 100644 index 000000000..dc50ea239 Binary files /dev/null and b/docs/img/panels/limits.png differ diff --git a/docs/img/panels/main_panel.png b/docs/img/panels/main_panel.png new file mode 100644 index 000000000..d5c610711 Binary files /dev/null and b/docs/img/panels/main_panel.png differ diff --git a/docs/img/panels/menu.png b/docs/img/panels/menu.png new file mode 100644 index 000000000..1e46d4625 Binary files /dev/null and b/docs/img/panels/menu.png differ diff --git a/docs/img/panels/move.png b/docs/img/panels/move.png new file mode 100644 index 000000000..7b884a5b0 Binary files /dev/null and b/docs/img/panels/move.png differ diff --git a/docs/img/panels/network.png b/docs/img/panels/network.png new file mode 100644 index 000000000..f56d652f8 Binary files /dev/null and b/docs/img/panels/network.png differ diff --git a/docs/img/panels/power.png b/docs/img/panels/power.png new file mode 100644 index 000000000..135cded4e Binary files /dev/null and b/docs/img/panels/power.png differ diff --git a/docs/img/panels/print.png b/docs/img/panels/print.png new file mode 100644 index 000000000..05e20dc9e Binary files /dev/null and b/docs/img/panels/print.png differ diff --git a/docs/img/panels/settings.png b/docs/img/panels/settings.png new file mode 100644 index 000000000..1ca07c443 Binary files /dev/null and b/docs/img/panels/settings.png differ diff --git a/docs/img/panels/system.png b/docs/img/panels/system.png new file mode 100644 index 000000000..654b86160 Binary files /dev/null and b/docs/img/panels/system.png differ diff --git a/docs/img/panels/temperature.png b/docs/img/panels/temperature.png new file mode 100644 index 000000000..12f0a4a55 Binary files /dev/null and b/docs/img/panels/temperature.png differ diff --git a/docs/img/panels/zcalibrate.png b/docs/img/panels/zcalibrate.png new file mode 100644 index 000000000..b9eca108e Binary files /dev/null and b/docs/img/panels/zcalibrate.png differ diff --git a/docs/img/power.png b/docs/img/power.png deleted file mode 100644 index 489356496..000000000 Binary files a/docs/img/power.png and /dev/null differ diff --git a/docs/img/preheat.png b/docs/img/preheat.png deleted file mode 100644 index e5d947241..000000000 Binary files a/docs/img/preheat.png and /dev/null differ diff --git a/docs/img/print.png b/docs/img/print.png deleted file mode 100644 index a8c703826..000000000 Binary files a/docs/img/print.png and /dev/null differ diff --git a/docs/img/quicktips/Cura-thumbnails.png b/docs/img/quicktips/Cura-thumbnails.png new file mode 100644 index 000000000..74740f3e5 Binary files /dev/null and b/docs/img/quicktips/Cura-thumbnails.png differ diff --git a/docs/img/quicktips/IdeaMaker-thumbnails.png b/docs/img/quicktips/IdeaMaker-thumbnails.png new file mode 100644 index 000000000..70e68502a Binary files /dev/null and b/docs/img/quicktips/IdeaMaker-thumbnails.png differ diff --git a/docs/img/quicktips/PS_SS_Layer_progress.png b/docs/img/quicktips/PS_SS_Layer_progress.png new file mode 100644 index 000000000..7705cb83c Binary files /dev/null and b/docs/img/quicktips/PS_SS_Layer_progress.png differ diff --git a/docs/img/quicktips/PrusaSlicer-thumbnails.png b/docs/img/quicktips/PrusaSlicer-thumbnails.png new file mode 100644 index 000000000..9e470c925 Binary files /dev/null and b/docs/img/quicktips/PrusaSlicer-thumbnails.png differ diff --git a/docs/img/quicktips/SuperSlicer-thumbnails.png b/docs/img/quicktips/SuperSlicer-thumbnails.png new file mode 100644 index 000000000..50d758f6d Binary files /dev/null and b/docs/img/quicktips/SuperSlicer-thumbnails.png differ diff --git a/docs/img/settings.png b/docs/img/settings.png deleted file mode 100644 index d72a4190d..000000000 Binary files a/docs/img/settings.png and /dev/null differ diff --git a/docs/img/system.png b/docs/img/system.png deleted file mode 100644 index 67317d36b..000000000 Binary files a/docs/img/system.png and /dev/null differ diff --git a/docs/img/temperature.png b/docs/img/temperature.png deleted file mode 100644 index 793a26036..000000000 Binary files a/docs/img/temperature.png and /dev/null differ diff --git a/docs/img/theme_example.png b/docs/img/theme_example.png deleted file mode 100644 index 598500ba1..000000000 Binary files a/docs/img/theme_example.png and /dev/null differ diff --git a/docs/img/theming/theme_example.png b/docs/img/theming/theme_example.png new file mode 100644 index 000000000..72fcc1b85 Binary files /dev/null and b/docs/img/theming/theme_example.png differ diff --git a/docs/img/troubleshooting/gldriver.png b/docs/img/troubleshooting/gldriver.png new file mode 100644 index 000000000..1e15b5191 Binary files /dev/null and b/docs/img/troubleshooting/gldriver.png differ diff --git a/docs/img/zcalibrate.png b/docs/img/zcalibrate.png deleted file mode 100644 index c8f5a0d09..000000000 Binary files a/docs/img/zcalibrate.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md index 853f7122f..544cba45c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,14 +11,17 @@ A physical touchscreen is not strictly required, for example you may install a r ### Sample Panels Main Menu -![Main Menu](img/main_panel.png) + +![Main Menu](img/panels/main_panel.png) Job Status -![Job Status](img/job_status.png) +![Job Status](img/panels/job_status.png) + +[More](Panels.md) ### Inspiration KlipperScreen was inspired by [OctoScreen](https://github.com/Z-Bolt/OctoScreen/) and the need for a touchscreen GUI that will natively work with [Klipper](https://github.com/klipper3d/klipper) and [Moonraker](https://github.com/arksine/moonraker). -[Changelog](changelog.md) +[Changelog](Changelog.md) diff --git a/docs/macros.md b/docs/macros.md new file mode 100644 index 000000000..fcaecf452 --- /dev/null +++ b/docs/macros.md @@ -0,0 +1,57 @@ +# Supported Macros + +## Extrude Panel + +### LOAD_FILAMENT / UNLOAD_FILAMENT +Load and Unload Filament macros are used in the Extrude-Panel if it is available. +The selected speed is transferred to this macro. +The following example macros show how this can be used in the macro. + +```py +[gcode_macro LOAD_FILAMENT] +gcode: + {% set speed = params.SPEED|default(500) %} + G91 + G1 E50 F{speed} + G1 E50 F{speed} + G92 +``` +```py +[gcode_macro UNLOAD_FILAMENT] +gcode: + {% set speed = params.SPEED|default(500) %} + G91 + G1 E-50 F{speed} + G1 E-50 F{speed} + G92 +``` + +this could be interesting to tweak the purge speed, this would be one Example Macro from alfrix: + +```py +[gcode_macro LOAD_FILAMENT] +gcode: + {% set speed = params.SPEED|default(300) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity %} + M300 # beep + G91 + G92 E0 + G1 E350 F{max_velocity} + G1 E25 F{speed} #purge + M300 + M300 +``` + +```py +[gcode_macro UNLOAD_FILAMENT] +gcode: + {% set speed = params.SPEED|default(300) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity %} + G91 + M300 # beep + G92 E0 + G1 E25 F{speed} # purge + G1 E-420 F{max_velocity} + M300 + M300 +``` diff --git a/docs/panels.md b/docs/panels.md deleted file mode 100644 index feb9e695c..000000000 --- a/docs/panels.md +++ /dev/null @@ -1,83 +0,0 @@ -# Panels - -### Main Menu -![Main Menu](img/main_panel.png) - -### Job Status -![Job Status](img/job_status.png) - -### Bed Level -type: bed_level -![Bed Level](img/bed_level.png) - -The bed level panel has the ability to have preset locations from Klipper. Please see documentation on the following -Klipper Sections: -* [bed_screws](https://www.klipper3d.org/Config_Reference.html#bed_screws) -* [screws_tilt_adjust](https://www.klipper3d.org/Config_Reference.html#screws_tilt_adjust) - -_Important Note: Due to Klipper using the bltouch/probe offsets in screws_tilt_adjust, if a bltouch/probe is enabled_ -_KlipperScreen will add the offset to the defined screw values. This will not occur if bed_screws section is used._ - -This panel will favor screws_tilt_adjust over the bed_screws section. If screws_tilt_adjust is defined, an extra button -for _Screws Calibrate_ will appear. This button runs the SCREWS_TILT_CALCULATE command and shows the results on the -panel. - -### Bed Mesh -type: bed_mesh -![Bed Mesh](img/bed_mesh.png) - -### Extrude -type: extrude -![Extrude](img/extrude.png) - -### Fan -type: fan -![Fan](img/fan.png) - -### Fine Tune -type: fine_tune -![Fine Tune Panel](img/fine_tune.png) - -### Gcode Macros -type: gcode_macros -![Gcode Macros Panel](img/gcode_macros.png) - -### Menu -type: menu -![Menu Panel](img/menu.png) - -### Move -type: move -![Move Panel](img/move.png) - -### Network -type: network -![Network Panel](img/network.png) - -### Power -type: power -![Power](img/power.png) - -### Preheat -type: preheat -![Preheat Panel](img/preheat.png) - -### Print -type: print -![Print Panel](img/print.png) - -### Settings -type: settings -![Settings](img/settings.png) - -### System -type: system -![System Panel](img/system.png) - -### Temperature -type: temperature -![Temperature](img/temperature.png) - -### Z Calibrate -type: zcalibrate -![Z Calibrate](img/zcalibrate.png) diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..a79517ac7 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,2 @@ +mkdocs>=1.3.0 +mkdocs-material==8.2.16 \ No newline at end of file diff --git a/ks_includes/KlippyGcodes.py b/ks_includes/KlippyGcodes.py index e45eaa872..1b7c61bd2 100644 --- a/ks_includes/KlippyGcodes.py +++ b/ks_includes/KlippyGcodes.py @@ -4,6 +4,9 @@ class KlippyGcodes: HOME_X = "G28 X" HOME_Y = "G28 Y" HOME_Z = "G28 Z" + HOME_XY = "G28 X Y" + Z_TILT = "Z_TILT_ADJUST" + QUAD_GANTRY_LEVEL = "QUAD_GANTRY_LEVEL" MOVE = "G1" MOVE_ABSOLUTE = "G90" @@ -23,9 +26,10 @@ class KlippyGcodes: SET_SPD_FACTOR = "M220" PROBE_CALIBRATE = "PROBE_CALIBRATE" - PROBE_MOVE = "TESTZ Z=" - PROBE_ABORT = "ABORT" - PROBE_ACCEPT = "ACCEPT" + Z_ENDSTOP_CALIBRATE = "Z_ENDSTOP_CALIBRATE" + TESTZ = "TESTZ Z=" + ABORT = "ABORT" + ACCEPT = "ACCEPT" SAVE_CONFIG = "SAVE_CONFIG" RESTART = "RESTART" @@ -44,6 +48,10 @@ def set_ext_temp(temp, tool=0): def set_heater_temp(heater, temp): return 'SET_HEATER_TEMPERATURE heater="%s" target=%s' % (heater, str(temp)) + @staticmethod + def set_temp_fan_temp(temp_fan, temp): + return 'SET_TEMPERATURE_FAN_TARGET temperature_fan="%s" target=%s' % (temp_fan, str(temp)) + @staticmethod def set_fan_speed(speed): speed = str(int(float(int(speed) % 101)/100*255)) @@ -58,8 +66,8 @@ def set_speed_rate(rate): return "%s S%s" % (KlippyGcodes.SET_SPD_FACTOR, rate) @staticmethod - def probe_move(dist): - return KlippyGcodes.PROBE_MOVE + dist + def testz_move(dist): + return KlippyGcodes.TESTZ + dist @staticmethod def extrude(dist, speed=500): @@ -75,4 +83,4 @@ def bed_mesh_remove(profile): @staticmethod def bed_mesh_save(profile): - return "BED_MESH_PROFILE SAVE='%s'" % profile + return "BED_MESH_PROFILE SAVE='%s'" % profile \ No newline at end of file diff --git a/ks_includes/KlippyGtk.py b/ks_includes/KlippyGtk.py index 883ab1476..37d7950d0 100644 --- a/ks_includes/KlippyGtk.py +++ b/ks_includes/KlippyGtk.py @@ -2,15 +2,14 @@ import gi import logging import os +import pathlib gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GdkPixbuf, Gio, GLib, Pango +from gi.repository import Gdk, GdkPixbuf, Gio, Gtk, Pango -klipperscreendir = os.getcwd() class KlippyGtk: labels = {} - font_ratio = [43, 29] keyboard_ratio = .22 width_ratio = 16 height_ratio = 9.375 @@ -19,28 +18,46 @@ def __init__(self, screen, width, height, theme, cursor, fontsize_type): self.screen = screen self.width = width self.height = height - self.theme = theme + self.themedir = os.path.join(pathlib.Path(__file__).parent.resolve().parent, "styles", theme, "images") + + if self.screen.vertical_mode: + self.font_ratio = [33, 49] + else: + self.font_ratio = [43, 29] self.font_size = int(min( self.width / self.font_ratio[0], self.height / self.font_ratio[1] )) if fontsize_type == "small": self.font_size = round(self.font_size * 0.91) - elif (fontsize_type == "large"): + elif fontsize_type == "large": self.font_size = round(self.font_size * 1.09) self.header_size = int(round((self.width / self.width_ratio) / 1.33)) self.img_width = int(round(self.width / self.width_ratio)) self.img_height = int(round(self.height / self.height_ratio)) - self.action_bar_width = int(self.width * .1) - self.header_image_scale_width = 1.2 - self.header_image_scale_height = 1.4 + if self.screen.vertical_mode: + self.action_bar_width = int(self.width) + self.action_bar_height = int(self.height * .1) + else: + self.action_bar_width = int(self.width * .1) + self.action_bar_height = int(self.height) self.cursor = cursor + self.color_list = {} # This is set by screen.py init_style() + + for key in self.color_list: + if "base" in self.color_list[key]: + rgb = [int(self.color_list[key]['base'][i:i + 2], 16) for i in range(0, 6, 2)] + self.color_list[key]['rgb'] = rgb + logging.debug("img width: %s height: %s" % (self.img_width, self.img_height)) def get_action_bar_width(self): return self.action_bar_width + def get_action_bar_height(self): + return self.action_bar_height + def get_content_width(self): return self.width - self.action_bar_width @@ -53,9 +70,6 @@ def get_font_size(self): def get_header_size(self): return self.header_size - def get_header_image_scale(self): - return [self.header_image_scale_width, self.header_image_scale_height] - def get_image_width(self): return self.img_width @@ -65,64 +79,74 @@ def get_image_height(self): def get_keyboard_height(self): return (self.width - self.get_action_bar_width()) * self.keyboard_ratio + def get_temp_color(self, device): + # logging.debug("Color list %s" % self.color_list) + if device not in self.color_list: + return False, False + + if 'base' in self.color_list[device]: + rgb = self.color_list[device]['rgb'].copy() + if self.color_list[device]['state'] > 0: + rgb[1] = rgb[1] + self.color_list[device]['hsplit'] * self.color_list[device]['state'] + self.color_list[device]['state'] += 1 + color = '{:02X}{:02X}{:02X}'.format(rgb[0], rgb[1], rgb[2]) + rgb = [x / 255 for x in rgb] + # logging.debug("Assigning color: %s %s %s" % (device, rgb, color)) + else: + colors = self.color_list[device]['colors'] + if self.color_list[device]['state'] >= len(colors): + self.color_list[device]['state'] = 0 + color = colors[self.color_list[device]['state'] % len(colors)] + rgb = [int(color[i:i + 2], 16) / 255 for i in range(0, 6, 2)] + self.color_list[device]['state'] += 1 + # logging.debug("Assigning color: %s %s %s" % (device, rgb, color)) + + return rgb, color + + def reset_temp_color(self): + for key in self.color_list: + self.color_list[key]['state'] = 0 + def Label(self, label, style=None): la = Gtk.Label(label) - if style is not None and style is not False: + if style is not None: la.get_style_context().add_class(style) return la - def ImageLabel(self, image_name, text, size=20, style=False, width_scale=.32, height_scale=.32): - box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=15) - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - "%s/styles/%s/images/%s.svg" % (klipperscreendir, self.theme, str(image_name)), - int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True) - - image = Gtk.Image.new_from_pixbuf(pixbuf) - - label = Gtk.Label() - label.set_text(text) - box1.add(image) - box1.add(label) - - if style is not False: - ctx = box1.get_style_context() - ctx.add_class(style) - - return {"l": label, "b": box1} - - def Image(self, image_name, style=False, width_scale=1, height_scale=1): - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - "%s/styles/%s/images/%s" % (klipperscreendir, self.theme, str(image_name)), - int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True) - - return Gtk.Image.new_from_pixbuf(pixbuf) - - def ImageFromFile(self, filename, style=False, width_scale=1, height_scale=1): - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename, int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True) - - return Gtk.Image.new_from_pixbuf(pixbuf) - - def PixbufFromFile(self, filename, style=False, width_scale=1, height_scale=1): - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename, int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True) - + def Image(self, image_name, scale=1.0): + filename = os.path.join(self.themedir, str(image_name) + ".svg") + if os.path.exists(filename): + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, + int(round(self.img_width * scale)), + int(round(self.img_height * scale)), + True) + return Gtk.Image.new_from_pixbuf(pixbuf) + else: + logging.error("Unable to find image %s", filename) + return Gtk.Image() + + def PixbufFromFile(self, filename, width_scale=1, height_scale=1): + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filename, + int(round(self.img_width * width_scale)), + int(round(self.img_height * height_scale)), + True) return pixbuf - def PixbufFromHttp(self, resource, style=False, width_scale=1, height_scale=1): + def PixbufFromHttp(self, resource, width_scale=1, height_scale=1): response = self.screen.apiclient.get_thumbnail_stream(resource) if response is False: return None stream = Gio.MemoryInputStream.new_from_data(response, None) - pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale( - stream, int(round(self.img_width * width_scale)), int(round(self.img_height * height_scale)), True) - + pixbuf = GdkPixbuf.Pixbuf.new_from_stream_at_scale(stream, + int(round(self.img_width * width_scale)), + int(round(self.img_height * height_scale)), + True) return pixbuf - def ProgressBar(self, style=False): + def ProgressBar(self, style=None): bar = Gtk.ProgressBar() - if style is not False: + if style is not None: ctx = bar.get_style_context() ctx.add_class(style) @@ -137,34 +161,19 @@ def Button(self, label=None, style=None): if style is not None: b.get_style_context().add_class(style) - + b.connect("clicked", self.screen.reset_screensaver_timeout) return b - def ButtonImage(self, image_name, label=None, style=None, width_scale=1.38, height_scale=1.38, + def ButtonImage(self, image_name, label=None, style=None, scale=1.38, position=Gtk.PositionType.TOP, word_wrap=True): - filename = "%s/styles/%s/images/%s.svg" % (klipperscreendir, self.theme, str(image_name)) - if not os.path.exists(filename): - logging.error("Unable to find button image (theme, image): (%s, %s)" % (self.theme, str(image_name))) - filename = "%s/styles/%s/images/%s.svg" % (klipperscreendir, self.theme, "warning") b = Gtk.Button(label=label) - - if os.path.exists(filename): - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename, - int(round(self.img_width * width_scale)), - int(round(self.img_height * height_scale)), - True - ) - img = Gtk.Image.new_from_pixbuf(pixbuf) - b.set_image(img) - b.set_hexpand(True) b.set_vexpand(True) b.set_can_focus(False) + b.set_image(self.Image(image_name, scale)) b.set_image_position(position) b.set_always_show_image(True) - b.props.relief = Gtk.ReliefStyle.NONE if word_wrap is True: try: @@ -177,7 +186,7 @@ def ButtonImage(self, image_name, label=None, style=None, width_scale=1.38, heig if style is not None: b.get_style_context().add_class(style) - + b.connect("clicked", self.screen.reset_screensaver_timeout) return b def Dialog(self, screen, buttons, content, callback=None, *args): @@ -187,16 +196,16 @@ def Dialog(self, screen, buttons, content, callback=None, *args): dialog.set_transient_for(screen) dialog.set_modal(True) - for button in buttons: + for i, button in enumerate(buttons): dialog.add_button(button_text=button['name'], response_id=button['response']) + button = dialog.get_children()[0].get_children()[0].get_children()[0].get_children()[i] + button.get_child().set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + button.get_child().set_line_wrap(True) + button.set_size_request((screen.width - 30) / 3, screen.height / 5) dialog.connect("response", callback, *args) dialog.get_style_context().add_class("dialog") - box = Gtk.Box() - box.set_size_request(screen.width - 60, 0) - box.set_vexpand(True) - content_area = dialog.get_content_area() content_area.set_margin_start(15) content_area.set_margin_end(15) @@ -213,31 +222,21 @@ def Dialog(self, screen, buttons, content, callback=None, *args): return dialog - - def ToggleButtonImage(self, image_name, label, style=False, width_scale=1.38, height_scale=1.38): - filename = "%s/styles/%s/images/%s.svg" % (klipperscreendir, self.theme, str(image_name)) - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename, - int(round(self.img_width * width_scale)), - int(round(self.img_height * height_scale)), - True - ) - - img = Gtk.Image.new_from_pixbuf(pixbuf) + def ToggleButtonImage(self, image_name, label, style=None, scale=1.38): b = Gtk.ToggleButton(label=label) - b.set_image(img) b.set_hexpand(True) b.set_vexpand(True) b.set_can_focus(False) + b.set_image(self.Image(image_name, scale)) b.set_image_position(Gtk.PositionType.TOP) b.set_always_show_image(True) - b.props.relief = Gtk.ReliefStyle.NONE - if style is not False: + if style is not None: ctx = b.get_style_context() ctx.add_class(style) + b.connect("clicked", self.screen.reset_screensaver_timeout) return b def HomogeneousGrid(self, width=None, height=None): @@ -253,8 +252,17 @@ def ToggleButton(self, text): b.props.relief = Gtk.ReliefStyle.NONE b.set_hexpand(True) b.set_vexpand(True) + b.connect("clicked", self.screen.reset_screensaver_timeout) return b + def ScrolledWindow(self): + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_vexpand(True) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + return scroll + def formatFileName(self, name): name = name.split('/')[-1] if "/" in name else name name = name.split('.gcod')[0] if ".gcode" in name else name @@ -262,13 +270,17 @@ def formatFileName(self, name): return name[0:25] + "\n" + name[25:50] return name - def formatTimeString(self, seconds): time = int(seconds) text = "" - if int(time/3600) != 0: - text += str(int(time/3600))+"h " - text += str(int(time/60) % 60)+"m "+str(time % 60)+"s" + if int(time / 86400) != 0: + text += str(int(time / 86400)) + "d " + if int(time / 3600) != 0: + text += str(int(time / 3600) % 24) + "h " + if int(time / 60) != 0: + text += str(int(time / 60) % 60) + "m " + else: + text = str(time % 60) + "s" return text def formatTemperatureString(self, temp, target): diff --git a/ks_includes/KlippyRest.py b/ks_includes/KlippyRest.py index 542dec09e..eca7d69cf 100644 --- a/ks_includes/KlippyRest.py +++ b/ks_includes/KlippyRest.py @@ -2,6 +2,7 @@ import requests import logging + class KlippyRest: def __init__(self, ip, port=7125, api_key=False): self.ip = ip @@ -34,7 +35,8 @@ def send_request(self, method): headers = {} if self.api_key is False else {"x-api-key": self.api_key} try: r = requests.get(url, headers=headers) - except Exception: + except Exception as e: + logging.critical(e, exc_info=True) return False if r.status_code != 200: return False @@ -42,7 +44,8 @@ def send_request(self, method): # TODO: Try/except try: data = json.loads(r.content) - except Exception: + except Exception as e: + logging.critical(e, exc_info=True) logging.exception("Unable to parse response from moonraker:\n %s" % r.content) return False diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 0b0f60801..2fa803d37 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -1,17 +1,14 @@ #!/usr/bin/python import gi -import time import threading import json -import requests import websocket -import asyncio import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import GLib, Gdk from ks_includes.KlippyGcodes import KlippyGcodes api_key = "" @@ -33,7 +30,8 @@ class KlippyWebsocket(threading.Thread): _req_id = 0 connected = False callback_table = {} - timeout = None + reconnect_timeout = None + reconnect_count = 0 def __init__(self, screen, callback, host, port): threading.Thread.__init__(self) @@ -41,16 +39,19 @@ def __init__(self, screen, callback, host, port): self._callback = callback self.klippy = MoonrakerApi(self) self.closing = False + self.ws = None self._url = "%s:%s" % (host, port) def initial_connect(self): # Enable a timeout so that way if moonraker is not running, it will attempt to reconnect - if self.timeout is None: - self.timeout = GLib.timeout_add(500, self.reconnect) + if self.reconnect_timeout is None: + self.reconnect_timeout = GLib.timeout_add_seconds(3, self.reconnect) self.connect() def connect(self): + _ = self._screen.lang.gettext + def ws_on_close(ws, a=None, b=None): self.on_close(ws) @@ -64,6 +65,14 @@ def ws_on_open(ws): self.on_open(ws) try: + state = self._screen.apiclient.get_server_info() + if state is False: + if self.reconnect_count > 3: + self._screen.panels['splash_screen'].update_text( + _("Cannot connect to Moonraker") + + ("\n\n%s\n\n") % self._url + + _("Retry #%s") % self.reconnect_count) + return False token = self._screen.apiclient.get_oneshot_token() except Exception: logging.debug("Unable to get oneshot token") @@ -73,16 +82,17 @@ def ws_on_open(ws): self.ws = websocket.WebSocketApp( self.ws_url, on_close=ws_on_close, on_error=ws_on_error, on_message=ws_on_message, on_open=ws_on_open) - self._wst = threading.Thread(target=self.ws.run_forever) - self._wst.daemon = True + self._wst = threading.Thread(target=self.ws.run_forever, daemon=True) try: + logging.debug("Starting websocket thread") self._wst.start() except Exception: logging.debug("Error starting web socket") def close(self): self.closing = True - self.ws.close() + if self.ws is not None: + self.ws.close() def is_connected(self): return self.connected @@ -132,9 +142,10 @@ def on_open(self, ws): logging.info("Moonraker Websocket Open") logging.info("Self.connected = %s" % self.is_connected()) self.connected = True - if self.timeout is not None: - GLib.source_remove(self.timeout) - self.timeout = None + self.reconnect_count = 0 + if self.reconnect_timeout is not None: + GLib.source_remove(self.reconnect_timeout) + self.reconnect_timeout = None if "on_connect" in self._callback: Gdk.threads_add_idle( GLib.PRIORITY_HIGH_IDLE, @@ -144,23 +155,29 @@ def on_open(self, ws): def on_close(self, ws): if self.is_connected() is False: logging.debug("Connection already closed") + if self.reconnect_timeout is not None: + GLib.source_remove(self.reconnect_timeout) + self.reconnect_timeout = None return if self.closing is True: logging.debug("Closing websocket") - self.ws.stop() + self.ws.keep_running = False + self.close() + self.closing = False return logging.info("Moonraker Websocket Closed") self.connected = False - if self.timeout is None: - self.timeout = GLib.timeout_add(500, self.reconnect) + if self.reconnect_timeout is None: + self.reconnect_timeout = GLib.timeout_add_seconds(3, self.reconnect) if "on_close" in self._callback: Gdk.threads_add_idle( GLib.PRIORITY_HIGH_IDLE, self._callback['on_close'], - "Lost Connection to Moonraker" + "Lost Connection to Moonraker", + True ) def reconnect(self): @@ -169,6 +186,7 @@ def reconnect(self): return False logging.debug("Attempting to reconnect") + self.reconnect_count += 1 self.connect() return True @@ -330,6 +348,17 @@ def set_heater_temp(self, heater, target, callback=None, *args): *args ) + def set_temp_fan_temp(self, temp_fan, target, callback=None, *args): + logging.debug("Sending temperature fan %s to temp: %s", temp_fan, target) + return self._ws.send_method( + "printer.gcode.script", + { + "script": KlippyGcodes.set_temp_fan_temp(temp_fan, target) + }, + callback, + *args + ) + def set_tool_temp(self, tool, target, callback=None, *args): logging.debug("Sending set_tool_temp: %s", KlippyGcodes.set_ext_temp(target, tool)) return self._ws.send_method( @@ -351,4 +380,4 @@ def restart_firmware(self): logging.debug("Sending printer.firmware_restart") return self._ws.send_method( "printer.firmware_restart" - ) + ) \ No newline at end of file diff --git a/ks_includes/config.py b/ks_includes/config.py index e4bb197cc..f258c4c17 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -5,6 +5,7 @@ import json import re import copy +import pathlib from io import StringIO @@ -19,6 +20,8 @@ "14400", # 4 Hours ] +klipperscreendir = pathlib.Path(__file__).parent.resolve().parent + class ConfigError(Exception): pass @@ -29,8 +32,7 @@ class KlipperScreenConfig: do_not_edit_prefix = "#~#" def __init__(self, configfile, screen=None): - self.default_config_path = "%s/ks_includes/%s" % (os.getcwd(), "defaults_simple.conf") - self.default_expert_config_path = "%s/ks_includes/%s" % (os.getcwd(), "defaults_expert.conf") + self.default_config_path = os.path.join(klipperscreendir, "ks_includes", "defaults_simple.conf") self.config = configparser.ConfigParser() self.config_path = self.get_config_file_location(configfile) logging.debug("Config path location: %s" % self.config_path) @@ -47,19 +49,15 @@ def __init__(self, configfile, screen=None): for include in includes: self._include_config("/".join(self.config_path.split("/")[:-1]), include) - for i in ['menu __main', 'menu __print', 'menu __splashscreen', 'preheat']: - for j in self.defined_config.sections(): - if j.startswith(i): - for k in list(self.config.sections()): - if k.startswith(i): - del self.config[k] - break + self.exclude_from_config(self.defined_config) self.log_config(self.defined_config) self.config.read_string(user_def) if saved_def is not None: self.config.read_string(saved_def) logging.info("====== Saved Def ======\n%s\n=======================" % saved_def) + # This is the final config + # self.log_config(self.config) except KeyError: raise ConfigError(f"Error reading config: {self.config_path}") except Exception: @@ -88,8 +86,8 @@ def __init__(self, configfile, screen=None): for printer in conf_printers_debug: name = list(printer)[0] item = conf_printers_debug[conf_printers_debug.index(printer)] - if item[list(printer)[0]]['moonraker_api_key'] != "": - item[list(printer)[0]]['moonraker_api_key'] = "redacted" + if item[name]['moonraker_api_key'] != "": + item[name]['moonraker_api_key'] = "redacted" logging.debug("Configured printers: %s" % json.dumps(conf_printers_debug, indent=2)) lang = self.get_main_config_option("language", None) @@ -112,15 +110,18 @@ def _create_configurable_options(self, screen): "callback": screen.restart_warning, "options": [ {"name": _("System") + " " + _("(default)"), "value": "system_lang"} ]}}, - {"move_speed": { - "section": "main", "name": _("Move Speed (mm/s)"), "type": "scale", "value": "20", - "range": [5, 100], "step": 1}}, + {"move_speed_xy": { + "section": "main", "name": _("XY Move Speed (mm/s)"), "type": "scale", "value": "20", + "range": [5, 200], "step": 1}}, + {"move_speed_z": { + "section": "main", "name": _("Z Move Speed (mm/s)"), "type": "scale", "value": "20", + "range": [5, 200], "step": 1}}, {"print_sort_dir": {"section": "main", "type": None, "value": "name_asc"}}, {"print_estimate_method": { "section": "main", "name": _("Estimated Time Method"), "type": "dropdown", "value": "file", "options": [ - {"name": _("File") + " " + _("(default)"), "value": "file"}, - {"name": _("Duration Only"), "value": "duration"}, + {"name": _("Auto") + " " + _("(default)"), "value": "auto"}, + {"name": _("File"), "value": "file"}, {"name": _("Filament Used"), "value": "filament"}, {"name": _("Slicer"), "value": "slicer"}]}}, {"screen_blanking": { @@ -135,21 +136,26 @@ def _create_configurable_options(self, screen): {"24htime": {"section": "main", "name": _("24 Hour Time"), "type": "binary", "value": "True"}}, {"side_macro_shortcut": { "section": "main", "name": _("Macro shortcut on sidebar"), "type": "binary", - "value": "True", "callback": screen.toggle_macro_shortcut}}, + "value": "False", "callback": screen.toggle_macro_shortcut}}, {"font_size": { "section": "main", "name": _("Font Size"), "type": "dropdown", "value": "medium", "callback": screen.restart_warning, "options": [ {"name": _("Small"), "value": "small"}, {"name": _("Medium") + " " + _("(default)"), "value": "medium"}, {"name": _("Large"), "value": "large"}]}}, - {"confirm_estop": {"section": "main", "name": "Подтверждение при экстренном стопе", "type": "binary", - "value": "False"}}, - {"select_mode": {"section": "main", "name": "Режим эксперта", "type": "binary", - "value": "False"}}, + {"confirm_estop": {"section": "main", "name": _("Confirm Emergency Stop"), "type": "binary", + "value": "True"}}, + {"only_heaters": {"section": "main", "name": _("Hide sensors in Temp."), "type": "binary", + "value": "False", "callback": screen.restart_warning}}, + # {"use_dpms": {"section": "main", "name": _("Screen DPMS"), "type": "binary", + # "value": "True", "callback": screen.set_dpms}}, + {"print_estimate_compensation": { + "section": "main", "name": _("Slicer Time correction (%)"), "type": "scale", "value": "100", + "range": [50, 150], "step": 1}}, # {"": {"section": "main", "name": _(""), "type": ""}} ] - lang_path = os.path.join(os.getcwd(), 'ks_includes/locales') + lang_path = os.path.join(klipperscreendir, "ks_includes", "locales") langs = [d for d in os.listdir(lang_path) if not os.path.isfile(os.path.join(lang_path, d))] langs.sort() lang_opt = self.configurable_options[3]['language']['options'] @@ -157,10 +163,10 @@ def _create_configurable_options(self, screen): for lang in langs: lang_opt.append({"name": lang, "value": lang}) - t_path = os.path.join(os.getcwd(), 'styles') + t_path = os.path.join(klipperscreendir, 'styles') themes = [d for d in os.listdir(t_path) if (not os.path.isfile(os.path.join(t_path, d)) and d != "z-bolt")] themes.sort() - theme_opt = self.configurable_options[8]['theme']['options'] + theme_opt = self.configurable_options[9]['theme']['options'] for theme in themes: theme_opt.append({"name": theme, "value": theme}) @@ -186,6 +192,20 @@ def _create_configurable_options(self, screen): if name not in list(self.config[vals['section']]): self.config.set(vals['section'], name, vals['value']) + def exclude_from_config(self, config): + exclude_list = ['preheat'] + if not self.defined_config.getboolean('main', "use_default_menu", fallback=True): + logging.info("Using custom menu, removing default menu entries.") + exclude_list.append('menu __main') + exclude_list.append('menu __print') + exclude_list.append('menu __splashscreen') + for i in exclude_list: + for j in config.sections(): + if j.startswith(i): + for k in list(self.config.sections()): + if k.startswith(i): + del self.config[k] + def _include_config(self, dir, path): full_path = path if path[0] == "/" else "%s/%s" % (dir, path) parse_files = [] @@ -214,8 +234,9 @@ def _include_config(self, dir, path): includes = [i[8:] for i in config.sections() if i.startswith("include ")] for include in includes: self._include_config("/".join(full_path.split("/")[:-1]), include) + self.exclude_from_config(config) + self.log_config(config) self.config.read(file) - self.defined_config.read(file) def separate_saved_config(self, config_path): user_def = [] @@ -240,11 +261,16 @@ def separate_saved_config(self, config_path): def get_config_file_location(self, file): logging.info("Passed config file: %s" % file) if not path.exists(file): - file = "%s/%s" % (os.getcwd(), self.configfile_name) + file = os.path.join(klipperscreendir, self.configfile_name) if not path.exists(file): - file = os.path.expanduser("~/") + "klipper_config/%s" % (self.configfile_name) + file = self.configfile_name.lower() if not path.exists(file): - file = self.default_config_path + klipper_config = os.path.join(os.path.expanduser("~/"), "klipper_config") + file = os.path.join(klipper_config, self.configfile_name) + if not path.exists(file): + file = os.path.join(klipper_config, self.configfile_name.lower()) + if not path.exists(file): + file = self.default_config_path logging.info("Found configuration file at: %s" % file) return file @@ -356,10 +382,11 @@ def save_user_config_options(self): path = self.config_path else: path = os.path.expanduser("~/") - if os.path.exists(path+"klipper_config/"): - path = path + "klipper_config/KlipperScreen.conf" - else: - path = path + "KlipperScreen.conf" + klipper_config = os.path.join(path, "klipper_config") + if os.path.exists(klipper_config): + path = os.path.join(klipper_config, "KlipperScreen.conf") + # else: + # path = os.path.join(path, "KlipperScreen.conf") try: file = open(path, 'w') @@ -419,6 +446,7 @@ def _build_preheat_item(self, name): "extruder": cfg.getint("extruder", 0), "bed": cfg.getint("bed", 0), "heater_generic": cfg.getint("heater_generic", 0), + "temperature_fan": cfg.getint("temperature_fan", 0), "gcode": cfg.get("gcode", None) } - return item \ No newline at end of file + return item diff --git a/ks_includes/defaults_expert.conf b/ks_includes/defaults_expert.conf deleted file mode 100644 index 97d2ec537..000000000 --- a/ks_includes/defaults_expert.conf +++ /dev/null @@ -1,300 +0,0 @@ -###################################################### -# KlipperScreen.conf EXPERT MODE -###################################################### - -[printer Z-Bolt] -moonraker_api_key: False - -###################################################### -# Setting PREHEAT -###################################################### - -[preheat PLA] -bed = 60 -extruder = 215 - -[preheat TPU] -bed = 65 -extruder = 225 - -[preheat PETG] -bed = 75 -extruder = 235 - -[preheat ABS] -bed = 110 -extruder = 245 - -###################################################### -# Setting MAIN -###################################################### - -[main] -moonraker_host: 127.0.0.1 -moonraker_port: 7125 - -[menu __main] -name: {{ gettext('Main Menu') }} - -###################################################### -# Setting ACTIONS -###################################################### - -[menu __main actions] -name: {{ gettext('Actions') }} -icon: move - -###################################################### -# Setting ACTIONS HOMING -###################################################### - -[menu __main actions homing] -name: {{ gettext('Homing') }} -icon: home - -[menu __main actions homing homeall] -name: {{ gettext('Home All') }} -icon: home -method: printer.gcode.script -params: {"script":"G28"} - -[menu __main actions homing homex] -name: {{ gettext('Home X') }} -icon: home-x -method: printer.gcode.script -params: {"script":"G28 X"} - -[menu __main actions homing homey] -name: {{ gettext('Home Y') }} -icon: home-y -method: printer.gcode.script -params: {"script":"G28 Y"} - -[menu __main actions homing homez] -name: {{ gettext('Home Z') }} -icon: home-z -method: printer.gcode.script -params: {"script":"G28 Z"} - -[menu __main actions homing homexy] -name: {{ gettext('Home XY') }} -icon: home -method: printer.gcode.script -params: {"script":"G28 X Y"} - -[menu __main actions homing quad_gantry_level] -name: {{ gettext('Quad Gantry Level') }} -icon: home-z -method: printer.gcode.script -params: {"script":"QUAD_GANTRY_LEVEL"} -enable: {{ printer.quad_gantry_level is defined }} - -[menu __main actions homing Z-Tilt] -name: {{ gettext('Z Tilt') }} -icon: z-tilt -method: printer.gcode.script -params: {"script":"Z_TILT_ADJUST"} -enable: {{ printer.z_tilt is defined }} - -###################################################### -# Setting ACTIONS OTHER -###################################################### - -[menu __main actions preheat] -name: {{ gettext('Preheat') }} -icon: heat-up -panel: preheat - -[menu __main actions move] -name: {{ gettext('Move') }} -icon: move -panel: move - -[menu __main actions extrude] -name: {{ gettext('Extrude') }} -icon: filament -panel: extrude - -[menu __main actions fan] -name: {{ gettext('Fan') }} -icon: fan -panel: fan - -[menu __main actions temperature] -name: {{ gettext('Temperature') }} -icon: heat-up -panel: temperature - -[menu __main actions macros] -name: {{ gettext('Macros') }} -icon: custom-script -panel: gcode_macros -enable: {{ printer.gcode_macros.count > 0 }} - -[menu __main actions power] -name: {{ gettext('Power') }} -icon: shutdown -panel: power -enable: {{ printer.power_devices.count > 0 }} - -[menu __main actions disablemotors] -name: {{ gettext('Disable Motors') }} -icon: motor-off -method: printer.gcode.script -params: {"script":"M18"} - -[menu __main actions console] -name: {{ gettext('Console') }} -icon: console -panel: console - -[menu __main actions inputshaper] -name: {{ gettext('Input Shaper') }} -icon: bed-level -panel: input_shaper - -###################################################### -# Setting CONFIG -###################################################### - -[menu __main config] -name: {{ gettext('Configuration') }} -icon: settings - -[menu __main config bedlevel] -name: {{ gettext('Bed Level') }} -icon: bed-level -panel: bed_level - -[menu __main config bedmesh] -name: {{ gettext('Bed Mesh') }} -icon: bed-level -panel: bed_mesh -enable: {{ printer.bed_mesh is defined }} - -[menu __main config zoffset] -name: {{ gettext('Z Calibrate') }} -icon: z-farther -panel: zcalibrate -enable: {{ ((printer.bltouch != False) or (printer.probe != False)) }} - -[menu __main config limits] -name: {{ gettext('Limits') }} -icon: fine-tune -panel: limits - -[menu __main config network] -name: {{ gettext('Network') }} -icon: network -panel: network - -[menu __main config settings] -name: {{ gettext('Settings') }} -icon: settings -panel: settings - -[menu __main config save] -name: {{ gettext('Save Config') }} -icon: complete -method: printer.gcode.script -params: {"script":"SAVE_CONFIG"} -confirm: - {{ gettext('Save configuration.') }} - {{ gettext('Klipper will reboot') }} - -[menu __main config system] -name: {{ gettext('System') }} -icon: info -panel: system - -###################################################### -# Setting PRINT -###################################################### - -[menu __main print] -name: {{ gettext('Print') }} -icon: print -panel: print - -[menu __print] -name: {{ gettext('Print Control') }} - -[menu __print temperature] -name: {{ gettext('Temperature') }} -icon: heat-up -panel: temperature - -[menu __print fan] -name: {{ gettext('Fan') }} -icon: fan -panel: fan - -[menu __print extrude] -name: {{ gettext('Extrude') }} -icon: filament -panel: extrude -enable: {{ printer.pause_resume.is_paused == True }} - -[menu __print macros] -name: {{ gettext('Macros') }} -icon: custom-script -panel: gcode_macros -enable: {{ printer.gcode_macros.count > 0 }} - -[menu __print console] -name: {{ gettext('Console') }} -icon: console -panel: console - -[menu __print limits] -name: {{ gettext('Limits') }} -icon: fine-tune -panel: limits - -[menu __print network] -name: {{ gettext('Network') }} -icon: network -panel: network - -[menu __print settings] -name: {{ gettext('Settings') }} -icon: settings -panel: settings - -[menu __print power] -name: {{ gettext('Выключить\n питание') }} -icon: shutdown -method: printer.gcode.script -params: {"script":"M81"} -confirm: - {{ gettext('Нажмите кнопку "Продолжить", чтобы выключить принтер.') }} - -###################################################### -# Setting SPLASHSCREEN -###################################################### - -[menu __splashscreen] -name: {{ gettext('Menu') }} - -[menu __splashscreen network] -name: {{ gettext('Network') }} -icon: network -panel: network - -[menu __splashscreen settings] -name: {{ gettext('Settings') }} -icon: settings -panel: settings - -[menu __splashscreen system] -name: {{ gettext('System') }} -icon: info -panel: system - -[menu __splashscreen power] -name: {{ gettext('Выключить\n питание') }} -icon: shutdown -method: printer.gcode.script -params: {"script":"M81"} -confirm: - {{ gettext('Нажмите кнопку "Продолжить", чтобы выключить принтер.') }} \ No newline at end of file diff --git a/ks_includes/defaults_simple.conf b/ks_includes/defaults_simple.conf index 7ceb0a5c9..dcd0e6c3f 100644 --- a/ks_includes/defaults_simple.conf +++ b/ks_includes/defaults_simple.conf @@ -38,7 +38,7 @@ name: {{ gettext('Main Menu') }} # Setting ACTIONS ###################################################### [menu __main actions] -name: {{ gettext('Действия') }} +name: {{ gettext('Actions') }} icon: move [menu __main actions move] @@ -92,28 +92,25 @@ icon: bed-level panel: bed_level [menu __main actions preheat] -name: {{ gettext('Преднагрев') }} +name: {{ gettext('Preheat') }} icon: heat-up panel: preheat +[menu __main actions fan] +name: {{ gettext('Fan') }} +icon: fan +panel: fan + [menu __main actions extrude] -name: {{ gettext('Экструзия') }} +name: {{ gettext('Extrude') }} icon: filament panel: extrude -[menu __main actions power] -name: {{ gettext('Выключить\n питание') }} -icon: shutdown -method: printer.gcode.script -params: {"script":"M81"} -confirm: - {{ gettext('Нажмите кнопку "Продолжить", чтобы выключить принтер.') }} - ###################################################### # Setting CONFIG ###################################################### [menu __main config] -name: {{ gettext('Конфигурация') }} +name: {{ gettext('Configuration') }} icon: settings [menu __main config network] @@ -127,21 +124,27 @@ icon: settings panel: settings [menu __main config system] +name: {{ gettext('Updating') }} +icon: refresh +panel: updates + +[menu __main config updates] name: {{ gettext('System') }} icon: info panel: system + ###################################################### # Setting PRINT ###################################################### +[menu __print] +name: {{ gettext('Print Control') }} + [menu __main print] name: {{ gettext('Print') }} icon: print panel: print -[menu __print] -name: {{ gettext('Print Control') }} - [menu __print temperature] name: {{ gettext('Temperature') }} icon: heat-up @@ -156,7 +159,7 @@ panel: fan name: {{ gettext('Extrude') }} icon: filament panel: extrude -enable: {{ printer.pause_resume.is_paused == True }} +enable: {{ printer.pause_resume.is_paused == True}} [menu __print network] name: {{ gettext('Network') }} @@ -168,6 +171,7 @@ name: {{ gettext('Settings') }} icon: settings panel: settings + ###################################################### # Setting SPLASHSCREEN ###################################################### @@ -175,16 +179,16 @@ panel: settings name: {{ gettext('Menu') }} [menu __splashscreen network] -name: {{ gettext('Network') }} -icon: network -panel: network - -[menu __splashscreen settings] name: {{ gettext('Settings') }} icon: settings panel: settings +[menu __splashscreen settings] +name: {{ gettext('Updating') }} +icon: refresh +panel: updates + [menu __splashscreen system] name: {{ gettext('System') }} icon: info -panel: system \ No newline at end of file +panel: system diff --git a/ks_includes/emptyCursor.xbm b/ks_includes/emptyCursor.xbm new file mode 100644 index 000000000..9aa63adee --- /dev/null +++ b/ks_includes/emptyCursor.xbm @@ -0,0 +1,6 @@ +#define emptyCursor_width 1 +#define emptyCursor_height 1 +#define emptyCursor_x_hot 0 +#define emptyCursor_y_hot 0 +static unsigned char emptyCursor_bits[] = { +0x00}; diff --git a/ks_includes/files.py b/ks_includes/files.py index 77bd988c8..bce3a4a30 100644 --- a/ks_includes/files.py +++ b/ks_includes/files.py @@ -1,27 +1,18 @@ import logging -import json import os -import base64 import gi + gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import GLib -class KlippyFiles(): - thumbnail_dir = "/tmp/.KS-thumbnails" +class KlippyFiles: def __init__(self, screen): - self.loop = None - self._poll_task = None self._screen = screen self.callbacks = [] self.files = {} self.filelist = [] - self.metadata_timeout = {} - - if not os.path.exists(self.thumbnail_dir): - os.makedirs(self.thumbnail_dir) - self.gcodes_path = None def initialize(self): @@ -29,9 +20,17 @@ def initialize(self): if "virtual_sdcard" in self._screen.printer.get_config_section_list(): vsd = self._screen.printer.get_config_section("virtual_sdcard") if "path" in vsd: - self.gcodes_path = vsd['path'] + self.gcodes_path = os.path.expanduser(vsd['path']) logging.info("Gcodes path: %s" % self.gcodes_path) + def reset(self): + self.run_callbacks() + self.callbacks = None + self.files = None + self.filelist = None + self.gcodes_path = None + self._screen = None + def _callback(self, result, method, params): if method == "server.files.list": if "result" in result and isinstance(result['result'], list): @@ -98,7 +97,7 @@ def add_file(self, item, notify=True): if filename in self.filelist: logging.info("File already exists: %s" % filename) self.request_metadata(filename) - GLib.timeout_add(1000, self.run_callbacks, mods=[filename]) + GLib.timeout_add_seconds(1, self.run_callbacks, mods=[filename]) return self.filelist.append(filename) @@ -147,11 +146,11 @@ def file_metadata_exists(self, filename): return True return False - def get_thumbnail_location(self, filename): - if not self.has_thumbnail(filename): - return None - + def get_thumbnail_location(self, filename, small=False): thumb = self.files[filename]['thumbnails'][0] + if small and len(self.files[filename]['thumbnails']) > 1: + if self.files[filename]['thumbnails'][0]['width'] > self.files[filename]['thumbnails'][1]['width']: + thumb = self.files[filename]['thumbnails'][1] if thumb['local'] is False: return ['http', thumb['path']] return ['file', thumb['path']] @@ -180,16 +179,14 @@ def remove_file(self, filename, notify=True): self.run_callbacks(deletedfiles=[filename]) def ret_file_data(self, filename): - print("Getting file info for %s" % (filename)) + print("Getting file info for %s" % filename) self._screen._ws.klippy.get_file_metadata(filename, self._callback) def run_callbacks(self, newfiles=[], deletedfiles=[], mods=[]): if len(self.callbacks) <= 0: - return - + return False for cb in self.callbacks: GLib.idle_add(cb, newfiles, deletedfiles, mods) - return False def get_file_list(self): @@ -198,5 +195,4 @@ def get_file_list(self): def get_file_info(self, filename): if filename not in self.files: return {"path": None, "modified": 0, "size": 0} - return self.files[filename] diff --git a/ks_includes/functions.py b/ks_includes/functions.py index 46f71a813..50c7d00e5 100644 --- a/ks_includes/functions.py +++ b/ks_includes/functions.py @@ -17,6 +17,7 @@ ctypes.cdll.LoadLibrary('libXext.so.6') libXext = ctypes.CDLL('libXext.so.6') + class DPMS_State: Fail = -1 On = 0 @@ -24,6 +25,7 @@ class DPMS_State: Suspend = 2 Off = 3 + def get_DPMS_state(display_name_in_byte_string=b':0'): state = DPMS_State.Fail if not isinstance(display_name_in_byte_string, bytes): @@ -35,8 +37,8 @@ def get_DPMS_state(display_name_in_byte_string=b':0'): dummy1_i_p = ctypes.create_string_buffer(8) dummy2_i_p = ctypes.create_string_buffer(8) if display.value: - if libXext.DPMSQueryExtension(display, dummy1_i_p, dummy2_i_p)\ - and libXext.DPMSCapable(display): + if libXext.DPMSQueryExtension(display, dummy1_i_p, dummy2_i_p) \ + and libXext.DPMSCapable(display): onoff_p = ctypes.create_string_buffer(1) state_p = ctypes.create_string_buffer(2) if libXext.DPMSInfo(display, state_p, onoff_p): @@ -45,14 +47,18 @@ def get_DPMS_state(display_name_in_byte_string=b':0'): state = struct.unpack('H', state_p.raw)[0] libXext.XCloseDisplay(display) return state + + dpms_loaded = True except Exception: pass + def get_network_interfaces(): stream = os.popen("ip addr | grep ^'[0-9]' | cut -d ' ' -f 2 | grep -o '[a-zA-Z0-9\\.]*'") return [i for i in stream.read().strip().split('\n') if not i.startswith('lo')] + def get_wireless_interfaces(): p = subprocess.Popen(["which", "iwconfig"], stdout=subprocess.PIPE) @@ -64,7 +70,8 @@ def get_wireless_interfaces(): try: p = subprocess.Popen(["iwconfig"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = p.stdout.read().decode('ascii').split('\n') - except Exception: + except Exception as e: + logging.critical(e, exc_info=True) logging.info("Error with running iwconfig command") return None interfaces = [] @@ -75,6 +82,7 @@ def get_wireless_interfaces(): return interfaces + def get_software_version(): prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always', '--tags', '--long', '--dirty') @@ -94,6 +102,7 @@ def get_software_version(): logging.exception("Error runing git describe") return "?" + def patch_threading_excepthook(): """Installs our exception handler into the threading modules Thread object Inspired by https://bugs.python.org/issue1230540 @@ -111,15 +120,18 @@ def run_with_excepthook(*args, **kwargs): raise except Exception: sys.excepthook(*sys.exc_info(), thread_identifier=threading.get_ident()) + self.run = run_with_excepthook + threading.Thread.__init__ = new_init + # Timed rotating file handler based on Klipper and Moonraker's implementation class KlipperScreenLoggingHandler(logging.handlers.TimedRotatingFileHandler): def __init__(self, software_version, filename, **kwargs): super(KlipperScreenLoggingHandler, self).__init__(filename, **kwargs) self.rollover_info = { - 'header': f"{'-'*20}KlipperScreen Log Start{'-'*20}", + 'header': f"{'-' * 20}KlipperScreen Log Start{'-' * 20}", 'version': f"Git Version: {software_version}", } lines = [line for line in self.rollover_info.values() if line] @@ -135,6 +147,7 @@ def doRollover(self): if self.stream is not None: self.stream.write("\n".join(lines) + "\n") + # Logging based on Arksine's logging setup def setup_logging(log_file, software_version): root_logger = logging.getLogger() @@ -164,6 +177,7 @@ def setup_logging(log_file, software_version): def logging_exception_handler(type, value, tb, thread_identifier=None): logging.exception( "Uncaught exception %s: %s\nTraceback: %s" % (type, value, "\n".join(traceback.format_tb(tb)))) + sys.excepthook = logging_exception_handler logging.captureWarnings(True) diff --git a/ks_includes/locales/KlipperScreen.pot b/ks_includes/locales/KlipperScreen.pot index f61a02fac..b4342a0c5 100644 --- a/ks_includes/locales/KlipperScreen.pot +++ b/ks_includes/locales/KlipperScreen.pot @@ -8,18 +8,15 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #, python-format msgid "%s will be updated to version" @@ -31,6 +28,9 @@ msgstr "" msgid "24 Hour Time" msgstr "" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "" + msgid "Abort" msgstr "" @@ -46,24 +46,45 @@ msgstr "" msgid "Add bed mesh profile" msgstr "" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "" + msgid "Are you sure you wish to cancel this print?" msgstr "" +msgid "Are you sure you wish to disable motors?" +msgstr "" + msgid "Are you sure you wish to reboot the system?" msgstr "" msgid "Are you sure you wish to shutdown the system?" msgstr "" +msgid "Auto" +msgstr "" + +msgid "Auto-scroll" +msgstr "" + msgid "Bed Level" msgstr "" msgid "Bed Mesh" msgstr "" +msgid "Bltouch found applied offset" +msgstr "" + msgid "Calibrate" msgstr "" +msgid "Calibrated, save configuration to make it permanent" +msgstr "" + +msgid "Can't set above the maximum:" +msgstr "" + msgid "Cancel" msgstr "" @@ -76,6 +97,9 @@ msgstr "" msgid "Cancelling" msgstr "" +msgid "Cannot connect to Moonraker" +msgstr "" + msgid "Channel" msgstr "" @@ -87,15 +111,15 @@ msgstr "" msgid "Close" msgstr "" -msgid "Colorized" -msgstr "" - msgid "Complete" msgstr "" msgid "Configuration" msgstr "" +msgid "Confirm Emergency Stop" +msgstr "" + msgid "Connected" msgstr "" @@ -121,13 +145,13 @@ msgstr "" msgid "Delete" msgstr "" -msgid "Disable Motors" +msgid "Deselect" msgstr "" -msgid "Disable XY" +msgid "Disable Motors" msgstr "" -msgid "Disconnect" +msgid "Disable XY" msgstr "" msgid "Displayed Macros" @@ -140,9 +164,6 @@ msgstr "" msgid "Do you want to recover %s?" msgstr "" -msgid "Duration Only" -msgstr "" - msgid "Elapsed:" msgstr "" @@ -161,6 +182,9 @@ msgstr "" msgid "Extrusion -" msgstr "" +msgid "Failed, adjust position first" +msgstr "" + msgid "Fan" msgstr "" @@ -176,15 +200,31 @@ msgstr "" msgid "Finish" msgstr "" -msgid "Firmware Restart" +msgid "" +"Firmware\n" +"Restart" msgstr "" msgid "Font Size" msgstr "" +msgid "" +"Full\n" +"Update" +msgstr "" + msgid "Go Back" msgstr "" +msgid "Hidden" +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "Hide sensors in Temp." +msgstr "" + msgid "Home" msgstr "" @@ -209,12 +249,6 @@ msgstr "" msgid "Hostname" msgstr "" -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - msgid "Icon Theme" msgstr "" @@ -242,28 +276,20 @@ msgstr "" msgid "Invert Z" msgstr "" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" -msgid "Klipper Version" +msgid "Klipper: disconnected" msgstr "" msgid "Klipper has disconnected" msgstr "" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" - msgid "Klipper has encountered an error." msgstr "" -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" - msgid "Klipper has shutdown" msgstr "" @@ -273,9 +299,6 @@ msgstr "" msgid "Klipper will reboot" msgstr "" -msgid "KlipperScreen Version" -msgstr "" - msgid "Language" msgstr "" @@ -294,6 +317,9 @@ msgstr "" msgid "Lower Nozzle" msgstr "" +msgid "Lost Connection to Moonraker" +msgstr "" + msgid "Macro shortcut on sidebar" msgstr "" @@ -303,7 +329,7 @@ msgstr "" msgid "Main Menu" msgstr "" -msgid "Max Accelation" +msgid "Max Acceleration" msgstr "" msgid "Max Acceleration to Deceleration" @@ -321,13 +347,13 @@ msgstr "" msgid "Modified" msgstr "" -msgid "Move" +msgid "Moonraker: connected" msgstr "" -msgid "Move Distance (mm)" +msgid "Move" msgstr "" -msgid "Move Speed (mm/s)" +msgid "Move Distance (mm)" msgstr "" msgid "Name" @@ -336,6 +362,9 @@ msgstr "" msgid "Network" msgstr "" +msgid "Nothing selected" +msgstr "" + msgid "Number Pad" msgstr "" @@ -343,25 +372,36 @@ msgid "Off" msgstr "" #, python-format -msgid "Outdated by %d commits:" +msgid "Outdated by %d" msgstr "" msgid "PSK for" msgstr "" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "" +msgstr[1] "" + +msgid "Password saved" +msgstr "" + msgid "Pause" msgstr "" msgid "Paused" msgstr "" -msgid "Power" +msgid "Perform a full upgrade?" msgstr "" -msgid "Power On Printer" +msgid "Please recompile and flash the micro-controller." msgstr "" -msgid "Preheat" +msgid "Power" +msgstr "" + +msgid "Power On Printer" msgstr "" msgid "Print" @@ -379,9 +419,15 @@ msgstr "" msgid "Printing" msgstr "" +msgid "Probe found applied offset" +msgstr "" + msgid "Profile Name:" msgstr "" +msgid "Preheat" +msgstr "" + msgid "Quad Gantry Level" msgstr "" @@ -394,6 +440,9 @@ msgstr "" msgid "Recover Soft" msgstr "" +msgid "Reference" +msgstr "" + msgid "Restart" msgstr "" @@ -403,33 +452,56 @@ msgstr "" msgid "Retract" msgstr "" +#, python-format +msgid "Retry #%s" +msgstr "" + msgid "Save" msgstr "" msgid "Save Config" msgstr "" -msgid "Save configuration." +msgid "Save configuration" msgstr "" -msgid "Screen Power Off Time" +msgid "Screen DPMS" msgstr "" -msgid "Screen will show in less than one second" +msgid "Screen Power Off Time" msgstr "" msgid "Screws Adjust" msgstr "" +msgid "Select" +msgstr "" + +msgid "Send" +msgstr "" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "" + +msgid "Set Temp" +msgstr "" + msgid "Settings" msgstr "" +msgid "Show" +msgstr "" + msgid "Size" msgstr "" msgid "Slicer" msgstr "" +msgid "Slicer Time correction (%)" +msgstr "" + msgid "Small" msgstr "" @@ -448,7 +520,10 @@ msgstr "" msgid "Square Corner Velocity" msgstr "" -msgid "Starting WiFi Re-association" +msgid "Start" +msgstr "" + +msgid "Starting WiFi Association" msgstr "" msgid "Starting recovery for" @@ -470,6 +545,9 @@ msgid "" "Shutdown" msgstr "" +msgid "Temp (°C)" +msgstr "" + msgid "Temperature" msgstr "" @@ -480,6 +558,12 @@ msgstr "" msgid "Tool" msgstr "" +msgid "Total:" +msgstr "" + +msgid "Unknown Heater" +msgstr "" + msgid "Unload" msgstr "" @@ -489,6 +573,9 @@ msgstr "" msgid "Update" msgstr "" +msgid "Updating" +msgstr "" + msgid "Uploaded" msgstr "" @@ -501,6 +588,9 @@ msgstr "" msgid "X-" msgstr "" +msgid "XY Move Speed (mm/s)" +msgstr "" + msgid "Y+" msgstr "" @@ -510,7 +600,10 @@ msgstr "" msgid "Z Calibrate" msgstr "" -msgid "Z Offset" +msgid "Z Move Speed (mm/s)" +msgstr "" + +msgid "Z Position" msgstr "" msgid "Z Tilt" @@ -522,9 +615,19 @@ msgstr "" msgid "Z-" msgstr "" +msgid "commit" +msgid_plural "commits" +msgstr[0] "" +msgstr[1] "" + msgid "dBm" msgstr "" +msgid "hour" +msgid_plural "hours" +msgstr[0] "" +msgstr[1] "" + msgid "minutes" msgstr "" diff --git a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..e626b303d Binary files /dev/null and b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..f221a9eb2 --- /dev/null +++ b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,683 @@ +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: SRBJ\n" +"Language-Team: \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s vil blive opdateret til version" + +msgid "(default)" +msgstr "(standard)" + +msgid "24 Hour Time" +msgstr "24-timers visning" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "En FIRMWARE_RESTART kan løse problemet." + +msgid "Abort" +msgstr "Annuller" + +msgid "Accept" +msgstr "OK" + +msgid "Actions" +msgstr "Muligheder" + +msgid "Add Printer" +msgstr "Tilføj printer" + +msgid "Add bed mesh profile" +msgstr "Tilføj \"bed-mesh\" profil" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Er du sikker på, at du vil køre nødstop?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Er du sikker på du vil annullere det igangværende print?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Er du sikker på, at du vil deaktivere motorer?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Er du sikker på du vil genstarte systemet?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Er du sikker på du vil lukke systemet?" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + +msgid "Bed Level" +msgstr "Bed-Level" + +msgid "Bed Mesh" +msgstr "Bed-mesh" + +msgid "Bltouch found applied offset" +msgstr "Bltouch fundet anvendt offset" + +msgid "Calibrate" +msgstr "Kalibrér" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Kalibreret, gem konfiguration for at gøre den permanent" + +msgid "Can't set above the maximum:" +msgstr "Kan ikke indstilles over maksimum:" + +msgid "Cancel" +msgstr "Annuller" + +msgid "Cancel Print" +msgstr "Annuller print" + +msgid "Cancelled" +msgstr "Annulleret" + +msgid "Cancelling" +msgstr "Annullerer" + +msgid "Cannot connect to Moonraker" +msgstr "Kan ikke oprette forbindelse til Moonraker" + +msgid "Channel" +msgstr "Kanal" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Tjek /tmp/KlipperScreen.log for mere information.\n" +"Indsend venligst et \"Issue\" på GitHub for hjælp." + +msgid "Close" +msgstr "Luk" + +msgid "Complete" +msgstr "Færdig" + +msgid "Configuration" +msgstr "Konfiguration" + +msgid "Confirm Emergency Stop" +msgstr "Bekræft Nødstop" + +msgid "Connected" +msgstr "Forbundet" + +#, python-format +msgid "Connecting to %s" +msgstr "Forbinder til %s" + +msgid "Console" +msgstr "Terminal" + +msgid "Continue" +msgstr "Fortsæt" + +msgid "Cooldown" +msgstr "Afkøling" + +msgid "Date" +msgstr "Dato" + +msgid "Decrease" +msgstr "Formindsk" + +msgid "Delete" +msgstr "Slet" + +msgid "Deselect" +msgstr "Fravælg" + +msgid "Disable Motors" +msgstr "Deaktivér motorer" + +msgid "Disable XY" +msgstr "Deaktivér XY" + +msgid "Displayed Macros" +msgstr "Viste makroer" + +msgid "Distance (mm)" +msgstr "Længde (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Vil du gendanne %s?" + +msgid "Elapsed:" +msgstr "Tid:" + +msgid "Error" +msgstr "Fejl" + +msgid "Estimated Time Method" +msgstr "Metode til beregning af tid" + +msgid "Extrude" +msgstr "Ekstrudér" + +msgid "Extrusion +" +msgstr "Ekstrudering +" + +msgid "Extrusion -" +msgstr "Ekstrudering -" + +msgid "Failed, adjust position first" +msgstr "Mislykkedes, juster først positionen" + +msgid "Fan" +msgstr "Blæser" + +msgid "Filament Used" +msgstr "Filament forbrug" + +msgid "File" +msgstr "Fil" + +msgid "Fine Tuning" +msgstr "Finjustering" + +msgid "Finish" +msgstr "Færdig" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Genstart" + +msgid "Font Size" +msgstr "Skriftstørrelse" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Fuld\n" +"Opdatering" + +msgid "Go Back" +msgstr "Gå tilbage" + +msgid "Hidden" +msgstr "Skjult" + +msgid "Hide" +msgstr "Skjule" + +msgid "Hide sensors in Temp." +msgstr "Skjul sensorer i Temp." + +msgid "Home" +msgstr "Home" + +msgid "Home All" +msgstr "Home alle" + +msgid "Home X" +msgstr "Home X" + +msgid "Home XY" +msgstr "Home XY" + +msgid "Home Y" +msgstr "Home Y" + +msgid "Home Z" +msgstr "Home Z" + +msgid "Homing" +msgstr "Homing" + +msgid "Hostname" +msgstr "Værtsnavn" + +msgid "Icon Theme" +msgstr "Ikon-tema" + +msgid "Increase" +msgstr "Forøg" + +msgid "Initializing" +msgstr "Initialiserer" + +msgid "Initializing printer..." +msgstr "Initialiserer printer..." + +msgid "Interface" +msgstr "Interface" + +msgid "Invalid" +msgstr "Ugyldig" + +msgid "Invert X" +msgstr "Invertér X" + +msgid "Invert Y" +msgstr "Invertér Y" + +msgid "Invert Z" +msgstr "Invertér Z" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"Genstart" + +msgid "Klipper has disconnected" +msgstr "Klipper er frokoblet" + +msgid "Klipper has encountered an error." +msgstr "Klipper har fundet en fejl." + +msgid "Klipper has shutdown" +msgstr "Klipper er lukket ned" + +msgid "Klipper is attempting to start" +msgstr "Klipper forsøger at starte" + +msgid "Klipper will reboot" +msgstr "Klipper vil genstarte" + +msgid "Language" +msgstr "Sprog" + +msgid "Large" +msgstr "Stor" + +msgid "Left:" +msgstr "Resterende:" + +msgid "Limits" +msgstr "Grænser" + +msgid "Load" +msgstr "Indlæs" + +msgid "Lower Nozzle" +msgstr "Sænk Nozzle" + +msgid "Macro shortcut on sidebar" +msgstr "Makrogenvej på sidelinjen" + +msgid "Macros" +msgstr "Makroer" + +msgid "Main Menu" +msgstr "Hovedmenu" + +msgid "Max Accelation" +msgstr "Maks. acceleration" + +msgid "Max Acceleration to Deceleration" +msgstr "Maks. acceleration til decceleration" + +msgid "Max Velocity" +msgstr "Maks. hastighed" + +msgid "Medium" +msgstr "Mellem" + +msgid "Menu" +msgstr "Menu" + +msgid "Modified" +msgstr "Ændret" + +msgid "Moonraker: connected" +msgstr "Moonraker: tilsluttet" + +msgid "Move" +msgstr "Flytning" + +msgid "Move Distance (mm)" +msgstr "Flyt længde (mm)" + +msgid "Name" +msgstr "Navn" + +msgid "Network" +msgstr "Netværk" + +msgid "Nothing selected" +msgstr "Intet valgt" + +msgid "Off" +msgstr "Sluk" + +#, python-format +msgid "Outdated by %d" +msgstr "Forældet med %d" + +msgid "PSK for" +msgstr "PSK for" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Pakken vil blive opdateret" +msgstr[1] "Pakker vil blive opdateret" + +msgid "Password saved" +msgstr "Adgangskode gemt" + +msgid "Pause" +msgstr "Pause" + +msgid "Paused" +msgstr "På pause" + +msgid "Perform a full upgrade?" +msgstr "Vil du udføre en fuld opgradering?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Genkompilér og flash mikrocontrolleren." + +msgid "Power" +msgstr "Strømstyring" + +msgid "Power On Printer" +msgstr "Tænd printer" + +msgid "Print" +msgstr "Print" + +msgid "Print Control" +msgstr "Print styring" + +msgid "Print Time" +msgstr "Printtid" + +msgid "Printer Connections" +msgstr "Printer forbindelser" + +msgid "Printing" +msgstr "Printer" + +msgid "Probe found applied offset" +msgstr "Probe fundet anvendt offset" + +msgid "Profile Name:" +msgstr "Profilnavn:" + +msgid "Quad Gantry Level" +msgstr "Justering af 4-søjlers konstruktion" + +msgid "Raise Nozzle" +msgstr "Hæv Nozzle" + +msgid "Recover Hard" +msgstr "Nulstil alt" + +msgid "Recover Soft" +msgstr "Nulstil" + +msgid "Reference" +msgstr "Reference" + +msgid "Restart" +msgstr "Genstart" + +msgid "Resume" +msgstr "Genoptag" + +msgid "Retract" +msgstr "Retract" + +#, python-format +msgid "Retry #%s" +msgstr "Prøv igen #%s" + +msgid "Save" +msgstr "Gem" + +msgid "Save Config" +msgstr "Gem Konfiguration" + +msgid "Save configuration" +msgstr "Gem Konfiguration" + +msgid "Screen DPMS" +msgstr "Skærm DPMS" + +msgid "Screen Power Off Time" +msgstr "Skærm timeout" + +msgid "Screws Adjust" +msgstr "Skruejustering" + +msgid "Select" +msgstr "Vælg" + +msgid "Send" +msgstr "Sende" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Sender Power ON-signal til: %s" + +msgid "Set Temp" +msgstr "Indstil Temp" + +msgid "Settings" +msgstr "Indstillinger" + +msgid "Show" +msgstr "At vise" + +msgid "Size" +msgstr "Størrelse" + +msgid "Slicer" +msgstr "Slicer" + +msgid "Slicer Time correction (%)" +msgstr "Slicer Tidskorrektion (%)" + +msgid "Small" +msgstr "Lille" + +msgid "Sort by: " +msgstr "Sortér efter: " + +msgid "Speed (mm/s)" +msgstr "Hastighed (mm/s)" + +msgid "Speed +" +msgstr "Hastighed +" + +msgid "Speed -" +msgstr "Hastighed -" + +msgid "Square Corner Velocity" +msgstr "Hastighed for 90° hjørne" + +msgid "Start" +msgstr "Start" + +msgid "Starting WiFi Association" +msgstr "Starter WiFi Association" + +msgid "Starting recovery for" +msgstr "Gendanner" + +msgid "Starting update for" +msgstr "Opdaterer" + +msgid "System" +msgstr "System" + +msgid "" +"System\n" +"Restart" +msgstr "" +"Genstart\n" +"system" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"Luk\n" +"system ned" + +msgid "Temp (°C)" +msgstr "Temp (°C)" + +msgid "Temperature" +msgstr "Temperatur" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "KlipperScreen skal genstartes for at anvende %s" + +msgid "Tool" +msgstr "Ekstruder" + +msgid "Total:" +msgstr "Total:" + +msgid "Unknown Heater" +msgstr "Ukendt varmelegeme" + +msgid "Unload" +msgstr "Tilbagetræk" + +msgid "Up To Date" +msgstr "Up-to-Date" + +msgid "Update" +msgstr "Opdater" + +msgid "Updating" +msgstr "Opdatering" + +msgid "Uploaded" +msgstr "Uploadet" + +msgid "View Mesh" +msgstr "Vis mesh" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY Flyt hastighed (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Kalibrér Z" + +msgid "Z Move Speed (mm/s)" +msgstr "Z Flyt hastighed (mm/s)" + +msgid "Z Position" +msgstr "Z-position" + +msgid "Z Tilt" +msgstr "Z-tilt" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "ændring" +msgstr[1] "ændringer" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "time" +msgstr[1] "timer" + +msgid "minutes" +msgstr "minutter" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" + +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Z-offset" + +#~ msgid "Unknown Heater " +#~ msgstr "Ukendt varmelegeme " + +#~ msgid "Disconnect" +#~ msgstr "Afbryd forbindelse" + +#~ msgid "Duration Only" +#~ msgstr "Kun varighed" + +#~ msgid "Klipper Version" +#~ msgstr "Klipper version" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper har fundet en fejl med mcu.\n" +#~ "Kompilér og flash venligst firmware på ny." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper har fundet en fejl.\n" +#~ "Tryk på \"Genstart alt\" for at forsøge at udbedre fejlen." + +#~ msgid "KlipperScreen Version" +#~ msgstr "KlipperScreen version" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Vis kun varmelegemer i Temp." + +#~ msgid "Target" +#~ msgstr "Mål" + +#~ msgid "Temp" +#~ msgstr "Temp" diff --git a/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.mo index 5a3f044cd..f85188660 100644 Binary files a/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.po index 89b040225..141ae387a 100644 --- a/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/de_DE/LC_MESSAGES/KlipperScreen.po @@ -5,22 +5,18 @@ # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-20 05:33+0200\n" -"PO-Revision-Date: 2021-09-29 10:51-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 10:43-0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "%d Pakete werden aktualisiert" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" @@ -30,7 +26,10 @@ msgid "(default)" msgstr "(Standard)" msgid "24 Hour Time" -msgstr "24-Stunden-Zeit" +msgstr "24h-Zeit" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Ein FIRMWARE_RESTART kann das Problem beheben." msgid "Abort" msgstr "Abbrechen" @@ -47,24 +46,45 @@ msgstr "Drucker hinzufügen" msgid "Add bed mesh profile" msgstr "Mesh-Level Profil hinzufügen" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Sind Sie sicher, dass Sie Not-Aus ausführen möchten?" + msgid "Are you sure you wish to cancel this print?" msgstr "Möchten Sie diesen Druck wirklich abbrechen?" +msgid "Are you sure you wish to disable motors?" +msgstr "Möchten Sie die Motoren wirklich deaktivieren?" + msgid "Are you sure you wish to reboot the system?" msgstr "Möchten Sie das System wirklich neu starten?" msgid "Are you sure you wish to shutdown the system?" msgstr "Möchten Sie das System wirklich herunterfahren?" +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + msgid "Bed Level" msgstr "Druckbett leveln" msgid "Bed Mesh" msgstr "Druckbett Mesh-Level" +msgid "Bltouch found applied offset" +msgstr "Bltouch hat angewendeten Offset gefunden" + msgid "Calibrate" msgstr "Höheneinstellung" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Kalibriert, Konfiguration speichern, um sie dauerhaft zu machen" + +msgid "Can't set above the maximum:" +msgstr "Kann nicht über dem Maximum eingestellt werden:" + msgid "Cancel" msgstr "Abbruch" @@ -75,7 +95,10 @@ msgid "Cancelled" msgstr "Abgebrochen" msgid "Cancelling" -msgstr "Stornieren" +msgstr "Wird unterbrochen" + +msgid "Cannot connect to Moonraker" +msgstr "Es kann keine Verbindung zu Moonraker hergestellt werden" msgid "Channel" msgstr "Kanal" @@ -96,6 +119,9 @@ msgstr "Fertiggestellt" msgid "Configuration" msgstr "Einstellungen" +msgid "Confirm Emergency Stop" +msgstr "Not-Aus bestätigen" + msgid "Connected" msgstr "Verbunden" @@ -121,15 +147,15 @@ msgstr "Verringern" msgid "Delete" msgstr "Löschen" +msgid "Deselect" +msgstr "Abwählen" + msgid "Disable Motors" msgstr "Motoren deaktivieren" msgid "Disable XY" msgstr "Achse XY deaktivieren" -msgid "Disconnect" -msgstr "Nicht verbunden" - msgid "Displayed Macros" msgstr "Aktive Macros" @@ -138,10 +164,7 @@ msgstr "Entfernung (mm)" #, python-format msgid "Do you want to recover %s?" -msgstr "Möchten Sie %s wiederherstellen?" - -msgid "Duration Only" -msgstr "Reine Druckzeit" +msgstr "Möchtest du zurück zu %s?" msgid "Elapsed:" msgstr "Druckzeit:" @@ -161,6 +184,9 @@ msgstr "Extrusion +" msgid "Extrusion -" msgstr "Extrusion -" +msgid "Failed, adjust position first" +msgstr "Fehlgeschlagen, Position zuerst anpassen" + msgid "Fan" msgstr "Lüfter" @@ -174,21 +200,39 @@ msgid "Fine Tuning" msgstr "Feintuning" msgid "Finish" -msgstr "Beende" +msgstr "Ziel" -msgid "Firmware Restart" -msgstr "Firmware Neustarten" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Neu starten" msgid "Font Size" -msgstr "Textgröße" +msgstr "Schriftgröße" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Voll\n" +"Aktualisieren" msgid "Go Back" msgstr "Zurück" +msgid "Hidden" +msgstr "Versteckt" + +msgid "Hide" +msgstr "Verstecken" + +msgid "Hide sensors in Temp." +msgstr "Sensoren in Temp ausblenden." + msgid "Home" -msgstr "" -"Achse\n" -"zurücksetzen" +msgstr "Grundposition" msgid "Home All" msgstr "" @@ -216,19 +260,13 @@ msgstr "" "zurücksetzen" msgid "Homing" -msgstr "Nullpunkt" +msgstr "Grundposition" msgid "Hostname" msgstr "Hostname" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" -msgstr "Symbolthema" +msgstr "Icon Theme" msgid "Increase" msgstr "Erhöhen" @@ -254,34 +292,19 @@ msgstr "Achse Y invertieren" msgid "Invert Z" msgstr "Achse Z invertieren" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" "Klipper\n" -"Neustarten" - -msgid "Klipper Version" -msgstr "Klipper Version" +"Neu starten" msgid "Klipper has disconnected" msgstr "Klipper nicht verbunden" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper hat einen Fehler mit dem Mainboard festgestellt.\n" -"Bitte Mainboard neu programmieren." - msgid "Klipper has encountered an error." msgstr "Klipper hat einen Fehler festgestellt." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper hat einen Fehler festgestellt.\n" -"Führe einen FIRMWARE_RESTART durch um den Fehler zu beheben." - msgid "Klipper has shutdown" msgstr "Klipper abgeschaltet" @@ -291,9 +314,6 @@ msgstr "Klipper ist startbereit" msgid "Klipper will reboot" msgstr "Klipper startet neu" -msgid "KlipperScreen Version" -msgstr "KlipperScreen Version" - msgid "Language" msgstr "Sprache" @@ -304,7 +324,7 @@ msgid "Left:" msgstr "Restzeit:" msgid "Limits" -msgstr "Grenzen" +msgstr "Grenzwerte" msgid "Load" msgstr "Laden" @@ -313,7 +333,7 @@ msgid "Lower Nozzle" msgstr "Düse absenken" msgid "Macro shortcut on sidebar" -msgstr "Makroverknüpfung in der Seitenleiste" +msgstr "Makro Verknüpfung in Sidebar" msgid "Macros" msgstr "Makros" @@ -322,13 +342,13 @@ msgid "Main Menu" msgstr "Hauptmenü" msgid "Max Accelation" -msgstr "Max. Beschleunigung" +msgstr "Max Beschleunigung" msgid "Max Acceleration to Deceleration" -msgstr "Max. Beschleunigung bis Verzögerung" +msgstr "Max Verzögerung" msgid "Max Velocity" -msgstr "Max. Geschwindigkeit" +msgstr "Max Geschwindigkeit" msgid "Medium" msgstr "Mittel" @@ -339,49 +359,60 @@ msgstr "Menü" msgid "Modified" msgstr "Modifiziert" +msgid "Moonraker: connected" +msgstr "Moonraker: Verbunden" + msgid "Move" msgstr "Bewegen" msgid "Move Distance (mm)" msgstr "Bewegungsdistanz (mm)" -msgid "Move Speed (mm/s)" -msgstr "Bewegungsgeschwindigkeit (mm/s)" - msgid "Name" msgstr "Name" msgid "Network" msgstr "Netzwerk" -msgid "Number Pad" -msgstr "Tastenfeld" +msgid "Nothing selected" +msgstr "Nichts ausgewählt" msgid "Off" msgstr "Aus" #, python-format -msgid "Outdated by %d commits:" -msgstr "Veraltet von %d Commits:" +msgid "Outdated by %d" +msgstr "Veraltet von %d" msgid "PSK for" msgstr "PSK für" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Paket wird aktualisiert" +msgstr[1] "Pakete werden aktualisiert" + +msgid "Password saved" +msgstr "Passwort gespeichert" + msgid "Pause" msgstr "Pause" msgid "Paused" msgstr "Pausiert" +msgid "Perform a full upgrade?" +msgstr "Vollständiges Upgrade durchführen?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Please recompile and flash the micro-controller." + msgid "Power" msgstr "Ein" msgid "Power On Printer" msgstr "Drucker einschalten" -msgid "Preheat" -msgstr "Vorheizen" - msgid "Print" msgstr "Druck" @@ -392,11 +423,14 @@ msgid "Print Time" msgstr "Druckzeit" msgid "Printer Connections" -msgstr "Druckeranschlüsse" +msgstr "Drucker Verbindungen" msgid "Printing" msgstr "Drucken" +msgid "Probe found applied offset" +msgstr "Probe hat angewendeten Offset gefunden" + msgid "Profile Name:" msgstr "Profilname:" @@ -406,11 +440,18 @@ msgstr "Quad Gantry Level" msgid "Raise Nozzle" msgstr "Düse anheben" +# Respect the number of characters! +# english text barely fits in small screens msgid "Recover Hard" -msgstr "Genesen Hard" +msgstr "Rücksetzen Hard" +# Respect the number of characters! +# english text barely fits in small screens msgid "Recover Soft" -msgstr "Genesen Soft" +msgstr "Rücksetzen Soft" + +msgid "Reference" +msgstr "Referenz" msgid "Restart" msgstr "Neustart" @@ -421,38 +462,61 @@ msgstr "Fortsetzen" msgid "Retract" msgstr "Zurückziehen" +#, python-format +msgid "Retry #%s" +msgstr "Wiederholen #%s" + msgid "Save" msgstr "Speichern" msgid "Save Config" msgstr "Einstellungen speichern" -msgid "Save configuration." -msgstr "Speichere Einstellungen." +msgid "Save configuration" +msgstr "Speichere Einstellungen" + +msgid "Screen DPMS" +msgstr "Bildschirm-DPMS" msgid "Screen Power Off Time" msgstr "Bildschirm abschalten in" -msgid "Screen will show in less than one second" -msgstr "Der Bildschirm wird in weniger als einer Sekunde angezeigt" - msgid "Screws Adjust" msgstr "Schrauben Einstellen" +msgid "Select" +msgstr "Wählen" + +msgid "Send" +msgstr "Schicken" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Senden des Einschaltsignals an: %s" + +msgid "Set Temp" +msgstr "Temp. einstellen" + msgid "Settings" msgstr "Einstellungen" +msgid "Show" +msgstr "Zeigen" + msgid "Size" msgstr "Größe" msgid "Slicer" msgstr "Slicer" +msgid "Slicer Time correction (%)" +msgstr "Slicer-Zeitkorrektur (%)" + msgid "Small" msgstr "Klein" msgid "Sort by: " -msgstr "Auftrag: " +msgstr "Sortierung: " msgid "Speed (mm/s)" msgstr "Geschwindigkeit (mm/s)" @@ -464,16 +528,19 @@ msgid "Speed -" msgstr "Geschwindigkeit -" msgid "Square Corner Velocity" -msgstr "Quadratische Eckgeschwindigkeit" +msgstr "Eckgeschwindigkeit" -msgid "Starting WiFi Re-association" -msgstr "Starten der WLAN-Neuverbindung" +msgid "Start" +msgstr "Starten" + +msgid "Starting WiFi Association" +msgstr "Wi-Fi Association starten" msgid "Starting recovery for" -msgstr "Beginn der Wiederherstellung für" +msgstr "Starte Wiederherstellung für" msgid "Starting update for" -msgstr "Start-Update für" +msgstr "Starte Update für" msgid "System" msgstr "System" @@ -492,27 +559,41 @@ msgstr "" "Drucker\n" "Ausschalten" +msgid "Temp (°C)" +msgstr "Temp (°C)" + msgid "Temperature" msgstr "Temperatur" #, python-format msgid "To apply %s KlipperScreen needs to be restarted" -msgstr "Um %s anzuwenden muss KlipperScreen neu gestartet werden" +msgstr "Zum Übernehmen von %s benötigt Klipperscreen einen Neustart" msgid "Tool" msgstr "Druckkopf" +msgid "Total:" +msgstr "Gesamt:" + +msgid "Unknown Heater" +msgstr "Unbekannte Heizung" + msgid "Unload" msgstr "Entladen" +# Respect the number of characters +# english text barely fits in small screens msgid "Up To Date" -msgstr "Aktualisiert" +msgstr "Aktuell" msgid "Update" -msgstr "Aktualisieren" +msgstr "Update" + +msgid "Updating" +msgstr "Aktualisierung" msgid "Uploaded" -msgstr "Datum" +msgstr "Hochgeladen" msgid "View Mesh" msgstr "Mesh anzeigen" @@ -523,6 +604,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "XY Bewegungsgeschwindigkeit (mm/s)" + msgid "Y+" msgstr "Y+" @@ -532,8 +616,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Höhe Kalibrieren" -msgid "Z Offset" -msgstr "Z Offset" +msgid "Z Move Speed (mm/s)" +msgstr "Z Bewegungsgeschwindigkeit (mm/s)" + +msgid "Z Position" +msgstr "Z-Position" msgid "Z Tilt" msgstr "Z-Achse ausrichten" @@ -544,9 +631,19 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "Änderung" +msgstr[1] "Änderungen" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "Stunde" +msgstr[1] "Stunden" + msgid "minutes" msgstr "Minuten" @@ -559,51 +656,74 @@ msgstr "mm/s" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Colorized" -#~ msgstr "Colorized" +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (default)" +#~ msgid "Z Offset" +#~ msgstr "Z Offset" -#~ msgid "Medium (default)" -#~ msgstr "Mittel (Standard)" +#~ msgid "Unknown Heater " +#~ msgstr "Unbekannte Heizung " -#~ msgid "File Estimation (default)" -#~ msgstr "Dateischätzung" +#~ msgid "Disconnect" +#~ msgstr "Nicht verbunden" -#, fuzzy -#~ msgid "Change Printer" -#~ msgstr "Druck abbrechen" +#~ msgid "Duration Only" +#~ msgstr "Reine Druckzeit" -#~ msgid "Fan Off" -#~ msgstr "Lüfter Aus" +#~ msgid "Klipper Version" +#~ msgstr "Klipper Version" -#~ msgid "Fan On" -#~ msgstr "Lüfter An" +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper hat einen Fehler mit dem Mainboard festgestellt.\n" +#~ "Bitte Mainboard neu programmieren." -#~ msgid "Fast" -#~ msgstr "Schnell" +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper hat einen Fehler festgestellt.\n" +#~ "Führe einen FIRMWARE_RESTART durch um den Fehler zu beheben." -#~ msgid "Set Speed" -#~ msgstr "Eingestellter" +#~ msgid "KlipperScreen Version" +#~ msgstr "KlipperScreen Version" -#~ msgid "Slow" -#~ msgstr "Langsam" +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Nur Heizungen in Temp anzeigen." + +#~ msgid "Target" +#~ msgstr "Ziel" + +#~ msgid "Temp" +#~ msgstr "Temp" + +# Nummernblock is 2 character too long and currently doesn't fit +#~ msgid "Number Pad" +#~ msgstr "Tastenfeld" + +#~ msgid "Preheat" +#~ msgstr "Vorheizen" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "Der Bildschirm wird in weniger als einer Sekunde angezeigt" + +#~ msgid "Colorized" +#~ msgstr "Colorized" #~ msgid "?" #~ msgstr "?" -#~ msgid "Are you sure you want to print" -#~ msgstr "Möchten Sie wirklich drucken" - #~ msgid "Cancel Change" #~ msgstr "Änderung abbrechen" #~ msgid "Control" #~ msgstr "Steuerung" -#~ msgid "Emergency Stop" -#~ msgstr "NOT-STOP" - #~ msgid "Load Average" #~ msgstr "Durchschnittslast" diff --git a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.mo index 18d2a43b2..60d801032 100644 Binary files a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po index 267379b7f..262ff645a 100644 --- a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po @@ -1,6 +1,17 @@ -#, python-format -msgid "%d Packages will be updated" +msgid "" msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0\n" #, python-format msgid "%s will be updated to version" @@ -12,8 +23,11 @@ msgstr "" msgid "24 Hour Time" msgstr "" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "" + msgid "Abort" -msgstr "Abort" +msgstr "" msgid "Accept" msgstr "" @@ -27,24 +41,45 @@ msgstr "" msgid "Add bed mesh profile" msgstr "" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "" + msgid "Are you sure you wish to cancel this print?" msgstr "" +msgid "Are you sure you wish to disable motors?" +msgstr "" + msgid "Are you sure you wish to reboot the system?" msgstr "" msgid "Are you sure you wish to shutdown the system?" msgstr "" +msgid "Auto" +msgstr "" + +msgid "Auto-scroll" +msgstr "" + msgid "Bed Level" msgstr "" msgid "Bed Mesh" msgstr "" +msgid "Bltouch found applied offset" +msgstr "" + msgid "Calibrate" msgstr "" +msgid "Calibrated, save configuration to make it permanent" +msgstr "" + +msgid "Can't set above the maximum:" +msgstr "" + msgid "Cancel" msgstr "" @@ -57,6 +92,9 @@ msgstr "" msgid "Cancelling" msgstr "" +msgid "Cannot connect to Moonraker" +msgstr "" + msgid "Channel" msgstr "" @@ -68,15 +106,15 @@ msgstr "" msgid "Close" msgstr "" -msgid "Colorized" -msgstr "" - msgid "Complete" msgstr "" msgid "Configuration" msgstr "" +msgid "Confirm Emergency Stop" +msgstr "" + msgid "Connected" msgstr "" @@ -102,13 +140,13 @@ msgstr "" msgid "Delete" msgstr "" -msgid "Disable Motors" +msgid "Deselect" msgstr "" -msgid "Disable XY" +msgid "Disable Motors" msgstr "" -msgid "Disconnect" +msgid "Disable XY" msgstr "" msgid "Displayed Macros" @@ -121,9 +159,6 @@ msgstr "" msgid "Do you want to recover %s?" msgstr "" -msgid "Duration Only" -msgstr "" - msgid "Elapsed:" msgstr "" @@ -142,6 +177,9 @@ msgstr "" msgid "Extrusion -" msgstr "" +msgid "Failed, adjust position first" +msgstr "" + msgid "Fan" msgstr "" @@ -157,15 +195,31 @@ msgstr "" msgid "Finish" msgstr "" -msgid "Firmware Restart" +msgid "" +"Firmware\n" +"Restart" msgstr "" msgid "Font Size" msgstr "" +msgid "" +"Full\n" +"Update" +msgstr "" + msgid "Go Back" msgstr "" +msgid "Hidden" +msgstr "" + +msgid "Hide" +msgstr "" + +msgid "Hide sensors in Temp." +msgstr "" + msgid "Home" msgstr "" @@ -190,12 +244,6 @@ msgstr "" msgid "Hostname" msgstr "" -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - msgid "Icon Theme" msgstr "" @@ -223,28 +271,17 @@ msgstr "" msgid "Invert Z" msgstr "" -msgid "Klipper Restart" -msgstr "" - -msgid "Klipper Version" +msgid "" +"Klipper\n" +"Restart" msgstr "" msgid "Klipper has disconnected" msgstr "" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" - msgid "Klipper has encountered an error." msgstr "" -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" - msgid "Klipper has shutdown" msgstr "" @@ -254,9 +291,6 @@ msgstr "" msgid "Klipper will reboot" msgstr "" -msgid "KlipperScreen Version" -msgstr "" - msgid "Language" msgstr "" @@ -302,13 +336,13 @@ msgstr "" msgid "Modified" msgstr "" -msgid "Move" +msgid "Moonraker: connected" msgstr "" -msgid "Move Distance (mm)" +msgid "Move" msgstr "" -msgid "Move Speed (mm/s)" +msgid "Move Distance (mm)" msgstr "" msgid "Name" @@ -317,32 +351,43 @@ msgstr "" msgid "Network" msgstr "" -msgid "Number Pad" +msgid "Nothing selected" msgstr "" msgid "Off" msgstr "" #, python-format -msgid "Outdated by %d commits:" +msgid "Outdated by %d" msgstr "" msgid "PSK for" msgstr "" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "" +msgstr[1] "" + +msgid "Password saved" +msgstr "" + msgid "Pause" msgstr "" msgid "Paused" msgstr "" -msgid "Power" +msgid "Perform a full upgrade?" msgstr "" -msgid "Power On Printer" +msgid "Please recompile and flash the micro-controller." +msgstr "" + +msgid "Power" msgstr "" -msgid "Preheat" +msgid "Power On Printer" msgstr "" msgid "Print" @@ -360,6 +405,9 @@ msgstr "" msgid "Printing" msgstr "" +msgid "Probe found applied offset" +msgstr "" + msgid "Profile Name:" msgstr "" @@ -375,6 +423,9 @@ msgstr "" msgid "Recover Soft" msgstr "" +msgid "Reference" +msgstr "" + msgid "Restart" msgstr "" @@ -384,33 +435,56 @@ msgstr "" msgid "Retract" msgstr "" +#, python-format +msgid "Retry #%s" +msgstr "" + msgid "Save" msgstr "" msgid "Save Config" msgstr "" -msgid "Save configuration." +msgid "Save configuration" msgstr "" -msgid "Screen Power Off Time" +msgid "Screen DPMS" msgstr "" -msgid "Screen will show in less than one second" +msgid "Screen Power Off Time" msgstr "" msgid "Screws Adjust" msgstr "" +msgid "Select" +msgstr "" + +msgid "Send" +msgstr "" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "" + +msgid "Set Temp" +msgstr "" + msgid "Settings" msgstr "" +msgid "Show" +msgstr "" + msgid "Size" msgstr "" msgid "Slicer" msgstr "" +msgid "Slicer Time correction (%)" +msgstr "" + msgid "Small" msgstr "" @@ -429,7 +503,10 @@ msgstr "" msgid "Square Corner Velocity" msgstr "" -msgid "Starting WiFi Re-association" +msgid "Start" +msgstr "" + +msgid "Starting WiFi Association" msgstr "" msgid "Starting recovery for" @@ -451,6 +528,9 @@ msgid "" "Shutdown" msgstr "" +msgid "Temp (°C)" +msgstr "" + msgid "Temperature" msgstr "" @@ -461,6 +541,12 @@ msgstr "" msgid "Tool" msgstr "" +msgid "Total:" +msgstr "" + +msgid "Unknown Heater" +msgstr "" + msgid "Unload" msgstr "" @@ -470,6 +556,9 @@ msgstr "" msgid "Update" msgstr "" +msgid "Updating" +msgstr "" + msgid "Uploaded" msgstr "" @@ -482,6 +571,9 @@ msgstr "" msgid "X-" msgstr "" +msgid "XY Move Speed (mm/s)" +msgstr "" + msgid "Y+" msgstr "" @@ -491,7 +583,10 @@ msgstr "" msgid "Z Calibrate" msgstr "" -msgid "Z Offset" +msgid "Z Move Speed (mm/s)" +msgstr "" + +msgid "Z Position" msgstr "" msgid "Z Tilt" @@ -503,9 +598,19 @@ msgstr "" msgid "Z-" msgstr "" +msgid "commit" +msgid_plural "commits" +msgstr[0] "" +msgstr[1] "" + msgid "dBm" msgstr "" +msgid "hour" +msgid_plural "hours" +msgstr[0] "" +msgstr[1] "" + msgid "minutes" msgstr "" diff --git a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo index e78906d3b..abfecb5bb 100644 Binary files a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po index 070ee8292..daf23602d 100644 --- a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po @@ -5,21 +5,18 @@ # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" -"PO-Revision-Date: 2021-09-29 10:52-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 10:46-0300\n" "Last-Translator: alfrix\n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "%d Paquetes serán actualizados" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" @@ -31,6 +28,9 @@ msgstr "(por defecto)" msgid "24 Hour Time" msgstr "Formato 24 Horas" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Un FIRMWARE_RESTART puede solucionar el problema." + msgid "Abort" msgstr "Cancelar" @@ -46,24 +46,45 @@ msgstr "Agregar impresora" msgid "Add bed mesh profile" msgstr "Agregar pefil de malla de cama" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "¿Parada de emergencia?" + msgid "Are you sure you wish to cancel this print?" msgstr "Está seguro que desea cancelar esta impresión?" +msgid "Are you sure you wish to disable motors?" +msgstr "¿Está seguro que desea desactivar los motores?" + msgid "Are you sure you wish to reboot the system?" msgstr "Está seguro que desea reiniciar el sistema?" msgid "Are you sure you wish to shutdown the system?" msgstr "Está seguro que desea apagar el sistema?" +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + msgid "Bed Level" msgstr "Nivelar cama" msgid "Bed Mesh" msgstr "Malla de cama" +msgid "Bltouch found applied offset" +msgstr "Encontrado Bltouch aplicado desfase" + msgid "Calibrate" msgstr "Calibrar" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Calibrado, guarde su configuración para hacerlo permanente" + +msgid "Can't set above the maximum:" +msgstr "Error: Valor sobre el máximo:" + msgid "Cancel" msgstr "Cancelar" @@ -76,6 +97,9 @@ msgstr "Cancelado" msgid "Cancelling" msgstr "Cancelando" +msgid "Cannot connect to Moonraker" +msgstr "No se puede conectar a Moonraker" + msgid "Channel" msgstr "Canal" @@ -89,15 +113,15 @@ msgstr "" msgid "Close" msgstr "Cerrar" -msgid "Colorized" -msgstr "Colorized" - msgid "Complete" msgstr "Completado" msgid "Configuration" msgstr "Ajustes" +msgid "Confirm Emergency Stop" +msgstr "Confirmar Emergencia" + msgid "Connected" msgstr "Conectado" @@ -123,15 +147,15 @@ msgstr "Disminuir" msgid "Delete" msgstr "Borrar" +msgid "Deselect" +msgstr "Deseleccionar" + msgid "Disable Motors" msgstr "Desactivar Motores" msgid "Disable XY" msgstr "Desactivar XY" -msgid "Disconnect" -msgstr "Desconectar" - msgid "Displayed Macros" msgstr "Macros mostrados" @@ -142,9 +166,6 @@ msgstr "Distancia (mm)" msgid "Do you want to recover %s?" msgstr "Desea recuperar %s?" -msgid "Duration Only" -msgstr "Duración" - msgid "Elapsed:" msgstr "Tiempo:" @@ -163,6 +184,9 @@ msgstr "Extrusor +" msgid "Extrusion -" msgstr "Extrusor -" +msgid "Failed, adjust position first" +msgstr "Falló, ajuste la posición primero" + msgid "Fan" msgstr "Ventilador" @@ -178,15 +202,35 @@ msgstr "Ajuste Fino" msgid "Finish" msgstr "Cerrar" -msgid "Firmware Restart" -msgstr "Reiniciar Firmware" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Reiniciar\n" +"Firmware" msgid "Font Size" msgstr "Tamaño del texto" +msgid "" +"Full\n" +"Update" +msgstr "" +"Actualizar\n" +"Todo" + msgid "Go Back" msgstr "Volver" +msgid "Hidden" +msgstr "Oculto" + +msgid "Hide" +msgstr "Ocultar" + +msgid "Hide sensors in Temp." +msgstr "Ocultar sensores en Temp." + msgid "Home" msgstr "Inicio" @@ -211,12 +255,6 @@ msgstr "Origen" msgid "Hostname" msgstr "Hostname" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" msgstr "Tema de Iconos" @@ -244,34 +282,19 @@ msgstr "Invertir Y" msgid "Invert Z" msgstr "Invertir Z" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" "Reiniciar\n" "Klipper" -msgid "Klipper Version" -msgstr "Versión de Klipper" - msgid "Klipper has disconnected" msgstr "Klipper se desconectó" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper encontró un error en el microcontrolador.\n" -"Por favor recompile y flasheelo." - msgid "Klipper has encountered an error." msgstr "Klipper encontró un error." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper encontró un error.\n" -"Ejecute FIRMWARE_RESTART para tratar de arreglarlo." - msgid "Klipper has shutdown" msgstr "Klipper se apagó" @@ -281,9 +304,6 @@ msgstr "Klipper está intentando iniciar" msgid "Klipper will reboot" msgstr "Klipper se reiniciará" -msgid "KlipperScreen Version" -msgstr "Versión de KlipperScreen" - msgid "Language" msgstr "Idioma" @@ -329,49 +349,60 @@ msgstr "Menú" msgid "Modified" msgstr "Modificado" +msgid "Moonraker: connected" +msgstr "Moonraker: conectado" + msgid "Move" msgstr "Mover" msgid "Move Distance (mm)" msgstr "Mover Distancia (mm)" -msgid "Move Speed (mm/s)" -msgstr "Velocidad (mm/s)" - msgid "Name" msgstr "Nombre" msgid "Network" msgstr "Red" -msgid "Number Pad" -msgstr "Teclado" +msgid "Nothing selected" +msgstr "Nada seleccionado" msgid "Off" msgstr "Apagar" #, python-format -msgid "Outdated by %d commits:" -msgstr "Desactualizado por %d commits:" +msgid "Outdated by %d" +msgstr "Desactualizado por %d" msgid "PSK for" msgstr "PSK para" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Paquete será actualizado" +msgstr[1] "Paquetes serán actualizados" + +msgid "Password saved" +msgstr "Contraseña guardada" + msgid "Pause" msgstr "Pausar" msgid "Paused" msgstr "Pausado" +msgid "Perform a full upgrade?" +msgstr " ¿Actualizar Todo?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Por favor recompile y flashee el micro-controlador." + msgid "Power" msgstr "Energía" msgid "Power On Printer" msgstr "Encender Impresora" -msgid "Preheat" -msgstr "Precalentar" - msgid "Print" msgstr "Imprimir" @@ -387,6 +418,9 @@ msgstr "Conexiones a impresoras" msgid "Printing" msgstr "Imprimiendo" +msgid "Probe found applied offset" +msgstr "Encontrado Probe aplicado desfase" + msgid "Profile Name:" msgstr "Nombre del perfil:" @@ -402,6 +436,9 @@ msgstr "Recuperar Hard" msgid "Recover Soft" msgstr "Recuperar Soft" +msgid "Reference" +msgstr "Referencia" + msgid "Restart" msgstr "Reiniciar" @@ -411,33 +448,56 @@ msgstr "Continuar" msgid "Retract" msgstr "Retraer" +#, python-format +msgid "Retry #%s" +msgstr "Intento #%s" + msgid "Save" msgstr "Guardar" msgid "Save Config" msgstr "Guardar Config" -msgid "Save configuration." -msgstr "Guardar Configuración." +msgid "Save configuration" +msgstr "Guardar Configuración" + +msgid "Screen DPMS" +msgstr "Pantalla DPMS" msgid "Screen Power Off Time" msgstr "Apagar pantalla tras" -msgid "Screen will show in less than one second" -msgstr "La pantalla se mostrará en menos de un segundo" - msgid "Screws Adjust" msgstr "Ajustar Tornillos" +msgid "Select" +msgstr "Seleccionar" + +msgid "Send" +msgstr "Enviar" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Enviando señal de encendido a: %s" + +msgid "Set Temp" +msgstr "Establecer Temp" + msgid "Settings" msgstr "Opciones" +msgid "Show" +msgstr "Mostrar" + msgid "Size" msgstr "Tamaño" msgid "Slicer" msgstr "Slicer" +msgid "Slicer Time correction (%)" +msgstr "Corrección del tiempo del Slicer (%)" + msgid "Small" msgstr "Pequeño" @@ -456,8 +516,11 @@ msgstr "Velocidad -" msgid "Square Corner Velocity" msgstr "Velocidad de esquina" -msgid "Starting WiFi Re-association" -msgstr "Comenzando re-asociación" +msgid "Start" +msgstr "Iniciar" + +msgid "Starting WiFi Association" +msgstr "Iniciando asociación WiFi" msgid "Starting recovery for" msgstr "Iniciando recuperación de" @@ -482,6 +545,9 @@ msgstr "" "Apagar\n" "Sistema" +msgid "Temp (°C)" +msgstr "Temp (°C)" + msgid "Temperature" msgstr "Temperatura" @@ -492,6 +558,12 @@ msgstr "Para aplicar %s KlipperScreen necesita reiniciarse" msgid "Tool" msgstr "Herrmienta" +msgid "Total:" +msgstr "Total:" + +msgid "Unknown Heater" +msgstr "Calentador Desconocido" + msgid "Unload" msgstr "Descargar" @@ -501,6 +573,9 @@ msgstr "Actualizado" msgid "Update" msgstr "Actualizar" +msgid "Updating" +msgstr "Actualizando" + msgid "Uploaded" msgstr "Subido" @@ -513,6 +588,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "Velocidad XY (mm/s)" + msgid "Y+" msgstr "Y+" @@ -522,8 +600,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Calibrar Z" -msgid "Z Offset" -msgstr "Desfase Z" +msgid "Z Move Speed (mm/s)" +msgstr "Velocidad Z (mm/s)" + +msgid "Z Position" +msgstr "Posición Z" msgid "Z Tilt" msgstr "Inclinación Z" @@ -534,9 +615,19 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "cambio" +msgstr[1] "cambios" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "hora" +msgstr[1] "horas" + msgid "minutes" msgstr "minutos" @@ -549,8 +640,61 @@ msgstr "mm/s" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (por defecto)" +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Desfase Z" + +#~ msgid "Unknown Heater " +#~ msgstr "Calentador Desconocido " + +#~ msgid "Disconnect" +#~ msgstr "Desconectar" + +#~ msgid "Duration Only" +#~ msgstr "Duración" + +#~ msgid "Klipper Version" +#~ msgstr "Versión de Klipper" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper encontró un error en el microcontrolador.\n" +#~ "Por favor recompile y flasheelo." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper encontró un error.\n" +#~ "Ejecute FIRMWARE_RESTART para tratar de arreglarlo." + +#~ msgid "KlipperScreen Version" +#~ msgstr "Versión de KlipperScreen" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Solo mostrar calentadores en Temp." + +#~ msgid "Target" +#~ msgstr "Obejtivo" + +#~ msgid "Temp" +#~ msgstr "Temp" + +#~ msgid "Number Pad" +#~ msgstr "Teclado" + +#~ msgid "Preheat" +#~ msgstr "Precalentar" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "La pantalla se mostrará en menos de un segundo" #~ msgid "Medium (default)" #~ msgstr "Medio (por defecto)" @@ -564,9 +708,6 @@ msgstr "mm/s^2" #~ msgid "Change Printer" #~ msgstr "Cambiar impresora" -#~ msgid "Commited" -#~ msgstr "Commited" - #~ msgid "Fan Off" #~ msgstr "Apagar" @@ -585,17 +726,11 @@ msgstr "mm/s^2" #~ msgid "?" #~ msgstr "?" -#~ msgid "Are you sure you want to print" -#~ msgstr "Está seguro que desea imprimir" - #~ msgid "Cancel Change" #~ msgstr "Cancelar" #~ msgid "Control" #~ msgstr "Control" -#~ msgid "Emergency Stop" -#~ msgstr "Parada de Emergencia" - #~ msgid "Load Average" #~ msgstr "Carga media" diff --git a/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.mo index 8c4efcea6..295ce9c55 100644 Binary files a/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.po index b23589dcb..f632cee7e 100644 --- a/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/fr_FR/LC_MESSAGES/KlipperScreen.po @@ -5,22 +5,18 @@ # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" -"PO-Revision-Date: 2021-09-29 10:54-0300\n" -"Last-Translator: Bahoue & alfrix\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 10:50-0300\n" +"Last-Translator: O. Robardet\n" "Language-Team: \n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "%d packages seront mis à jour" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" @@ -32,6 +28,9 @@ msgstr "(défaut)" msgid "24 Hour Time" msgstr "Format 24 heures" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Un FIRMWARE_RESTART peut résoudre le problème." + msgid "Abort" msgstr "Annuler" @@ -47,24 +46,45 @@ msgstr "Ajouter une imprimante" msgid "Add bed mesh profile" msgstr "Ajouter un profil de maillage" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Êtes-vous sûr de vouloir exécuter l'arrêt d'urgence?" + msgid "Are you sure you wish to cancel this print?" msgstr "Êtes-vous sûr de vouloir annuler cette impression?" +msgid "Are you sure you wish to disable motors?" +msgstr "Voulez-vous vraiment désactiver les moteurs ?" + msgid "Are you sure you wish to reboot the system?" msgstr "Êtes-vous sûr de vouloir redémarrer le système?" msgid "Are you sure you wish to shutdown the system?" msgstr "Êtes-vous sûr de vouloir arrêter le système?" +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + msgid "Bed Level" msgstr "Nivelage du plateau" msgid "Bed Mesh" msgstr "Maillage du plateau" +msgid "Bltouch found applied offset" +msgstr "Bltouch a trouvé le décalage appliqué" + msgid "Calibrate" msgstr "Étalonner" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Calibré, enregistrez la configuration pour la rendre permanente" + +msgid "Can't set above the maximum:" +msgstr "Impossible de définir au-dessus du maximum:" + msgid "Cancel" msgstr "Annuler" @@ -77,6 +97,9 @@ msgstr "Annulé" msgid "Cancelling" msgstr "Annulation" +msgid "Cannot connect to Moonraker" +msgstr "Impossible de se connecter à Moonraker" + msgid "Channel" msgstr "Canal" @@ -84,21 +107,21 @@ msgid "" "Check /tmp/KlipperScreen.log for more information.\n" "Please submit an issue on GitHub for help." msgstr "" -"Vérifier /tmp/KlipperScreen.log pour plus d'informations.\n" -"SVP envoyez une requête sur GITHUB pour obtenir de l'aide." +"Vérifiez /tmp/KlipperScreen.log pour plus d'informations.\n" +"SVP envoyez une requête sur GitHub pour obtenir de l'aide." msgid "Close" msgstr "Fermer" -msgid "Colorized" -msgstr "Colorisé" - msgid "Complete" msgstr "Finalisé" msgid "Configuration" msgstr "Configuration" +msgid "Confirm Emergency Stop" +msgstr "Confirmer l'arrêt d'urgence" + msgid "Connected" msgstr "Connecté" @@ -124,15 +147,15 @@ msgstr "Diminuer" msgid "Delete" msgstr "Effacer" +msgid "Deselect" +msgstr "Désélectionner" + msgid "Disable Motors" msgstr "Désactiver les moteurs" msgid "Disable XY" msgstr "Désactiver XY" -msgid "Disconnect" -msgstr "Déconnecter" - msgid "Displayed Macros" msgstr "Macros affichées" @@ -143,9 +166,6 @@ msgstr "Distance (mm)" msgid "Do you want to recover %s?" msgstr "Voulez-vous récupérer %s ?" -msgid "Duration Only" -msgstr "Durée seulement" - msgid "Elapsed:" msgstr "Écoulé:" @@ -164,6 +184,9 @@ msgstr "Extrusion +" msgid "Extrusion -" msgstr "Extrusion -" +msgid "Failed, adjust position first" +msgstr "Échec, ajustez d'abord la position" + msgid "Fan" msgstr "Ventilateur" @@ -179,32 +202,52 @@ msgstr "Réglages fins" msgid "Finish" msgstr "Fin" -msgid "Firmware Restart" -msgstr "Redémarrer Firmware" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Micrologiciel\n" +"Redémarrage" msgid "Font Size" msgstr "Taille de police" +msgid "" +"Full\n" +"Update" +msgstr "" +"Plein\n" +"Mettre à jour" + msgid "Go Back" msgstr "Retourner" +msgid "Hidden" +msgstr "Caché" + +msgid "Hide" +msgstr "Cacher" + +msgid "Hide sensors in Temp." +msgstr "Masquer les capteurs dans Temp." + msgid "Home" -msgstr "Réinitialiser" +msgstr "Accueil" msgid "Home All" -msgstr "Réinitialiser XYZ" +msgstr "Origine XYZ" msgid "Home X" -msgstr "Réinitialiser X" +msgstr "Origine X" msgid "Home XY" -msgstr "Réinitialiser XY" +msgstr "Origine XY" msgid "Home Y" -msgstr "Réinitialiser Y" +msgstr "Origine Y" msgid "Home Z" -msgstr "Réinitialiser Z" +msgstr "Origine Z" msgid "Homing" msgstr "Origine" @@ -212,12 +255,6 @@ msgstr "Origine" msgid "Hostname" msgstr "Hostname" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" msgstr "Thème icônes" @@ -245,34 +282,19 @@ msgstr "Inverser Y" msgid "Invert Z" msgstr "Inverser Z" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" -"Redémarrer\n" -"Klipper" - -msgid "Klipper Version" -msgstr "Version de Klipper" +"Klipper\n" +"Redémarrage" msgid "Klipper has disconnected" msgstr "Klipper s'est déconnecté" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper a rencontré une erreur avec le micro-contrôleur.\n" -"Veuillez recompiler et reflasher." - msgid "Klipper has encountered an error." msgstr "Klipper a rencontré une erreur." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper a rencontré une erreur. \n" -"Taper FIRMWARE_RESTART pour fixer l'erreur." - msgid "Klipper has shutdown" msgstr "Klipper s'est arrêté" @@ -282,9 +304,6 @@ msgstr "Klipper tente de démarrer" msgid "Klipper will reboot" msgstr "Klipper va redémarrer" -msgid "KlipperScreen Version" -msgstr "Version de KlipperScreen" - msgid "Language" msgstr "Langue" @@ -298,7 +317,7 @@ msgid "Limits" msgstr "Limites" msgid "Load" -msgstr "Charge" +msgstr "Charger" msgid "Lower Nozzle" msgstr "Rapprocher la buse" @@ -330,49 +349,60 @@ msgstr "Menu" msgid "Modified" msgstr "Modifié" +msgid "Moonraker: connected" +msgstr "Moonraker : connecté" + msgid "Move" msgstr "Mouvement" msgid "Move Distance (mm)" msgstr "Distance de mouvement (mm)" -msgid "Move Speed (mm/s)" -msgstr "Vitesse de déplacement (mm/s)" - msgid "Name" msgstr "Nom" msgid "Network" msgstr "Réseau" -msgid "Number Pad" -msgstr "Clavier" +msgid "Nothing selected" +msgstr "Rien de sélectionné" msgid "Off" msgstr "Éteindre" #, python-format -msgid "Outdated by %d commits:" -msgstr "Obsolète par %d commits :" +msgid "Outdated by %d" +msgstr "Obsolète de %d" msgid "PSK for" msgstr "PSK pour" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Le paquet sera mis à jour" +msgstr[1] "Forfaits seront mis à jour" + +msgid "Password saved" +msgstr "Mot de passe enregistré" + msgid "Pause" msgstr "Pause" msgid "Paused" msgstr "En pause" +msgid "Perform a full upgrade?" +msgstr "Effectuer une mise à jour complète ?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Veuillez recompiler et flasher le microcontrôleur." + msgid "Power" -msgstr "Energie" +msgstr "Alimentation" msgid "Power On Printer" msgstr "Allumer l'imprimante" -msgid "Preheat" -msgstr "Préchauffer" - msgid "Print" msgstr "Imprimer" @@ -383,11 +413,14 @@ msgid "Print Time" msgstr "Temps d'impression" msgid "Printer Connections" -msgstr "Connexions de l'imprimante" +msgstr "Connexions aux imprimantes" msgid "Printing" msgstr "Impression" +msgid "Probe found applied offset" +msgstr "Probe a trouvé le décalage appliqué" + msgid "Profile Name:" msgstr "Nom de profil:" @@ -398,47 +431,73 @@ msgid "Raise Nozzle" msgstr "Éloigner la buse" msgid "Recover Hard" -msgstr "Récupérer Hard" +msgstr "Récupération \"--hard\"" msgid "Recover Soft" -msgstr "Récupérer Soft" +msgstr "Récupérer \"--soft\"" + +msgid "Reference" +msgstr "Référence" msgid "Restart" -msgstr "Redémarrage" +msgstr "Redémarrer" msgid "Resume" -msgstr "Resumer" +msgstr "Reprendre" msgid "Retract" msgstr "Rétracter" +#, python-format +msgid "Retry #%s" +msgstr "Réessayez #%s" + msgid "Save" msgstr "Enregistrer" msgid "Save Config" msgstr "Enregistrer la config" -msgid "Save configuration." -msgstr "Enregistrer la configuration." +msgid "Save configuration" +msgstr "Enregistrer la configuration" -msgid "Screen Power Off Time" -msgstr "Extinction de l'écran" +msgid "Screen DPMS" +msgstr "Écran DPMS" -msgid "Screen will show in less than one second" -msgstr "L'écran s'affichera en moins d'une seconde" +msgid "Screen Power Off Time" +msgstr "Délai d'extinction de l'écran" msgid "Screws Adjust" msgstr "Ajuster les vis" +msgid "Select" +msgstr "Sélectionner" + +msgid "Send" +msgstr "Envoyer" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Envoi du signal de mise sous tension à : %s" + +msgid "Set Temp" +msgstr "Régler la temp" + msgid "Settings" msgstr "Paramètres" +msgid "Show" +msgstr "Montrer" + msgid "Size" msgstr "Dimension" msgid "Slicer" msgstr "Trancheur" +msgid "Slicer Time correction (%)" +msgstr "Correction du temps de trancheuse (%)" + msgid "Small" msgstr "Petit" @@ -457,8 +516,11 @@ msgstr "Vitesse -" msgid "Square Corner Velocity" msgstr "Vélocité des angles droits" -msgid "Starting WiFi Re-association" -msgstr "Démarrage de la re-association WiFi" +msgid "Start" +msgstr "Démarrer" + +msgid "Starting WiFi Association" +msgstr "Démarrage de l'association Wi-Fi" msgid "Starting recovery for" msgstr "Démarrage de la récupération pour" @@ -474,13 +536,16 @@ msgid "" "Restart" msgstr "" "Redémarrer\n" -"Système" +"le système" msgid "" "System\n" "Shutdown" msgstr "Arrêt du Système" +msgid "Temp (°C)" +msgstr "Temp (°C)" + msgid "Temperature" msgstr "Température" @@ -491,8 +556,14 @@ msgstr "Pour appliquer %s KlipperScreen doit être redémarré" msgid "Tool" msgstr "Outil" +msgid "Total:" +msgstr "Total:" + +msgid "Unknown Heater" +msgstr "Chauffage inconnu" + msgid "Unload" -msgstr "Déchargez" +msgstr "Décharger" msgid "Up To Date" msgstr "À jour" @@ -500,6 +571,10 @@ msgstr "À jour" msgid "Update" msgstr "Mise à jour" +#, fuzzy +msgid "Updating" +msgstr "Mise à jour" + msgid "Uploaded" msgstr "Téléchargé" @@ -512,6 +587,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "Vitesse de déplacement XY (mm/s)" + msgid "Y+" msgstr "Y+" @@ -521,8 +599,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Calibration Z" -msgid "Z Offset" -msgstr "Décalage Z" +msgid "Z Move Speed (mm/s)" +msgstr "Vitesse de déplacement Z (mm/s)" + +msgid "Z Position" +msgstr "Position Z" msgid "Z Tilt" msgstr "Z Tilt" @@ -533,9 +614,19 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "changement" +msgstr[1] "changements" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "heur" +msgstr[1] "heures" + msgid "minutes" msgstr "minutes" @@ -548,8 +639,61 @@ msgstr "mm/s" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (défaut)" +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Décalage Z" + +#~ msgid "Unknown Heater " +#~ msgstr "Chauffage inconnu " + +#~ msgid "Disconnect" +#~ msgstr "Déconnecter" + +#~ msgid "Duration Only" +#~ msgstr "Durée seulement" + +#~ msgid "Klipper Version" +#~ msgstr "Version de Klipper" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper a rencontré une erreur avec le micro-contrôleur.\n" +#~ "Veuillez recompiler et reflasher." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper a rencontré une erreur. \n" +#~ "Taper FIRMWARE_RESTART pour fixer l'erreur." + +#~ msgid "KlipperScreen Version" +#~ msgstr "Version de KlipperScreen" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Afficher uniquement les éléments chauffants en temp." + +#~ msgid "Target" +#~ msgstr "Cibler" + +#~ msgid "Temp" +#~ msgstr "Temp" + +#~ msgid "Number Pad" +#~ msgstr "Clavier" + +#~ msgid "Preheat" +#~ msgstr "Préchauffer" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "L'écran s'affichera en moins d'une seconde" #~ msgid "Medium (default)" #~ msgstr "Moyen (défaut)" @@ -581,28 +725,18 @@ msgstr "mm/s^2" #~ msgid "?" #~ msgstr "?" -#~ msgid "Are you sure you want to print" -#~ msgstr "Es tu sure de vouloir imprimer" - #~ msgid "Cancel Change" #~ msgstr "Annuler le changement" #~ msgid "Control" #~ msgstr "Controle" -#~ msgid "Emergency Stop" -#~ msgstr "Arret d'urgence" - #~ msgid "Load Average" #~ msgstr "Charge moyenne" #~ msgid "Network Info" #~ msgstr "Information réseau " -#, fuzzy -#~ msgid "Klipper" -#~ msgstr "Redémarrer klipper" - #~ msgid "Back" #~ msgstr "Retour" diff --git a/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.mo index a18cc9cb6..943c55549 100644 Binary files a/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.po index 8f44263ed..dddeba1c0 100644 --- a/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/he_IL/LC_MESSAGES/KlipperScreen.po @@ -7,23 +7,19 @@ msgid "" msgstr "" "Project-Id-Version: Klipperscreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" -"PO-Revision-Date: 2021-09-29 10:57-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 10:54-0300\n" "Last-Translator: Emanuel Sharvit \n" "Language-Team: \n" "Language: he_IL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3);\n" +"X-Generator: Poedit 3.0.1\n" "X-Poedit-SourceCharset: UTF-8\n" -#, python-format -msgid "%d Packages will be updated" -msgstr "%d חבילות יעודכנו" - #, python-format msgid "%s will be updated to version" msgstr "%s יעודכן לגרסה" @@ -34,6 +30,9 @@ msgstr "(בְּרִירַת מֶחדָל)" msgid "24 Hour Time" msgstr "זמן 24 שעות" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "FIRMWARE_RESTART עשוי לפתור את הבעיה." + msgid "Abort" msgstr "בטל" @@ -49,24 +48,46 @@ msgstr "הוסף מדפסת" msgid "Add bed mesh profile" msgstr "הוסף פרופיל רשת למיטה" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "" +"האם אתה בטוח שברצונך להדפיסהאם אתה בטוח שברצונך להפעיל את עצירת החירום?" + msgid "Are you sure you wish to cancel this print?" msgstr "האם אתה בטוח שברצונך לבטל את ההדפסה?" +msgid "Are you sure you wish to disable motors?" +msgstr "האם אתה בטוח שברצונך להשבית מנועים?" + msgid "Are you sure you wish to reboot the system?" msgstr "האם אתה בטוח שברצונך לאתחל את המערכת?" msgid "Are you sure you wish to shutdown the system?" msgstr "האם אתה בטוח שברצונך לסגור את המערכת?" +msgid "Auto" +msgstr "אוטומטי" + +msgid "Auto-scroll" +msgstr "גלילה אוטומטית" + msgid "Bed Level" msgstr "פילוס מיטה" msgid "Bed Mesh" msgstr "מיפוי מיטה" +msgid "Bltouch found applied offset" +msgstr "Bltouch נמצא היסט מוחל" + msgid "Calibrate" msgstr "לְדַרֵג" +msgid "Calibrated, save configuration to make it permanent" +msgstr "מכויל, שמור את התצורה כדי שהיא תהיה קבועה" + +msgid "Can't set above the maximum:" +msgstr "לא ניתן להגדיר מעל המקסימום:" + msgid "Cancel" msgstr "ביטול" @@ -79,6 +100,9 @@ msgstr "מבוטל" msgid "Cancelling" msgstr "מבטל" +msgid "Cannot connect to Moonraker" +msgstr "לא ניתן להתחבר ל-Moonraker" + msgid "Channel" msgstr "עָרוּץ" @@ -92,15 +116,15 @@ msgstr "" msgid "Close" msgstr "סגור" -msgid "Colorized" -msgstr "Colorized" - msgid "Complete" msgstr "לְהַשְׁלִים" msgid "Configuration" msgstr "קונפיגורציה" +msgid "Confirm Emergency Stop" +msgstr "אשר עצירת חירום" + msgid "Connected" msgstr "מְחוּבָּר" @@ -126,15 +150,15 @@ msgstr "לְהַקְטִין" msgid "Delete" msgstr "לִמְחוֹק" +msgid "Deselect" +msgstr "בטל את הבחירה" + msgid "Disable Motors" msgstr "השבת מנועים" msgid "Disable XY" msgstr "השבת את XY" -msgid "Disconnect" -msgstr "לְנַתֵק" - msgid "Displayed Macros" msgstr "מוצגים מאקרו" @@ -145,9 +169,6 @@ msgstr "מרחק (מ\"מ)" msgid "Do you want to recover %s?" msgstr "האם ברצונך לשחזר %s?" -msgid "Duration Only" -msgstr "משך הזמן בלבד" - msgid "Elapsed:" msgstr "זמן שעבר:" @@ -166,6 +187,9 @@ msgstr "שיחול +" msgid "Extrusion -" msgstr "שיחול -" +msgid "Failed, adjust position first" +msgstr "נכשל, תחילה התאם את המיקום" + msgid "Fan" msgstr "מאוורר" @@ -181,15 +205,35 @@ msgstr "כוונון עדין" msgid "Finish" msgstr "סיים" -msgid "Firmware Restart" -msgstr "הפעלה מחדש של הקושחה" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"קושחה\n" +"איתחול" msgid "Font Size" msgstr "גודל טקסט" +msgid "" +"Full\n" +"Update" +msgstr "" +"מלא\n" +"עדכון" + msgid "Go Back" msgstr "חזרה" +msgid "Hidden" +msgstr "מוּסתָר" + +msgid "Hide" +msgstr "להתחבא" + +msgid "Hide sensors in Temp." +msgstr "הסתר חיישנים בטמפ'." + msgid "Home" msgstr "איפוס" @@ -214,12 +258,6 @@ msgstr "איפוס צירים" msgid "Hostname" msgstr "Hostname" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" msgstr "נושא אייקון" @@ -247,32 +285,19 @@ msgstr "הפוך את Y" msgid "Invert Z" msgstr "הפוך את Z" -msgid "Klipper Restart" -msgstr "אתחול קליפר" - -msgid "Klipper Version" -msgstr "גרסא של קליפר" +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"קליפר\n" +"איתחול" msgid "Klipper has disconnected" msgstr "קליפר התנתק" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"קליפר נתקל בשגיאה בבקר המיקרו.\n" -"אנא הידור מחדש והבהב." - msgid "Klipper has encountered an error." msgstr "קילפר נתקל בבעיה." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"קליפר נתקל בבעיה. \n" -"נסה להריץ firmware_restart, כדי לפתור את הבעיה." - msgid "Klipper has shutdown" msgstr "קליפר נכבה" @@ -282,9 +307,6 @@ msgstr "קליפר מנסה לרוץ" msgid "Klipper will reboot" msgstr "קליפר יבצע אתחול" -msgid "KlipperScreen Version" -msgstr "גרסא של KlipperScreen" - msgid "Language" msgstr "שפה" @@ -330,49 +352,62 @@ msgstr "תַפרִיט" msgid "Modified" msgstr "שונה" +msgid "Moonraker: connected" +msgstr "Moonraker: מחובר" + msgid "Move" msgstr "הזזת צירים" msgid "Move Distance (mm)" msgstr "מרחק הזזה (מ''מ)" -msgid "Move Speed (mm/s)" -msgstr "מהירות הזזה (מ\"מ/שניות)" - msgid "Name" msgstr "שֵׁם" msgid "Network" msgstr "רשת" -msgid "Number Pad" -msgstr "פד נומרי" +msgid "Nothing selected" +msgstr "שום דבר לא נבחר" msgid "Off" msgstr "כבוי" #, python-format -msgid "Outdated by %d commits:" -msgstr "מיושן ב- %d מתחייב:" +msgid "Outdated by %d" +msgstr "מיושן על ידי %d" msgid "PSK for" msgstr "PSK עבור" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "חבילה אחת תעודכן" +msgstr[1] "חבילות יעודכנו" +msgstr[2] "חבילות יעודכנו" +msgstr[3] "חבילות יעודכנו" + +msgid "Password saved" +msgstr "הסיסמה נשמרה" + msgid "Pause" msgstr "השהיה" msgid "Paused" msgstr "מושהה" +msgid "Perform a full upgrade?" +msgstr "לבצע שדרוג מלא?" + +msgid "Please recompile and flash the micro-controller." +msgstr "אנא הידור מחדש והבזק את המיקרו-בקר." + msgid "Power" msgstr "הפעלה" msgid "Power On Printer" msgstr "הפעל מדפסת" -msgid "Preheat" -msgstr "חימום מראש" - msgid "Print" msgstr "הדפס" @@ -388,6 +423,9 @@ msgstr "חיבורי מדפסת" msgid "Printing" msgstr "מדפיס" +msgid "Probe found applied offset" +msgstr "Probe נמצא היסט מוחל" + msgid "Profile Name:" msgstr "שם פרופיל:" @@ -403,6 +441,9 @@ msgstr "לְהַחלִים Hard" msgid "Recover Soft" msgstr "לְהַחלִים Soft" +msgid "Reference" +msgstr "התייחסות" + msgid "Restart" msgstr "אתחל" @@ -412,33 +453,56 @@ msgstr "המשך" msgid "Retract" msgstr "שיחול לאחור" +#, python-format +msgid "Retry #%s" +msgstr "נסה שוב #%s" + msgid "Save" msgstr "להציל" msgid "Save Config" msgstr "שמור קונפיג" -msgid "Save configuration." -msgstr "שמור תצורה." +msgid "Save configuration" +msgstr "שמור תצורה" + +msgid "Screen DPMS" +msgstr "DPMS מסך" msgid "Screen Power Off Time" msgstr "זמן כיבוי מסך" -msgid "Screen will show in less than one second" -msgstr "המסך יופיע תוך פחות משנייה אחת" - msgid "Screws Adjust" msgstr "סידור ברגים" +msgid "Select" +msgstr "בחר" + +msgid "Send" +msgstr "לִשְׁלוֹחַ" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "שולח אות הפעלה אל: %s" + +msgid "Set Temp" +msgstr "הגדר טמפ'" + msgid "Settings" msgstr "הגדרות" +msgid "Show" +msgstr "הופעה" + msgid "Size" msgstr "גודל" msgid "Slicer" msgstr "Slicer" +msgid "Slicer Time correction (%)" +msgstr "תיקון זמן פריסה (%)" + msgid "Small" msgstr "קָטָן" @@ -457,8 +521,11 @@ msgstr "מהירות -" msgid "Square Corner Velocity" msgstr "מהירות פינה מרובעת" -msgid "Starting WiFi Re-association" -msgstr "התחלת שיוך מחדש ל- WiFi" +msgid "Start" +msgstr "הַתחָלָה" + +msgid "Starting WiFi Association" +msgstr "מתחיל איגוד WiFi" msgid "Starting recovery for" msgstr "החל התאוששות עבור" @@ -483,6 +550,9 @@ msgstr "" "מערכת\n" "לכבות" +msgid "Temp (°C)" +msgstr "טמפ' (°C)" + msgid "Temperature" msgstr "טמפרטורה" @@ -493,6 +563,12 @@ msgstr "כדי ליישם %s צריך להפעיל מחדש את KlipperScreen" msgid "Tool" msgstr "כלי" +msgid "Total:" +msgstr "סך הכל:" + +msgid "Unknown Heater" +msgstr "מחמם לא ידוע" + msgid "Unload" msgstr "לִפְרוֹק" @@ -502,6 +578,9 @@ msgstr "עדכני" msgid "Update" msgstr "עדכון" +msgid "Updating" +msgstr "עִדכּוּן" + msgid "Uploaded" msgstr "הועלה" @@ -514,6 +593,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "מהירות תנועה XY (מ\"מ/שנייה)" + msgid "Y+" msgstr "Y+" @@ -523,8 +605,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "כיול Z" -msgid "Z Offset" -msgstr "הפרז גובה Z" +msgid "Z Move Speed (mm/s)" +msgstr "מהירות תנועה Z (מ\"מ/שניות)" + +msgid "Z Position" +msgstr "מיקום Z" msgid "Z Tilt" msgstr "הטיה Z" @@ -535,9 +620,23 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "שינוי" +msgstr[1] "שינויים" +msgstr[2] "שינויים" +msgstr[3] "שינויים" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "שעה" +msgstr[1] "שעות" +msgstr[2] "שעות" +msgstr[3] "שעות" + msgid "minutes" msgstr "דקות" @@ -550,8 +649,61 @@ msgstr "מ\"מ/ש" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (default)" +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "הפרז גובה Z" + +#~ msgid "Unknown Heater " +#~ msgstr "מחמם לא ידוע " + +#~ msgid "Disconnect" +#~ msgstr "לְנַתֵק" + +#~ msgid "Duration Only" +#~ msgstr "משך הזמן בלבד" + +#~ msgid "Klipper Version" +#~ msgstr "גרסא של קליפר" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "קליפר נתקל בשגיאה בבקר המיקרו.\n" +#~ "אנא הידור מחדש והבהב." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "קליפר נתקל בבעיה. \n" +#~ "נסה להריץ firmware_restart, כדי לפתור את הבעיה." + +#~ msgid "KlipperScreen Version" +#~ msgstr "גרסא של KlipperScreen" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "הצג רק מחממים בטמפ'." + +#~ msgid "Target" +#~ msgstr "יַעַד" + +#~ msgid "Temp" +#~ msgstr "טמפ'" + +#~ msgid "Number Pad" +#~ msgstr "פד נומרי" + +#~ msgid "Preheat" +#~ msgstr "חימום מראש" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "המסך יופיע תוך פחות משנייה אחת" #~ msgid "Medium (default)" #~ msgstr "בינוני (ברירת מחדל)" @@ -559,10 +711,6 @@ msgstr "mm/s^2" #~ msgid "File Estimation (default)" #~ msgstr "קובץ (ברירת מחדל)" -#, fuzzy -#~ msgid "Change Printer" -#~ msgstr "בטל הדפסה" - #~ msgid "Fan Off" #~ msgstr "כבה מאוורר" @@ -581,28 +729,18 @@ msgstr "mm/s^2" #~ msgid "?" #~ msgstr "?" -#~ msgid "Are you sure you want to print" -#~ msgstr "האם אתה בטוח שברצונך להדפיס" - #~ msgid "Cancel Change" #~ msgstr "בטל שינוי" #~ msgid "Control" #~ msgstr "שליטה" -#~ msgid "Emergency Stop" -#~ msgstr "עצירת חירום" - #~ msgid "Load Average" #~ msgstr "עומס ממוצע" #~ msgid "Network Info" #~ msgstr "מידע על הרשת" -#, fuzzy -#~ msgid "Klipper" -#~ msgstr "אתחול קליפר" - #~ msgid "Back" #~ msgstr "חזור" diff --git a/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..d8279c231 Binary files /dev/null and b/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..cfe62c260 --- /dev/null +++ b/ks_includes/locales/hu_HU/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,674 @@ +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: AntoszHUN\n" +"Language-Team: \n" +"Language: hu_HU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s verzió frissítése" + +msgid "(default)" +msgstr "(alapértelmezett)" + +msgid "24 Hour Time" +msgstr "24 Órás Idő" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "A FIRMWARE_RESTART javíthatja a problémát." + +msgid "Abort" +msgstr "Megszakít" + +msgid "Accept" +msgstr "Elfogad" + +msgid "Actions" +msgstr "Műveletek" + +msgid "Add Printer" +msgstr "Nyomtató hozzáadása" + +msgid "Add bed mesh profile" +msgstr "Ágyháló profil hozzáadása" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Biztosan Vészleállítást végez?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Biztosan megszakítja ezt a nyomtatást?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Biztos benne, hogy le szeretné tiltani a motorokat?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Biztos benne, hogy újra akarja indítani a rendszert?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Biztos, hogy le szeretné állítani a rendszert?" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Automatikus görgetés" + +msgid "Bed Level" +msgstr "Ágyszint" + +msgid "Bed Mesh" +msgstr "Ágyháló" + +msgid "Bltouch found applied offset" +msgstr "A Bltouch alkalmazott eltolást talált" + +msgid "Calibrate" +msgstr "Kalibrálás" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Kalibrálva! Mentse el a konfigurációt, hogy az állandó legyen" + +msgid "Can't set above the maximum:" +msgstr "Nem állítható a maximum fölé:" + +msgid "Cancel" +msgstr "Mégse" + +msgid "Cancel Print" +msgstr "Nyomtatás megszakítása" + +msgid "Cancelled" +msgstr "Törölve" + +msgid "Cancelling" +msgstr "Törlés" + +msgid "Cannot connect to Moonraker" +msgstr "Nem lehet csatlakozni a Moonrakerhez" + +msgid "Channel" +msgstr "Csatorna" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Nézd a /tmp/KlipperScreen.log további információért.\n" +"Segítségért küldj be egy hibajegyet a GitHubon." + +msgid "Close" +msgstr "Bezárás" + +msgid "Complete" +msgstr "Befejezve" + +msgid "Configuration" +msgstr "Konfiguráció" + +msgid "Confirm Emergency Stop" +msgstr "Erősítse meg a vészleállítást" + +msgid "Connected" +msgstr "Csatlakoztatva" + +#, python-format +msgid "Connecting to %s" +msgstr "Csatlakozás %s" + +msgid "Console" +msgstr "Konzol" + +msgid "Continue" +msgstr "Folytat" + +msgid "Cooldown" +msgstr "Lehűtés" + +msgid "Date" +msgstr "Dátum" + +msgid "Decrease" +msgstr "Csökkent" + +msgid "Delete" +msgstr "Töröl" + +msgid "Deselect" +msgstr "Kijelölés törlése" + +msgid "Disable Motors" +msgstr "Motorok letiltása" + +msgid "Disable XY" +msgstr "XY Letiltása" + +msgid "Displayed Macros" +msgstr "Megjelenített makrók" + +msgid "Distance (mm)" +msgstr "Távolság (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Vissza akarja állítani %s-t?" + +msgid "Elapsed:" +msgstr "Eltelt:" + +msgid "Error" +msgstr "Hiba" + +msgid "Estimated Time Method" +msgstr "Becsült idő módszer" + +msgid "Extrude" +msgstr "Száladagolás" + +msgid "Extrusion +" +msgstr "Extrudálás +" + +msgid "Extrusion -" +msgstr "Extrudálás -" + +msgid "Failed, adjust position first" +msgstr "Sikertelen! Előbb állítsd be a pozíciót" + +msgid "Fan" +msgstr "Hűtés" + +msgid "Filament Used" +msgstr "Használt nyomtatószál" + +msgid "File" +msgstr "Fájl" + +msgid "Fine Tuning" +msgstr "Finomhangolás" + +msgid "Finish" +msgstr "Befejezve" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Újraindítása" + +msgid "Font Size" +msgstr "Betűméret" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Teljes\n" +"Frissítés" + +msgid "Go Back" +msgstr "Visszalépés" + +msgid "Hidden" +msgstr "Rejtett" + +msgid "Hide" +msgstr "Elrejt" + +msgid "Hide sensors in Temp." +msgstr "Szenzorok elrejtése Hőfok." + +msgid "Home" +msgstr "Kezdőpontok" + +msgid "Home All" +msgstr "X-Y-Z kezdőpont" + +msgid "Home X" +msgstr "X kezdőpont" + +msgid "Home XY" +msgstr "XY kezdőpont" + +msgid "Home Y" +msgstr "Y kezdőpont" + +msgid "Home Z" +msgstr "Z kezdőpont" + +msgid "Homing" +msgstr "Kezdőpont" + +msgid "Hostname" +msgstr "Gazdanév" + +msgid "Icon Theme" +msgstr "Ikon téma" + +msgid "Increase" +msgstr "Növel" + +msgid "Initializing" +msgstr "Inicializálás" + +msgid "Initializing printer..." +msgstr "Nyomtató inicializálása..." + +msgid "Interface" +msgstr "Felület" + +msgid "Invalid" +msgstr "Érvénytelen" + +msgid "Invert X" +msgstr "Fordított X" + +msgid "Invert Y" +msgstr "Fordított Y" + +msgid "Invert Z" +msgstr "Fordított Z" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"Újraindítása" + +msgid "Klipper has disconnected" +msgstr "Klipper szétkapcsolt" + +msgid "Klipper has encountered an error." +msgstr "A Klipper hibát észlelt." + +msgid "Klipper has shutdown" +msgstr "A Klipper leállt" + +msgid "Klipper is attempting to start" +msgstr "Klipper megpróbálja elindítani" + +msgid "Klipper will reboot" +msgstr "A Klipper újraindul" + +msgid "Language" +msgstr "Nyelv" + +msgid "Large" +msgstr "Nagy" + +msgid "Left:" +msgstr "Bal:" + +msgid "Limits" +msgstr "Korlátok" + +msgid "Load" +msgstr "Betöltés" + +msgid "Lower Nozzle" +msgstr "Fúvóka le" + +msgid "Macro shortcut on sidebar" +msgstr "Makró parancsikon az oldalsávon" + +msgid "Macros" +msgstr "Makrók" + +msgid "Main Menu" +msgstr "Főmenü" + +msgid "Max Accelation" +msgstr "Max gyorsulás" + +msgid "Max Acceleration to Deceleration" +msgstr "Lassulás max gyorsulása" + +msgid "Max Velocity" +msgstr "Max sebesség" + +msgid "Medium" +msgstr "Közepes" + +msgid "Menu" +msgstr "Menü" + +msgid "Modified" +msgstr "Módosított" + +msgid "Moonraker: connected" +msgstr "Moonraker: csatlakoztatva" + +msgid "Move" +msgstr "Mozgatás" + +msgid "Move Distance (mm)" +msgstr "Mozgási távolság (mm)" + +msgid "Name" +msgstr "Név" + +msgid "Network" +msgstr "Hálózat" + +msgid "Nothing selected" +msgstr "Nincs kiválasztva" + +msgid "Off" +msgstr "Ki" + +#, python-format +msgid "Outdated by %d" +msgstr "%d által elavult" + +msgid "PSK for" +msgstr "PSK-nak" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "A csomag frissítésre kerül" +msgstr[1] "Csomag frissül" + +msgid "Password saved" +msgstr "Jelszó mentve" + +msgid "Pause" +msgstr "Szünet" + +msgid "Paused" +msgstr "Szüneteltetve" + +msgid "Perform a full upgrade?" +msgstr "Teljes frissítést hajt végre?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Fordítsa újra és frissítse a mikrovezérlőt." + +msgid "Power" +msgstr "Bekapcsolás" + +msgid "Power On Printer" +msgstr "Nyomtató bekapcsolása" + +msgid "Print" +msgstr "Nyomtatás" + +msgid "Print Control" +msgstr "Nyomtatásvezérlés" + +msgid "Print Time" +msgstr "Nyomtatási idő" + +msgid "Printer Connections" +msgstr "Nyomtató csatlakozások" + +msgid "Printing" +msgstr "Nyomtatás" + +msgid "Probe found applied offset" +msgstr "A szonda alkalmazott eltolást talált" + +msgid "Profile Name:" +msgstr "Profil név:" + +msgid "Quad Gantry Level" +msgstr "Négy állású szint" + +msgid "Raise Nozzle" +msgstr "Fúvóka fel" + +msgid "Recover Hard" +msgstr "Hárdver visszaállítása" + +msgid "Recover Soft" +msgstr "Program visszaállítása" + +msgid "Reference" +msgstr "Referencia" + +msgid "Restart" +msgstr "Újraindítás" + +msgid "Resume" +msgstr "Folytat" + +msgid "Retract" +msgstr "Visszahúz" + +#, python-format +msgid "Retry #%s" +msgstr "Újra #%s" + +msgid "Save" +msgstr "Mentés" + +msgid "Save Config" +msgstr "Konfiguráció mentése" + +msgid "Save configuration" +msgstr "Konfiguráció mentése" + +msgid "Screen DPMS" +msgstr "Képernyő DPMS" + +msgid "Screen Power Off Time" +msgstr "Kijelző kikapcsolási ideje" + +msgid "Screws Adjust" +msgstr "Csavarok beállítása" + +msgid "Select" +msgstr "Kijelölés" + +msgid "Send" +msgstr "Küldés" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Bekapcsolási jel küldése ide: %s" + +msgid "Set Temp" +msgstr "Hőfok megadás" + +msgid "Settings" +msgstr "Beállítások" + +msgid "Show" +msgstr "Mutat" + +msgid "Size" +msgstr "Méret" + +msgid "Slicer" +msgstr "Szeletelő" + +msgid "Slicer Time correction (%)" +msgstr "Szeletelő idő javítása (%)" + +msgid "Small" +msgstr "Kicsi" + +msgid "Sort by: " +msgstr "Sorrend: " + +msgid "Speed (mm/s)" +msgstr "Sebesség (mm/s)" + +msgid "Speed +" +msgstr "Sebesség +" + +msgid "Speed -" +msgstr "Sebesség -" + +msgid "Square Corner Velocity" +msgstr "Sebesség a sarkokban" + +msgid "Start" +msgstr "Indítás" + +msgid "Starting WiFi Association" +msgstr "A WiFi Egyesület elindítása" + +msgid "Starting recovery for" +msgstr "Helyreállítás megkezdése" + +msgid "Starting update for" +msgstr "Frissítés indítása" + +msgid "System" +msgstr "Rendszer" + +msgid "" +"System\n" +"Restart" +msgstr "" +"Rendszer\n" +"Újraindítása" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"Rendszer\n" +"Leállitás" + +msgid "Temp (°C)" +msgstr "Hőmérséklet (°C)" + +msgid "Temperature" +msgstr "Hőfok" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "A %s KlipperScreen alkalmazásához újra kell indítani" + +msgid "Tool" +msgstr "Eszköz" + +msgid "Total:" +msgstr "Teljes:" + +msgid "Unknown Heater" +msgstr "Ismeretlen melegítő" + +msgid "Unload" +msgstr "Kiadás" + +msgid "Up To Date" +msgstr "Naprakész" + +msgid "Update" +msgstr "Frissít" + +msgid "Updating" +msgstr "Frissítés" + +msgid "Uploaded" +msgstr "Feltöltve" + +msgid "View Mesh" +msgstr "Háló nézet" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY Mozgási seb. (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Z Kalibrálás" + +msgid "Z Move Speed (mm/s)" +msgstr "Z Mozgási seb. (mm/s)" + +msgid "Z Position" +msgstr "Z Pozíció" + +msgid "Z Tilt" +msgstr "Z Dőlés" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "változás" +msgstr[1] "változás" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "óra" +msgstr[1] "óra" + +msgid "minutes" +msgstr "perc" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" + +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Z Eltolás" + +#~ msgid "Unknown Heater " +#~ msgstr "Ismeretlen melegítő " + +#~ msgid "Disconnect" +#~ msgstr "Leválasztás" + +#~ msgid "Duration Only" +#~ msgstr "Csak időtartam" + +#~ msgid "Klipper Version" +#~ msgstr "Klipper verzió" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "A Klipper hibát észlelt a mikrovezérlővel kapcsolatban.\n" +#~ "Fordítsa újra és töltse fel." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "A Klipper hibát észlelt.\n" +#~ "A probléma megoldásához küldjön ki egy FIRMWARE_RESTART-ot." + +#~ msgid "KlipperScreen Version" +#~ msgstr "KlipperScreen verzió" diff --git a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo index 3afb5c2b3..90c3b05e1 100644 Binary files a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po index 147009720..ea7b346f9 100644 --- a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po @@ -1,8 +1,8 @@ msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" "PO-Revision-Date: \n" "Last-Translator: pappicio\n" "Language-Team: \n" @@ -10,12 +10,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "%d pacchetti verranno aggiornati" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" @@ -27,6 +23,9 @@ msgstr "(predef.)" msgid "24 Hour Time" msgstr "24H" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Un FIRMWARE_RESTART potrebbe risolvere il problema." + msgid "Abort" msgstr "Annulla" @@ -42,24 +41,45 @@ msgstr "Aggiungi Stampante" msgid "Add bed mesh profile" msgstr "Aggiungi Profilo Mesh" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Sei sicuro di voler eseguire l'arresto di emergenza?" + msgid "Are you sure you wish to cancel this print?" msgstr "Cancellare la Stampa?" +msgid "Are you sure you wish to disable motors?" +msgstr "Sei sicuro di voler disabilitare i motori?" + msgid "Are you sure you wish to reboot the system?" msgstr "Riavviare il Sistema?" msgid "Are you sure you wish to shutdown the system?" msgstr "Spegnere il Sistema?" +msgid "Auto" +msgstr "Auto" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + msgid "Bed Level" msgstr "Livello del letto" msgid "Bed Mesh" msgstr "Rete letto" +msgid "Bltouch found applied offset" +msgstr "Bltouch ha trovato l'offset applicato" + msgid "Calibrate" msgstr "Calibra" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Calibrato, salva la configurazione per renderla permanente" + +msgid "Can't set above the maximum:" +msgstr "Impossibile impostare al di sopra del massimo:" + msgid "Cancel" msgstr "Annulla" @@ -72,6 +92,9 @@ msgstr "Annullato" msgid "Cancelling" msgstr "Annullamento" +msgid "Cannot connect to Moonraker" +msgstr "Impossibile connettersi a Moonraker" + msgid "Channel" msgstr "Canale" @@ -85,15 +108,15 @@ msgstr "" msgid "Close" msgstr "Chiudi" -msgid "Colorized" -msgstr "Colorato" - msgid "Complete" msgstr "Completo" msgid "Configuration" msgstr "Impostazioni" +msgid "Confirm Emergency Stop" +msgstr "Conferma arresto di emergenza" + msgid "Connected" msgstr "Connesso" @@ -119,15 +142,15 @@ msgstr "Diminuisci" msgid "Delete" msgstr "Elimina" +msgid "Deselect" +msgstr "Deseleziona" + msgid "Disable Motors" msgstr "Disab. Motori" msgid "Disable XY" msgstr "Disab. XY" -msgid "Disconnect" -msgstr "Sconnetti" - msgid "Displayed Macros" msgstr "Mostra/Nascondi Macros" @@ -138,9 +161,6 @@ msgstr "Distanza (mm)" msgid "Do you want to recover %s?" msgstr "Vuoi recuperare %s?" -msgid "Duration Only" -msgstr "Solo Durata" - msgid "Elapsed:" msgstr "Trascorso:" @@ -159,6 +179,9 @@ msgstr "Estrudi +" msgid "Extrusion -" msgstr "Estrudi -" +msgid "Failed, adjust position first" +msgstr "Fallito, regolare prima la posizione" + msgid "Fan" msgstr "Ventola" @@ -174,15 +197,35 @@ msgstr "Messa a Punto" msgid "Finish" msgstr "Finito" -msgid "Firmware Restart" -msgstr "Riavvia Firmware" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Riavvio" msgid "Font Size" msgstr "Dimensione del testo" +msgid "" +"Full\n" +"Update" +msgstr "" +"Completo\n" +"Aggiornare" + msgid "Go Back" msgstr "Indietro" +msgid "Hidden" +msgstr "Nascosto" + +msgid "Hide" +msgstr "Nascondere" + +msgid "Hide sensors in Temp." +msgstr "Nascondi sensori in Temp." + msgid "Home" msgstr "Inizio" @@ -207,12 +250,6 @@ msgstr "Homing" msgid "Hostname" msgstr "Hostname" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" msgstr "Tema Icone" @@ -240,34 +277,19 @@ msgstr "Inverti Y" msgid "Invert Z" msgstr "Inverti Z" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" -"Riavvia\n" -"Klipper" - -msgid "Klipper Version" -msgstr "Versione Klipper" +"Klipper\n" +"Riavvio" msgid "Klipper has disconnected" msgstr "Klipper è disconnesso" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper ha riscontrato un errore con il microcontrollore.\n" -"Si prega di ricompilare e flashare." - msgid "Klipper has encountered an error." msgstr "Klipper ha riscontrato un errore." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper ha riscontrato un errore.\n" -"esegui un FIRMWARE_RESTART per tentare di risolvere il problema." - msgid "Klipper has shutdown" msgstr "Klipper è spento" @@ -277,9 +299,6 @@ msgstr "Klipper si sta avviando" msgid "Klipper will reboot" msgstr "Klipper sarà riavviato" -msgid "KlipperScreen Version" -msgstr "Versione KlipperScreen" - msgid "Language" msgstr "Lingua" @@ -317,7 +336,7 @@ msgid "Max Velocity" msgstr "Velocità Massima" msgid "Medium" -msgstr "" +msgstr "Medio" msgid "Menu" msgstr "Menù" @@ -325,49 +344,60 @@ msgstr "Menù" msgid "Modified" msgstr "Modificato" +msgid "Moonraker: connected" +msgstr "Moonraker: connesso" + msgid "Move" msgstr "Muovi" msgid "Move Distance (mm)" msgstr "Distanza Movimento (mm)" -msgid "Move Speed (mm/s)" -msgstr "Velocità Movimento (mm/s)" - msgid "Name" msgstr "Nome" msgid "Network" msgstr "Rete" -msgid "Number Pad" -msgstr "Tastierino" +msgid "Nothing selected" +msgstr "Niente selezionato" msgid "Off" msgstr "Off" #, python-format -msgid "Outdated by %d commits:" -msgstr "Obsoleto da %d commit:" +msgid "Outdated by %d" +msgstr "Obsoleto di %d" msgid "PSK for" msgstr "PSK per" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Pacchetto verrà aggiornato" +msgstr[1] "I pacchetti verranno aggiornati" + +msgid "Password saved" +msgstr "Password salvata" + msgid "Pause" msgstr "Pausa" msgid "Paused" msgstr "In Pausa" +msgid "Perform a full upgrade?" +msgstr "Eseguire un aggiornamento completo?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Si prega di ricompilare e flashare il microcontrollore." + msgid "Power" msgstr "Power" msgid "Power On Printer" msgstr "Accendi Stampante" -msgid "Preheat" -msgstr "Preriscalda" - msgid "Print" msgstr "Stampa" @@ -383,6 +413,9 @@ msgstr "Connessioni Stampante" msgid "Printing" msgstr "In Stampa" +msgid "Probe found applied offset" +msgstr "Probe ha trovato l'offset applicato" + msgid "Profile Name:" msgstr "Nome Profilo:" @@ -398,6 +431,9 @@ msgstr "Recuperare Hard" msgid "Recover Soft" msgstr "Recuperare Soft" +msgid "Reference" +msgstr "Riferimento" + msgid "Restart" msgstr "Riavvia" @@ -407,33 +443,56 @@ msgstr "Riprendi" msgid "Retract" msgstr "Ritrai" +#, python-format +msgid "Retry #%s" +msgstr "Riprova #%s" + msgid "Save" msgstr "Salva" msgid "Save Config" msgstr "Salva Config" -msgid "Save configuration." -msgstr "Salva configurazione." +msgid "Save configuration" +msgstr "Salva configurazione" + +msgid "Screen DPMS" +msgstr "Schermo DPMS" msgid "Screen Power Off Time" msgstr "Tempo Spegnim. Schermo" -msgid "Screen will show in less than one second" -msgstr "Lo schermo verrà visualizzato a breve" - msgid "Screws Adjust" msgstr "Calibra Screws" +msgid "Select" +msgstr "Selezionare" + +msgid "Send" +msgstr "Spedire" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Invio del segnale di accensione a: %s" + +msgid "Set Temp" +msgstr "Imposta temp" + msgid "Settings" msgstr "Impostazioni" +msgid "Show" +msgstr "Mostrare" + msgid "Size" msgstr "Grandezza" msgid "Slicer" msgstr "Slicer" +msgid "Slicer Time correction (%)" +msgstr "Affettatrice Correzione del tempo (%)" + msgid "Small" msgstr "Piccola" @@ -452,8 +511,11 @@ msgstr "Velocità-" msgid "Square Corner Velocity" msgstr "Velocità Square Corner" -msgid "Starting WiFi Re-association" -msgstr "Riassocia WiFi" +msgid "Start" +msgstr "Iniziare" + +msgid "Starting WiFi Association" +msgstr "Avvio dell'Associazione WiFi" msgid "Starting recovery for" msgstr "Inizio del recupero per" @@ -478,6 +540,9 @@ msgstr "" "Spegni\n" "Sistema" +msgid "Temp (°C)" +msgstr "Temp (°C)" + msgid "Temperature" msgstr "Temperatura" @@ -488,6 +553,12 @@ msgstr "Riavvia KlipperScreen per applicare %s" msgid "Tool" msgstr "Strumenti" +msgid "Total:" +msgstr "Totale:" + +msgid "Unknown Heater" +msgstr "Riscaldatore sconosciuto" + msgid "Unload" msgstr "Scaricare" @@ -497,6 +568,9 @@ msgstr "Aggiornato" msgid "Update" msgstr "Aggiorna" +msgid "Updating" +msgstr "In aggiornamento" + msgid "Uploaded" msgstr "Caricato" @@ -509,6 +583,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "Velocità di spostamento XY (mm/s)" + msgid "Y+" msgstr "Y+" @@ -518,8 +595,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Calibra Z" -msgid "Z Offset" -msgstr "Offset Z" +msgid "Z Move Speed (mm/s)" +msgstr "Velocità di spostamento Z (mm/s)" + +msgid "Z Position" +msgstr "Posizione Z" msgid "Z Tilt" msgstr "Z Tilt" @@ -530,9 +610,19 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "cambio" +msgstr[1] "modifiche" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "ora" +msgstr[1] "ore" + msgid "minutes" msgstr "minuti" @@ -545,8 +635,61 @@ msgstr "mm/s" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (default)" +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Offset Z" + +#~ msgid "Unknown Heater " +#~ msgstr "Riscaldatore sconosciuto " + +#~ msgid "Disconnect" +#~ msgstr "Sconnetti" + +#~ msgid "Duration Only" +#~ msgstr "Solo Durata" + +#~ msgid "Klipper Version" +#~ msgstr "Versione Klipper" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper ha riscontrato un errore con il microcontrollore.\n" +#~ "Si prega di ricompilare e flashare." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper ha riscontrato un errore.\n" +#~ "esegui un FIRMWARE_RESTART per tentare di risolvere il problema." + +#~ msgid "KlipperScreen Version" +#~ msgstr "Versione KlipperScreen" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Mostra solo riscaldatori in temp." + +#~ msgid "Target" +#~ msgstr "Obbiettivo" + +#~ msgid "Temp" +#~ msgstr "Temp" + +#~ msgid "Number Pad" +#~ msgstr "Tastierino" + +#~ msgid "Preheat" +#~ msgstr "Preriscalda" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "Lo schermo verrà visualizzato a breve" #~ msgid "Medium (default)" #~ msgstr "Media (predef.)" @@ -559,6 +702,3 @@ msgstr "mm/s^2" #~ msgid "Change Printer" #~ msgstr "Cambia Stampante" - -#~ msgid "Commited" -#~ msgstr "Impegnato" diff --git a/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..a3adee1e4 Binary files /dev/null and b/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..3be9291e0 --- /dev/null +++ b/ks_includes/locales/ko_KR/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,633 @@ +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: NSteven\n" +"Language-Team: NSteven\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s 버전으로 업데이트될 것입니다" + +msgid "(default)" +msgstr "(기본)" + +msgid "24 Hour Time" +msgstr "24시간제" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "펌웨어 재시작을 사용하여 문제를 해결할 수 있습니다." + +msgid "Abort" +msgstr "중단" + +msgid "Accept" +msgstr "수락" + +msgid "Actions" +msgstr "동작" + +msgid "Add Printer" +msgstr "프린터 추가" + +msgid "Add bed mesh profile" +msgstr "배드 메시 프로필 추가" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "비상정지를 실행하시겠습니까?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "이 출력을 취소하시겠습니까?" + +msgid "Are you sure you wish to disable motors?" +msgstr "모터를 비활성화하시겠습니까?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "시스템을 재시작하시겠습니까?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "시스템을 종료하시겠습니까?" + +msgid "Auto" +msgstr "자동" + +msgid "Auto-scroll" +msgstr "자동스크롤" + +msgid "Bed Level" +msgstr "배드 레벨" + +msgid "Bed Mesh" +msgstr "배드 메시" + +msgid "Bltouch found applied offset" +msgstr "Bltouch가 오프셋을 찾음" + +msgid "Calibrate" +msgstr "교정" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "교정됨, 설정을 영구적으로 저장합니다" + +msgid "Can't set above the maximum:" +msgstr "최대값보다 높게 설정할 수 없습니다:" + +msgid "Cancel" +msgstr "취소" + +msgid "Cancel Print" +msgstr "출력 취소" + +msgid "Cancelled" +msgstr "취소됨" + +msgid "Cancelling" +msgstr "취소중" + +msgid "Cannot connect to Moonraker" +msgstr "Moonraker에 연결할 수 없음" + +msgid "Channel" +msgstr "채널" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"자세한 내용은 /tmp/KlipperScreen.log를 참조하십시오.\n" +"GitHub에 현재 발생한 이슈를 제출하여 도움을 요청하십시오." + +msgid "Close" +msgstr "닫기" + +msgid "Complete" +msgstr "완료" + +msgid "Configuration" +msgstr "환경설정" + +msgid "Confirm Emergency Stop" +msgstr "비상정지 확인" + +msgid "Connected" +msgstr "연결됨" + +#, python-format +msgid "Connecting to %s" +msgstr "%s에 연결중" + +msgid "Console" +msgstr "콘솔" + +msgid "Continue" +msgstr "계속" + +msgid "Cooldown" +msgstr "냉각" + +msgid "Date" +msgstr "날짜" + +msgid "Decrease" +msgstr "감소" + +msgid "Delete" +msgstr "삭제" + +msgid "Deselect" +msgstr "선택해제" + +msgid "Disable Motors" +msgstr "모터 비활성화" + +msgid "Disable XY" +msgstr "XY 비활성화" + +msgid "Displayed Macros" +msgstr "표시할 매크로" + +msgid "Distance (mm)" +msgstr "거리 (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "%s을(를) 복구하시겠습니까?" + +msgid "Elapsed:" +msgstr "경과:" + +msgid "Error" +msgstr "오류" + +msgid "Estimated Time Method" +msgstr "예상시간 표기" + +msgid "Extrude" +msgstr "압출" + +msgid "Extrusion +" +msgstr "압출 +" + +msgid "Extrusion -" +msgstr "압출 -" + +msgid "Failed, adjust position first" +msgstr "실패, 먼저 위치를 조정하십시오." + +msgid "Fan" +msgstr "팬" + +msgid "Filament Used" +msgstr "필라멘트 사용된 양" + +msgid "File" +msgstr "파일" + +msgid "Fine Tuning" +msgstr "미세 조정" + +msgid "Finish" +msgstr "완료됨" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"펌웨어\n" +"재시작" + +msgid "Font Size" +msgstr "폰트 크기" + +msgid "" +"Full\n" +"Update" +msgstr "" +"전체\n" +"업데이트" + +msgid "Go Back" +msgstr "뒤로" + +msgid "Hidden" +msgstr "숨김" + +msgid "Hide" +msgstr "가리기" + +msgid "Hide sensors in Temp." +msgstr "온도에서 센서들 가리기" + +msgid "Home" +msgstr "홈" + +msgid "Home All" +msgstr "전체 홈" + +msgid "Home X" +msgstr "X축 홈" + +msgid "Home XY" +msgstr "XY축 홈" + +msgid "Home Y" +msgstr "Y축 홈" + +msgid "Home Z" +msgstr "Z축 홈" + +msgid "Homing" +msgstr "호밍" + +msgid "Hostname" +msgstr "호스트 이름" + +msgid "Icon Theme" +msgstr "아이콘 테마" + +msgid "Increase" +msgstr "증가" + +msgid "Initializing" +msgstr "초기화중" + +msgid "Initializing printer..." +msgstr "프린터 초기화중…" + +msgid "Interface" +msgstr "인터페이스" + +msgid "Invalid" +msgstr "올바르지 않음" + +msgid "Invert X" +msgstr "X축 반전" + +msgid "Invert Y" +msgstr "Y축 반전" + +msgid "Invert Z" +msgstr "Z축 반전" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"재시작" + +msgid "Klipper has disconnected" +msgstr "Klipper와 연결이 끊어졌습니다" + +msgid "Klipper has encountered an error." +msgstr "Klipper에 오류가 발생했습니다." + +msgid "Klipper has shutdown" +msgstr "Klipper가 종료되었습니다" + +msgid "Klipper is attempting to start" +msgstr "Klipper 시작하는 중" + +msgid "Klipper will reboot" +msgstr "Klipper를 다시 시작합니다" + +msgid "Language" +msgstr "언어" + +msgid "Large" +msgstr "크게" + +msgid "Left:" +msgstr "남음:" + +msgid "Limits" +msgstr "제한" + +msgid "Load" +msgstr "로드" + +msgid "Lower Nozzle" +msgstr "노즐 낮춤" + +msgid "Macro shortcut on sidebar" +msgstr "사이드바 매크로 바로가기" + +msgid "Macros" +msgstr "매크로" + +msgid "Main Menu" +msgstr "메인메뉴" + +msgid "Max Accelation" +msgstr "최대 가속" + +msgid "Max Acceleration to Deceleration" +msgstr "최대 가속에서 감속까지" + +msgid "Max Velocity" +msgstr "최대 속도" + +msgid "Medium" +msgstr "중간" + +msgid "Menu" +msgstr "메뉴" + +msgid "Modified" +msgstr "수정됨" + +msgid "Moonraker: connected" +msgstr "Moonraker: 연결됨" + +msgid "Move" +msgstr "이동" + +msgid "Move Distance (mm)" +msgstr "이동 거리 (mm)" + +msgid "Name" +msgstr "이름" + +msgid "Network" +msgstr "네트워크" + +msgid "Nothing selected" +msgstr "아무것도 선택되지않음" + +msgid "Off" +msgstr "끔" + +#, python-format +msgid "Outdated by %d" +msgstr "%d에 의해 오래된 커밋" + +msgid "PSK for" +msgstr "PSK 비번:" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "패키지가 업데이트됩니다" + +msgid "Password saved" +msgstr "비번 저장됨" + +msgid "Pause" +msgstr "일시정지" + +msgid "Paused" +msgstr "일시정지됨" + +msgid "Perform a full upgrade?" +msgstr "전체 업그레이드를 수행하겠습니까?" + +msgid "Please recompile and flash the micro-controller." +msgstr "마이크로 컨트롤러를 다시 컴파일하고 플래시하십시오." + +msgid "Power" +msgstr "전" + +msgid "Power On Printer" +msgstr "프린터 전원 켜기" + +msgid "Print" +msgstr "출력" + +msgid "Print Control" +msgstr "출력 제어" + +msgid "Print Time" +msgstr "출력 시간" + +msgid "Printer Connections" +msgstr "프린터 연결" + +msgid "Printing" +msgstr "출력중" + +msgid "Probe found applied offset" +msgstr "프로브가 오프셋을 찾았습니다" + +msgid "Profile Name:" +msgstr "프로파일 이름:" + +msgid "Quad Gantry Level" +msgstr "쿼드 갠트리 레벨" + +msgid "Raise Nozzle" +msgstr "노즐 높임" + +msgid "Recover Hard" +msgstr "하드하게 복원" + +msgid "Recover Soft" +msgstr "부드럽게 복원" + +msgid "Reference" +msgstr "레퍼런스" + +msgid "Restart" +msgstr "재시작" + +msgid "Resume" +msgstr "재개" + +msgid "Retract" +msgstr "철회" + +#, python-format +msgid "Retry #%s" +msgstr "재시도 #%s" + +msgid "Save" +msgstr "저장" + +msgid "Save Config" +msgstr "설정 저장" + +msgid "Save configuration" +msgstr "설\b정을 저장합니다" + +msgid "Screen DPMS" +msgstr "화면 DPMS" + +msgid "Screen Power Off Time" +msgstr "화면이 꺼지는 시간" + +msgid "Screws Adjust" +msgstr "스크류 조정" + +msgid "Select" +msgstr "선택" + +msgid "Send" +msgstr "보내기" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "전원 켜기 신호를 보내는 중: %s" + +msgid "Set Temp" +msgstr "온도 설정" + +msgid "Settings" +msgstr "설정" + +msgid "Show" +msgstr "보기" + +msgid "Size" +msgstr "크기" + +msgid "Slicer" +msgstr "슬라이서" + +msgid "Slicer Time correction (%)" +msgstr "슬라이서 시간 보정(%)" + +msgid "Small" +msgstr "작은" + +msgid "Sort by: " +msgstr "분류 기준:" + +msgid "Speed (mm/s)" +msgstr "속도 (mm/s)" + +msgid "Speed +" +msgstr "속도 +" + +msgid "Speed -" +msgstr "속도 -" + +msgid "Square Corner Velocity" +msgstr "사각 모서리 속도" + +msgid "Start" +msgstr "시작" + +msgid "Starting WiFi Association" +msgstr "WiFi 연결을 시작하는 중" + +msgid "Starting recovery for" +msgstr "복구 시작 중:" + +msgid "Starting update for" +msgstr "업데이트 시작 중:" + +msgid "System" +msgstr "시스템" + +msgid "" +"System\n" +"Restart" +msgstr "" +"시스템\n" +"재시작" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"시스템\n" +"종료" + +msgid "Temp (°C)" +msgstr "온도 (°C)" + +msgid "Temperature" +msgstr "온도" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "%s을(를) 적용하려면 KlipperScreen을(를) 다시 시작해야 합니다." + +msgid "Tool" +msgstr "툴" + +msgid "Total:" +msgstr "총:" + +msgid "Unknown Heater" +msgstr "알 수 없는 히터" + +msgid "Unload" +msgstr "언로드" + +msgid "Up To Date" +msgstr "최신버전" + +msgid "Update" +msgstr "업데이트" + +msgid "Updating" +msgstr "업데이트중" + +msgid "Uploaded" +msgstr "업로드됨" + +msgid "View Mesh" +msgstr "메쉬 보기" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY 이동 속도 (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Z 교정" + +msgid "Z Move Speed (mm/s)" +msgstr "Z 이동 속도 (mm/s)" + +msgid "Z Position" +msgstr "Z 위치" + +msgid "Z Tilt" +msgstr "Z 기울기" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "결정" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "시간" + +msgid "minutes" +msgstr "분" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" diff --git a/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..2b2298edd Binary files /dev/null and b/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..52bcf2b09 --- /dev/null +++ b/ks_includes/locales/pl_PL/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,690 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 11:06-0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " +"|| n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s będzie uaktualnionych do wersji" + +msgid "(default)" +msgstr "(domyślny)" + +msgid "24 Hour Time" +msgstr "Zegar 24-godzinny" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "FIRMWARE_RESTART może rozwiązać problem." + +msgid "Abort" +msgstr "Odwołaj" + +msgid "Accept" +msgstr "Akceptuj" + +msgid "Actions" +msgstr "Akcje" + +msgid "Add Printer" +msgstr "Dodaj drukarkę" + +msgid "Add bed mesh profile" +msgstr "Dodaj profil siatki stołu" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Czy na pewno chcesz Awaryjnie Zatrzymać?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Czy na pewno chcesz odwołać drukowanie?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Czy na pewno chcesz wyłączyć silniki?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Czy na pewno chcesz ponownie uruchomić system?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Czy na pewno chcesz wyłączyć system?" + +msgid "Auto" +msgstr "Automatyczny" + +msgid "Auto-scroll" +msgstr "Auto-scroll" + +msgid "Bed Level" +msgstr "Poziom stołu" + +msgid "Bed Mesh" +msgstr "Poziom siatki stołu" + +msgid "Bltouch found applied offset" +msgstr "Bltouch znalazł zastosowane przesunięcie" + +msgid "Calibrate" +msgstr "Kalibracja" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Skalibrowano, zapisz konfigurację aby została na stałe" + +msgid "Can't set above the maximum:" +msgstr "Nie można ustawić powyżej maksymum:" + +msgid "Cancel" +msgstr "Odwołaj" + +msgid "Cancel Print" +msgstr "Odwołaj drukowanie" + +msgid "Cancelled" +msgstr "Odwołano" + +msgid "Cancelling" +msgstr "Odwoływanie trwa" + +msgid "Cannot connect to Moonraker" +msgstr "Nie można połączyć się z Moonrakerem" + +msgid "Channel" +msgstr "Kanał" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Sprawdź /tmp/KlipperScreen.log aby uzyskać więcej informacji.\n" +"Proszę zgłosić usterkę na GitHub by uzyskać pomoc." + +msgid "Close" +msgstr "Zamknij" + +msgid "Complete" +msgstr "Kompletna" + +msgid "Configuration" +msgstr "Konfiguracja" + +msgid "Confirm Emergency Stop" +msgstr "Potwierdź Awaryjny Stop" + +msgid "Connected" +msgstr "Połączono" + +#, python-format +msgid "Connecting to %s" +msgstr "Łączenie do %s" + +msgid "Console" +msgstr "Konsola" + +msgid "Continue" +msgstr "Kontynuacja" + +msgid "Cooldown" +msgstr "Studzenie" + +msgid "Date" +msgstr "Data" + +msgid "Decrease" +msgstr "Obniż" + +msgid "Delete" +msgstr "Skasuj" + +msgid "Deselect" +msgstr "Odznacz" + +msgid "Disable Motors" +msgstr "Wyłącz Silniki" + +msgid "Disable XY" +msgstr "Odłącz XY" + +msgid "Displayed Macros" +msgstr "Wyświetlone Makra" + +msgid "Distance (mm)" +msgstr "Dystans (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Czy chcesz dokończyć %s?" + +msgid "Elapsed:" +msgstr "Czas Trwania:" + +msgid "Error" +msgstr "Błąd" + +msgid "Estimated Time Method" +msgstr "Sposób Oszacowania Czasu" + +msgid "Extrude" +msgstr "Extruduj" + +msgid "Extrusion +" +msgstr "Ekstruzja +" + +msgid "Extrusion -" +msgstr "Ekstruzja -" + +msgid "Failed, adjust position first" +msgstr "Nie udało się, najpierw ustaw pozycję" + +msgid "Fan" +msgstr "Wentylator" + +msgid "Filament Used" +msgstr "Filament w Użytku" + +msgid "File" +msgstr "Plik" + +msgid "Fine Tuning" +msgstr "Regulacja Precyzyjna" + +msgid "Finish" +msgstr "Zakończ" + +#, fuzzy +msgid "" +"Firmware\n" +"Restart" +msgstr "Firmware Restart" + +msgid "Font Size" +msgstr "Rozmiar trzcionki" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Pełny\n" +"Aktualizacja" + +msgid "Go Back" +msgstr "Powróć" + +msgid "Hidden" +msgstr "Ukryty" + +msgid "Hide" +msgstr "Schowaj" + +msgid "Hide sensors in Temp." +msgstr "Ukryj czujniki w Temp." + +msgid "Home" +msgstr "Baza" + +msgid "Home All" +msgstr "Baza Wszystkich" + +msgid "Home X" +msgstr "Baza X" + +msgid "Home XY" +msgstr "Baza XY" + +msgid "Home Y" +msgstr "Baza Y" + +msgid "Home Z" +msgstr "Baza Z" + +msgid "Homing" +msgstr "Bazowanie" + +msgid "Hostname" +msgstr "Nazwa hosta" + +msgid "Icon Theme" +msgstr "Motyw Ikon" + +msgid "Increase" +msgstr "Zwiększ" + +msgid "Initializing" +msgstr "Startowanie" + +msgid "Initializing printer..." +msgstr "Drukarka Startuje..." + +msgid "Interface" +msgstr "Interfejs" + +msgid "Invalid" +msgstr "Nieprawidłowy" + +msgid "Invert X" +msgstr "Odwróć X" + +msgid "Invert Y" +msgstr "Odwróć Y" + +msgid "Invert Z" +msgstr "Odwróć Z" + +#, fuzzy +msgid "" +"Klipper\n" +"Restart" +msgstr "Restart Klippera" + +msgid "Klipper has disconnected" +msgstr "Klipper się rozłączył" + +msgid "Klipper has encountered an error." +msgstr "Klipper napotkał błąd." + +msgid "Klipper has shutdown" +msgstr "Klipper się wyłączył" + +msgid "Klipper is attempting to start" +msgstr "Klipper próbuje wystartować" + +msgid "Klipper will reboot" +msgstr "Klipper będzie się restartował" + +msgid "Language" +msgstr "Język" + +msgid "Large" +msgstr "Duży" + +msgid "Left:" +msgstr "Lewo:" + +msgid "Limits" +msgstr "Limity" + +msgid "Load" +msgstr "Ładuj" + +msgid "Lower Nozzle" +msgstr "Obniż dyszę" + +msgid "Macro shortcut on sidebar" +msgstr "Skrót do makr na pasku bocznym" + +msgid "Macros" +msgstr "Makro" + +msgid "Main Menu" +msgstr "Główne Menu" + +msgid "Max Accelation" +msgstr "Maks akceleracja" + +msgid "Max Acceleration to Deceleration" +msgstr "Maks Przyśpieszenie i Opóźnienie" + +msgid "Max Velocity" +msgstr "Maks Prędkość" + +msgid "Medium" +msgstr "Średni" + +msgid "Menu" +msgstr "Menu" + +msgid "Modified" +msgstr "Zmodyfikowane" + +msgid "Moonraker: connected" +msgstr "Moonraker: podłączony" + +msgid "Move" +msgstr "Ruch" + +msgid "Move Distance (mm)" +msgstr "Odległość Ruchu (mm)" + +msgid "Name" +msgstr "Nazwa" + +msgid "Network" +msgstr "Sieć" + +msgid "Nothing selected" +msgstr "Nic nie wybrano" + +msgid "Off" +msgstr "Wyłącz" + +#, python-format +msgid "Outdated by %d" +msgstr "Nieaktualne przez %d" + +msgid "PSK for" +msgstr "PSK dla" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Pakiet zostanie zaktualizowany" +msgstr[1] "Pakiety zostaną zaktualizowane" +msgstr[2] "Pakiety zostaną zaktualizowane" + +msgid "Password saved" +msgstr "Hasło zostało zapisane" + +msgid "Pause" +msgstr "Pauza" + +msgid "Paused" +msgstr "Zapauzowane" + +msgid "Perform a full upgrade?" +msgstr "Przeprowadzić pełną aktualizację?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Proszę przekompilować i sflashować mikrokontroler." + +msgid "Power" +msgstr "Zasilanie" + +msgid "Power On Printer" +msgstr "Zasilanie włączone" + +msgid "Print" +msgstr "Drukuj" + +msgid "Print Control" +msgstr "Kontrola Druku" + +msgid "Print Time" +msgstr "Czas Druku" + +msgid "Printer Connections" +msgstr "Połączenia Drukarki" + +msgid "Printing" +msgstr "Drukujemy" + +msgid "Probe found applied offset" +msgstr "Probe znalazł zastosowane przesunięcie" + +msgid "Profile Name:" +msgstr "Nazwa Profilu:" + +msgid "Quad Gantry Level" +msgstr "Poziom Bramy" + +msgid "Raise Nozzle" +msgstr "Podnieś dyszę" + +msgid "Recover Hard" +msgstr "Odzyskaj Twardo" + +msgid "Recover Soft" +msgstr "Odzyskaj Miękko" + +msgid "Reference" +msgstr "Sprawdzenie" + +msgid "Restart" +msgstr "Restartuj" + +msgid "Resume" +msgstr "Dokończ" + +msgid "Retract" +msgstr "Cofnij" + +#, python-format +msgid "Retry #%s" +msgstr "Spróbuj ponownie #%s" + +msgid "Save" +msgstr "Zapisz" + +msgid "Save Config" +msgstr "Zapisz Konfigurację" + +msgid "Save configuration" +msgstr "Zapisz konfigurację" + +msgid "Screen DPMS" +msgstr "Ekran DPMS" + +msgid "Screen Power Off Time" +msgstr "Czas wygaszania ekranu" + +msgid "Screws Adjust" +msgstr "Popraw śruby" + +msgid "Select" +msgstr "Zaznacz" + +msgid "Send" +msgstr "Wysłać" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Wysyłam sygnał włączenia do: %s" + +msgid "Set Temp" +msgstr "Ustaw Temperaturę" + +msgid "Settings" +msgstr "Ustawienia" + +msgid "Show" +msgstr "Pokaż" + +msgid "Size" +msgstr "Rozmiar" + +msgid "Slicer" +msgstr "Slicer" + +msgid "Slicer Time correction (%)" +msgstr "Korekta czasu krajalnicy (%)" + +msgid "Small" +msgstr "Mały" + +msgid "Sort by: " +msgstr "Sortuj wg: " + +msgid "Speed (mm/s)" +msgstr "Prędkość (mm/s)" + +msgid "Speed +" +msgstr "Prędkość +" + +msgid "Speed -" +msgstr "Prędkość -" + +msgid "Square Corner Velocity" +msgstr "Prędkość w narożniku kwadratowym" + +msgid "Start" +msgstr "Start" + +msgid "Starting WiFi Association" +msgstr "Rozpoczęcie stowarzyszenia WiFi" + +msgid "Starting recovery for" +msgstr "Rozpoczęcie odzyskiwania dla" + +msgid "Starting update for" +msgstr "Zacznij uaktualnienie dla" + +msgid "System" +msgstr "System" + +msgid "" +"System\n" +"Restart" +msgstr "" +"Restart\n" +"Systemu" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"Wyłączanie\n" +" systemu" + +msgid "Temp (°C)" +msgstr "Temp (°C)" + +msgid "Temperature" +msgstr "Temperatura" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "Aby zastosować %s KlipperScreen musi zostać ponownie uruchomiony" + +msgid "Tool" +msgstr "Narzędzie" + +msgid "Total:" +msgstr "Całkowity:" + +msgid "Unknown Heater" +msgstr "Nieznany Podgrzewacz" + +msgid "Unload" +msgstr "Wyładuj" + +msgid "Up To Date" +msgstr "Aktualne" + +msgid "Update" +msgstr "Uaktualnienie" + +msgid "Updating" +msgstr "Aktualizacja" + +msgid "Uploaded" +msgstr "Przesłane" + +msgid "View Mesh" +msgstr "Wyświetl siatkę" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "Prędkość ruchu XY (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y0" + +msgid "Z Calibrate" +msgstr "Kalibracja Z" + +msgid "Z Move Speed (mm/s)" +msgstr "Prędkość ruchu Z (mm/s)" + +msgid "Z Position" +msgstr "Pozycja Z" + +msgid "Z Tilt" +msgstr "Przechył Z" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "zmiana" +msgstr[1] "zmiany" +msgstr[2] "zmiany" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "godzina" +msgstr[1] "godziny" +msgstr[2] "godzin" + +msgid "minutes" +msgstr "minut" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s^2" + +msgid "mm/s^2" +msgstr "mm/s^2" + +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Przesunięcie Z" + +#~ msgid "Unknown Heater " +#~ msgstr "Nieznany Podgrzewacz " + +#~ msgid "Disconnect" +#~ msgstr "Rozłącz" + +#~ msgid "Duration Only" +#~ msgstr "Tylko Przebieg" + +#~ msgid "Klipper Version" +#~ msgstr "Wersja Klippera" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper napotkał błąd z mikrokontrolerem.\n" +#~ "Prosimy o ponowną kompilację i flashowanie." + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper napotkał błąd.\n" +#~ "Wykonaj FIRMWARE_RESTART, aby spróbować naprawić problem." + +#~ msgid "KlipperScreen Version" +#~ msgstr "Wersja KlipperScreen" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "Pokaż tylko grzejniki w temp." + +#~ msgid "Target" +#~ msgstr "Cel" + +#~ msgid "Temp" +#~ msgstr "Temp" diff --git a/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.mo index 5340ac895..4ebcf5ce6 100644 Binary files a/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.po index 17cd22bf6..b5905c671 100644 --- a/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/ru_RU/LC_MESSAGES/KlipperScreen.po @@ -1,27 +1,22 @@ +# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. # -# Jakob Kais , 2021. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" -"PO-Revision-Date: 2021-09-29 11:33-0300\n" -"Last-Translator: Jakob Kais \n" -"Language-Team: Russian \n" -"Language: ru\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-06-02 17:06+0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" -"X-Poedit-Flags-xgettext: --add-comments\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "% d пакеты будут обновлены" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" @@ -33,6 +28,9 @@ msgstr "(дефолт)" msgid "24 Hour Time" msgstr "24-часовой формат" +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "FIRMWARE_RESTART может решить проблему." + msgid "Abort" msgstr "Отменить" @@ -48,24 +46,45 @@ msgstr "Добавить принтер" msgid "Add bed mesh profile" msgstr "Добавить профиль сетки стола" +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Вы уверены, что хотите запустить аварийную остановку?" + msgid "Are you sure you wish to cancel this print?" msgstr "Вы хотите отменить эту печать?" +msgid "Are you sure you wish to disable motors?" +msgstr "Вы уверены, что хотите отключить двигатели?" + msgid "Are you sure you wish to reboot the system?" msgstr "Вы уверены что хотите перезагрузить систему?" msgid "Are you sure you wish to shutdown the system?" msgstr "Вы хотите выключить принтер?" +msgid "Auto" +msgstr "Авто" + +msgid "Auto-scroll" +msgstr "Автопрокрутка" + msgid "Bed Level" msgstr "Уровень стола" msgid "Bed Mesh" msgstr "Сетка стола" +msgid "Bltouch found applied offset" +msgstr "Bltouch обнаружил примененное смещение" + msgid "Calibrate" msgstr "Калибровка" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Откалибровано, сохраните конфигурацию, чтобы сделать ее постоянной" + +msgid "Can't set above the maximum:" +msgstr "Невозможно установить выше максимума:" + msgid "Cancel" msgstr "Отменить" @@ -78,6 +97,9 @@ msgstr "Отменено" msgid "Cancelling" msgstr "Отменить" +msgid "Cannot connect to Moonraker" +msgstr "Не могу подключиться к Moonraker" + msgid "Channel" msgstr "Канал" @@ -91,14 +113,14 @@ msgstr "" msgid "Close" msgstr "Закрыть" -msgid "Colorized" -msgstr "Цветная" - msgid "Complete" msgstr "Готово" msgid "Configuration" -msgstr "Параметр" +msgstr "Параметры" + +msgid "Confirm Emergency Stop" +msgstr "Подтвердить аварийную остановку" msgid "Connected" msgstr "Соединенный" @@ -125,15 +147,15 @@ msgstr "Уменьшить" msgid "Delete" msgstr "Удалить" +msgid "Deselect" +msgstr "Отменить выбор" + msgid "Disable Motors" msgstr "Откл. моторы" msgid "Disable XY" msgstr "Отключить XY" -msgid "Disconnect" -msgstr "Отключить" - msgid "Displayed Macros" msgstr "Показать макросы" @@ -144,9 +166,6 @@ msgstr "Расстояние (mm)" msgid "Do you want to recover %s?" msgstr "Вы хотите восстановить% s?" -msgid "Duration Only" -msgstr "Продолжительность печати" - msgid "Elapsed:" msgstr "Прошло:" @@ -157,7 +176,7 @@ msgid "Estimated Time Method" msgstr "Расчётное время" msgid "Extrude" -msgstr "Заправить" +msgstr "Экструзия" msgid "Extrusion +" msgstr "Экструзия +" @@ -165,6 +184,9 @@ msgstr "Экструзия +" msgid "Extrusion -" msgstr "Экструзия -" +msgid "Failed, adjust position first" +msgstr "Ошибка. Сначала измените положение" + msgid "Fan" msgstr "Обдув" @@ -180,15 +202,35 @@ msgstr "Точная настройка" msgid "Finish" msgstr "Конец" -msgid "Firmware Restart" -msgstr "Рестарт прошивки" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Рестарт\n" +"Прошивки" msgid "Font Size" msgstr "Размер шрифта" +msgid "" +"Full\n" +"Update" +msgstr "" +"Полное\n" +"Обновление" + msgid "Go Back" msgstr "Назад" +msgid "Hidden" +msgstr "Скрытый" + +msgid "Hide" +msgstr "Скрывать" + +msgid "Hide sensors in Temp." +msgstr "Скрыть датчики в Temp." + msgid "Home" msgstr "Парковка" @@ -213,12 +255,6 @@ msgstr "Парковка" msgid "Hostname" msgstr "Имя хоста" -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - msgid "Icon Theme" msgstr "Темы" @@ -246,34 +282,22 @@ msgstr "Инверсия Y" msgid "Invert Z" msgstr "Инверсия Z" -msgid "Klipper Restart" +msgid "" +"Klipper\n" +"Restart" msgstr "" -"Рестарт\n" -"Klipper" +"Klipper\n" +"Рестарт" -msgid "Klipper Version" -msgstr "Версия Klipper" +msgid "Klipper: disconnected" +msgstr "Klipper: отключился" msgid "Klipper has disconnected" msgstr "Нет связи с Klipper" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper определил ошибку в микроконтроллере.\n" -"Прошейте заново." - msgid "Klipper has encountered an error." msgstr "Klipper обнаружил ошибку." -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper обнаружил ошибку.\n" -"Выполните перезагрузку прошивки, чтобы попытаться исправить проблему." - msgid "Klipper has shutdown" msgstr "Klipper отключился" @@ -283,9 +307,6 @@ msgstr "Klipper готов" msgid "Klipper will reboot" msgstr "Klipper перезагружается" -msgid "KlipperScreen Version" -msgstr "Версия KlipperScreen" - msgid "Language" msgstr "Язык" @@ -304,6 +325,9 @@ msgstr "Загрузить" msgid "Lower Nozzle" msgstr "Опустить сопло" +msgid "Lost Connection to Moonraker" +msgstr "Потеряна связь с Moonraker" + msgid "Macro shortcut on sidebar" msgstr "Показать макросы в панели" @@ -313,11 +337,11 @@ msgstr "Макросы" msgid "Main Menu" msgstr "Главное меню" -msgid "Max Accelation" -msgstr "Ускорения" +msgid "Max Acceleration" +msgstr "Максимальное ускорение" msgid "Max Acceleration to Deceleration" -msgstr "Ускорения торможения" +msgstr "Ускоренное торможения" msgid "Max Velocity" msgstr "Скорость" @@ -331,21 +355,24 @@ msgstr "Меню" msgid "Modified" msgstr "Изменено" +msgid "Moonraker: connected" +msgstr "Мунрейкер: подключен" + msgid "Move" -msgstr "Двигать" +msgstr "Движение" msgid "Move Distance (mm)" msgstr "Дистанция перемещения (мм)" -msgid "Move Speed (mm/s)" -msgstr "Скорость перемещения (мм/с)" - msgid "Name" msgstr "Имя" msgid "Network" msgstr "Сеть" +msgid "Nothing selected" +msgstr "Ничего не выбрано" + msgid "Number Pad" msgstr "Клавиатура" @@ -353,27 +380,39 @@ msgid "Off" msgstr "Выкл" #, python-format -msgid "Outdated by %d commits:" -msgstr "Устарело на% d коммитов:" +msgid "Outdated by %d" +msgstr "Устарело на %d" msgid "PSK for" msgstr "PSK для" +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Пакет будет обновлен" +msgstr[1] "" +msgstr[2] "" + +msgid "Password saved" +msgstr "Пароль сохранен" + msgid "Pause" msgstr "Пауза" msgid "Paused" msgstr "Приостановлено" +msgid "Perform a full upgrade?" +msgstr "Выполнить полное обновление?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Пожалуйста, перекомпилируйте и прошейте микроконтроллер." + msgid "Power" msgstr "Включено" msgid "Power On Printer" msgstr "Включить принтер" -msgid "Preheat" -msgstr "Разогрев" - msgid "Print" msgstr "Печать" @@ -389,9 +428,15 @@ msgstr "Подключение принтера" msgid "Printing" msgstr "Печатается" +msgid "Probe found applied offset" +msgstr "Probe обнаружил примененное смещение" + msgid "Profile Name:" msgstr "Имя профиля:" +msgid "Preheat" +msgstr "Преднагрев" + msgid "Quad Gantry Level" msgstr "Уровень Quad Gantry" @@ -404,6 +449,9 @@ msgstr "Восстановить Hard" msgid "Recover Soft" msgstr "Восстановить Soft" +msgid "Reference" +msgstr "Ссылка" + msgid "Restart" msgstr "Перезагрузка" @@ -413,33 +461,56 @@ msgstr "Продолжить" msgid "Retract" msgstr "Втянуть" +#, python-format +msgid "Retry #%s" +msgstr "Повторить #%s" + msgid "Save" msgstr "Сохранить" msgid "Save Config" msgstr "Сохр. Конфиг" -msgid "Save configuration." -msgstr "Настройки сохраняются." +msgid "Save configuration" +msgstr "Настройки сохраняются" + +msgid "Screen DPMS" +msgstr "Экран DPMS" msgid "Screen Power Off Time" msgstr "Время выключения экрана" -msgid "Screen will show in less than one second" -msgstr "Экран отобразится через одну секунду" - msgid "Screws Adjust" msgstr "Настроить винты" +msgid "Select" +msgstr "Выбрать" + +msgid "Send" +msgstr "Отправлять" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Отправка сигнала включения питания на: %s" + +msgid "Set Temp" +msgstr "Заданная температура" + msgid "Settings" msgstr "Настройки" +msgid "Show" +msgstr "Показать" + msgid "Size" msgstr "Размер" msgid "Slicer" msgstr "Слайсер" +msgid "Slicer Time correction (%)" +msgstr "Коррекция времени слайсера (%)" + msgid "Small" msgstr "Маленький" @@ -458,8 +529,11 @@ msgstr "Скорость -" msgid "Square Corner Velocity" msgstr "Квадратная угловая скорость" -msgid "Starting WiFi Re-association" -msgstr "WiFi реконенект" +msgid "Start" +msgstr "Hачать" + +msgid "Starting WiFi Association" +msgstr "Запуск ассоциации WiFi" msgid "Starting recovery for" msgstr "Запуск восстановления для" @@ -482,6 +556,9 @@ msgid "" "Shutdown" msgstr "Выключить" +msgid "Temp (°C)" +msgstr "Темп (°С)" + msgid "Temperature" msgstr "Tемпература" @@ -492,6 +569,12 @@ msgstr "Чтобы применить %s необходимо перезапус msgid "Tool" msgstr "Инструмент" +msgid "Total:" +msgstr "Всего:" + +msgid "Unknown Heater" +msgstr "Неизвестный обогреватель" + msgid "Unload" msgstr "Загружено" @@ -501,6 +584,9 @@ msgstr "Обновлено" msgid "Update" msgstr "Обновить" +msgid "Updating" +msgstr "Обновление" + msgid "Uploaded" msgstr "Дата" @@ -513,6 +599,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "Скорость перемещения по осям XY (мм/с)" + msgid "Y+" msgstr "Y+" @@ -522,8 +611,11 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Калибр. Z" -msgid "Z Offset" -msgstr "Офсет Z" +msgid "Z Move Speed (mm/s)" +msgstr "Скорость перемещения по оси Z (мм/с)" + +msgid "Z Position" +msgstr "Позиция Z" msgid "Z Tilt" msgstr "Z Наклон" @@ -534,9 +626,21 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "изменение" +msgstr[1] "" +msgstr[2] "" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "час" +msgstr[1] "" +msgstr[2] "" + msgid "minutes" msgstr "минут" @@ -548,51 +652,3 @@ msgstr "мм/с" msgid "mm/s^2" msgstr "мм/с^2" - -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (default)" - -#~ msgid "Medium (default)" -#~ msgstr "Средний (по умолчанию)" - -#~ msgid "File Estimation (default)" -#~ msgstr "По файлу (по умолчанию)" - -#~ msgid "..." -#~ msgstr "..." - -#~ msgid "Change Printer" -#~ msgstr "Сменить принтер" - -#~ msgid "Commited" -#~ msgstr "Зафиксировано" - -#~ msgid "Fan Off" -#~ msgstr "Bыключить" - -#~ msgid "Fan On" -#~ msgstr "Bключи" - -#~ msgid "Fast" -#~ msgstr "Быстро" - -#~ msgid "Set Speed" -#~ msgstr "Скорость" - -#~ msgid "Slow" -#~ msgstr "Mедленно" - -#~ msgid "?" -#~ msgstr "?" - -#~ msgid "Are you sure you want to print" -#~ msgstr "Вы хотите это распечатать" - -#~ msgid "Cancel Change" -#~ msgstr "Отменить изменения" - -#~ msgid "Control" -#~ msgstr "Управление" - -#~ msgid "Load Average" -#~ msgstr "Средняя нагрузка" diff --git a/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..5c3c30226 Binary files /dev/null and b/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..edf1b7f11 --- /dev/null +++ b/ks_includes/locales/sv_SE/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,673 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-04-15 17:25+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: sv_SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s uppdateras till version" + +msgid "(default)" +msgstr "(standard)" + +msgid "24 Hour Time" +msgstr "24 timmars tid" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "En FIRMWARE_RESTART kan lösa problemet." + +msgid "Abort" +msgstr "Avbryt" + +msgid "Accept" +msgstr "Godkänn" + +msgid "Actions" +msgstr "Åtgärder" + +msgid "Add Printer" +msgstr "Lägg till skrivare" + +msgid "Add bed mesh profile" +msgstr "Lägg till mesh profil" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Är du säker på att du vill köra Nödstopp?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Är du säker på att du vill avbryta denna utskrift?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Är du säker på att du vill inaktivera motorer?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Är du säker på att du vill starta om systemet?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Är du säker på att du vill stänga av systemet?" + +msgid "Auto" +msgstr "Automatisk" + +msgid "Auto-scroll" +msgstr "Auto-scrolla" + +#, fuzzy +msgid "Bed Level" +msgstr "Bed Level" + +#, fuzzy +msgid "Bed Mesh" +msgstr "Bed Mesh" + +msgid "Bltouch found applied offset" +msgstr "Bltouch hittade tillämpad offset" + +msgid "Calibrate" +msgstr "Kalibrera" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Kalibrerad, spara konfiguration för att göra den permanent" + +msgid "Can't set above the maximum:" +msgstr "Kan inte ställa in över maxgränsen:" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "Cancel Print" +msgstr "Avbryt utskrift" + +msgid "Cancelled" +msgstr "Avbruten" + +msgid "Cancelling" +msgstr "Avbryter" + +msgid "Cannot connect to Moonraker" +msgstr "Kan inte ansluta till Moonraker" + +#, fuzzy +msgid "Channel" +msgstr "Kanal" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Kontrollera /tmp/KlipperScreen.log för mer information.\n" +"Skicka in ett problem på GitHub för hjälp." + +msgid "Close" +msgstr "Stäng" + +msgid "Complete" +msgstr "Färdig" + +msgid "Configuration" +msgstr "Konfiguration" + +msgid "Confirm Emergency Stop" +msgstr "Bekräfta nödstopp" + +msgid "Connected" +msgstr "Ansluten" + +#, python-format +msgid "Connecting to %s" +msgstr "Ansluter till %s" + +msgid "Console" +msgstr "Konsol" + +msgid "Continue" +msgstr "Fortsätt" + +msgid "Cooldown" +msgstr "Nedkylning" + +msgid "Date" +msgstr "Datum" + +msgid "Decrease" +msgstr "Minska" + +msgid "Delete" +msgstr "Radera" + +msgid "Deselect" +msgstr "Avmarkera" + +msgid "Disable Motors" +msgstr "Inaktivera motorer" + +msgid "Disable XY" +msgstr "Inaktivera XY" + +msgid "Displayed Macros" +msgstr "Makron visas" + +msgid "Distance (mm)" +msgstr "Avstånd (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Vill du återställa %s?" + +msgid "Elapsed:" +msgstr "Förfluten:" + +msgid "Error" +msgstr "Fel" + +#, fuzzy +msgid "Estimated Time Method" +msgstr "Uppskattad tid metod" + +msgid "Extrude" +msgstr "Extrudera" + +msgid "Extrusion +" +msgstr "Extrudering +" + +msgid "Extrusion -" +msgstr "Extrudering -" + +msgid "Failed, adjust position first" +msgstr "Misslyckades, justera positionen först" + +msgid "Fan" +msgstr "Fläkt" + +#, fuzzy +msgid "Filament Used" +msgstr "Filament använt" + +msgid "File" +msgstr "Fil" + +msgid "Fine Tuning" +msgstr "Finjustering" + +msgid "Finish" +msgstr "Slutför" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Omstart" + +msgid "Font Size" +msgstr "Textstorlek" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Fullständig\n" +"Uppdatering" + +msgid "Go Back" +msgstr "Gå tillbaka" + +msgid "Hidden" +msgstr "Dold" + +msgid "Hide" +msgstr "Dölj" + +msgid "Hide sensors in Temp." +msgstr "Dölj sensorer i Temp." + +msgid "Home" +msgstr "Hem" + +msgid "Home All" +msgstr "Hem Alla" + +msgid "Home X" +msgstr "Hem X" + +msgid "Home XY" +msgstr "Hem XY" + +msgid "Home Y" +msgstr "Hem Y" + +msgid "Home Z" +msgstr "Hem Z" + +#, fuzzy +msgid "Homing" +msgstr "Homing" + +msgid "Hostname" +msgstr "Värdnamn" + +msgid "Icon Theme" +msgstr "Ikon tema" + +msgid "Increase" +msgstr "Öka" + +msgid "Initializing" +msgstr "Initierar" + +msgid "Initializing printer..." +msgstr "Initierar skrivaren..." + +msgid "Interface" +msgstr "Gränssnitt" + +msgid "Invalid" +msgstr "Ogiltig" + +msgid "Invert X" +msgstr "Invertera X" + +msgid "Invert Y" +msgstr "Invertera Y" + +msgid "Invert Z" +msgstr "Invertera Z" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"Omstart" + +#, fuzzy +msgid "Klipper has disconnected" +msgstr "Klipper har kopplat från" + +msgid "Klipper has encountered an error." +msgstr "Klipper har stött på ett fel." + +msgid "Klipper has shutdown" +msgstr "Klipper har stängts av" + +msgid "Klipper is attempting to start" +msgstr "Klipper försöker starta" + +msgid "Klipper will reboot" +msgstr "Klipper kommer att starta om" + +msgid "Language" +msgstr "Språk" + +msgid "Large" +msgstr "Stor" + +msgid "Left:" +msgstr "Återstående:" + +msgid "Limits" +msgstr "Begränsningar" + +msgid "Load" +msgstr "Ladda" + +msgid "Lower Nozzle" +msgstr "Sänk munstycket" + +msgid "Macro shortcut on sidebar" +msgstr "Makro genväg på sidofältet" + +msgid "Macros" +msgstr "Makron" + +msgid "Main Menu" +msgstr "Huvudmeny" + +#, fuzzy +msgid "Max Accelation" +msgstr "Maximal acceleration" + +#, fuzzy +msgid "Max Acceleration to Deceleration" +msgstr "Maximal acceleration till inbromsning" + +#, fuzzy +msgid "Max Velocity" +msgstr "Maximal hastighet" + +msgid "Medium" +msgstr "Medium" + +msgid "Menu" +msgstr "Meny" + +msgid "Modified" +msgstr "Ändrad" + +msgid "Moonraker: connected" +msgstr "Moonraker: ansluten" + +msgid "Move" +msgstr "Flytta" + +msgid "Move Distance (mm)" +msgstr "Förflyttningsavstånd (mm)" + +msgid "Name" +msgstr "Namn" + +msgid "Network" +msgstr "Nätverk" + +msgid "Nothing selected" +msgstr "Inget valt" + +msgid "Off" +msgstr "Avstängd" + +#, fuzzy, python-format +msgid "Outdated by %d" +msgstr "Föråldrad med %d" + +msgid "PSK for" +msgstr "PSK för" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Paketet kommer att uppdateras" +msgstr[1] "Paketen kommer att uppdateras" + +msgid "Password saved" +msgstr "Lösenordet har sparats" + +msgid "Pause" +msgstr "Pausa" + +msgid "Paused" +msgstr "Pausad" + +msgid "Perform a full upgrade?" +msgstr "Utför en fullständig uppgradering?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Vänligen kompilera om och flasha mikrokontrollern." + +msgid "Power" +msgstr "Ström" + +msgid "Power On Printer" +msgstr "Slå på skrivaren" + +msgid "Print" +msgstr "Skriv ut" + +msgid "Print Control" +msgstr "Utskriftskontroll" + +#, fuzzy +msgid "Print Time" +msgstr "Tid för utskrift" + +#, fuzzy +msgid "Printer Connections" +msgstr "Skrivaranslutningar" + +msgid "Printing" +msgstr "Skriver ut" + +#, fuzzy +msgid "Probe found applied offset" +msgstr "Sond hittat tillämpad offset" + +msgid "Profile Name:" +msgstr "Profilens namn:" + +#, fuzzy +msgid "Quad Gantry Level" +msgstr "Quad Gantry nivå" + +#, fuzzy +msgid "Raise Nozzle" +msgstr "Höj munstycket" + +#, fuzzy +msgid "Recover Hard" +msgstr "Återhämta Hårt" + +#, fuzzy +msgid "Recover Soft" +msgstr "Återhämta Mjukt" + +msgid "Reference" +msgstr "Referens" + +msgid "Restart" +msgstr "Starta om" + +msgid "Resume" +msgstr "Återuppta" + +#, fuzzy +msgid "Retract" +msgstr "Dra tillbaka" + +#, fuzzy, python-format +msgid "Retry #%s" +msgstr "Försök #%s" + +msgid "Save" +msgstr "Spara" + +msgid "Save Config" +msgstr "Spara konfiguration" + +msgid "Save configuration" +msgstr "Spara konfigurationen" + +#, fuzzy +msgid "Screen DPMS" +msgstr "DPMS för skärm" + +msgid "Screen Power Off Time" +msgstr "Avstängningstid för skärmen" + +#, fuzzy +msgid "Screws Adjust" +msgstr "Justera skruvar" + +msgid "Select" +msgstr "Välj" + +msgid "Send" +msgstr "Skicka" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Skickar ström PÅ-signal till: %s" + +#, fuzzy +msgid "Set Temp" +msgstr "Ställ in temp" + +msgid "Settings" +msgstr "Inställningar" + +msgid "Show" +msgstr "Visa" + +msgid "Size" +msgstr "Storlek" + +#, fuzzy +msgid "Slicer" +msgstr "Slicer" + +#, fuzzy +msgid "Slicer Time correction (%)" +msgstr "Slicer Tidskorrigering (%)" + +msgid "Small" +msgstr "Liten" + +msgid "Sort by: " +msgstr "Sortera efter: " + +msgid "Speed (mm/s)" +msgstr "Hastighet (mm/s)" + +msgid "Speed +" +msgstr "Hastighet +" + +msgid "Speed -" +msgstr "Hastighet -" + +#, fuzzy +msgid "Square Corner Velocity" +msgstr "Fyrkantig hörnhastighet" + +msgid "Start" +msgstr "Starta" + +#, fuzzy +msgid "Starting WiFi Association" +msgstr "Startar WiFi Association" + +#, fuzzy +msgid "Starting recovery for" +msgstr "Startar återhämtning för" + +#, fuzzy +msgid "Starting update for" +msgstr "Startar uppdatering för" + +msgid "System" +msgstr "System" + +msgid "" +"System\n" +"Restart" +msgstr "" +"System\n" +"Omstart" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"System\n" +"Avstängning" + +msgid "Temp (°C)" +msgstr "Temperatur (°C)" + +msgid "Temperature" +msgstr "Temperatur" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "För att tillämpa %s måste KlipperScreen startas om" + +msgid "Tool" +msgstr "Verktyg" + +#, fuzzy +msgid "Total:" +msgstr "Sammanlagt:" + +msgid "Unknown Heater" +msgstr "Okänt värmeelement" + +#, fuzzy +msgid "Unload" +msgstr "Lasta av" + +msgid "Up To Date" +msgstr "Aktuellt" + +msgid "Update" +msgstr "Uppdatera" + +msgid "Updating" +msgstr "Uppdaterar" + +msgid "Uploaded" +msgstr "Uppladdad" + +#, fuzzy +msgid "View Mesh" +msgstr "Visa Mesh" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY rörelsehastighet (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Z Kalibrering" + +msgid "Z Move Speed (mm/s)" +msgstr "Z rörelsehastighet (mm/s)" + +msgid "Z Position" +msgstr "Z Position" + +#, fuzzy +msgid "Z Tilt" +msgstr "Z Lutning" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +#, fuzzy +msgid "commit" +msgid_plural "commits" +msgstr[0] "commit" +msgstr[1] "commits" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "timme" +msgstr[1] "timmar" + +msgid "minutes" +msgstr "minuter" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" diff --git a/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..3a271bc87 Binary files /dev/null and b/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..d3cff4bc6 --- /dev/null +++ b/ks_includes/locales/tr_TR/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,641 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-05-06 21:48+0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s sürüme güncellenecektir" + +msgid "(default)" +msgstr "(varsayılan)" + +msgid "24 Hour Time" +msgstr "24 Saat Zaman" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Bir FIRMWARE_RESTART sorunu çözebilir." + +msgid "Abort" +msgstr "İptal et" + +msgid "Accept" +msgstr "Kabul et" + +msgid "Actions" +msgstr "Eylemler" + +msgid "Add Printer" +msgstr "Yazıcı Ekle" + +msgid "Add bed mesh profile" +msgstr "Yatak Örgüsü profili ekle" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Acil Durdurma'yı çalıştırmak istediğinizden emin misiniz?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Bu baskıyı iptal etmek istediğinizden emin misiniz?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Motorları devre dışı bırakmak istediğinizden emin misiniz?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Sistemi yeniden başlatmak istediğinizden emin misiniz?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Sistemi kapatmak istediğinizden emin misiniz?" + +msgid "Auto" +msgstr "Otomatik" + +msgid "Auto-scroll" +msgstr "Otomatik kaydırma" + +msgid "Bed Level" +msgstr "Yatak Ayarı" + +msgid "Bed Mesh" +msgstr "Yatak Örgüsü" + +msgid "Bltouch found applied offset" +msgstr "Bltouch uygulanmış ofseti buldu" + +msgid "Calibrate" +msgstr "Kalibre et" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Kalibre edildi, kalıcı hale getirmek için yapılandırmayı kaydedin" + +msgid "Can't set above the maximum:" +msgstr "Maksimumun üzerine ayarlanamaz:" + +msgid "Cancel" +msgstr "İptal" + +msgid "Cancel Print" +msgstr "Baskıyı iptal et" + +msgid "Cancelled" +msgstr "İptal edildi" + +msgid "Cancelling" +msgstr "İptal ediliyor" + +msgid "Cannot connect to Moonraker" +msgstr "Moonraker'a bağlanılamıyor" + +msgid "Channel" +msgstr "Kanal" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Daha fazla bilgi için /tmp/KlipperScreen.log'a bakın.\n" +"Lütfen yardım için GitHub'da bir sorun gönderin." + +msgid "Close" +msgstr "Kapat" + +msgid "Complete" +msgstr "Tamamlandı" + +msgid "Configuration" +msgstr "Yapılandırma" + +msgid "Confirm Emergency Stop" +msgstr "Acil Durdurmayı Onaylayın" + +msgid "Connected" +msgstr "Bağlandı" + +#, python-format +msgid "Connecting to %s" +msgstr "%s'e Bağlanılıyor" + +msgid "Console" +msgstr "Konsol" + +msgid "Continue" +msgstr "Devam et" + +msgid "Cooldown" +msgstr "Soğutma" + +msgid "Date" +msgstr "Tarih" + +msgid "Decrease" +msgstr "Azalt" + +msgid "Delete" +msgstr "Sil" + +msgid "Deselect" +msgstr "Seçimi kaldır" + +msgid "Disable Motors" +msgstr "Motorları Devre Dışı Bırak" + +msgid "Disable XY" +msgstr "XY Devre dışı bırak" + +msgid "Displayed Macros" +msgstr "Görüntülenen Makrolar" + +msgid "Distance (mm)" +msgstr "Uzaklık (mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "%s Kurtarmak istiyor musunuz?" + +msgid "Elapsed:" +msgstr "Geçen:" + +msgid "Error" +msgstr "Hata" + +msgid "Estimated Time Method" +msgstr "Tahmini Zaman Metodu" + +msgid "Extrude" +msgstr "Ekstrüzyon" + +msgid "Extrusion +" +msgstr "Ekstrüzyon +" + +msgid "Extrusion -" +msgstr "Ekstrüzyon -" + +msgid "Failed, adjust position first" +msgstr "Başarısız, önce konumu ayarlayın" + +msgid "Fan" +msgstr "Fan" + +msgid "Filament Used" +msgstr "Kullanılan Filament" + +msgid "File" +msgstr "Dosya" + +msgid "Fine Tuning" +msgstr "İnce Ayar" + +msgid "Finish" +msgstr "Bitir" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Yeniden Başlat" + +msgid "Font Size" +msgstr "Yazı boyutu" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Tam\n" +"Güncelleme" + +msgid "Go Back" +msgstr "Geri git" + +msgid "Hidden" +msgstr "Gizli" + +msgid "Hide" +msgstr "Gizle" + +msgid "Hide sensors in Temp." +msgstr "Sıcaklıktaki sensörleri gizleyin." + +msgid "Home" +msgstr "Ana Ekran" + +msgid "Home All" +msgstr "Eksenleri Sıfırla" + +msgid "Home X" +msgstr "X Sıfırla" + +msgid "Home XY" +msgstr "XY Sıfırla" + +msgid "Home Y" +msgstr "Y Sıfırla" + +msgid "Home Z" +msgstr "Z Sıfırla" + +msgid "Homing" +msgstr "Eksen Sıfırlama" + +msgid "Hostname" +msgstr "Ana bilgisayar adı" + +msgid "Icon Theme" +msgstr "Simge Teması" + +msgid "Increase" +msgstr "Artır" + +msgid "Initializing" +msgstr "Başlatılıyor" + +msgid "Initializing printer..." +msgstr "Yazıcı başlatılıyor..." + +msgid "Interface" +msgstr "Arayüz" + +msgid "Invalid" +msgstr "Geçersiz" + +msgid "Invert X" +msgstr "X Ters çevir" + +msgid "Invert Y" +msgstr "Y Ters çevir" + +msgid "Invert Z" +msgstr "Z Ters çevir" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"Yeniden başlat" + +msgid "Klipper has disconnected" +msgstr "Klipper bağlantısı kesildi" + +msgid "Klipper has encountered an error." +msgstr "Klipper bir hatayla karşılaştı." + +msgid "Klipper has shutdown" +msgstr "Klipper Kapandı" + +msgid "Klipper is attempting to start" +msgstr "Klipper başlatılmaya çalışılıyor" + +msgid "Klipper will reboot" +msgstr "Klipper yeniden başlayacak" + +msgid "Language" +msgstr "Dil" + +msgid "Large" +msgstr "Büyük" + +msgid "Left:" +msgstr "Kalan:" + +msgid "Limits" +msgstr "Limitler" + +msgid "Load" +msgstr "Yükle" + +msgid "Lower Nozzle" +msgstr "Nozzle düşür" + +msgid "Macro shortcut on sidebar" +msgstr "Kenar çubuğunda makro kısayolu" + +msgid "Macros" +msgstr "Makrolar" + +msgid "Main Menu" +msgstr "Ana Menü" + +msgid "Max Accelation" +msgstr "Maksimum Hızlanma" + +msgid "Max Acceleration to Deceleration" +msgstr "Maksimum Hızlanma ve Yavaşlama" + +msgid "Max Velocity" +msgstr "Maksimum Hız" + +msgid "Medium" +msgstr "Orta" + +msgid "Menu" +msgstr "Menü" + +msgid "Modified" +msgstr "Değiştirilmiş" + +msgid "Moonraker: connected" +msgstr "Moonraker: bağlandı" + +msgid "Move" +msgstr "Hareket" + +msgid "Move Distance (mm)" +msgstr "Hareket Mesafesi (mm)" + +msgid "Name" +msgstr "İsim" + +msgid "Network" +msgstr "Ağ" + +msgid "Nothing selected" +msgstr "Hiçbir şey seçilmedi" + +msgid "Off" +msgstr "Kapa" + +#, python-format +msgid "Outdated by %d" +msgstr "Güncelliğini yitiren %d" + +msgid "PSK for" +msgstr "PSK için" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Paket yükseltilecek" +msgstr[1] "Paketler yükseltilecek" + +msgid "Password saved" +msgstr "Şifre kaydedildi" + +msgid "Pause" +msgstr "Duraklat" + +msgid "Paused" +msgstr "Duraklatıldı" + +msgid "Perform a full upgrade?" +msgstr "Tam yükseltme yap?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Lütfen mikro denetleyiciyi yeniden derleyin ve flaşlayın." + +msgid "Power" +msgstr "Güç" + +msgid "Power On Printer" +msgstr "Yazıcıya Güç Ver (aç)" + +msgid "Print" +msgstr "Yazdır" + +msgid "Print Control" +msgstr "Yazdırma Kontrolü" + +msgid "Print Time" +msgstr "Yazdırma Süresi" + +msgid "Printer Connections" +msgstr "Yazıcı Bağlantıları" + +msgid "Printing" +msgstr "Yazdırılıyor" + +msgid "Probe found applied offset" +msgstr "Prob uygulanmış ofset bulundu" + +msgid "Profile Name:" +msgstr "Profil ismi:" + +msgid "Quad Gantry Level" +msgstr "Dörtlü Köprü Seviyesi" + +msgid "Raise Nozzle" +msgstr "Nozzle yükselt" + +msgid "Recover Hard" +msgstr "Zorla Kurtar" + +msgid "Recover Soft" +msgstr "Yumuşak Kurtar" + +msgid "Reference" +msgstr "Referans" + +msgid "Restart" +msgstr "Yeniden Başlat" + +msgid "Resume" +msgstr "Devam Et" + +msgid "Retract" +msgstr "Geri çek" + +#, python-format +msgid "Retry #%s" +msgstr "Yeniden Dene #%s" + +msgid "Save" +msgstr "Kaydet" + +msgid "Save Config" +msgstr "Yapılandırma Kayıt" + +msgid "Save configuration" +msgstr "Yapılandırmayı kaydet" + +msgid "Screen DPMS" +msgstr "Ekran DPMS" + +msgid "Screen Power Off Time" +msgstr "Ekran kapatma zamanı" + +msgid "Screws Adjust" +msgstr "Vida Ayarı" + +msgid "Select" +msgstr "Seç" + +msgid "Send" +msgstr "Gönder" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Güç AÇ sinyalı gönderilen: %s" + +msgid "Set Temp" +msgstr "Sıcaklık Ayarla" + +msgid "Settings" +msgstr "Ayarlar" + +msgid "Show" +msgstr "Göster" + +msgid "Size" +msgstr "Boyut" + +msgid "Slicer" +msgstr "Dilimleme" + +msgid "Slicer Time correction (%)" +msgstr "Dilimleme Zamanı doğrulama (%)" + +msgid "Small" +msgstr "Küçük" + +msgid "Sort by: " +msgstr "Sırala: " + +msgid "Speed (mm/s)" +msgstr "Hız (mm/s)" + +msgid "Speed +" +msgstr "Hız +" + +msgid "Speed -" +msgstr "Hız -" + +msgid "Square Corner Velocity" +msgstr "Kare Köşe Hızı" + +msgid "Start" +msgstr "Başlat" + +msgid "Starting WiFi Association" +msgstr "WiFi Bağlantısı başlatılıyor" + +msgid "Starting recovery for" +msgstr "Kurtarma başlatılıyor" + +msgid "Starting update for" +msgstr "Güncelleme başlatılıyor" + +msgid "System" +msgstr "Sistem" + +msgid "" +"System\n" +"Restart" +msgstr "" +"Sistem\n" +"Yeniden Başlat" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"Sistem\n" +"Kapat" + +msgid "Temp (°C)" +msgstr "Sıcaklık (°C)" + +msgid "Temperature" +msgstr "Sıcaklık" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "Uygulamak için %s KlipperScreen yeniden başlatılmalı" + +msgid "Tool" +msgstr "Araç" + +msgid "Total:" +msgstr "Toplam:" + +msgid "Unknown Heater" +msgstr "Bilinmeyen Isıtıcı" + +msgid "Unload" +msgstr "Boşalt" + +msgid "Up To Date" +msgstr "Güncel" + +msgid "Update" +msgstr "Güncelle" + +msgid "Updating" +msgstr "Yükleniyor" + +msgid "Uploaded" +msgstr "Yüklendi" + +msgid "View Mesh" +msgstr "Örgüyü Görüntüle" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY Hareket hızı (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Z Kalibrasyonu" + +msgid "Z Move Speed (mm/s)" +msgstr "Z Hareket hızı (mm/s)" + +msgid "Z Position" +msgstr "Z Pozisyonu" + +msgid "Z Tilt" +msgstr "Z Eğim" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "commit" +msgstr[1] "commits" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "saat" +msgstr[1] "saatler" + +msgid "minutes" +msgstr "dakika" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" diff --git a/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..d6147e936 Binary files /dev/null and b/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..d0a696ed6 --- /dev/null +++ b/ks_includes/locales/uk_UA/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,655 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 11:18-0300\n" +"Last-Translator: \n" +"Language-Team: Andrii Komarovskiy\n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s буде оновлено до версії" + +msgid "(default)" +msgstr "(за замовчуванням)" + +msgid "24 Hour Time" +msgstr "24-годинний час" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "РЕСТАРТ ПРОШИВКИ може вирішити проблему." + +msgid "Abort" +msgstr "Перервати" + +msgid "Accept" +msgstr "Прийняти" + +msgid "Actions" +msgstr "Керування" + +msgid "Add Printer" +msgstr "Додати принтер" + +msgid "Add bed mesh profile" +msgstr "Додати сітку столу" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Ви впевнені, що хочете запустити аварійну зупинку?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Ви впевнені, що хочете скасувати цей друк?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Ви впевнені, що хочете відключити двигуни?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Ви впевнені, що хочете перезавантажити систему?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Ви впевнені, що хочете вимкнути систему?" + +msgid "Auto" +msgstr "Автоматично" + +msgid "Auto-scroll" +msgstr "Автоматична прокрутка" + +msgid "Bed Level" +msgstr "Вирівнювання столу" + +msgid "Bed Mesh" +msgstr "Сітка столу" + +msgid "Bltouch found applied offset" +msgstr "Зонд знайшов застосоване зміщення" + +msgid "Calibrate" +msgstr "Калібрування" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "Відкалібровано, збережіть конфігурацію, щоб зробити її постійною" + +msgid "Can't set above the maximum:" +msgstr "Не встановити вище макс.:" + +msgid "Cancel" +msgstr "Скасувати" + +msgid "Cancel Print" +msgstr "Скасувати друк" + +msgid "Cancelled" +msgstr "Скасовано" + +msgid "Cancelling" +msgstr "Скасування" + +msgid "Cannot connect to Moonraker" +msgstr "Не можливо підключитися до Moonraker" + +msgid "Channel" +msgstr "Канал" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"Перевірте /tmp/KlipperScreen.log для отримання додаткової інформації.\n" +"Будь ласка, надішліть проблему на GitHub, щоб отримати допомогу." + +msgid "Close" +msgstr "Закрити" + +msgid "Complete" +msgstr "Завершено" + +msgid "Configuration" +msgstr "Конфігурація" + +msgid "Confirm Emergency Stop" +msgstr "Підтверджувати АВАРІЙНУ ЗУПИНКУ" + +msgid "Connected" +msgstr "Підключено" + +#, python-format +msgid "Connecting to %s" +msgstr "Підключення до %s" + +msgid "Console" +msgstr "Консоль" + +msgid "Continue" +msgstr "Продовжити" + +msgid "Cooldown" +msgstr "Охолодження" + +msgid "Date" +msgstr "Дата" + +msgid "Decrease" +msgstr "Зменшити" + +msgid "Delete" +msgstr "Видалити" + +msgid "Deselect" +msgstr "Відміна" + +msgid "Disable Motors" +msgstr "Вимкнути мотори" + +msgid "Disable XY" +msgstr "Вимкнути XY" + +msgid "Displayed Macros" +msgstr "Відображення Макросів" + +msgid "Distance (mm)" +msgstr "Відстань (мм)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Ви хочете відновити %s?" + +msgid "Elapsed:" +msgstr "Минуло:" + +msgid "Error" +msgstr "Помилка" + +msgid "Estimated Time Method" +msgstr "Метод розрахунку часу" + +msgid "Extrude" +msgstr "Видавити" + +msgid "Extrusion +" +msgstr "Екструзія+" + +msgid "Extrusion -" +msgstr "Екструзія -" + +msgid "Failed, adjust position first" +msgstr "Помилка, спочатку хоумінг" + +msgid "Fan" +msgstr "Вентилятор" + +msgid "Filament Used" +msgstr "Філамент" + +msgid "File" +msgstr "Файл" + +msgid "Fine Tuning" +msgstr "Підправити" + +msgid "Finish" +msgstr "Фініш" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"Перезавантажте" + +msgid "Font Size" +msgstr "Розмір шрифту" + +msgid "" +"Full\n" +"Update" +msgstr "" +"Повний\n" +"Оновлення" + +msgid "Go Back" +msgstr "Назад" + +msgid "Hidden" +msgstr "Оновлення" + +msgid "Hide" +msgstr "Сховати" + +msgid "Hide sensors in Temp." +msgstr "Сховати датчик темп." + +msgid "Home" +msgstr "Домашня сторінка" + +msgid "Home All" +msgstr "Дім Всі" + +msgid "Home X" +msgstr "Дім Х" + +msgid "Home XY" +msgstr "Дім XY" + +msgid "Home Y" +msgstr "Дім Y" + +msgid "Home Z" +msgstr "Дім Z" + +msgid "Homing" +msgstr "До дому" + +msgid "Hostname" +msgstr "Назва хоста" + +msgid "Icon Theme" +msgstr "Тема оформлення" + +msgid "Increase" +msgstr "Збільшити" + +msgid "Initializing" +msgstr "Ініціалізація" + +msgid "Initializing printer..." +msgstr "Ініціалізація принтера..." + +msgid "Interface" +msgstr "Інтерфейс" + +msgid "Invalid" +msgstr "Недійсний" + +msgid "Invert X" +msgstr "Інвертувати X" + +msgid "Invert Y" +msgstr "Інвертувати Y" + +msgid "Invert Z" +msgstr "Інвертувати Z" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"Перезавантажте" + +msgid "Klipper has disconnected" +msgstr "Klipper відключився" + +msgid "Klipper has encountered an error." +msgstr "У Klipper сталася помилка." + +msgid "Klipper has shutdown" +msgstr "Klipper вимкнувся" + +msgid "Klipper is attempting to start" +msgstr "Кліппер намагається стартувати" + +msgid "Klipper will reboot" +msgstr "Klipper перезавантажиться" + +msgid "Language" +msgstr "Мова" + +msgid "Large" +msgstr "Великий" + +msgid "Left:" +msgstr "Залишилось:" + +msgid "Limits" +msgstr "Ліміти" + +msgid "Load" +msgstr "Завантажити" + +msgid "Lower Nozzle" +msgstr "Низ сопла" + +msgid "Macro shortcut on sidebar" +msgstr "Ярлик макросу на бічній панелі" + +msgid "Macros" +msgstr "Макрос" + +msgid "Main Menu" +msgstr "Main Menu" + +msgid "Max Accelation" +msgstr "Макс. прискорення" + +msgid "Max Acceleration to Deceleration" +msgstr "Макс. прискорення до гальмування" + +msgid "Max Velocity" +msgstr "Макс. швидкість" + +msgid "Medium" +msgstr "Середній" + +msgid "Menu" +msgstr "Меню" + +msgid "Modified" +msgstr "Змінено" + +msgid "Moonraker: connected" +msgstr "Підключено до Moonraker" + +msgid "Move" +msgstr "Рухатися" + +msgid "Move Distance (mm)" +msgstr "Переміщення (мм)" + +msgid "Name" +msgstr "Ім'я" + +msgid "Network" +msgstr "Сітка" + +msgid "Nothing selected" +msgstr "Не вибрано" + +msgid "Off" +msgstr "Вимк" + +#, python-format +msgid "Outdated by %d" +msgstr "Застаріло на %d" + +msgid "PSK for" +msgstr "PSK для" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Пакет буде оновлено" +msgstr[1] "Пакет буде оновлено" +msgstr[2] "Пакет буде оновлено" + +msgid "Password saved" +msgstr "Пароль збережено" + +msgid "Pause" +msgstr "Пауза" + +msgid "Paused" +msgstr "Пауза" + +msgid "Perform a full upgrade?" +msgstr "Виконати повне оновлення?" + +msgid "Please recompile and flash the micro-controller." +msgstr "Будь ласка, перекомпілюйте та перепрошійте мікроконтролер." + +msgid "Power" +msgstr "Живлення" + +msgid "Power On Printer" +msgstr "Увімкнути принтер" + +msgid "Print" +msgstr "Друк" + +msgid "Print Control" +msgstr "Контроль друку" + +msgid "Print Time" +msgstr "Час друку" + +msgid "Printer Connections" +msgstr "Підключення принтера" + +msgid "Printing" +msgstr "Друк" + +msgid "Probe found applied offset" +msgstr "Зонд знайшов застосоване зміщення" + +msgid "Profile Name:" +msgstr "Ім'я профілю:" + +msgid "Quad Gantry Level" +msgstr "Портальне вирівнювання" + +msgid "Raise Nozzle" +msgstr "Підняти сопло" + +msgid "Recover Hard" +msgstr "Відновити все" + +msgid "Recover Soft" +msgstr "Відновити легко" + +msgid "Reference" +msgstr "Довідка" + +msgid "Restart" +msgstr "Перезапуск" + +msgid "Resume" +msgstr "Відновити" + +msgid "Retract" +msgstr "Ретракт" + +#, python-format +msgid "Retry #%s" +msgstr "Повторіть #%s" + +msgid "Save" +msgstr "Зберегти" + +msgid "Save Config" +msgstr "Зберегти конфіг" + +msgid "Save configuration" +msgstr "Зберегти конфігурацію" + +msgid "Screen DPMS" +msgstr "Екран DPMS" + +msgid "Screen Power Off Time" +msgstr "Вимкнути екран через" + +msgid "Screws Adjust" +msgstr "Регулювання гвинтів" + +msgid "Select" +msgstr "Вибрати" + +msgid "Send" +msgstr "Надіслати" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "Надсилання сигналу увімкнення живлення на: %s" + +msgid "Set Temp" +msgstr "Встановити t°" + +msgid "Settings" +msgstr "Налаштування" + +msgid "Show" +msgstr "Показати" + +msgid "Size" +msgstr "Розмір" + +msgid "Slicer" +msgstr "Слайсер" + +msgid "Slicer Time correction (%)" +msgstr "Виправлення часу слайсера (%)" + +msgid "Small" +msgstr "Малий" + +msgid "Sort by: " +msgstr "Сортувати за: " + +msgid "Speed (mm/s)" +msgstr "Швидкість (мм/с)" + +msgid "Speed +" +msgstr "Швидкість +" + +msgid "Speed -" +msgstr "Швидкість -" + +msgid "Square Corner Velocity" +msgstr "Квадратна кутова швидкість" + +msgid "Start" +msgstr "Старт" + +msgid "Starting WiFi Association" +msgstr "Запуск асоціації WiFi" + +msgid "Starting recovery for" +msgstr "Початок відновлення для" + +msgid "Starting update for" +msgstr "Початок оновлення для" + +msgid "System" +msgstr "Системна" + +msgid "" +"System\n" +"Restart" +msgstr "" +"Рестарт\n" +"Малини" + +msgid "" +"System\n" +"Shutdown" +msgstr "" +"Вимкнути\n" +"Малину" + +msgid "Temp (°C)" +msgstr "Teмп (°C)" + +msgid "Temperature" +msgstr "Температура" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "Щоб застосувати %s, потрібно перезапустити KlipperScreen" + +msgid "Tool" +msgstr "Інструмент" + +msgid "Total:" +msgstr "Всього:" + +msgid "Unknown Heater" +msgstr "Невідомий нагрівач" + +msgid "Unload" +msgstr "Вийняти" + +msgid "Up To Date" +msgstr "Оновити" + +msgid "Update" +msgstr "Оновлення" + +#, fuzzy +msgid "Updating" +msgstr "Оновлення" + +msgid "Uploaded" +msgstr "Завантажено" + +msgid "View Mesh" +msgstr "Показати сітку" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "Швидкість XY (мм/с)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Калібровка Z" + +msgid "Z Move Speed (mm/s)" +msgstr "Швидкість Z (мм/с)" + +msgid "Z Position" +msgstr "Позиція Z" + +msgid "Z Tilt" +msgstr "Z Нахил" + +msgid "Z+" +msgstr "Бебістеп Z+" + +msgid "Z-" +msgstr "Бебістеп Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "коментар" +msgstr[1] "коментар" +msgstr[2] "коментар" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "година" +msgstr[1] "години" +msgstr[2] "годин" + +msgid "minutes" +msgstr "хвилин" + +msgid "mm" +msgstr "мм" + +msgid "mm/s" +msgstr "мм/с" + +msgid "mm/s^2" +msgstr "мм/с²" + +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Зміщення Z" diff --git a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo index 566c3b174..13714975e 100644 Binary files a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po index 390f87be9..5f6268002 100644 --- a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po @@ -5,32 +5,31 @@ # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-29 11:44-0300\n" -"PO-Revision-Date: 2021-09-29 11:35-0300\n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 11:21-0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "%d Packages will be updated" -msgstr "%d 个软件包将被更新" +"X-Generator: Poedit 3.0.1\n" #, python-format msgid "%s will be updated to version" -msgstr "%s 将更新到版本" +msgstr "更新 %s 到版本" msgid "(default)" -msgstr "(默认" +msgstr "(默认)" msgid "24 Hour Time" -msgstr "24 小时制" +msgstr "使用 24 小时制" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "FIRMWARE_RESTART 可能会解决此问题。" msgid "Abort" msgstr "终止" @@ -39,32 +38,53 @@ msgid "Accept" msgstr "接受" msgid "Actions" -msgstr "动作" +msgstr "工具" msgid "Add Printer" msgstr "添加打印机" msgid "Add bed mesh profile" -msgstr "添加网格床" +msgstr "添加热床网格" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "您确定要紧急停止吗?" msgid "Are you sure you wish to cancel this print?" msgstr "您确定要取消打印吗?" +msgid "Are you sure you wish to disable motors?" +msgstr "您确定要禁用电机吗?" + msgid "Are you sure you wish to reboot the system?" msgstr "您确定要重启系统吗?" msgid "Are you sure you wish to shutdown the system?" msgstr "您确定要关闭系统吗?" +msgid "Auto" +msgstr "汽车" + +msgid "Auto-scroll" +msgstr "自动滚屏" + msgid "Bed Level" msgstr "热床调平" msgid "Bed Mesh" -msgstr "网格床" +msgstr "热床网格" + +msgid "Bltouch found applied offset" +msgstr "Bltouch 发现应用的偏移量" msgid "Calibrate" msgstr "校准" +msgid "Calibrated, save configuration to make it permanent" +msgstr "已校准,保存配置后生效" + +msgid "Can't set above the maximum:" +msgstr "设置值超出最大值:" + msgid "Cancel" msgstr "取消" @@ -72,13 +92,16 @@ msgid "Cancel Print" msgstr "取消打印" msgid "Cancelled" -msgstr "取消" +msgstr "已取消" msgid "Cancelling" -msgstr "取消" +msgstr "正在取消" + +msgid "Cannot connect to Moonraker" +msgstr "无法连接到 Moonraker" msgid "Channel" -msgstr "通道" +msgstr "更新通道" msgid "" "Check /tmp/KlipperScreen.log for more information.\n" @@ -90,33 +113,33 @@ msgstr "" msgid "Close" msgstr "关闭" -msgid "Colorized" -msgstr "Colorized" - msgid "Complete" msgstr "完成" msgid "Configuration" msgstr "配置" +msgid "Confirm Emergency Stop" +msgstr "确认紧急停止" + msgid "Connected" -msgstr "连接" +msgstr "已连接" #, python-format msgid "Connecting to %s" msgstr "连接到 %s" msgid "Console" -msgstr "安慰" +msgstr "控制台" msgid "Continue" msgstr "继续" msgid "Cooldown" -msgstr "冷却" +msgstr "降温" msgid "Date" -msgstr "日期" +msgstr "上传日期" msgid "Decrease" msgstr "减少" @@ -124,51 +147,51 @@ msgstr "减少" msgid "Delete" msgstr "删除" +msgid "Deselect" +msgstr "取消选择" + msgid "Disable Motors" msgstr "禁用步进电机" msgid "Disable XY" -msgstr "禁用 XY" - -msgid "Disconnect" -msgstr "断开" +msgstr "关闭 XY 电机" msgid "Displayed Macros" -msgstr "显示宏命令" +msgstr "宏命令显示开关" msgid "Distance (mm)" -msgstr "距离(mm)" +msgstr "挤出距离(mm)" #, python-format msgid "Do you want to recover %s?" msgstr "您想恢复 %s 吗?" -msgid "Duration Only" -msgstr "仅持续时间" - msgid "Elapsed:" -msgstr "过去:" +msgstr "已用时间:" msgid "Error" msgstr "错误" msgid "Estimated Time Method" -msgstr "预估时间方法" +msgstr "估算剩余时间方式" msgid "Extrude" -msgstr "挤出机" +msgstr "挤出" msgid "Extrusion +" -msgstr "挤出 +" +msgstr "挤出流量 +" msgid "Extrusion -" -msgstr "挤出 -" +msgstr "挤出流量 -" + +msgid "Failed, adjust position first" +msgstr "失败,请先调整位置" msgid "Fan" msgstr "风扇" msgid "Filament Used" -msgstr "已经消耗的耗材" +msgstr "已用耗材" msgid "File" msgstr "文件" @@ -179,20 +202,40 @@ msgstr "微调" msgid "Finish" msgstr "结束" -msgid "Firmware Restart" -msgstr "框架重启" +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"重启\n" +"Firmware" msgid "Font Size" msgstr "字体大小" +msgid "" +"Full\n" +"Update" +msgstr "" +"满的\n" +"更新" + msgid "Go Back" msgstr "返回" +msgid "Hidden" +msgstr "隐" + +msgid "Hide" +msgstr "隐藏" + +msgid "Hide sensors in Temp." +msgstr "在温度中隐藏传感器。" + msgid "Home" msgstr "归零" msgid "Home All" -msgstr "归零全部" +msgstr "全部归零" msgid "Home X" msgstr "归零 X" @@ -210,16 +253,10 @@ msgid "Homing" msgstr "归零" msgid "Hostname" -msgstr "主机名称" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" +msgstr "主机名" msgid "Icon Theme" -msgstr "图标 主题" +msgstr "主题风格" msgid "Increase" msgstr "增加" @@ -228,81 +265,65 @@ msgid "Initializing" msgstr "初始化中" msgid "Initializing printer..." -msgstr "初始化打印机中.." +msgstr "初始化打印机中..." msgid "Interface" msgstr "接口" msgid "Invalid" -msgstr "无效的" +msgstr "无效" msgid "Invert X" -msgstr "翻转 X" +msgstr "反转 X" msgid "Invert Y" -msgstr "翻转 Y" +msgstr "反转 Y" msgid "Invert Z" -msgstr "翻转 Z" - -msgid "Klipper Restart" -msgstr "Klipper 重启" +msgstr "反转 Z" -msgid "Klipper Version" -msgstr "Klipper 版本" +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"重启\n" +"Klipper" msgid "Klipper has disconnected" msgstr "Klipper 已断开连接" -msgid "" -"Klipper has encountered an error with the micro-controller.\n" -"Please recompile and flash." -msgstr "" -"Klipper的微控制器发生错误。\n" -"请重新编译并刷新。" - msgid "Klipper has encountered an error." msgstr "Klipper遇到一个错误。" -msgid "" -"Klipper has encountered an error.\n" -"Issue a FIRMWARE_RESTART to attempt fixing the issue." -msgstr "" -"Klipper遇到错误。\n" -"发出 FIRMWARE_RESTART 尝试解决此问题。" - msgid "Klipper has shutdown" -msgstr "Klipper 已经关闭" +msgstr "Klipper 已关闭" msgid "Klipper is attempting to start" msgstr "Klipper 正在尝试启动" msgid "Klipper will reboot" -msgstr "Klipper 将重新启动" - -msgid "KlipperScreen Version" -msgstr "KlipperScreen 版本" +msgstr "并重新启动Klipper" msgid "Language" -msgstr "语" +msgstr "界面语言" msgid "Large" -msgstr "大的" +msgstr "大" msgid "Left:" -msgstr "左:" +msgstr "剩余时间:" msgid "Limits" -msgstr "限制" +msgstr "打印机限制" msgid "Load" -msgstr "加载" +msgstr "载入耗材" msgid "Lower Nozzle" msgstr "降低喷嘴" msgid "Macro shortcut on sidebar" -msgstr "侧边栏上的宏快捷方式" +msgstr "显示侧边栏宏快捷方式" msgid "Macros" msgstr "宏" @@ -311,13 +332,13 @@ msgid "Main Menu" msgstr "主菜单" msgid "Max Accelation" -msgstr "最大加速度" +msgstr "加速度" msgid "Max Acceleration to Deceleration" -msgstr "最大加速到减速" +msgstr "加速到减速度" msgid "Max Velocity" -msgstr "最大速度" +msgstr "速度" msgid "Medium" msgstr "中" @@ -328,33 +349,40 @@ msgstr "菜单" msgid "Modified" msgstr "修改" +msgid "Moonraker: connected" +msgstr "Moonraker:已连接" + msgid "Move" msgstr "移动" msgid "Move Distance (mm)" msgstr "移动距离(mm)" -msgid "Move Speed (mm/s)" -msgstr "移动速度 (mm/s)" - msgid "Name" -msgstr "名称" +msgstr "文件名称" msgid "Network" msgstr "网络" -msgid "Number Pad" -msgstr "数字键盘" +msgid "Nothing selected" +msgstr "未选择任何内容" msgid "Off" msgstr "关闭" #, python-format -msgid "Outdated by %d commits:" -msgstr "已过时 %d 次提交:" +msgid "Outdated by %d" +msgstr "已过时 %d" msgid "PSK for" -msgstr "PSK 用于" +msgstr "网络密码PSK" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "包将被更新" + +msgid "Password saved" +msgstr "密码已保存" msgid "Pause" msgstr "暂停" @@ -362,14 +390,17 @@ msgstr "暂停" msgid "Paused" msgstr "已暂停" +msgid "Perform a full upgrade?" +msgstr "执行全面升级?" + +msgid "Please recompile and flash the micro-controller." +msgstr "请重新编译并刷写微控制器。" + msgid "Power" -msgstr "电源" +msgstr "电源开关" msgid "Power On Printer" -msgstr "开启打印机" - -msgid "Preheat" -msgstr "预热" +msgstr "启动打印机" msgid "Print" msgstr "打印" @@ -378,31 +409,37 @@ msgid "Print Control" msgstr "打印控制" msgid "Print Time" -msgstr "打印时间" +msgstr "打印用时" msgid "Printer Connections" -msgstr "连接打印机" +msgstr "打印机列表" msgid "Printing" -msgstr "打印中" +msgstr "印刷" + +msgid "Probe found applied offset" +msgstr "Probe 发现应用的偏移量" msgid "Profile Name:" msgstr "配置文件名称:" msgid "Quad Gantry Level" -msgstr "龙门调平" +msgstr "龙门架调平" msgid "Raise Nozzle" msgstr "升高喷嘴" msgid "Recover Hard" -msgstr "恢复 Hard" +msgstr "重置(Hard)" msgid "Recover Soft" -msgstr "恢复 Soft" +msgstr "重置(Soft)" + +msgid "Reference" +msgstr "参考" msgid "Restart" -msgstr "重启" +msgstr "重启Klipper" msgid "Resume" msgstr "恢复" @@ -410,35 +447,58 @@ msgstr "恢复" msgid "Retract" msgstr "回抽" +#, python-format +msgid "Retry #%s" +msgstr "重试 #%s" + msgid "Save" msgstr "保存" msgid "Save Config" msgstr "保存配置" -msgid "Save configuration." -msgstr "保存配置文件." +msgid "Save configuration" +msgstr "即将保存配置文件" -msgid "Screen Power Off Time" -msgstr "屏幕关闭时间" +msgid "Screen DPMS" +msgstr "屏幕DPMS" -msgid "Screen will show in less than one second" -msgstr "屏幕将在1秒内显示" +msgid "Screen Power Off Time" +msgstr "关闭屏幕" msgid "Screws Adjust" -msgstr "Screws 调整" +msgstr "平台螺丝调整" + +msgid "Select" +msgstr "选择" + +msgid "Send" +msgstr "发送" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "正在发送通电信号到:%s" + +msgid "Set Temp" +msgstr "设定温度" msgid "Settings" msgstr "设置" +msgid "Show" +msgstr "显示" + msgid "Size" -msgstr "大小" +msgstr "文件大小" msgid "Slicer" -msgstr "切片机" +msgstr "切片软件" + +msgid "Slicer Time correction (%)" +msgstr "切片器时间校正 (%)" msgid "Small" -msgstr "小的" +msgstr "小" msgid "Sort by: " msgstr "排序: " @@ -453,10 +513,13 @@ msgid "Speed -" msgstr "速度 -" msgid "Square Corner Velocity" -msgstr "方角速度" +msgstr "转角速度" + +msgid "Start" +msgstr "开始" -msgid "Starting WiFi Re-association" -msgstr "启动 WiFi 重新关联" +msgid "Starting WiFi Association" +msgstr "启动 WiFi 关联" msgid "Starting recovery for" msgstr "开始恢复" @@ -470,25 +533,34 @@ msgstr "系统" msgid "" "System\n" "Restart" -msgstr "系统重启" +msgstr "重启系统" msgid "" "System\n" "Shutdown" msgstr "关闭系统" +msgid "Temp (°C)" +msgstr "温度 (°C)" + msgid "Temperature" -msgstr "温度" +msgstr "设置温度" #, python-format msgid "To apply %s KlipperScreen needs to be restarted" -msgstr "要应用 %s,需要重新启动 KlipperScreen" +msgstr "要应用 %s 主题,需要重新启动 KlipperScreen" msgid "Tool" msgstr "工具" +msgid "Total:" +msgstr "全部的:" + +msgid "Unknown Heater" +msgstr "未知加热器" + msgid "Unload" -msgstr "卸下" +msgstr "退出耗材" msgid "Up To Date" msgstr "最新" @@ -496,11 +568,15 @@ msgstr "最新" msgid "Update" msgstr "更新" +#, fuzzy +msgid "Updating" +msgstr "更新" + msgid "Uploaded" -msgstr "已上传" +msgstr "上传时间" msgid "View Mesh" -msgstr "查看网格" +msgstr "查看热床网格" msgid "X+" msgstr "X+" @@ -508,6 +584,9 @@ msgstr "X+" msgid "X-" msgstr "X-" +msgid "XY Move Speed (mm/s)" +msgstr "XY 移动速度 (mm/s)" + msgid "Y+" msgstr "Y+" @@ -517,11 +596,14 @@ msgstr "Y-" msgid "Z Calibrate" msgstr "Z 校准" -msgid "Z Offset" -msgstr "Z 间隙" +msgid "Z Move Speed (mm/s)" +msgstr "Z 移动速度 (mm/s)" + +msgid "Z Position" +msgstr "Z 位置" msgid "Z Tilt" -msgstr "Z Tilt" +msgstr "Z 倾斜校准" msgid "Z+" msgstr "Z+" @@ -529,9 +611,17 @@ msgstr "Z+" msgid "Z-" msgstr "Z-" +msgid "commit" +msgid_plural "commits" +msgstr[0] "改变" + msgid "dBm" msgstr "dBm" +msgid "hour" +msgid_plural "hours" +msgstr[0] "小时" + msgid "minutes" msgstr "分钟" @@ -544,18 +634,67 @@ msgstr "mm/s" msgid "mm/s^2" msgstr "mm/s^2" -#~ msgid "Z-bolt (default)" -#~ msgstr "Z-bolt (default)" +#~ msgid "IPv4" +#~ msgstr "IPv4 地址" + +#~ msgid "IPv6" +#~ msgstr "IPv6 地址" + +#~ msgid "Z Offset" +#~ msgstr "Z 偏移" + +#~ msgid "Unknown Heater " +#~ msgstr "未知加热器 " + +#~ msgid "Disconnect" +#~ msgstr "断开" + +#~ msgid "Duration Only" +#~ msgstr "持续时间" + +#~ msgid "Klipper Version" +#~ msgstr "Klipper 版本" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper与MCU通讯错误。\n" +#~ "请为主板重新烧录固件。" + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper 遇到错误。\n" +#~ "使用 重启Firmware 命令尝试解决此问题。" + +#~ msgid "KlipperScreen Version" +#~ msgstr "KlipperScreen 版本" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "仅显示使用中的加热器" + +#~ msgid "Target" +#~ msgstr "目标" + +#~ msgid "Temp" +#~ msgstr "温度" + +#~ msgid "Number Pad" +#~ msgstr "数字键盘" + +#~ msgid "Preheat" +#~ msgstr "预热" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "屏幕将在1秒内显示" #~ msgid "Medium (default)" -#~ msgstr "中(默认" +#~ msgstr "中 (默认)" #~ msgid "File Estimation (default)" -#~ msgstr "文件估计(默认)" - -#, fuzzy -#~ msgid "Change Printer" -#~ msgstr "取消打印" +#~ msgstr "文件 (默认)" #~ msgid "Fan Off" #~ msgstr "关闭风扇" @@ -564,29 +703,23 @@ msgstr "mm/s^2" #~ msgstr "打开风扇" #~ msgid "Fast" -#~ msgstr "快速" +#~ msgstr "加速" #~ msgid "Set Speed" #~ msgstr "设置速度" #~ msgid "Slow" -#~ msgstr "慢" +#~ msgstr "减速" #~ msgid "?" #~ msgstr "?" -#~ msgid "Are you sure you want to print" -#~ msgstr "您确定要开始打印吗" - #~ msgid "Cancel Change" -#~ msgstr "取消变更" +#~ msgstr "取消改动" #~ msgid "Control" #~ msgstr "控制" -#~ msgid "Emergency Stop" -#~ msgstr "紧急停止" - #~ msgid "Load Average" #~ msgstr "平均负载" @@ -594,4 +727,4 @@ msgstr "mm/s^2" #~ msgstr "网络信息" #~ msgid "Screen Blanking Time" -#~ msgstr "屏幕关闭时间" +#~ msgstr "关闭屏幕" diff --git a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo new file mode 100644 index 000000000..8bba26866 Binary files /dev/null and b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po new file mode 100644 index 000000000..2a54fc9d7 --- /dev/null +++ b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po @@ -0,0 +1,690 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-31 11:25-0300\n" +"PO-Revision-Date: 2022-03-31 11:25-0300\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.0.1\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s 將更新到版本" + +msgid "(default)" +msgstr "(預設)" + +msgid "24 Hour Time" +msgstr "24 小時制" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "" + +msgid "Abort" +msgstr "中止" + +msgid "Accept" +msgstr "接受" + +msgid "Actions" +msgstr "動作" + +msgid "Add Printer" +msgstr "新增列印機" + +msgid "Add bed mesh profile" +msgstr "新增網床輪廓" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "您確定要運行緊急停止嗎?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "您確定要取消列印嗎?" + +msgid "Are you sure you wish to disable motors?" +msgstr "您確定要禁用電機嗎?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "您確定要重新啟動系統嗎?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "您確定要關閉系統嗎?" + +msgid "Auto" +msgstr "汽車" + +msgid "Auto-scroll" +msgstr "自動滾屏" + +msgid "Bed Level" +msgstr "熱床調平" + +msgid "Bed Mesh" +msgstr "網格床" + +msgid "Bltouch found applied offset" +msgstr "Bltouch 發現應用的偏移量" + +msgid "Calibrate" +msgstr "校正" + +msgid "Calibrated, save configuration to make it permanent" +msgstr "校準,保存配置以使其永久化" + +msgid "Can't set above the maximum:" +msgstr "不能設置超過最大值:" + +msgid "Cancel" +msgstr "取消" + +msgid "Cancel Print" +msgstr "取消列印" + +msgid "Cancelled" +msgstr "已取消" + +msgid "Cancelling" +msgstr "取消" + +msgid "Cannot connect to Moonraker" +msgstr "無法連接到 Moonraker" + +msgid "Channel" +msgstr "通道" + +msgid "" +"Check /tmp/KlipperScreen.log for more information.\n" +"Please submit an issue on GitHub for help." +msgstr "" +"檢查/tmp/KlipperScreen.log 日誌檔以了解更多訊息。\n" +"請在GitHub上提交問題以尋求幫助。" + +msgid "Close" +msgstr "關閉" + +msgid "Complete" +msgstr "完成" + +msgid "Configuration" +msgstr "配置" + +msgid "Confirm Emergency Stop" +msgstr "確認緊急停止" + +msgid "Connected" +msgstr "連接" + +#, python-format +msgid "Connecting to %s" +msgstr "連接到 %s" + +msgid "Console" +msgstr "控制台" + +msgid "Continue" +msgstr "繼續" + +msgid "Cooldown" +msgstr "冷卻" + +msgid "Date" +msgstr "日期" + +msgid "Decrease" +msgstr "減少" + +msgid "Delete" +msgstr "刪除" + +msgid "Deselect" +msgstr "取消選擇" + +msgid "Disable Motors" +msgstr "禁用步進電機" + +msgid "Disable XY" +msgstr "禁用 XY" + +msgid "Displayed Macros" +msgstr "顯示巨集" + +msgid "Distance (mm)" +msgstr "距離(mm)" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "您想恢復 %s 嗎?" + +msgid "Elapsed:" +msgstr "已耗時間:" + +msgid "Error" +msgstr "錯誤" + +msgid "Estimated Time Method" +msgstr "預估時間方法" + +msgid "Extrude" +msgstr "擠出機" + +msgid "Extrusion +" +msgstr "擠出 +" + +msgid "Extrusion -" +msgstr "擠出 -" + +msgid "Failed, adjust position first" +msgstr "失敗,先調整位置" + +msgid "Fan" +msgstr "風扇" + +msgid "Filament Used" +msgstr "已消耗的耗材" + +msgid "File" +msgstr "檔案" + +msgid "Fine Tuning" +msgstr "微調" + +msgid "Finish" +msgstr "完成" + +msgid "" +"Firmware\n" +"Restart" +msgstr "" +"Firmware\n" +"重新啟動" + +msgid "Font Size" +msgstr "字體大小" + +msgid "" +"Full\n" +"Update" +msgstr "" +"滿的\n" +"更新" + +msgid "Go Back" +msgstr "返回" + +msgid "Hidden" +msgstr "隱" + +msgid "Hide" +msgstr "隱藏" + +msgid "Hide sensors in Temp." +msgstr "在溫度中隱藏傳感器。" + +msgid "Home" +msgstr "首頁" + +msgid "Home All" +msgstr "歸零全部" + +msgid "Home X" +msgstr "歸零 X" + +msgid "Home XY" +msgstr "歸零 XY" + +msgid "Home Y" +msgstr "歸零 Y" + +msgid "Home Z" +msgstr "歸零 Z" + +msgid "Homing" +msgstr "歸零" + +msgid "Hostname" +msgstr "主機名稱" + +msgid "Icon Theme" +msgstr "圖標主題" + +msgid "Increase" +msgstr "增加" + +msgid "Initializing" +msgstr "初始化中" + +msgid "Initializing printer..." +msgstr "初始化列印機中.." + +msgid "Interface" +msgstr "介面" + +msgid "Invalid" +msgstr "無效的" + +msgid "Invert X" +msgstr "反轉 X" + +msgid "Invert Y" +msgstr "反轉 Y" + +msgid "Invert Z" +msgstr "反轉 Z" + +msgid "" +"Klipper\n" +"Restart" +msgstr "" +"Klipper\n" +"重新啟動" + +msgid "Klipper has disconnected" +msgstr "Klipper 已斷開連結" + +msgid "Klipper has encountered an error." +msgstr "Klipper遇到一個錯誤。" + +msgid "Klipper has shutdown" +msgstr "Klipper 已經關閉" + +msgid "Klipper is attempting to start" +msgstr "Klipper 正在嘗試重新啟動" + +msgid "Klipper will reboot" +msgstr "Klipper 將重新啟動" + +msgid "Language" +msgstr "語言" + +msgid "Large" +msgstr "大的" + +msgid "Left:" +msgstr "剩下時間:" + +msgid "Limits" +msgstr "限制" + +msgid "Load" +msgstr "載入" + +msgid "Lower Nozzle" +msgstr "降低噴嘴" + +msgid "Macro shortcut on sidebar" +msgstr "在側邊欄上顯示巨集快捷鍵" + +msgid "Macros" +msgstr "巨集" + +msgid "Main Menu" +msgstr "主選單" + +msgid "Max Accelation" +msgstr "最大加速度" + +msgid "Max Acceleration to Deceleration" +msgstr "最大加速到減速" + +msgid "Max Velocity" +msgstr "最大速度" + +msgid "Medium" +msgstr "中" + +msgid "Menu" +msgstr "選單" + +msgid "Modified" +msgstr "修改" + +msgid "Moonraker: connected" +msgstr "Moonraker:已連接" + +msgid "Move" +msgstr "移動" + +msgid "Move Distance (mm)" +msgstr "移動距離(mm)" + +msgid "Name" +msgstr "名稱" + +msgid "Network" +msgstr "網路" + +msgid "Nothing selected" +msgstr "未選擇任何內容" + +msgid "Off" +msgstr "關閉" + +#, python-format +msgid "Outdated by %d" +msgstr "已過時 %d" + +msgid "PSK for" +msgstr "PSK 用於" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "包將被更新" + +msgid "Password saved" +msgstr "密碼已保存" + +msgid "Pause" +msgstr "暫停" + +msgid "Paused" +msgstr "已暫停" + +msgid "Perform a full upgrade?" +msgstr "執行全面升級?" + +msgid "Please recompile and flash the micro-controller." +msgstr "請重新編譯並刷寫微控制器。" + +msgid "Power" +msgstr "電源" + +msgid "Power On Printer" +msgstr "啟動列印機" + +msgid "Print" +msgstr "列印" + +msgid "Print Control" +msgstr "列印控制" + +msgid "Print Time" +msgstr "列印時間" + +msgid "Printer Connections" +msgstr "連接列印機" + +msgid "Printing" +msgstr "列印中" + +msgid "Probe found applied offset" +msgstr "Probe 發現應用的偏移量" + +msgid "Profile Name:" +msgstr "配置檔案名稱:" + +msgid "Quad Gantry Level" +msgstr "龍門調平" + +msgid "Raise Nozzle" +msgstr "上升噴嘴" + +msgid "Recover Hard" +msgstr "恢復 Hard" + +msgid "Recover Soft" +msgstr "恢復 Soft" + +msgid "Reference" +msgstr "參考" + +msgid "Restart" +msgstr "重新啟動" + +msgid "Resume" +msgstr "恢復" + +msgid "Retract" +msgstr "回抽" + +#, python-format +msgid "Retry #%s" +msgstr "重試 #%s" + +msgid "Save" +msgstr "儲存" + +msgid "Save Config" +msgstr "儲存設定" + +msgid "Save configuration" +msgstr "儲存設定檔案" + +msgid "Screen DPMS" +msgstr "屏幕DPMS" + +msgid "Screen Power Off Time" +msgstr "螢幕關閉時間" + +msgid "Screws Adjust" +msgstr "Screws 調整" + +msgid "Select" +msgstr "選擇" + +msgid "Send" +msgstr "發送" + +#, python-format +msgid "Sending Power ON signal to: %s" +msgstr "正在發送通電信號到:%s" + +msgid "Set Temp" +msgstr "設定溫度" + +msgid "Settings" +msgstr "設定" + +msgid "Show" +msgstr "展示" + +msgid "Size" +msgstr "大小" + +msgid "Slicer" +msgstr "切片" + +msgid "Slicer Time correction (%)" +msgstr "切片器時間校正 (%)" + +msgid "Small" +msgstr "小的" + +msgid "Sort by: " +msgstr "排序: " + +msgid "Speed (mm/s)" +msgstr "速度(mm/s)" + +msgid "Speed +" +msgstr "速度 +" + +msgid "Speed -" +msgstr "速度 -" + +msgid "Square Corner Velocity" +msgstr "方角速度" + +msgid "Start" +msgstr "開始" + +msgid "Starting WiFi Association" +msgstr "啟動 WiFi 關聯" + +msgid "Starting recovery for" +msgstr "開始恢復" + +msgid "Starting update for" +msgstr "開始更新" + +msgid "System" +msgstr "系統" + +msgid "" +"System\n" +"Restart" +msgstr "系統重新啟動" + +msgid "" +"System\n" +"Shutdown" +msgstr "關閉系統" + +msgid "Temp (°C)" +msgstr "溫度(°C)" + +msgid "Temperature" +msgstr "溫度" + +#, python-format +msgid "To apply %s KlipperScreen needs to be restarted" +msgstr "要應用 %s,需要重新啟動 KlipperScreen" + +msgid "Tool" +msgstr "工具" + +msgid "Total:" +msgstr "全部的:" + +msgid "Unknown Heater" +msgstr "未知加熱器" + +msgid "Unload" +msgstr "卸載" + +msgid "Up To Date" +msgstr "最新" + +msgid "Update" +msgstr "更新" + +msgid "Updating" +msgstr "更新" + +msgid "Uploaded" +msgstr "上傳時間" + +msgid "View Mesh" +msgstr "檢視網格" + +msgid "X+" +msgstr "X+" + +msgid "X-" +msgstr "X-" + +msgid "XY Move Speed (mm/s)" +msgstr "XY 移動速度 (mm/s)" + +msgid "Y+" +msgstr "Y+" + +msgid "Y-" +msgstr "Y-" + +msgid "Z Calibrate" +msgstr "Z 校準" + +msgid "Z Move Speed (mm/s)" +msgstr "Z 移動速度 (mm/s)" + +msgid "Z Position" +msgstr "Z 位置" + +msgid "Z Tilt" +msgstr "Z 傾斜" + +msgid "Z+" +msgstr "Z+" + +msgid "Z-" +msgstr "Z-" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "改變" + +msgid "dBm" +msgstr "dBm" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "小時" + +msgid "minutes" +msgstr "分鐘" + +msgid "mm" +msgstr "mm" + +msgid "mm/s" +msgstr "mm/s" + +msgid "mm/s^2" +msgstr "mm/s^2" + +#~ msgid "IPv4" +#~ msgstr "IPv4" + +#~ msgid "IPv6" +#~ msgstr "IPv6" + +#~ msgid "Z Offset" +#~ msgstr "Z 間隙" + +#~ msgid "Unknown Heater " +#~ msgstr "未知加熱器 " + +#~ msgid "Disconnect" +#~ msgstr "斷開" + +#~ msgid "Duration Only" +#~ msgstr "僅持續時間" + +#~ msgid "Klipper Version" +#~ msgstr "Klipper 版本" + +#~ msgid "" +#~ "Klipper has encountered an error with the micro-controller.\n" +#~ "Please recompile and flash." +#~ msgstr "" +#~ "Klipper遇到微控制器錯誤。\n" +#~ "請重新編譯並刷新。" + +#~ msgid "" +#~ "Klipper has encountered an error.\n" +#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." +#~ msgstr "" +#~ "Klipper遇到錯誤。\n" +#~ "發出 FIRMWARE_RESTART 嘗試解決這個問題。" + +#~ msgid "KlipperScreen Version" +#~ msgstr "KlipperScreen 版本" + +#~ msgid "Show Only Heaters in Temp." +#~ msgstr "僅顯示溫度下的加熱器" + +#~ msgid "Target" +#~ msgstr "目標溫度" + +#~ msgid "Temp" +#~ msgstr "目前溫度" + +#~ msgid "Number Pad" +#~ msgstr "數字鍵盤" + +#~ msgid "Preheat" +#~ msgstr "預熱" + +#~ msgid "Screen will show in less than one second" +#~ msgstr "螢幕將在1秒內顯示" diff --git a/ks_includes/printer.py b/ks_includes/printer.py index 23c21d1cb..ef9008650 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -3,7 +3,6 @@ gi.require_version("Gtk", "3.0") from gi.repository import Gdk, GLib -from ks_includes.KlippyGcodes import KlippyGcodes class Printer: @@ -20,21 +19,49 @@ class Printer: "shutdown": None } tools = [] + toolcount = 0 + extrudercount = 0 + tempdevcount = 0 + fancount = 0 def __init__(self, printer_info, data, state_execute_cb): self.state = "disconnected" self.state_cb = state_execute_cb self.power_devices = {} + self.store_timeout = False + + def reset(self): + self.state = None + self.state_cb = None + self.data = None + self.devices = None + self.power_devices = None + self.state_callbacks = None + self.tools = None + self.toolcount = None + self.extrudercount = None + self.tempdevcount = None + self.fancount = None + GLib.source_remove(self.store_timeout) + self.store_timeout = None + self.config = None + self.klipper = None + self.tempstore = None def reinit(self, printer_info, data): logging.debug("Moonraker object status: %s" % data) self.config = data['configfile']['config'] self.toolcount = 0 self.extrudercount = 0 + self.tempdevcount = 0 + self.fancount = 0 self.tools = [] self.devices = {} self.data = data self.klipper = {} + self.tempstore = {} + if self.store_timeout is False: + self.store_timeout = GLib.timeout_add_seconds(1, self._update_temp_store) self.klipper = { "version": printer_info['software_version'] @@ -55,11 +82,16 @@ def reinit(self, printer_info, data): if "shared_heater" in self.config[x]: continue self.extrudercount += 1 - if x == 'heater_bed' or x.startswith('heater_generic ') or x.startswith('temperature_sensor '): + if x == 'heater_bed' or x.startswith('heater_generic ') or x.startswith('temperature_sensor ') \ + or x.startswith('temperature_fan '): self.devices[x] = { "temperature": 0, "target": 0 } + self.tempdevcount += 1 + if x == 'fan' or x.startswith('controller_fan ') or x.startswith('heater_fan ') \ + or x.startswith('fan_generic '): + self.fancount += 1 if x.startswith('bed_mesh '): r = self.config[x] r['x_count'] = int(r['x_count']) @@ -72,7 +104,10 @@ def reinit(self, printer_info, data): self.process_update(data) logging.info("Klipper version: %s", self.klipper['version']) - logging.info("### Toolcount: " + str(self.toolcount) + " Heaters: " + str(self.extrudercount)) + logging.info("# Toolcount: %s", str(self.toolcount)) + logging.info("# Extruders: %s", str(self.extrudercount)) + logging.info("# Temperature devices: %s", str(self.tempdevcount)) + logging.info("# Fans: %s", str(self.fancount)) def process_update(self, data): keys = [ @@ -85,10 +120,12 @@ def process_update(self, data): 'print_stats', 'toolhead', 'virtual_sdcard', - 'webhooks' + 'webhooks', + 'fimware_retraction', + 'motion_report' ] - for x in (self.get_tools() + self.get_heaters()): + for x in (self.get_tools() + self.get_heaters() + self.get_filament_sensors()): if x in data: for i in data[x]: self.set_dev_stat(x, i, data[x][i]) @@ -100,7 +137,7 @@ def process_update(self, data): self.data[x] = {} self.data[x].update(data[x]) - if "webhooks" in data or "idle_timeout" in data or "print_stats" in data: + if "webhooks" in data or "idle_timeout" in data or "print_stats" in data or "pause_resume" in data: self.evaluate_state() def get_updates(self): @@ -110,20 +147,24 @@ def get_updates(self): def evaluate_state(self): wh_state = self.data['webhooks']['state'].lower() # possible values: startup, ready, shutdown, error - idle_state = self.data['idle_timeout']['state'].lower() # possible values: Idle, printing, ready - print_state = self.data['print_stats']['state'].lower() # possible values: complete, paused, printing, standby if wh_state == "ready": new_state = "ready" - if print_state == "paused": + if self.data['pause_resume']['is_paused']: new_state = "paused" - elif idle_state == "printing": - if print_state == "complete": - new_state = "ready" - elif print_state != "printing": # Not printing a file, toolhead moving - new_state = "busy" - else: - new_state = "printing" + elif self.data['print_stats']: + print_state = self.data['print_stats']['state'].lower() # complete, error, paused, printing, standby + if print_state == "paused": + new_state = "paused" + if self.data['idle_timeout']: + idle_state = self.data['idle_timeout']['state'].lower() # idle, printing, ready + if idle_state == "printing": + if print_state == "complete": + new_state = "ready" + elif print_state != "printing": # Not printing a file, toolhead moving + new_state = "busy" + else: + new_state = "printing" if new_state != "busy": self.change_state(new_state) @@ -160,9 +201,6 @@ def configure_power_devices(self, data): } logging.debug("Power devices: %s" % self.power_devices) - def config_section_exists(self, section): - return section in list(self.config) - def get_config_section_list(self, search=""): if not hasattr(self, "config"): return [] @@ -173,17 +211,14 @@ def get_config_section(self, section): return self.config[section] return False - def get_config_section(self, section): - if section not in self.config: - return False - return self.config[section] - def get_data(self): return self.data def get_fans(self): - fans = ["fan"] if len(self.get_config_section_list("fan")) > 0 else [] - fan_types = ["controller_fan", "fan_generic", "heater_fan", "temperature_fan"] + fans = [] + if self.config_section_exists("fan"): + fans.append("fan") + fan_types = ["controller_fan", "fan_generic", "heater_fan"] for type in fan_types: for f in self.get_config_section_list("%s " % type): fans.append(f) @@ -200,21 +235,44 @@ def get_heaters(self): heaters.append(h) for h in self.get_config_section_list("temperature_sensor "): heaters.append(h) + for h in self.get_config_section_list("temperature_fan "): + heaters.append(h) return heaters + def get_filament_sensors(self): + sensors = [] + for s in self.get_config_section_list("filament_switch_sensor "): + sensors.append(s) + for s in self.get_config_section_list("filament_motion_sensor "): + sensors.append(s) + return sensors + def get_printer_status_data(self): data = { "printer": { - "bltouch": self.section_exists("bltouch"), + "extruders": { + "count": self.extrudercount + }, + "temperature_devices": { + "count": self.tempdevcount + }, + "fans": { + "count": self.fancount + }, + "bltouch": self.config_section_exists("bltouch"), "gcode_macros": { "count": len(self.get_gcode_macros()) }, "idle_timeout": self.get_stat("idle_timeout").copy(), - "pause_resume": self.get_stat("pause_resume").copy(), + "pause_resume": { + "is_paused": True if self.state == "paused" else False + }, "power_devices": { "count": len(self.get_power_devices()) }, - "probe": self.section_exists("probe") + "probe": self.config_section_exists("probe"), + "firmware_retraction": self.config_section_exists("firmware_retraction"), + "input_shaper": self.config_section_exists("input_shaper") } } @@ -264,9 +322,53 @@ def get_dev_stat(self, dev, stat): return self.devices[dev][stat] return None + def get_fan_speed(self, fan="fan", speed=None): + if fan not in self.config or fan not in self.data: + logging.debug("Error getting %s config", fan) + return speed if speed is not None else 0 + if speed is None and "speed" in self.data[fan]: + speed = self.data[fan]["speed"] + if 'max_power' in self.config[fan]: + max_power = float(self.config[fan]['max_power']) + if max_power > 0: + speed = speed / max_power + if 'off_below' in self.config[fan]: + off_below = float(self.config[fan]['off_below']) + if speed < off_below: + speed = 0 + return speed + def get_extruder_count(self): return self.extrudercount + def get_temp_store_devices(self): + if self.tempstore is not None: + return list(self.tempstore) + + def get_temp_store_device_has_target(self, device): + if device in self.tempstore: + if "targets" in self.tempstore[device]: + return True + return False + + def get_temp_store(self, device, section=False, results=0): + if device not in self.tempstore: + return False + + if section is not False: + if section not in self.tempstore[device]: + return False + if results == 0 or results >= len(self.tempstore[device][section]): + return self.tempstore[device][section] + return self.tempstore[device][section][-results:] + + temp = {} + for section in self.tempstore[device]: + if results == 0 or results >= len(self.tempstore[device][section]): + temp[section] = self.tempstore[device][section] + temp[section] = self.tempstore[device][section][-results:] + return temp + def get_tools(self): return self.tools @@ -277,7 +379,16 @@ def has_heated_bed(self): if "heater_bed" in self.devices: return True - def section_exists(self, section): + def init_temp_store(self, result): + for dev in result: + self.tempstore[dev] = {} + if "targets" in result[dev]: + self.tempstore[dev]["targets"] = result[dev]["targets"] + if "temperatures" in result[dev]: + self.tempstore[dev]["temperatures"] = result[dev]["temperatures"] + logging.info("Temp store: %s" % list(self.tempstore)) + + def config_section_exists(self, section): if section in self.get_config_section_list(): return True return False @@ -292,3 +403,14 @@ def set_dev_stat(self, dev, stat, value): return self.devices[dev][stat] = value + + def _update_temp_store(self): + for device in self.tempstore: + for x in self.tempstore[device]: + if len(self.tempstore[device][x]) >= 1200: + self.tempstore[device][x].pop(0) + temp = self.get_dev_stat(device, x[:-1]) + if temp is None: + temp = 0 + self.tempstore[device][x].append(round(temp, 2)) + return True diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index 579cee9fd..70517b0ca 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -2,12 +2,11 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib -from jinja2 import Environment, Template +from gi.repository import Gtk -from ks_includes.KlippyGtk import KlippyGtk from ks_includes.KlippyGcodes import KlippyGcodes + class ScreenPanel: def __init__(self, screen, title, back=True, action_bar=True, printer_name=True): @@ -20,11 +19,12 @@ def __init__(self, screen, title, back=True, action_bar=True, printer_name=True) self._gtk = screen.gtk self.control = {} self.title = title + self.devices = {} + self.active_heaters = [] self.layout = Gtk.Layout() self.layout.set_size(self._screen.width, self._screen.height) - action_bar_width = self._gtk.get_action_bar_width() if action_bar is True else 0 self.content = Gtk.Box(spacing=0) def initialize(self, panel_name): @@ -35,28 +35,41 @@ def emergency_stop(self, widget): _ = self.lang.gettext if self._config.get_main_config_option('confirm_estop') == "True": - self._screen._confirm_send_action(widget, _("Вы точно хотите экстренно остановить принтер?"), + self._screen._confirm_send_action(widget, _("Are you sure you want to run Emergency Stop?"), "printer.emergency_stop") else: self._screen._ws.klippy.emergency_stop() + def format_target(self, temp): + if temp <= 0: + return "" + else: + return "(%s)" % str(int(temp)) + + def format_temp(self, temp, places=1): + if places == 0: + n = int(temp) + else: + n = round(temp, places) + return "%s°C" % str(n) + def get(self): return self.layout def get_content(self): return self.content - def get_file_image(self, filename, width=1.6, height=1.6): + def get_file_image(self, filename, width=1, height=1, small=False): if not self._files.has_thumbnail(filename): return None - loc = self._files.get_thumbnail_location(filename) + loc = self._files.get_thumbnail_location(filename, small) if loc is None: return None if loc[0] == "file": - return self._gtk.PixbufFromFile(loc[1], None, width, height) + return self._gtk.PixbufFromFile(loc[1], width, height) if loc[0] == "http": - return self._gtk.PixbufFromHttp(loc[1], None, width, height) + return self._gtk.PixbufFromHttp(loc[1], width, height) return None def get_title(self): @@ -65,6 +78,15 @@ def get_title(self): def home(self, widget): self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME) + def homexy(self, widget): + self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME_XY) + + def z_tilt(self, widget): + self._screen._ws.klippy.gcode_script(KlippyGcodes.Z_TILT) + + def quad_gantry_level(self, widget): + self._screen._ws.klippy.gcode_script(KlippyGcodes.QUAD_GANTRY_LEVEL) + def menu_item_clicked(self, widget, panel, item): print("### Creating panel " + item['panel'] + " : %s %s" % (panel, item)) if "items" in item: @@ -96,3 +118,52 @@ def update_temp(self, dev, temp, target, name=None): self.labels[dev].set_label(self._gtk.formatTemperatureString(temp, target)) else: self.labels[dev].set_label("%s\n%s" % (name, self._gtk.formatTemperatureString(temp, target))) + + def load_menu(self, widget, name): + if ("%s_menu" % name) not in self.labels: + return + + for child in self.content.get_children(): + self.content.remove(child) + + self.menu.append('%s_menu' % name) + self.content.add(self.labels[self.menu[-1]]) + self.content.show_all() + + def unload_menu(self, widget=None): + logging.debug("self.menu: %s" % self.menu) + if len(self.menu) <= 1 or self.menu[-2] not in self.labels: + return + + self.menu.pop() + for child in self.content.get_children(): + self.content.remove(child) + self.content.add(self.labels[self.menu[-1]]) + self.content.show_all() + + def on_dropdown_change(self, combo, section, option, callback=None): + tree_iter = combo.get_active_iter() + if tree_iter is not None: + model = combo.get_model() + value = model[tree_iter][1] + logging.debug("[%s] %s changed to %s" % (section, option, value)) + self._config.set(section, option, value) + self._config.save_user_config_options() + if callback is not None: + callback(value) + + def scale_moved(self, widget, event, section, option): + logging.debug("[%s] %s changed to %s" % (section, option, widget.get_value())) + if section not in self._config.get_config().sections(): + self._config.get_config().add_section(section) + self._config.set(section, option, str(int(widget.get_value()))) + self._config.save_user_config_options() + + def switch_config_option(self, switch, gparam, section, option, callback=None): + logging.debug("[%s] %s toggled %s" % (section, option, switch.get_active())) + if section not in self._config.get_config().sections(): + self._config.get_config().add_section(section) + self._config.set(section, option, "True" if switch.get_active() else "False") + self._config.save_user_config_options() + if callback is not None: + callback(switch.get_active()) diff --git a/ks_includes/widgets/graph.py b/ks_includes/widgets/graph.py new file mode 100644 index 000000000..ffadc3f3d --- /dev/null +++ b/ks_includes/widgets/graph.py @@ -0,0 +1,199 @@ +import datetime +import gi +import logging +import math + +gi.require_version("Gtk", "3.0") +from gi.repository import Gdk, Gtk + + +class HeaterGraph(Gtk.DrawingArea): + def __init__(self, printer, font_size): + super().__init__() + self.set_hexpand(True) + self.set_vexpand(True) + self.get_style_context().add_class('heatergraph') + self.printer = printer + self.store = {} + self.max_length = 0 + self.connect('draw', self.draw_graph) + self.add_events(Gdk.EventMask.TOUCH_MASK) + self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.connect('touch-event', self.event_cb) + self.connect('button_press_event', self.event_cb) + self.font_size = round(font_size * 0.75) + + def add_object(self, name, type, rgb=[0, 0, 0], dashed=False, fill=False): + if name not in self.store: + self.store.update({name: {"show": True}}) + self.store[name].update({type: { + "dashed": dashed, + "fill": fill, + "rgb": rgb + }}) + self.max_length = max(self.max_length, len(self.printer.get_temp_store(name, type))) + + def event_cb(self, da, ev): + if ev.type == Gdk.EventType.BUTTON_PRESS: + x = ev.x + y = ev.y + logging.info("Graph area: %s %s" % (x, y)) + + def get_max_length(self): + n = [] + for name in self.store: + if "temperatures" not in self.store[name]: + continue + n.append(len(self.printer.get_temp_store(name, "temperatures"))) + return min(n) + + def get_max_num(self, data_points=0): + mnum = [] + for x in self.store: + for t in self.store[x]: + if t == "show": + continue + mnum.append(max(self.printer.get_temp_store(x, t, data_points))) + return max(mnum) + + def draw_graph(self, da, ctx): + width = da.get_allocated_width() + height = da.get_allocated_height() + + g_width_start = round(self.font_size * 2.75) + g_width = width - 15 + g_height_start = 10 + g_height = height - self.font_size * 2 + + ctx.set_source_rgb(.5, .5, .5) + ctx.set_line_width(1) + ctx.set_tolerance(0.1) + + ctx.move_to(g_width_start, g_height_start) + ctx.line_to(g_width, g_height_start) + ctx.line_to(g_width, g_height) + ctx.line_to(g_width_start, g_height) + ctx.line_to(g_width_start, g_height_start) + ctx.stroke() + + ctx.set_source_rgb(1, 0, 0) + ctx.move_to(g_width_start, height) + + gsize = [ + [g_width_start, g_height_start], + [g_width, g_height] + ] + + self.max_length = self.get_max_length() + graph_width = gsize[1][0] - gsize[0][0] + points_per_pixel = self.max_length / graph_width + data_points = int(round(graph_width * points_per_pixel, 0)) + max_num = math.ceil(self.get_max_num(data_points) * 1.1 / 10) * 10 + d_width = 1 / points_per_pixel + + d_height_scale = self.graph_lines(ctx, gsize, max_num) + self.graph_time(ctx, gsize, points_per_pixel) + + for name in self.store: + if not self.store[name]['show']: + continue + for type in self.store[name]: + d = self.printer.get_temp_store(name, type, data_points) + if d is False: + continue + self.graph_data(ctx, d, gsize, d_height_scale, d_width, self.store[name][type]["rgb"], + self.store[name][type]["dashed"], self.store[name][type]["fill"]) + + def graph_data(self, ctx, data, gsize, hscale, swidth, rgb, dashed=False, fill=False): + i = 0 + ctx.set_source_rgba(rgb[0], rgb[1], rgb[2], 1) + ctx.move_to(gsize[0][0] + 1, gsize[0][1] - 1) + if dashed: + ctx.set_dash([10, 5]) + else: + ctx.set_dash([1, 0]) + d_len = len(data) - 1 + for d in data: + p_x = i * swidth + gsize[0][0] if i != d_len else gsize[1][0] - 1 + p_y = gsize[1][1] - 1 - (d * hscale) + if i == 0: + ctx.move_to(gsize[0][0] + 1, p_y) + i += 1 + continue + ctx.line_to(p_x, p_y) + i += 1 + if fill is False: + ctx.stroke() + return + + ctx.stroke_preserve() + ctx.line_to(gsize[1][0] - 1, gsize[1][1] - 1) + ctx.line_to(gsize[0][0] + 1, gsize[1][1] - 1) + if fill: + ctx.set_source_rgba(rgb[0], rgb[1], rgb[2], .1) + ctx.fill() + + def graph_lines(self, ctx, gsize, max_num): + nscale = 10 + while (max_num / nscale) > 5: + nscale += 10 + # nscale = math.floor((max_num / 10) / 4) * 10 + r = int(max_num / nscale) + 1 + hscale = (gsize[1][1] - gsize[0][1]) / (r * nscale) + + for i in range(r): + ctx.set_source_rgb(.5, .5, .5) + lheight = gsize[1][1] - nscale * i * hscale + ctx.move_to(6, lheight + 3) + ctx.set_font_size(self.font_size) + ctx.show_text(str(nscale * i).rjust(3, " ")) + ctx.stroke() + ctx.set_source_rgba(.5, .5, .5, .2) + ctx.move_to(gsize[0][0], lheight) + ctx.line_to(gsize[1][0], lheight) + ctx.stroke() + return hscale + + def graph_time(self, ctx, gsize, points_per_pixel): + + now = datetime.datetime.now() + first = gsize[1][0] - (now.second + ((now.minute % 2) * 60)) / points_per_pixel + steplen = 120 / points_per_pixel # For 120s + + i = 0 + while True: + x = first - i * steplen + if x < gsize[0][0]: + break + ctx.set_source_rgba(.5, .5, .5, .2) + ctx.move_to(x, gsize[0][1]) + ctx.line_to(x, gsize[1][1]) + ctx.stroke() + + ctx.set_source_rgb(.5, .5, .5) + ctx.move_to(x - round(self.font_size * 1.5), gsize[1][1] + round(self.font_size * 1.5)) + + hour = now.hour + min = now.minute - (now.minute % 2) - i * 2 + if min < 0: + hour -= 1 + min = 60 + min + if hour < 0: + hour += 24 + ctx.set_font_size(self.font_size) + ctx.show_text("%02d:%02d" % (hour, min)) + ctx.stroke() + if self.max_length < 600: + i += 1 + else: + i += 2 + + def is_showing(self, device): + if device not in self.store: + return False + return self.store[device]['show'] + + def set_showing(self, device, show=True): + if device not in self.store: + return + self.store[device]['show'] = show diff --git a/ks_includes/widgets/keypad.py b/ks_includes/widgets/keypad.py new file mode 100644 index 000000000..267c68136 --- /dev/null +++ b/ks_includes/widgets/keypad.py @@ -0,0 +1,79 @@ +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk + + +class Keypad(Gtk.Box): + def __init__(self, screen, change_temp, close_function): + super().__init__(orientation=Gtk.Orientation.VERTICAL) + + _ = screen.lang.gettext + self.labels = {} + self.change_temp = change_temp + self.screen = screen + self._gtk = screen.gtk + + numpad = self._gtk.HomogeneousGrid() + numpad.set_direction(Gtk.TextDirection.LTR) + + keys = [ + ['1', 'numpad_tleft'], + ['2', 'numpad_top'], + ['3', 'numpad_tright'], + ['4', 'numpad_left'], + ['5', 'numpad_button'], + ['6', 'numpad_right'], + ['7', 'numpad_left'], + ['8', 'numpad_button'], + ['9', 'numpad_right'], + ['B', 'numpad_bleft'], + ['0', 'numpad_bottom'], + ['E', 'numpad_bright'] + ] + for i in range(len(keys)): + id = 'button_' + str(keys[i][0]) + if keys[i][0] == "B": + self.labels[id] = self._gtk.ButtonImage("backspace", None, None, 1) + elif keys[i][0] == "E": + self.labels[id] = self._gtk.ButtonImage("complete", None, None, 1) + else: + self.labels[id] = Gtk.Button(keys[i][0]) + self.labels[id].connect('clicked', self.update_entry, keys[i][0]) + self.labels[id].get_style_context().add_class(keys[i][1]) + numpad.attach(self.labels[id], i % 3, i/3, 1, 1) + + self.labels["keypad"] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + self.labels['entry'] = Gtk.Entry() + self.labels['entry'].props.xalign = 0.5 + self.labels['entry'].connect("activate", self.update_entry, "E") + + b = self._gtk.ButtonImage('cancel', _('Close'), None, 1) + b.connect("clicked", close_function) + + self.add(self.labels['entry']) + self.add(numpad) + self.add(b) + + self.labels["keypad"] = numpad + + def clear(self): + self.labels['entry'].set_text("") + + def update_entry(self, widget, digit): + text = self.labels['entry'].get_text() + if digit == 'B': + if len(text) < 1: + return + self.labels['entry'].set_text(text[0:-1]) + elif digit == 'E': + try: + temp = int(text) + except ValueError: + temp = 0 + self.change_temp(temp) + self.labels['entry'].set_text("") + else: + if len(text) >= 3: + return + self.labels['entry'].set_text(text + digit) diff --git a/ks_includes/wifi.py b/ks_includes/wifi.py index d49dc13a6..c63460a62 100644 --- a/ks_includes/wifi.py +++ b/ks_includes/wifi.py @@ -1,27 +1,20 @@ import os -import signal -import json import logging import re import socket -import subprocess import threading -import time -from contextlib import suppress from threading import Thread -from subprocess import PIPE, Popen, STDOUT -from queue import Queue, Empty +from queue import Queue import gi + gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import GLib, Gdk -RESCAN_INTERVAL = 180 -KS_SOCKET_FILE = "/tmp/.KS_wpa_supplicant" -class WifiManager(): +class WifiManager: networks_in_supplicant = [] connected = False _stop_loop = False @@ -51,6 +44,7 @@ def __init__(self, interface, *args, **kwargs): self.timeout = None self.scan_time = 0 + KS_SOCKET_FILE = "/tmp/.KS_wpa_supplicant" if os.path.exists(KS_SOCKET_FILE): os.remove(KS_SOCKET_FILE) @@ -58,8 +52,9 @@ def __init__(self, interface, *args, **kwargs): self.soc = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) self.soc.bind(KS_SOCKET_FILE) self.soc.connect("/var/run/wpa_supplicant/%s" % interface) - except Exception: - logging.info("Error connecting to wifi socket: %s" % interface) + except Exception as e: + logging.critical(e, exc_info=True) + logging.error("Error connecting to wifi socket: %s" % interface) return self.wpa_thread = WpaSocket(self, self.queue, self.callback) @@ -69,7 +64,7 @@ def __init__(self, interface, *args, **kwargs): self.wpa_cli("ATTACH", False) self.wpa_cli("SCAN", False) GLib.idle_add(self.read_wpa_supplicant) - self.timeout = GLib.timeout_add_seconds(RESCAN_INTERVAL, self.rescan) + self.timeout = GLib.timeout_add_seconds(180, self.rescan) def add_callback(self, name, callback): if name in self._callbacks and callback not in self._callbacks[name]: @@ -84,7 +79,7 @@ def add_network(self, ssid, psk): # TODO: Add wpa_cli error checking network_id = self.wpa_cli("ADD_NETWORK") commands = [ - 'ENABLE_NETWORK %s' % (network_id), + 'ENABLE_NETWORK %s' % network_id, 'SET_NETWORK %s ssid "%s"' % (network_id, ssid.replace('"', '\"')), 'SET_NETWORK %s psk "%s"' % (network_id, psk.replace('"', '\"')) ] @@ -151,14 +146,31 @@ def get_connected_ssid(self): return self.connected_ssid def get_current_wifi(self, interface="wlan0"): + con_ssid = os.popen("sudo iwgetid -r").read().strip() + con_bssid = os.popen("sudo iwgetid -r -a").read().strip() + # wpa_cli status output is unstable use it as backup only status = self.wpa_cli("STATUS").split('\n') vars = {} for line in status: arr = line.split('=') vars[arr[0]] = "=".join(arr[1:]) - prev_ssid = self.connected_ssid - if "ssid" in vars and "bssid" in vars: + + if con_ssid != "": + self.connected = True + self.connected_ssid = con_ssid + for ssid, val in self.networks.items(): + if ssid == con_ssid: + self.networks[ssid]['connected'] = True + else: + self.networks[ssid]['connected'] = False + if prev_ssid != self.connected_ssid: + for cb in self._callbacks['connected']: + Gdk.threads_add_idle( + GLib.PRIORITY_DEFAULT_IDLE, + cb, self.connected_ssid, prev_ssid) + return [con_ssid, con_bssid] + elif "ssid" in vars and "bssid" in vars: self.connected = True self.connected_ssid = vars['ssid'] for ssid, val in self.networks.items(): @@ -315,7 +327,8 @@ def run(self): while self._stop_loop is False: try: msg = self.soc.recv(4096).decode().strip() - except Exception: + except Exception as e: + logging.critical(e, exc_info=True) # TODO: Socket error continue if msg.startswith("<"): @@ -354,117 +367,117 @@ class WifiChannels: @staticmethod def lookup(freq): if freq == "2412": - return ("2.4", "1") + return "2.4", "1" if freq == "2417": - return ("2.4", "2") + return "2.4", "2" if freq == "2422": - return ("2.4", "3") + return "2.4", "3" if freq == "2427": - return ("2.4", "4") + return "2.4", "4" if freq == "2432": - return ("2.4", "5") + return "2.4", "5" if freq == "2437": - return ("2.4", "6") + return "2.4", "6" if freq == "2442": - return ("2.4", "7") + return "2.4", "7" if freq == "2447": - return ("2.4", "8") + return "2.4", "8" if freq == "2452": - return ("2.4", "9") + return "2.4", "9" if freq == "2457": - return ("2.4", "10") + return "2.4", "10" if freq == "2462": - return ("2.4", "11") + return "2.4", "11" if freq == "2467": - return ("2.4", "12") + return "2.4", "12" if freq == "2472": - return ("2.4", "13") + return "2.4", "13" if freq == "2484": - return ("2.4", "14") + return "2.4", "14" if freq == "5035": - return ("5", "7") + return "5", "7" if freq == "5040": - return ("5", "8") + return "5", "8" if freq == "5045": - return ("5", "9") + return "5", "9" if freq == "5055": - return ("5", "11") + return "5", "11" if freq == "5060": - return ("5", "12") + return "5", "12" if freq == "5080": - return ("5", "16") + return "5", "16" if freq == "5170": - return ("5", "34") + return "5", "34" if freq == "5180": - return ("5", "36") + return "5", "36" if freq == "5190": - return ("5", "38") + return "5", "38" if freq == "5200": - return ("5", "40") + return "5", "40" if freq == "5210": - return ("5", "42") + return "5", "42" if freq == "5220": - return ("5", "44") + return "5", "44" if freq == "5230": - return ("5", "46") + return "5", "46" if freq == "5240": - return ("5", "48") + return "5", "48" if freq == "5260": - return ("5", "52") + return "5", "52" if freq == "5280": - return ("5", "56") + return "5", "56" if freq == "5300": - return ("5", "60") + return "5", "60" if freq == "5320": - return ("5", "64") + return "5", "64" if freq == "5500": - return ("5", "100") + return "5", "100" if freq == "5520": - return ("5", "104") + return "5", "104" if freq == "5540": - return ("5", "108") + return "5", "108" if freq == "5560": - return ("5", "112") + return "5", "112" if freq == "5580": - return ("5", "116") + return "5", "116" if freq == "5600": - return ("5", "120") + return "5", "120" if freq == "5620": - return ("5", "124") + return "5", "124" if freq == "5640": - return ("5", "128") + return "5", "128" if freq == "5660": - return ("5", "132") + return "5", "132" if freq == "5680": - return ("5", "136") + return "5", "136" if freq == "5700": - return ("5", "140") + return "5", "140" if freq == "5720": - return ("5", "144") + return "5", "144" if freq == "5745": - return ("5", "149") + return "5", "149" if freq == "5765": - return ("5", "153") + return "5", "153" if freq == "5785": - return ("5", "157") + return "5", "157" if freq == "5805": - return ("5", "161") + return "5", "161" if freq == "5825": - return ("5", "165") + return "5", "165" if freq == "4915": - return ("5", "183") + return "5", "183" if freq == "4920": - return ("5", "184") + return "5", "184" if freq == "4925": - return ("5", "185") + return "5", "185" if freq == "4935": - return ("5", "187") + return "5", "187" if freq == "4940": - return ("5", "188") + return "5", "188" if freq == "4945": - return ("5", "189") + return "5", "189" if freq == "4960": - return ("5", "192") + return "5", "192" if freq == "4980": - return ("5", "196") + return "5", "196" return None diff --git a/mkdocs.yml b/mkdocs.yml index f60567c12..dadf513aa 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,14 +1,57 @@ site_name: KlipperScreen +site_url: https://klipperscreen.readthedocs.io +site_description: >- + KlipperScreen documentation. + +repo_name: jordanruthe/KlipperScreen/ +repo_url: https://github.com/jordanruthe/KlipperScreen/ nav: - - Hardware.md - - Installation.md - - Configuration.md - - Theming.md + - Home: index.md + - Setup: + - Hardware.md + - Installation.md + - Configuration.md + - Quicktips.md + - Macros: macros.md - Troubleshooting.md - - changelog.md - - panels.md + - Theming.md + - Translations.md + - Breaking Changes: Changelog.md + - Screenshots: Panels.md - Contact.md -theme: readthedocs -repo_url: https://github.com/jordanruthe/KlipperScreen/ +theme: + name: material + language: en + features: + - content.code.annotate + - content.tooltips + - navigation.indexes + - navigation.sections + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + palette: + - scheme: slate + primary: deep purple + plugins: - search + +markdown_extensions: + - admonition + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/jordanruthe/klipperScreen/ + - icon: fontawesome/brands/discord + link: https://discord.klipper3d.org/ + - icon: fontawesome/brands/python diff --git a/panels/base_panel.py b/panels/base_panel.py index 08647c4d3..72bf34c78 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -4,13 +4,12 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib -from jinja2 import Environment, Template +from gi.repository import GLib, Gtk, Pango +from jinja2 import Environment -from ks_includes.KlippyGtk import KlippyGtk -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + class BasePanel(ScreenPanel): def __init__(self, screen, title, back=True, action_bar=True, printer_name=True): super().__init__(screen, title, back, action_bar, printer_name) @@ -18,7 +17,8 @@ def __init__(self, screen, title, back=True, action_bar=True, printer_name=True) self.time_min = -1 self.time_format = self._config.get_main_config_option("24htime") self.title_spacing = self._gtk.font_size * 2 - + self.time_update = None + self.titlebar_name_type = None self.buttons_showing = { 'back': False if back else True, 'macros_shortcut': False, @@ -29,33 +29,37 @@ def __init__(self, screen, title, back=True, action_bar=True, printer_name=True) self.layout.set_size(self._screen.width, self._screen.height) action_bar_width = self._gtk.get_action_bar_width() if action_bar is True else 0 + action_bar_height = self._gtk.get_action_bar_height() if action_bar is True else 0 self.control_grid = self._gtk.HomogeneousGrid() - self.control_grid.set_size_request(action_bar_width - 2, self._screen.height) + self.control_grid.set_size_request(action_bar_width, action_bar_height) self.control_grid.get_style_context().add_class('action_bar') - button_scale = self._gtk.get_header_image_scale() - logging.debug("Button scale: %s" % button_scale) - - self.control['back'] = self._gtk.ButtonImage('back', None, None, button_scale[0], button_scale[1]) + self.control['back'] = self._gtk.ButtonImage('back', None, None, 1) self.control['back'].connect("clicked", self.back) - self.control['home'] = self._gtk.ButtonImage('main', None, None, button_scale[0], button_scale[1]) + self.control['home'] = self._gtk.ButtonImage('main', None, None, 1) self.control['home'].connect("clicked", self.menu_return, True) if len(self._config.get_printers()) > 1: - self.control['printer_select'] = self._gtk.ButtonImage( - 'shuffle', None, None, button_scale[0], button_scale[1]) + self.control['printer_select'] = self._gtk.ButtonImage('shuffle', None, None, 1) self.control['printer_select'].connect("clicked", self._screen.show_printer_select) - self.control['macro_shortcut'] = self._gtk.ButtonImage( - 'custom-script', None, None, button_scale[0], button_scale[1]) + self.control['macro_shortcut'] = self._gtk.ButtonImage('custom-script', None, None, 1) self.control['macro_shortcut'].connect("clicked", self.menu_item_clicked, "gcode_macros", { "name": "Macros", "panel": "gcode_macros" }) - self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, button_scale[0], button_scale[1]) + self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, 1) self.control['estop'].connect("clicked", self.emergency_stop) + _ = self.lang.gettext + self.control['shutdown'] = self._gtk.ButtonImage('shutdown', None, None, 1) + self.control['shutdown'].connect ( "clicked", self._screen._confirm_test, _("Are you sure you wish to shutdown the system?")) + self.control['wifi'] = self._gtk.ButtonImage('network', None, None, 1) + self.control['wifi'].connect("clicked", self.menu_item_clicked, "network",{ + "name": _('Network'), + "panel": "network" + }) self.locations = { 'macro_shortcut': 2, @@ -69,9 +73,22 @@ def __init__(self, screen, title, back=True, action_bar=True, printer_name=True) for i in range(button_range): self.control['space%s' % i] = Gtk.Label("") - self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) - - self.control_grid.attach(self.control['estop'], 0, 4, 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['space%s' % i], i, 0, 1, 1) + else: + self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['estop'], 5, 0, 1, 1) + else: + self.control_grid.attach(self.control['estop'], 0, 5, 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['shutdown'], 4, 0, 1, 1) + else: + self.control_grid.attach(self.control['shutdown'], 0, 4, 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['wifi'], 2, 0, 1, 1) + else: + self.control_grid.attach(self.control['wifi'], 0, 2, 1, 1) try: env = Environment(extensions=["jinja2.ext.i18n"]) @@ -82,78 +99,143 @@ def __init__(self, screen, title, back=True, action_bar=True, printer_name=True) logging.debug("Error parsing jinja for title: %s" % title) self.titlelbl = Gtk.Label() - self.titlelbl.set_size_request(self._screen.width - action_bar_width, self.title_spacing) self.titlelbl.set_hexpand(True) + self.titlelbl.set_vexpand(True) self.titlelbl.set_halign(Gtk.Align.CENTER) - self.titlelbl.set_valign(Gtk.Align.CENTER) + self.titlelbl.set_ellipsize(Pango.EllipsizeMode.END) self.set_title(title) + self.hmargin = 5 self.content = Gtk.VBox(spacing=0) - self.content.set_size_request(self._screen.width - action_bar_width, self._screen.height - self.title_spacing) + if self._screen.vertical_mode: + self.content.set_size_request(self._screen.width - self.hmargin * 2, + self._screen.height - self.title_spacing - action_bar_height) + else: + self.content.set_size_request(self._screen.width - action_bar_width - self.hmargin, + self._screen.height - self.title_spacing) if action_bar is True: - self.layout.put(self.control_grid, 0, 0) + if self._screen.vertical_mode: + self.layout.put(self.control_grid, 0, self._screen.height - action_bar_height) + else: + self.layout.put(self.control_grid, 0, 0) self.control['time_box'] = Gtk.Box() self.control['time_box'].set_halign(Gtk.Align.END) - self.control['time_box'].set_size_request(0, self.title_spacing) self.control['time'] = Gtk.Label("00:00 AM") - self.control['time'].set_size_request(0, self.title_spacing) - self.control['time'].set_halign(Gtk.Align.END) - self.control['time'].set_valign(Gtk.Align.CENTER) - self.control['time_box'].pack_end(self.control['time'], True, 0, 0) + self.control['time_box'].pack_end(self.control['time'], True, True, self.hmargin) self.control['temp_box'] = Gtk.Box() - self.control['temp_box'].set_vexpand(True) - self.control['temp_box'].set_size_request(0, self.title_spacing) - self.layout.put(self.control['temp_box'], action_bar_width, 0) - self.layout.put(self.titlelbl, action_bar_width, 0) - self.layout.put(self.control['time_box'], action_bar_width, 0) - self.layout.put(self.content, action_bar_width, self.title_spacing) + self.titlebar = Gtk.Grid() + self.titlebar.set_valign(Gtk.Align.CENTER) + self.titlebar.set_property("column-spacing", 5) + if self._screen.vertical_mode: + self.titlebar.set_size_request(self._screen.width, self.title_spacing) + else: + self.titlebar.set_size_request(self._screen.width - action_bar_width, self.title_spacing) + self.titlebar.attach(self.control['temp_box'], 0, 0, 1, 1) + self.titlebar.attach(self.titlelbl, 1, 0, 1, 1) + self.titlebar.attach(self.control['time_box'], 2, 0, 1, 1) + + if self._screen.vertical_mode: + self.layout.put(self.titlebar, 0, 0) + self.layout.put(self.content, self.hmargin, self.title_spacing) + else: + self.layout.put(self.titlebar, action_bar_width, 0) + self.layout.put(self.content, action_bar_width + self.hmargin, self.title_spacing) def initialize(self, panel_name): - # Create gtk items here + self.update_time() return def show_heaters(self, show=True): for child in self.control['temp_box'].get_children(): self.control['temp_box'].remove(child) - if show is False: + if not show or self._screen.printer.get_temp_store_devices() is None: return - i = 0 - for extruder in self._printer.get_tools(): - self.labels[extruder + '_box'] = Gtk.Box(spacing=0) - self.labels[extruder] = Gtk.Label(label="") - # self.labels[extruder].get_style_context().add_class("printing-info") - if i <= 4: - ext_img = self._gtk.Image("extruder-%s.svg" % i, None, .4, .4) - self.labels[extruder + '_box'].pack_start(ext_img, True, 3, 3) - self.labels[extruder + '_box'].pack_start(self.labels[extruder], True, 3, 3) - i += 1 - self.current_extruder = self._printer.get_stat("toolhead", "extruder") - self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, 5, 5) - - if self._printer.has_heated_bed(): - heater_bed = self._gtk.Image("bed.svg", None, .4, .4) - self.labels['heater_bed'] = Gtk.Label(label="20 C") - # self.labels['heater_bed'].get_style_context().add_class("printing-info") - heater_bed_box = Gtk.Box(spacing=0) - heater_bed_box.pack_start(heater_bed, True, 5, 5) - heater_bed_box.pack_start(self.labels['heater_bed'], True, 3, 3) - self.control['temp_box'].pack_end(heater_bed_box, True, 3, 3) - + for device in self._screen.printer.get_temp_store_devices(): + logging.info(device) + self.labels[device + '_box'] = Gtk.Box(spacing=0) + self.labels[device] = Gtk.Label(label="100º") + self.labels[device].set_ellipsize(Pango.EllipsizeMode.START) + if device.startswith("extruder"): + if self._screen.printer.extrudercount > 1: + if device == "extruder": + ext_img = self._gtk.Image("extruder-0", .5) + else: + ext_img = self._gtk.Image("extruder-%s" % device[8:], .5) + else: + ext_img = self._gtk.Image("extruder", .5) + self.labels[device + '_box'].pack_start(ext_img, True, True, 3) + elif device.startswith("heater_bed"): + bed_img = self._gtk.Image("bed", .5) + self.labels[device + '_box'].pack_start(bed_img, True, True, 3) + elif device.startswith("temperature_fan"): + fan_img = self._gtk.Image("fan", .5) + self.labels[device + '_box'].pack_start(fan_img, True, True, 3) + elif device.startswith("heater_generic"): + heat_img = self._gtk.Image("heater", .5) + self.labels[device + '_box'].pack_start(heat_img, True, True, 3) + else: + temp_img = self._gtk.Image("heat-up", .5) + self.labels[device + '_box'].pack_start(temp_img, True, True, 3) + self.labels[device + '_box'].pack_start(self.labels[device], True, True, 0) + + if self._screen.width <= 480: + nlimit = 3 + elif self._screen.width <= 800: + nlimit = 4 + else: + nlimit = 5 + + n = 0 + if self._screen.printer.get_tools(): + self.current_extruder = self._screen.printer.get_stat("toolhead", "extruder") + self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, True, 3) + n += 1 + + if self._screen.printer.has_heated_bed(): + self.control['temp_box'].pack_start(self.labels['heater_bed_box'], True, True, 3) + n += 1 + + # Options in the config have priority + printer_cfg = self._config.get_printer_config(self._screen.connected_printer) + if printer_cfg is not None: + titlebar_items = printer_cfg.get("titlebar_items", "") + if titlebar_items is not None: + titlebar_items = [str(i.strip()) for i in titlebar_items.split(',')] + logging.info("Titlebar items: %s", titlebar_items) + self.titlebar_name_type = printer_cfg.get("titlebar_name_type", None) + logging.info("Titlebar name type: %s", self.titlebar_name_type) + for device in self._screen.printer.get_temp_store_devices(): + # Users can fill the bar if they want + if n >= nlimit + 1: + break + if not (device.startswith("extruder") or device.startswith("heater_bed")): + name = device.split(" ")[1:][0] + else: + name = device + for item in titlebar_items: + if name == item: + self.control['temp_box'].pack_start(self.labels["%s_box" % device], True, True, 3) + n += 1 + break + + # If there is enough space fill with heater_generic + for device in self._screen.printer.get_temp_store_devices(): + if n >= nlimit: + break + if device.startswith("temperature_sensor"): + self.control['temp_box'].pack_start(self.labels["%s_box" % device], True, True, 3) + n += 1 + self.control['temp_box'].show_all() def activate(self): - size = self.control['time_box'].get_allocation().width - self.layout.remove(self.control['time_box']) - self.control['time_box'].set_size_request(size, self.title_spacing) - self.layout.put(self.control['time_box'], self._screen.width - size - 5, 0) - - GLib.timeout_add_seconds(1, self.update_time) - self.update_time() + if self.time_update is None: + self.time_update = GLib.timeout_add_seconds(1, self.update_time) def add_content(self, panel): self.current_panel = panel @@ -177,23 +259,30 @@ def get(self): return self.layout def process_update(self, action, data): - if action != "notify_status_update" or self._printer is None: + if action != "notify_status_update" or self._screen.printer is None: return - if self._printer.has_heated_bed(): - self.labels["heater_bed"].set_label( - "%02d°" % round(self._printer.get_dev_stat("heater_bed", "temperature"))) - for x in self._printer.get_tools(): - self.labels[x].set_label("%02d°" % round(self._printer.get_dev_stat(x, "temperature"))) + devices = self._screen.printer.get_temp_store_devices() + if devices is not None: + for device in devices: + name = "" + if not (device.startswith("extruder") or device.startswith("heater_bed")): + if self.titlebar_name_type == "full": + name = device.split(" ")[1:][0].capitalize().replace("_", " ") + ": " + elif self.titlebar_name_type == "short": + name = device.split(" ")[1:][0][:1].upper() + ": " + temp = self._screen.printer.get_dev_stat(device, "temperature") + if temp is not None: + self.labels[device].set_label("%s%d°" % (name, round(temp))) if "toolhead" in data and "extruder" in data["toolhead"]: if data["toolhead"]["extruder"] != self.current_extruder: self.control['temp_box'].remove(self.labels["%s_box" % self.current_extruder]) self.current_extruder = data["toolhead"]["extruder"] - self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, 3, 3) + self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, True, 3) + self.control['temp_box'].reorder_child(self.labels["%s_box" % self.current_extruder], 0) self.control['temp_box'].show_all() - def remove(self, widget): self.content.remove(widget) @@ -201,13 +290,21 @@ def show_back(self, show=True): if show is True and self.buttons_showing['back'] is False: self.control_grid.remove(self.control_grid.get_child_at(0, 0)) self.control_grid.attach(self.control['back'], 0, 0, 1, 1) - self.control_grid.remove(self.control_grid.get_child_at(0, 1)) - self.control_grid.attach(self.control['home'], 0, 1, 1, 1) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(1, 0)) + self.control_grid.attach(self.control['home'], 1, 0, 1, 1) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, 1)) + self.control_grid.attach(self.control['home'], 0, 1, 1, 1) self.buttons_showing['back'] = True elif show is False and self.buttons_showing['back'] is True: for i in range(0, 2): - self.control_grid.remove(self.control_grid.get_child_at(0, i)) - self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(i, 0)) + self.control_grid.attach(self.control['space%s' % i], i, 0, 1, 1) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, i)) + self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) self.buttons_showing['back'] = False self.control_grid.show() @@ -217,26 +314,46 @@ def show_macro_shortcut(self, show=True, mod_row=False): if show is True and self.buttons_showing['macros_shortcut'] is False: if len(self._config.get_printers()) > 1 and mod_row is True: - self.control_grid.insert_row(self.locations['macro_shortcut']) + if self._screen.vertical_mode: + self.control_grid.insert_column(self.locations['macro_shortcut']) + else: + self.control_grid.insert_row(self.locations['macro_shortcut']) else: - self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(self.locations['macro_shortcut'], 0)) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) if 'space%s' % self.locations['macro_shortcut'] in self.control: self.control_grid.remove(self.control['space%s' % self.locations['macro_shortcut']]) - self.control_grid.attach(self.control['macro_shortcut'], 0, self.locations['macro_shortcut'], 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['macro_shortcut'], self.locations['macro_shortcut'], 0, 1, 1) + else: + self.control_grid.attach(self.control['macro_shortcut'], 0, self.locations['macro_shortcut'], 1, 1) self.buttons_showing['macros_shortcut'] = True elif show is not True and self.buttons_showing['macros_shortcut'] is True: if ('space%s' % self.locations['macro_shortcut']) not in self.control: self.control['space%s' % self.locations['macro_shortcut']] = Gtk.Label("") if len(self._config.get_printers()) > 1 and mod_row is True: - self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(self.locations['macro_shortcut'], 0)) + self.control_grid.remove_column(self.locations['macro_shortcut']) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) + self.control_grid.remove_row(self.locations['macro_shortcut']) self.control_grid.remove(self.control['macro_shortcut']) - self.control_grid.remove_row(self.locations['macro_shortcut']) else: - self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(self.locations['macro_shortcut'], 0)) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['macro_shortcut'])) if ('space%s' % self.locations['macro_shortcut']) not in self.control: self.control['space%s' % self.locations['macro_shortcut']] = Gtk.Label("") - self.control_grid.attach(self.control['space%s' % self.locations['macro_shortcut']], - 0, self.locations['macro_shortcut'], 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['space%s' % self.locations['macro_shortcut']], + self.locations['macro_shortcut'], 0, 1, 1) + else: + self.control_grid.attach(self.control['space%s' % self.locations['macro_shortcut']], + 0, self.locations['macro_shortcut'], 1, 1) self.buttons_showing['macros_shortcut'] = False self._screen.show_all() @@ -246,14 +363,24 @@ def show_printer_select(self, show=True): if show and self.buttons_showing['printer_select'] is False: logging.info("Turning on printer_select button") - self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['printer_select'])) - self.control_grid.attach(self.control['printer_select'], 0, self.locations['printer_select'], 1, 1) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(self.locations['printer_select'], 0)) + self.control_grid.attach(self.control['printer_select'], self.locations['printer_select'], 0, 1, 1) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['printer_select'])) + self.control_grid.attach(self.control['printer_select'], 0, self.locations['printer_select'], 1, 1) self.buttons_showing['printer_select'] = True elif show is False and self.buttons_showing['printer_select']: logging.info("Turning off printer_select button") - self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['printer_select'])) - self.control_grid.attach(self.control['space%s' % self.locations['printer_select']], - 0, self.locations['printer_select'], 1, 1) + if self._screen.vertical_mode: + self.control_grid.remove(self.control_grid.get_child_at(self.locations['printer_select'], 0)) + self.control_grid.attach(self.control['space%s' % self.locations['printer_select']], + self.locations['printer_select'], 0, 1, 1) + else: + self.control_grid.remove(self.control_grid.get_child_at(0, self.locations['printer_select'])) + self.control_grid.attach(self.control['space%s' % self.locations['printer_select']], + 0, self.locations['printer_select'], 1, 1) + self.buttons_showing['printer_select'] = False self._screen.show_all() @@ -266,11 +393,14 @@ def set_title(self, title): except Exception: logging.debug("Error parsing jinja for title: %s" % title) - self.titlelbl.set_label("%s | %s" % (self._screen.connected_printer, title)) + self.titlelbl.set_label("%s | %s" % (self._screen.connecting_to_printer, title)) def show_back_buttons(self): self.control_grid.attach(self.control['back'], 0, 0, 1, 1) - self.control_grid.attach(self.control['home'], 0, 1, 1, 1) + if self._screen.vertical_mode: + self.control_grid.attach(self.control['home'], 1, 0, 1, 1) + else: + self.control_grid.attach(self.control['home'], 0, 1, 1, 1) def update_time(self): now = datetime.datetime.now() @@ -280,4 +410,4 @@ def update_time(self): self.control['time'].set_text(now.strftime("%H:%M")) else: self.control['time'].set_text(now.strftime("%I:%M %p")) - return True \ No newline at end of file + return True diff --git a/panels/bed_level.py b/panels/bed_level.py index b2b235b60..8030faeee 100644 --- a/panels/bed_level.py +++ b/panels/bed_level.py @@ -170,4 +170,4 @@ def process_update(self, action, data): def screws_tilt_calculate(self, widget): self.response_count = 0 self.labels['screws'].set_sensitive(False) - self._screen._ws.klippy.gcode_script("SCREWS_TILT_CALCULATE") + self._screen._ws.klippy.gcode_script("SCREWS_TILT_CALCULATE") \ No newline at end of file diff --git a/panels/bed_mesh.py b/panels/bed_mesh.py index cb727ece9..ba9f032ef 100644 --- a/panels/bed_mesh.py +++ b/panels/bed_mesh.py @@ -3,13 +3,13 @@ import numpy as np gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango import matplotlib.pyplot as plt from matplotlib import cm from matplotlib import rc from mpl_toolkits.mplot3d import Axes3D -from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas +from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas from matplotlib.ticker import LinearLocator from ks_includes.KlippyGcodes import KlippyGcodes @@ -30,6 +30,8 @@ def initialize(self, panel_name): scroll = Gtk.ScrolledWindow() scroll.set_property("overlay-scrolling", False) scroll.set_vexpand(True) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) # Create a grid for all profiles self.labels['profiles'] = Gtk.Grid() @@ -37,7 +39,7 @@ def initialize(self, panel_name): addprofile = self._gtk.ButtonImage("increase", " %s" % _("Add bed mesh profile"), - "color1", .5, .5, Gtk.PositionType.LEFT, False) + "color1", .5, Gtk.PositionType.LEFT, False) addprofile.connect("clicked", self.show_create_profile) addprofile.set_size_request(60, 0) addprofile.set_hexpand(False) @@ -67,7 +69,7 @@ def activate(self): def activate_mesh(self, profile): if profile == "": - profile = None + profile = "default" logging.debug("Activating profile: %s %s" % (self.active_mesh, profile)) if profile != self.active_mesh: @@ -88,7 +90,6 @@ def add_profile(self, profile): _ = self.lang.gettext frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) name = Gtk.Label() name.set_markup("%s" % (profile)) @@ -197,10 +198,16 @@ def create_profile(self, widget): self.remove_create() def calibrate_mesh(self, widget): + if self._screen.printer.get_stat("toolhead", "homed_axes") != "xyz": + self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME) + self._screen._ws.klippy.gcode_script( "BED_MESH_CALIBRATE" ) + if not (self._printer.config_section_exists("probe") or self._printer.config_section_exists("bltouch")): + self.menu_item_clicked(widget, "refresh", {"name": "Mesh calibrate", "panel": "zcalibrate"}) + def load_meshes(self): bm_profiles = self._screen.printer.get_config_section_list("bed_mesh ") self.profiles = {} @@ -274,6 +281,7 @@ def show_create_profile(self, widget): pl.set_hexpand(False) entry = Gtk.Entry() entry.set_hexpand(True) + entry.connect("activate", self.create_profile) save = self._gtk.ButtonImage("sd", _("Save"), "color3") save.set_hexpand(False) @@ -307,7 +315,14 @@ def show_mesh(self, widget, profile): return x_range = [int(abm['mesh_min'][0]), int(abm['mesh_max'][0])] y_range = [int(abm['mesh_min'][1]), int(abm['mesh_max'][1])] - z_range = [min(min(abm['mesh_matrix'])), max(max(abm['mesh_matrix']))] + minz_mesh = min(min(abm['mesh_matrix'])) + maxz_mesh = max(max(abm['mesh_matrix'])) + # Do not use a very small zscale, because that could be misleading + if minz_mesh > -0.5: + minz_mesh = -0.5 + if maxz_mesh < 0.5: + maxz_mesh = 0.5 + z_range = [minz_mesh, maxz_mesh] counts = [len(abm['mesh_matrix'][0]), len(abm['mesh_matrix'])] deltas = [(x_range[1] - x_range[0]) / (counts[0]-1), (y_range[1] - y_range[0]) / (counts[1]-1)] x = [(i*deltas[0])+x_range[0] for i in range(counts[0])] @@ -325,24 +340,23 @@ def show_mesh(self, widget, profile): x, y = np.meshgrid(x, y) z = np.asarray(bm['points']) - rc('axes', edgecolor="#fff", labelcolor="#fff") - rc(('xtick', 'ytick'), color="#fff") - fig = plt.figure() - fig.patch.set_facecolor("black") - ax = Axes3D(fig, auto_add_to_figure=False) - - ax.set_facecolor("black") - ax.set(title=profile, xlabel="X", ylabel="Y") - ax.spines['bottom'].set_color("#fff") - + rc('axes', edgecolor="#e2e2e2", labelcolor="#e2e2e2") + rc(('xtick', 'ytick'), color="#e2e2e2") + fig = plt.figure(facecolor='#12121277') + ax = Axes3D(fig, azim=245, elev=23) + ax.set(title=profile, xlabel="X", ylabel="Y", facecolor='none') + ax.spines['bottom'].set_color("#e2e2e2") fig.add_axes(ax) - surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.coolwarm) + surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm, vmin=-0.1, vmax=0.1) + + chartBox = ax.get_position() + ax.set_position([chartBox.x0, chartBox.y0+0.1, chartBox.width*.92, chartBox.height]) ax.set_zlim(z_range[0], z_range[1]) - ax.zaxis.set_major_locator(LinearLocator(10)) + ax.zaxis.set_major_locator(LinearLocator(5)) # A StrMethodFormatter is used automatically ax.zaxis.set_major_formatter('{x:.02f}') - fig.colorbar(surf, shrink=0.5, aspect=5) + fig.colorbar(surf, shrink=0.7, aspect=5, pad=0.25) box = Gtk.VBox() box.set_hexpand(True) @@ -363,14 +377,19 @@ def show_mesh(self, widget, profile): buttons = [ {"name": _("Close"), "response": Gtk.ResponseType.CANCEL} ] - dialog = self._gtk.Dialog(self._screen, buttons, box, self._close_dialog) + self._gtk.Dialog(self._screen, buttons, box, self._close_dialog) alloc = canvas_box.get_allocation() canvas = FigureCanvas(fig) canvas.set_size_request(alloc.width, self._screen.height/3*2) canvas_box.add(canvas) canvas_box.show_all() + # Remove the "matplotlib-canvas" class which forces a white background. + # https://github.com/matplotlib/matplotlib/commit/3c832377fb4c4b32fcbdbc60fdfedb57296bc8c0 + style_ctx = canvas.get_style_context() + for css_class in style_ctx.list_classes(): + style_ctx.remove_class(css_class) def _close_dialog(self, widget, response): - widget.destroy() + widget.destroy() \ No newline at end of file diff --git a/panels/console.py b/panels/console.py index 180861e6f..d45c657b5 100644 --- a/panels/console.py +++ b/panels/console.py @@ -1,14 +1,15 @@ import gi import logging import time +import re gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk from datetime import datetime -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return ConsolePanel(*args) @@ -21,15 +22,42 @@ def create_panel(*args): "warning": "#c9c9c9" } + class ConsolePanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext + self.autoscroll = True + self.hidetemps = True gcodes = self._screen._ws.send_method("server.gcode_store", {"count": 100}, self.gcode_response) - vbox = Gtk.VBox() - vbox.set_hexpand(True) - vbox.set_vexpand(True) + o1_lbl = Gtk.Label(_("Auto-scroll")) + o1_lbl.set_halign(Gtk.Align.END) + o1_switch = Gtk.Switch() + o1_switch.set_property("width-request", round(self._gtk.get_font_size() * 5)) + o1_switch.set_property("height-request", round(self._gtk.get_font_size() * 2.5)) + o1_switch.set_active(self.autoscroll) + o1_switch.connect("notify::active", self.set_autoscroll) + + o2_lbl = Gtk.Label(_("Hide temp.")) + o2_lbl.set_halign(Gtk.Align.END) + o2_switch = Gtk.Switch() + o2_switch.set_property("width-request", round(self._gtk.get_font_size() * 5)) + o2_switch.set_property("height-request", round(self._gtk.get_font_size() * 2.5)) + o2_switch.set_active(self.hidetemps) + o2_switch.connect("notify::active", self.hide_temps) + + o3_button = self._gtk.ButtonImage("refresh", _('Clear') + " ", None, .66, Gtk.PositionType.RIGHT, False) + o3_button.connect("clicked", self.clear) + + options = Gtk.HBox() + options.set_hexpand(True) + options.set_vexpand(False) + options.add(o1_lbl) + options.pack_start(o1_switch, False, 0, 5) + options.add(o2_lbl) + options.pack_start(o2_switch, False, 0, 5) + options.add(o3_button) sw = Gtk.ScrolledWindow() sw.set_hexpand(True) @@ -38,7 +66,8 @@ def initialize(self, panel_name): tb = Gtk.TextBuffer() tv = Gtk.TextView() tv.set_buffer(tb) - tv.set_sensitive(False) + tv.set_editable(False) + tv.set_cursor_visible(False) tv.connect("size-allocate", self._autoscroll) sw.add(tv) @@ -51,13 +80,15 @@ def initialize(self, panel_name): entry.set_hexpand(True) entry.set_vexpand(False) entry.connect("focus-in-event", self._show_keyboard) + entry.connect("focus-out-event", self._remove_keyboard) + entry.connect("activate", self._send_command) - enter = self._gtk.Button("Send") + enter = self._gtk.ButtonImage("resume", " " + _('Send') + " ", None, .66, Gtk.PositionType.RIGHT, False) enter.set_hexpand(False) enter.connect("clicked", self._send_command) - ebox.add(entry) # , True, 0, 0) - ebox.add(enter) # , True, 0, 0) + ebox.add(entry) + ebox.add(enter) self.labels.update({ "entry": entry, @@ -66,22 +97,30 @@ def initialize(self, panel_name): "tv": tv }) - vbox.add(sw) - vbox.pack_end(ebox, False, 0, 0) - self.content.add(vbox) + content_box = Gtk.VBox() + content_box.pack_start(options, False, 0, 5) + content_box.add(sw) + content_box.pack_end(ebox, False, 0, 0) + self.content.add(content_box) + + def clear(self, widget): + self.labels['tb'].set_text("") def add_gcode(self, type, time, message): if type == "command": color = COLORS['command'] - message = '$ %s' % message elif message.startswith("!!"): color = COLORS['error'] + message = message.replace("!! ", "") elif message.startswith("//"): color = COLORS['warning'] + message = message.replace("// ", "") + elif self.hidetemps and re.match('^(?:ok\\s+)?(B|C|T\\d*):', message): + return else: color = COLORS['response'] - message = '%s' % (color, message) + message = '%s' % (color, message) message = message.replace('\n', '\n ') @@ -90,6 +129,9 @@ def add_gcode(self, type, time, message): '\n%s %s' % (COLORS['time'], datetime.fromtimestamp(time).strftime("%H:%M:%S"), message), -1 ) + # Limit the length + if self.labels['tb'].get_line_count() > 999: + self.labels['tb'].delete(self.labels['tb'].get_iter_at_line(0), self.labels['tb'].get_iter_at_line(1)) def gcode_response(self, result, method, params): if method != "server.gcode_store": @@ -102,13 +144,23 @@ def process_update(self, action, data): if action == "notify_gcode_response": self.add_gcode("response", time.time(), data) + def hide_temps(self, *args): + self.hidetemps ^= True + + def set_autoscroll(self, *args): + self.autoscroll ^= True + def _autoscroll(self, *args): - adj = self.labels['sw'].get_vadjustment() - adj.set_value(adj.get_upper() - adj.get_page_size()) + if self.autoscroll: + adj = self.labels['sw'].get_vadjustment() + adj.set_value(adj.get_upper() - adj.get_page_size()) def _show_keyboard(self, *args): self._screen.show_keyboard() + def _remove_keyboard(self, *args): + self._screen.remove_keyboard() + def _send_command(self, *args): cmd = self.labels['entry'].get_text() self.labels['entry'].set_text('') diff --git a/panels/example.py b/panels/example.py index 85cf26c21..119f82cdb 100644 --- a/panels/example.py +++ b/panels/example.py @@ -1,15 +1,15 @@ import gi -import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return ExamplePanel(*args) + class ExamplePanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext diff --git a/panels/extrude.py b/panels/extrude.py index 2903c9e3a..9fd22a158 100644 --- a/panels/extrude.py +++ b/panels/extrude.py @@ -45,7 +45,7 @@ def initialize(self, panel_name): self.labels['retract'].connect("clicked", self.extrude, "-") self.labels['temperature'] = self._gtk.ButtonImage("heat-up", _("Temperature"), "color4") self.labels['temperature'].connect("clicked", self.menu_item_clicked, "temperature", { - "name": "Temperature", + "name": _('Temperature'), "panel": "temperature" }) @@ -191,4 +191,4 @@ def find_gcode_macros(self): self.load_filament = True if macro == "UNLOAD_FILAMENT": logging.info("Found %s" % macro) - self.unload_filament = True + self.unload_filament = True \ No newline at end of file diff --git a/panels/fan.py b/panels/fan.py index e3df2421c..32b77c290 100644 --- a/panels/fan.py +++ b/panels/fan.py @@ -7,12 +7,14 @@ from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return FanPanel(*args) CHANGEABLE_FANS = ["fan", "fan_generic"] + class FanPanel(ScreenPanel): fan_speed = {} user_selecting = False @@ -21,9 +23,7 @@ def initialize(self, panel_name): _ = self.lang.gettext self.devices = {} - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) + scroll = self._gtk.ScrolledWindow() # Create a grid for all devices self.labels['devices'] = Gtk.Grid() @@ -39,12 +39,12 @@ def initialize(self, panel_name): self.content.add(box) def process_update(self, action, data): - if (action != "notify_status_update"): + if action != "notify_status_update": return for fan in self.devices: if fan in data and "speed" in data[fan]: - self.update_fan_speed(fan, data[fan]["speed"]) + self.update_fan_speed(fan, self._printer.get_fan_speed(fan, data[fan]["speed"])) def update_fan_speed(self, fan, speed): if fan not in self.devices: @@ -55,7 +55,7 @@ def update_fan_speed(self, fan, speed): self.fan_speed[fan] = round(float(speed) * 100) self.devices[fan]['scale'].disconnect_by_func(self.set_fan_speed) self.devices[fan]['scale'].set_value(self.fan_speed[fan]) - self.devices[fan]['scale'].connect("value-changed", self.set_fan_speed, fan) + self.devices[fan]['scale'].connect("button-release-event", self.set_fan_speed, fan) else: self.fan_speed[fan] = float(speed) self.devices[fan]['scale'].set_fraction(self.fan_speed[fan]) @@ -69,20 +69,16 @@ def add_fan(self, fan): break frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) frame.get_style_context().add_class("frame-item") - try: - self.fan_speed[fan] = float(self._printer.get_data()[fan]["speed"]) - except Exception: - self.fan_speed[fan] = 0 + self.fan_speed[fan] = float(self._printer.get_fan_speed(fan)) name = Gtk.Label() if fan == "fan": fan_name = "Part Fan" else: fan_name = " ".join(fan.split(" ")[1:]) - name.set_markup("%s" % (fan_name)) + name.set_markup("%s" % fan_name) name.set_hexpand(True) name.set_vexpand(True) name.set_halign(Gtk.Align.START) @@ -99,7 +95,7 @@ def add_fan(self, fan): scale.set_hexpand(True) scale.set_has_origin(True) scale.get_style_context().add_class("fan_slider") - scale.connect("value-changed", self.set_fan_speed, fan) + scale.connect("button-release-event", self.set_fan_speed, fan) else: scale = Gtk.ProgressBar() scale.set_fraction(self.fan_speed[fan]) @@ -139,13 +135,23 @@ def add_fan(self, fan): def load_fans(self): fans = self._printer.get_fans() for fan in fans: + # Support for hiding devices by name + name = " ".join(fan.split(" ")[1:]) if not (fan == "fan") else fan + if name.startswith("_"): + continue self.add_fan(fan) - def set_fan_speed(self, widget, fan): + def set_fan_speed(self, widget, event, fan): value = self.devices[fan]['scale'].get_value() if fan == "fan": self._screen._ws.klippy.gcode_script(KlippyGcodes.set_fan_speed(value)) else: f = " ".join(fan.split(" ")[1:]) - self._screen._ws.klippy.gcode_script("SET_FAN_SPEED FAN=%s SPEED=%s" % (f, float(value)/100)) + self._screen._ws.klippy.gcode_script("SET_FAN_SPEED FAN=%s SPEED=%s" % (f, float(value) / 100)) + # Check the speed in case it wasn't applied + GLib.timeout_add_seconds(1, self.check_fan_speed, fan) + + def check_fan_speed(self, fan): + self.update_fan_speed(fan, self._printer.get_fan_speed(fan)) + return False diff --git a/panels/fine_tune.py b/panels/fine_tune.py index e22ad3bb4..a0af2e520 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -3,14 +3,16 @@ import re gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return FineTunePanel(*args) + class FineTunePanel(ScreenPanel): user_selecting = False @@ -19,16 +21,12 @@ class FineTunePanel(ScreenPanel): bs_deltas = ["0.01", "0.05"] percent_delta = 1 percent_deltas = ['1', '5', '10', '25'] - fan = 100 - - extrusion = 0 - speed = 0 + extrusion = 100 + speed = 100 def initialize(self, panel_name): _ = self.lang.gettext - grid = self._gtk.HomogeneousGrid() - grid.set_row_homogeneous(False) logging.debug("FineTunePanel") print_cfg = self._config.get_printer_config(self._screen.connected_printer) @@ -42,39 +40,6 @@ def initialize(self, panel_name): self.bs_deltas = [bs[0], bs[-1]] self.bs_delta = self.bs_deltas[0] - - self.labels['z+'] = self._gtk.ButtonImage("z-farther", _("Увеличить офсет"), "color1") - self.labels['z+'].connect("clicked", self.change_babystepping, "+") - self.labels['zoffset'] = Gtk.Label("0.00" + _("mm")) - self.labels['zoffset'].get_style_context().add_class('temperature_entry') - self.labels['z-'] = self._gtk.ButtonImage("z-closer", _("Уменьшить офсет"), "color1") - self.labels['z-'].connect("clicked", self.change_babystepping, "-") - - grid.attach(self.labels['z+'], 0, 0, 1, 1) - grid.attach(self.labels['zoffset'], 0, 1, 1, 1) - grid.attach(self.labels['z-'], 0, 2, 1, 1) - - self.labels['speed+'] = self._gtk.ButtonImage("speed+", _("Увеличить скорость"), "color3") - self.labels['speed+'].connect("clicked", self.change_speed, "+") - self.labels['speedfactor'] = Gtk.Label("100%") - self.labels['speedfactor'].get_style_context().add_class('temperature_entry') - self.labels['speed-'] = self._gtk.ButtonImage("speed-", _("Уменьшить скорость"), "color3") - self.labels['speed-'].connect("clicked", self.change_speed, "-") - grid.attach(self.labels['speed+'], 1, 0, 1, 1) - grid.attach(self.labels['speedfactor'], 1, 1, 1, 1) - grid.attach(self.labels['speed-'], 1, 2, 1, 1) - - self.labels['extrude+'] = self._gtk.ButtonImage("flow+", _("Увеличить поток"), "color4") - self.labels['extrude+'].connect("clicked", self.change_extrusion, "+") - self.labels['extrudefactor'] = Gtk.Label("100%") - self.labels['extrudefactor'].get_style_context().add_class('temperature_entry') - self.labels['extrude-'] = self._gtk.ButtonImage("flow-", _("Уменьшить поток"), "color4") - self.labels['extrude-'].connect("clicked", self.change_extrusion, "-") - grid.attach(self.labels['extrude+'], 2, 0, 1, 1) - grid.attach(self.labels['extrudefactor'], 2, 1, 1, 1) - grid.attach(self.labels['extrude-'], 2, 2, 1, 1) - - # babystepping grid bsgrid = Gtk.Grid() j = 0 @@ -84,7 +49,7 @@ def initialize(self, panel_name): ctx = self.labels[i].get_style_context() if j == 0: ctx.add_class("distbutton_top") - elif j == len(self.bs_deltas)-1: + elif j == len(self.bs_deltas) - 1: ctx.add_class("distbutton_bottom") else: ctx.add_class("distbutton") @@ -92,7 +57,6 @@ def initialize(self, panel_name): ctx.add_class("distbutton_active") bsgrid.attach(self.labels[i], j, 0, 1, 1) j += 1 - grid.attach(bsgrid, 0, 3, 1, 1) # Grid for percentage deltgrid = Gtk.Grid() @@ -103,7 +67,7 @@ def initialize(self, panel_name): ctx = self.labels[i].get_style_context() if j == 0: ctx.add_class("distbutton_top") - elif j == len(self.percent_deltas)-1: + elif j == len(self.percent_deltas) - 1: ctx.add_class("distbutton_bottom") else: ctx.add_class("distbutton") @@ -114,9 +78,74 @@ def initialize(self, panel_name): self.labels["1"].set_active(True) - grid.attach(deltgrid, 1, 3, 2, 1) + grid = self._gtk.HomogeneousGrid() + grid.set_row_homogeneous(False) + if self._screen.vertical_mode: + self.labels['z+'] = self._gtk.ButtonImage("z-farther", _("Z+"), "color1") + self.labels['z-'] = self._gtk.ButtonImage("z-closer", _("Z-"), "color1") + self.labels['zoffset'] = self._gtk.ButtonImage("refresh", " 0.00" + _("mm"), + "color1", .6, Gtk.PositionType.LEFT, False) + + self.labels['speed+'] = self._gtk.ButtonImage("speed+", _("Speed +"), "color3") + self.labels['speed-'] = self._gtk.ButtonImage("speed-", _("Speed -"), "color3") + self.labels['speedfactor'] = self._gtk.ButtonImage("refresh", " 100%", + "color3", .6, Gtk.PositionType.LEFT, False) + + self.labels['extrude+'] = self._gtk.ButtonImage("flow+", _("Extrusion +"), "color4") + self.labels['extrude-'] = self._gtk.ButtonImage("flow-", _("Extrusion -"), "color4") + self.labels['extrudefactor'] = self._gtk.ButtonImage("refresh", " 100%", + "color4", .6, Gtk.PositionType.LEFT, False) + + grid.attach(self.labels['z+'], 0, 0, 1, 1) + grid.attach(self.labels['z-'], 1, 0, 1, 1) + grid.attach(self.labels['zoffset'], 2, 0, 1, 1) + grid.attach(bsgrid, 0, 1, 3, 1) + + grid.attach(self.labels['speed-'], 0, 2, 1, 1) + grid.attach(self.labels['speed+'], 1, 2, 1, 1) + grid.attach(self.labels['speedfactor'], 2, 2, 1, 1) + + grid.attach(self.labels['extrude-'], 0, 3, 1, 1) + grid.attach(self.labels['extrude+'], 1, 3, 1, 1) + grid.attach(self.labels['extrudefactor'], 2, 3, 1, 1) + grid.attach(deltgrid, 0, 4, 3, 1) + else: + self.labels['z+'] = self._gtk.ButtonImage("z-farther", _("Z+"), "color1") + self.labels['zoffset'] = self._gtk.ButtonImage("refresh", " 0.00" + _("mm"), + "color1", .6, Gtk.PositionType.LEFT, False) + self.labels['z-'] = self._gtk.ButtonImage("z-closer", _("Z-"), "color1") + + self.labels['speed+'] = self._gtk.ButtonImage("speed+", _("Speed +"), "color3") + self.labels['speedfactor'] = self._gtk.ButtonImage("refresh", " 100%", + "color3", .6, Gtk.PositionType.LEFT, False) + self.labels['speed-'] = self._gtk.ButtonImage("speed-", _("Speed -"), "color3") + + self.labels['extrude+'] = self._gtk.ButtonImage("flow+", _("Extrusion +"), "color4") + self.labels['extrudefactor'] = self._gtk.ButtonImage("refresh", " 100%", + "color4", .6, Gtk.PositionType.LEFT, False) + self.labels['extrude-'] = self._gtk.ButtonImage("flow-", _("Extrusion -"), "color4") + grid.attach(self.labels['zoffset'], 0, 0, 1, 1) + grid.attach(self.labels['z+'], 0, 1, 1, 1) + grid.attach(self.labels['z-'], 0, 2, 1, 1) + grid.attach(bsgrid, 0, 3, 1, 1) + grid.attach(self.labels['speedfactor'], 1, 0, 1, 1) + grid.attach(self.labels['speed+'], 1, 1, 1, 1) + grid.attach(self.labels['speed-'], 1, 2, 1, 1) + grid.attach(self.labels['extrudefactor'], 2, 0, 1, 1) + grid.attach(self.labels['extrude+'], 2, 1, 1, 1) + grid.attach(self.labels['extrude-'], 2, 2, 1, 1) + grid.attach(deltgrid, 1, 3, 2, 1) + + self.labels['z+'].connect("clicked", self.change_babystepping, "+") + self.labels['zoffset'].connect("clicked", self.change_babystepping, "reset") + self.labels['z-'].connect("clicked", self.change_babystepping, "-") + self.labels['speed+'].connect("clicked", self.change_speed, "+") + self.labels['speedfactor'].connect("clicked", self.change_speed, "reset") + self.labels['speed-'].connect("clicked", self.change_speed, "-") + self.labels['extrude+'].connect("clicked", self.change_extrusion, "+") + self.labels['extrudefactor'].connect("clicked", self.change_extrusion, "reset") + self.labels['extrude-'].connect("clicked", self.change_extrusion, "-") - # self.panel = grid self.content.add(grid) def process_update(self, action, data): @@ -127,24 +156,28 @@ def process_update(self, action, data): if "gcode_move" in data: if "homing_origin" in data["gcode_move"]: - self.labels['zoffset'].set_text("%.2fmm" % data["gcode_move"]["homing_origin"][2]) + self.labels['zoffset'].set_label(" %.2fmm" % data["gcode_move"]["homing_origin"][2]) if "extrude_factor" in data["gcode_move"]: - self.extrusion = int(data["gcode_move"]["extrude_factor"]*100) - self.labels['extrudefactor'].set_text("%3d%%" % self.extrusion) + self.extrusion = int(round(data["gcode_move"]["extrude_factor"] * 100)) + self.labels['extrudefactor'].set_label(" %3d%%" % self.extrusion) if "speed_factor" in data["gcode_move"]: - self.speed = int(data["gcode_move"]["speed_factor"]*100) - self.labels['speedfactor'].set_text("%3d%%" % self.speed) + self.speed = int(round(data["gcode_move"]["speed_factor"] * 100)) + self.labels['speedfactor'].set_label(" %3d%%" % self.speed) def change_babystepping(self, widget, dir): + if self._screen.printer.get_stat("toolhead", "homed_axes") != "xyz": + self._screen.show_popup_message("Must home first") + return + if dir == "+": gcode = "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1" % self.bs_delta - else: + elif dir == "-": gcode = "SET_GCODE_OFFSET Z_ADJUST=-%s MOVE=1" % self.bs_delta + elif dir == "reset": + gcode = "SET_GCODE_OFFSET Z=0 MOVE=1" self._screen._ws.klippy.gcode_script(gcode) - - def change_bs_delta(self, widget, bs): if self.bs_delta == bs: return @@ -164,35 +197,26 @@ def change_bs_delta(self, widget, bs): def change_extrusion(self, widget, dir): if dir == "+": self.extrusion += int(self.percent_delta) - else: + elif dir == "-": self.extrusion -= int(self.percent_delta) + elif dir == "reset": + self.extrusion = 100 - if self.extrusion < 0: - self.extrusion = 0 + if self.extrusion < 1: + self.extrusion = 1 self._screen._ws.klippy.gcode_script(KlippyGcodes.set_extrusion_rate(self.extrusion)) - def change_fan(self, widget, dir): - if dir == "+": - self.fan += int(self.percent_delta) - else: - self.fan -= int(self.percent_delta) - - if self.fan < 0: - self.fan = 0 - elif self.fan > 100: - self.fan = 100 - - self._screen._ws.klippy.gcode_script(KlippyGcodes.set_fan_speed(self.fan)) - def change_speed(self, widget, dir): if dir == "+": self.speed += int(self.percent_delta) - else: + elif dir == "-": self.speed -= int(self.percent_delta) + elif dir == "reset": + self.speed = 100 - if self.speed < 0: - self.speed = 0 + if self.speed < 1: + self.speed = 1 self._screen._ws.klippy.gcode_script(KlippyGcodes.set_speed_rate(self.speed)) diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py index 0b7ffba43..fef140077 100644 --- a/panels/gcode_macros.py +++ b/panels/gcode_macros.py @@ -2,48 +2,66 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, GLib, Pango -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return MacroPanel(*args) + class MacroPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext self.macros = {} self.loaded_macros = [] - - # Create a scroll window for the macros - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) - - # Create a grid for all macros + self.sort_char = [" ↑", " ↓"] + self.sort_reverse = False + self.menu = ['macros_menu'] + + sort = Gtk.Label(_("Sort:")) + sort.set_hexpand(False) + self.sort_lbl = _("Name") + self.sort_btn = self._gtk.Button(self.sort_lbl + self.sort_char[0], "color1") + self.sort_btn.connect("clicked", self.change_sort) + self.sort_btn.set_hexpand(True) + adjust = self._gtk.ButtonImage("settings", None, "color2", 1, Gtk.PositionType.LEFT, False) + adjust.connect("clicked", self.load_menu, 'options') + adjust.set_hexpand(False) + + sbox = Gtk.HBox() + sbox.set_vexpand(False) + sbox.pack_start(sort, False, False, 5) + sbox.pack_start(self.sort_btn, True, True, 5) + sbox.pack_start(adjust, True, True, 5) + + self.labels['macros_list'] = self._gtk.ScrolledWindow() self.labels['macros'] = Gtk.Grid() - scroll.add(self.labels['macros']) + self.labels['macros_list'].add(self.labels['macros']) - # Create a box to contain all of the above - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - box.set_vexpand(True) - box.pack_start(scroll, True, True, 0) + self.labels['macros_menu'] = Gtk.VBox() + self.labels['macros_menu'].set_vexpand(True) + self.labels['macros_menu'].pack_start(sbox, False, False, 0) + self.labels['macros_menu'].pack_start(self.labels['macros_list'], True, True, 0) - self.content.add(box) + self.content.add(self.labels['macros_menu']) + self.labels['options_menu'] = self._gtk.ScrolledWindow() + self.labels['options'] = Gtk.Grid() + self.labels['options_menu'].add(self.labels['options']) def activate(self): - self.unload_gcode_macros() - self.load_gcode_macros() + while len(self.menu) > 1: + self.unload_menu() + self.reload_macros() def add_gcode_macro(self, macro): - - frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) - frame.get_style_context().add_class("frame-item") + # Support for hiding macros by name + if macro.startswith("_"): + return name = Gtk.Label() - name.set_markup("%s" % (macro)) + name.set_markup("%s" % macro) name.set_hexpand(True) name.set_vexpand(True) name.set_halign(Gtk.Align.START) @@ -51,33 +69,53 @@ def add_gcode_macro(self, macro): name.set_line_wrap(True) name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - open = self._gtk.ButtonImage("resume", None, "color3") - open.connect("clicked", self.run_gcode_macro, macro) - open.set_hexpand(False) - open.set_halign(Gtk.Align.END) + btn = self._gtk.ButtonImage("resume", None, "color3") + btn.connect("clicked", self.run_gcode_macro, macro) + btn.set_hexpand(False) + btn.set_halign(Gtk.Align.END) - labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + labels = Gtk.VBox() labels.add(name) - dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - dev.set_hexpand(True) - dev.set_vexpand(False) - + dev = Gtk.HBox(spacing=5) dev.add(labels) - dev.add(open) + dev.add(btn) + + frame = Gtk.Frame() + frame.get_style_context().add_class("frame-item") frame.add(dev) self.macros[macro] = { "row": frame } - macros = sorted(self.macros) + macros = sorted(self.macros, reverse=self.sort_reverse, key=str.casefold) pos = macros.index(macro) self.loaded_macros.append(macro) self.labels['macros'].insert_row(pos) self.labels['macros'].attach(self.macros[macro]['row'], 0, pos, 1, 1) - self.labels['macros'].show_all() + + def run_gcode_macro(self, widget, macro): + self._screen._ws.klippy.gcode_script(macro) + + def change_sort(self, widget): + self.sort_reverse ^= True + if self.sort_reverse: + self.sort_btn.set_label(self.sort_lbl + self.sort_char[1]) + else: + self.sort_btn.set_label(self.sort_lbl + self.sort_char[0]) + self.sort_btn.show() + + GLib.idle_add(self.reload_macros) + + def reload_macros(self): + self.labels['macros'].remove_column(0) + self.macros = {} + self.loaded_macros = [] + self.allmacros = {} + self.labels['options'].remove_column(0) + self.load_gcode_macros() def load_gcode_macros(self): macros = self._screen.printer.get_gcode_macros() @@ -94,15 +132,68 @@ def load_gcode_macros(self): self._config.get_config().getboolean(section_name, macro.lower(), fallback=True)): self.add_gcode_macro(macro) - def run_gcode_macro(self, widget, macro): - self._screen._ws.klippy.gcode_script(macro) + for macro in self._printer.get_config_section_list("gcode_macro "): + macro = macro[12:] + # Support for hiding macros by name + if macro.startswith("_"): + continue - def unload_gcode_macros(self): - section_name = "displayed_macros %s" % self._screen.connected_printer - for macro in self.loaded_macros: - if (section_name in self._config.get_config().sections() and - not self._config.get_config().getboolean(section_name, macro.lower(), fallback=True)): - macros = sorted(self.macros) - pos = macros.index(macro) - self.labels['macros'].remove_row(pos) - self.labels['macros'].show_all() + self.allmacros[macro] = { + "name": macro, + "section": "displayed_macros %s" % self._screen.connected_printer, + } + for macro in list(self.allmacros): + self.add_option('options', self.allmacros, macro, self.allmacros[macro]) + + self.labels['macros'].show_all() + + def add_option(self, boxname, opt_array, opt_name, option): + name = Gtk.Label() + name.set_markup("%s" % (option['name'])) + name.set_hexpand(True) + name.set_vexpand(True) + name.set_halign(Gtk.Align.START) + name.set_valign(Gtk.Align.CENTER) + name.set_line_wrap(True) + name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + + box = Gtk.Box() + box.set_vexpand(False) + switch = Gtk.Switch() + switch.set_hexpand(False) + switch.set_vexpand(False) + switch.set_active(self._config.get_config().getboolean(option['section'], opt_name, fallback=True)) + switch.connect("notify::active", self.switch_config_option, option['section'], opt_name) + switch.set_property("width-request", round(self._gtk.get_font_size() * 7)) + switch.set_property("height-request", round(self._gtk.get_font_size() * 3.5)) + box.add(switch) + + dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) + dev.set_hexpand(True) + dev.set_vexpand(False) + dev.set_valign(Gtk.Align.CENTER) + dev.add(name) + dev.add(box) + + frame = Gtk.Frame() + frame.get_style_context().add_class("frame-item") + frame.add(dev) + frame.show_all() + opt_array[opt_name] = { + "name": option['name'], + "row": frame + } + + opts = sorted(self.allmacros, key=str.casefold) + pos = opts.index(opt_name) + + self.labels[boxname].insert_row(pos) + self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1) + self.labels[boxname].show_all() + + def back(self): + if len(self.menu) > 1: + self.unload_menu() + self.reload_macros() + return True + return False diff --git a/panels/input_shaper.py b/panels/input_shaper.py index 079a17a38..a6fb3c322 100644 --- a/panels/input_shaper.py +++ b/panels/input_shaper.py @@ -4,144 +4,127 @@ gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango +from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return InputShaperPanel(*args) # X and Y frequencies XY_FREQ = [ - {'name': 'Частота для X', 'config': 'shaper_freq_x', 'min': 0, 'max': 133}, - {'name': 'Частота для Y', 'config': 'shaper_freq_y', 'min': 0, 'max': 133}, + {'name': 'X', 'config': 'shaper_freq_x', 'min': 0, 'max': 133}, + {'name': 'Y', 'config': 'shaper_freq_y', 'min': 0, 'max': 133}, ] SHAPERS = ['zv', 'mzv', 'zvd', 'ei', '2hump_ei', '3hump_ei'] + class InputShaperPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext - self.CALIBRATE_TEXT = self.lang.gettext('Запустить автокалибровку') - self.has_sensor = False + self.calibrating_axis = None - grid = self._gtk.HomogeneousGrid() - grid.set_row_homogeneous(False) - grid.set_vexpand(True) - grid.set_hexpand(True) - grid.get_style_context().add_class("input-shaper") - grid.set_column_spacing(20) + auto_calibration_label = Gtk.Label() + auto_calibration_label.set_markup('Auto Calibration') + auto_calibration_label.set_hexpand(True) - input_grid = Gtk.Grid() - input_grid.set_vexpand(True) + self.calibrate_btn = self._gtk.ButtonImage("move", _('Finding ADXL'), "color1", word_wrap=False) + self.calibrate_btn.connect("clicked", self.on_popover_clicked) + self.calibrate_btn.set_sensitive(False) - self.freq_xy_adj = {} - self.freq_xy_combo = {} + auto_grid = Gtk.Grid() + auto_grid.attach(auto_calibration_label, 0, 0, 1, 1) + auto_grid.attach(self.calibrate_btn, 1, 0, 1, 1) manual_calibration_label = Gtk.Label() - manual_calibration_label.set_markup('Ручная калибровка') - input_grid.attach(manual_calibration_label, 0, 0, 1, 1) + manual_calibration_label.set_markup('Manual Calibration') + manual_calibration_label.set_vexpand(True) disclaimer = Gtk.Label() - disclaimer.set_markup('NOTE: Ручная калибровка будет использоваться только во время работы в панели. Отредактируйте файл printer.cfg,' - 'чтобы сохранить изменения..') + disclaimer.set_markup('NOTE: Edit your printer.cfg to save manual calibration changes.') disclaimer.set_line_wrap(True) - disclaimer.set_hexpand(True) - disclaimer.set_vexpand(False) - disclaimer.set_halign(Gtk.Align.START) - input_grid.attach(disclaimer, 0, 1, 1, 1) - - for i, dim_freq in enumerate(XY_FREQ): - frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) - frame.get_style_context().add_class("frame-item") + disclaimer.set_halign(Gtk.Align.CENTER) - labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + input_grid = Gtk.Grid() + input_grid.attach(manual_calibration_label, 0, 0, 3, 1) + input_grid.attach(disclaimer, 0, 1, 3, 1) - name = Gtk.Label() - name.set_markup("{} (Hz)".format(dim_freq['name'])) - name.set_hexpand(True) - name.set_vexpand(True) - name.set_halign(Gtk.Align.START) - name.set_valign(Gtk.Align.CENTER) - name.set_line_wrap(True) + self.freq_xy_adj = {} + self.freq_xy_combo = {} + for i, dim_freq in enumerate(XY_FREQ): + axis_lbl = Gtk.Label() + axis_lbl.set_markup("{}".format(dim_freq['name'])) + axis_lbl.set_hexpand(False) + axis_lbl.set_vexpand(True) + axis_lbl.set_halign(Gtk.Align.START) + axis_lbl.set_valign(Gtk.Align.CENTER) + axis_lbl.set_line_wrap(True) self.freq_xy_adj[dim_freq['config']] = Gtk.Adjustment(0, dim_freq['min'], dim_freq['max'], 0.1) scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=self.freq_xy_adj[dim_freq['config']]) scale.set_digits(1) scale.set_hexpand(True) + scale.set_valign(Gtk.Align.END) scale.set_has_origin(True) scale.get_style_context().add_class("option_slider") scale.connect("button-release-event", self.set_opt_value, dim_freq['config']) - labels.add(name) - labels.add(scale) - - shaper_grid = Gtk.Grid() - shaper_grid.set_vexpand(True) - name = Gtk.Label() - name.set_markup("{}".format(dim_freq['name'].replace('Частота', 'Тип коррекции'))) - name.set_hexpand(True) - name.set_vexpand(True) - name.set_halign(Gtk.Align.START) - name.set_valign(Gtk.Align.CENTER) - name.set_line_wrap(True) - name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - shaper_grid.attach(name, 0, 0, 1, 1) shaper_slug = dim_freq['config'].replace('_freq_', '_type_') self.freq_xy_combo[shaper_slug] = Gtk.ComboBoxText() for shaper in SHAPERS: self.freq_xy_combo[shaper_slug].append(shaper, shaper) self.freq_xy_combo[shaper_slug].set_active(0) - shaper_grid.attach(self.freq_xy_combo[shaper_slug], 1, 0, 1, 1) - labels.add(shaper_grid) - - dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) - dev.set_hexpand(True) - dev.set_vexpand(False) - dev.add(labels) - frame.add(dev) - input_grid.attach(frame, 0, i + 2, 1, 1) - grid.attach(input_grid, 0, 0, 1, 1) - - auto_grid = Gtk.Grid() - auto_grid.set_vexpand(True) - - auto_calibration_label = Gtk.Label() - auto_calibration_label.set_markup('Автоматическая калибровка') - auto_grid.attach(auto_calibration_label, 0, 0, 1, 1) + input_grid.attach(axis_lbl, 0, i + 2, 1, 1) + input_grid.attach(scale, 1, i + 2, 1, 1) + input_grid.attach(self.freq_xy_combo[shaper_slug], 2, i + 2, 1, 1) - disclaimer = Gtk.Label('') - disclaimer.set_markup('NOTE: После автокалибровки изменения сохранятся сами. Принтер будет перезагружен.') - disclaimer.set_line_wrap(True) - disclaimer.set_hexpand(True) - disclaimer.set_vexpand(False) - disclaimer.set_halign(Gtk.Align.START) - - auto_grid.attach(disclaimer, 0, 1, 1, 1) - - self.calibrate_btn = self._gtk.ButtonImage("move", _('Поиск ADXL345'), "color1", word_wrap=False) - self.calibrate_btn.connect('clicked', self.start_calibration) - self.calibrate_btn.set_sensitive(False) - auto_grid.attach(self.calibrate_btn, 0, 2, 1, 1) - - grid.attach(auto_grid, 1, 0, 1, 1) - - self.status = Gtk.Label('Статус:') + self.status = Gtk.Label("") self.status.set_hexpand(True) self.status.set_vexpand(False) self.status.set_halign(Gtk.Align.START) self.status.set_ellipsize(Pango.EllipsizeMode.END) - self.status.set_max_width_chars(68) - self.status.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - grid.attach(self.status, 0, 2, 2, 1) - - self.content.add(grid) - - def start_calibration(self, *_): - self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE HZ_PER_SEC=2') - self.calibrate_btn.set_label(self.lang.gettext('Осуществляется калибровка')) + box = Gtk.VBox() + box.add(auto_grid) + box.add(input_grid) + box.add(self.status) + + self.content.add(box) + + pobox = Gtk.VBox() + test_x = self._gtk.Button(_("Measure X")) + test_x.connect("clicked", self.start_calibration, "x") + pobox.pack_start(test_x, True, True, 5) + test_y = self._gtk.Button(_("Measure Y")) + test_y.connect("clicked", self.start_calibration, "y") + pobox.pack_start(test_y, True, True, 5) + test_both = self._gtk.Button(_("Measure Both")) + test_both.connect("clicked", self.start_calibration, "both") + pobox.pack_start(test_both, True, True, 5) + self.labels['popover'] = Gtk.Popover() + self.labels['popover'].add(pobox) + self.labels['popover'].set_position(Gtk.PositionType.LEFT) + + def on_popover_clicked(self, widget): + self.labels['popover'].set_relative_to(widget) + self.labels['popover'].show_all() + + def start_calibration(self, widget, method): + self.labels['popover'].popdown() + if self._screen.printer.get_stat("toolhead", "homed_axes") != "xyz": + self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME) + self.calibrating_axis = method + if method == "x": + self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE AXIS=X') + if method == "y": + self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE AXIS=Y') + if method == "both": + self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE') + + self.calibrate_btn.set_label(self.lang.gettext('Calibrating...')) self.calibrate_btn.set_sensitive(False) def set_opt_value(self, widget, opt, *args): @@ -156,48 +139,62 @@ def set_opt_value(self, widget, opt, *args): ) ) - def save_config(self, *_): - self._screen._ws.klippy.gcode_script( - 'SAVE_CONFIG' + def save_config(self): + _ = self.lang.gettext + script = {"script": "SAVE_CONFIG"} + self._screen._confirm_send_action( + None, + _("Save configuration?") + "\n\n" + _("Klipper will reboot"), + "printer.gcode.script", + script ) def activate(self): - self.get_updates() + # This will return the current values + self._screen._ws.klippy.gcode_script( + 'SET_INPUT_SHAPER' + ) + # Check for the accelerometer self._screen._ws.klippy.gcode_script( 'ACCELEROMETER_QUERY' ) + # Send at least two commands, with my accelerometer the first command after a reboot will fail + self._screen._ws.klippy.gcode_script( + 'MEASURE_AXES_NOISE' + ) def process_update(self, action, data): + _ = self.lang.gettext if action == "notify_gcode_response": - self.status.set_text('Status: {}'.format(data.replace('shaper_', '').replace('damping_', ''))) - if 'got 0' in data.lower(): - self.calibrate_btn.set_label(self.lang.gettext('Проверка связи с ADXL345')) + self.status.set_text('{}'.format(data.replace('shaper_', '').replace('damping_', ''))) + data = data.lower() + if 'got 0' in data: + self.calibrate_btn.set_label(_('Check ADXL Wiring')) self.calibrate_btn.set_sensitive(False) - if 'Unknown command:"ACCELEROMETER_QUERY"'.lower() in data.lower(): - self.calibrate_btn.set_label(self.lang.gettext('ADXL Не обнаружен')) + if 'unknown command:"accelerometer_query"' in data: + self.calibrate_btn.set_label(_('ADXL Not Configured')) self.calibrate_btn.set_sensitive(False) - if 'must home' in data.lower(): - self.calibrate_btn.set_label(self.CALIBRATE_TEXT) - self.calibrate_btn.set_sensitive(True) - if 'adxl345 values' in data.lower(): + if 'adxl345 values' in data or 'axes noise' in data: self.has_sensor = True self.calibrate_btn.set_sensitive(True) - self.calibrate_btn.set_label(self.CALIBRATE_TEXT) - if 'Recommended shaper_type_' in data: + self.calibrate_btn.set_label(_('Auto-calibrate')) + # Recommended shaper_type_y = ei, shaper_freq_y = 48.4 Hz + if 'recommended shaper_type_' in data: results = re.search(r'shaper_type_(?P[xy])\s*=\s*(?P.*?), shaper_freq_.\s*=\s*(' r'?P[0-9.]+)', data).groupdict() self.freq_xy_adj['shaper_freq_' + results['axis']].set_value(float(results['shaper_freq'])) self.freq_xy_combo['shaper_type_' + results['axis']].set_active(SHAPERS.index(results['shaper_type'])) - if results['axis'] == 'y': - self.set_opt_value(None, None) - self.calibrate_btn.set_label(self.lang.gettext('Перезагрузка...')) + if self.calibrating_axis == results['axis']: + self.calibrate_btn.set_sensitive(True) + self.calibrate_btn.set_label(_('Calibrated')) self.save_config() - - def get_updates(self): - config = self._screen.apiclient.send_request("printer/objects/query?configfile") - input_shaper_config = config['result']['status']['configfile']['settings']['input_shaper'] - for _ in XY_FREQ: - self.freq_xy_adj[_['config']].set_value(input_shaper_config[_['config']]) - shaper_slug = _['config'].replace('_freq_', '_type_') - self.freq_xy_combo[shaper_slug].set_active(SHAPERS.index(input_shaper_config[shaper_slug])) - self.freq_xy_combo[shaper_slug].connect("changed", self.set_opt_value, shaper_slug) \ No newline at end of file + elif self.calibrating_axis == "both" and results['axis'] == 'y': + self.calibrate_btn.set_sensitive(True) + self.calibrate_btn.set_label(_('Calibrated')) + self.save_config() + # shaper_type_y:ei shaper_freq_y:48.400 damping_ratio_y:0.100000 + if 'shaper_type_' in data: + results = re.search(r'shaper_type_(?P[xy]):(?P.*?) shaper_freq_.:(' + r'?P[0-9.]+)', data).groupdict() + self.freq_xy_adj['shaper_freq_' + results['axis']].set_value(float(results['shaper_freq'])) + self.freq_xy_combo['shaper_type_' + results['axis']].set_active(SHAPERS.index(results['shaper_type'])) diff --git a/panels/job_status.py b/panels/job_status.py index b7abe3a27..a330f8807 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -5,7 +5,7 @@ import os gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import GLib, Gtk, Pango from ks_includes.screen_panel import ScreenPanel @@ -17,7 +17,8 @@ class JobStatusPanel(ScreenPanel): filename = None file_metadata = {} progress = 0 - state = "printing" + state = "standby" + zoffset = 0 def __init__(self, screen, title, back=False): super().__init__(screen, title, False) @@ -25,7 +26,7 @@ def __init__(self, screen, title, back=False): def initialize(self, panel_name): _ = self.lang.gettext self.timeleft_type = "file" - self.timeout = None + self.state_timeout = None self.close_timeouts = [] self.create_buttons() @@ -51,6 +52,7 @@ def initialize(self, panel_name): self.labels['status'].set_halign(Gtk.Align.START) self.labels['status'].set_vexpand(False) self.labels['status'].get_style_context().add_class("printing-status") + self.labels['status'].set_line_wrap(True) self.labels['lcdmessage'] = Gtk.Label("") self.labels['lcdmessage'].set_halign(Gtk.Align.START) self.labels['lcdmessage'].set_vexpand(False) @@ -85,7 +87,7 @@ def initialize(self, panel_name): overlay.add(self.labels['darea']) overlay.add_overlay(box) - self.labels['thumbnail'] = self._gtk.Image("file.svg", False, 1.6, 1.6) + self.labels['thumbnail'] = self._gtk.Image("file", 2) i = 0 for extruder in self._printer.get_tools(): @@ -93,7 +95,7 @@ def initialize(self, panel_name): self.labels[extruder] = Gtk.Label(label="") self.labels[extruder].get_style_context().add_class("printing-info") if i <= 4: - ext_img = self._gtk.Image("extruder-%s.svg" % i, None, .6, .6) + ext_img = self._gtk.Image("extruder-%s" % i, .6) self.labels[extruder + '_box'].add(ext_img) self.labels[extruder + '_box'].add(self.labels[extruder]) i += 1 @@ -102,7 +104,7 @@ def initialize(self, panel_name): self.current_extruder = self._printer.get_stat("toolhead", "extruder") temp_grid.attach(self.labels[self.current_extruder + '_box'], 0, 0, 1, 1) if self._printer.has_heated_bed(): - heater_bed = self._gtk.Image("bed.svg", None, .6, .6) + heater_bed = self._gtk.Image("bed", .6) self.labels['heater_bed'] = Gtk.Label(label="") self.labels['heater_bed'].get_style_context().add_class("printing-info") heater_bed_box = Gtk.Box(spacing=0) @@ -112,7 +114,7 @@ def initialize(self, panel_name): self.labels['temp_grid'] = temp_grid # Create time remaining items - hourglass = self._gtk.Image("hourglass.svg", None, .6, .6) + hourglass = self._gtk.Image("hourglass", .6) self.labels['left'] = Gtk.Label(label=_("Left:")) self.labels['left'].get_style_context().add_class("printing-info") self.labels['time_left'] = Gtk.Label(label="0s") @@ -124,21 +126,28 @@ def initialize(self, panel_name): self.labels['itl_box'] = itl_box # Create overall items - clock = self._gtk.Image("clock.svg", None, .6, .6) + clock = self._gtk.Image("clock", .6) self.labels['elapsed'] = Gtk.Label(label=_("Elapsed:")) self.labels['elapsed'].get_style_context().add_class("printing-info") self.labels['duration'] = Gtk.Label(label="0s") self.labels['duration'].get_style_context().add_class("printing-info") - self.labels['est_time'] = Gtk.Label(label="/ 0s") + self.labels['total'] = Gtk.Label(label=_("/")) + self.labels['total'].get_style_context().add_class("printing-info") + self.labels['est_time'] = Gtk.Label(label="0s") self.labels['est_time'].get_style_context().add_class("printing-info") - it_box = Gtk.Box(spacing=0) - it_box.add(clock) - it_box.add(self.labels['elapsed']) - it_box.add(self.labels['duration']) - it_box.add(self.labels['est_time']) - self.labels['it_box'] = it_box - - position = self._gtk.Image("move.svg", None, .6, .6) + timegrid = Gtk.Grid() + it1_box = Gtk.Box(spacing=0) + it1_box.add(self.labels['elapsed']) + it1_box.add(self.labels['duration']) + it2_box = Gtk.Box(spacing=0) + it1_box.add(self.labels['total']) + it1_box.add(self.labels['est_time']) + timegrid.attach(clock, 0, 0, 1, 2) + timegrid.attach(it1_box, 1, 1, 1, 1) + timegrid.attach(it2_box, 1, 1, 1, 1) + self.labels['timegrid'] = timegrid + + position = self._gtk.Image("move", .6) self.labels['pos_x'] = Gtk.Label(label="X: 0") self.labels['pos_x'].get_style_context().add_class("printing-info") self.labels['pos_y'] = Gtk.Label(label="Y: 0") @@ -155,19 +164,19 @@ def initialize(self, panel_name): pos_box.add(posgrid) self.labels['pos_box'] = pos_box - speed = self._gtk.Image("speed+.svg", None, .6, .6) + speed = self._gtk.Image("speed+", .6) self.labels['speed'] = Gtk.Label(label="") self.labels['speed'].get_style_context().add_class("printing-info") speed_box = Gtk.Box(spacing=0) speed_box.add(speed) speed_box.add(self.labels['speed']) - extrusion = self._gtk.Image("extrude.svg", None, .6, .6) + extrusion = self._gtk.Image("extrude", .6) self.labels['extrusion'] = Gtk.Label(label="") self.labels['extrusion'].get_style_context().add_class("printing-info") extrusion_box = Gtk.Box(spacing=0) extrusion_box.add(extrusion) extrusion_box.add(self.labels['extrusion']) - fan = self._gtk.Image("fan.svg", None, .6, .6) + fan = self._gtk.Image("fan", .6) self.labels['fan'] = Gtk.Label(label="") self.labels['fan'].get_style_context().add_class("printing-info") fan_box = Gtk.Box(spacing=0) @@ -189,8 +198,12 @@ def initialize(self, panel_name): self.labels['i2_box'].get_style_context().add_class("printing-info-box") self.labels['i2_box'].set_valign(Gtk.Align.CENTER) self.labels['info_grid'] = self._gtk.HomogeneousGrid() - self.labels['info_grid'].attach(self.labels['i1_box'], 0, 0, 2, 1) - self.labels['info_grid'].attach(self.labels['i2_box'], 2, 0, 3, 1) + if self._screen.vertical_mode: + self.labels['info_grid'].attach(self.labels['i1_box'], 0, 0, 1, 1) + self.labels['info_grid'].attach(self.labels['i2_box'], 0, 1, 1, 1) + else: + self.labels['info_grid'].attach(self.labels['i1_box'], 0, 0, 2, 1) + self.labels['info_grid'].attach(self.labels['i2_box'], 2, 0, 3, 1) grid.attach(overlay, 0, 0, 1, 1) grid.attach(fi_box, 1, 0, 3, 1) @@ -221,20 +234,10 @@ def on_draw(self, da, ctx): def activate(self): _ = self.lang.gettext - self.progress = 0 - self.enable_button("pause", "cancel", "resume") - - state = "printing" - self.update_text("status", _("Printing")) - ps = self._printer.get_stat("print_stats") - logging.debug("Act State: %s" % ps['state']) self.set_state(ps['state']) - - self.show_buttons_for_state() - - if self.timeout is None: - GLib.timeout_add(500, self.state_check) + if self.state_timeout is None: + self.state_timeout = GLib.timeout_add_seconds(1, self.state_check) def add_labels(self): for child in self.labels['i1_box'].get_children(): @@ -244,9 +247,9 @@ def add_labels(self): self.labels['i1_box'].add(self.labels['thumbnail']) self.labels['i2_box'].add(self.labels['temp_grid']) - self.labels['i2_box'].add(self.labels['pos_box']) + # self.labels['i2_box'].add(self.labels['pos_box']) self.labels['i2_box'].add(self.labels['sfe_grid']) - self.labels['i2_box'].add(self.labels['it_box']) + self.labels['i2_box'].add(self.labels['timegrid']) self.labels['i2_box'].add(self.labels['itl_box']) @@ -267,16 +270,23 @@ def create_buttons(self): self.labels['restart'].connect("clicked", self.restart) self.labels['resume'] = self._gtk.ButtonImage("resume", _("Resume"), "color1") self.labels['resume'].connect("clicked", self.resume) + self.labels['save_offset_probe'] = self._gtk.ButtonImage("home-z", _("Save Z") + "\n" + "Probe", "color1") + self.labels['save_offset_probe'].connect("clicked", self.save_offset_probe) + self.labels['save_offset_endstop'] = self._gtk.ButtonImage("home-z", _("Save Z") + "\n" + "Endstop", "color2") + self.labels['save_offset_endstop'].connect("clicked", self.save_offset_endstop) + + def save_offset_probe(self, widget): + self._screen._ws.klippy.gcode_script("Z_OFFSET_APPLY_PROBE") + self._screen._ws.klippy.gcode_script("SAVE_CONFIG") + + def save_offset_endstop(self, widget): + self._screen._ws.klippy.gcode_script("Z_OFFSET_APPLY_ENDSTOP") + self._screen._ws.klippy.gcode_script("SAVE_CONFIG") def restart(self, widget): if self.filename != "none": self._screen._ws.klippy.print_start(self.filename) - - for to in self.close_timeouts: - GLib.source_remove(to) - self.close_timeouts.remove(to) - if self.timeout is None: - self.timeout = GLib.timeout_add(500, self.state_check) + self.new_print() def resume(self, widget): self._screen._ws.klippy.print_resume(self._response_callback, "enable_button", "pause", "cancel") @@ -303,7 +313,7 @@ def cancel(self, widget): label.set_line_wrap(True) label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - dialog = self._gtk.Dialog(self._screen, buttons, label, self.cancel_confirm) + self._gtk.Dialog(self._screen, buttons, label, self.cancel_confirm) self.disable_button("pause", "cancel") def cancel_confirm(self, widget, response_id): @@ -314,6 +324,7 @@ def cancel_confirm(self, widget, response_id): return logging.debug("Canceling print") + self.set_state("cancelling") self.disable_button("pause", "resume", "cancel") self._screen._ws.klippy.print_cancel(self._response_callback) @@ -323,13 +334,17 @@ def _response_callback(self, response, method, params, func=None, *args): def close_panel(self, widget=None): logging.debug("Closing job_status panel") + self.remove_close_timeout() + self.state_check() + if self.state not in ["printing", "paused"]: + self._screen.printer_ready() + return False + + def remove_close_timeout(self): for to in self.close_timeouts: GLib.source_remove(to) self.close_timeouts.remove(to) - self._screen.printer_ready() - return False - def enable_button(self, *args): for arg in args: self.labels[arg].set_sensitive(True) @@ -344,14 +359,12 @@ def _callback_metadata(self, newfiles, deletedfiles, modifiedfiles): self._files.remove_file_callback(self._callback_metadata) def new_print(self): - if self.state in ["cancelled", "cancelling", "complete", "error"]: - for to in self.close_timeouts: - GLib.source_remove(to) - self.close_timeouts.remove(to) - if self.timeout is None: - GLib.timeout_add(500, self.state_check) - self._screen.wake_screen() - self.state_check() + self.remove_close_timeout() + if self.state_timeout is None: + self.state_timeout = GLib.timeout_add_seconds(1, self.state_check) + self._screen.wake_screen() + self.state_check() + def process_update(self, action, data): if action == "notify_gcode_response": @@ -359,6 +372,8 @@ def process_update(self, action, data): self.set_state("cancelling") elif "action:paused" in data: self.set_state("paused") + elif "action:resumed" in data: + self.set_state("printing") return elif action != "notify_status_update": return @@ -378,16 +393,7 @@ def process_update(self, action, data): ) ps = self._printer.get_stat("print_stats") - vsd = self._printer.get_stat("virtual_sdcard") - if 'display_status' in data and 'message' in data['display_status']: - self.update_message() - - if "print_stats" in data and "filename" in data['print_stats']: - if data['print_stats']['filename'] != self.filename and ( - self.state not in ["cancelling", "cancelled", "complete"]): - logging.debug("filename: '%s' '%s' status: %s" % - (self.filename, data['print_stats']['filename'], self.state)) - self.update_filename() + self.update_message() if "toolhead" in data: if "extruder" in data["toolhead"]: @@ -397,122 +403,159 @@ def process_update(self, action, data): self.current_extruder = data["toolhead"]["extruder"] self.labels['temp_grid'].attach(self.labels[self.current_extruder + '_box'], 0, 0, 1, 1) self._screen.show_all() - if "position" in data["toolhead"]: - self.labels['pos_x'].set_text("X: %.2f" % (data["toolhead"]["position"][0])) - self.labels['pos_y'].set_text("Y: %.2f" % (data["toolhead"]["position"][1])) - if "gcode_move" in data and "gcode_position" in data["gcode_move"]: - self.labels['pos_z'].set_text("Z: %.2f" % (data["gcode_move"]["gcode_position"][2])) if "gcode_move" in data: + if "gcode_position" in data["gcode_move"]: + self.labels['pos_x'].set_text("X: %.2f" % (data["gcode_move"]["gcode_position"][0])) + self.labels['pos_y'].set_text("Y: %.2f" % (data["gcode_move"]["gcode_position"][1])) + self.labels['pos_z'].set_text("Z: %.2f" % (data["gcode_move"]["gcode_position"][2])) if "extrude_factor" in data["gcode_move"]: - self.extrusion = int(data["gcode_move"]["extrude_factor"]*100) + self.extrusion = int(round(data["gcode_move"]["extrude_factor"]*100)) self.labels['extrusion'].set_text("%3d%%" % self.extrusion) if "speed_factor" in data["gcode_move"]: - self.speed = int(data["gcode_move"]["speed_factor"]*100) + self.speed = int(round(data["gcode_move"]["speed_factor"]*100)) self.labels['speed'].set_text("%3d%%" % self.speed) + if "homing_origin" in data["gcode_move"]: + self.zoffset = data["gcode_move"]["homing_origin"][2] if "fan" in data and "speed" in data['fan']: - self.fan = int(round(data['fan']['speed'], 2)*100) + self.fan = int(round(self._printer.get_fan_speed("fan", data['fan']['speed']), 2)*100) self.labels['fan'].set_text("%3d%%" % self.fan) - if self.state in ["cancelling", "cancelled", "complete", "error"]: + self.state_check() + if self.state not in ["printing", "paused"]: return - self.update_percent_complete() - self.update_text("duration", str(self._gtk.formatTimeString(ps['print_duration']))) + if ps['filename'] and (ps['filename'] != self.filename): + logging.debug("Changing filename: '%s' to '%s'" % (self.filename, ps['filename'])) + self.update_filename() + else: + self.update_percent_complete() - timeleft_type = self._config.get_config()['main'].get('print_estimate_method', 'file') - if timeleft_type != self.timeleft_type: - if self.timeleft_type == "duration": - self.labels['it_box'].add(self.labels['est_time']) - elif timeleft_type == "duration": - self.labels['it_box'].remove(self.labels['est_time']) - self.timeleft_type = timeleft_type - - if timeleft_type in ['filament', 'file', 'slicer']: - duration = ps['print_duration'] - if timeleft_type == "filament": - estimated_filament = (self.file_metadata['filament_total'] if "filament_total" in self.file_metadata - else 1) - total_duration = duration / (max(ps['filament_used'], 0.0001) / max(estimated_filament, 0.0001)) - elif timeleft_type == "file": - total_duration = duration / max(self.progress, 0.0001) - elif timeleft_type == "slicer": - total_duration = (self.file_metadata['estimated_time'] if "estimated_time" in self.file_metadata - else duration) - time_left = max(total_duration - duration, 0) - self.update_text("time_left", str(self._gtk.formatTimeString(time_left))) - self.update_text("est_time", "/ %s" % str(self._gtk.formatTimeString(total_duration))) + self.update_text("duration", str(self._gtk.formatTimeString(ps['print_duration']))) + self.update_text("time_left", self.calculate_time_left(ps['print_duration'], ps['filament_used'])) + + def calculate_time_left(self, duration=0, filament_used=0): + total_duration = None + if self.progress < 1: + slicer_time = filament_time = file_time = None + timeleft_type = self._config.get_config()['main'].get('print_estimate_method', 'auto') + slicer_correction = (self._config.get_config()['main'].getint('print_estimate_compensation', 100) / 100) + # speed_factor compensation based on empirical testing + spdcomp = math.sqrt(self.speed / 100) + + if "estimated_time" in self.file_metadata: + if self.file_metadata['estimated_time'] > 0: + slicer_time = (self.file_metadata['estimated_time'] * slicer_correction) / spdcomp + if slicer_time < duration: + slicer_time = None + + if "filament_total" in self.file_metadata: + if self.file_metadata['filament_total'] > 0 and filament_used > 0: + if self.file_metadata['filament_total'] > filament_used: + filament_time = duration / (filament_used / self.file_metadata['filament_total']) + if filament_time < duration: + filament_time = None + + if self.progress > 0: + file_time = duration / self.progress + + if timeleft_type == "file" and file_time is not None: + total_duration = file_time + elif timeleft_type == "filament" and filament_time is not None: + total_duration = filament_time + elif slicer_time is not None: + if timeleft_type == "slicer": + total_duration = slicer_time + else: + if filament_time is not None and self.progress > 0.14: + # Weighted arithmetic mean (Slicer is the most accurate) + total_duration = (slicer_time * 3 + filament_time + file_time) / 5 + else: + # At the begining file and filament are innacurate + total_duration = slicer_time + elif file_time is not None: + if filament_time is not None: + total_duration = (filament_time + file_time) / 2 + else: + total_duration = file_time + + if total_duration is None: + return "-" + self.update_text("est_time", str(self._gtk.formatTimeString(total_duration))) + return str(self._gtk.formatTimeString((total_duration - duration))) def state_check(self): ps = self._printer.get_stat("print_stats") + if ps['state'] == self.state: return True - _ = self.lang.gettext + if ps['state'] == "printing": + # _ = self.lang.gettext + # self._screen.show_popup_message(_("Ожидайте: идет процесс преднагрева и термостабилизации"), time = 180, level=1) if self.state == "cancelling": + # self._screen.show_popup_message(_("Ожидайте: процесс печати завершится в ближайшее время"), time = 50, level=1) return True self.set_state("printing") + self.update_filename() elif ps['state'] == "complete": self.progress = 1 self.update_progress() self.set_state("complete") self._screen.wake_screen() + self.remove_close_timeout() timeout = self._config.get_main_config().getint("job_complete_timeout", 30) if timeout != 0: - self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel)) + self.close_timeouts.append(GLib.timeout_add_seconds(timeout, self.close_panel)) return False elif ps['state'] == "error": + # self._screen.close_popup_message logging.debug("Error!") self.set_state("error") self.labels['status'].set_text("%s - %s" % (_("Error"), ps['message'])) self._screen.wake_screen() + self.remove_close_timeout() timeout = self._config.get_main_config().getint("job_error_timeout", 0) if timeout != 0: - self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel)) + self.close_timeouts.append(GLib.timeout_add_seconds(timeout, self.close_panel)) return False - elif ps['state'] == "cancelled" or ps['state'] == "standby": + elif ps['state'] == "cancelled": # Print was cancelled + # self._screen.close_popup_message self.set_state("cancelled") self._screen.wake_screen() + self.remove_close_timeout() timeout = self._config.get_main_config().getint("job_cancelled_timeout", 0) if timeout != 0: - self.close_timeouts.append(GLib.timeout_add(timeout * 1000, self.close_panel)) + self.close_timeouts.append(GLib.timeout_add_seconds(timeout, self.close_panel)) return False elif ps['state'] == "paused": + # self._screen.close_popup_message self.set_state("paused") - - # TODO: Remove this in the future - if self.filename != ps['filename']: - if ps['filename'] != "": - self.filename = ps['filename'] - self.file_metadata = {} - self.update_text("file", self.filename.split("/")[-1]) - else: - file = "Unknown" - self.update_text("file", "Unknown file") - + elif ps['state'] == "standby": + # self._screen.close_popup_message + self.set_state("standby") return True def set_state(self, state): _ = self.lang.gettext - - if self.state == state: - return - - logging.debug("Changing job_status state from '%s' to '%s'" % (self.state, state)) - self.state = state + if self.state != state: + logging.debug("Changing job_status state from '%s' to '%s'" % (self.state, state)) if state == "paused": self.update_text("status", _("Paused")) + # self._screen.close_popup_message elif state == "printing": self.update_text("status", _("Printing")) elif state == "cancelling": self.update_text("status", _("Cancelling")) - elif state == "cancelled": + elif state == "cancelled" or (state == "standby" and self.state == "cancelling"): self.update_text("status", _("Cancelled")) elif state == "complete": self.update_text("status", _("Complete")) + # self._screen.close_popup_message + self.state = state self.show_buttons_for_state() @@ -531,14 +574,22 @@ def show_buttons_for_state(self): self.labels['button_grid'].attach(self.labels['fine_tune'], 2, 0, 1, 1) self.labels['button_grid'].attach(self.labels['control'], 3, 0, 1, 1) self.enable_button("resume", "cancel") - elif self.state == "cancelling": - self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1) - self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1) - self.labels['button_grid'].attach(self.labels['restart'], 2, 0, 1, 1) - self.labels['button_grid'].attach(self.labels['menu'], 3, 0, 1, 1) - elif self.state == "error" or self.state == "complete" or self.state == "cancelled": - self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1) - self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1) + else: + if self.zoffset != 0: + endstop = (self._screen.printer.config_section_exists("stepper_z") and + not self._screen.printer.get_config_section("stepper_z")['endstop_pin'].startswith("probe")) + if endstop: + self.labels['button_grid'].attach(self.labels["save_offset_endstop"], 0, 0, 1, 1) + else: + self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1) + if (self._printer.config_section_exists("probe") or self._printer.config_section_exists("bltouch")): + self.labels['button_grid'].attach(self.labels["save_offset_probe"], 1, 0, 1, 1) + else: + self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1) + else: + self.labels['button_grid'].attach(Gtk.Label(""), 0, 0, 1, 1) + self.labels['button_grid'].attach(Gtk.Label(""), 1, 0, 1, 1) + self.labels['button_grid'].attach(self.labels['restart'], 2, 0, 1, 1) self.labels['button_grid'].attach(self.labels['menu'], 3, 0, 1, 1) self.show_all() @@ -560,7 +611,7 @@ def update_file_metadata(self): self.file_metadata = self._files.get_file_info(self.filename) logging.info("Update Metadata. File: %s Size: %s" % (self.filename, self.file_metadata['size'])) if "estimated_time" in self.file_metadata and self.timeleft_type == "slicer": - self.update_text("est_time", "/ %s" % + self.update_text("est_time", str(self._gtk.formatTimeString(self.file_metadata['estimated_time']))) if "thumbnails" in self.file_metadata: tmp = self.file_metadata['thumbnails'].copy() @@ -577,7 +628,7 @@ def update_image_text(self, label, text): self.labels[label]['l'].set_text(text) def update_percent_complete(self): - if self.state in ["cancelling", "cancelled", "complete", "error"]: + if self.state not in ["printing", "paused"]: return if "gcode_start_byte" in self.file_metadata: @@ -586,7 +637,6 @@ def update_percent_complete(self): self.file_metadata['gcode_start_byte'])) else: progress = self._printer.get_stat('virtual_sdcard', 'progress') - progress = round(progress, 2) if progress != self.progress: self.progress = progress @@ -602,9 +652,10 @@ def update_progress(self): def update_message(self): msg = self._printer.get_stat("display_status", "message") - self.labels['lcdmessage'].set_text("" if msg is None else msg) + if type(msg) == str: + self.labels['lcdmessage'].set_text(msg) def update_temp(self, x, temp, target): self.labels[x].set_markup( "%.1f/%.0f °C" % (temp, target) - ) + ) \ No newline at end of file diff --git a/panels/limits.py b/panels/limits.py index 000556da0..33dcc6954 100644 --- a/panels/limits.py +++ b/panels/limits.py @@ -2,11 +2,11 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return LimitsPanel(*args) @@ -16,72 +16,67 @@ class LimitsPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext - self.devices = {} - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) + self.limits = {} - # Create a grid for all devices - self.labels['devices'] = Gtk.Grid() - scroll.add(self.labels['devices']) + scroll = self._gtk.ScrolledWindow() - # Create a box to contain all of the above - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - box.set_vexpand(True) - box.pack_start(scroll, True, True, 0) + # Create a grid for all limits + self.grid = Gtk.Grid() + scroll.add(self.grid) conf = self._printer.get_config_section("printer") self.options = [ - {"name": _("Max Accelation"), "units": _("mm/s^2"), "option": "max_accel", - "value": self.stn(conf['max_accel'])}, + {"name": _("Max Acceleration"), "units": _("mm/s^2"), "option": "max_accel", + "max": self.stn(conf['max_accel'])}, {"name": _("Max Acceleration to Deceleration"), "units": _("mm/s^2"), "option": "max_accel_to_decel", - "value": self.stn(conf['max_accel_to_decel']) if "max_accel_to_decel" in conf else - round(self.stn(conf['max_accel'])/2)}, + "max": self.stn(conf['max_accel_to_decel']) if "max_accel_to_decel" in conf else + round(self.stn(conf['max_accel']) / 2)}, {"name": _("Max Velocity"), "units": _("mm/s"), "option": "max_velocity", - "value": self.stn(conf["max_velocity"])}, + "max": self.stn(conf["max_velocity"])}, {"name": _("Square Corner Velocity"), "units": _("mm/s"), "option": "square_corner_velocity", - "value": self.stn(conf['square_corner_velocity']) if "square_corner_velocity" in conf else 5} + "max": self.stn(conf['square_corner_velocity']) if "square_corner_velocity" in conf else 5} ] for opt in self.options: - self.add_option(opt['option'], opt['name'], opt['units'], opt['value']) + self.add_option(opt['option'], opt['name'], opt['units'], opt['max']) - self.content.add(box) + self.content.add(scroll) self.content.show_all() def stn(self, str): return int(float(str)) def process_update(self, action, data): - if (action != "notify_status_update"): + if action != "notify_status_update": return - for opt in self.devices: + for opt in self.limits: if "toolhead" in data and opt in data["toolhead"]: self.update_option(opt, data["toolhead"][opt]) def update_option(self, option, value): - if option not in self.devices: + if option not in self.limits: return - if self.devices[option]['scale'].has_grab(): + if self.limits[option]['scale'].has_grab(): return self.values[option] = int(value) - self.devices[option]['scale'].disconnect_by_func(self.set_opt_value) - self.devices[option]['scale'].set_value(self.values[option]) - self.devices[option]['scale'].connect("value-changed", self.set_opt_value, option) + self.limits[option]['scale'].disconnect_by_func(self.set_opt_value) + self.limits[option]['scale'].set_value(self.values[option]) + for opt in self.options: + if opt["option"] == option: + if self.values[option] > opt["max"]: + self.limits[option]['scale'].get_style_context().add_class("option_slider_max") + else: + self.limits[option]['scale'].get_style_context().remove_class("option_slider_max") + self.limits[option]['scale'].connect("button-release-event", self.set_opt_value, option) def add_option(self, option, optname, units, value): logging.info("Adding option: %s" % option) - frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) - frame.get_style_context().add_class("frame-item") - name = Gtk.Label() - name.set_markup("%s" % (optname)) + name.set_markup("%s (%s)" % (optname, units)) name.set_hexpand(True) name.set_vexpand(True) name.set_halign(Gtk.Align.START) @@ -89,7 +84,7 @@ def add_option(self, option, optname, units, value): name.set_line_wrap(True) name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - adj = Gtk.Adjustment(0, 0, value, 1, 5, 0) + adj = Gtk.Adjustment(0, 1, (value * 1.5), 1, 5, 0) self.values[option] = value scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj) scale.set_value(self.values[option]) @@ -97,38 +92,47 @@ def add_option(self, option, optname, units, value): scale.set_hexpand(True) scale.set_has_origin(True) scale.get_style_context().add_class("option_slider") - scale.connect("value-changed", self.set_opt_value, option) + scale.connect("button-release-event", self.set_opt_value, option) - labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - labels.add(name) - labels.add(scale) + reset = self._gtk.ButtonImage("refresh", None, "color1") + reset.connect("clicked", self.reset_value, option) + reset.set_hexpand(False) - dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - dev.set_hexpand(True) - dev.set_vexpand(False) - dev.add(labels) - frame.add(dev) + item = Gtk.Grid() + item.attach(name, 0, 0, 2, 1) + item.attach(scale, 0, 1, 1, 1) + item.attach(reset, 1, 1, 1, 1) - self.devices[option] = { + frame = Gtk.Frame() + frame.get_style_context().add_class("frame-item") + frame.add(item) + + self.limits[option] = { "row": frame, "scale": scale, } - devices = sorted(self.devices) - pos = devices.index(option) + limits = sorted(self.limits) + pos = limits.index(option) + + self.grid.insert_row(pos) + self.grid.attach(self.limits[option]['row'], 0, pos, 1, 1) + self.grid.show_all() - self.labels['devices'].insert_row(pos) - self.labels['devices'].attach(self.devices[option]['row'], 0, pos, 1, 1) - self.labels['devices'].show_all() + def reset_value(self, widget, option): + for x in self.options: + if x["option"] == option: + self.update_option(option, x["max"]) + self.set_opt_value(None, None, option) - def set_opt_value(self, widget, opt): - value = self.devices[opt]['scale'].get_value() + def set_opt_value(self, widget, event, opt): + value = self.limits[opt]['scale'].get_value() if opt == "max_accel": - self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT ACCEL=%s" % (value)) + self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT ACCEL=%s" % value) elif opt == "max_accel_to_decel": - self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT ACCEL_TO_DECEL=%s" % (value)) + self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT ACCEL_TO_DECEL=%s" % value) elif opt == "max_velocity": - self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT VELOCITY=%s" % (value)) + self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT VELOCITY=%s" % value) elif opt == "square_corner_velocity": - self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=%s" % (value)) + self._screen._ws.klippy.gcode_script("SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=%s" % value) \ No newline at end of file diff --git a/panels/main_menu.py b/panels/main_menu.py index a7ac9e0da..cad9c86a9 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -15,6 +15,7 @@ def __init__(self, screen, title, back=False): def initialize(self, panel_name, items, extrudercount): print("### Making MainMenu") + _ = self.lang.gettext grid = self._gtk.HomogeneousGrid() grid.set_hexpand(True) @@ -24,14 +25,14 @@ def initialize(self, panel_name, items, extrudercount): eq_grid = Gtk.Grid() eq_grid.set_hexpand(True) eq_grid.set_vexpand(True) - + self.heaters = [] i = 0 for x in self._printer.get_tools(): self.labels[x] = self._gtk.ButtonImage("extruder-"+str(i), self._gtk.formatTemperatureString(0, 0)) self.labels[x].connect("clicked", self.menu_item_clicked, "temperature", { - "name": "Temperature", + "name": _('Temperature'), "panel": "temperature" }) @@ -43,7 +44,7 @@ def initialize(self, panel_name, items, extrudercount): if h == "heater_bed": self.labels[h] = self._gtk.ButtonImage("bed", self._gtk.formatTemperatureString(0, 0)) self.labels[h].connect("clicked", self.menu_item_clicked, "temperature", { - "name": "Temperature", + "name": _('Temperature'), "panel": "temperature" }) @@ -77,10 +78,10 @@ def initialize(self, panel_name, items, extrudercount): self.content.add(self.grid) self.layout.show_all() - + def activate(self): return - + def process_update(self, action, data): if action != "notify_status_update": return @@ -98,4 +99,4 @@ def process_update(self, action, data): self._printer.get_dev_stat(h, "target"), None if h == "heater_bed" else " ".join(h.split(" ")[1:]) ) - return + return \ No newline at end of file diff --git a/panels/menu.py b/panels/menu.py index 7bc39d2d1..48de2425a 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -1,35 +1,44 @@ -import gettext import gi import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk from jinja2 import Environment, Template from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return MenuPanel(*args) + class MenuPanel(ScreenPanel): i = 0 + j2_data = None + def initialize(self, panel_name, display_name, items): _ = self.lang.gettext self.items = items self.create_menu_items() - self.grid = Gtk.Grid() - self.grid.set_row_homogeneous(True) - self.grid.set_column_homogeneous(True) - self.content.add(self.grid) + self.grid = self._gtk.HomogeneousGrid() + + scroll = self._gtk.ScrolledWindow() + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add(self.grid) + + self.content.add(scroll) def activate(self): self.j2_data = self._printer.get_printer_status_data() self.j2_data.update({ 'moonraker_connected': self._screen._ws.is_connected() }) - self.arrangeMenuItems(self.items, 4) + if self._screen.vertical_mode: + self.arrangeMenuItems(self.items, 3) + else: + self.arrangeMenuItems(self.items, 4) def arrangeMenuItems(self, items, columns, expandLast=False): for child in self.grid.get_children(): @@ -52,7 +61,6 @@ def arrangeMenuItems(self, items, columns, expandLast=False): self.grid.attach(self.labels[key], col, row, width, 1) i += 1 - return self.grid def create_menu_items(self): @@ -66,7 +74,7 @@ def create_menu_items(self): parsed_name = j2_temp.render() b = self._gtk.ButtonImage( - item['icon'], parsed_name, "color"+str((i % 4)+1) + item['icon'], parsed_name, "color" + str((i % 4) + 1) ) if item['panel'] is not False: b.connect("clicked", self.menu_item_clicked, item['panel'], item) @@ -86,6 +94,11 @@ def evaluate_enable(self, enable): if enable is False: return False + if enable == "{{ moonraker_connected }}": + logging.info("moonraker is_connected %s", self._screen._ws.is_connected()) + return self._screen._ws.is_connected() + + self.j2_data = self._printer.get_printer_status_data() try: logging.debug("Template: '%s'" % enable) logging.debug("Data: %s" % self.j2_data) @@ -96,4 +109,4 @@ def evaluate_enable(self, enable): return False except Exception: logging.debug("Error evaluating enable statement: %s", enable) - return False + return False \ No newline at end of file diff --git a/panels/move.py b/panels/move.py index d912ed170..0788b42da 100644 --- a/panels/move.py +++ b/panels/move.py @@ -128,4 +128,4 @@ def move(self, widget, axis, dir): KlippyGcodes.MOVE_RELATIVE, KlippyGcodes.MOVE, axis, dist, speed*60, "\nG90" if self._printer.get_stat("gcode_move", "absolute_coordinates") is True else "" ) - ) + ) \ No newline at end of file diff --git a/panels/network copy.py b/panels/network copy.py deleted file mode 100644 index 3a754dca5..000000000 --- a/panels/network copy.py +++ /dev/null @@ -1,437 +0,0 @@ -import gi -import json -import logging -import netifaces -import os -import re - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango -from ks_includes.screen_panel import ScreenPanel - -def create_panel(*args): - return NetworkPanel(*args) - -class NetworkPanel(ScreenPanel): - networks = {} - network_list = [] - - def initialize(self, menu): - _ = self.lang.gettext - self.show_add = False - - grid = self._gtk.HomogeneousGrid() - grid.set_hexpand(True) - - # Get Hostname - stream = os.popen('hostname -A') - hostname = stream.read() - # Get IP Address - gws = netifaces.gateways() - if "default" in gws and netifaces.AF_INET in gws["default"]: - self.interface = gws["default"][netifaces.AF_INET][1] - else: - ints = netifaces.interfaces() - if 'lo' in ints: - ints.pop(ints.index('lo')) - if (len(ints) > 0): - self.interface = ints[0] - else: - self.interface = 'lo' - - res = netifaces.ifaddresses(self.interface) - if netifaces.AF_INET in res and len(res[netifaces.AF_INET]) > 0: - ip = res[netifaces.AF_INET][0]['addr'] - else: - ip = "0.0.0.0" - - self.labels['networks'] = {} - - self.labels['interface'] = Gtk.Label() - self.labels['interface'].set_text(" %s: %s" % (_("Interface"), self.interface)) - self.labels['disconnect'] = self._gtk.Button(_("Disconnect"), "color2") - - - sbox = Gtk.Box() - sbox.set_hexpand(True) - sbox.set_vexpand(False) - sbox.add(self.labels['interface']) - # sbox.add(self.labels['disconnect']) - - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) - - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - box.set_vexpand(True) - - self.labels['networklist'] = Gtk.Grid() - self.files = {} - - if self._screen.wifi is not None and self._screen.wifi.is_initialized(): - box.pack_start(sbox, False, False, 0) - box.pack_start(scroll, True, True, 0) - - GLib.idle_add(self.load_networks) - scroll.add(self.labels['networklist']) - - self._screen.wifi.add_callback("connected", self.connected_callback) - self._screen.wifi.add_callback("scan_results", self.scan_callback) - self.timeout = GLib.timeout_add_seconds(5, self.update_all_networks) - else: - self.labels['networkinfo'] = Gtk.Label("") - self.labels['networkinfo'].get_style_context().add_class('temperature_entry') - box.pack_start(self.labels['networkinfo'], False, False, 0) - self.update_single_network_info() - self.timeout = GLib.timeout_add_seconds(5, self.update_single_network_info) - - self.content.add(box) - self.labels['main_box'] = box - - def load_networks(self): - networks = self._screen.wifi.get_networks() - - conn_ssid = self._screen.wifi.get_connected_ssid() - if conn_ssid in networks: - networks.remove(conn_ssid) - self.add_network(conn_ssid, False) - - for net in networks: - self.add_network(net, False) - - self.update_all_networks() - self.content.show_all() - - def add_network(self, ssid, show=True): - _ = self.lang.gettext - - if ssid is None: - return - ssid = ssid.strip() - - if ssid in list(self.networks): - logging.info("SSID already listed") - return - - netinfo = self._screen.wifi.get_network_info(ssid) - if netinfo is None: - logging.debug("Couldn't get netinfo") - return - - configured_networks = self._screen.wifi.get_supplicant_networks() - network_id = -1 - for net in list(configured_networks): - if configured_networks[net]['ssid'] == ssid: - network_id = net - - frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) - frame.get_style_context().add_class("frame-item") - - - name = Gtk.Label() - name.set_markup("%s" % (ssid)) - name.set_hexpand(True) - name.set_halign(Gtk.Align.START) - name.set_line_wrap(True) - name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - - info = Gtk.Label() - info.set_halign(Gtk.Align.START) - # info.set_markup(self.get_file_info_str(ssid)) - labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - labels.add(name) - labels.add(info) - labels.set_vexpand(True) - labels.set_valign(Gtk.Align.CENTER) - labels.set_halign(Gtk.Align.START) - - connect = self._gtk.ButtonImage("load", None, "color3") - connect.connect("clicked", self.connect_network, ssid) - connect.set_hexpand(False) - connect.set_halign(Gtk.Align.END) - - delete = self._gtk.ButtonImage("delete", "", "color3") - delete.connect("clicked", self.remove_wifi_network, ssid) - delete.set_size_request(60, 0) - delete.set_hexpand(False) - delete.set_halign(Gtk.Align.END) - - network = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - network.set_hexpand(True) - network.set_vexpand(False) - - network.add(labels) - - buttons = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - if network_id != -1: - buttons.pack_end(delete, False, False, 0) - if netinfo['connected'] is False: - buttons.pack_end(connect, False, False, 0) - - network.add(buttons) - - self.networks[ssid] = frame - frame.add(network) - - reverse = False - - pos = 0 - if netinfo['connected'] is True: - pos = 0 - else: - connected_ssid = self._screen.wifi.get_connected_ssid() - nets = list(self.networks) - if connected_ssid is not None: - if connected_ssid in nets: - nets.remove(connected_ssid) - nets = sorted(nets, reverse=reverse) - pos = nets.index(ssid) - if connected_ssid is not None: - pos += 1 - - self.labels['networks'][ssid] = { - "connect": connect, - "delete": delete, - "info": info, - "name": name, - "row": network - } - - self.labels['networklist'].insert_row(pos) - self.labels['networklist'].attach(self.networks[ssid], 0, pos, 1, 1) - if show is True: - self.labels['networklist'].show() - - def add_new_network(self, widget, ssid, connect=False): - networks = self._screen.wifi.get_networks() - psk = self.labels['network_psk'].get_text() - result = self._screen.wifi.add_network(ssid, psk) - - self.close_add_network() - - if connect is True: - if result is True: - self.connect_network(widget, ssid, False) - else: - self._screen.show_popup_message("Error adding network %s" % ssid) - - def back(self): - if self.show_add is True: - self.close_add_network() - return True - return False - - def check_missing_networks(self): - networks = self._screen.wifi.get_networks() - for net in list(self.networks): - if net in networks: - networks.remove(net) - - for net in networks: - self.add_network(net) - self.labels['networklist'].show_all() - - def close_add_network(self): - if self.show_add is False: - return - - for child in self.content.get_children(): - self.content.remove(child) - self.content.add(self.labels['main_box']) - self.content.show() - for i in ['add_network', 'network_psk']: - if i in self.labels: - del self.labels[i] - self.show_add = False - - def close_dialog(self, widget, response_id): - widget.destroy() - - def connected_callback(self, ssid, prev_ssid): - logging.info("Now connected to a new network") - if ssid is not None: - self.remove_network(ssid) - if prev_ssid is not None: - self.remove_network(prev_ssid) - - self.check_missing_networks() - - def connect_network(self, widget, ssid, showadd=True): - _ = self.lang.gettext - - snets = self._screen.wifi.get_supplicant_networks() - isdef = False - for id, net in snets.items(): - if net['ssid'] == ssid: - isdef = True - break - - if isdef is False: - if showadd is True: - self.show_add_network(widget, ssid) - return - self.prev_network = self._screen.wifi.get_connected_ssid() - - buttons = [ - {"name": _("Close"), "response": Gtk.ResponseType.CANCEL} - ] - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_hexpand(True) - scroll.set_vexpand(True) - scroll.set_size_request(800, 400) - self.labels['connecting_info'] = Gtk.Label(_("Starting WiFi Re-association")) - self.labels['connecting_info'].set_halign(Gtk.Align.START) - self.labels['connecting_info'].set_valign(Gtk.Align.START) - scroll.add(self.labels['connecting_info']) - dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.close_dialog) - self._screen.show_all() - - if ssid in self.networks: - self.remove_network(ssid) - if self.prev_network in self.networks: - self.remove_network(self.prev_network) - # GLib.timeout_add(500, self.add_network, self.prev_network) - - self._screen.wifi.add_callback("connecting_status", self.connecting_status_callback) - self._screen.wifi.connect(ssid) - - def connecting_status_callback(self, msg): - self.labels['connecting_info'].set_text(self.labels['connecting_info'].get_text() + "\n" + msg) - self.labels['connecting_info'].show_all() - - def remove_network(self, ssid, show=True): - if ssid not in self.networks: - return - - i = 0 - while self.labels['networklist'].get_child_at(0, i) is not None: - if self.networks[ssid] == self.labels['networklist'].get_child_at(0, i): - self.labels['networklist'].remove_row(i) - self.labels['networklist'].show() - del self.networks[ssid] - del self.labels['networks'][ssid] - return - i = i+1 - return - - def remove_network_wid(self, widget, ssid): - self.remove_network(ssid) - - def remove_wifi_network(self, widget, ssid): - self._screen.wifi.delete_network(ssid) - self.remove_network(ssid) - self.check_missing_networks() - - def scan_callback(self, new_networks, old_networks): - for net in old_networks: - self.remove_network(net, False) - for net in new_networks: - self.add_network(net, False) - self.content.show_all() - - def show_add_network(self, widget, ssid): - if self.show_add is True: - return - - _ = self.lang.gettext - for child in self.content.get_children(): - self.content.remove(child) - - if "add_network" in self.labels: - del self.labels['add_network'] - - self.labels['add_network'] = Gtk.VBox() - self.labels['add_network'].set_valign(Gtk.Align.START) - - box = Gtk.Box(spacing=5) - box.set_size_request(self._gtk.get_content_width(), self._gtk.get_content_height() - - self._screen.keyboard_height - 20) - box.set_hexpand(True) - box.set_vexpand(False) - self.labels['add_network'].add(box) - - label = self._gtk.Label("%s %s:" % (_("PSK for"), ssid)) - label.set_hexpand(False) - entry = Gtk.Entry() - entry.set_hexpand(True) - - save = self._gtk.ButtonImage("sd", _("Save"), "color3") - save.set_hexpand(False) - save.connect("clicked", self.add_new_network, ssid, True) - - - self.labels['network_psk'] = entry - box.pack_start(label, False, False, 5) - box.pack_start(entry, True, True, 5) - box.pack_start(save, False, False, 5) - - self.show_create = True - self.labels['network_psk'].set_text('') - self.content.add(self.labels['add_network']) - self._screen.show_keyboard() - self.labels['network_psk'].grab_focus_without_selecting() - self.content.show_all() - self.show_add = True - - def update_all_networks(self): - for network in list(self.networks): - self.update_network_info(network) - return True - - def update_network_info(self, ssid): - _ = self.lang.gettext - - if ssid not in self.networks or ssid not in self.labels['networks']: - return - netinfo = self._screen.wifi.get_network_info(ssid) - if netinfo is None: - logging.debug("Couldn't get netinfo for update") - return - - connected = "" - if netinfo['connected'] is True: - stream = os.popen('hostname -f') - hostname = stream.read().strip() - ifadd = netifaces.ifaddresses(self.interface) - ipv4 = "" - ipv6 = "" - if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: - ipv4 = "%s: %s " % (_("IP"), ifadd[netifaces.AF_INET][0]['addr']) -# if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0: -# ipv6 = ipv6 = "%s: %s " % (_("IPv6"), ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) - connected = "%s\n%s%s\n" % (_("Подключено"), ipv4, ipv6) - elif "psk" in netinfo: - connected = "Password saved." - freq = "2.4 GHz" if netinfo['frequency'][0:1] == "2" else "5 Ghz" - - self.labels['networks'][ssid]['info'].set_markup("%s%s %s" % ( - connected, "" if netinfo['encryption'] == "off" else netinfo['encryption'].upper(), freq - )) - -# self.labels['networks'][ssid]['info'].set_markup("%s%s %s %s %s %s%s" % ( -# connected, "" if netinfo['encryption'] == "off" else netinfo['encryption'].upper(), -# freq, _("Channel"), netinfo['channel'], netinfo['signal_level_dBm'], _("dBm") -# )) -# self.labels['networks'][ssid]['info'].show_all() - - def update_single_network_info(self): - _ = self.lang.gettext - - stream = os.popen('hostname -f') - hostname = stream.read().strip() - ifadd = netifaces.ifaddresses(self.interface) - ipv4 = "" - ipv6 = "" - if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: - ipv4 = "%s: %s " % (_("IP"), ifadd[netifaces.AF_INET][0]['addr']) - if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0: - ipv6 = ipv6 = "%s: %s " % (_("IPv6"), ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) - connected = "%s\n\n%s\n%s: %s\n%s\n%s\n" % ( - self.interface, _("Connected"), _("Hostname"), hostname, ipv4, ipv6) - - self.labels['networkinfo'].set_markup(connected) - self.labels['networkinfo'].show_all() diff --git a/panels/network.py b/panels/network.py index 7480b4e26..36e09f592 100644 --- a/panels/network.py +++ b/panels/network.py @@ -1,31 +1,37 @@ import gi -import json import logging import netifaces import os -import re +from ks_includes.wifi import WifiManager gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return NetworkPanel(*args) + class NetworkPanel(ScreenPanel): - networks = {} - network_list = [] + initialized = False def initialize(self, menu): _ = self.lang.gettext self.show_add = False + self.networks = {} + self.update_timeout = None + + self.network_interfaces = netifaces.interfaces() + self.wireless_interfaces = [int for int in self.network_interfaces if int.startswith('w')] + self.wifi = None + if len(self.wireless_interfaces) > 0: + logging.info("Found wireless interfaces: %s" % self.wireless_interfaces) + self.wifi = WifiManager(self.wireless_interfaces[0]) grid = self._gtk.HomogeneousGrid() grid.set_hexpand(True) - # Get Hostname - stream = os.popen('hostname -A') - hostname = stream.read() # Get IP Address gws = netifaces.gateways() if "default" in gws and netifaces.AF_INET in gws["default"]: @@ -34,7 +40,7 @@ def initialize(self, menu): ints = netifaces.interfaces() if 'lo' in ints: ints.pop(ints.index('lo')) - if (len(ints) > 0): + if len(ints) > 0: self.interface = ints[0] else: self.interface = 'lo' @@ -43,60 +49,63 @@ def initialize(self, menu): if netifaces.AF_INET in res and len(res[netifaces.AF_INET]) > 0: ip = res[netifaces.AF_INET][0]['addr'] else: - ip = "0.0.0.0" + ip = None self.labels['networks'] = {} self.labels['interface'] = Gtk.Label() - self.labels['interface'].set_text(" %s: %s %s: %s" % (_("Interface"), self.interface,_("IP"), ip)) - self.labels['disconnect'] = self._gtk.Button(_("Disconnect"), "color2") - + self.labels['interface'].set_text(" %s: %s " % (_("Interface"), self.interface)) + self.labels['interface'].set_hexpand(True) + self.labels['ip'] = Gtk.Label() + self.labels['ip'].set_hexpand(True) + reload_networks = self._gtk.ButtonImage("refresh", None, "color1") + reload_networks.connect("clicked", self.reload_networks) + reload_networks.set_hexpand(False) sbox = Gtk.Box() sbox.set_hexpand(True) sbox.set_vexpand(False) - sbox.set_halign(Gtk.Align.CENTER) sbox.add(self.labels['interface']) - # sbox.add(self.labels['disconnect']) + if ip is not None: + self.labels['ip'].set_text("IP: %s " % ip) + sbox.add(self.labels['ip']) + sbox.add(reload_networks) - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) + scroll = self._gtk.ScrolledWindow() box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) box.set_vexpand(True) self.labels['networklist'] = Gtk.Grid() - self.files = {} - if self._screen.wifi is not None and self._screen.wifi.is_initialized(): - box.pack_start(sbox, False, False, 0) + if self.wifi is not None and self.wifi.is_initialized(): + box.pack_start(sbox, False, False, 5) box.pack_start(scroll, True, True, 0) GLib.idle_add(self.load_networks) scroll.add(self.labels['networklist']) - self._screen.wifi.add_callback("connected", self.connected_callback) - self._screen.wifi.add_callback("scan_results", self.scan_callback) - self.timeout = GLib.timeout_add_seconds(5, self.update_all_networks) + self.wifi.add_callback("connected", self.connected_callback) + self.wifi.add_callback("scan_results", self.scan_callback) + if self.update_timeout is None: + self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks) else: self.labels['networkinfo'] = Gtk.Label("") self.labels['networkinfo'].get_style_context().add_class('temperature_entry') box.pack_start(self.labels['networkinfo'], False, False, 0) self.update_single_network_info() - self.timeout = GLib.timeout_add_seconds(5, self.update_single_network_info) + if self.update_timeout is None: + self.update_timeout = GLib.timeout_add_seconds(5, self.update_single_network_info) self.content.add(box) self.labels['main_box'] = box + self.initialized = True def load_networks(self): - networks = self._screen.wifi.get_networks() + networks = self.wifi.get_networks() - conn_ssid = self._screen.wifi.get_connected_ssid() - if conn_ssid in networks: - networks.remove(conn_ssid) - self.add_network(conn_ssid, False) + if not networks: + return for net in networks: self.add_network(net, False) @@ -108,31 +117,38 @@ def add_network(self, ssid, show=True): _ = self.lang.gettext if ssid is None: + logging.info("SSID is None") return ssid = ssid.strip() - if ssid in list(self.networks): logging.info("SSID already listed") return - netinfo = self._screen.wifi.get_network_info(ssid) - if netinfo is None: - logging.debug("Couldn't get netinfo") - return - - configured_networks = self._screen.wifi.get_supplicant_networks() + configured_networks = self.wifi.get_supplicant_networks() network_id = -1 for net in list(configured_networks): if configured_networks[net]['ssid'] == ssid: network_id = net - frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) - frame.get_style_context().add_class("frame-item") + if ssid.startswith("\x00"): + display_name = _("Hidden") + else: + display_name = str(ssid) + + netinfo = self.wifi.get_network_info(ssid) + connected_ssid = self.wifi.get_connected_ssid() + if netinfo is None: + logging.debug("Couldn't get netinfo") + if connected_ssid == ssid: + netinfo = {'connected': True} + else: + netinfo = {'connected': False} + if connected_ssid == ssid: + display_name += " (" + _("Connected") + ")" - name = Gtk.Label() - name.set_markup("%s" % (ssid)) + name = Gtk.Label("") + name.set_markup("%s" % display_name) name.set_hexpand(True) name.set_halign(Gtk.Align.START) name.set_line_wrap(True) @@ -140,7 +156,6 @@ def add_network(self, ssid, show=True): info = Gtk.Label() info.set_halign(Gtk.Align.START) - # info.set_markup(self.get_file_info_str(ssid)) labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) labels.add(name) labels.add(info) @@ -166,31 +181,26 @@ def add_network(self, ssid, show=True): network.add(labels) buttons = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) - if network_id != -1: + if network_id != -1 or netinfo['connected']: buttons.pack_end(delete, False, False, 0) - if netinfo['connected'] is False: + else: buttons.pack_end(connect, False, False, 0) - network.add(buttons) + frame = Gtk.Frame() + frame.get_style_context().add_class("frame-item") self.networks[ssid] = frame frame.add(network) - reverse = False - - pos = 0 - if netinfo['connected'] is True: - pos = 0 - else: - connected_ssid = self._screen.wifi.get_connected_ssid() - nets = list(self.networks) - if connected_ssid is not None: - if connected_ssid in nets: - nets.remove(connected_ssid) - nets = sorted(nets, reverse=reverse) + nets = sorted(list(self.networks), reverse=False) + if connected_ssid in nets: + nets.remove(connected_ssid) + nets.insert(0, connected_ssid) + if nets.index(ssid) is not None: pos = nets.index(ssid) - if connected_ssid is not None: - pos += 1 + else: + logging.info("Error: SSID not in nets") + return self.labels['networks'][ssid] = { "connect": connect, @@ -202,40 +212,40 @@ def add_network(self, ssid, show=True): self.labels['networklist'].insert_row(pos) self.labels['networklist'].attach(self.networks[ssid], 0, pos, 1, 1) - if show is True: + if show: self.labels['networklist'].show() def add_new_network(self, widget, ssid, connect=False): - networks = self._screen.wifi.get_networks() + self._screen.remove_keyboard() psk = self.labels['network_psk'].get_text() - result = self._screen.wifi.add_network(ssid, psk) + result = self.wifi.add_network(ssid, psk) self.close_add_network() - if connect is True: - if result is True: + if connect: + if result: self.connect_network(widget, ssid, False) else: self._screen.show_popup_message("Error adding network %s" % ssid) def back(self): - if self.show_add is True: + if self.show_add: self.close_add_network() return True return False def check_missing_networks(self): - networks = self._screen.wifi.get_networks() + networks = self.wifi.get_networks() for net in list(self.networks): if net in networks: networks.remove(net) for net in networks: - self.add_network(net) + self.add_network(net, False) self.labels['networklist'].show_all() def close_add_network(self): - if self.show_add is False: + if not self.show_add: return for child in self.content.get_children(): @@ -262,18 +272,18 @@ def connected_callback(self, ssid, prev_ssid): def connect_network(self, widget, ssid, showadd=True): _ = self.lang.gettext - snets = self._screen.wifi.get_supplicant_networks() + snets = self.wifi.get_supplicant_networks() isdef = False for id, net in snets.items(): if net['ssid'] == ssid: isdef = True break - if isdef is False: - if showadd is True: + if not isdef: + if showadd: self.show_add_network(widget, ssid) return - self.prev_network = self._screen.wifi.get_connected_ssid() + self.prev_network = self.wifi.get_connected_ssid() buttons = [ {"name": _("Close"), "response": Gtk.ResponseType.CANCEL} @@ -283,47 +293,41 @@ def connect_network(self, widget, ssid, showadd=True): scroll.set_property("overlay-scrolling", False) scroll.set_hexpand(True) scroll.set_vexpand(True) - scroll.set_size_request(800, 400) - self.labels['connecting_info'] = Gtk.Label(_("Starting WiFi Re-association")) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.labels['connecting_info'] = Gtk.Label(_("Starting WiFi Association")) self.labels['connecting_info'].set_halign(Gtk.Align.START) self.labels['connecting_info'].set_valign(Gtk.Align.START) scroll.add(self.labels['connecting_info']) - dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.close_dialog) + self._gtk.Dialog(self._screen, buttons, scroll, self.close_dialog) self._screen.show_all() - if ssid in self.networks: + if ssid in list(self.networks): self.remove_network(ssid) - if self.prev_network in self.networks: + if self.prev_network in list(self.networks): self.remove_network(self.prev_network) - # GLib.timeout_add(500, self.add_network, self.prev_network) - self._screen.wifi.add_callback("connecting_status", self.connecting_status_callback) - self._screen.wifi.connect(ssid) + self.wifi.add_callback("connecting_status", self.connecting_status_callback) + self.wifi.connect(ssid) def connecting_status_callback(self, msg): self.labels['connecting_info'].set_text(self.labels['connecting_info'].get_text() + "\n" + msg) self.labels['connecting_info'].show_all() def remove_network(self, ssid, show=True): - if ssid not in self.networks: + if ssid not in list(self.networks): return - - i = 0 - while self.labels['networklist'].get_child_at(0, i) is not None: + logging.info(self.labels['networklist']) + for i in range(len(self.labels['networklist'])): if self.networks[ssid] == self.labels['networklist'].get_child_at(0, i): self.labels['networklist'].remove_row(i) self.labels['networklist'].show() del self.networks[ssid] del self.labels['networks'][ssid] return - i = i+1 - return - - def remove_network_wid(self, widget, ssid): - self.remove_network(ssid) def remove_wifi_network(self, widget, ssid): - self._screen.wifi.delete_network(ssid) + self.wifi.delete_network(ssid) self.remove_network(ssid) self.check_missing_networks() @@ -335,7 +339,7 @@ def scan_callback(self, new_networks, old_networks): self.content.show_all() def show_add_network(self, widget, ssid): - if self.show_add is True: + if self.show_add: return _ = self.lang.gettext @@ -359,15 +363,15 @@ def show_add_network(self, widget, ssid): label.set_hexpand(False) entry = Gtk.Entry() entry.set_hexpand(True) + entry.connect("activate", self.add_new_network, ssid, True) save = self._gtk.ButtonImage("sd", _("Save"), "color3") save.set_hexpand(False) save.connect("clicked", self.add_new_network, ssid, True) - self.labels['network_psk'] = entry box.pack_start(label, False, False, 5) - box.pack_start(entry, True, True, 2) + box.pack_start(entry, True, True, 5) box.pack_start(save, False, False, 5) self.show_create = True @@ -385,39 +389,43 @@ def update_all_networks(self): def update_network_info(self, ssid): _ = self.lang.gettext + info = freq = encr = chan = lvl = ipv4 = ipv6 = "" - if ssid not in self.networks or ssid not in self.labels['networks']: + if ssid not in list(self.networks) or ssid not in self.labels['networks']: + logging.info("Unknown SSID %s", ssid) return - netinfo = self._screen.wifi.get_network_info(ssid) + netinfo = self.wifi.get_network_info(ssid) if netinfo is None: - logging.debug("Couldn't get netinfo for update") - return + netinfo = [] + if "connected" in netinfo: + connected = netinfo['connected'] + else: + connected = False - connected = "" - if netinfo['connected'] is True: + if connected or self.wifi.get_connected_ssid() == ssid: stream = os.popen('hostname -f') hostname = stream.read().strip() ifadd = netifaces.ifaddresses(self.interface) - ipv4 = "" - ipv6 = "" if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: - ipv4 = "%s: %s " % (_("IP"), ifadd[netifaces.AF_INET][0]['addr']) -# if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0: -# ipv6 = ipv6 = "%s: %s " % (_("IPv6"), ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) - connected = "%s\n%s%s\n" % (_("Connected"), ipv4, ipv6) + ipv4 = "%s: %s " % ("IPv4", ifadd[netifaces.AF_INET][0]['addr']) + if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0: + ipv6 = "%s: %s " % ("IPv6", ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) + info = "%s: %s\n%s\n%s\n" % (_("Hostname"), hostname, ipv4, ipv6) elif "psk" in netinfo: - connected = "Password saved." - freq = "2.4 GHz" if netinfo['frequency'][0:1] == "2" else "5 Ghz" - - self.labels['networks'][ssid]['info'].set_markup("%s%s %s" % ( - connected, "" if netinfo['encryption'] == "off" else netinfo['encryption'].upper(), freq - )) - -# self.labels['networks'][ssid]['info'].set_markup("%s%s %s %s %s %s%s" % ( -# connected, "" if netinfo['encryption'] == "off" else netinfo['encryption'].upper(), -# freq, _("Channel"), netinfo['channel'], netinfo['signal_level_dBm'], _("dBm") -# )) -# self.labels['networks'][ssid]['info'].show_all() + info = _("Password saved") + if "encryption" in netinfo: + if netinfo['encryption'] != "off": + encr = netinfo['encryption'].upper() + if "frequency" in netinfo: + freq = "2.4 GHz" if netinfo['frequency'][0:1] == "2" else "5 Ghz" + if "channel" in netinfo: + chan = _("Channel") + " " + netinfo['channel'] + if "signal_level_dBm" in netinfo: + lvl = netinfo['signal_level_dBm'] + " " + _("dBm") + + self.labels['networks'][ssid]['info'].set_markup("%s %s %s %s %s" % ( + info, encr, freq, chan, lvl)) + self.labels['networks'][ssid]['info'].show_all() def update_single_network_info(self): _ = self.lang.gettext @@ -428,11 +436,32 @@ def update_single_network_info(self): ipv4 = "" ipv6 = "" if netifaces.AF_INET in ifadd and len(ifadd[netifaces.AF_INET]) > 0: - ipv4 = "%s: %s " % (_("IP"), ifadd[netifaces.AF_INET][0]['addr']) + ipv4 = "%s: %s " % ("IPv4", ifadd[netifaces.AF_INET][0]['addr']) if netifaces.AF_INET6 in ifadd and len(ifadd[netifaces.AF_INET6]) > 0: - ipv6 = ipv6 = "%s: %s " % (_("IPv6"), ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) + ipv6 = ipv6 = "%s: %s " % ("IPv6", ifadd[netifaces.AF_INET6][0]['addr'].split('%')[0]) connected = "%s\n\n%s\n%s: %s\n%s\n%s\n" % ( self.interface, _("Connected"), _("Hostname"), hostname, ipv4, ipv6) self.labels['networkinfo'].set_markup(connected) - self.labels['networkinfo'].show_all() \ No newline at end of file + self.labels['networkinfo'].show_all() + + def reload_networks(self, widget=None): + self.networks = {} + self.labels['networklist'].remove_column(0) + self.wifi.rescan() + if self.wifi is not None and self.wifi.is_initialized(): + GLib.idle_add(self.load_networks) + + def activate(self): + if self.initialized: + self.reload_networks() + if self.update_timeout is None: + if self.wifi is not None and self.wifi.is_initialized(): + self.update_timeout = GLib.timeout_add_seconds(5, self.update_all_networks) + else: + self.update_timeout = GLib.timeout_add_seconds(5, self.update_single_network_info) + + def deactivate(self): + if self.update_timeout is not None: + GLib.source_remove(self.update_timeout) + self.update_timeout = None diff --git a/panels/power.py b/panels/power.py index 33bbd20d5..98f90b933 100644 --- a/panels/power.py +++ b/panels/power.py @@ -2,23 +2,22 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return PowerPanel(*args) + class PowerPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext self.devices = {} # Create a scroll window for the power devices - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) + scroll = self._gtk.ScrolledWindow() # Create a grid for all devices self.labels['devices'] = Gtk.Grid() @@ -33,13 +32,20 @@ def initialize(self, panel_name): self.content.add(box) + def activate(self): + devices = self._screen.printer.get_power_devices() + for x in devices: + self.devices[x]['switch'].disconnect_by_func(self.on_switch) + self.devices[x]['switch'].set_active(True if self._screen.printer.get_power_device_status(x) == "on" + else False) + self.devices[x]['switch'].connect("notify::active", self.on_switch, x) + def add_device(self, device): frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) frame.get_style_context().add_class("frame-item") name = Gtk.Label() - name.set_markup("%s" % (device)) + name.set_markup("%s" % device) name.set_hexpand(True) name.set_vexpand(True) name.set_halign(Gtk.Align.START) @@ -51,8 +57,8 @@ def add_device(self, device): switch.set_hexpand(False) switch.set_active(True if self._screen.printer.get_power_device_status(device) == "on" else False) switch.connect("notify::active", self.on_switch, device) - switch.set_property("width-request", round(self._gtk.get_image_width()*2.5)) - switch.set_property("height-request", round(self._gtk.get_image_height()*1.25)) + switch.set_property("width-request", round(self._gtk.get_font_size() * 7)) + switch.set_property("height-request", round(self._gtk.get_font_size() * 3.5)) labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) labels.add(name) @@ -60,6 +66,7 @@ def add_device(self, device): dev = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) dev.set_hexpand(True) dev.set_vexpand(False) + dev.set_valign(Gtk.Align.CENTER) dev.add(labels) dev.add(switch) frame.add(dev) diff --git a/panels/preheat.py b/panels/preheat.py index 5213adbea..aee4be3c7 100644 --- a/panels/preheat.py +++ b/panels/preheat.py @@ -65,6 +65,7 @@ def initialize(self, panel_name): cooldown = self._gtk.ButtonImage('cool-down', _('Cooldown'), "color%d" % ((i % 4)+1)) cooldown.connect("clicked", self.set_temperature, "cooldown") + row = int(i/2) if i % 2 == 0 else int(i/2)+1 self.labels["control_grid"].attach(cooldown, i % 2, int(i/2), 1, 1) @@ -72,7 +73,7 @@ def initialize(self, panel_name): i += 1 temperature = self._gtk.ButtonImage('heat-up', _('Temperature'), "color%d" % ((i % 4)+1)) temperature.connect("clicked", self.menu_item_clicked, "temperature", { - "name": "Temperature", + "name": _('Temperature'), "panel": "temperature" }) self.labels["control_grid"].attach(temperature, i % 2, int(i/2), 1, 1) @@ -103,7 +104,9 @@ def select_heater(self, widget, heater): self.labels[heater].get_style_context().add_class('button_active') def set_temperature(self, widget, setting): + _ = self.lang.gettext if setting == "cooldown": + self._screen.show_popup_message(_("Принтер охлаждается"), time=10,level=1) for heater in self.active_heaters: logging.info("Setting %s to %d" % (heater, 0)) if heater.startswith('heater_generic '): @@ -150,4 +153,4 @@ def process_update(self, action, data): self._printer.get_dev_stat(h, "temperature"), self._printer.get_dev_stat(h, "target"), None if h == "heater_bed" else " ".join(h.split(" ")[1:]) - ) + ) \ No newline at end of file diff --git a/panels/print.py b/panels/print.py index 37c640040..9587c25b5 100644 --- a/panels/print.py +++ b/panels/print.py @@ -1,19 +1,19 @@ # -*- coding: utf-8 -*- import gi -import json -import humanize import logging +import os gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib, Pango from datetime import datetime -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return PrintPanel(*args) + class PrintPanel(ScreenPanel): cur_directory = "gcodes" dir_panels = {} @@ -35,9 +35,7 @@ def initialize(self, panel_name): sortdir = ["name", "asc"] self.sort_current = [sortdir[0], 0 if sortdir[1] == "asc" else 1] # 0 for asc, 1 for desc - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) + scroll = self._gtk.ScrolledWindow() sort = Gtk.Label() sort.set_text(_("Sort by: ")) @@ -55,7 +53,7 @@ def initialize(self, panel_name): sbox.add(s) i += 1 - refresh = self._gtk.ButtonImage("refresh", None, None, .5, .5) + refresh = self._gtk.ButtonImage("refresh", None, None, .5) refresh.connect('clicked', self._refresh_files) sbox.add(refresh) sbox.set_hexpand(True) @@ -85,9 +83,6 @@ def initialize(self, panel_name): self.content.add(box) self._screen.files.add_file_callback(self._callback) - - return - def activate(self): if self.cur_directory != "gcodes": self.change_dir(None, "gcodes") @@ -100,7 +95,6 @@ def add_directory(self, directory, show=True): if directory not in self.labels['directories']: frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) frame.get_style_context().add_class("frame-item") name = Gtk.Label() @@ -129,7 +123,7 @@ def add_directory(self, directory, show=True): file.set_hexpand(True) file.set_vexpand(False) - icon = self._gtk.Image("folder.svg", False, 1, 1) + icon = self._gtk.Image("folder", 1) file.add(icon) file.add(labels) @@ -171,13 +165,13 @@ def add_file(self, filepath, show=True): filename = filepath.split('/')[-1] for i in range(1, len(dir)): curdir = "/".join(dir[0:i]) - newdir = "/".join(dir[0:i+1]) + newdir = "/".join(dir[0:i + 1]) if newdir not in self.filelist[curdir]['directories']: self.add_directory(newdir) if filename not in self.filelist[directory]['files']: for i in range(1, len(dir)): - curdir = "/".join(dir[0:i+1]) + curdir = "/".join(dir[0:i + 1]) if curdir != "gcodes" and fileinfo['modified'] > self.filelist[curdir]['modified']: self.filelist[curdir]['modified'] = fileinfo['modified'] self.labels['directories'][curdir]['info'].set_markup( @@ -187,15 +181,14 @@ def add_file(self, filepath, show=True): if filepath not in self.files: frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) frame.get_style_context().add_class("frame-item") name = Gtk.Label() - name.set_markup("%s" % (filename)) + name.set_markup("%s" % (os.path.splitext(filename)[0].replace("_", " "))) name.set_hexpand(True) name.set_halign(Gtk.Align.START) name.set_line_wrap(True) - name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + name.set_line_wrap_mode(Pango.WrapMode.CHAR) info = Gtk.Label() info.set_halign(Gtk.Align.START) @@ -216,14 +209,17 @@ def add_file(self, filepath, show=True): file.set_hexpand(True) file.set_vexpand(False) - icon = self._gtk.Image("file.svg", False, 1.6, 1.6) - pixbuf = self.get_file_image(filepath) + icon = Gtk.Image() + pixbuf = self.get_file_image(filepath, small=True) if pixbuf is not None: icon.set_from_pixbuf(pixbuf) + else: + icon = self._gtk.Image("file", 1.6) file.add(icon) file.add(labels) - file.add(actions) + if os.path.splitext(filename)[1] in [".gcode", ".g", ".gco"]: + file.add(actions) frame.add(file) self.files[filepath] = frame @@ -292,7 +288,7 @@ def confirm_print(self, widget, filename): ] label = Gtk.Label() - label.set_markup("%s\n" % (filename)) + label.set_markup("%s\n" % filename) label.set_hexpand(True) label.set_halign(Gtk.Align.CENTER) label.set_vexpand(True) @@ -313,7 +309,7 @@ def confirm_print(self, widget, filename): grid.set_halign(Gtk.Align.CENTER) grid.set_valign(Gtk.Align.CENTER) - dialog = self._gtk.Dialog(self._screen, buttons, grid, self.confirm_print_response, filename) + self._gtk.Dialog(self._screen, buttons, grid, self.confirm_print_response, filename) def confirm_print_response(self, widget, response_id, filename): widget.destroy() @@ -321,7 +317,7 @@ def confirm_print_response(self, widget, response_id, filename): if response_id == Gtk.ResponseType.CANCEL: return - logging.info("Starting print: %s" % (filename)) + logging.info("Starting print: %s" % filename) self._screen._ws.klippy.print_start(filename) def delete_file(self, filename): @@ -357,15 +353,23 @@ def get_file_info_str(self, filename): if fileinfo is None: return - return "%s: %s - %s: %s\n%s: %s" % ( + return "%s: %s\n%s: %s\n%s: %s" % ( _("Uploaded"), datetime.fromtimestamp(fileinfo['modified']).strftime("%Y-%m-%d %H:%M"), _("Size"), - humanize.naturalsize(fileinfo['size']), + self.formatsize(fileinfo['size']), _("Print Time"), self.get_print_time(filename) ) + def formatsize(self, size): + size = float(size) + suffixes = ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] + for i, suffix in enumerate(suffixes, start=2): + unit = 1024 ** i + if size < unit: + return "%.1f %s" % ((1024 * size / unit), suffix) + def get_print_time(self, filename): fileinfo = self._screen.files.get_file_info(filename) if fileinfo is None: @@ -376,16 +380,16 @@ def get_print_time(self, filename): print_str = "" # Figure out how many days - print_val = int(print_time/86400) + print_val = int(print_time / 86400) if print_val > 0: print_str = "%sd " % print_val # Take remainder from days and divide by hours - print_val = int((print_time % 86400)/3600) + print_val = int((print_time % 86400) / 3600) if print_val > 0: print_str = "%s%sh " % (print_str, print_val) - print_val = int(((print_time % 86400) % 3600)/60) + print_val = int(((print_time % 86400) % 3600) / 60) print_str = "%s%sm" % (print_str, print_val) return print_str return "Unavailable" @@ -426,3 +430,9 @@ def _callback(self, newfiles, deletedfiles, updatedfiles=[]): def _refresh_files(self, widget): self._files.refresh_files() + + def process_update(self, action, data): + if action == "notify_gcode_response": + if "unknown" in data.lower(): + self._screen.show_popup_message("%s" % data) + return diff --git a/panels/printer_select.py b/panels/printer_select.py index cdee0e9e2..3665a919d 100644 --- a/panels/printer_select.py +++ b/panels/printer_select.py @@ -2,16 +2,16 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from ks_includes.KlippyGcodes import KlippyGcodes +from gi.repository import Gtk from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.PrinterSelect") + def create_panel(*args): return PrinterSelect(*args) + class PrinterSelect(ScreenPanel): def __init__(self, screen, title, back=True, action_bar=True, printer_name=True): super().__init__(screen, title, False, False, False) @@ -21,13 +21,30 @@ def initialize(self, panel_name): printers = self._config.get_printers() - box = Gtk.Box() - self.content.add(box) - - i = 1 - for printer in printers: + grid = self._gtk.HomogeneousGrid() + scroll = self._gtk.ScrolledWindow() + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add(grid) + self.content.add(scroll) + + length = len(printers) + if length == 4: + # Arrange 2 x 2 + columns = 2 + elif 4 < length <= 6: + # Arrange 3 x 2 + columns = 3 + else: + columns = 4 + + for i, printer in enumerate(printers): name = list(printer)[0] - self.labels[name] = self._gtk.ButtonImage("extruder", name, "color%s" % (i % 4)) + self.labels[name] = self._gtk.ButtonImage("extruder", name, "color%s" % (1 + i % 4)) self.labels[name].connect("clicked", self._screen.connect_printer_widget, name) - box.add(self.labels[name]) - i += 1 + if self._screen.vertical_mode: + row = i % columns + col = int(i / columns) + else: + col = i % columns + row = int(i / columns) + grid.attach(self.labels[name], col, row, 1, 1) diff --git a/panels/retraction.py b/panels/retraction.py new file mode 100644 index 000000000..9ccf2788a --- /dev/null +++ b/panels/retraction.py @@ -0,0 +1,158 @@ +import gi +import logging +import re + +gi.require_version("Gtk", "3.0") +from gi.repository import Gdk, Gtk, Pango + +from ks_includes.screen_panel import ScreenPanel + + +def create_panel(*args): + return FWRetractionPanel(*args) + + +class FWRetractionPanel(ScreenPanel): + values = {} + list = {} + + def initialize(self, panel_name): + _ = self.lang.gettext + self.grid = Gtk.Grid() + + conf = self._printer.get_config_section("firmware_retraction") + + self.options = [ + {"name": _("Retraction Length"), + "units": _("mm"), + "option": "retract_length", + "value": float(conf['retract_length']) if 'retract_length' in conf else 0, + "digits": 2, + "maxval": 4}, + {"name": _("Retraction Speed"), + "units": _("mm/s"), + "option": "retract_speed", + "value": int(float((conf['retract_speed']))) if 'retract_speed' in conf else 20, + "digits": 0, + "maxval": 100}, + {"name": _("Unretract Extra Length"), + "units": _("mm"), + "option": "unretract_extra_length", + "value": float(conf['unretract_extra_length']) if 'unretract_extra_length' in conf else 0, + "digits": 2, + "maxval": 15}, + {"name": _("Unretract Speed"), + "units": _("mm/s"), + "option": "unretract_speed", + "value": int(float((conf['unretract_speed']))) if 'unretract_speed' in conf else 10, + "digits": 0, + "maxval": 60} + ] + + for opt in self.options: + self.add_option(opt['option'], opt['name'], opt['units'], opt['value'], opt['digits'], opt["maxval"]) + + scroll = self._gtk.ScrolledWindow() + scroll.add(self.grid) + + self.content.add(scroll) + self.content.show_all() + + def activate(self): + self._screen._ws.klippy.gcode_script("GET_RETRACTION") + + def process_update(self, action, data): + if action == "notify_status_update" and "firmware_retraction" in data: + for opt in self.list: + if opt in data["firmware_retraction"]: + self.update_option(opt, data["firmware_retraction"][opt]) + elif action == "notify_gcode_response": + # // RETRACT_LENGTH=0.00000 RETRACT_SPEED=20.00000 UNRETRACT_EXTRA_LENGTH=0.00000 UNRETRACT_SPEED=10.00000 + result = re.match( + "^// [RETRACT_LENGTH= ]+([\\-0-9\\.]+)" + + "[RETRACT_SPEED= ]+([\\-0-9\\.]+)" + + "[UNRETRACT_EXTRA_LENGTH= ]+([\\-0-9\\.]+)" + + "[UNRETRACT_SPEED= ]+([\\-0-9\\.]+)", + data + ) + if result: + self.update_option('retract_length', result.group(1)) + self.update_option('retract_speed', result.group(2)) + self.update_option('unretract_extra_length', result.group(3)) + self.update_option('unretract_speed', result.group(4)) + + def update_option(self, option, value): + if option not in self.list: + return + + if self.list[option]['scale'].has_grab(): + return + + self.values[option] = float(value) + self.list[option]['scale'].disconnect_by_func(self.set_opt_value) + self.list[option]['scale'].set_value(self.values[option]) + self.list[option]['scale'].connect("button-release-event", self.set_opt_value, option) + + def add_option(self, option, optname, units, value, digits, maxval): + logging.info("Adding option: %s" % option) + + name = Gtk.Label() + name.set_markup("%s (%s)" % (optname, units)) + name.set_hexpand(True) + name.set_vexpand(True) + name.set_halign(Gtk.Align.START) + name.set_valign(Gtk.Align.CENTER) + name.set_line_wrap(True) + name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + if option in ["retract_speed", "unretract_speed"]: + adj = Gtk.Adjustment(0, 1, maxval, 1, 5, 0) + else: + adj = Gtk.Adjustment(0, 0, maxval, 1, 5, 0) + self.values[option] = value + scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj) + scale.set_value(self.values[option]) + scale.set_digits(digits) + scale.set_hexpand(True) + scale.set_has_origin(True) + scale.get_style_context().add_class("option_slider") + scale.connect("button-release-event", self.set_opt_value, option) + + reset = self._gtk.ButtonImage("refresh", None, "color1") + reset.connect("clicked", self.reset_value, option) + reset.set_hexpand(False) + + item = Gtk.Grid() + item.attach(name, 0, 0, 2, 1) + item.attach(scale, 0, 1, 1, 1) + item.attach(reset, 1, 1, 1, 1) + + frame = Gtk.Frame() + frame.get_style_context().add_class("frame-item") + frame.add(item) + + self.list[option] = { + "row": frame, + "scale": scale, + } + + pos = sorted(self.list).index(option) + self.grid.attach(self.list[option]['row'], 0, pos, 1, 1) + self.grid.show_all() + + def reset_value(self, widget, option): + for x in self.options: + if x["option"] == option: + self.update_option(option, x["value"]) + self.set_opt_value(None, None, option) + + def set_opt_value(self, widget, event, opt): + value = self.list[opt]['scale'].get_value() + + if opt == "retract_speed": + self._screen._ws.klippy.gcode_script("SET_RETRACTION RETRACT_SPEED=%s" % value) + elif opt == "retract_length": + self._screen._ws.klippy.gcode_script("SET_RETRACTION RETRACT_LENGTH=%s" % value) + elif opt == "unretract_extra_length": + self._screen._ws.klippy.gcode_script("SET_RETRACTION UNRETRACT_EXTRA_LENGTH=%s" % value) + elif opt == "unretract_speed": + self._screen._ws.klippy.gcode_script("SET_RETRACTION UNRETRACT_SPEED=%s" % value) diff --git a/panels/screensaver.py b/panels/screensaver.py deleted file mode 100644 index 53a691054..000000000 --- a/panels/screensaver.py +++ /dev/null @@ -1,26 +0,0 @@ -import gi -import logging - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib - -from ks_includes.KlippyGcodes import KlippyGcodes -from ks_includes.screen_panel import ScreenPanel - -def create_panel(*args): - return ScreenSaverPanel(*args) - -class ScreenSaverPanel(ScreenPanel): - def initialize(self, panel_name): - _ = self.lang.gettext - - box = Gtk.Box() - box.set_hexpand(True) - box.set_vexpand(True) - box.set_halign(Gtk.Align.CENTER) - - label = Gtk.Label(_("Screen will show in less than one second")) - box.add(label) - - - self.layout = box diff --git a/panels/settings.py b/panels/settings.py index 5776a87e2..58475af3b 100644 --- a/panels/settings.py +++ b/panels/settings.py @@ -2,57 +2,40 @@ import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel + def create_panel(*args): return SettingsPanel(*args) + class SettingsPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext self.settings = {} - self.macros = {} - self.menu_cur = 'main_box' - self.menu = ['main_box'] + self.menu = ['settings_menu'] - self.labels['main_box'] = self.create_box('main') - self.labels['macros_box'] = self.create_box('macros') - - printbox = Gtk.Box(spacing=0) - printbox.set_vexpand(False) self.labels['add_printer_button'] = self._gtk.Button(_("Add Printer"), "color1") - self.labels['printers_box'] = self.create_box('printers', printbox) options = self._config.get_configurable_options().copy() - options.append({"macros": { - "name": _("Displayed Macros"), - "type": "menu", - "menu": "macros"} - }) options.append({"printers": { "name": _("Printer Connections"), "type": "menu", "menu": "printers" }}) + self.labels['settings_menu'] = self._gtk.ScrolledWindow() + self.labels['settings'] = Gtk.Grid() + self.labels['settings_menu'].add(self.labels['settings']) for option in options: name = list(option)[0] - self.add_option('main', self.settings, name, option[name]) - - for macro in self._printer.get_config_section_list("gcode_macro "): - macro = macro[12:] - self.macros[macro] = { - "name": macro, - "section": "displayed_macros %s" % self._screen.connected_printer, - "type": "macro" - } - - for macro in list(self.macros): - self.add_option('macros', self.macros, macro, self.macros[macro]) + self.add_option('settings', self.settings, name, option[name]) + self.labels['printers_menu'] = self._gtk.ScrolledWindow() + self.labels['printers'] = Gtk.Grid() + self.labels['printers_menu'].add(self.labels['printers']) self.printers = {} for printer in self._config.get_printers(): logging.debug("Printer: %s" % printer) @@ -66,7 +49,7 @@ def initialize(self, panel_name): } self.add_option("printers", self.printers, pname, self.printers[pname]) - self.content.add(self.labels['main_box']) + self.content.add(self.labels['settings_menu']) def activate(self): while len(self.menu) > 1: @@ -78,34 +61,15 @@ def back(self): return True return False - def create_box(self, name, insert=None): - # Create a scroll window for the macros - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) - - # Create a grid for all macros - self.labels[name] = Gtk.Grid() - scroll.add(self.labels[name]) - - # Create a box to contain all of the above - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - box.set_vexpand(True) - if insert is not None: - box.pack_start(insert, False, False, 0) - box.pack_start(scroll, True, True, 0) - return box - def add_option(self, boxname, opt_array, opt_name, option): if option['type'] is None: return frame = Gtk.Frame() - frame.set_property("shadow-type", Gtk.ShadowType.NONE) frame.get_style_context().add_class("frame-item") name = Gtk.Label() - name.set_markup("%s" % (option['name'])) + name.set_markup("%s" % (option['name'])) name.set_hexpand(True) name.set_vexpand(True) name.set_halign(Gtk.Align.START) @@ -122,20 +86,17 @@ def add_option(self, boxname, opt_array, opt_name, option): dev.set_valign(Gtk.Align.CENTER) dev.add(labels) - if option['type'] == "binary" or option['type'] == "macro": + if option['type'] == "binary": box = Gtk.Box() box.set_vexpand(False) switch = Gtk.Switch() switch.set_hexpand(False) switch.set_vexpand(False) - if option['type'] == "macro": - switch.set_active(self._config.get_config().getboolean(option['section'], opt_name, fallback=True)) - else: - switch.set_active(self._config.get_config().getboolean(option['section'], opt_name)) + switch.set_active(self._config.get_config().getboolean(option['section'], opt_name)) switch.connect("notify::active", self.switch_config_option, option['section'], opt_name, option['callback'] if "callback" in option else None) - switch.set_property("width-request", round(self._gtk.get_image_width()*2.5)) - switch.set_property("height-request", round(self._gtk.get_image_height()*1.25)) + switch.set_property("width-request", round(self._gtk.get_font_size() * 7)) + switch.set_property("height-request", round(self._gtk.get_font_size() * 3.5)) box.add(switch) dev.add(box) elif option['type'] == "dropdown": @@ -150,14 +111,15 @@ def add_option(self, boxname, opt_array, opt_name, option): option['callback'] if "callback" in option else None) dropdown.set_entry_text_column(0) dev.add(dropdown) - logging.debug("Children: %s" % dropdown.get_children()) elif option['type'] == "scale": + dev.set_orientation(Gtk.Orientation.VERTICAL) val = int(self._config.get_config().get(option['section'], opt_name, fallback=option['value'])) - adj = Gtk.Adjustment(val, option['range'][0], option['range'][1], option['step'], option['step']*5) + adj = Gtk.Adjustment(val, option['range'][0], option['range'][1], option['step'], option['step'] * 5) scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adj) scale.set_hexpand(True) scale.set_digits(0) - scale.connect("value-changed", self.scale_moved, option['section'], opt_name) + scale.connect("button-release-event", self.scale_moved, option['section'], opt_name) + scale.set_property("width-request", round(self._screen.width / 2.2)) dev.add(scale) elif option['type'] == "printer": logging.debug("Option: %s" % option) @@ -189,64 +151,4 @@ def add_option(self, boxname, opt_array, opt_name, option): self.labels[boxname].insert_row(pos) self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1) - self.labels[boxname].show_all() - - def load_menu(self, widget, name): - if ("%s_box" % name) not in self.labels: - return - - for child in self.content.get_children(): - self.content.remove(child) - - self.menu.append('%s_box' % name) - self.content.add(self.labels[self.menu[-1]]) - self.content.show_all() - - def unload_menu(self, widget=None): - logging.debug("self.menu: %s" % self.menu) - if len(self.menu) <= 1 or self.menu[-2] not in self.labels: - return - - self.menu.pop() - for child in self.content.get_children(): - self.content.remove(child) - self.content.add(self.labels[self.menu[-1]]) - self.content.show_all() - - def on_dropdown_change(self, combo, section, option, callback=None): - tree_iter = combo.get_active_iter() - if tree_iter is not None: - model = combo.get_model() - value = model[tree_iter][1] - logging.debug("[%s] %s changed to %s" % (section, option, value)) - self._config.set(section, option, value) - self._config.save_user_config_options() - if callback is not None: - callback(value) - - def scale_moved(self, widget, section, option): - logging.debug("[%s] %s changed to %s" % (section, option, widget.get_value())) - if section not in self._config.get_config().sections(): - self._config.get_config().add_section(section) - self._config.set(section, option, str(int(widget.get_value()))) - self._config.save_user_config_options() - - def switch_config_option(self, switch, gparam, section, option, callback=None): - logging.debug("[%s] %s toggled %s" % (section, option, switch.get_active())) - if section not in self._config.get_config().sections(): - self._config.get_config().add_section(section) - self._config.set(section, option, "True" if switch.get_active() else "False") - self._config.save_user_config_options() - if callback is not None: - callback(switch.get_active()) - - def add_gcode_option(self): - macros = self._screen.printer.get_gcode_macros() - for x in macros: - self.add_gcode_macro("macros", self.macros, x, { - "name": x[12:], - "type": binary - }) - - def run_gcode_macro(self, widget, macro): - self._screen._ws.klippy.gcode_script(macro) + self.labels[boxname].show_all() \ No newline at end of file diff --git a/panels/splash_screen.py b/panels/splash_screen.py index ef9121262..ccd4df8bf 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -1,9 +1,10 @@ import gi import logging import os +import time gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango from ks_includes.screen_panel import ScreenPanel @@ -22,31 +23,57 @@ def __init__(self, screen, title, back=True): def initialize(self, panel_name): _ = self.lang.gettext - image = self._gtk.Image("klipper.svg", None, 7.6, 3.2) + image = self._gtk.Image("klipper", 8) self.labels['text'] = Gtk.Label(_("Initializing printer...")) + self.labels['text'].set_line_wrap(True) self.labels['text'].set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) self.labels['text'].set_halign(Gtk.Align.CENTER) self.labels['text'].set_valign(Gtk.Align.CENTER) + self.labels['menu'] = self._gtk.ButtonImage("settings", _("Menu"), "color4") + self.labels['menu'].connect("clicked", self._screen._go_to_submenu, "") + # self.labels['restart'] = self._gtk.ButtonImage("refresh", _("Klipper\nRestart"), "color1") + # self.labels['restart'].connect("clicked", self.restart) + self.labels['firmware_restart'] = self._gtk.ButtonImage("refresh", _("Restart"), "color2") + self.labels['firmware_restart'].connect("clicked", self.firmware_restart) + self.labels['restart_system'] = self._gtk.ButtonImage("refresh", _("System\nRestart"), "color1") + self.labels['restart_system'].connect("clicked", self.restart_system) + self.labels['shutdown'] = self._gtk.ButtonImage("shutdown", _('System\nShutdown'), "color2") + self.labels['shutdown'].connect("clicked", self.shutdown) self.labels['actions'] = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self.labels['actions'].set_hexpand(True) self.labels['actions'].set_vexpand(False) self.labels['actions'].set_halign(Gtk.Align.CENTER) self.labels['actions'].set_homogeneous(True) + self.labels['actions'].set_size_request(self._screen.base_panel.content.get_allocation().width, 0) + + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_hexpand(True) + scroll.set_vexpand(True) + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + scroll.add(self.labels['text']) + + info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) + info.pack_start(image, False, True, 8) + info.pack_end(scroll, True, True, 8) main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) - main.pack_start(image, True, True, 0) + main.pack_start(info, True, True, 8) main.pack_end(self.labels['actions'], False, False, 0) - main.pack_end(self.labels['text'], True, True, 0) + + self.show_restart_buttons() self.content.add(main) def update_text(self, text): - self.labels['text'].set_text(text) - self.clear_action_bar() + self.labels['text'].set_markup("%s" % text) + self.show_restart_buttons() def clear_action_bar(self): for child in self.labels['actions'].get_children(): @@ -55,35 +82,59 @@ def clear_action_bar(self): def show_restart_buttons(self): _ = self.lang.gettext - if "firmware_restart" not in self.labels: - self.labels['menu'] = self._gtk.ButtonImage("settings", _("Menu"), "color4") - self.labels['menu'].connect("clicked", self._screen._go_to_submenu, "") - self.labels['power'] = self._gtk.ButtonImage("shutdown", _("Power On Printer"), "color3") - self.labels['restart'] = self._gtk.ButtonImage("refresh", _("Restart"), "color1") - self.labels['restart'].connect("clicked", self.restart) - self.labels['firmware_restart'] = self._gtk.ButtonImage("refresh", _("Firmware Restart"), "color2") - self.labels['firmware_restart'].connect("clicked", self.firmware_restart) - self.clear_action_bar() + printer = self._screen.connected_printer + if printer is not None and not self._screen.shutdown: + printer_cfg = self._config.get_printer_config(printer) + if printer_cfg is not None: + power_devices = printer_cfg.get("power_devices", "") + power_devices = [str(i.strip()) for i in power_devices.split(',')] + logging.info("Associated power devices: %s", power_devices) + self.add_power_button(self._screen.search_power_devices(power_devices)) + + if self._screen.printer is not None and self._screen.printer.state != "disconnected": + # self.labels['actions'].add(self.labels['restart']) + self.labels['actions'].add(self.labels['firmware_restart']) + self.labels['actions'].add(self.labels['menu']) + + else: + self.labels['actions'].add(self.labels['restart_system']) + self.labels['actions'].add(self.labels['shutdown']) + self.labels['actions'].add(self.labels['menu']) + + self.labels['actions'].show_all() - devices = [i for i in self._printer.get_power_devices() if i.lower().startswith('printer')] if ( - self._printer is not None) else [] - logging.debug("Power devices: %s" % devices) - if len(devices) > 0: - logging.debug("Adding power button") - self.labels['power'].connect("clicked", self.power_on, devices[0]) + def add_power_button(self, powerdevs): + if powerdevs is not None: + _ = self.lang.gettext + self.labels['power'] = self._gtk.ButtonImage("shutdown", _("Power On Printer"), "color3") + self.labels['power'].connect("clicked", self._screen.power_on, powerdevs) + self.check_power_status() self.labels['actions'].add(self.labels['power']) - self.labels['actions'].add(self.labels['restart']) - self.labels['actions'].add(self.labels['firmware_restart']) - self.labels['actions'].add(self.labels['menu']) - self.labels['actions'].show_all() + def activate(self): + self.check_power_status() + + def check_power_status(self): + if 'power' in self.labels: + devices = self._screen.printer.get_power_devices() + if devices is not None: + for device in devices: + if self._screen.printer.get_power_device_status(device) == "off": + self.labels['power'].set_sensitive(True) + break + elif self._screen.printer.get_power_device_status(device) == "on": + self.labels['power'].set_sensitive(False) def firmware_restart(self, widget): self._screen._ws.klippy.restart_firmware() - def power_on(self, widget, device): - self._screen._ws.klippy.power_device_on(device) - def restart(self, widget): self._screen._ws.klippy.restart() + + + def shutdown(self, widget): + os.system("sudo shutdown -P now") + + def restart_system(self, widget): + os.system("sudo reboot now") \ No newline at end of file diff --git a/panels/system.py b/panels/system.py index 6ac46e048..a9473d744 100644 --- a/panels/system.py +++ b/panels/system.py @@ -3,10 +3,9 @@ import os gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib, Pango +from gi.repository import Gdk, Gtk, Pango from datetime import datetime -from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel def create_panel(*args): @@ -20,12 +19,12 @@ def initialize(self, panel_name): _ = self.lang.gettext grid = self._gtk.HomogeneousGrid() - grid.set_row_homogeneous(False) + grid.set_row_homogeneous(True) restart = self._gtk.ButtonImage('refresh', "\n".join(_('Klipper Restart').split(' ')), 'color1') restart.connect("clicked", self.restart_klippy) restart.set_vexpand(False) - firmrestart = self._gtk.ButtonImage('refresh', "\n".join(_('Firmware Restart').split(' ')), 'color2') + firmrestart = self._gtk.ButtonImage('refresh', "\n".join(_('Firmware\nRestart').split(' ')), 'color2') firmrestart.connect("clicked", self.restart_klippy, "firmware") firmrestart.set_vexpand(False) @@ -33,361 +32,18 @@ def initialize(self, panel_name): reboot.connect("clicked", self._screen._confirm_send_action, _("Are you sure you wish to reboot the system?"), "machine.reboot") reboot.set_vexpand(False) - shutdown = self._gtk.ButtonImage('shutdown', _('System\nShutdown'), 'color4') - shutdown.connect("clicked", self._screen._confirm_send_action, - _("Are you sure you wish to shutdown the system?"), "machine.shutdown") - shutdown.set_vexpand(False) + # shutdown = self._gtk.ButtonImage('shutdown', _('System\nShutdown'), 'color4') + # shutdown.connect("clicked", self._screen._confirm_send_action, + # _("Are you sure you wish to shutdown the system?"), "machine.shutdown") + # shutdown.set_vexpand(False) - info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - info.set_vexpand(True) - info.set_valign(Gtk.Align.CENTER) - self.labels['loadavg'] = Gtk.Label("temp") - - self.labels['klipper_version'] = Gtk.Label( - _("Klipper Version") + - (": %s" % self._screen.printer.get_klipper_version())) - self.labels['klipper_version'].set_margin_top(15) - - self.labels['ks_version'] = Gtk.Label(_("KlipperScreen Version") + (": %s" % self._screen.version)) - self.labels['ks_version'].set_margin_top(15) - - info.add(self.labels['loadavg']) - info.add(self.labels['klipper_version']) - info.add(self.labels['ks_version']) - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_vexpand(True) - scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - - infogrid = Gtk.Grid() - infogrid.get_style_context().add_class("system-program-grid") - update_resp = self._screen.apiclient.send_request("machine/update/status") - self.update_status = False - - if not update_resp: - logging.info("No update manager configured") - else: - self.update_status = update_resp['result'] - vi = update_resp['result']['version_info'] - items = sorted(list(vi)) - i = 0 - for prog in items: - self.labels[prog] = Gtk.Label("") - self.labels[prog].set_hexpand(True) - self.labels[prog].set_halign(Gtk.Align.START) - - self.labels["%s_status" % prog] = self._gtk.Button() - self.labels["%s_status" % prog].set_hexpand(False) - self.labels["%s_status" % prog].connect("clicked", self.show_update_info, prog) - - if prog in ALLOWED_SERVICES: - self.labels["%s_restart" % prog] = self._gtk.ButtonImage("refresh", None, None, .7, .7) - self.labels["%s_restart" % prog].connect("clicked", self.restart, prog) - infogrid.attach(self.labels["%s_restart" % prog], 0, i, 1, 1) - - infogrid.attach(self.labels["%s_status" % prog], 2, i, 1, 1) - logging.info("Updating program: %s " % prog) - self.update_program_info(prog) - - - infogrid.attach(self.labels[prog], 1, i, 1, 1) - self.labels[prog].get_style_context().add_class('updater-item') - i = i + 1 - - scroll.add(infogrid) - - grid.attach(scroll, 0, 0, 4, 2) - grid.attach(restart, 0, 2, 1, 1) + grid.attach(restart, 3, 2, 1, 1) grid.attach(firmrestart, 1, 2, 1, 1) grid.attach(reboot, 2, 2, 1, 1) - grid.attach(shutdown, 3, 2, 1, 1) - + # grid.attach(shutdown, 4, 2, 1, 1) self.content.add(grid) - - def activate(self): - self.get_updates() - - def destroy_widget(self, widget, response_id): - widget.destroy() - - def finish_updating(self, widget, response_id): - widget.destroy() - self._screen.set_updating(False) - self.get_updates() - - def get_updates(self): - update_resp = self._screen.apiclient.send_request("machine/update/status") - if not update_resp: - logging.info("No update manager configured") - else: - self.update_status = update_resp['result'] - vi = update_resp['result']['version_info'] - items = sorted(list(vi)) - for prog in items: - self.update_program_info(prog) - - def process_update(self, action, data): - if action == "notify_update_response": - logging.info("Update: %s" % data) - if 'application' in data: - self.labels['update_progress'].set_text(self.labels['update_progress'].get_text().strip() + "\n" + - data['message'] + "\n") - self.labels['update_progress'].set_ellipsize(True) - self.labels['update_progress'].set_ellipsize(Pango.EllipsizeMode.END) - adjustment = self.labels['update_scroll'].get_vadjustment() - adjustment.set_value(adjustment.get_upper() - adjustment.get_page_size()) - adjustment = self.labels['update_scroll'].show_all() - - if data['complete']: - self.update_dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, True) - - def restart(self, widget, program): - if program not in ALLOWED_SERVICES: - return - - logging.info("Restarting service: %s" % program) - self._screen._ws.send_method("machine.services.restart", {"service": program}) - - def show_update_info(self, widget, program): - _ = self.lang.gettext - - if not self.update_status or program not in self.update_status['version_info']: - return - - info = self.update_status['version_info'][program] - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_hexpand(True) - scroll.set_vexpand(True) - scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - - grid = Gtk.Grid() - grid.set_column_homogeneous(True) - grid.set_halign(Gtk.Align.CENTER) - grid.set_valign(Gtk.Align.CENTER) - i = 0 - label = Gtk.Label() - if "configured_type" in info: - if info['configured_type'] == 'git_repo': - if not info['is_valid'] or info['is_dirty']: - label.set_markup(_("Do you want to recover %s?") % program) - grid.attach(label, 0, i, 1, 1) - scroll.add(grid) - recoverybuttons = [ - {"name": _("Recover Hard"), "response": Gtk.ResponseType.OK}, - {"name": _("Recover Soft"), "response": Gtk.ResponseType.APPLY}, - {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL} - ] - dialog = self._gtk.Dialog(self._screen, recoverybuttons, scroll, self.reset_confirm, program) - return - else: - if info['version'] == info['remote_version']: - return - label.set_markup("" + _("Outdated by %d commits:") % len(info['commits_behind']) + "\n") - grid.attach(label, 0, i, 1, 1) - i = i + 1 - date = "" - for c in info['commits_behind']: - ndate = datetime.fromtimestamp(int(c['date'])).strftime("%b %d") - if date != ndate: - date = ndate - label = Gtk.Label() - label.set_markup("%s\n" % date) - label.set_halign(Gtk.Align.START) - grid.attach(label, 0, i, 1, 1) - i = i + 1 - - label = Gtk.Label() - label.set_ellipsize(True) - label.set_ellipsize(Pango.EllipsizeMode.END) - label.set_markup("%s\n%s\n" % (c['subject'], c['author'])) - label.set_halign(Gtk.Align.START) - grid.attach(label, 0, i, 1, 1) - i = i + 1 - else: - label.set_markup("" + _("%s will be updated to version") % program.capitalize() + - ": %s" % (info['remote_version'])) - grid.attach(label, 0, i, 1, 1) - i = i + 1 - if "package_count" in info: - label.set_markup("" + _("%d Packages will be updated") % info['package_count'] + ":\n") - label.set_halign(Gtk.Align.CENTER) - grid.attach(label, 0, i, 3, 1) - i = i + 1 - j = 0 - for c in info["package_list"]: - label = Gtk.Label() - label.set_markup(" %s " % c) - label.set_halign(Gtk.Align.START) - label.set_ellipsize(True) - label.set_ellipsize(Pango.EllipsizeMode.END) - pos = (j % 3) - grid.attach(label, pos, i, 1, 1) - j = j + 1 - if (pos == 2): - i = i + 1 - - scroll.add(grid) - - buttons = [ - {"name": _("Update"), "response": Gtk.ResponseType.OK}, - {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL} - ] - dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.update_confirm, program) - - def update_confirm(self, widget, response_id, program): - if response_id == Gtk.ResponseType.OK: - logging.debug("Updating %s" % program) - self.update_program(self, program) - widget.destroy() - - def reset_confirm(self, widget, response_id, program): - if response_id == Gtk.ResponseType.OK: - logging.debug("Recovering hard %s" % program) - self.reset_repo(self, program, True) - if response_id == Gtk.ResponseType.APPLY: - logging.debug("Recovering soft %s" % program) - self.reset_repo(self, program, False) - widget.destroy() - - def reset_repo(self, widget, program, hard): - if self._screen.is_updating(): - return - - _ = self.lang.gettext - - buttons = [ - {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL} - ] - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_hexpand(True) - scroll.set_vexpand(True) - scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - - self.labels['update_progress'] = Gtk.Label("%s %s..." % (_("Starting recovery for"), program)) - self.labels['update_progress'].set_halign(Gtk.Align.START) - self.labels['update_progress'].set_valign(Gtk.Align.START) - scroll.add(self.labels['update_progress']) - self.labels['update_scroll'] = scroll - - dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating) - dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False) - - self.update_prog = program - self.update_dialog = dialog - - logging.info("Sending machine.update.recover name: %s" % program) - - self._screen._ws.send_method("machine.update.recover", {"name": program, "hard": str(hard)}) - self._screen.set_updating(True) - - def update_program(self, widget, program): - if self._screen.is_updating(): - return - - _ = self.lang.gettext - - if not self.update_status or program not in self.update_status['version_info']: - return - - info = self.update_status['version_info'][program] - logging.info("program: %s" % info) - if "package_count" in info: - if info['package_count'] == 0: - return - else: - if info['version'] == info['remote_version']: - return - - buttons = [ - {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL} - ] - - scroll = Gtk.ScrolledWindow() - scroll.set_property("overlay-scrolling", False) - scroll.set_hexpand(True) - scroll.set_vexpand(True) - scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - - self.labels['update_progress'] = Gtk.Label("%s %s..." % (_("Starting update for"), program)) - self.labels['update_progress'].set_halign(Gtk.Align.START) - self.labels['update_progress'].set_valign(Gtk.Align.START) - scroll.add(self.labels['update_progress']) - self.labels['update_scroll'] = scroll - - dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating) - dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False) - - self.update_prog = program - self.update_dialog = dialog - - if program in ['klipper', 'moonraker', 'system']: - logging.info("Sending machine.update.%s" % program) - self._screen._ws.send_method("machine.update.%s" % program) - else: - logging.info("Sending machine.update.client name: %s" % program) - self._screen._ws.send_method("machine.update.client", {"name": program}) - self._screen.set_updating(True) - - def update_program_info(self, p): - _ = self.lang.gettext - - logging.info("Updating program: %s " % p) - if 'version_info' not in self.update_status or p not in self.update_status['version_info']: - return - - info = self.update_status['version_info'][p] - logging.info("%s: %s" % (p, info)) - - if p != "system": - version = (info['full_version_string'] if "full_version_string" in info else info['version']) - if info['configured_type'] == 'git_repo': - if info['is_valid'] and not info['is_dirty']: - if info['version'] == info['remote_version']: - self.labels[p].set_markup("%s\n%s" % (p, version)) - self.labels["%s_status" % p].set_label(_("Up To Date")) - self.labels["%s_status" % p].get_style_context().remove_class('update') - self.labels["%s_status" % p].get_style_context().remove_class('invalid') - self.labels["%s_status" % p].set_sensitive(False) - else: - self.labels[p].set_markup("%s\n%s -> %s" % (p, version, info['remote_version'])) - self.labels["%s_status" % p].set_label(_("Update")) - self.labels["%s_status" % p].get_style_context().add_class('update') - self.labels["%s_status" % p].set_sensitive(True) - else: - self.labels[p].set_markup("%s\n%s" % (p, version)) - self.labels["%s_status" % p].set_label(_("Invalid")) - self.labels["%s_status" % p].get_style_context().add_class('invalid') - self.labels["%s_status" % p].set_sensitive(True) - else: - if info['version'] == info['remote_version']: - self.labels[p].set_markup("%s\n%s" % (p, version)) - self.labels["%s_status" % p].set_label(_("Up To Date")) - self.labels["%s_status" % p].get_style_context().remove_class('update') - self.labels["%s_status" % p].set_sensitive(False) - else: - self.labels[p].set_markup("%s\n%s -> %s" % (p, version, info['remote_version'])) - self.labels["%s_status" % p].set_label(_("Update")) - self.labels["%s_status" % p].get_style_context().add_class('update') - self.labels["%s_status" % p].set_sensitive(True) - - - else: - self.labels[p].set_markup("System") - if info['package_count'] == 0: - self.labels["%s_status" % p].set_label(_("Up To Date")) - self.labels["%s_status" % p].get_style_context().remove_class('update') - self.labels["%s_status" % p].set_sensitive(False) - else: - self.labels["%s_status" % p].set_label(_("Update")) - self.labels["%s_status" % p].get_style_context().add_class('update') - self.labels["%s_status" % p].set_sensitive(True) - + def restart_klippy(self, widget, type=None): if type == "firmware": self._screen._ws.klippy.restart_firmware() @@ -395,4 +51,4 @@ def restart_klippy(self, widget, type=None): self._screen._ws.klippy.restart() def restart_ks(self, widget): - os.system("sudo systemctl restart KlipperScreen") + os.system("sudo systemctl restart %s" % self._config.get_main_config_option('service')) \ No newline at end of file diff --git a/panels/temperature.py b/panels/temperature.py index afb0eb47f..929cbea6c 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -250,4 +250,4 @@ def update_entry(self, widget, digit): else: if len(text) >= 3: return - self.labels['entry'].set_text(text + digit) + self.labels['entry'].set_text(text + digit) \ No newline at end of file diff --git a/panels/updates.py b/panels/updates.py new file mode 100644 index 000000000..e1e40de35 --- /dev/null +++ b/panels/updates.py @@ -0,0 +1,392 @@ +import gi +import logging +import os + +gi.require_version("Gtk", "3.0") +from gi.repository import Gdk, Gtk, Pango +from datetime import datetime + +from ks_includes.screen_panel import ScreenPanel + +def create_panel(*args): + return SystemPanel(*args) + + +ALLOWED_SERVICES = ["KlipperScreen", "MoonCord", "klipper", "moonraker"] + +class SystemPanel(ScreenPanel): + def initialize(self, panel_name): + _ = self.lang.gettext + + grid = self._gtk.HomogeneousGrid() + grid.set_row_homogeneous(False) + + + + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_vexpand(True) + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + + infogrid = Gtk.Grid() + infogrid.get_style_context().add_class("system-program-grid") + update_resp = self._screen.apiclient.send_request("machine/update/status") + self.update_status = False + + if not update_resp: + logging.info("No update manager configured") + else: + self.update_status = update_resp['result'] + vi = update_resp['result']['version_info'] + items = sorted(list(vi)) + i = 0 + for prog in items: + self.labels[prog] = Gtk.Label("") + self.labels[prog].set_hexpand(True) + self.labels[prog].set_halign(Gtk.Align.START) + + self.labels["%s_status" % prog] = self._gtk.Button() + self.labels["%s_status" % prog].set_hexpand(False) + self.labels["%s_status" % prog].connect("clicked", self.show_update_info, prog) + + if prog in ALLOWED_SERVICES: + self.labels["%s_restart" % prog] = self._gtk.ButtonImage("refresh", None, None, .7, .7) + self.labels["%s_restart" % prog].connect("clicked", self.restart, prog) + infogrid.attach(self.labels["%s_restart" % prog], 0, i, 1, 1) + + infogrid.attach(self.labels["%s_status" % prog], 2, i, 1, 1) + logging.info("Updating program: %s " % prog) + self.update_program_info(prog) + + + infogrid.attach(self.labels[prog], 1, i, 1, 1) + self.labels[prog].get_style_context().add_class('updater-item') + i = i + 1 + + scroll.add(infogrid) + + grid.attach(scroll, 0, 0, 4, 2) + self.content.add(grid) + + def activate(self): + self.get_updates() + + def destroy_widget(self, widget, response_id): + widget.destroy() + + def finish_updating(self, widget, response_id): + widget.destroy() + self._screen.set_updating(False) + self.get_updates() + + def get_updates(self): + update_resp = self._screen.apiclient.send_request("machine/update/status") + if not update_resp: + logging.info("No update manager configured") + else: + self.update_status = update_resp['result'] + vi = update_resp['result']['version_info'] + items = sorted(list(vi)) + for prog in items: + self.update_program_info(prog) + + def process_update(self, action, data): + if action == "notify_update_response": + logging.info("Update: %s" % data) + if 'application' in data: + self.labels['update_progress'].set_text(self.labels['update_progress'].get_text().strip() + "\n" + + data['message'] + "\n") + self.labels['update_progress'].set_ellipsize(True) + self.labels['update_progress'].set_ellipsize(Pango.EllipsizeMode.END) + adjustment = self.labels['update_scroll'].get_vadjustment() + adjustment.set_value(adjustment.get_upper() - adjustment.get_page_size()) + adjustment = self.labels['update_scroll'].show_all() + + if data['complete']: + self.update_dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, True) + + def restart(self, widget, program): + if program not in ALLOWED_SERVICES: + return + + logging.info("Restarting service: %s" % program) + self._screen._ws.send_method("machine.services.restart", {"service": program}) + + def show_update_info(self, widget, program): + _ = self.lang.gettext + _n = self.lang.ngettext + + if not self.update_status: + return + if program in self.update_status['version_info']: + info = self.update_status['version_info'][program] + else: + info = ["full"] + + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_hexpand(True) + scroll.set_vexpand(True) + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + + grid = Gtk.Grid() + grid.set_column_homogeneous(True) + grid.set_halign(Gtk.Align.CENTER) + grid.set_valign(Gtk.Align.CENTER) + i = 0 + label = Gtk.Label() + label.set_line_wrap(True) + if 'configured_type' in info and info['configured_type'] == 'git_repo': + if not info['is_valid'] or info['is_dirty']: + label.set_markup(_("Do you want to recover %s?") % program) + grid.attach(label, 0, i, 1, 1) + scroll.add(grid) + recoverybuttons = [ + {"name": _("Recover Hard"), "response": Gtk.ResponseType.OK}, + {"name": _("Recover Soft"), "response": Gtk.ResponseType.APPLY}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL} + ] + self._gtk.Dialog(self._screen, recoverybuttons, scroll, self.reset_confirm, program) + return + else: + if info['version'] == info['remote_version']: + return + ncommits = len(info['commits_behind']) + label.set_markup("" + + _("Outdated by %d") % ncommits + + " " + _n("commit", "commits", ncommits) + + ":\n") + grid.attach(label, 0, i, 1, 1) + i = i + 1 + date = "" + for c in info['commits_behind']: + ndate = datetime.fromtimestamp(int(c['date'])).strftime("%b %d") + if date != ndate: + date = ndate + label = Gtk.Label() + label.set_line_wrap(True) + label.set_markup("%s\n" % date) + label.set_halign(Gtk.Align.START) + grid.attach(label, 0, i, 1, 1) + i = i + 1 + + label = Gtk.Label() + label.set_line_wrap(True) + label.set_markup("%s\n%s\n" % (c['subject'], c['author'])) + label.set_halign(Gtk.Align.START) + grid.attach(label, 0, i, 1, 1) + i = i + 1 + + details = Gtk.Label(label=c['message']+"\n\n\n") + details.set_line_wrap(True) + details.set_halign(Gtk.Align.START) + grid.attach(details, 0, i, 1, 1) + i = i + 1 + if "package_count" in info: + label.set_markup("%d " % info['package_count'] + + _n("Package will be updated", "Packages will be updated", info['package_count']) + + ":\n") + label.set_halign(Gtk.Align.CENTER) + grid.attach(label, 0, i, 3, 1) + i = i + 1 + j = 0 + for c in info["package_list"]: + label = Gtk.Label() + label.set_markup(" %s " % c) + label.set_halign(Gtk.Align.START) + label.set_ellipsize(True) + label.set_ellipsize(Pango.EllipsizeMode.END) + pos = (j % 3) + grid.attach(label, pos, i, 1, 1) + j = j + 1 + if (pos == 2): + i = i + 1 + elif "full" in info: + label.set_markup("" + _("Perform a full upgrade?") + "") + grid.attach(label, 0, i, 1, 1) + i = i + 1 + else: + label.set_markup("" + _("%s will be updated to version") % program.capitalize() + + ": %s" % (info['remote_version'])) + grid.attach(label, 0, i, 1, 1) + i = i + 1 + + scroll.add(grid) + + buttons = [ + {"name": _("Update"), "response": Gtk.ResponseType.OK}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL} + ] + self._gtk.Dialog(self._screen, buttons, scroll, self.update_confirm, program) + + def update_confirm(self, widget, response_id, program): + if response_id == Gtk.ResponseType.OK: + logging.debug("Updating %s" % program) + self.update_program(self, program) + widget.destroy() + + def reset_confirm(self, widget, response_id, program): + if response_id == Gtk.ResponseType.OK: + logging.debug("Recovering hard %s" % program) + self.reset_repo(self, program, True) + if response_id == Gtk.ResponseType.APPLY: + logging.debug("Recovering soft %s" % program) + self.reset_repo(self, program, False) + widget.destroy() + + def reset_repo(self, widget, program, hard): + if self._screen.is_updating(): + return + + _ = self.lang.gettext + + buttons = [ + {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL} + ] + + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_hexpand(True) + scroll.set_vexpand(True) + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + + self.labels['update_progress'] = Gtk.Label("%s %s..." % (_("Starting recovery for"), program)) + self.labels['update_progress'].set_halign(Gtk.Align.START) + self.labels['update_progress'].set_valign(Gtk.Align.START) + scroll.add(self.labels['update_progress']) + self.labels['update_scroll'] = scroll + + dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating) + dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False) + + self.update_prog = program + self.update_dialog = dialog + + logging.info("Sending machine.update.recover name: %s" % program) + + self._screen._ws.send_method("machine.update.recover", {"name": program, "hard": str(hard)}) + self._screen.set_updating(True) + + def update_program(self, widget, program): + if self._screen.is_updating(): + return + + _ = self.lang.gettext + + if not self.update_status: + return + + if program in self.update_status['version_info']: + info = self.update_status['version_info'][program] + logging.info("program: %s" % info) + else: + info = ["full"] + logging.info("full upgrade") + + if "package_count" in info: + if info['package_count'] == 0: + return + elif "version" in info: + if info['version'] == info['remote_version']: + return + + buttons = [ + {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL} + ] + + scroll = Gtk.ScrolledWindow() + scroll.set_property("overlay-scrolling", False) + scroll.set_hexpand(True) + scroll.set_vexpand(True) + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + scroll.add_events(Gdk.EventMask.TOUCH_MASK) + scroll.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + + if "full" in info: + self.labels['update_progress'] = Gtk.Label("%s\n" % _("Updating")) + else: + self.labels['update_progress'] = Gtk.Label("%s %s..." % (_("Starting update for"), program)) + self.labels['update_progress'].set_halign(Gtk.Align.START) + self.labels['update_progress'].set_valign(Gtk.Align.START) + scroll.add(self.labels['update_progress']) + self.labels['update_scroll'] = scroll + + dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating) + dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False) + + self.update_prog = program + self.update_dialog = dialog + + if program in ['klipper', 'moonraker', 'system', 'full']: + logging.info("Sending machine.update.%s" % program) + self._screen._ws.send_method("machine.update.%s" % program) + else: + logging.info("Sending machine.update.client name: %s" % program) + self._screen._ws.send_method("machine.update.client", {"name": program}) + self._screen.set_updating(True) + + def update_program_info(self, p): + _ = self.lang.gettext + + logging.info("Updating program: %s " % p) + if 'version_info' not in self.update_status or p not in self.update_status['version_info']: + return + + info = self.update_status['version_info'][p] + logging.info("%s: %s" % (p, info)) + + if p != "system": + if 'configured_type' in info and info['configured_type'] == 'git_repo': + if info['is_valid'] and not info['is_dirty']: + if info['version'] == info['remote_version']: + self.labels[p].set_markup("%s\n%s" % (p, info['version'])) + self.labels["%s_status" % p].set_label(_("Up To Date")) + self.labels["%s_status" % p].get_style_context().remove_class('update') + self.labels["%s_status" % p].get_style_context().remove_class('invalid') + self.labels["%s_status" % p].set_sensitive(False) + else: + self.labels[p].set_markup("%s\n%s -> %s" % (p, info['version'], info['remote_version'])) + self.labels["%s_status" % p].set_label(_("Update")) + self.labels["%s_status" % p].get_style_context().add_class('update') + self.labels["%s_status" % p].set_sensitive(True) + else: + self.labels[p].set_markup("%s\n%s" % (p, info['version'])) + self.labels["%s_status" % p].set_label(_("Invalid")) + self.labels["%s_status" % p].get_style_context().add_class('invalid') + self.labels["%s_status" % p].set_sensitive(True) + else: + if 'version' in info and info['version'] == info['remote_version']: + self.labels[p].set_markup("%s\n%s" % (p, info['version'])) + self.labels["%s_status" % p].set_label(_("Up To Date")) + self.labels["%s_status" % p].get_style_context().remove_class('update') + self.labels["%s_status" % p].set_sensitive(False) + else: + self.labels[p].set_markup("%s\n%s -> %s" % (p, info['version'], info['remote_version'])) + self.labels["%s_status" % p].set_label(_("Update")) + self.labels["%s_status" % p].get_style_context().add_class('update') + self.labels["%s_status" % p].set_sensitive(True) + else: + self.labels[p].set_markup("System") + if info['package_count'] == 0: + self.labels["%s_status" % p].set_label(_("Up To Date")) + self.labels["%s_status" % p].get_style_context().remove_class('update') + self.labels["%s_status" % p].set_sensitive(False) + else: + self.labels["%s_status" % p].set_label(_("Update")) + self.labels["%s_status" % p].get_style_context().add_class('update') + self.labels["%s_status" % p].set_sensitive(True) + + def restart_klippy(self, widget, type=None): + if type == "firmware": + self._screen._ws.klippy.restart_firmware() + else: + self._screen._ws.klippy.restart() + + def restart_ks(self, widget): + os.system("sudo systemctl restart %s" % self._config.get_main_config_option('service')) \ No newline at end of file diff --git a/panels/zcalibrate.py b/panels/zcalibrate.py index 27ba20941..12126dbc4 100644 --- a/panels/zcalibrate.py +++ b/panels/zcalibrate.py @@ -1,16 +1,18 @@ import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel import logging + def create_panel(*args): return ZCalibratePanel(*args) + class ZCalibratePanel(ScreenPanel): _screen = None widgets = {} @@ -22,30 +24,88 @@ def __init__(self, screen, title, back=True): def initialize(self, panel_name): _ = self.lang.gettext - grid = Gtk.Grid() - label = Gtk.Label(_("Z Offset") + ": \n") - self.widgets['zposition'] = Gtk.Label(_("Homing")) - pos = Gtk.VBox() - pos.set_vexpand(False) - pos.set_valign(Gtk.Align.CENTER) - pos.add(label) - pos.add(self.widgets['zposition']) + if self._printer.config_section_exists("probe"): + self.z_offset = self._screen.printer.get_config_section("probe")['z_offset'] + elif self._printer.config_section_exists("bltouch"): + self.z_offset = self._screen.printer.get_config_section("bltouch")['z_offset'] + elif self._printer.config_section_exists("smart_effector"): + self.z_offset = self._screen.printer.get_config_section("smart_effector")['z_offset'] + else: + self.z_offset = None + + self.widgets['zposition'] = Gtk.Label("Z: ?") + + pos = self._gtk.HomogeneousGrid() + pos.attach(self.widgets['zposition'], 0, 1, 2, 1) + if self.z_offset is not None: + self.widgets['zoffset'] = Gtk.Label("?") + pos.attach(Gtk.Label(_("Probe Offset") + ": "), 0, 2, 2, 1) + pos.attach(Gtk.Label(_("Saved")), 0, 3, 1, 1) + pos.attach(Gtk.Label(_("New")), 1, 3, 1, 1) + pos.attach(Gtk.Label(str(round(float(self.z_offset), 2))), 0, 4, 1, 1) + pos.attach(self.widgets['zoffset'], 1, 4, 1, 1) - self.widgets['zpos'] = self._gtk.ButtonImage('z-farther', _("Raise Nozzle")) + self.widgets['zpos'] = self._gtk.ButtonImage('z-farther', _("Raise Nozzle"), 'color4') self.widgets['zpos'].connect("clicked", self.move, "+") - self.widgets['zpos'].set_sensitive(False) - self.widgets['zneg'] = self._gtk.ButtonImage('z-closer', _("Lower Nozzle")) + self.widgets['zneg'] = self._gtk.ButtonImage('z-closer', _("Lower Nozzle"), 'color1') self.widgets['zneg'].connect("clicked", self.move, "-") - self.widgets['zneg'].set_sensitive(False) self.widgets['start'] = self._gtk.ButtonImage('resume', _("Start"), 'color3') - self.widgets['start'].connect("clicked", self.start_calibration) - - self.widgets['complete'] = self._gtk.ButtonImage('complete', _('Accept')) + self.widgets['complete'] = self._gtk.ButtonImage('complete', _('Accept'), 'color3') self.widgets['complete'].connect("clicked", self.accept) - self.widgets['complete'].set_sensitive(False) - cancel = self._gtk.ButtonImage('cancel', _('Abort'), 'color2') - cancel.connect("clicked", self.abort) + self.widgets['cancel'] = self._gtk.ButtonImage('cancel', _('Abort'), 'color2') + self.widgets['cancel'].connect("clicked", self.abort) + + functions = ["endstop", "probe", "mesh", "delta", "delta_manual"] + pobox = Gtk.VBox() + endstop = (self._printer.config_section_exists("stepper_z") and + not self._screen.printer.get_config_section("stepper_z")['endstop_pin'].startswith("probe")) + if endstop: + endstop = self._gtk.Button(label="Endstop") + endstop.connect("clicked", self.start_calibration, "endstop") + pobox.pack_start(endstop, True, True, 5) + else: + functions.remove("endstop") + + if self._printer.config_section_exists("probe") or self._printer.config_section_exists("bltouch"): + probe = self._gtk.Button(label="Probe") + probe.connect("clicked", self.start_calibration, "probe") + pobox.pack_start(probe, True, True, 5) + functions.remove("mesh") + else: + functions.remove("probe") + # This is used to do a manual bed mesh if there is no probe + if self._printer.config_section_exists("bed_mesh"): + mesh = self._gtk.Button(label="Bed mesh") + mesh.connect("clicked", self.start_calibration, "mesh") + pobox.pack_start(mesh, True, True, 5) + else: + functions.remove("mesh") + + if "delta" in self._screen.printer.get_config_section("printer")['kinematics']: + if self._printer.config_section_exists("probe") or self._printer.config_section_exists("bltouch"): + delta = self._gtk.Button(label="Delta Automatic") + delta.connect("clicked", self.start_calibration, "delta") + pobox.pack_start(delta, True, True, 5) + else: + functions.remove("delta") + delta_manual = self._gtk.Button(label="Delta Manual") + delta_manual.connect("clicked", self.start_calibration, "delta_manual") + pobox.pack_start(delta_manual, True, True, 5) + else: + functions.remove("delta") + functions.remove("delta_manual") + + logging.info("Available functions: %s" % functions) + + self.labels['popover'] = Gtk.Popover() + self.labels['popover'].add(pobox) + self.labels['popover'].set_position(Gtk.PositionType.BOTTOM) + + if len(functions) > 1: + self.widgets['start'].connect("clicked", self.on_popover_clicked) + else: + self.widgets['start'].connect("clicked", self.start_calibration, functions[0]) distgrid = Gtk.Grid() j = 0 @@ -54,9 +114,9 @@ def initialize(self, panel_name): self.widgets[i].set_direction(Gtk.TextDirection.LTR) self.widgets[i].connect("clicked", self.change_distance, i) ctx = self.widgets[i].get_style_context() - if (self._screen.lang_ltr and j == 0) or (not self._screen.lang_ltr and j == len(self.distances)-1): + if (self._screen.lang_ltr and j == 0) or (not self._screen.lang_ltr and j == len(self.distances) - 1): ctx.add_class("distbutton_top") - elif (not self._screen.lang_ltr and j == 0) or (self._screen.lang_ltr and j == len(self.distances)-1): + elif (not self._screen.lang_ltr and j == 0) or (self._screen.lang_ltr and j == len(self.distances) - 1): ctx.add_class("distbutton_bottom") else: ctx.add_class("distbutton") @@ -72,49 +132,128 @@ def initialize(self, panel_name): distances.pack_start(self.widgets['move_dist'], True, True, 0) distances.pack_start(distgrid, True, True, 0) + grid = Gtk.Grid() grid.set_column_homogeneous(True) - grid.attach(self.widgets['zpos'], 0, 0, 1, 1) - grid.attach(self.widgets['start'], 1, 0, 1, 1) - grid.attach(pos, 1, 1, 1, 1) - grid.attach(self.widgets['zneg'], 0, 1, 1, 1) - grid.attach(self.widgets['complete'], 2, 0, 1, 1) - grid.attach(distances, 0, 2, 3, 1) - grid.attach(cancel, 2, 1, 1, 1) + if self._screen.vertical_mode: + grid.attach(self.widgets['zpos'], 0, 1, 1, 1) + grid.attach(self.widgets['zneg'], 0, 2, 1, 1) + grid.attach(self.widgets['start'], 0, 0, 1, 1) + grid.attach(pos, 1, 0, 1, 1) + grid.attach(self.widgets['complete'], 1, 1, 1, 1) + grid.attach(self.widgets['cancel'], 1, 2, 1, 1) + grid.attach(distances, 0, 3, 2, 1) + else: + grid.attach(self.widgets['zpos'], 0, 0, 1, 1) + grid.attach(self.widgets['zneg'], 0, 1, 1, 1) + grid.attach(self.widgets['start'], 1, 0, 1, 1) + grid.attach(pos, 1, 1, 1, 1) + grid.attach(self.widgets['complete'], 2, 0, 1, 1) + grid.attach(self.widgets['cancel'], 2, 1, 1, 1) + grid.attach(distances, 0, 2, 3, 1) + + self.buttons_not_calibrating() self.content.add(grid) - def start_calibration(self, widget): + def on_popover_clicked(self, widget): + self.labels['popover'].set_relative_to(widget) + self.labels['popover'].show_all() + + def start_calibration(self, widget, method): + x_position = y_position = 0 + self.labels['popover'].popdown() if self._screen.printer.get_stat("toolhead", "homed_axes") != "xyz": self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME) - if 'z_calibrate_position' in self._config.get_config(): - x_position = self._config.get_config()['z_calibrate_position'].getint("calibrate_x_position", 0) - y_position = self._config.get_config()['z_calibrate_position'].getint("calibrate_y_position", 0) + if method == "probe": + # Get position from config + printer = self._screen.connected_printer + printer_cfg = self._config.get_printer_config(printer) + logging.info(printer_cfg) + if printer_cfg is not None: + x_position = printer_cfg.getint("calibrate_x_position", 0) + y_position = printer_cfg.getint("calibrate_y_position", 0) + elif 'z_calibrate_position' in self._config.get_config(): + # OLD global way, this should be deprecated + x_position = self._config.get_config()['z_calibrate_position'].getint("calibrate_x_position", 0) + y_position = self._config.get_config()['z_calibrate_position'].getint("calibrate_y_position", 0) + if x_position > 0 and y_position > 0: + logging.debug("Configured probing position X: %.0f Y: %.0f", x_position, y_position) + self._screen._ws.klippy.gcode_script('G0 X%d Y%d F3000' % (x_position, y_position)) + elif "delta" in self._screen.printer.get_config_section("printer")['kinematics']: + logging.info("Detected delta kinematics calibrating at 0,0") + self._screen._ws.klippy.gcode_script('G0 X%d Y%d F3000' % (0, 0)) + else: + logging.debug("Position not configured, probing the middle of the bed") + x_position = int(int(self._screen.printer.get_config_section("stepper_x")['position_max']) / 2) + y_position = int(int(self._screen.printer.get_config_section("stepper_y")['position_max']) / 2) + + # Find probe offset + klipper_cfg = self._screen.printer.get_config_section_list() + x_offset = y_offset = 0 + if "bltouch" in klipper_cfg: + bltouch = self._screen.printer.get_config_section("bltouch") + if "x_offset" in bltouch: + x_offset = float(bltouch['x_offset']) + if "y_offset" in bltouch: + y_offset = float(bltouch['y_offset']) + elif "probe" in klipper_cfg: + probe = self._screen.printer.get_config_section("probe") + if "x_offset" in probe: + x_offset = float(probe['x_offset']) + if "y_offset" in probe: + y_offset = float(probe['y_offset']) + if x_offset > 0 or y_offset > 0: + logging.debug("Substracting probe offset X: %.0f Y: %.0f", x_offset, y_offset) + x_position = self.apply_probe_offset(x_position, x_offset) + y_position = self.apply_probe_offset(y_position, y_offset) + # Move self._screen._ws.klippy.gcode_script('G0 X%d Y%d F3000' % (x_position, y_position)) - if (self._printer.config_section_exists("probe") or self._printer.config_section_exists("bltouch")): self._screen._ws.klippy.gcode_script(KlippyGcodes.PROBE_CALIBRATE) - else: + elif method == "mesh": + self._screen._ws.klippy.gcode_script("BED_MESH_CALIBRATE") + elif method == "delta": + self._screen._ws.klippy.gcode_script("DELTA_CALIBRATE") + elif method == "delta_manual": + self._screen._ws.klippy.gcode_script("DELTA_CALIBRATE METHOD=manual") + elif method == "endstop": self._screen._ws.klippy.gcode_script(KlippyGcodes.Z_ENDSTOP_CALIBRATE) - self.widgets['start'].get_style_context().remove_class('color3') - self.widgets['zpos'].set_sensitive(True) - self.widgets['zpos'].get_style_context().add_class('color4') - self.widgets['zneg'].set_sensitive(True) - self.widgets['zneg'].get_style_context().add_class('color1') - self.widgets['complete'].set_sensitive(True) - self.widgets['complete'].get_style_context().add_class('color3') + def apply_probe_offset(self, pos, offset): + return max(0, int(float(pos) - offset)) def process_update(self, action, data): - if action != "notify_status_update": - return + _ = self.lang.gettext - if "toolhead" in data and "position" in data['toolhead']: - self.updatePosition(data['toolhead']['position']) + if action == "notify_status_update": + if self._screen.printer.get_stat("toolhead", "homed_axes") != "xyz": + self.widgets['zposition'].set_text("Z: ?") + elif "toolhead" in data and "position" in data['toolhead']: + self.updatePosition(data['toolhead']['position']) + elif action == "notify_gcode_response": + data = data.lower() + logging.info(data) + if "unknown" in data: + self.buttons_not_calibrating() + elif "save_config" in data: + self.buttons_not_calibrating() + self._screen.show_popup_message(_("Calibrated, save configuration to make it permanent"), time=10,level=1) + elif "out of range" in data: + self._screen.show_popup_message("%s" % data) + self.buttons_not_calibrating() + elif "fail" in data and "use testz" in data: + self._screen.show_popup_message(_("Failed, adjust position first"),time=10) + self.buttons_not_calibrating() + elif "use testz" in data or "use abort" in data or "z position" in data: + self.buttons_calibrating() + return def updatePosition(self, position): - self.widgets['zposition'].set_text(str(round(position[2], 2))) + self.widgets['zposition'].set_text("Z: " + str(round(position[2], 2))) + if self.z_offset is not None: + self.widgets['zoffset'].set_text(str(round(position[2] + float(self.z_offset), 2))) def change_distance(self, widget, distance): if self.distance == distance: @@ -137,20 +276,37 @@ def move(self, widget, dir): self._screen._ws.klippy.gcode_script(KlippyGcodes.testz_move(dist)) def abort(self, widget): - logging.info("Aborting Z calibrate") + logging.info("Aborting calibration") self._screen._ws.klippy.gcode_script(KlippyGcodes.ABORT) + self.buttons_not_calibrating() + self.menu_return(widget) + def accept(self, widget): + logging.info("Accepting Z position") + self._screen._ws.klippy.gcode_script(KlippyGcodes.ACCEPT) + + def buttons_calibrating(self): + self.widgets['start'].get_style_context().remove_class('color3') + self.widgets['start'].set_sensitive(False) + + self.widgets['zpos'].set_sensitive(True) + self.widgets['zpos'].get_style_context().add_class('color4') + self.widgets['zneg'].set_sensitive(True) + self.widgets['zneg'].get_style_context().add_class('color1') + self.widgets['complete'].set_sensitive(True) + self.widgets['complete'].get_style_context().add_class('color3') + self.widgets['cancel'].set_sensitive(True) + self.widgets['cancel'].get_style_context().add_class('color2') + + def buttons_not_calibrating(self): self.widgets['start'].get_style_context().add_class('color3') + self.widgets['start'].set_sensitive(True) + self.widgets['zpos'].set_sensitive(False) self.widgets['zpos'].get_style_context().remove_class('color4') self.widgets['zneg'].set_sensitive(False) self.widgets['zneg'].get_style_context().remove_class('color1') self.widgets['complete'].set_sensitive(False) self.widgets['complete'].get_style_context().remove_class('color3') - - self.menu_return(widget) - - def accept(self, widget): - logging.info("Accepting Z calibrate") - self._screen._ws.klippy.gcode_script(KlippyGcodes.ACCEPT) - self.menu_return(widget) \ No newline at end of file + self.widgets['cancel'].set_sensitive(False) + self.widgets['cancel'].get_style_context().remove_class('color2') diff --git a/screen.py b/screen.py index e83b983f4..42c76d785 100644 --- a/screen.py +++ b/screen.py @@ -2,27 +2,22 @@ import argparse import gi -import gettext -import time -import threading import json -import netifaces -import requests -import websocket import importlib import logging import os import re import signal import subprocess -import sys -import traceback +import pathlib +import traceback # noqa +import time gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GLib, Pango -from jinja2 import Environment, Template +from jinja2 import Environment from ks_includes import functions from ks_includes.KlippyWebsocket import KlippyWebsocket @@ -30,14 +25,14 @@ from ks_includes.files import KlippyFiles from ks_includes.KlippyGtk import KlippyGtk from ks_includes.printer import Printer -from ks_includes.wifi import WifiManager from ks_includes.config import KlipperScreenConfig from panels.base_panel import BasePanel +logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger('matplotlib').setLevel(logging.WARNING) -import numpy -import matplotlib.pyplot +# This is here to avoid performance issues opening bed_mesh +import matplotlib.pyplot # noqa PRINTER_BASE_STATUS_OBJECTS = [ 'bed_mesh', @@ -55,13 +50,14 @@ 'webhooks' ] -klipperscreendir = os.getcwd() +klipperscreendir = pathlib.Path(__file__).parent.resolve() class KlipperScreen(Gtk.Window): """ Class for creating a screen for Klipper via HDMI """ _cur_panels = [] bed_temp_label = None connecting = False + connecting_to_printer = None connected_printer = None currentPanel = None files = None @@ -73,6 +69,7 @@ class KlipperScreen(Gtk.Window): number_tools = 1 panels = {} popup_message = None + screensaver = None printer = None printer_select_callbacks = [] printer_select_prepanel = None @@ -82,9 +79,12 @@ class KlipperScreen(Gtk.Window): updating = False update_queue = [] _ws = None + init_printer_timeout = None + dpms_timeout = None + screensaver_timeout = None + reinit_count = 0 def __init__(self, args, version): - self.dpms_timeout = None self.version = version configfile = os.path.normpath(os.path.expanduser(args.configfile)) @@ -92,13 +92,6 @@ def __init__(self, args, version): self._config = KlipperScreenConfig(configfile, self) self.lang = self._config.get_lang() - self.network_interfaces = netifaces.interfaces() - self.wireless_interfaces = [int for int in self.network_interfaces if int.startswith('w')] - self.wifi = None - if len(self.wireless_interfaces) > 0: - logging.info("Found wireless interfaces: %s" % self.wireless_interfaces) - self.wifi = WifiManager(self.wireless_interfaces[0]) - logging.debug("OS Language: %s" % os.getenv('LANG')) settings = Gtk.Settings.get_default() @@ -115,15 +108,19 @@ def __init__(self, args, version): _ = self.lang.gettext Gtk.Window.__init__(self) - self.width = self._config.get_main_config().getint("width", Gdk.Screen.get_width(Gdk.Screen.get_default())) - self.height = self._config.get_main_config().getint("height", Gdk.Screen.get_height(Gdk.Screen.get_default())) + monitor = Gdk.Display.get_default().get_primary_monitor() + self.width = self._config.get_main_config().getint("width", monitor.get_geometry().width) + self.height = self._config.get_main_config().getint("height", monitor.get_geometry().height) self.set_default_size(self.width, self.height) self.set_resizable(False) + if self.width < self.height: + self.vertical_mode = True + else: + self.vertical_mode = False logging.info("Screen resolution: %sx%s" % (self.width, self.height)) - self.theme = self._config.get_main_config_option('theme') - self.gtk = KlippyGtk(self, self.width, self.height, self.theme, - self._config.get_main_config().getboolean("show_cursor", fallback=False), + self.show_cursor = self._config.get_main_config().getboolean("show_cursor", fallback=False) + self.gtk = KlippyGtk(self, self.width, self.height, self.theme, self.show_cursor, self._config.get_main_config_option("font_size", "medium")) self.keyboard_height = self.gtk.get_keyboard_height() self.init_style() @@ -139,16 +136,17 @@ def __init__(self, args, version): # Move mouse to 0,0 os.system("/usr/bin/xdotool mousemove 0 0") - # Change cursor to blank - if self._config.get_main_config().getboolean("show_cursor", fallback=False): - self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.ARROW)) - else: - self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) + self.change_cursor() + self.initial_connection() + def initial_connection(self): printers = self._config.get_printers() - logging.debug("Printers: %s" % printers) - if len(printers) == 1: - pname = list(self._config.get_printers()[0])[0] + default_printer = self._config.get_main_config().get('default_printer') + logging.debug("Default printer: %s" % default_printer) + if [True for p in printers if default_printer in p]: + self.connect_printer(default_printer) + elif len(printers) == 1: + pname = list(printers[0])[0] self.connect_printer(pname) else: self.show_panel("printer_select", "printer_select", "Printer Select", 2) @@ -158,6 +156,7 @@ def connect_printer_widget(self, widget, name): def connect_printer(self, name): _ = self.lang.gettext + self.connecting_to_printer = name if self.connected_printer == name: if self.printer_select_prepanel is not None: @@ -172,11 +171,15 @@ def connect_printer(self, name): self.base_panel.show_macro_shortcut(self._config.get_main_config_option('side_macro_shortcut')) return + # Cleanup self.printer_select_callbacks = [] self.printer_select_prepanel = None - if self.files is not None: + self.files.reset() self.files = None + if self.printer is not None: + self.printer.reset() + self.printer = None for printer in self._config.get_printers(): pname = list(printer)[0] @@ -208,11 +211,10 @@ def connect_printer(self, name): }, self.state_execute) self._remove_all_panels() - panels = list(self.panels) - if len(self.subscriptions) > 0: - self.subscriptions = [] - for panel in panels: - del self.panels[panel] + self.subscriptions = [] + for panel in list(self.panels): + if panel not in ["printer_select", "splash_screen"]: + del self.panels[panel] self.base_panel.show_printer_select(True) self.printer_initializing(_("Connecting to %s") % name) @@ -226,12 +228,6 @@ def connect_printer(self, name): "shutdown": self.state_shutdown }) - powerdevs = self.apiclient.send_request("machine/device_power/devices") - logging.debug("Found power devices: %s" % powerdevs) - if powerdevs is not False: - self.printer.configure_power_devices(powerdevs['result']) - self.panels['splash_screen'].show_restart_buttons() - self._ws = KlippyWebsocket(self, { "on_connect": self.init_printer, @@ -241,6 +237,7 @@ def connect_printer(self, name): data["moonraker_host"], data["moonraker_port"] ) + self.files = KlippyFiles(self) self._ws.initial_connect() self.connecting = False @@ -262,7 +259,8 @@ def ws_subscribe(self): "toolhead": ["homed_axes", "estimated_print_time", "print_time", "position", "extruder", "max_accel", "max_accel_to_decel", "max_velocity", "square_corner_velocity"], "virtual_sdcard": ["file_position", "is_active", "progress"], - "webhooks": ["state", "state_message"] + "webhooks": ["state", "state_message"], + "firmware_retraction": ["retract_length", "retract_speed", "unretract_extra_length", "unretract_speed"] } } for extruder in self.printer.get_tools(): @@ -345,12 +343,18 @@ def show_panel(self, panel_name, type, title, remove=None, pop=True, **kwargs): self._cur_panels.append(panel_name) logging.debug("Current panel hierarchy: %s", str(self._cur_panels)) - def show_popup_message(self, message): + def show_popup_message(self, message, time,level=2): if self.popup_message is not None: self.close_popup_message() box = Gtk.Box() box.get_style_context().add_class("message_popup") + + if level == 1: + box.get_style_context().add_class("message_popup_echo") + else: + box.get_style_context().add_class("message_popup_error") + box.set_size_request(self.width, self.gtk.get_header_size()) label = Gtk.Label() if "must home axis first" in message.lower(): @@ -366,14 +370,12 @@ def show_popup_message(self, message): box.pack_end(close, False, False, 0) box.set_halign(Gtk.Align.CENTER) - cur_panel = self.panels[self._cur_panels[-1]] - self.base_panel.get().put(box, 0, 0) self.show_all() self.popup_message = box - GLib.timeout_add(10000, self.close_popup_message) + GLib.timeout_add_seconds(time, self.close_popup_message) return False @@ -383,7 +385,7 @@ def close_popup_message(self, widget=None): self.base_panel.get().remove(self.popup_message) self.popup_message = None - self.show_all() + self.show_all() def show_error_modal(self, err): _ = self.lang.gettext @@ -404,7 +406,7 @@ def show_error_modal(self, err): label.set_line_wrap(True) label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - dialog = self.gtk.Dialog(self, buttons, label, self.error_modal_response) + self.gtk.Dialog(self, buttons, label, self.error_modal_response) def error_modal_response(self, widget, response_id): widget.destroy() @@ -427,23 +429,63 @@ def restart_warning(self, value): label.set_line_wrap(True) label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - dialog = self.gtk.Dialog(self, buttons, label, self.restart_ks) + self.gtk.Dialog(self, buttons, label, self.restart_ks) def restart_ks(self, widget, response_id): if response_id == Gtk.ResponseType.OK: logging.debug("Restarting") - os.system("sudo systemctl restart KlipperScreen") + os.system("sudo systemctl restart %s" % self._config.get_main_config_option('service')) widget.destroy() def init_style(self): style_provider = Gtk.CssProvider() - - css = open(klipperscreendir + "/styles/base.css") - css_base_data = css.read() - css.close() - css = open(klipperscreendir + "/styles/%s/style.css" % (self.theme)) - css_data = css_base_data + css.read() + css = open(os.path.join(klipperscreendir, "styles", "base.css")) + css_data = css.read() css.close() + f = open(os.path.join(klipperscreendir, "styles", "base.conf")) + style_options = json.load(f) + f.close() + + # Load custom theme + theme = os.path.join(klipperscreendir, "styles", self.theme) + theme_style = os.path.join(theme, "style.css") + theme_style_conf = os.path.join(theme, "style.conf") + + if os.path.exists(theme_style): + css = open(theme_style) + css_data += css.read() + css.close() + if os.path.exists(theme_style_conf): + try: + f = open(theme_style_conf) + style_options.update(json.load(f)) + f.close() + except Exception: + logging.error("Unable to parse custom template conf file.") + + self.gtk.color_list = style_options['graph_colors'] + + for i in range(len(style_options['graph_colors']['extruder']['colors'])): + num = "" if i == 0 else i + css_data += "\n.graph_label_extruder%s {border-left-color: #%s}" % ( + num, + style_options['graph_colors']['extruder']['colors'][i] + ) + for i in range(len(style_options['graph_colors']['bed']['colors'])): + css_data += "\n.graph_label_heater_bed%s {border-left-color: #%s}" % ( + "" if i+1 == 1 else i+1, + style_options['graph_colors']['bed']['colors'][i] + ) + for i in range(len(style_options['graph_colors']['fan']['colors'])): + css_data += "\n.graph_label_fan_%s {border-left-color: #%s}" % ( + i+1, + style_options['graph_colors']['fan']['colors'][i] + ) + for i in range(len(style_options['graph_colors']['sensor']['colors'])): + css_data += "\n.graph_label_sensor_%s {border-left-color: #%s}" % ( + i+1, + style_options['graph_colors']['sensor']['colors'][i] + ) css_data = css_data.replace("KS_FONT_SIZE", str(self.gtk.get_font_size())) @@ -472,7 +514,6 @@ def _go_to_submenu(self, widget, name): # self._remove_current_panel(False) # Find current menu item - panels = list(self._cur_panels) if "main_panel" in self._cur_panels: menu = "__main" elif "splash_screen" in self._cur_panels: @@ -498,12 +539,16 @@ def _remove_all_panels(self): def _remove_current_panel(self, pop=True, show=True): if len(self._cur_panels) > 0: self.base_panel.remove(self.panels[self._cur_panels[-1]].get_content()) + if hasattr(self.panels[self._cur_panels[-1]], "deactivate"): + self.panels[self._cur_panels[-1]].deactivate() self.remove_subscription(self._cur_panels[-1]) if pop is True: self._cur_panels.pop() if len(self._cur_panels) > 0: self.base_panel.add_content(self.panels[self._cur_panels[-1]]) self.base_panel.show_back(False if len(self._cur_panels) == 1 else True) + if hasattr(self.panels[self._cur_panels[-1]], "activate"): + self.panels[self._cur_panels[-1]].activate() if hasattr(self.panels[self._cur_panels[-1]], "process_update"): self.panels[self._cur_panels[-1]].process_update("notify_status_update", self.printer.get_updates()) @@ -525,7 +570,6 @@ def _menu_go_home(self): self._remove_current_panel() def add_subscription(self, panel_name): - add = True for sub in self.subscriptions: if sub == panel_name: return @@ -538,46 +582,105 @@ def remove_subscription(self, panel_name): self.subscriptions.pop(i) return + def reset_screensaver_timeout(self, widget=None): + if self.screensaver_timeout is not None: + GLib.source_remove(self.screensaver_timeout) + self.screensaver_timeout = GLib.timeout_add_seconds(self.blanking_time, self.show_screensaver) + + def show_screensaver(self): + logging.debug("Showing Screensaver") + if self.screensaver is not None: + self.close_screensaver() + + close = Gtk.Button() + close.connect("clicked", self.close_screensaver) + + box = Gtk.Box() + box.set_size_request(self.width, self.height) + box.pack_start(close, True, True, 0) + box.set_halign(Gtk.Align.CENTER) + box.get_style_context().add_class("screensaver") + + self.base_panel.get().put(box, 0, 0) + self.show_all() + self.screensaver = box + return False + + def close_screensaver(self, widget=None): + if self.screensaver is None: + return False + logging.debug("Closing Screensaver") + self.base_panel.get().remove(self.screensaver) + self.screensaver = None + if self.use_dpms: + self.wake_screen() + else: + self.screensaver_timeout = GLib.timeout_add_seconds(self.blanking_time, self.show_screensaver) + self.show_all() + return False + def check_dpms_state(self): state = functions.get_DPMS_state() - if state == functions.DPMS_State.Off and "screensaver" not in self._cur_panels: - logging.info("### Creating screensaver panel") - self.show_panel("screensaver", "screensaver", "Screen Saver", 1, False) - elif state == functions.DPMS_State.On and "screensaver" in self._cur_panels: - logging.info("### Remove screensaver panel") - self._menu_go_back() + + if state == functions.DPMS_State.Fail: + logging.info("DPMS State FAIL: Stopping DPMS Check") + if self.screensaver_timeout is None: + self.set_dpms(False) + return False + elif state != functions.DPMS_State.On: + if self.screensaver is None: + self.show_screensaver() return True def wake_screen(self): - self.time = self._config.get_main_config_option('screen_blanking') # Wake the screen (it will go to standby as configured) - if self.time != "off": + if self._config.get_main_config_option('screen_blanking') != "off": logging.debug("Screen wake up") os.system("xset -display :0 dpms force on") + self.close_screensaver() + + def set_dpms(self, use_dpms): + self.use_dpms = use_dpms + logging.info("DPMS set to: %s" % self.use_dpms) + self.set_screenblanking_timeout(self._config.get_main_config_option('screen_blanking')) def set_screenblanking_timeout(self, time): - # Disable screen blanking - os.system("xset -display :0 s off") os.system("xset -display :0 s noblank") + os.system("xset -display :0 s off") + self.use_dpms = self._config.get_main_config().getboolean("use_dpms", fallback=True) - if functions.dpms_loaded is False: - logging.info("DPMS functions not loaded. Unable to protect on button click when DPMS is enabled.") - - - logging.debug("Changing power save to: %s" % time) if time == "off": + logging.debug("Screen blanking: %s" % time) if self.dpms_timeout is not None: GLib.source_remove(self.dpms_timeout) self.dpms_timeout = None - os.system("xset -display :0 -dpms") + if self.screensaver_timeout is not None: + GLib.source_remove(self.screensaver_timeout) + os.system("xset -display :0 dpms 0 0 0") return - time = int(time) - if time < 0: - return - os.system("xset -display :0 dpms 0 %s 0" % time) - if self.dpms_timeout is None and functions.dpms_loaded is True: - self.dpms_timeout = GLib.timeout_add(1000, self.check_dpms_state) + self.blanking_time = abs(int(time)) + logging.debug("Changing screen blanking to: %d" % self.blanking_time) + if self.use_dpms and functions.dpms_loaded is True: + os.system("xset -display :0 +dpms") + if functions.get_DPMS_state() == functions.DPMS_State.Fail: + logging.info("DPMS State FAIL") + else: + logging.debug("Using DPMS") + os.system("xset -display :0 s off") + os.system("xset -display :0 dpms 0 %s 0" % self.blanking_time) + if self.dpms_timeout is None: + self.dpms_timeout = GLib.timeout_add_seconds(1, self.check_dpms_state) + return + # Without dpms just blank the screen + logging.debug("Not using DPMS") + if self.dpms_timeout is not None: + GLib.source_remove(self.dpms_timeout) + self.dpms_timeout = None + os.system("xset -display :0 dpms 0 0 0") + if self.screensaver_timeout is None: + self.screensaver_timeout = GLib.timeout_add_seconds(self.blanking_time, self.show_screensaver) + return def set_updating(self, updating=False): if self.updating is True and updating is False: @@ -611,12 +714,14 @@ def state_disconnected(self, prev_state): _ = self.lang.gettext logging.debug("### Going to disconnected") self.base_panel.show_macro_shortcut(False) + self.wake_screen() self.printer_initializing(_("Klipper has disconnected")) - - for panel in list(self.panels): - if panel in ["printer_select", "splash_screen"]: - continue - # del self.panels[panel] + if self.connected_printer is not None: + self.connected_printer = None + # Try to reconnect + self.connect_printer(self.connecting_to_printer) + else: + self.initial_connection() def state_error(self, prev_state): if "printer_select" in self._cur_panels: @@ -625,24 +730,23 @@ def state_error(self, prev_state): _ = self.lang.gettext self.base_panel.show_macro_shortcut(False) + self.wake_screen() msg = self.printer.get_stat("webhooks", "state_message") if "FIRMWARE_RESTART" in msg: - self.printer_initializing( - _("Klipper has encountered an error.\nIssue a FIRMWARE_RESTART to attempt fixing the issue.") - ) + self.printer_initializing("" + _("Klipper has encountered an error.") + "\n" + + _("A FIRMWARE_RESTART may fix the issue.") + + "" + "\n\n" + msg) elif "micro-controller" in msg: - self.printer_initializing( - _("Klipper has encountered an error with the micro-controller.\nPlease recompile and flash.") - ) + self.printer_initializing("" + _("Klipper has encountered an error.") + + _("Please recompile and flash the micro-controller.") + + "" + "\n\n" + msg) else: - self.printer_initializing( - _("Klipper has encountered an error.") - ) + self.printer_initializing("" + _("Klipper has encountered an error.") + + "" + "\n\n" + msg) for panel in list(self.panels): - if panel in ["printer_select", "splash_screen"]: - continue - del self.panels[panel] + if panel not in ["printer_select", "splash_screen"]: + del self.panels[panel] def state_paused(self, prev_state): if "job_status" not in self._cur_panels: @@ -671,7 +775,7 @@ def state_ready(self, prev_state): if prev_state not in ['paused', 'printing']: self.init_printer() self.base_panel._printer = self.printer - self.base_panel.show_heaters() + self.base_panel.show_heaters(True) self.printer_ready() @@ -690,7 +794,12 @@ def state_shutdown(self, prev_state): _ = self.lang.gettext self.base_panel.show_macro_shortcut(False) - self.printer_initializing(_("Klipper has shutdown")) + self.wake_screen() + msg = self.printer.get_stat("webhooks", "state_message") + if "ready" in msg: + msg = "" + self.printer_initializing("" + _("Klipper has shutdown") + + "" + "\n\n" + msg) def toggle_macro_shortcut(self, value): if value is True: @@ -723,6 +832,7 @@ def _websocket_callback(self, action, data): elif action == "notify_power_changed": logging.debug("Power status changed: %s", data) self.printer.process_power_update(data) + self.panels['splash_screen'].check_power_status() elif self.printer.get_state() not in ["error", "shutdown"] and action == "notify_gcode_response": if "Klipper state: Shutdown" in data: logging.debug("Shutdown in gcode response, changing state to shutdown") @@ -730,9 +840,11 @@ def _websocket_callback(self, action, data): if not (data.startswith("B:") and re.search(r'B:[0-9\.]+\s/[0-9\.]+\sT[0-9]+:[0-9\.]+', data)): + if data.startswith("echo: "): + self.show_popup_message(data[6:], 1) if data.startswith("!! "): - self.show_popup_message(data[3:]) - # logging.debug(json.dumps([action, data], indent=2)) + self.show_popup_message(data[3:], 2) + logging.debug(json.dumps([action, data], indent=2)) self.base_panel.process_update(action, data) if self._cur_panels[-1] in self.subscriptions: @@ -763,7 +875,7 @@ def _confirm_send_action(self, widget, text, method, params={}): label.set_line_wrap(True) label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) - dialog = self.gtk.Dialog(self, buttons, label, self._confirm_send_action_response, method, params) + self.gtk.Dialog(self, buttons, label, self._confirm_send_action_response, method, params) def _confirm_send_action_response(self, widget, response_id, method, params): if response_id == Gtk.ResponseType.OK: @@ -773,32 +885,122 @@ def _confirm_send_action_response(self, widget, response_id, method, params): def _send_action(self, widget, method, params): self._ws.send_method(method, params) + - def printer_initializing(self, text=None): - self.shutdown = True + def _confirm_test(self, widget, text): + _ = self.lang.gettext + + buttons = [ + {"name": _("Continue"), "response": Gtk.ResponseType.OK}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL} + ] + + try: + env = Environment(extensions=["jinja2.ext.i18n"]) + env.install_gettext_translations(self.lang) + j2_temp = env.from_string(text) + text = j2_temp.render() + except Exception: + logging.debug("Error parsing jinja for confirm_send_action") + + label = Gtk.Label() + label.set_markup(text) + label.set_hexpand(True) + label.set_halign(Gtk.Align.CENTER) + label.set_vexpand(True) + label.set_valign(Gtk.Align.CENTER) + label.set_line_wrap(True) + label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + + self.gtk.Dialog(self, buttons, label, self._confirm_send_test) + + def _confirm_send_test(self, widget, response_id): + if response_id == Gtk.ResponseType.OK: + self._ws.klippy.gcode_script("M81") + # time.sleep(3) + os.system("sudo shutdown -P now") + widget.destroy() + + + + def printer_initializing(self, text=None, disconnect=False): self.close_popup_message() self.show_panel('splash_screen', "splash_screen", "Splash Screen", 2) + if disconnect is True and self.printer is not None: + self.shutdown = True + self.printer.state = "disconnected" if text is not None: self.panels['splash_screen'].update_text(text) - self.panels['splash_screen'].show_restart_buttons() + + def search_power_devices(self, power_devices): + if self.connected_printer is not None: + found_devices = [] + devices = self.printer.get_power_devices() + logging.debug("Power devices: %s", devices) + if devices is not None: + for device in devices: + for power_device in power_devices: + if device == power_device and power_device not in found_devices: + found_devices.append(power_device) + if len(found_devices) > 0: + logging.info("Found %s", found_devices) + return found_devices + else: + logging.info("Power devices not found") + return None + + def power_on(self, widget, devices): + _ = self.lang.gettext + for device in devices: + if self.printer.get_power_device_status(device) == "off": + self.show_popup_message(_("Sending Power ON signal to: %s") % devices, level=1) + logging.info("%s is OFF, Sending Power ON signal", device) + self._ws.klippy.power_device_on(device) + elif self.printer.get_power_device_status(device) == "on": + logging.info("%s is ON", device) def init_printer(self): _ = self.lang.gettext + state = self.apiclient.get_server_info() + if state is False: + return False + else: + # Moonraker is ready, set a loop to init the printer + self.reinit_count += 1 + self.init_printer_timeout = GLib.timeout_add_seconds(3, self.init_printer) + + self.shutdown = False + powerdevs = self.apiclient.send_request("machine/device_power/devices") + if powerdevs is not False: + self.printer.configure_power_devices(powerdevs['result']) + + if state['result']['klippy_connected'] is False: + self.panels['splash_screen'].update_text( + _("Moonraker: connected") + + ("\n\nKlipper: %s\n\n") % state['result']['klippy_state'] + + _("Retry #%s") % self.reinit_count) + return False + printer_info = self.apiclient.get_printer_info() if printer_info is False: - logging.info("Unable to get printer info from moonraker") + msg = "Unable to get printer info from moonraker" + logging.info(msg) + self.panels['splash_screen'].update_text(msg) return False data = self.apiclient.send_request("printer/objects/query?" + "&".join(PRINTER_BASE_STATUS_OBJECTS)) if data is False: - logging.info("Error getting printer object data") + msg = "Error getting printer object data" + logging.info(msg) + self.panels['splash_screen'].update_text(msg) return False - powerdevs = self.apiclient.send_request("machine/device_power/devices") data = data['result']['status'] config = self.apiclient.send_request("printer/objects/query?configfile") if config is False: - logging.info("Error getting printer config data") + msg = "Error getting printer config data" + logging.info(msg) + self.panels['splash_screen'].update_text(msg) return False # Reinitialize printer, in case the printer was shut down and anything has changed. @@ -816,16 +1018,23 @@ def init_printer(self): data = self.apiclient.send_request("printer/objects/query?" + "&".join(PRINTER_BASE_STATUS_OBJECTS + extra_items)) if data is False: - logging.info("Error getting printer object data") + msg = "Error getting printer object data with extra items" + logging.info(msg) + self.panels['splash_screen'].update_text(msg) return False - logging.info("Startup data: %s" % data['result']['status']) + + tempstore = self.apiclient.send_request("server/temperature_store") + if tempstore is not False: + self.printer.init_temp_store(tempstore['result']) self.printer.process_update(data['result']['status']) self.files.initialize() self.files.refresh_files() - if powerdevs is not False: - self.printer.configure_power_devices(powerdevs['result']) + logging.info("Printer initialized") + GLib.source_remove(self.init_printer_timeout) + self.reinit_count = 0 + return False def printer_ready(self): _ = self.lang.gettext @@ -842,6 +1051,7 @@ def printer_ready(self): def printer_printing(self): self.close_popup_message() self.show_panel('job_status', "job_status", "Print Status", 2) + self.base_panel.show_heaters(True) def show_keyboard(self, widget=None): if self.keyboard is not None: @@ -889,6 +1099,17 @@ def remove_keyboard(self, widget=None): os.kill(self.keyboard['process'].pid, signal.SIGTERM) self.keyboard = None + def change_cursor(self, cursortype=None): + if cursortype == "watch": + os.system("xsetroot -cursor_name watch") + elif self.show_cursor: + self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.ARROW)) + os.system("xsetroot -cursor_name arrow") + else: + self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR)) + os.system("xsetroot -cursor ks_includes/emptyCursor.xbm ks_includes/emptyCursor.xbm") + return + def main(): version = functions.get_software_version() @@ -923,4 +1144,4 @@ def main(): try: main() except Exception: - logging.exception("Fatal error in main loop") + logging.exception("Fatal error in main loop") \ No newline at end of file diff --git a/scripts/KlipperScreen-install.sh b/scripts/KlipperScreen-install.sh old mode 100755 new mode 100644 diff --git a/styles/base.conf b/styles/base.conf new file mode 100644 index 000000000..da7fffad9 --- /dev/null +++ b/styles/base.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["FF5252", "FF7252", "FF9252", "FFB252", "FFD252"], + "state": 0 + }, + "bed": { + "colors": ["1FB0FF"], + "state": 0 + }, + "fan": { + "colors": ["3DC25A", "58FC7C", "10EB40", "7EF297"], + "state": 0 + }, + "sensor": { + "colors": ["D67600", "830EE3", "B366F2", "E06573", "E38819"], + "state": 0 + } + } +} diff --git a/styles/base.css b/styles/base.css index 2fd9543ff..6f8e380fb 100644 --- a/styles/base.css +++ b/styles/base.css @@ -1,408 +1,488 @@ -* { - color: white; - font-size: KS_FONT_SIZEpx; - -GtkComboBox-appears-as-list: 0; - text-shadow: none; - box-shadow: none; -} - -window { - background-color: #13181C; - -gtk-icon-shadow: none; -} - -button { - background-image: none; - background-color: #13181C; - margin: .25em; - padding: 0 .5em; - border-radius: 0; - border: 0; - -gtk-icon-shadow: none; -} - -button:active { - background-color: #304C62; -} - -.button_active { - background-color: #20303D; -} - -button.color1 { - border-bottom: .4em solid #ED6500; - margin: .3em; -} - -button.color2 { - border-bottom: .4em solid #B10080; - margin: .3em; -} - -button.color3 { - border-bottom: .4em solid #009384; - margin: .3em; -} - -button.color4 { - border-bottom: .4em solid #A7E100; - margin: .3em; -} - -button.active { - background-color: #20303D; -} - -button.file-list { - margin: 0; -} - -button.update { - background: #009384; - border: .4em solid #009384; - border-radius: 0.4em; - font-weight: bold; -} - -button.invalid { - background: #e61e1e; - border: .4em solid #e61e1e; - border-radius: 0.4em; - font-weight: bold; -} - -combobox box button { - border: .05em solid #cccccc; - padding: .5em 1em; -} - -combobox arrow { - min-width: 1em; -} - -switch slider { - border: 0; -} - -entry { - font-size: 1em; - background-color: #20292F; - border: 1em solid #13181C; - padding: .25em; -} - -frame { - color: white; - border-bottom: 1px solid #444; -} - -label { - color: white; -} - -menu { - background-color: #13181C; - border: .1em solid #cccccc; -} - -menuitem { - background-color: #13181C; - border: .1em solid #cccccc; - border-bottom: 0; - border-top: 0; -} - -trough { - min-height: 2em; - background-color: #404E57; - color: white; - border: 1px solid black; -} - -trough highlight, trough progress { - min-height: 2em; - background-color: #3584e4; - color: white; - border: 1px solid black; -} - -trough progress.left { - border: 0px; -} - -scale mark { - margin-top: 1em; - color: white; -} - -scale trough slider { - min-height: 2em; - min-width: 2em; -} - -scrollbar, scrollbar button, scrollbar trough { - border: none; - background-color: #13181C; -} - -scrollbar slider { - min-width: 2.5em; - border-radius: .7em; - background-color: #404E57; -} - -textview, textview text { - background: transparent; - font-family: Free Mono; -} - -textview .time { - color: grey; -} - -trough { - margin: .5em 1em; -} - -.popup { - background-color: black; -} - -.action_bar { - /*border-right: 2px solid #444;*/ -} - -.dialog { - border: .1em solid black; - padding: 2.5em; - background-color: black; - margin: 1em; -} - -.dialog button { - padding: 1.5em; - border-bottom: .4em solid #009384; - margin-top: 1em; -} - -.dialog button:nth-child(1) { - border-bottom-color: green; -} - -.dialog button:nth-child(2) { - border-bottom-color: red; -} - -.distbutton_active { - background-color: #20303D; -} - -.distbutton_top { - border: .15em solid white; - border-right: 0; - border-top-left-radius: .75em; - border-bottom-left-radius: .75em; - margin-right: 0; -} - -.distbutton { - border: .15em solid white; - border-left: .15em solid #ccc; - border-right: 0; - margin-left: 0; - margin-right: 0; -} - -.distbutton_bottom { - border: .15em solid white; - border-left: .15em solid #ccc; - border-top-right-radius: .7em; - border-bottom-right-radius: .7em; - margin-left: 0; -} - -.fan_slider { - margin: 0 1em 0 1em; - color: white; -} - -.frame-item { - min-height: 4.5em; - padding: .2em .3em; -} - -.updater-item { - min-height: 3em; - padding: .2em; -} - -.message_popup { - background-color: #367554; - border-bottom: .1em solid white; -} - -.message_popup button { - background-color: #367554; -} - -.numpad_tleft { - border: .15em solid white; - border-bottom: 0; - border-right: 0; - border-top-left-radius: .7em; - margin: .15em 0 0 .15em; -} - -.numpad_top { - border: .15em solid white; - border-bottom: 0; - border-right: 0; - margin: .15em 0 0 0; -} - -.numpad_tright { - border: .15em solid white; - border-bottom: 0; - border-top-right-radius: .7em; - margin: .15em .15em 0 0; -} - -.numpad_left { - border: .15em solid white; - border-right: 0; - border-bottom: 0; - margin: 0 0 0 .15em; -} - -.numpad_button { - border: .15em solid white; - border-right: 0; - border-bottom: 0; - margin: 0; -} - -.numpad_right { - border: .15em solid white; - border-bottom: 0; - margin: 0 .15em 0 0; -} - -.numpad_bleft { - border: .15em solid white; - border-right: 0; - border-bottom-left-radius: .7em; - margin: 0 0 .15em .15em; -} - -.numpad_bottom { - border: .15em solid white; - border-right: 0; - margin: 0 0 .15em 0; -} - -.numpad_bright { - border: .15em solid white; - border-bottom-right-radius: .7em; - margin: 0 .15em .15em 0; -} - -.printing-filename { - font-size: 1.75em; - font-weight: bold; - margin: .25em .25em 0 0; -} - -.printing-info { - font-size: 1.2em; - margin-left: .25em; -} - -.printing-info-box { - padding-left: .25em; -} - -.printing-info-box box { - margin-bottom: .25em; -} - -.printing-status { - color: #f0f0f0; - font-style: italic; - margin: 0 0 0 0; -} - -.printing-progress-bar { - color: #00C9B4; -} - -.printing-progress-text { - font-size: 1.5em; - font-weight: bold; - color: white; -} - -.printing-status-label { - padding-top: .25em; - padding-bottom: .15em; - color: #ccc; - font-size: 1.25em; -} - -.tempbutton_top { - border: .15em solid white; - border-bottom: 0; - border-top-left-radius: .75em; - border-top-right-radius: .75em; - margin-bottom: 0; -} - -.tempbutton { - border: .15em solid white; - border-top: .15em solid #ccc; - border-bottom: 0; - margin-top: 0; - margin-bottom: 0; -} - -.tempbutton_bottom { - border: .15em solid white; - border-top: .15em solid #ccc; - border-bottom-left-radius: .7em; - border-bottom-right-radius: .7em; - margin-top: 0; -} - -.message { - border: .1em solid #981E1F; - font-size: 1em; - padding: 2.5em; - color: white; - background-color: #981E1F; -} - -.message button { - background-color: white; - color: black; - padding: 2em 2.5em 2em 2.5em; -} - -.notification { - background-clip: padding-box; - padding: .25em; - border-radius: 0 0 .25em .25em; - opacity: 0.8; -} - -.system-program-grid { - padding: 0.25em; - padding-right: .5em; - padding-bottom: 0; -} - -.warning { - background-color: rgba(30, 204, 39, 0.7); -} - -.error { - background-color: rgba(204, 30, 30, 0.7); -} +* { + color: white; + font-size: KS_FONT_SIZEpx; + -GtkComboBox-appears-as-list: 0; + text-shadow: none; + box-shadow: none; + border: 0; +} + +window { + background-color: #13181C; + -gtk-icon-shadow: none; +} + +button { + background-image: none; + background-color: #13181C; + margin: .25em; + padding: 0 .5em; + border-radius: 0; + border: 0; + -gtk-icon-shadow: none; +} + +button:active { + background-color: #304C62; +} + +.button_active { + background-color: #20303D; +} + +button.color1 { + border-bottom: .4em solid #ED6500; + margin: .3em; + min-height: 3em; +} + +button.color2 { + border-bottom: .4em solid #B10080; + margin: .3em; + min-height: 3em; +} + +button.color3 { + border-bottom: .4em solid #009384; + margin: .3em; + min-height: 3em; +} + +button.color4 { + border-bottom: .4em solid #A7E100; + margin: .3em; + min-height: 3em; +} + +button.active { + background-color: #20303D; +} + +button.file-list { + margin: 0; +} + +button.update { + background: #009384; + border: .4em solid #009384; + border-radius: 0.4em; + font-weight: bold; +} + +button.invalid { + background: #e61e1e; + border: .4em solid #e61e1e; + border-radius: 0.4em; + font-weight: bold; +} + +combobox box button { + border: .05em solid #cccccc; + padding: .5em 1em; +} + +combobox arrow { + min-width: 1em; +} + +switch { + border: 0; + border-radius: 3em; +} + +switch slider { + border: 0; +} + +entry { + font-size: 1em; + background-color: #20292F; + border: 1em solid #13181C; + padding: .25em; +} + +frame { + color: white; + border-bottom: 1px solid #444; +} + +label { + color: white; +} + +menu { + background-color: #13181C; + border: .1em solid #cccccc; +} + +menuitem { + background-color: #13181C; + border: .1em solid #cccccc; + border-bottom: 0; + border-top: 0; +} + +trough { + min-height: 2em; + background-color: #404E57; + color: white; + border: 1px solid black; +} + +trough highlight, trough progress { + min-height: 2em; + background-color: #3584e4; + color: white; + border: 1px solid black; +} + +trough progress.left { + border: 0px; +} + +scale mark { + margin-top: 1em; + color: white; +} + +scale trough slider { + min-height: 2em; + min-width: 2em; +} + +scrollbar, scrollbar button, scrollbar trough { + border: none; + background-color: #13181C; +} + +scrollbar slider { + min-width: 1.5em; + border-radius: .7em; + background-color: #404E57; +} + +textview, textview text { + background: transparent; + font-family: Free Mono; +} + +textview .time { + color: grey; +} + +trough { + margin: .5em 1em; +} + +.popup { + background-color: black; +} + +.action_bar { + /*border-right: 2px solid #444;*/ +} + +.active_device { + background-color: #20303D; +} + +.dialog { + border: .1em solid black; + padding: 2.5em; + background-color: black; + margin: 1em; +} + +.dialog button { + padding: 1.5em; + border-bottom: .4em solid #009384; + margin-top: 1em; +} + +.dialog button:nth-child(1) { + border-bottom-color: green; +} + +.dialog button:nth-child(2) { + border-bottom-color: red; +} + +.distbutton_active { + background-color: #20303D; +} + +.distbutton_top { + border: .15em solid white; + border-right: 0; + border-top-left-radius: .75em; + border-bottom-left-radius: .75em; + margin-right: 0; + min-height: 3em; +} + +.distbutton { + border: .15em solid white; + border-left: .15em solid #ccc; + border-right: 0; + margin-left: 0; + margin-right: 0; + min-height: 3em; +} + +.distbutton_bottom { + border: .15em solid white; + border-left: .15em solid #ccc; + border-top-right-radius: .7em; + border-bottom-right-radius: .7em; + margin-left: 0; + min-height: 3em; +} + +.extruder-0 { + color: #ff0000; +} + +.extruder-1 { + color: #00ff00; +} + +.extruder-2 { + color: #0000ff; +} + +.fan_slider { + margin: 0 1em 0 1em; + color: white; +} + +.frame-item { + min-height: 4.5em; + padding: .2em .3em; +} + +.heatergraph { + min-height: 350px; +} + +.heater-grid { + margin-right: .1em; +} + +.heater-grid label { + margin-top: .2em; + margin-bottom: .2em; + min-height: 2em; +} + +.message_popup { + border-bottom: .1em solid white; +} + +.message_popup_echo, .message_popup_echo button { + background-color: #367554; +} + +.message_popup_error, .message_popup_error button { + background-color: #9e2f3a; +} + +.numpad_tleft { + border: .15em solid white; + border-bottom: 0; + border-right: 0; + border-top-left-radius: .7em; + margin: .15em 0 0 .15em; +} + +.numpad_top { + border: .15em solid white; + border-bottom: 0; + border-right: 0; + margin: .15em 0 0 0; +} + +.numpad_tright { + border: .15em solid white; + border-bottom: 0; + border-top-right-radius: .7em; + margin: .15em .15em 0 0; +} + +.numpad_left { + border: .15em solid white; + border-right: 0; + border-bottom: 0; + margin: 0 0 0 .15em; +} + +.numpad_button { + border: .15em solid white; + border-right: 0; + border-bottom: 0; + margin: 0; +} + +.numpad_right { + border: .15em solid white; + border-bottom: 0; + margin: 0 .15em 0 0; +} + +.numpad_bleft { + border: .15em solid white; + border-right: 0; + border-bottom-left-radius: .7em; + margin: 0 0 .15em .15em; +} + +.numpad_bottom { + border: .15em solid white; + border-right: 0; + margin: 0 0 .15em 0; +} + +.numpad_bright { + border: .15em solid white; + border-bottom-right-radius: .7em; + margin: 0 .15em .15em 0; +} + +.printing-filename { + font-size: 1.75em; + font-weight: bold; + margin: .25em .25em 0 0; +} + +.printing-info { + font-size: 1.2em; + margin-left: .25em; +} + +.printing-info-box { + padding-left: .25em; +} + +.printing-info-box box { + margin-bottom: .25em; +} + +.printing-status { + color: #f0f0f0; + font-style: italic; + margin: 0 0 0 0; +} + +.printing-progress-bar { + color: #00C9B4; +} + +.printing-progress-text { + font-size: 1.5em; + font-weight: bold; + color: white; +} + +.printing-status-label { + padding-top: .25em; + padding-bottom: .15em; + color: #ccc; + font-size: 1.25em; +} + +.tempbutton_top { + border: .15em solid white; + border-bottom: 0; + border-top-left-radius: .75em; + border-top-right-radius: .75em; + margin-bottom: 0; +} + +.tempbutton { + border: .15em solid white; + border-top: .15em solid #ccc; + border-bottom: 0; + margin-top: 0; + margin-bottom: 0; +} + +.tempbutton_bottom { + border: .15em solid white; + border-top: .15em solid #ccc; + border-bottom-left-radius: .7em; + border-bottom-right-radius: .7em; + margin-top: 0; +} + +.updater-item { + min-height: 3em; + padding: .2em; +} + +.message { + border: .1em solid #981E1F; + font-size: 1em; + padding: 2.5em; + color: white; + background-color: #981E1F; +} + +.message button { + background-color: white; + color: black; + padding: 2em 2.5em 2em 2.5em; +} + +.notification { + background-clip: padding-box; + padding: .25em; + border-radius: 0 0 .25em .25em; + opacity: 0.8; +} + +.system-program-grid { + padding: 0.25em; + padding-right: .5em; + padding-bottom: 0; +} + +.warning { + background-color: rgba(30, 204, 39, 0.7); +} + +.error { + background-color: rgba(204, 30, 30, 0.7); +} + +popover { + background-color: #222; +} + +popover button { + background-color: #222; +} + +.screensaver { + background-color: black; +} + +.screensaver button:active { + background-color: rgba(0, 0, 0, 0.5); +} + +/* Hardcoded values until creation of dynamic CSS updates */ +.graph_label_hidden {padding-left: .9em;} /* .4em on top of normal button padding */ +.graph_label_extruder {border-left-width: .4em; border-left-style: solid;} +.graph_label_extruder1 {border-left-width: .4em; border-left-style: solid;} +.graph_label_extruder2 {border-left-width: .4em; border-left-style: solid;} +.graph_label_extruder3 {border-left-width: .4em; border-left-style: solid;} +.graph_label_extruder4 {border-left-width: .4em; border-left-style: solid;} +.graph_label_heater_bed {border-left-width: .4em; border-left-style: solid;} +.graph_label_fan_1 {border-left-width: .4em; border-left-style: solid;} +.graph_label_fan_2 {border-left-width: .4em; border-left-style: solid;} +.graph_label_fan_3 {border-left-width: .4em; border-left-style: solid;} +.graph_label_fan_4 {border-left-width: .4em; border-left-style: solid;} +.graph_label_sensor_1 {border-left-width: .4em; border-left-style: solid;} +.graph_label_sensor_2 {border-left-width: .4em; border-left-style: solid;} +.graph_label_sensor_3 {border-left-width: .4em; border-left-style: solid;} +.graph_label_sensor_4 {border-left-width: .4em; border-left-style: solid;} +.graph_label_sensor_5 {border-left-width: .4em; border-left-style: solid;} diff --git a/styles/colorized/images/arrow-down.svg b/styles/colorized/images/arrow-down.svg index 2b09a9772..1670b8ae6 100644 --- a/styles/colorized/images/arrow-down.svg +++ b/styles/colorized/images/arrow-down.svg @@ -1,66 +1,66 @@ - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/arrow-left.svg b/styles/colorized/images/arrow-left.svg index f5657df07..4dc89069d 100644 --- a/styles/colorized/images/arrow-left.svg +++ b/styles/colorized/images/arrow-left.svg @@ -1,66 +1,66 @@ - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/arrow-right.svg b/styles/colorized/images/arrow-right.svg index cd38b2e81..8b2da4632 100644 --- a/styles/colorized/images/arrow-right.svg +++ b/styles/colorized/images/arrow-right.svg @@ -1,66 +1,66 @@ - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/arrow-up.svg b/styles/colorized/images/arrow-up.svg index 69e61d1ad..bfcebf003 100644 --- a/styles/colorized/images/arrow-up.svg +++ b/styles/colorized/images/arrow-up.svg @@ -1,66 +1,66 @@ - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/back.svg b/styles/colorized/images/back.svg index 1471f4c44..0676d76da 100644 --- a/styles/colorized/images/back.svg +++ b/styles/colorized/images/back.svg @@ -1,86 +1,86 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/styles/colorized/images/backspace.svg b/styles/colorized/images/backspace.svg index ac5182bad..e4e6b0f9e 100644 --- a/styles/colorized/images/backspace.svg +++ b/styles/colorized/images/backspace.svg @@ -1,90 +1,90 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/styles/colorized/images/bed-level-b-l.svg b/styles/colorized/images/bed-level-b-l.svg index 2102be8b8..afaa619d3 100644 --- a/styles/colorized/images/bed-level-b-l.svg +++ b/styles/colorized/images/bed-level-b-l.svg @@ -1,74 +1,74 @@ - - - - - - image/svg+xml - - bed-level-b-l - - - - - - - bed-level-b-l - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + bed-level-b-l + + + + + + + bed-level-b-l + Created with Sketch. + + + + + + diff --git a/styles/colorized/images/bed-level-b-m.svg b/styles/colorized/images/bed-level-b-m.svg new file mode 100644 index 000000000..9dcfd40b8 --- /dev/null +++ b/styles/colorized/images/bed-level-b-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/colorized/images/bed-level-b-r.svg b/styles/colorized/images/bed-level-b-r.svg index 6df0c6815..621e42453 100644 --- a/styles/colorized/images/bed-level-b-r.svg +++ b/styles/colorized/images/bed-level-b-r.svg @@ -1,75 +1,75 @@ - - - - - - image/svg+xml - - bed-level-b-l - - - - - - - bed-level-b-l - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + bed-level-b-l + + + + + + + bed-level-b-l + Created with Sketch. + + + + + + diff --git a/styles/colorized/images/bed-level-l-m.svg b/styles/colorized/images/bed-level-l-m.svg new file mode 100644 index 000000000..d4b9770c3 --- /dev/null +++ b/styles/colorized/images/bed-level-l-m.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/colorized/images/bed-level-r-m.svg b/styles/colorized/images/bed-level-r-m.svg new file mode 100644 index 000000000..dd0df41c5 --- /dev/null +++ b/styles/colorized/images/bed-level-r-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/colorized/images/bed-level-t-l.svg b/styles/colorized/images/bed-level-t-l.svg index 00a9478b9..284df8e7d 100644 --- a/styles/colorized/images/bed-level-t-l.svg +++ b/styles/colorized/images/bed-level-t-l.svg @@ -1,75 +1,75 @@ - - - - - - image/svg+xml - - bed-level-b-l - - - - - - - bed-level-b-l - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + bed-level-b-l + + + + + + + bed-level-b-l + Created with Sketch. + + + + + + diff --git a/styles/colorized/images/bed-level-t-m.svg b/styles/colorized/images/bed-level-t-m.svg new file mode 100644 index 000000000..aa1537e69 --- /dev/null +++ b/styles/colorized/images/bed-level-t-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/colorized/images/bed-level-t-r.svg b/styles/colorized/images/bed-level-t-r.svg index 7ab8246fc..3aa4c8d10 100644 --- a/styles/colorized/images/bed-level-t-r.svg +++ b/styles/colorized/images/bed-level-t-r.svg @@ -1,75 +1,75 @@ - - - - - - image/svg+xml - - bed-level-b-l - - - - - - - bed-level-b-l - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + bed-level-b-l + + + + + + + bed-level-b-l + Created with Sketch. + + + + + + diff --git a/styles/colorized/images/bed-level.svg b/styles/colorized/images/bed-level.svg index 37017661a..100ec85d0 100644 --- a/styles/colorized/images/bed-level.svg +++ b/styles/colorized/images/bed-level.svg @@ -1,125 +1,125 @@ - - - - - - - image/svg+xml - - bed - - - - - - - - - - - - - - bed - Created with Sketch. - - - - - - - + + + + + + + image/svg+xml + + bed + + + + + + + + + + + + + + bed + Created with Sketch. + + + + + + + diff --git a/styles/colorized/images/bed.svg b/styles/colorized/images/bed.svg index 7a5d53bca..720cd3d57 100644 --- a/styles/colorized/images/bed.svg +++ b/styles/colorized/images/bed.svg @@ -1,195 +1,195 @@ - - - - - - - image/svg+xml - - bed - - - - - - - - - - - - - - - - - - bed - Created with Sketch. - - - - - - - - - - - - + + + + + + + image/svg+xml + + bed + + + + + + + + + + + + + + + + + + bed + Created with Sketch. + + + + + + + + + + + + diff --git a/styles/colorized/images/camera.svg b/styles/colorized/images/camera.svg index 75a3224db..40d7c82af 100644 --- a/styles/colorized/images/camera.svg +++ b/styles/colorized/images/camera.svg @@ -1,111 +1,111 @@ - - - - - - - - image/svg+xml - - extruder1 - - - - - - - - - - - - - - extruder1 - Created with Sketch. - - - + + + + + + + + image/svg+xml + + extruder1 + + + + + + + + + + + + + + extruder1 + Created with Sketch. + + + diff --git a/styles/colorized/images/camera2.svg b/styles/colorized/images/camera2.svg index 1e3bcaa27..50d6b9bc1 100644 --- a/styles/colorized/images/camera2.svg +++ b/styles/colorized/images/camera2.svg @@ -1,108 +1,108 @@ - - - - - - - image/svg+xml - - extruder1 - - - - - - - extruder1 - - Created with Sketch. - - - - - + + + + + + + image/svg+xml + + extruder1 + + + + + + + extruder1 + + Created with Sketch. + + + + + diff --git a/styles/colorized/images/cancel.svg b/styles/colorized/images/cancel.svg index 3c0e726fd..5222378e7 100644 --- a/styles/colorized/images/cancel.svg +++ b/styles/colorized/images/cancel.svg @@ -1,80 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/colorized/images/clock.svg b/styles/colorized/images/clock.svg index 064cc7535..9e3c5bbb0 100644 --- a/styles/colorized/images/clock.svg +++ b/styles/colorized/images/clock.svg @@ -1,88 +1,88 @@ - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/styles/colorized/images/complete.svg b/styles/colorized/images/complete.svg index 48fe62226..6a8201878 100644 --- a/styles/colorized/images/complete.svg +++ b/styles/colorized/images/complete.svg @@ -1,86 +1,86 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/styles/colorized/images/console.svg b/styles/colorized/images/console.svg index 9253f9962..9b207344d 100644 --- a/styles/colorized/images/console.svg +++ b/styles/colorized/images/console.svg @@ -1,98 +1,98 @@ - - - - - - - - image/svg+xml - - - - alfrix - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + alfrix + + + + + + + + + + + + diff --git a/styles/colorized/images/cool-down.svg b/styles/colorized/images/cool-down.svg index 9b37edf94..bf90c7ffe 100644 --- a/styles/colorized/images/cool-down.svg +++ b/styles/colorized/images/cool-down.svg @@ -1,174 +1,174 @@ - - - - - - image/svg+xml - - folder - - - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/custom-script.svg b/styles/colorized/images/custom-script.svg index 693c9eba5..1c7906f72 100644 --- a/styles/colorized/images/custom-script.svg +++ b/styles/colorized/images/custom-script.svg @@ -1,78 +1,78 @@ - -image/svg+xml + +image/svg+xml diff --git a/styles/colorized/images/decrease.svg b/styles/colorized/images/decrease.svg index b6f7601c2..6a01f1c82 100644 --- a/styles/colorized/images/decrease.svg +++ b/styles/colorized/images/decrease.svg @@ -1,57 +1,57 @@ - - - - - - - - - image/svg+xml - - - - - + + + + + + + + + image/svg+xml + + + + + diff --git a/styles/colorized/images/delete.svg b/styles/colorized/images/delete.svg index 26a47845b..51312562c 100644 --- a/styles/colorized/images/delete.svg +++ b/styles/colorized/images/delete.svg @@ -1,109 +1,109 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/emergency.svg b/styles/colorized/images/emergency.svg index 2bd00f503..69bcbb78c 100644 --- a/styles/colorized/images/emergency.svg +++ b/styles/colorized/images/emergency.svg @@ -1,79 +1,79 @@ - - + + diff --git a/styles/colorized/images/extrude.svg b/styles/colorized/images/extrude.svg index 0a1da4440..15d1ae2cb 100644 --- a/styles/colorized/images/extrude.svg +++ b/styles/colorized/images/extrude.svg @@ -1,106 +1,106 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/styles/colorized/images/extruder-0.svg b/styles/colorized/images/extruder-0.svg index cef27d584..5547d2338 100644 --- a/styles/colorized/images/extruder-0.svg +++ b/styles/colorized/images/extruder-0.svg @@ -1,122 +1,122 @@ - - - - - - - image/svg+xml - - extruder1 - - - - - - extruder1 - - - - - Created with Sketch. - - - - - - - - - + + + + + + + image/svg+xml + + extruder1 + + + + + + extruder1 + + + + + Created with Sketch. + + + + + + + + + diff --git a/styles/colorized/images/extruder-1.svg b/styles/colorized/images/extruder-1.svg index af60622c9..a03c73473 100644 --- a/styles/colorized/images/extruder-1.svg +++ b/styles/colorized/images/extruder-1.svg @@ -1,129 +1,129 @@ - - - - - - image/svg+xml - - extruder1 - - - - - - - extruder1 - - - - - Created with Sketch. - - - - - - - - - - - + + + + + + image/svg+xml + + extruder1 + + + + + + + extruder1 + + + + + Created with Sketch. + + + + + + + + + + + diff --git a/styles/colorized/images/extruder-2.svg b/styles/colorized/images/extruder-2.svg index 76e42f30e..cc9659c6b 100644 --- a/styles/colorized/images/extruder-2.svg +++ b/styles/colorized/images/extruder-2.svg @@ -1,120 +1,120 @@ - - - - - - image/svg+xml - - extruder1 - - - - - - - extruder1 - - - - - Created with Sketch. - - - - - - - + + + + + + image/svg+xml + + extruder1 + + + + + + + extruder1 + + + + + Created with Sketch. + + + + + + + diff --git a/styles/colorized/images/extruder-3.svg b/styles/colorized/images/extruder-3.svg index 74e63011b..ad0d5868c 100644 --- a/styles/colorized/images/extruder-3.svg +++ b/styles/colorized/images/extruder-3.svg @@ -1,122 +1,122 @@ - - - - - - image/svg+xml - - extruder1 - - - - - - - extruder1 - - - - - Created with Sketch. - - - - - - - + + + + + + image/svg+xml + + extruder1 + + + + + + + extruder1 + + + + + Created with Sketch. + + + + + + + diff --git a/styles/colorized/images/extruder-4.svg b/styles/colorized/images/extruder-4.svg index 063ec633a..e9d5dcb09 100644 --- a/styles/colorized/images/extruder-4.svg +++ b/styles/colorized/images/extruder-4.svg @@ -1,129 +1,129 @@ - - - - - - image/svg+xml - - extruder1 - - - - - - - extruder1 - - - - - Created with Sketch. - - - - - - - - - - - + + + + + + image/svg+xml + + extruder1 + + + + + + + extruder1 + + + + + Created with Sketch. + + + + + + + + + + + diff --git a/styles/colorized/images/extruder.svg b/styles/colorized/images/extruder.svg index bf789ff92..d7aa63156 100644 --- a/styles/colorized/images/extruder.svg +++ b/styles/colorized/images/extruder.svg @@ -1,98 +1,98 @@ - - - - - - - image/svg+xml - - extruder1 - - - - - - extruder1 - - - - - Created with Sketch. - - - + + + + + + + image/svg+xml + + extruder1 + + + + + + extruder1 + + + + + Created with Sketch. + + + diff --git a/styles/colorized/images/fan-on.svg b/styles/colorized/images/fan-on.svg index c90110ac8..33038838f 100644 --- a/styles/colorized/images/fan-on.svg +++ b/styles/colorized/images/fan-on.svg @@ -1,80 +1,80 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/fan.svg b/styles/colorized/images/fan.svg index 99de0be33..d672b1312 100644 --- a/styles/colorized/images/fan.svg +++ b/styles/colorized/images/fan.svg @@ -1,89 +1,89 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/styles/colorized/images/filament.svg b/styles/colorized/images/filament.svg index 07142a668..172fdd9ed 100644 --- a/styles/colorized/images/filament.svg +++ b/styles/colorized/images/filament.svg @@ -1,69 +1,69 @@ - - - - - - - - image/svg+xml - - - - - - - + + + + + + + + image/svg+xml + + + + + + + diff --git a/styles/colorized/images/file.svg b/styles/colorized/images/file.svg index 6157305ec..e60977d58 100644 --- a/styles/colorized/images/file.svg +++ b/styles/colorized/images/file.svg @@ -1,81 +1,81 @@ - -image/svg+xml + +image/svg+xml diff --git a/styles/colorized/images/files.svg b/styles/colorized/images/files.svg index ccce9662e..6121d58e3 100644 --- a/styles/colorized/images/files.svg +++ b/styles/colorized/images/files.svg @@ -1,76 +1,76 @@ - -image/svg+xml + +image/svg+xml diff --git a/styles/colorized/images/fine-tune.svg b/styles/colorized/images/fine-tune.svg index 530c47db1..69e94cecf 100644 --- a/styles/colorized/images/fine-tune.svg +++ b/styles/colorized/images/fine-tune.svg @@ -1,103 +1,103 @@ - -image/svg+xml + +image/svg+xml diff --git a/styles/colorized/images/flow+.svg b/styles/colorized/images/flow+.svg index 7d0875977..74c9b516a 100644 --- a/styles/colorized/images/flow+.svg +++ b/styles/colorized/images/flow+.svg @@ -1,115 +1,115 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/flow-.svg b/styles/colorized/images/flow-.svg index 92440774a..244ead34e 100644 --- a/styles/colorized/images/flow-.svg +++ b/styles/colorized/images/flow-.svg @@ -1,120 +1,120 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/folder.svg b/styles/colorized/images/folder.svg index 25870d11d..b2d4b61ac 100644 --- a/styles/colorized/images/folder.svg +++ b/styles/colorized/images/folder.svg @@ -1,65 +1,65 @@ - -image/svg+xml + +image/svg+xml diff --git a/styles/colorized/images/hashtag.svg b/styles/colorized/images/hashtag.svg index 4ab0a3340..7d2348965 100644 --- a/styles/colorized/images/hashtag.svg +++ b/styles/colorized/images/hashtag.svg @@ -1,57 +1,57 @@ - - - - - - - - image/svg+xml - - - - - - + + + + + + + + image/svg+xml + + + + + + diff --git a/styles/colorized/images/heat-up.svg b/styles/colorized/images/heat-up.svg index 36fa73044..c78cdf0fe 100644 --- a/styles/colorized/images/heat-up.svg +++ b/styles/colorized/images/heat-up.svg @@ -1,105 +1,105 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/heater.svg b/styles/colorized/images/heater.svg new file mode 100644 index 000000000..f3c4d408b --- /dev/null +++ b/styles/colorized/images/heater.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/home-x.svg b/styles/colorized/images/home-x.svg index f15a98e78..ce779ce0e 100644 --- a/styles/colorized/images/home-x.svg +++ b/styles/colorized/images/home-x.svg @@ -1,81 +1,81 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/styles/colorized/images/home-y.svg b/styles/colorized/images/home-y.svg index 9ab8d4f49..0f6db2180 100644 --- a/styles/colorized/images/home-y.svg +++ b/styles/colorized/images/home-y.svg @@ -1,78 +1,78 @@ - - - - - - - - - - image/svg+xml - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/home-z.svg b/styles/colorized/images/home-z.svg index 4908b9603..5f6638863 100644 --- a/styles/colorized/images/home-z.svg +++ b/styles/colorized/images/home-z.svg @@ -1,82 +1,82 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/styles/colorized/images/home.svg b/styles/colorized/images/home.svg index efa2f9a89..049d9853d 100644 --- a/styles/colorized/images/home.svg +++ b/styles/colorized/images/home.svg @@ -1,65 +1,65 @@ - - - - - - - - image/svg+xml - - - - - - - + + + + + + + + image/svg+xml + + + + + + + diff --git a/styles/colorized/images/hourglass.svg b/styles/colorized/images/hourglass.svg index 6685042f8..a18c92712 100644 --- a/styles/colorized/images/hourglass.svg +++ b/styles/colorized/images/hourglass.svg @@ -1,75 +1,75 @@ - - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/styles/colorized/images/increase.svg b/styles/colorized/images/increase.svg index ef4d4e523..220725719 100644 --- a/styles/colorized/images/increase.svg +++ b/styles/colorized/images/increase.svg @@ -1,56 +1,56 @@ - - - - - - - - - image/svg+xml - - - - - + + + + + + + + + image/svg+xml + + + + + diff --git a/styles/colorized/images/info.svg b/styles/colorized/images/info.svg index afebe8875..de479bf77 100644 --- a/styles/colorized/images/info.svg +++ b/styles/colorized/images/info.svg @@ -1,71 +1,71 @@ - - - - - - - image/svg+xml - - info - - - - - - info - Created with Sketch. - - - + + + + + + + image/svg+xml + + info + + + + + + info + Created with Sketch. + + + diff --git a/styles/colorized/images/klipper.svg b/styles/colorized/images/klipper.svg index f75cc96cd..be0e75f4f 100644 --- a/styles/colorized/images/klipper.svg +++ b/styles/colorized/images/klipper.svg @@ -1,75 +1,161 @@ - - - - - - image/svg+xml - - - - - - - Slice 3 - Created with Sketch. - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/light.svg b/styles/colorized/images/light.svg new file mode 100644 index 000000000..7f722eff9 --- /dev/null +++ b/styles/colorized/images/light.svg @@ -0,0 +1,66 @@ + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/colorized/images/load.svg b/styles/colorized/images/load.svg index 1e30f9437..d8d6ed7e5 100644 --- a/styles/colorized/images/load.svg +++ b/styles/colorized/images/load.svg @@ -1,90 +1,90 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/styles/colorized/images/main.svg b/styles/colorized/images/main.svg index a1a16251d..3d6ff1d57 100644 --- a/styles/colorized/images/main.svg +++ b/styles/colorized/images/main.svg @@ -1,93 +1,93 @@ - - - - - - - - - - - - image/svg+xml - - - - - - + + + + + + + + + + + + image/svg+xml + + + + + + diff --git a/styles/colorized/images/motor-off.svg b/styles/colorized/images/motor-off.svg index 4f079b191..64612ab7a 100644 --- a/styles/colorized/images/motor-off.svg +++ b/styles/colorized/images/motor-off.svg @@ -1,106 +1,106 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + diff --git a/styles/colorized/images/move.svg b/styles/colorized/images/move.svg index 6fdc30a7b..bbd8a70f0 100644 --- a/styles/colorized/images/move.svg +++ b/styles/colorized/images/move.svg @@ -1,81 +1,81 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/styles/colorized/images/network.svg b/styles/colorized/images/network.svg index 13443776b..885e93ae2 100644 --- a/styles/colorized/images/network.svg +++ b/styles/colorized/images/network.svg @@ -1,81 +1,81 @@ - - - - - - - image/svg+xml - - network - - - - - - network - Created with Sketch. - - - - - + + + + + + + image/svg+xml + + network + + + + + + network + Created with Sketch. + + + + + diff --git a/styles/colorized/images/pause.svg b/styles/colorized/images/pause.svg index a1d84c55d..2613bbe27 100644 --- a/styles/colorized/images/pause.svg +++ b/styles/colorized/images/pause.svg @@ -1,67 +1,67 @@ - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/styles/colorized/images/print.svg b/styles/colorized/images/print.svg index bb4a2b816..71a8cc5e8 100644 --- a/styles/colorized/images/print.svg +++ b/styles/colorized/images/print.svg @@ -1,100 +1,100 @@ - - - - - - - image/svg+xml - - extruder1 - - - - - - extruder1 - - Created with Sketch. - - - - - - - - + + + + + + + image/svg+xml + + extruder1 + + + + + + extruder1 + + Created with Sketch. + + + + + + + + diff --git a/styles/colorized/images/refresh.svg b/styles/colorized/images/refresh.svg index 7026e6954..c1a3ac695 100644 --- a/styles/colorized/images/refresh.svg +++ b/styles/colorized/images/refresh.svg @@ -1,76 +1,76 @@ - - - - - - - image/svg+xml - - reboot - - - - - - reboot - Created with Sketch. - - - + + + + + + + image/svg+xml + + reboot + + + + + + reboot + Created with Sketch. + + + diff --git a/styles/colorized/images/resume.svg b/styles/colorized/images/resume.svg index bde55a8bd..4c3124d44 100644 --- a/styles/colorized/images/resume.svg +++ b/styles/colorized/images/resume.svg @@ -1,60 +1,60 @@ - - - - - - - - - - image/svg+xml - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + diff --git a/styles/colorized/images/retract.svg b/styles/colorized/images/retract.svg index 79b83457d..d48fbc6fb 100644 --- a/styles/colorized/images/retract.svg +++ b/styles/colorized/images/retract.svg @@ -1,110 +1,110 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/styles/colorized/images/sd.svg b/styles/colorized/images/sd.svg index 559ccf2a1..3c0f6c77f 100644 --- a/styles/colorized/images/sd.svg +++ b/styles/colorized/images/sd.svg @@ -1,148 +1,148 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/settings.svg b/styles/colorized/images/settings.svg index 54522e37e..af64796e6 100644 --- a/styles/colorized/images/settings.svg +++ b/styles/colorized/images/settings.svg @@ -1,60 +1,60 @@ - -image/svg+xml - - + +image/svg+xml + + diff --git a/styles/colorized/images/shuffle.svg b/styles/colorized/images/shuffle.svg index 33ee76d09..5d46da090 100644 --- a/styles/colorized/images/shuffle.svg +++ b/styles/colorized/images/shuffle.svg @@ -1,107 +1,107 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/shutdown.svg b/styles/colorized/images/shutdown.svg index 82adffde0..ec7296161 100644 --- a/styles/colorized/images/shutdown.svg +++ b/styles/colorized/images/shutdown.svg @@ -1,80 +1,80 @@ - - - - - - - image/svg+xml - - reboot - - - - - - reboot - Created with Sketch. - - - + + + + + + + image/svg+xml + + reboot + + + + + + reboot + Created with Sketch. + + + diff --git a/styles/colorized/images/speed+.svg b/styles/colorized/images/speed+.svg index 9f50f80a7..559e00f0e 100644 --- a/styles/colorized/images/speed+.svg +++ b/styles/colorized/images/speed+.svg @@ -1,109 +1,109 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/speed-.svg b/styles/colorized/images/speed-.svg index ecad23cd0..d0fd79baf 100644 --- a/styles/colorized/images/speed-.svg +++ b/styles/colorized/images/speed-.svg @@ -1,115 +1,115 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/splash.png b/styles/colorized/images/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/colorized/images/splash.png and /dev/null differ diff --git a/styles/colorized/images/stop.svg b/styles/colorized/images/stop.svg index 5aaf82e45..14cd16ddb 100644 --- a/styles/colorized/images/stop.svg +++ b/styles/colorized/images/stop.svg @@ -1,61 +1,61 @@ - - - - - - - - image/svg+xml - - - - - - - + + + + + + + + image/svg+xml + + + + + + + diff --git a/styles/colorized/images/toolchanger.svg b/styles/colorized/images/toolchanger.svg index 82ad86acf..71631c0b8 100644 --- a/styles/colorized/images/toolchanger.svg +++ b/styles/colorized/images/toolchanger.svg @@ -1,136 +1,136 @@ - - - - - - - image/svg+xml - - extruder1 - - - - - - extruder1 - - Created with Sketch. - - - - - - - - - - - - - - - - + + + + + + + image/svg+xml + + extruder1 + + + + + + extruder1 + + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/warning.svg b/styles/colorized/images/warning.svg index 0098b9662..efd30a1c0 100644 --- a/styles/colorized/images/warning.svg +++ b/styles/colorized/images/warning.svg @@ -1,76 +1,76 @@ - - - - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/styles/colorized/images/z-closer.svg b/styles/colorized/images/z-closer.svg index 1b660543f..93b499b81 100644 --- a/styles/colorized/images/z-closer.svg +++ b/styles/colorized/images/z-closer.svg @@ -1,177 +1,177 @@ - - - - - - - image/svg+xml - - bed - - - - - - - - - - - - - - bed - Created with Sketch. - - - - - - - - - - - - - - - - + + + + + + + image/svg+xml + + bed + + + + + + + + + + + + + + bed + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/z-farther.svg b/styles/colorized/images/z-farther.svg index 4305f0a0d..26240c306 100644 --- a/styles/colorized/images/z-farther.svg +++ b/styles/colorized/images/z-farther.svg @@ -1,176 +1,176 @@ - - - - - - - image/svg+xml - - bed - - - - - - - - - - - - - - bed - Created with Sketch. - - - - - - - - - - - - - - - - + + + + + + + image/svg+xml + + bed + + + + + + + + + + + + + + bed + Created with Sketch. + + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/z-tilt.svg b/styles/colorized/images/z-tilt.svg index e139fa50c..be76b6dad 100644 --- a/styles/colorized/images/z-tilt.svg +++ b/styles/colorized/images/z-tilt.svg @@ -1,136 +1,136 @@ - - - - - - - image/svg+xml - - bed - - - - - - - - - - - - - - - - - - - - bed - Created with Sketch. - - - + + + + + + + image/svg+xml + + bed + + + + + + + + + + + + + + + + + + + + bed + Created with Sketch. + + + diff --git a/styles/colorized/style.conf b/styles/colorized/style.conf new file mode 100644 index 000000000..f39ca3812 --- /dev/null +++ b/styles/colorized/style.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["DC322F", "B58900", "CB4B16", "AA1F1D", "973911"], + "state": 0 + }, + "bed": { + "colors": ["268BD2"], + "state": 0 + }, + "fan": { + "colors": ["859900", "2AA198", "637300", "1F7A72"], + "state": 0 + }, + "sensor": { + "colors": ["D33682", "6C71C4", "C06CC4", "6D26D1", "2A34A1"], + "state": 0 + } + } +} diff --git a/styles/colorized/style.css b/styles/colorized/style.css index 5e48cc617..e8bd3754a 100644 --- a/styles/colorized/style.css +++ b/styles/colorized/style.css @@ -1,229 +1,234 @@ -/* Colorized theme created by Alfredo Monclus 2021 */ -/* Using solarized colors */ - -* { - color: #fdf6e3; /*base3*/ -} - -window { - background-color: #002b36; /*base03*/ -} - -button { - background-color: #002b36; /*base03*/ -} - -button:active { - background-color: #cb4b16; /*solarized-orange*/ -} - -.button_active { - border-color: #073642; /*base02*/ - border-style: solid; - border-radius: 1em; - border-width: .25em; - background-color: #073642; /*base02*/ -} - -button.color1 { - background-color: #073642; /*base02*/ - border-bottom-color: #cb4b16; /*solarized-orange*/ - border-radius: 1em; -} - -button.color2 { - background-color: #073642; /*base02*/ - border-bottom-color: #d33682; /*solarized-magenta*/ - border-radius: 1em; -} - -button.color3 { - background-color: #073642; /*base02*/ - border-bottom-color: #2aa198; /*solarized-cyan*/ - border-radius: 1em; -} - -button.color4 { - background-color: #073642; /*base02*/ - border-bottom-color: #859900; /*solarized-green*/ - border-radius: 1em; -} - -button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { - border-style: none; - margin-top: .5em; -} - -button.active { - background-color: #cb4b16; /*solarized-orange*/ -} - -button.update { - background-color: #073642; /*base02*/ - border: 0; - border-bottom: .3em solid; - border-bottom-color: #859900; /*solarized-green*/ - border-radius: .75em; -} - -button.invalid { - background-color: #073642; /*base02*/ - border: 0; - border-bottom: .3em solid; - border-bottom-color: #dc322f; /*solarized-red*/ - border-radius: .75em; -} - -combobox box button { - background-color: #073642; /*base02*/ - border-color: #002b36; /*base03*/ -} - -switch { - background-color: #073642; /* base02 */ - border-color: #073642; /* base02 */ - border-radius: 3em; -} - -switch:checked { - background-color: #859900; /*solarized-green*/ -} - -entry { - background-color: #073642; /*base02*/ - border-color: #002b36; /*base03*/ -} - -frame { - color: #fdf6e3; /*base3*/ - border-bottom-color: #073642; /*base02*/ -} - -label { - color: #fdf6e3; /*base3*/ -} - -menu { - background-color: #002b36; /*base03*/ - border-color: #93a1a1; /*base1*/ -} - -menuitem { - background-color: #002b36; /*base03*/ - border-color: #93a1a1; /*base1*/ -} - -trough { - background-color: #073642; /*base02*/ - color: #fdf6e3; /*base3*/ - border-color: #002b36; /*base03*/ - border-radius: 1em; -} - -trough highlight, trough progress { - background-color: #6c71c4; /*solarized-violet*/ - color: #fdf6e3; /*base3*/ - border-color: #002b36; /*base03*/ - border-top-left-radius: 1em; - border-bottom-left-radius: 1em; -} - -scale-mark { - color: #fdf6e3; /*base3*/ -} - -scrollbar, scrollbar button, scrollbar trough { - background-color: #002b36; /*base03*/ -} - -scrollbar slider { - background-color: #073642; /*base02*/ -} - -textview .time { - color: #93a1a1; /*base1*/ -} - -.popup { - background-color: #268bd2; /*solarized-cyan*/ -} - -.dialog { - border: #002b36; /*base03*/ - background-color: #002b36; /*base03*/ -} - -.dialog button { - background-color: #073642; /*base02*/ - border-bottom-color: #268bd2; /*solarized-cyan*/ - border-radius: .75em; -} - -.dialog button:nth-child(1) { - border-bottom-color: #859900; /*solarized-green*/ -} - -.dialog button:nth-child(2) { - border-bottom-color: #dc322f; /*solarazed-red*/ -} -.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { - border-color: #002b36; /*base03*/ - background-color: #073642; /*base02*/ -} - -.distbutton_active { - background-color: #cb4b16; /*solarized-orange*/ -} - -.fan_slider { - color: #fdf6e3; /*base3*/ -} - -.message_popup { - background-color: #dc322f; /*solarazed-red*/ - border-bottom-color: #fdf6e3; /*base3*/ -} - -.message_popup button { - background-color: #dc322f; /*solarazed-red*/ -} - -.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { - border-color: #002b36; /*base03*/ - background-color: #073642; /*base02*/ -} - -.printing-status { - color: #fdf6e3; /*base3*/ -} - -.printing-progress-bar { - color: #2aa198; /*solarized-cyan*/ -} - -.printing-progress-text { - color: #fdf6e3; /*base3*/ -} - -.printing-status-label { - color: #93a1a1; /*base1*/ -} - -.message { - border-color: #dc322f; /*solarized-red*/ - color: #fdf6e3; /*base3*/ - background-color: #dc322f; /*solarized-red*/ -} - -.message button { - background-color: #fdf6e3; /*base3*/ - color: #002b36; /*base03*/ -} - -.warning { - background-color: #b58900; /*solarazed-yellow*/ -} - -.error { - background-color: #dc322f; /*solarized-red*/ -} +/* Colorized theme created by Alfredo Monclus 2021 */ +/* Using solarized colors */ + +* { + color: #fdf6e3; /*base3*/ +} + +window { + background-color: #002b36; /*base03*/ +} + +button { + background-color: #002b36; /*base03*/ +} + +button:active { + background-color: #cb4b16; /*solarized-orange*/ +} + +.button_active { + border-color: #073642; /*base02*/ + border-style: solid; + border-radius: 1em; + border-width: .25em; + background-color: #073642; /*base02*/ +} + +button.color1 { + background-color: #073642; /*base02*/ + border-bottom-color: #cb4b16; /*solarized-orange*/ + border-radius: 1em; +} + +button.color2 { + background-color: #073642; /*base02*/ + border-bottom-color: #d33682; /*solarized-magenta*/ + border-radius: 1em; +} + +button.color3 { + background-color: #073642; /*base02*/ + border-bottom-color: #2aa198; /*solarized-cyan*/ + border-radius: 1em; +} + +button.color4 { + background-color: #073642; /*base02*/ + border-bottom-color: #859900; /*solarized-green*/ + border-radius: 1em; +} + +button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { + border-style: none; + margin-top: .5em; +} + +button.active { + background-color: #cb4b16; /*solarized-orange*/ +} + +button.update { + background-color: #073642; /*base02*/ + border: 0; + border-bottom: .3em solid; + border-bottom-color: #859900; /*solarized-green*/ + border-radius: .75em; +} + +button.invalid { + background-color: #073642; /*base02*/ + border: 0; + border-bottom: .3em solid; + border-bottom-color: #dc322f; /*solarized-red*/ + border-radius: .75em; +} + +combobox box button { + background-color: #073642; /*base02*/ + border-color: #002b36; /*base03*/ +} + +switch { + background-color: #073642; /* base02 */ +} + +switch:checked { + background-color: #859900; /*solarized-green*/ +} + +entry { + background-color: #073642; /*base02*/ + border-color: #002b36; /*base03*/ +} + +frame { + color: #fdf6e3; /*base3*/ + border-bottom-color: #073642; /*base02*/ +} + +label { + color: #fdf6e3; /*base3*/ +} + +menu { + background-color: #002b36; /*base03*/ + border-color: #93a1a1; /*base1*/ +} + +menuitem { + background-color: #002b36; /*base03*/ + border-color: #93a1a1; /*base1*/ +} + +trough { + background-color: #073642; /*base02*/ + color: #fdf6e3; /*base3*/ + border-color: #002b36; /*base03*/ + border-radius: 1em; +} + +trough highlight, trough progress { + background-color: #6c71c4; /*solarized-violet*/ + color: #fdf6e3; /*base3*/ + border-color: #002b36; /*base03*/ + border-top-left-radius: 1em; + border-bottom-left-radius: 1em; +} + +scale-mark { + color: #fdf6e3; /*base3*/ +} + +scrollbar, scrollbar button, scrollbar trough { + background-color: #002b36; /*base03*/ +} + +scrollbar slider { + background-color: #073642; /*base02*/ +} + +textview .time { + color: #93a1a1; /*base1*/ +} + +.popup { + background-color: #268bd2; /*solarized-cyan*/ +} + +.dialog { + border: #002b36; /*base03*/ + background-color: #002b36; /*base03*/ +} + +.dialog button { + background-color: #073642; /*base02*/ + border-bottom-color: #268bd2; /*solarized-cyan*/ + border-radius: .75em; +} + +.dialog button:nth-child(1) { + border-bottom-color: #859900; /*solarized-green*/ +} + +.dialog button:nth-child(2) { + border-bottom-color: #dc322f; /*solarazed-red*/ +} +.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { + border-color: #002b36; /*base03*/ + background-color: #073642; /*base02*/ +} + +.distbutton_active { + background-color: #cb4b16; /*solarized-orange*/ +} + +.fan_slider { + color: #fdf6e3; /*base3*/ +} + +.message_popup { + border-bottom-color: #fdf6e3; /*base3*/ +} + +.message_popup button { + background-color: #dc322f; /*solarazed-red*/ +} + +.message_popup_echo, .message_popup_echo button { + background-color: #859900; /*solarized-green*/ +} + +.message_popup_error, .message_popup_error button { + background-color: #dc322f; /*solarazed-red*/ +} + +.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { + border-color: #002b36; /*base03*/ + background-color: #073642; /*base02*/ +} + +.printing-status { + color: #fdf6e3; /*base3*/ +} + +.printing-progress-bar { + color: #2aa198; /*solarized-cyan*/ +} + +.printing-progress-text { + color: #fdf6e3; /*base3*/ +} + +.printing-status-label { + color: #93a1a1; /*base1*/ +} + +.message { + border-color: #dc322f; /*solarized-red*/ + color: #fdf6e3; /*base3*/ + background-color: #dc322f; /*solarized-red*/ +} + +.message button { + background-color: #fdf6e3; /*base3*/ + color: #002b36; /*base03*/ +} + +.warning { + background-color: #b58900; /*solarazed-yellow*/ +} + +.error { + background-color: #dc322f; /*solarized-red*/ +} diff --git a/styles/material-dark/background.svg b/styles/material-dark/background.svg index b2ecd9b44..9ee9e029e 100644 --- a/styles/material-dark/background.svg +++ b/styles/material-dark/background.svg @@ -1,262 +1,262 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/material-dark/images/arrow-down.svg b/styles/material-dark/images/arrow-down.svg index c273eb900..7c8008f18 100644 --- a/styles/material-dark/images/arrow-down.svg +++ b/styles/material-dark/images/arrow-down.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/arrow-left.svg b/styles/material-dark/images/arrow-left.svg index 7ce0f8471..d1e0412d5 100644 --- a/styles/material-dark/images/arrow-left.svg +++ b/styles/material-dark/images/arrow-left.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/arrow-right.svg b/styles/material-dark/images/arrow-right.svg index 2ebb96dd2..a282d6776 100644 --- a/styles/material-dark/images/arrow-right.svg +++ b/styles/material-dark/images/arrow-right.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/arrow-up.svg b/styles/material-dark/images/arrow-up.svg index 1ee29b50f..6acaa3629 100644 --- a/styles/material-dark/images/arrow-up.svg +++ b/styles/material-dark/images/arrow-up.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/back.svg b/styles/material-dark/images/back.svg index ec920913d..9d3060fce 100644 --- a/styles/material-dark/images/back.svg +++ b/styles/material-dark/images/back.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/backspace.svg b/styles/material-dark/images/backspace.svg index 1a7cddb5e..2d3441a2b 100644 --- a/styles/material-dark/images/backspace.svg +++ b/styles/material-dark/images/backspace.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed-level-b-l.svg b/styles/material-dark/images/bed-level-b-l.svg index 8313b1107..dde64679e 100644 --- a/styles/material-dark/images/bed-level-b-l.svg +++ b/styles/material-dark/images/bed-level-b-l.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed-level-b-m.svg b/styles/material-dark/images/bed-level-b-m.svg new file mode 100644 index 000000000..8ec55e497 --- /dev/null +++ b/styles/material-dark/images/bed-level-b-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-dark/images/bed-level-b-r.svg b/styles/material-dark/images/bed-level-b-r.svg index 0da84cf70..28cb7adc0 100644 --- a/styles/material-dark/images/bed-level-b-r.svg +++ b/styles/material-dark/images/bed-level-b-r.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed-level-l-m.svg b/styles/material-dark/images/bed-level-l-m.svg new file mode 100644 index 000000000..813dd7f4c --- /dev/null +++ b/styles/material-dark/images/bed-level-l-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-dark/images/bed-level-r-m.svg b/styles/material-dark/images/bed-level-r-m.svg new file mode 100644 index 000000000..6a007f513 --- /dev/null +++ b/styles/material-dark/images/bed-level-r-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-dark/images/bed-level-t-l.svg b/styles/material-dark/images/bed-level-t-l.svg index b8c95e51e..cb8aaabed 100644 --- a/styles/material-dark/images/bed-level-t-l.svg +++ b/styles/material-dark/images/bed-level-t-l.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed-level-t-m.svg b/styles/material-dark/images/bed-level-t-m.svg new file mode 100644 index 000000000..4901a1194 --- /dev/null +++ b/styles/material-dark/images/bed-level-t-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-dark/images/bed-level-t-r.svg b/styles/material-dark/images/bed-level-t-r.svg index 09bce4d60..07bcb0d75 100644 --- a/styles/material-dark/images/bed-level-t-r.svg +++ b/styles/material-dark/images/bed-level-t-r.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed-level.svg b/styles/material-dark/images/bed-level.svg index a46710796..3d4bdf2c2 100644 --- a/styles/material-dark/images/bed-level.svg +++ b/styles/material-dark/images/bed-level.svg @@ -1,39 +1,39 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/bed.svg b/styles/material-dark/images/bed.svg index b4000f689..1f2c36f88 100644 --- a/styles/material-dark/images/bed.svg +++ b/styles/material-dark/images/bed.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/camera.svg b/styles/material-dark/images/camera.svg index b825fb99c..54dbcea4c 100644 --- a/styles/material-dark/images/camera.svg +++ b/styles/material-dark/images/camera.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/cancel.svg b/styles/material-dark/images/cancel.svg index 7d1a114db..e3e72bc02 100644 --- a/styles/material-dark/images/cancel.svg +++ b/styles/material-dark/images/cancel.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/clock.svg b/styles/material-dark/images/clock.svg index 343210b35..491699ca0 100644 --- a/styles/material-dark/images/clock.svg +++ b/styles/material-dark/images/clock.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/complete.svg b/styles/material-dark/images/complete.svg index 719a4539e..ec0b9dcb6 100644 --- a/styles/material-dark/images/complete.svg +++ b/styles/material-dark/images/complete.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/console.svg b/styles/material-dark/images/console.svg index 52243741c..1450c1121 100644 --- a/styles/material-dark/images/console.svg +++ b/styles/material-dark/images/console.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/cool-down.svg b/styles/material-dark/images/cool-down.svg index 8a9cacb4e..9d619106d 100644 --- a/styles/material-dark/images/cool-down.svg +++ b/styles/material-dark/images/cool-down.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/custom-script.svg b/styles/material-dark/images/custom-script.svg index 0cf627ca5..53bdcfb32 100644 --- a/styles/material-dark/images/custom-script.svg +++ b/styles/material-dark/images/custom-script.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/decrease.svg b/styles/material-dark/images/decrease.svg index 7c41b832d..da7b4f5bc 100644 --- a/styles/material-dark/images/decrease.svg +++ b/styles/material-dark/images/decrease.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/delete.svg b/styles/material-dark/images/delete.svg index 57bae23c2..c30fde66f 100644 --- a/styles/material-dark/images/delete.svg +++ b/styles/material-dark/images/delete.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/emergency.svg b/styles/material-dark/images/emergency.svg index e8e740844..ae743c70a 100644 --- a/styles/material-dark/images/emergency.svg +++ b/styles/material-dark/images/emergency.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extrude.svg b/styles/material-dark/images/extrude.svg index bc4c09e3d..a1bd63910 100644 --- a/styles/material-dark/images/extrude.svg +++ b/styles/material-dark/images/extrude.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder-0.svg b/styles/material-dark/images/extruder-0.svg index 5fc892ee5..eb97d0bcf 100644 --- a/styles/material-dark/images/extruder-0.svg +++ b/styles/material-dark/images/extruder-0.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder-1.svg b/styles/material-dark/images/extruder-1.svg index 9cafc414b..fa8a95db1 100644 --- a/styles/material-dark/images/extruder-1.svg +++ b/styles/material-dark/images/extruder-1.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder-2.svg b/styles/material-dark/images/extruder-2.svg index d0eb08faf..6aaf7138f 100644 --- a/styles/material-dark/images/extruder-2.svg +++ b/styles/material-dark/images/extruder-2.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder-3.svg b/styles/material-dark/images/extruder-3.svg index 1803d8a4e..4bdea9299 100644 --- a/styles/material-dark/images/extruder-3.svg +++ b/styles/material-dark/images/extruder-3.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder-4.svg b/styles/material-dark/images/extruder-4.svg index e3b1a7489..cc4912b22 100644 --- a/styles/material-dark/images/extruder-4.svg +++ b/styles/material-dark/images/extruder-4.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/extruder.svg b/styles/material-dark/images/extruder.svg index bc4c09e3d..a2d98dbeb 100644 --- a/styles/material-dark/images/extruder.svg +++ b/styles/material-dark/images/extruder.svg @@ -1,38 +1,39 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/fan-on.svg b/styles/material-dark/images/fan-on.svg index 95fd56901..11d768ecc 100644 --- a/styles/material-dark/images/fan-on.svg +++ b/styles/material-dark/images/fan-on.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/fan.svg b/styles/material-dark/images/fan.svg index aab18856e..3fc701f72 100644 --- a/styles/material-dark/images/fan.svg +++ b/styles/material-dark/images/fan.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/filament.svg b/styles/material-dark/images/filament.svg index 049b35389..e9633ea9e 100644 --- a/styles/material-dark/images/filament.svg +++ b/styles/material-dark/images/filament.svg @@ -1,43 +1,43 @@ - - - - - - - + + + + + + + diff --git a/styles/material-dark/images/file.svg b/styles/material-dark/images/file.svg index 1dcca2174..26a182ee8 100644 --- a/styles/material-dark/images/file.svg +++ b/styles/material-dark/images/file.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/files.svg b/styles/material-dark/images/files.svg index f38fdfb09..2aa4a00b8 100644 --- a/styles/material-dark/images/files.svg +++ b/styles/material-dark/images/files.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/fine-tune.svg b/styles/material-dark/images/fine-tune.svg index 7eae6cde2..9505cda8d 100644 --- a/styles/material-dark/images/fine-tune.svg +++ b/styles/material-dark/images/fine-tune.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/flow+.svg b/styles/material-dark/images/flow+.svg index a69dd0472..db9f29579 100644 --- a/styles/material-dark/images/flow+.svg +++ b/styles/material-dark/images/flow+.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/flow-.svg b/styles/material-dark/images/flow-.svg index e3ce66607..77bdbf766 100644 --- a/styles/material-dark/images/flow-.svg +++ b/styles/material-dark/images/flow-.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/folder.svg b/styles/material-dark/images/folder.svg index fd9d4c992..6ab303591 100644 --- a/styles/material-dark/images/folder.svg +++ b/styles/material-dark/images/folder.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/hashtag.svg b/styles/material-dark/images/hashtag.svg index 07b245d3b..63cddf02f 100644 --- a/styles/material-dark/images/hashtag.svg +++ b/styles/material-dark/images/hashtag.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/heat-up.svg b/styles/material-dark/images/heat-up.svg index 9fb6a9758..fb33050d6 100644 --- a/styles/material-dark/images/heat-up.svg +++ b/styles/material-dark/images/heat-up.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/heater.svg b/styles/material-dark/images/heater.svg new file mode 100644 index 000000000..ca483b82a --- /dev/null +++ b/styles/material-dark/images/heater.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/styles/material-dark/images/home-x.svg b/styles/material-dark/images/home-x.svg index 6fc152283..c28dc9eb4 100644 --- a/styles/material-dark/images/home-x.svg +++ b/styles/material-dark/images/home-x.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/home-y.svg b/styles/material-dark/images/home-y.svg index 5601421e7..085320c12 100644 --- a/styles/material-dark/images/home-y.svg +++ b/styles/material-dark/images/home-y.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/home-z.svg b/styles/material-dark/images/home-z.svg index 0f450746d..ac12cd3d3 100644 --- a/styles/material-dark/images/home-z.svg +++ b/styles/material-dark/images/home-z.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/home.svg b/styles/material-dark/images/home.svg index e0a118bd5..f2cdfa2ec 100644 --- a/styles/material-dark/images/home.svg +++ b/styles/material-dark/images/home.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/hourglass.svg b/styles/material-dark/images/hourglass.svg index 54726f44f..2468d56d2 100644 --- a/styles/material-dark/images/hourglass.svg +++ b/styles/material-dark/images/hourglass.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/increase.svg b/styles/material-dark/images/increase.svg index bdc7762c1..4de8da480 100644 --- a/styles/material-dark/images/increase.svg +++ b/styles/material-dark/images/increase.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/info.svg b/styles/material-dark/images/info.svg index 6ec6bf50f..3041f87b5 100644 --- a/styles/material-dark/images/info.svg +++ b/styles/material-dark/images/info.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/klipper.svg b/styles/material-dark/images/klipper.svg index 519d5239e..be0e75f4f 100644 --- a/styles/material-dark/images/klipper.svg +++ b/styles/material-dark/images/klipper.svg @@ -1,75 +1,161 @@ - - - - - - image/svg+xml - - - - - - - Slice 3 - Created with Sketch. - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/material-dark/images/light.svg b/styles/material-dark/images/light.svg new file mode 100644 index 000000000..eae922bc9 --- /dev/null +++ b/styles/material-dark/images/light.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/styles/material-dark/images/load.svg b/styles/material-dark/images/load.svg index 39928c2a4..9a0a5ab86 100644 --- a/styles/material-dark/images/load.svg +++ b/styles/material-dark/images/load.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/main.svg b/styles/material-dark/images/main.svg index 3622b74df..7b17f4453 100644 --- a/styles/material-dark/images/main.svg +++ b/styles/material-dark/images/main.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/motor-off.svg b/styles/material-dark/images/motor-off.svg index 96156b4a7..2c18757da 100644 --- a/styles/material-dark/images/motor-off.svg +++ b/styles/material-dark/images/motor-off.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/move.svg b/styles/material-dark/images/move.svg index 1000d858b..eec26e6cc 100644 --- a/styles/material-dark/images/move.svg +++ b/styles/material-dark/images/move.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/network.svg b/styles/material-dark/images/network.svg index 7967df934..28e962641 100644 --- a/styles/material-dark/images/network.svg +++ b/styles/material-dark/images/network.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/pause.svg b/styles/material-dark/images/pause.svg index ddfd12417..4b22e03a3 100644 --- a/styles/material-dark/images/pause.svg +++ b/styles/material-dark/images/pause.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/print.svg b/styles/material-dark/images/print.svg index 173a8c436..7163d8ca4 100644 --- a/styles/material-dark/images/print.svg +++ b/styles/material-dark/images/print.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/refresh.svg b/styles/material-dark/images/refresh.svg index 03411b0dd..37db8101a 100644 --- a/styles/material-dark/images/refresh.svg +++ b/styles/material-dark/images/refresh.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/resume.svg b/styles/material-dark/images/resume.svg index eb8fa2b4d..e3d90109f 100644 --- a/styles/material-dark/images/resume.svg +++ b/styles/material-dark/images/resume.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/retract.svg b/styles/material-dark/images/retract.svg index b1c70b545..e79adedc9 100644 --- a/styles/material-dark/images/retract.svg +++ b/styles/material-dark/images/retract.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/sd.svg b/styles/material-dark/images/sd.svg index 908f6e39f..165e5bf56 100644 --- a/styles/material-dark/images/sd.svg +++ b/styles/material-dark/images/sd.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/settings.svg b/styles/material-dark/images/settings.svg index 823701026..589f7c717 100644 --- a/styles/material-dark/images/settings.svg +++ b/styles/material-dark/images/settings.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/shuffle.svg b/styles/material-dark/images/shuffle.svg index 7cc43a5da..ce4070fa5 100644 --- a/styles/material-dark/images/shuffle.svg +++ b/styles/material-dark/images/shuffle.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/shutdown.svg b/styles/material-dark/images/shutdown.svg index 5881731e6..7e2839163 100644 --- a/styles/material-dark/images/shutdown.svg +++ b/styles/material-dark/images/shutdown.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/speed+.svg b/styles/material-dark/images/speed+.svg index c98f2d516..68e017b4e 100644 --- a/styles/material-dark/images/speed+.svg +++ b/styles/material-dark/images/speed+.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/speed-.svg b/styles/material-dark/images/speed-.svg index 9c7ac9ea4..f805bd92c 100644 --- a/styles/material-dark/images/speed-.svg +++ b/styles/material-dark/images/speed-.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/splash.png b/styles/material-dark/images/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/material-dark/images/splash.png and /dev/null differ diff --git a/styles/material-dark/images/stop.svg b/styles/material-dark/images/stop.svg index 27e82a1c6..c68a3627c 100644 --- a/styles/material-dark/images/stop.svg +++ b/styles/material-dark/images/stop.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/toolchanger.svg b/styles/material-dark/images/toolchanger.svg index 87e3781d3..afbe402e9 100644 --- a/styles/material-dark/images/toolchanger.svg +++ b/styles/material-dark/images/toolchanger.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/warning.svg b/styles/material-dark/images/warning.svg index 3387b1cf1..6116eae4b 100644 --- a/styles/material-dark/images/warning.svg +++ b/styles/material-dark/images/warning.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/z-closer.svg b/styles/material-dark/images/z-closer.svg index 538b2611e..6e8bbdecf 100644 --- a/styles/material-dark/images/z-closer.svg +++ b/styles/material-dark/images/z-closer.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/z-farther.svg b/styles/material-dark/images/z-farther.svg index 13e1424f4..b41667b6d 100644 --- a/styles/material-dark/images/z-farther.svg +++ b/styles/material-dark/images/z-farther.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/images/z-tilt.svg b/styles/material-dark/images/z-tilt.svg index 200ac7657..61432d5b4 100644 --- a/styles/material-dark/images/z-tilt.svg +++ b/styles/material-dark/images/z-tilt.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-dark/style.conf b/styles/material-dark/style.conf new file mode 100644 index 000000000..923c063fb --- /dev/null +++ b/styles/material-dark/style.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["C62828", "9C27B0", "F06292", "F44336", "6A1B9A"], + "state": 0 + }, + "bed": { + "colors": ["00B0FF"], + "state": 0 + }, + "fan": { + "colors": ["558B2F", "8BC34A", "00695C", "009688"], + "state": 0 + }, + "sensor": { + "colors": ["FF8F00", "3F51B5", "9E9D24", "CDDC39", "FFC107"], + "state": 0 + } + } +} diff --git a/styles/material-dark/style.css b/styles/material-dark/style.css index 15594db72..22236d8bd 100644 --- a/styles/material-dark/style.css +++ b/styles/material-dark/style.css @@ -1,231 +1,229 @@ -/* Material-dark theme created by Alfredo Monclus 2021 */ - -* { - color: #e2e2e2; -} - -window { - background-color: #121212; - background-image: url("./styles/material-dark/background.svg"); - background-size: cover; -} - -button { - background-color: rgba(0,0,0,0); -} - -button:active { - background-color: #d8a415; -} - -.button_active { - background-color: rgba(0,0,0,0); - border-color: #d81549; - border-style: dashed; - border-width: .25em; - border-radius: 1em; -} - -button.color1 { - background-color: rgba(0,0,0,0.5); - border-color: #d46900; - border-radius: 1em; -} - -button.color2 { - background-color: rgba(0,0,0,0.5); - border-color: #ed3c63; - border-radius: 1em; -} - -button.color3 { - background-color: rgba(0,0,0,0.5); - border-color: #849900; - border-radius: 1em; -} - -button.color4 { - background-color: rgba(0,0,0,0.5); - border-color: #007db4; - border-radius: 1em; -} - -button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { - border-style: none; -} - -button.active { - background-color: #ee6002; -} - -button.update { - background-color: rgba(0,0,0,0.5); - border: 0; - border-bottom: .3em solid; - border-bottom-color: #849900; - border-radius: .75em; -} - -button.invalid { - background-color: rgba(0,0,0,0.5); - border: 0; - border-bottom: .3em solid; - border-bottom-color: #B71C1C; - border-radius: .75em; -} - -combobox box button { - background-color: #1f1f1f; - border-color: #121212; -} - -switch { - background-color: #1f1f1f; - border-color: #121212; -} - -switch:checked { - background-color: #849900; -} - -switch slider { - border: 0; -} - -entry { - background-color: #1f1f1f; - border-color: rgba(0,0,0,0); -} - -frame { - color: #e2e2e2; - border-bottom-color: #1f1f1f; -} - -label { - color: #e2e2e2; -} - -menu { - background-color: #121212; - border-color: #a2a2a2; -} - -menuitem { - background-color: #121212; - border-color: #a2a2a2; -} - -trough { - background-color: #1f1f1f; - color: #e2e2e2; -} - -trough highlight, trough progress { - background-color: #d81549; - color: #e2e2e2; - border-color: #121212; -} - -scale-mark { - color: #e2e2e2; -} - -scrollbar, scrollbar button, scrollbar trough { - background-color: rgba(0,0,0,0); -} - -scrollbar slider { - background-color: #2f2f2f; -} - -textview .time { - color: #9E9E9E; -} - -.popup { - background-color: #006064; -} - -.dialog { - border: #121212; - background-color: #121212; - background-image: url("./styles/material-dark/background.svg"); - background-size: cover; -} - -.dialog button { - background-color: rgba(0,0,0,0.5); - border-bottom-color: #1f1f1f; - border-radius: .75em; -} - -.dialog button:nth-child(1) { - border-bottom-color: #849900; -} - -.dialog button:nth-child(2) { - border-bottom-color: #B71C1C; -} - -.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { - border-color: #121212; - background-color: rgba(0,0,0,0.5); -} - -.distbutton_active { - background-color: #d46900; -} - -.fan_slider { - color: #e2e2e2; -} - -.message_popup { - background-color: #B71C1C; - border-bottom-color: #e2e2e2; -} - -.message_popup button { - background-color: #B71C1C; -} - -.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { - border-color: #121212; - background-color: rgba(0,0,0,0.5); -} - -.printing-status { - color: #e2e2e2; -} - -.printing-progress-bar { - color: #006064; -} - -.printing-progress-text { - color: #e2e2e2; -} - -.printing-status-label { - color: #9E9E9E; -} - -.message { - border-color: #B71C1C; - color: #e2e2e2; - background-color: #B71C1C; -} - -.message button { - background-color: #e2e2e2; - color: #121212; -} - -.warning { - background-color: #EF6C00; -} - -.error { - background-color: #B71C1C; -} +/* Material-dark theme created by Alfredo Monclus 2021 */ + +* { + color: #e2e2e2; +} + +window { + background-color: #121212; + background-image: url("./styles/material-dark/background.svg"); + background-size: cover; +} + +button { + background-color: rgba(0,0,0,0); +} + +button:active { + background-color: #d8a415; +} + +.button_active { + background-color: rgba(0,0,0,0); + border-color: #d81549; + border-style: dashed; + border-width: .25em; + border-radius: 1em; +} + +button.color1 { + background-color: rgba(0,0,0,0.5); + border-color: #d46900; + border-radius: 1em; +} + +button.color2 { + background-color: rgba(0,0,0,0.5); + border-color: #ed3c63; + border-radius: 1em; +} + +button.color3 { + background-color: rgba(0,0,0,0.5); + border-color: #849900; + border-radius: 1em; +} + +button.color4 { + background-color: rgba(0,0,0,0.5); + border-color: #007db4; + border-radius: 1em; +} + +button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { + border-style: none; +} + +button.active { + background-color: #ee6002; +} + +button.update { + background-color: rgba(0,0,0,0.5); + border: 0; + border-bottom: .3em solid; + border-bottom-color: #849900; + border-radius: .75em; +} + +button.invalid { + background-color: rgba(0,0,0,0.5); + border: 0; + border-bottom: .3em solid; + border-bottom-color: #B71C1C; + border-radius: .75em; +} + +combobox box button { + background-color: #1f1f1f; + border-color: #121212; +} + +switch { + background-color: #1f1f1f; +} + +switch:checked { + background-color: #849900; +} + +entry { + background-color: #1f1f1f; + border-color: rgba(0,0,0,0); +} + +frame { + color: #e2e2e2; + border-bottom-color: #1f1f1f; +} + +label { + color: #e2e2e2; +} + +menu { + background-color: #121212; + border-color: #a2a2a2; +} + +menuitem { + background-color: #121212; + border-color: #a2a2a2; +} + +trough { + background-color: #1f1f1f; + color: #e2e2e2; +} + +trough highlight, trough progress { + background-color: #d81549; + color: #e2e2e2; + border-color: #121212; +} + +scale-mark { + color: #e2e2e2; +} + +scrollbar, scrollbar button, scrollbar trough { + background-color: rgba(0,0,0,0); +} + +scrollbar slider { + background-color: #2f2f2f; +} + +textview .time { + color: #9E9E9E; +} + +.popup { + background-color: #006064; +} + +.dialog { + border: #121212; + background-color: #121212; + background-image: url("./styles/material-dark/background.svg"); + background-size: cover; +} + +.dialog button { + background-color: rgba(0,0,0,0.5); + border-bottom-color: #1f1f1f; + border-radius: .75em; +} + +.dialog button:nth-child(1) { + border-bottom-color: #849900; +} + +.dialog button:nth-child(2) { + border-bottom-color: #B71C1C; +} + +.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { + border-color: #121212; + background-color: rgba(0,0,0,0.5); +} + +.distbutton_active { + background-color: #d46900; +} + +.fan_slider { + color: #e2e2e2; +} + +.message_popup { + border-bottom-color: #e2e2e2; +} + +.message_popup_echo, .message_popup_echo button { + background-color: #006412; +} + +.message_popup_error, .message_popup_error button { + background-color: #B71C1C; +} + +.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { + border-color: #121212; + background-color: rgba(0,0,0,0.5); +} + +.printing-status { + color: #e2e2e2; +} + +.printing-progress-bar { + color: #006064; +} + +.printing-progress-text { + color: #e2e2e2; +} + +.printing-status-label { + color: #9E9E9E; +} + +.message { + border-color: #B71C1C; + color: #e2e2e2; + background-color: #B71C1C; +} + +.message button { + background-color: #e2e2e2; + color: #121212; +} + +.warning { + background-color: #EF6C00; +} + +.error { + background-color: #B71C1C; +} diff --git a/styles/material-darker/images/arrow-down.svg b/styles/material-darker/images/arrow-down.svg index c273eb900..7c8008f18 100644 --- a/styles/material-darker/images/arrow-down.svg +++ b/styles/material-darker/images/arrow-down.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/arrow-left.svg b/styles/material-darker/images/arrow-left.svg index 7ce0f8471..d1e0412d5 100644 --- a/styles/material-darker/images/arrow-left.svg +++ b/styles/material-darker/images/arrow-left.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/arrow-right.svg b/styles/material-darker/images/arrow-right.svg index 2ebb96dd2..a282d6776 100644 --- a/styles/material-darker/images/arrow-right.svg +++ b/styles/material-darker/images/arrow-right.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/arrow-up.svg b/styles/material-darker/images/arrow-up.svg index 1ee29b50f..6acaa3629 100644 --- a/styles/material-darker/images/arrow-up.svg +++ b/styles/material-darker/images/arrow-up.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/back.svg b/styles/material-darker/images/back.svg index ec920913d..9d3060fce 100644 --- a/styles/material-darker/images/back.svg +++ b/styles/material-darker/images/back.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/backspace.svg b/styles/material-darker/images/backspace.svg index 1a7cddb5e..2d3441a2b 100644 --- a/styles/material-darker/images/backspace.svg +++ b/styles/material-darker/images/backspace.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed-level-b-l.svg b/styles/material-darker/images/bed-level-b-l.svg index 8313b1107..dde64679e 100644 --- a/styles/material-darker/images/bed-level-b-l.svg +++ b/styles/material-darker/images/bed-level-b-l.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed-level-b-m.svg b/styles/material-darker/images/bed-level-b-m.svg new file mode 100644 index 000000000..8ec55e497 --- /dev/null +++ b/styles/material-darker/images/bed-level-b-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-darker/images/bed-level-b-r.svg b/styles/material-darker/images/bed-level-b-r.svg index 0da84cf70..28cb7adc0 100644 --- a/styles/material-darker/images/bed-level-b-r.svg +++ b/styles/material-darker/images/bed-level-b-r.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed-level-l-m.svg b/styles/material-darker/images/bed-level-l-m.svg new file mode 100644 index 000000000..813dd7f4c --- /dev/null +++ b/styles/material-darker/images/bed-level-l-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-darker/images/bed-level-r-m.svg b/styles/material-darker/images/bed-level-r-m.svg new file mode 100644 index 000000000..6a007f513 --- /dev/null +++ b/styles/material-darker/images/bed-level-r-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-darker/images/bed-level-t-l.svg b/styles/material-darker/images/bed-level-t-l.svg index b8c95e51e..cb8aaabed 100644 --- a/styles/material-darker/images/bed-level-t-l.svg +++ b/styles/material-darker/images/bed-level-t-l.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed-level-t-m.svg b/styles/material-darker/images/bed-level-t-m.svg new file mode 100644 index 000000000..4901a1194 --- /dev/null +++ b/styles/material-darker/images/bed-level-t-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-darker/images/bed-level-t-r.svg b/styles/material-darker/images/bed-level-t-r.svg index 09bce4d60..07bcb0d75 100644 --- a/styles/material-darker/images/bed-level-t-r.svg +++ b/styles/material-darker/images/bed-level-t-r.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed-level.svg b/styles/material-darker/images/bed-level.svg index a46710796..3d4bdf2c2 100644 --- a/styles/material-darker/images/bed-level.svg +++ b/styles/material-darker/images/bed-level.svg @@ -1,39 +1,39 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/bed.svg b/styles/material-darker/images/bed.svg index b4000f689..1f2c36f88 100644 --- a/styles/material-darker/images/bed.svg +++ b/styles/material-darker/images/bed.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/camera.svg b/styles/material-darker/images/camera.svg index b825fb99c..54dbcea4c 100644 --- a/styles/material-darker/images/camera.svg +++ b/styles/material-darker/images/camera.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/cancel.svg b/styles/material-darker/images/cancel.svg index 7d1a114db..e3e72bc02 100644 --- a/styles/material-darker/images/cancel.svg +++ b/styles/material-darker/images/cancel.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/clock.svg b/styles/material-darker/images/clock.svg index 343210b35..491699ca0 100644 --- a/styles/material-darker/images/clock.svg +++ b/styles/material-darker/images/clock.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/complete.svg b/styles/material-darker/images/complete.svg index 719a4539e..ec0b9dcb6 100644 --- a/styles/material-darker/images/complete.svg +++ b/styles/material-darker/images/complete.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/console.svg b/styles/material-darker/images/console.svg index 52243741c..1450c1121 100644 --- a/styles/material-darker/images/console.svg +++ b/styles/material-darker/images/console.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/cool-down.svg b/styles/material-darker/images/cool-down.svg index 8a9cacb4e..9d619106d 100644 --- a/styles/material-darker/images/cool-down.svg +++ b/styles/material-darker/images/cool-down.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/custom-script.svg b/styles/material-darker/images/custom-script.svg index 0cf627ca5..53bdcfb32 100644 --- a/styles/material-darker/images/custom-script.svg +++ b/styles/material-darker/images/custom-script.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/decrease.svg b/styles/material-darker/images/decrease.svg index 7c41b832d..da7b4f5bc 100644 --- a/styles/material-darker/images/decrease.svg +++ b/styles/material-darker/images/decrease.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/delete.svg b/styles/material-darker/images/delete.svg index 57bae23c2..c30fde66f 100644 --- a/styles/material-darker/images/delete.svg +++ b/styles/material-darker/images/delete.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/emergency.svg b/styles/material-darker/images/emergency.svg index e8e740844..ae743c70a 100644 --- a/styles/material-darker/images/emergency.svg +++ b/styles/material-darker/images/emergency.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extrude.svg b/styles/material-darker/images/extrude.svg index bc4c09e3d..a1bd63910 100644 --- a/styles/material-darker/images/extrude.svg +++ b/styles/material-darker/images/extrude.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder-0.svg b/styles/material-darker/images/extruder-0.svg index 5fc892ee5..eb97d0bcf 100644 --- a/styles/material-darker/images/extruder-0.svg +++ b/styles/material-darker/images/extruder-0.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder-1.svg b/styles/material-darker/images/extruder-1.svg index 9cafc414b..fa8a95db1 100644 --- a/styles/material-darker/images/extruder-1.svg +++ b/styles/material-darker/images/extruder-1.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder-2.svg b/styles/material-darker/images/extruder-2.svg index d0eb08faf..6aaf7138f 100644 --- a/styles/material-darker/images/extruder-2.svg +++ b/styles/material-darker/images/extruder-2.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder-3.svg b/styles/material-darker/images/extruder-3.svg index 1803d8a4e..4bdea9299 100644 --- a/styles/material-darker/images/extruder-3.svg +++ b/styles/material-darker/images/extruder-3.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder-4.svg b/styles/material-darker/images/extruder-4.svg index e3b1a7489..cc4912b22 100644 --- a/styles/material-darker/images/extruder-4.svg +++ b/styles/material-darker/images/extruder-4.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/extruder.svg b/styles/material-darker/images/extruder.svg index bc4c09e3d..a2d98dbeb 100644 --- a/styles/material-darker/images/extruder.svg +++ b/styles/material-darker/images/extruder.svg @@ -1,38 +1,39 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/fan-on.svg b/styles/material-darker/images/fan-on.svg index 95fd56901..11d768ecc 100644 --- a/styles/material-darker/images/fan-on.svg +++ b/styles/material-darker/images/fan-on.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/fan.svg b/styles/material-darker/images/fan.svg index aab18856e..3fc701f72 100644 --- a/styles/material-darker/images/fan.svg +++ b/styles/material-darker/images/fan.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/filament.svg b/styles/material-darker/images/filament.svg index 049b35389..e9633ea9e 100644 --- a/styles/material-darker/images/filament.svg +++ b/styles/material-darker/images/filament.svg @@ -1,43 +1,43 @@ - - - - - - - + + + + + + + diff --git a/styles/material-darker/images/file.svg b/styles/material-darker/images/file.svg index 1dcca2174..26a182ee8 100644 --- a/styles/material-darker/images/file.svg +++ b/styles/material-darker/images/file.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/files.svg b/styles/material-darker/images/files.svg index f38fdfb09..2aa4a00b8 100644 --- a/styles/material-darker/images/files.svg +++ b/styles/material-darker/images/files.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/fine-tune.svg b/styles/material-darker/images/fine-tune.svg index 7eae6cde2..9505cda8d 100644 --- a/styles/material-darker/images/fine-tune.svg +++ b/styles/material-darker/images/fine-tune.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/flow+.svg b/styles/material-darker/images/flow+.svg index a69dd0472..db9f29579 100644 --- a/styles/material-darker/images/flow+.svg +++ b/styles/material-darker/images/flow+.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/flow-.svg b/styles/material-darker/images/flow-.svg index e3ce66607..77bdbf766 100644 --- a/styles/material-darker/images/flow-.svg +++ b/styles/material-darker/images/flow-.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/folder.svg b/styles/material-darker/images/folder.svg index fd9d4c992..6ab303591 100644 --- a/styles/material-darker/images/folder.svg +++ b/styles/material-darker/images/folder.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/hashtag.svg b/styles/material-darker/images/hashtag.svg index 07b245d3b..63cddf02f 100644 --- a/styles/material-darker/images/hashtag.svg +++ b/styles/material-darker/images/hashtag.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/heat-up.svg b/styles/material-darker/images/heat-up.svg index 9fb6a9758..fb33050d6 100644 --- a/styles/material-darker/images/heat-up.svg +++ b/styles/material-darker/images/heat-up.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/heater.svg b/styles/material-darker/images/heater.svg new file mode 100644 index 000000000..ca483b82a --- /dev/null +++ b/styles/material-darker/images/heater.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/styles/material-darker/images/home-x.svg b/styles/material-darker/images/home-x.svg index 6fc152283..c28dc9eb4 100644 --- a/styles/material-darker/images/home-x.svg +++ b/styles/material-darker/images/home-x.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/home-y.svg b/styles/material-darker/images/home-y.svg index 5601421e7..085320c12 100644 --- a/styles/material-darker/images/home-y.svg +++ b/styles/material-darker/images/home-y.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/home-z.svg b/styles/material-darker/images/home-z.svg index 0f450746d..ac12cd3d3 100644 --- a/styles/material-darker/images/home-z.svg +++ b/styles/material-darker/images/home-z.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/home.svg b/styles/material-darker/images/home.svg index e0a118bd5..f2cdfa2ec 100644 --- a/styles/material-darker/images/home.svg +++ b/styles/material-darker/images/home.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/hourglass.svg b/styles/material-darker/images/hourglass.svg index 54726f44f..2468d56d2 100644 --- a/styles/material-darker/images/hourglass.svg +++ b/styles/material-darker/images/hourglass.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/increase.svg b/styles/material-darker/images/increase.svg index bdc7762c1..4de8da480 100644 --- a/styles/material-darker/images/increase.svg +++ b/styles/material-darker/images/increase.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/info.svg b/styles/material-darker/images/info.svg index 6ec6bf50f..3041f87b5 100644 --- a/styles/material-darker/images/info.svg +++ b/styles/material-darker/images/info.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/klipper.svg b/styles/material-darker/images/klipper.svg index 519d5239e..be0e75f4f 100644 --- a/styles/material-darker/images/klipper.svg +++ b/styles/material-darker/images/klipper.svg @@ -1,75 +1,161 @@ - - - - - - image/svg+xml - - - - - - - Slice 3 - Created with Sketch. - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/material-darker/images/light.svg b/styles/material-darker/images/light.svg new file mode 100644 index 000000000..eae922bc9 --- /dev/null +++ b/styles/material-darker/images/light.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/styles/material-darker/images/load.svg b/styles/material-darker/images/load.svg index 39928c2a4..9a0a5ab86 100644 --- a/styles/material-darker/images/load.svg +++ b/styles/material-darker/images/load.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/main.svg b/styles/material-darker/images/main.svg index 3622b74df..7b17f4453 100644 --- a/styles/material-darker/images/main.svg +++ b/styles/material-darker/images/main.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/motor-off.svg b/styles/material-darker/images/motor-off.svg index 96156b4a7..2c18757da 100644 --- a/styles/material-darker/images/motor-off.svg +++ b/styles/material-darker/images/motor-off.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/move.svg b/styles/material-darker/images/move.svg index 1000d858b..eec26e6cc 100644 --- a/styles/material-darker/images/move.svg +++ b/styles/material-darker/images/move.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/network.svg b/styles/material-darker/images/network.svg index 7967df934..28e962641 100644 --- a/styles/material-darker/images/network.svg +++ b/styles/material-darker/images/network.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/pause.svg b/styles/material-darker/images/pause.svg index ddfd12417..4b22e03a3 100644 --- a/styles/material-darker/images/pause.svg +++ b/styles/material-darker/images/pause.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/print.svg b/styles/material-darker/images/print.svg index 173a8c436..7163d8ca4 100644 --- a/styles/material-darker/images/print.svg +++ b/styles/material-darker/images/print.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/refresh.svg b/styles/material-darker/images/refresh.svg index 03411b0dd..37db8101a 100644 --- a/styles/material-darker/images/refresh.svg +++ b/styles/material-darker/images/refresh.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/resume.svg b/styles/material-darker/images/resume.svg index eb8fa2b4d..e3d90109f 100644 --- a/styles/material-darker/images/resume.svg +++ b/styles/material-darker/images/resume.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/retract.svg b/styles/material-darker/images/retract.svg index b1c70b545..e79adedc9 100644 --- a/styles/material-darker/images/retract.svg +++ b/styles/material-darker/images/retract.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/sd.svg b/styles/material-darker/images/sd.svg index 908f6e39f..165e5bf56 100644 --- a/styles/material-darker/images/sd.svg +++ b/styles/material-darker/images/sd.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/settings.svg b/styles/material-darker/images/settings.svg index 823701026..589f7c717 100644 --- a/styles/material-darker/images/settings.svg +++ b/styles/material-darker/images/settings.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/shuffle.svg b/styles/material-darker/images/shuffle.svg index 7cc43a5da..ce4070fa5 100644 --- a/styles/material-darker/images/shuffle.svg +++ b/styles/material-darker/images/shuffle.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/shutdown.svg b/styles/material-darker/images/shutdown.svg index 5881731e6..7e2839163 100644 --- a/styles/material-darker/images/shutdown.svg +++ b/styles/material-darker/images/shutdown.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/speed+.svg b/styles/material-darker/images/speed+.svg index c98f2d516..68e017b4e 100644 --- a/styles/material-darker/images/speed+.svg +++ b/styles/material-darker/images/speed+.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/speed-.svg b/styles/material-darker/images/speed-.svg index 9c7ac9ea4..f805bd92c 100644 --- a/styles/material-darker/images/speed-.svg +++ b/styles/material-darker/images/speed-.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/splash.png b/styles/material-darker/images/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/material-darker/images/splash.png and /dev/null differ diff --git a/styles/material-darker/images/stop.svg b/styles/material-darker/images/stop.svg index 27e82a1c6..c68a3627c 100644 --- a/styles/material-darker/images/stop.svg +++ b/styles/material-darker/images/stop.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/toolchanger.svg b/styles/material-darker/images/toolchanger.svg index 87e3781d3..afbe402e9 100644 --- a/styles/material-darker/images/toolchanger.svg +++ b/styles/material-darker/images/toolchanger.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/warning.svg b/styles/material-darker/images/warning.svg index 3387b1cf1..6116eae4b 100644 --- a/styles/material-darker/images/warning.svg +++ b/styles/material-darker/images/warning.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/z-closer.svg b/styles/material-darker/images/z-closer.svg index 538b2611e..6e8bbdecf 100644 --- a/styles/material-darker/images/z-closer.svg +++ b/styles/material-darker/images/z-closer.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/z-farther.svg b/styles/material-darker/images/z-farther.svg index 13e1424f4..b41667b6d 100644 --- a/styles/material-darker/images/z-farther.svg +++ b/styles/material-darker/images/z-farther.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/images/z-tilt.svg b/styles/material-darker/images/z-tilt.svg index 200ac7657..61432d5b4 100644 --- a/styles/material-darker/images/z-tilt.svg +++ b/styles/material-darker/images/z-tilt.svg @@ -1,38 +1,38 @@ - - - - - - + + + + + + diff --git a/styles/material-darker/style.conf b/styles/material-darker/style.conf new file mode 100644 index 000000000..923c063fb --- /dev/null +++ b/styles/material-darker/style.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["C62828", "9C27B0", "F06292", "F44336", "6A1B9A"], + "state": 0 + }, + "bed": { + "colors": ["00B0FF"], + "state": 0 + }, + "fan": { + "colors": ["558B2F", "8BC34A", "00695C", "009688"], + "state": 0 + }, + "sensor": { + "colors": ["FF8F00", "3F51B5", "9E9D24", "CDDC39", "FFC107"], + "state": 0 + } + } +} diff --git a/styles/material-darker/style.css b/styles/material-darker/style.css index c06ad35eb..7dbcd9cc0 100644 --- a/styles/material-darker/style.css +++ b/styles/material-darker/style.css @@ -1,193 +1,196 @@ -/* Material-darker theme created by Alfredo Monclus 2021 */ - -* { - color: #e2e2e2; -} - -window { - background-color: #121212; - background-image: url("./styles/material-dark/background.svg"); - background-size: cover; -} - -button { - background-color: rgba(0,0,0,0); -} - -button:active { - background-color: rgba(0,0,0,0.5); -} - -.button_active { - border-color: rgba(0,0,0,0.0); - border-style: solid; - border-width: .25em; - background-color: rgba(0,0,0,0.5); -} - -button.color1, button.color2, button.color3, button.color4 { - background-color: rgba(0,0,0,0.75); - border-color: rgba(0,0,0,0); - border-radius: 1em; -} - -button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { - border-style: none; -} - -button.active { - background-color: #E65100; -} - -button.update { - background-color: #2f5631; - border-color: #2f5631; - border-radius: 1em; -} - -button.invalid { - background-color: #ff5252; - border-color: #ff5252; - border-radius: 1em; -} - -combobox box button { - background-color: #1e1e1e; - border-color: #303030; -} - -switch { - background-color: #1e1e1e; - border-color: #303030; -} - -switch:checked { - background-color: #2f5631; -} - -entry { - background-color: #1e1e1e; - border-color: #303030; -} - -frame { - color: #e2e2e2; - border-bottom-color: rgba(0,0,0,0.5);; -} - -label { - color: #e2e2e2; -} - -menu { - background-color: #121212; - border-color: #a2a2a2; -} - -menuitem { - background-color: #121212; - border-color: #a2a2a2; -} - -trough { - background-color: #1e1e1e; - color: #e2e2e2; -} - -trough highlight, trough progress { - background-color: #B71C1C; - color: #e2e2e2; -} - -scale-mark { - color: #e2e2e2; -} - -scrollbar, scrollbar button, scrollbar trough { - background-color: rgba(0,0,0,0); -} - -scrollbar slider { - background-color: #2f2f2f; -} - -textview .time { - color: #9E9E9E; -} - -.popup { - background-color: #006064; -} - -.dialog { - border: #121212; - background-color: #121212; -} - -.dialog button { - background-color: #1e1e1e; - border-bottom-color: #1e1e1e; - border-radius: .75em; -} - -.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { - border-color: #1e1e1e; - background-color: rgba(0,0,0,0.75); -} - -.distbutton_active { - background-color: rgba(128,128,128,0.5); -} - -.fan_slider { - color: #e2e2e2; -} - -.message_popup { - background-color: #B71C1C; - border-bottom-color: #e2e2e2; -} - -.message_popup button { - background-color: #B71C1C; -} - -.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { - border-color: #383838; - background-color: #252525; -} - -.printing-status { - color: #e2e2e2; -} - -.printing-progress-bar { - color: #006064; -} - -.printing-progress-text { - color: #e2e2e2; -} - -.printing-status-label { - color: #9E9E9E; -} - -.message { - border-color: #B71C1C; - color: #e2e2e2; - background-color: #B71C1C; -} - -.message button { - background-color: #e2e2e2; - color: #121212; -} - -.warning { - background-color: #f9b274; -} - -.error { - background-color: #CF6679; -} +/* Material-darker theme created by Alfredo Monclus 2021 */ + +* { + color: #e2e2e2; +} + +window { + background-color: #121212; + background-image: url("./styles/material-dark/background.svg"); + background-size: cover; +} + +button { + background-color: rgba(0,0,0,0); +} + +button:active { + background-color: rgba(0,0,0,0.5); +} + +.button_active { + border-color: rgba(0,0,0,0.0); + border-style: solid; + border-width: .25em; + background-color: rgba(0,0,0,0.5); + border-radius: 1em; +} + +button.color1, button.color2, button.color3, button.color4 { + background-color: rgba(0,0,0,0.75); + border-color: rgba(0,0,0,0); + border-radius: 1em; +} + +button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { + border-style: none; +} + +button.active { + background-color: #E65100; +} + +button.update { + background-color: #2f5631; + border-color: #2f5631; + border-radius: 1em; +} + +button.invalid { + background-color: #ff5252; + border-color: #ff5252; + border-radius: 1em; +} + +combobox box button { + background-color: #1e1e1e; + border-color: #303030; +} + +switch { + background-color: #1e1e1e; +} + +switch:checked { + background-color: #2f5631; +} + +entry { + background-color: #1e1e1e; + border-color: #303030; +} + +frame { + color: #e2e2e2; + border-bottom-color: rgba(0,0,0,0.5);; +} + +label { + color: #e2e2e2; +} + +menu { + background-color: #121212; + border-color: #a2a2a2; +} + +menuitem { + background-color: #121212; + border-color: #a2a2a2; +} + +trough { + background-color: #1e1e1e; + color: #e2e2e2; +} + +trough highlight, trough progress { + background-color: #B71C1C; + color: #e2e2e2; +} + +scale-mark { + color: #e2e2e2; +} + +scrollbar, scrollbar button, scrollbar trough { + background-color: rgba(0,0,0,0); +} + +scrollbar slider { + background-color: #2f2f2f; +} + +textview .time { + color: #9E9E9E; +} + +.popup { + background-color: #006064; +} + +.dialog { + border: #121212; + background-color: #121212; +} + +.dialog button { + background-color: #1e1e1e; + border-bottom-color: #1e1e1e; + border-radius: .75em; +} + +.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { + border-color: #1e1e1e; + background-color: rgba(0,0,0,0.75); +} + +.distbutton_active { + background-color: rgba(128,128,128,0.5); +} + +.fan_slider { + color: #e2e2e2; +} + +.message_popup { + border-bottom-color: #e2e2e2; +} + +.message_popup_echo, .message_popup_echo button { + background-color: #006412; +} + +.message_popup_error, .message_popup_error button { + background-color: #B71C1C; +} + +.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { + border-color: #383838; + background-color: #252525; +} + +.printing-status { + color: #e2e2e2; +} + +.printing-progress-bar { + color: #006064; +} + +.printing-progress-text { + color: #e2e2e2; +} + +.printing-status-label { + color: #9E9E9E; +} + +.message { + border-color: #B71C1C; + color: #e2e2e2; + background-color: #B71C1C; +} + +.message button { + background-color: #e2e2e2; + color: #121212; +} + +.warning { + background-color: #f9b274; +} + +.error { + background-color: #CF6679; +} diff --git a/styles/material-light/images/bed-level-b-l.svg b/styles/material-light/images/bed-level-b-l.svg index d0ed1ee72..7825e2a60 100644 --- a/styles/material-light/images/bed-level-b-l.svg +++ b/styles/material-light/images/bed-level-b-l.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + diff --git a/styles/material-light/images/bed-level-b-m.svg b/styles/material-light/images/bed-level-b-m.svg new file mode 100644 index 000000000..770c29192 --- /dev/null +++ b/styles/material-light/images/bed-level-b-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-light/images/bed-level-b-r.svg b/styles/material-light/images/bed-level-b-r.svg index 3e800e07a..cd4891892 100644 --- a/styles/material-light/images/bed-level-b-r.svg +++ b/styles/material-light/images/bed-level-b-r.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + diff --git a/styles/material-light/images/bed-level-l-m.svg b/styles/material-light/images/bed-level-l-m.svg new file mode 100644 index 000000000..355f1dbfe --- /dev/null +++ b/styles/material-light/images/bed-level-l-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-light/images/bed-level-r-m.svg b/styles/material-light/images/bed-level-r-m.svg new file mode 100644 index 000000000..58bd8accc --- /dev/null +++ b/styles/material-light/images/bed-level-r-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-light/images/bed-level-t-l.svg b/styles/material-light/images/bed-level-t-l.svg index 6df5d68ae..d5c6f22ca 100644 --- a/styles/material-light/images/bed-level-t-l.svg +++ b/styles/material-light/images/bed-level-t-l.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + diff --git a/styles/material-light/images/bed-level-t-m.svg b/styles/material-light/images/bed-level-t-m.svg new file mode 100644 index 000000000..0c59f7bb0 --- /dev/null +++ b/styles/material-light/images/bed-level-t-m.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/styles/material-light/images/bed-level-t-r.svg b/styles/material-light/images/bed-level-t-r.svg index 207e38b3f..bfe79da26 100644 --- a/styles/material-light/images/bed-level-t-r.svg +++ b/styles/material-light/images/bed-level-t-r.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + diff --git a/styles/material-light/images/bed-level.svg b/styles/material-light/images/bed-level.svg index 03f0acefe..370566c33 100644 --- a/styles/material-light/images/bed-level.svg +++ b/styles/material-light/images/bed-level.svg @@ -1,39 +1,39 @@ - - - - - - + + + + + + diff --git a/styles/material-light/images/console.svg b/styles/material-light/images/console.svg index 5fcc9f648..32275b0f0 100644 --- a/styles/material-light/images/console.svg +++ b/styles/material-light/images/console.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/styles/material-light/images/delete.svg b/styles/material-light/images/delete.svg index aec7aeb19..ee26c5945 100644 --- a/styles/material-light/images/delete.svg +++ b/styles/material-light/images/delete.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/styles/material-light/images/extruder.svg b/styles/material-light/images/extruder.svg index 576d0ba9e..994dab548 100644 --- a/styles/material-light/images/extruder.svg +++ b/styles/material-light/images/extruder.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + diff --git a/styles/material-light/images/filament.svg b/styles/material-light/images/filament.svg index c8523e118..ae40c4818 100644 --- a/styles/material-light/images/filament.svg +++ b/styles/material-light/images/filament.svg @@ -1,88 +1,88 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/styles/material-light/images/heater.svg b/styles/material-light/images/heater.svg new file mode 100644 index 000000000..ec2658690 --- /dev/null +++ b/styles/material-light/images/heater.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-light/images/klipper.svg b/styles/material-light/images/klipper.svg index ebf8c58b6..be0e75f4f 100644 --- a/styles/material-light/images/klipper.svg +++ b/styles/material-light/images/klipper.svg @@ -1,75 +1,161 @@ - - - - - - image/svg+xml - - - - - - - Slice 3 - Created with Sketch. - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/material-light/images/light.svg b/styles/material-light/images/light.svg new file mode 100644 index 000000000..528ee77fd --- /dev/null +++ b/styles/material-light/images/light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-light/images/load.svg b/styles/material-light/images/load.svg index b134562bf..8e7175d30 100644 --- a/styles/material-light/images/load.svg +++ b/styles/material-light/images/load.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/styles/material-light/images/splash.png b/styles/material-light/images/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/material-light/images/splash.png and /dev/null differ diff --git a/styles/material-light/images/warning.svg b/styles/material-light/images/warning.svg index 99f38e30b..6e132bf75 100644 --- a/styles/material-light/images/warning.svg +++ b/styles/material-light/images/warning.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/styles/material-light/style.conf b/styles/material-light/style.conf new file mode 100644 index 000000000..923c063fb --- /dev/null +++ b/styles/material-light/style.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["C62828", "9C27B0", "F06292", "F44336", "6A1B9A"], + "state": 0 + }, + "bed": { + "colors": ["00B0FF"], + "state": 0 + }, + "fan": { + "colors": ["558B2F", "8BC34A", "00695C", "009688"], + "state": 0 + }, + "sensor": { + "colors": ["FF8F00", "3F51B5", "9E9D24", "CDDC39", "FFC107"], + "state": 0 + } + } +} diff --git a/styles/material-light/style.css b/styles/material-light/style.css index 278c458a9..f4d4c714e 100644 --- a/styles/material-light/style.css +++ b/styles/material-light/style.css @@ -1,255 +1,256 @@ -/* Material-light theme created by Alfredo Monclus 2021 */ - -* { - color: black; -} - -window { - background-color: #FAFAFA; -} - -button { - background-color: #FAFAFA; -} - -button label{ - color: black; -} - -button:active { - background-color: #FFA726; -} - -.button_active { - border-color: #BDBDBD; - border-style: solid; - border-width: .25em; - background-color: white; - box-shadow: .1em .1em #BDBDBD; - border-radius: 1em; -} - -button.color1 label, button.color2 label, button.color3 label, button.color4 label { - color: black; -} - -button.color1 { - background-color: #FFF59D; - border-color: #FFF59D; - box-shadow: .1em .1em #BDBDBD; - border-radius: 1em; -} - -button.color2 { - background-color: #F48FB1; - border-color: #F48FB1; - box-shadow: .1em .1em #BDBDBD; - border-radius: 1em; -} - -button.color3 { - background-color: #C5E1A5; - border-color: #C5E1A5; - box-shadow: .1em .1em #BDBDBD; - border-radius: 1em; -} - -button.color4 { - background-color: #80DEEA; - border-color: #80DEEA; - box-shadow: .1em .1em #BDBDBD; - border-radius: 1em; -} - -button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { - border-style: none; -} - -button.active { - background-color: #FFA726; -} - -button.update { - background-color: #C5E1A5; - border-color: #C5E1A5; -} - -button.invalid { - background-color: #EF9A9A; - border-color: #EF9A9A; -} - -combobox window.popup { - background-color: white; -} - -combobox box button { - background-color: white; - border-color: #BDBDBD; -} - -switch { - background-color: #BDBDBD; - border-radius: 2em; - border-color: #BDBDBD -} - -switch:checked { - background-color: #C5E1A5; -} - -switch slider { - border-color: #BDBDBD; -} - -entry { - border-color: #F5F5F5; - background-color: #F5F5F5; -} - -frame { - border-bottom-color: #BDBDBD; -} - -label { - color: black; -} - -menu { - background-color: #FAFAFA; - border-color: #BDBDBD; -} - -menuitem { - background-color: #FAFAFA; - border-color: #BDBDBD; -} - -trough { - background-color: transparent; - color: #BDBDBD; - border-radius: 1em; -} - -trough highlight, trough progress { - background-color: #F48FB1; - color: #e2e2e2; - border-color: #121212; - border-top-left-radius: 1em; - border-bottom-left-radius: 1em; -} - -scale-mark { - color: #e2e2e2; -} - -scrollbar, scrollbar button, scrollbar trough { - background-color: transparent; -} - -scrollbar slider { - background-color: #BDBDBD; -} - -textview { - background-color: #212121; -} - -textview .time { - color: #9E9E9E; -} - -.popup { - background-color: #006064; -} - -.dialog { - border: #121212; - background-color: #FAFAFA; -} - -.dialog button { - background-color: #80CBC4; - border-bottom-color: #80CBC4; - border-radius: .75em; -} - -.dialog button:nth-child(1) { - background-color: #C5E1A5; - border-bottom-color: #C5E1A5; -} - -.dialog button:nth-child(2) { - background-color: #EF9A9A; - border-bottom-color: #EF9A9A; -} - -.dialog button:nth-child(1) label , .dialog button:nth-child(2) label { - color: black; -} - -.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { - border-color: #BDBDBD; - background-color: #F5F5F5; -} - -.distbutton_active { - background-color: #FFAB91; -} - -.distbutton_active label { - color: black; -} - -.fan_slider { - color: #e2e2e2; -} - -.message_popup { - background-color: #EF9A9A; - border-bottom-color: #e2e2e2; -} - -.message_popup button { - background-color: #EF9A9A; -} - -.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { - border-color: #BDBDBD; - background-color: #F5F5F5; -} - -.printing-status { - color: black; -} - -.printing-progress-bar { - color: #F48FB1; -} - -.printing-progress-text { - color: black; -} - -.printing-status-label { - color: black; -} - -.message { - border-color: #EF9A9A; - color: #e2e2e2; - background-color: #EF9A9A; -} - -.message button { - background-color: #e2e2e2; - color: #121212; -} - -.warning { - background-color: #FFE082; -} - -.error { - background-color: #EF9A9A; -} +/* Material-light theme created by Alfredo Monclus 2021 */ + +* { + color: black; +} + +window { + background-color: #FAFAFA; +} + +button { + background-color: #FAFAFA; +} + +button label{ + color: black; +} + +button:active { + background-color: #FFA726; +} + +.button_active { + border-color: #BDBDBD; + border-style: solid; + border-width: .25em; + background-color: white; + box-shadow: .1em .1em #BDBDBD; + border-radius: 1em; +} + +button.color1 label, button.color2 label, button.color3 label, button.color4 label { + color: black; +} + +button.color1 { + background-color: #FFF59D; + border-color: #FFF59D; + box-shadow: .1em .1em #BDBDBD; + border-radius: 1em; +} + +button.color2 { + background-color: #F48FB1; + border-color: #F48FB1; + box-shadow: .1em .1em #BDBDBD; + border-radius: 1em; +} + +button.color3 { + background-color: #C5E1A5; + border-color: #C5E1A5; + box-shadow: .1em .1em #BDBDBD; + border-radius: 1em; +} + +button.color4 { + background-color: #80DEEA; + border-color: #80DEEA; + box-shadow: .1em .1em #BDBDBD; + border-radius: 1em; +} + +button.color1:active, button.color2:active, button.color3:active, button.color4:active, button.update:active, button.invalid:active, .dialog button:active { + border-style: none; +} + +button.active { + background-color: #FFA726; +} + +button.update { + background-color: #C5E1A5; + border-color: #C5E1A5; +} + +button.invalid { + background-color: #EF9A9A; + border-color: #EF9A9A; +} + +combobox window.popup { + background-color: white; +} + +combobox box button { + background-color: white; + border-color: #BDBDBD; +} + +switch { + background-color: #BDBDBD; +} + +switch:checked { + background-color: #C5E1A5; +} + +switch slider { + border: .1em solid #BDBDBD; +} + +entry { + border-color: #F5F5F5; + background-color: #F5F5F5; +} + +frame { + border-bottom-color: #BDBDBD; +} + +label { + color: black; +} + +menu { + background-color: #FAFAFA; + border-color: #BDBDBD; +} + +menuitem { + background-color: #FAFAFA; + border-color: #BDBDBD; +} + +trough { + background-color: transparent; + color: #BDBDBD; + border-radius: 1em; +} + +trough highlight, trough progress { + background-color: #F48FB1; + color: #e2e2e2; + border-color: #121212; + border-top-left-radius: 1em; + border-bottom-left-radius: 1em; +} + +scale-mark { + color: #e2e2e2; +} + +scrollbar, scrollbar button, scrollbar trough { + background-color: transparent; +} + +scrollbar slider { + background-color: #BDBDBD; +} + +textview { + background-color: #212121; +} + +textview .time { + color: #9E9E9E; +} + +.popup { + background-color: #006064; +} + +.dialog { + border: #121212; + background-color: #FAFAFA; +} + +.dialog button { + background-color: #80CBC4; + border-bottom-color: #80CBC4; + border-radius: .75em; +} + +.dialog button:nth-child(1) { + background-color: #C5E1A5; + border-bottom-color: #C5E1A5; +} + +.dialog button:nth-child(2) { + background-color: #EF9A9A; + border-bottom-color: #EF9A9A; +} + +.dialog button:nth-child(1) label , .dialog button:nth-child(2) label { + color: black; +} + +.tempbutton_top, .tempbutton, .tempbutton_bottom, .distbutton_top, .distbutton, .distbutton_bottom { + border-color: #BDBDBD; + background-color: #F5F5F5; +} + +.distbutton_active { + background-color: #FFAB91; +} + +.distbutton_active label { + color: black; +} + +.fan_slider { + color: #e2e2e2; +} + +.message_popup { + border-bottom-color: #e2e2e2; +} + +.message_popup_echo, .message_popup_echo button { + background-color: #a1ef9a; +} + +.message_popup_error, .message_popup_error button { + background-color: #EF9A9A; +} + +.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { + border-color: #BDBDBD; + background-color: #F5F5F5; +} + +.printing-status { + color: black; +} + +.printing-progress-bar { + color: #F48FB1; +} + +.printing-progress-text { + color: black; +} + +.printing-status-label { + color: black; +} + +.message { + border-color: #EF9A9A; + color: #e2e2e2; + background-color: #EF9A9A; +} + +.message button { + background-color: #e2e2e2; + color: #121212; +} + +.warning { + background-color: #FFE082; +} + +.error { + background-color: #EF9A9A; +} diff --git a/styles/splash.png b/styles/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/splash.png and /dev/null differ diff --git a/styles/z-bolt/images/arrow-down.svg b/styles/z-bolt/images/arrow-down.svg index 5c14bfbef..1b24bd59f 100644 --- a/styles/z-bolt/images/arrow-down.svg +++ b/styles/z-bolt/images/arrow-down.svg @@ -1,78 +1,68 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/arrow-left.svg b/styles/z-bolt/images/arrow-left.svg index 13e728414..3f083e39f 100644 --- a/styles/z-bolt/images/arrow-left.svg +++ b/styles/z-bolt/images/arrow-left.svg @@ -1,78 +1,68 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/arrow-right.svg b/styles/z-bolt/images/arrow-right.svg index 20d18319c..34014af9b 100644 --- a/styles/z-bolt/images/arrow-right.svg +++ b/styles/z-bolt/images/arrow-right.svg @@ -1,78 +1,68 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/arrow-up.svg b/styles/z-bolt/images/arrow-up.svg index f32cec275..122fd17df 100644 --- a/styles/z-bolt/images/arrow-up.svg +++ b/styles/z-bolt/images/arrow-up.svg @@ -1,78 +1,68 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/back.svg b/styles/z-bolt/images/back.svg index d383410de..b68a65bdd 100644 --- a/styles/z-bolt/images/back.svg +++ b/styles/z-bolt/images/back.svg @@ -1,72 +1,72 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/backspace.svg b/styles/z-bolt/images/backspace.svg index 8cf80b7f2..9bdef266d 100644 --- a/styles/z-bolt/images/backspace.svg +++ b/styles/z-bolt/images/backspace.svg @@ -1,76 +1,76 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/bed-level-b-l.svg b/styles/z-bolt/images/bed-level-b-l.svg index c27a51360..6650851b3 100644 --- a/styles/z-bolt/images/bed-level-b-l.svg +++ b/styles/z-bolt/images/bed-level-b-l.svg @@ -1,80 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/bed-level-b-m.svg b/styles/z-bolt/images/bed-level-b-m.svg new file mode 100644 index 000000000..9cbaf77d6 --- /dev/null +++ b/styles/z-bolt/images/bed-level-b-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/bed-level-b-r.svg b/styles/z-bolt/images/bed-level-b-r.svg index f1723145b..721b97bd5 100644 --- a/styles/z-bolt/images/bed-level-b-r.svg +++ b/styles/z-bolt/images/bed-level-b-r.svg @@ -1,80 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/bed-level-l-m.svg b/styles/z-bolt/images/bed-level-l-m.svg new file mode 100644 index 000000000..161ebfaac --- /dev/null +++ b/styles/z-bolt/images/bed-level-l-m.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/bed-level-r-m.svg b/styles/z-bolt/images/bed-level-r-m.svg new file mode 100644 index 000000000..71f4ca633 --- /dev/null +++ b/styles/z-bolt/images/bed-level-r-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/bed-level-t-l.svg b/styles/z-bolt/images/bed-level-t-l.svg index acf689e9a..a29167c23 100644 --- a/styles/z-bolt/images/bed-level-t-l.svg +++ b/styles/z-bolt/images/bed-level-t-l.svg @@ -1,80 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/bed-level-t-m.svg b/styles/z-bolt/images/bed-level-t-m.svg new file mode 100644 index 000000000..dd269ae6f --- /dev/null +++ b/styles/z-bolt/images/bed-level-t-m.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/bed-level-t-r.svg b/styles/z-bolt/images/bed-level-t-r.svg index a37a695ff..6e7540418 100644 --- a/styles/z-bolt/images/bed-level-t-r.svg +++ b/styles/z-bolt/images/bed-level-t-r.svg @@ -1,80 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/bed-level.svg b/styles/z-bolt/images/bed-level.svg index 691324a76..e8b1a80c4 100644 --- a/styles/z-bolt/images/bed-level.svg +++ b/styles/z-bolt/images/bed-level.svg @@ -1,116 +1,116 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + diff --git a/styles/z-bolt/images/bed.svg b/styles/z-bolt/images/bed.svg index eff843676..25c6377e5 100644 --- a/styles/z-bolt/images/bed.svg +++ b/styles/z-bolt/images/bed.svg @@ -1,116 +1,116 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + diff --git a/styles/z-bolt/images/cancel.svg b/styles/z-bolt/images/cancel.svg index 52f5173e2..5ae7c3233 100644 --- a/styles/z-bolt/images/cancel.svg +++ b/styles/z-bolt/images/cancel.svg @@ -1,64 +1,64 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/clock.svg b/styles/z-bolt/images/clock.svg index b3db17d07..4473f365d 100644 --- a/styles/z-bolt/images/clock.svg +++ b/styles/z-bolt/images/clock.svg @@ -1,75 +1,75 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/complete.svg b/styles/z-bolt/images/complete.svg index 6edacfc41..1de2e0a44 100644 --- a/styles/z-bolt/images/complete.svg +++ b/styles/z-bolt/images/complete.svg @@ -1,76 +1,76 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/console.svg b/styles/z-bolt/images/console.svg index 3d5d51b78..a0de89a61 100644 --- a/styles/z-bolt/images/console.svg +++ b/styles/z-bolt/images/console.svg @@ -1,20 +1,115 @@ - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/cool-down.svg b/styles/z-bolt/images/cool-down.svg index cb86aba11..8f9434880 100644 --- a/styles/z-bolt/images/cool-down.svg +++ b/styles/z-bolt/images/cool-down.svg @@ -1,73 +1,77 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/custom-script.svg b/styles/z-bolt/images/custom-script.svg index b1fe952c1..b7c7bfbd1 100644 --- a/styles/z-bolt/images/custom-script.svg +++ b/styles/z-bolt/images/custom-script.svg @@ -1,94 +1,94 @@ - - - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/decrease.svg b/styles/z-bolt/images/decrease.svg index ac52a7958..0cea3c7a0 100644 --- a/styles/z-bolt/images/decrease.svg +++ b/styles/z-bolt/images/decrease.svg @@ -1,72 +1,72 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/delete.svg b/styles/z-bolt/images/delete.svg index 46a61cde2..de400db3f 100644 --- a/styles/z-bolt/images/delete.svg +++ b/styles/z-bolt/images/delete.svg @@ -1,8 +1,89 @@ - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/emergency.svg b/styles/z-bolt/images/emergency.svg index 881c1f64d..73d1a72f1 100644 --- a/styles/z-bolt/images/emergency.svg +++ b/styles/z-bolt/images/emergency.svg @@ -1,101 +1,101 @@ - - - - - - - image/svg+xml - - folder - - - - - - - - folder - - Created with Sketch. - - - + + + + + + + image/svg+xml + + folder + + + + + + + + folder + + Created with Sketch. + + + diff --git a/styles/z-bolt/images/extrude.svg b/styles/z-bolt/images/extrude.svg index 138ed7623..25f6e1c68 100644 --- a/styles/z-bolt/images/extrude.svg +++ b/styles/z-bolt/images/extrude.svg @@ -1,101 +1,101 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/extruder-0.svg b/styles/z-bolt/images/extruder-0.svg index c2c8bedf5..8c0df28d4 100644 --- a/styles/z-bolt/images/extruder-0.svg +++ b/styles/z-bolt/images/extruder-0.svg @@ -1,85 +1,85 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/extruder-1.svg b/styles/z-bolt/images/extruder-1.svg index 0d39e512b..3d7af2f7c 100644 --- a/styles/z-bolt/images/extruder-1.svg +++ b/styles/z-bolt/images/extruder-1.svg @@ -1,91 +1,91 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/extruder-2.svg b/styles/z-bolt/images/extruder-2.svg index b8637d417..65e8e9c6a 100644 --- a/styles/z-bolt/images/extruder-2.svg +++ b/styles/z-bolt/images/extruder-2.svg @@ -1,91 +1,91 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/extruder-3.svg b/styles/z-bolt/images/extruder-3.svg index 548620808..0a5150cbe 100644 --- a/styles/z-bolt/images/extruder-3.svg +++ b/styles/z-bolt/images/extruder-3.svg @@ -1,91 +1,91 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/extruder-4.svg b/styles/z-bolt/images/extruder-4.svg index 0280b0edc..2429ee336 100644 --- a/styles/z-bolt/images/extruder-4.svg +++ b/styles/z-bolt/images/extruder-4.svg @@ -1,85 +1,85 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/extruder.svg b/styles/z-bolt/images/extruder.svg index 870549408..b58c3699f 100644 --- a/styles/z-bolt/images/extruder.svg +++ b/styles/z-bolt/images/extruder.svg @@ -1,81 +1,81 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/fan-on.svg b/styles/z-bolt/images/fan-on.svg index 5ee29f755..191742aa7 100644 --- a/styles/z-bolt/images/fan-on.svg +++ b/styles/z-bolt/images/fan-on.svg @@ -1,140 +1,140 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/fan.svg b/styles/z-bolt/images/fan.svg index 2c98f4e6a..efedb0daa 100644 --- a/styles/z-bolt/images/fan.svg +++ b/styles/z-bolt/images/fan.svg @@ -1,117 +1,117 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/filament.svg b/styles/z-bolt/images/filament.svg index b42796584..2c30aec7b 100644 --- a/styles/z-bolt/images/filament.svg +++ b/styles/z-bolt/images/filament.svg @@ -1,127 +1,127 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/file.svg b/styles/z-bolt/images/file.svg index 500665ac9..9e944e6f1 100644 --- a/styles/z-bolt/images/file.svg +++ b/styles/z-bolt/images/file.svg @@ -1,169 +1,94 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - + + + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/files.svg b/styles/z-bolt/images/files.svg index 39e488e46..10386e107 100644 --- a/styles/z-bolt/images/files.svg +++ b/styles/z-bolt/images/files.svg @@ -1,111 +1,112 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + diff --git a/styles/z-bolt/images/fine-tune.svg b/styles/z-bolt/images/fine-tune.svg index a503430aa..9f3c6f9b1 100644 --- a/styles/z-bolt/images/fine-tune.svg +++ b/styles/z-bolt/images/fine-tune.svg @@ -1,131 +1,131 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/flow+.svg b/styles/z-bolt/images/flow+.svg index d467f3a9d..cc33d02a7 100644 --- a/styles/z-bolt/images/flow+.svg +++ b/styles/z-bolt/images/flow+.svg @@ -1,102 +1,102 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + diff --git a/styles/z-bolt/images/flow-.svg b/styles/z-bolt/images/flow-.svg index 4bedcb153..5a155be9f 100644 --- a/styles/z-bolt/images/flow-.svg +++ b/styles/z-bolt/images/flow-.svg @@ -1,97 +1,97 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/folder.svg b/styles/z-bolt/images/folder.svg index cea1de7d8..2ef51e6ed 100644 --- a/styles/z-bolt/images/folder.svg +++ b/styles/z-bolt/images/folder.svg @@ -1,64 +1,64 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/hashtag.svg b/styles/z-bolt/images/hashtag.svg index 53390a9cc..e4d5e8079 100644 --- a/styles/z-bolt/images/hashtag.svg +++ b/styles/z-bolt/images/hashtag.svg @@ -1,65 +1,65 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/heat-up.svg b/styles/z-bolt/images/heat-up.svg index 657406184..b6ea0ddfb 100644 --- a/styles/z-bolt/images/heat-up.svg +++ b/styles/z-bolt/images/heat-up.svg @@ -1,80 +1,84 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/heater.svg b/styles/z-bolt/images/heater.svg new file mode 100644 index 000000000..224a2d2e5 --- /dev/null +++ b/styles/z-bolt/images/heater.svg @@ -0,0 +1,84 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/home-x.svg b/styles/z-bolt/images/home-x.svg index 6fcb94925..1fb79990f 100644 --- a/styles/z-bolt/images/home-x.svg +++ b/styles/z-bolt/images/home-x.svg @@ -1,79 +1,80 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/home-y.svg b/styles/z-bolt/images/home-y.svg index ca59d723c..fa4f8c427 100644 --- a/styles/z-bolt/images/home-y.svg +++ b/styles/z-bolt/images/home-y.svg @@ -1,83 +1,76 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/home-z.svg b/styles/z-bolt/images/home-z.svg index 988621cab..d679d86f4 100644 --- a/styles/z-bolt/images/home-z.svg +++ b/styles/z-bolt/images/home-z.svg @@ -1,79 +1,79 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/home.svg b/styles/z-bolt/images/home.svg index 24180a1a7..ef9887b36 100644 --- a/styles/z-bolt/images/home.svg +++ b/styles/z-bolt/images/home.svg @@ -1,79 +1,79 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/hourglass.svg b/styles/z-bolt/images/hourglass.svg index 7d800ffb5..d39c509b4 100644 --- a/styles/z-bolt/images/hourglass.svg +++ b/styles/z-bolt/images/hourglass.svg @@ -1,107 +1,107 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/increase.svg b/styles/z-bolt/images/increase.svg index 5242c59e8..df83e0b4c 100644 --- a/styles/z-bolt/images/increase.svg +++ b/styles/z-bolt/images/increase.svg @@ -1,71 +1,71 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/info.svg b/styles/z-bolt/images/info.svg index fa37c4f8b..31b856656 100644 --- a/styles/z-bolt/images/info.svg +++ b/styles/z-bolt/images/info.svg @@ -1,81 +1,81 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/klipper.svg b/styles/z-bolt/images/klipper.svg index 519d5239e..9a851e3e3 100644 --- a/styles/z-bolt/images/klipper.svg +++ b/styles/z-bolt/images/klipper.svg @@ -1,75 +1,75 @@ - - - - - - image/svg+xml - - - - - - - Slice 3 - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + + + + + + Slice 3 + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/klipper1.svg b/styles/z-bolt/images/klipper1.svg new file mode 100644 index 000000000..9a851e3e3 --- /dev/null +++ b/styles/z-bolt/images/klipper1.svg @@ -0,0 +1,75 @@ + + + + + + image/svg+xml + + + + + + + Slice 3 + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/klipper_1.svg b/styles/z-bolt/images/klipper_1.svg deleted file mode 100644 index 0effc94ec..000000000 --- a/styles/z-bolt/images/klipper_1.svg +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Z-BOLT - - diff --git a/styles/z-bolt/images/klipper_old.svg b/styles/z-bolt/images/klipper_old.svg index eef666cf2..be0e75f4f 100644 --- a/styles/z-bolt/images/klipper_old.svg +++ b/styles/z-bolt/images/klipper_old.svg @@ -1,161 +1,161 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/light.svg b/styles/z-bolt/images/light.svg new file mode 100644 index 000000000..e98149fc6 --- /dev/null +++ b/styles/z-bolt/images/light.svg @@ -0,0 +1,74 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/load.svg b/styles/z-bolt/images/load.svg index dffc1c412..4481f25ee 100644 --- a/styles/z-bolt/images/load.svg +++ b/styles/z-bolt/images/load.svg @@ -1,65 +1,72 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/main.svg b/styles/z-bolt/images/main.svg index eeb2cd48f..6d787637f 100644 --- a/styles/z-bolt/images/main.svg +++ b/styles/z-bolt/images/main.svg @@ -1,101 +1,101 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/motor-off.svg b/styles/z-bolt/images/motor-off.svg index 82cd41ba1..86a45d67e 100644 --- a/styles/z-bolt/images/motor-off.svg +++ b/styles/z-bolt/images/motor-off.svg @@ -1,103 +1,103 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + diff --git a/styles/z-bolt/images/move.svg b/styles/z-bolt/images/move.svg index 386c127b4..47535f2f8 100644 --- a/styles/z-bolt/images/move.svg +++ b/styles/z-bolt/images/move.svg @@ -1,86 +1,86 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + diff --git a/styles/z-bolt/images/network.svg b/styles/z-bolt/images/network.svg index 6dc3163bf..d79817be7 100644 --- a/styles/z-bolt/images/network.svg +++ b/styles/z-bolt/images/network.svg @@ -1,85 +1,85 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/pause.svg b/styles/z-bolt/images/pause.svg index c3fab2d04..b453c2da6 100644 --- a/styles/z-bolt/images/pause.svg +++ b/styles/z-bolt/images/pause.svg @@ -1,77 +1,77 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + diff --git a/styles/z-bolt/images/print.svg b/styles/z-bolt/images/print.svg index 014c69274..0785cf381 100644 --- a/styles/z-bolt/images/print.svg +++ b/styles/z-bolt/images/print.svg @@ -1,97 +1,97 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/refresh.svg b/styles/z-bolt/images/refresh.svg index 42d7056f2..2f5b46c45 100644 --- a/styles/z-bolt/images/refresh.svg +++ b/styles/z-bolt/images/refresh.svg @@ -1,107 +1,107 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/images/resume.svg b/styles/z-bolt/images/resume.svg index 465c35b21..ee070fd01 100644 --- a/styles/z-bolt/images/resume.svg +++ b/styles/z-bolt/images/resume.svg @@ -1,73 +1,73 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/retract.svg b/styles/z-bolt/images/retract.svg index f80643278..cd45082bc 100644 --- a/styles/z-bolt/images/retract.svg +++ b/styles/z-bolt/images/retract.svg @@ -1,101 +1,101 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + diff --git a/styles/z-bolt/images/sd.svg b/styles/z-bolt/images/sd.svg index 8fc2a3bd8..65d585598 100644 --- a/styles/z-bolt/images/sd.svg +++ b/styles/z-bolt/images/sd.svg @@ -1,101 +1,101 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/settings.svg b/styles/z-bolt/images/settings.svg index ef6247f02..f82a521f3 100644 --- a/styles/z-bolt/images/settings.svg +++ b/styles/z-bolt/images/settings.svg @@ -1,32 +1,85 @@ - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/shuffle.svg b/styles/z-bolt/images/shuffle.svg index 10f604f6f..1376441e5 100644 --- a/styles/z-bolt/images/shuffle.svg +++ b/styles/z-bolt/images/shuffle.svg @@ -1,64 +1,64 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/shutdown.svg b/styles/z-bolt/images/shutdown.svg index c6c6ba025..01533c000 100644 --- a/styles/z-bolt/images/shutdown.svg +++ b/styles/z-bolt/images/shutdown.svg @@ -1,85 +1,85 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/speed+.svg b/styles/z-bolt/images/speed+.svg index d58f41d88..a825908c6 100644 --- a/styles/z-bolt/images/speed+.svg +++ b/styles/z-bolt/images/speed+.svg @@ -1,122 +1,122 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/speed-.svg b/styles/z-bolt/images/speed-.svg index 3682ca870..fd9279b1a 100644 --- a/styles/z-bolt/images/speed-.svg +++ b/styles/z-bolt/images/speed-.svg @@ -1,122 +1,122 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/splash.png b/styles/z-bolt/images/splash.png deleted file mode 100644 index 76c5f8848..000000000 Binary files a/styles/z-bolt/images/splash.png and /dev/null differ diff --git a/styles/z-bolt/images/stop.svg b/styles/z-bolt/images/stop.svg index 9161e65e7..c46c631e6 100644 --- a/styles/z-bolt/images/stop.svg +++ b/styles/z-bolt/images/stop.svg @@ -1,72 +1,72 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/toolchanger.svg b/styles/z-bolt/images/toolchanger.svg index 4cc918570..747ea95f1 100644 --- a/styles/z-bolt/images/toolchanger.svg +++ b/styles/z-bolt/images/toolchanger.svg @@ -1,136 +1,136 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + + + + + + diff --git a/styles/z-bolt/images/warning.svg b/styles/z-bolt/images/warning.svg index 560168244..7003d7bd5 100644 --- a/styles/z-bolt/images/warning.svg +++ b/styles/z-bolt/images/warning.svg @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/styles/z-bolt/images/z-bolt.svg b/styles/z-bolt/images/z-bolt.svg deleted file mode 100644 index 0d59912f7..000000000 --- a/styles/z-bolt/images/z-bolt.svg +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/styles/z-bolt/images/z-closer.svg b/styles/z-bolt/images/z-closer.svg index 668a74064..51a84d408 100644 --- a/styles/z-bolt/images/z-closer.svg +++ b/styles/z-bolt/images/z-closer.svg @@ -1,135 +1,119 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + diff --git a/styles/z-bolt/images/z-farther.svg b/styles/z-bolt/images/z-farther.svg index 6156c6436..3d591c5a6 100644 --- a/styles/z-bolt/images/z-farther.svg +++ b/styles/z-bolt/images/z-farther.svg @@ -1,135 +1,119 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + + + + diff --git a/styles/z-bolt/images/z-tilt.svg b/styles/z-bolt/images/z-tilt.svg index 3a2ce88c2..d7711825e 100644 --- a/styles/z-bolt/images/z-tilt.svg +++ b/styles/z-bolt/images/z-tilt.svg @@ -1,104 +1,90 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - - - + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + diff --git a/styles/z-bolt/style.conf b/styles/z-bolt/style.conf new file mode 100644 index 000000000..afbd099a3 --- /dev/null +++ b/styles/z-bolt/style.conf @@ -0,0 +1,20 @@ +{ + "graph_colors": { + "extruder": { + "colors": ["ED6500", "ED8500", "EDA500", "EDC500", "EDF500"], + "state": 0 + }, + "bed": { + "colors": ["009384"], + "state": 0 + }, + "fan": { + "colors": ["A7E100", "7ECE21", "AAA920", "AC7140"], + "state": 0 + }, + "sensor": { + "colors": ["B10080", "7800B0", "AC4958", "B1A080", "B1C080"], + "state": 0 + } + } +} diff --git a/styles/z-bolt/style.css b/styles/z-bolt/style.css index ca8ed0722..fe225fa71 100644 --- a/styles/z-bolt/style.css +++ b/styles/z-bolt/style.css @@ -1,213 +1,208 @@ -* { - color: white; -} - -window { - background-color: #101418; -} - -button { - background-color: rgba(0,0,0,0); -} - -button:active { - background-color: #304C62; -} - -.button_active { - background-color: #20303D; -} - -button.color1 { - border-bottom-color: #ED6500; -} - -button.color2 { - border-bottom-color: #B10080; -} - -button.color3 { - border-bottom-color: #009384; -} - -button.color4 { - border-bottom-color: #A7E100; -} - -button.active { - background-color: #20303D; -} - -button.update { - background: #009384; - border-color: #009384; -} - -button.invalid { - background: #e61e1e; - border-color: #e61e1e; -} - -combobox box button { - border-color: #cccccc; -} - -switch { - background-color: #20292F; - border: 0; -} - -switch:checked { - background-color: #3584e4; -} - -entry { - background-color: #20292F; - border-color: #13181C; -} - -frame { - border-bottom-color: #444; -} - -label { - color: white; -} - -menu { - background-color: #13181C; - border-color: #cccccc; -} - -menuitem { - background-color: #13181C; - border-color: #cccccc; -} - -trough { - background-color: #404E57; - color: white; - border-color: black; -} - -trough highlight, trough progress { - background-color: #3584e4; - color: white; - border-color: black; -} - -scale-mark { - color: white; -} - -scrollbar, scrollbar button, scrollbar trough { - background-color: #13181C; -} - -scrollbar slider { - background-color: #404E57; -} - -textview .time { - color: grey; -} - -.popup { - background-color: black; -} - -.dialog { - border: #13181C; - background-color: #13181C; -} - -.dialog button { - border-bottom-color: #009384; -} - -.dialog button:nth-child(1) { - border-bottom-color: #A7E100; -} - -.dialog button:nth-child(2) { - border-bottom-color: #cc1e1e; -} - -.distbutton_active { - background-color: #20303D; -} - -.distbutton_top { - border-color: white; -} - -.distbutton { - border-color: white; - border-left-color: #ccc; -} - -.distbutton_bottom { - border-color: white; - border-left-color: #ccc; -} - -.fan_slider { - color: white; -} - -.message_popup { - background-color: #367554; - border-bottom-color: white; -} - -.message_popup button { - background-color: #367554; -} - -.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { - border-color: white; -} - -.printing-status { - color: #f0f0f0; -} - -.printing-progress-bar { - color: #00C9B4; -} - -.printing-progress-text { - color: white; -} - -.printing-status-label { - color: #ccc; -} - -.tempbutton_top { - border-color: white; -} - -.tempbutton, .tempbutton_bottom { - border-color: white; - border-top-color: #ccc; -} - -.message { - border-color: #981E1F; - color: white; - background-color: #981E1F; -} - -.message button { - background-color: white; - color: black; -} - -.warning { - background-color: rgba(30, 204, 39, 0.7); -} - -.error { - background-color: rgba(204, 30, 30, 0.7); -} +* { + color: white; +} + +window { + background-color: #13181C; +} + +button { + background-color: #13181C; +} + +button:active { + background-color: #304C62; +} + +.button_active { + background-color: #20303D; + border-radius: 1em; +} + +button.color1 { + border-bottom-color: #ED6500; +} + +button.color2 { + border-bottom-color: #B10080; +} + +button.color3 { + border-bottom-color: #009384; +} + +button.color4 { + border-bottom-color: #A7E100; +} + +button.active { + background-color: #20303D; +} + +button.update { + background: #009384; + border-color: #009384; +} + +button.invalid { + background: #e61e1e; + border-color: #e61e1e; +} + +combobox box button { + border-color: #cccccc; +} + +switch { + background-color: #20292F; +} + +switch:checked { + background-color: #3584e4; +} + +entry { + background-color: #20292F; + border-color: #13181C; +} + +frame { + border-bottom-color: #444; +} + +label { + color: white; +} + +menu { + background-color: #13181C; + border-color: #cccccc; +} + +menuitem { + background-color: #13181C; + border-color: #cccccc; +} + +trough { + background-color: #404E57; + color: white; + border-color: black; +} + +trough highlight, trough progress { + background-color: #3584e4; + color: white; + border-color: black; +} + +scale-mark { + color: white; +} + +scrollbar, scrollbar button, scrollbar trough { + background-color: #13181C; +} + +scrollbar slider { + background-color: #404E57; +} + +textview .time { + color: grey; +} + +.popup { + background-color: black; +} + +.dialog { + border: #13181C; + background-color: #13181C; +} + +.dialog button { + border-bottom-color: #009384; +} + +.dialog button:nth-child(1) { + border-bottom-color: #A7E100; +} + +.dialog button:nth-child(2) { + border-bottom-color: #cc1e1e; +} + +.distbutton_active { + background-color: #20303D; +} + +.distbutton_top { + border-color: white; +} + +.distbutton { + border-color: white; + border-left-color: #ccc; +} + +.distbutton_bottom { + border-color: white; + border-left-color: #ccc; +} + +.fan_slider { + color: white; +} + +.message_popup { + border-bottom-color: white; +} + +.numpad_tleft, .numpad_top, .numpad_tright, .numpad_left, .numpad_button, .numpad_right, .numpad_bleft, .numpad_bottom, .numpad_bright { + border-color: white; +} + +.printing-status { + color: #f0f0f0; +} + +.printing-progress-bar { + color: #00C9B4; +} + +.printing-progress-text { + color: white; +} + +.printing-status-label { + color: #ccc; +} + +.tempbutton_top { + border-color: white; +} + +.tempbutton, .tempbutton_bottom { + border-color: white; + border-top-color: #ccc; +} + +.message { + border-color: #981E1F; + color: white; + background-color: #981E1F; +} + +.message button { + background-color: white; + color: black; +} + +.warning { + background-color: rgba(30, 204, 39, 0.7); +} + +.error { + background-color: rgba(204, 30, 30, 0.7); +}