Merge branch 'master' into container_stack_improvements

This commit is contained in:
ChrisTerBeke 2017-11-10 14:35:13 +01:00
commit 88cf40e2d7
19 changed files with 496 additions and 41 deletions

View file

@ -567,6 +567,7 @@ class CuraApplication(QtApplication):
super().addCommandLineOptions(parser)
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
parser.add_argument("--single-instance", action="store_true", default=False)
parser.add_argument("--headless", action = "store_true", default=False)
# Set up a local socket server which listener which coordinates single instances Curas and accepts commands.
def _setUpSingleInstanceServer(self):
@ -712,9 +713,12 @@ class CuraApplication(QtApplication):
self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles))
self.initializeEngine()
if self._engine.rootObjects:
run_headless = self.getCommandLineOption("headless", False)
if not run_headless:
self.initializeEngine()
if run_headless or self._engine.rootObjects:
self.closeSplash()
for file in self.getCommandLineOption("file", []):
@ -1266,6 +1270,9 @@ class CuraApplication(QtApplication):
# see GroupDecorator._onChildrenChanged
def _createSplashScreen(self):
run_headless = self.getCommandLineOption("headless", False)
if run_headless:
return None
return CuraSplashScreen.CuraSplashScreen()
def _onActiveMachineChanged(self):

57
cura/PreviewPass.py Normal file
View file

@ -0,0 +1,57 @@
# Copyright (c) 2017 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.
from UM.Application import Application
from UM.Resources import Resources
from UM.View.RenderPass import RenderPass
from UM.View.GL.OpenGL import OpenGL
from UM.View.RenderBatch import RenderBatch
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from typing import Optional
MYPY = False
if MYPY:
from UM.Scene.Camera import Camera
## A render pass subclass that renders slicable objects with default parameters.
# It uses the active camera by default, but it can be overridden to use a different camera.
#
# This is useful to get a preview image of a scene taken from a different location as the active camera.
class PreviewPass(RenderPass):
def __init__(self, width: int, height: int):
super().__init__("preview", width, height, 0)
self._camera = None # type: Optional[Camera]
self._renderer = Application.getInstance().getRenderer()
self._shader = None
self._scene = Application.getInstance().getController().getScene()
# Set the camera to be used by this render pass
# if it's None, the active camera is used
def setCamera(self, camera: Optional["Camera"]):
self._camera = camera
def render(self) -> None:
if not self._shader:
self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "object.shader"))
# Create a new batch to be rendered
batch = RenderBatch(self._shader)
# Fill up the batch with objects that can be sliced. `
for node in DepthFirstIterator(self._scene.getRoot()):
if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible():
batch.addItem(node.getWorldTransformation(), node.getMeshData())
self.bind()
if self._camera is None:
batch.render(Application.getInstance().getController().getScene().getActiveCamera())
else:
batch.render(self._camera)
self.release()

View file

@ -1,6 +1,9 @@
# Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from UM.Extension import Extension
from UM.Preferences import Preferences
from UM.Logger import Logger
@ -32,6 +35,17 @@ class FirmwareUpdateChecker(Extension):
if Preferences.getInstance().getValue("info/automatic_update_check"):
ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded)
self._download_url = None
## Callback for the message that is spawned when there is a new version.
def _onActionTriggered(self, message, action):
if action == "download":
if self._download_url is not None:
QDesktopServices.openUrl(QUrl(self._download_url))
def _onSetDownloadUrl(self, download_url):
self._download_url = download_url
def _onContainerAdded(self, container):
# Only take care when a new GlobalStack was added
if isinstance(container, GlobalStack):
@ -45,5 +59,7 @@ class FirmwareUpdateChecker(Extension):
# \param silent type(boolean) Suppresses messages other than "new version found" messages.
# This is used when checking for a new firmware version at startup.
def checkFirmwareVersion(self, container = None, silent = False):
job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.JEDI_VERSION_URL)
job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.JEDI_VERSION_URL,
callback = self._onActionTriggered,
set_download_url_callback = self._onSetDownloadUrl)
job.start()

View file

@ -10,30 +10,21 @@ from UM.Job import Job
import urllib.request
import codecs
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog("cura")
## This job checks if there is an update available on the provided URL.
class FirmwareUpdateCheckerJob(Job):
def __init__(self, container = None, silent = False, url = None):
def __init__(self, container = None, silent = False, url = None, callback = None, set_download_url_callback = None):
super().__init__()
self._container = container
self.silent = silent
self._url = url
self._download_url = None # If an update was found, the download_url will be set to the location of the new version.
## Callback for the message that is spawned when there is a new version.
def actionTriggered(self, message, action):
if action == "download":
if self._download_url is not None:
QDesktopServices.openUrl(QUrl(self._download_url))
self._callback = callback
self._set_download_url_callback = set_download_url_callback
def run(self):
self._download_url = None # Reset download ur.
if not self._url:
Logger.log("e", "Can not check for a new release. URL not set!")
return
@ -70,13 +61,14 @@ class FirmwareUpdateCheckerJob(Job):
# notify the user when no new firmware version is available.
if (checked_version != "") and (checked_version != current_version):
Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE")
message = Message(i18n_catalog.i18nc("@info Don't translate {machine_name}, since it gets replaced by a printer name!", "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB.").format(machine_name = machine_name),
message = Message(i18n_catalog.i18nc("@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format(machine_name = machine_name),
title = i18n_catalog.i18nc("@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name)
message.addAction("download", i18n_catalog.i18nc("@action:button", "Download"), "[no_icon]", "[no_description]")
message.addAction("download", i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]")
# If we do this in a cool way, the download url should be available in the JSON file
self._download_url = "https://ultimaker.com/en/resources/20500-upgrade-firmware"
message.actionTriggered.connect(self.actionTriggered)
if self._set_download_url_callback:
self._set_download_url_callback("https://ultimaker.com/en/resources/20500-upgrade-firmware")
message.actionTriggered.connect(self._callback)
message.show()
except Exception as e:

View file

@ -276,12 +276,8 @@ Cura.MachineAction
width: parent.width
wrapMode: Text.WordWrap
text:{
if (base.selectedPrinter == undefined)
{
return "";
}
// The property cluster size does not exist for older UM3 devices.
if(base.selectedPrinter != undefined && base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)
if(!base.selectedPrinter || base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)
{
return "";
}

View file

@ -0,0 +1,66 @@
{
"id": "deltacomb",
"version": 2,
"name": "Deltacomb 3D",
"inherits": "fdmprinter",
"metadata": {
"author": "Gabriele Rossetti",
"visible": true,
"manufacturer": "Deltacomb 3D",
"category": "Other",
"file_formats": "text/x-gcode",
"icon": "icon_ultimaker2",
"platform": "deltacomb.stl",
"has_machine_quality": true
},
"overrides": {
"machine_heated_bed": { "default_value": false },
"machine_width": { "default_value": 190 },
"machine_height": { "default_value": 250 },
"machine_depth": { "default_value": 190 },
"machine_center_is_zero": { "default_value": true },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."},
"machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" },
"machine_shape": { "default_value": "elliptic" },
"machine_max_feedrate_x": { "default_value": 250 },
"machine_max_feedrate_y": { "default_value": 250 },
"machine_max_feedrate_z": { "default_value": 15 },
"machine_max_acceleration_x": { "default_value": 10000 },
"machine_max_acceleration_y": { "default_value": 10000 },
"machine_max_acceleration_z": { "default_value": 50 },
"machine_max_acceleration_e": { "default_value": 100 },
"machine_acceleration": { "default_value": 4000 },
"machine_max_jerk_xy": { "default_value": 25.0 },
"machine_max_jerk_z": { "default_value": 0.4 },
"machine_max_jerk_e": { "default_value": 1.0 },
"retraction_hop_enabled": { "default_value": false },
"retraction_amount" : { "default_value": 4.5 },
"retraction_speed" : { "default_value": 40 },
"material_diameter": { "default_value": 1.75 },
"material_final_print_temperature": { "value": "material_print_temperature - 5" },
"material_initial_print_temperature": { "value": "material_print_temperature" },
"material_print_temperature_layer_0": { "value": "material_print_temperature + 5" },
"travel_avoid_distance": { "default_value": 1, "value": 1 },
"speed_print" : { "default_value": 70 },
"speed_travel": { "default_value": 80, "value": 80 },
"speed_infill": { "value": "round(speed_print * 1.05, 0)" },
"speed_topbottom": { "value": "round(speed_print * 0.95, 0)" },
"speed_wall": { "value": "speed_print" },
"speed_wall_0": { "value": "round(speed_print * 0.9, 0)" },
"speed_wall_x": { "value": "speed_wall" },
"speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" },
"speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" },
"skirt_brim_speed": { "value": "speed_layer_0" },
"skirt_line_count": { "default_value": 3 },
"skirt_brim_minimal_length": { "default_value": 150 },
"infill_sparse_density": { "default_value": 24 },
"top_bottom_thickness": { "default_value": 0.6 },
"support_z_distance": { "default_value": 0.2, "value": "min(2 * layer_height, machine_nozzle_size * 0.75)" },
"infill_before_walls" : { "default_value": false },
"support_use_towers" : { "default_value": false }
}
}

View file

@ -1394,7 +1394,7 @@
"infill_pattern":
{
"label": "Infill Pattern",
"description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.",
"description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.",
"type": "enum",
"options":
{

View file

@ -10,6 +10,9 @@
"author": "Velleman"
},
"overrides": {
"material_diameter": {
"default_value": 1.75
},
"machine_width": {
"default_value": 200
},
@ -40,7 +43,7 @@
"machine_head_shape_max_y": {
"default_value": 0
},
"machine_nozzle_gantry_distance": {
"gantry_height": {
"default_value": 0
},
"machine_nozzle_offset_x_1": {

Binary file not shown.

View file

@ -0,0 +1,25 @@
[general]
version = 2
definition = deltacomb
name = Fast Quality (beta)
[metadata]
type = quality
setting_version = 4
material = generic_abs_175
quality_type = fast
weight = -1
[values]
adhesion_type = raft
layer_height = 0.2
layer_height_0 = 0.2
cool_fan_enabled = True
cool_fan_full_at_height = 0.4
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
cool_min_layer_time = 3
cool_min_speed = 20
material_bed_temperature = 80

View file

@ -0,0 +1,25 @@
[general]
version = 2
definition = deltacomb
name = High Quality (beta)
[metadata]
type = quality
setting_version = 4
material = generic_abs_175
quality_type = high
weight = 1
[values]
adhesion_type = raft
layer_height = 0.1
layer_height_0 = 0.1
cool_fan_enabled = True
cool_fan_full_at_height = 0.2
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
cool_min_layer_time = 3
cool_min_speed = 20
material_bed_temperature = 80

View file

@ -0,0 +1,24 @@
[general]
version = 2
definition = deltacomb
name = Normal Quality (beta)
[metadata]
type = quality
setting_version = 4
material = generic_abs_175
quality_type = normal
weight = 0
[values]
adhesion_type = raft
layer_height = 0.15
layer_height_0 = 0.15
cool_fan_enabled = True
cool_fan_full_at_height = 0.3
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
cool_min_layer_time = 3
cool_min_speed = 20
material_bed_temperature = 80

View file

@ -0,0 +1,57 @@
[general]
version = 2
name = Fast Quality (beta)
definition = deltacomb
[metadata]
type = quality
material = generic_nylon_175
quality_type = fast
weight = -1
setting_version = 4
[values]
adhesion_type = raft
brim_width = 4
cool_fan_enabled = False
cool_fan_full_at_height = 0.45
cool_fan_speed = 0
cool_fan_speed_max = 0
cool_fan_speed_min = 0
cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.20
layer_height_0 = 0.15
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22
raft_base_line_width= =line_width * 2
raft_base_thickness = =layer_height_0 * 2
raft_interface_line_width = =line_width
raft_interface_thickness = =layer_height
raft_margin = 5
raft_surface_layers = 2
raft_surface_line_width = =line_width
raft_surface_thickness = =layer_height
retraction_hop = 0.5
retraction_hop_enabled = False
retraction_hop_only_when_collides = True
skin_overlap = 10
skirt_brim_minimal_length = 75
skirt_gap = 1.5
skirt_line_count = 5
speed_infill = =speed_print
speed_layer_0 = 25
speed_print = 50
speed_topbottom = 40
speed_travel = 200
speed_wall_0 = 40
speed_wall_x = =speed_print
support_angle = 70
support_type = buildplate
support_z_distance = 0.15
top_bottom_thickness = 0.8
wall_thickness = 0.8
z_seam_type = random

View file

@ -0,0 +1,57 @@
[general]
version = 2
name = High Quality (beta)
definition = deltacomb
[metadata]
type = quality
material = generic_nylon_175
quality_type = high
weight = 1
setting_version = 4
[values]
adhesion_type = raft
brim_width = 4
cool_fan_enabled = False
cool_fan_full_at_height = 0.45
cool_fan_speed = 0
cool_fan_speed_max = 0
cool_fan_speed_min = 0
cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.10
layer_height_0 = 0.10
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22
raft_base_line_width= =line_width * 2
raft_base_thickness = =layer_height_0 * 2
raft_interface_line_width = =line_width
raft_interface_thickness = =layer_height
raft_margin = 5
raft_surface_layers = 2
raft_surface_line_width = =line_width
raft_surface_thickness = =layer_height
retraction_hop = 0.5
retraction_hop_enabled = False
retraction_hop_only_when_collides = True
skin_overlap = 10
skirt_brim_minimal_length = 75
skirt_gap = 1.5
skirt_line_count = 5
speed_infill = =speed_print
speed_layer_0 = 25
speed_print = 50
speed_topbottom = 40
speed_travel = 200
speed_wall_0 = 40
speed_wall_x = =speed_print
support_angle = 70
support_type = buildplate
support_z_distance = 0.15
top_bottom_thickness = 0.8
wall_thickness = 0.8
z_seam_type = random

View file

@ -0,0 +1,58 @@
[general]
version = 2
name = Normal Quality (beta)
definition = deltacomb
[metadata]
type = quality
material = generic_nylon_175
quality_type = normal
weight = 0
setting_version = 4
[values]
adhesion_type = raft
brim_width = 4
cool_fan_enabled = False
cool_fan_full_at_height = 0.45
cool_fan_speed = 0
cool_fan_speed_max = 0
cool_fan_speed_min = 0
cool_min_layer_time = 5
cool_min_speed = 0
infill_overlap = 15
infill_sparse_density = 24
layer_height = 0.15
layer_height_0 = 0.10
line_width = =machine_nozzle_size
material_flow = 100
raft_airgap = 0.22
raft_base_line_width= =line_width * 2
raft_base_thickness = =layer_height_0 * 2
raft_interface_line_width = =line_width
raft_interface_thickness = =layer_height
raft_margin = 5
raft_surface_layers = 2
raft_surface_line_width = =line_width
raft_surface_thickness = =layer_height
retraction_hop = 0.5
retraction_hop_enabled = False
retraction_hop_only_when_collides = True
skin_overlap = 10
skirt_brim_minimal_length = 75
skirt_gap = 1.5
skirt_line_count = 5
speed_infill = =speed_print
speed_layer_0 = 25
speed_print = 50
speed_topbottom = 40
speed_travel = 200
speed_wall_0 = 40
speed_wall_x = =speed_print
support_angle = 70
support_type = buildplate
support_z_distance = 0.15
top_bottom_thickness = 0.8
wall_thickness = 0.8
z_seam_type = random

View file

@ -0,0 +1,24 @@
[general]
version = 2
definition = deltacomb
name = Fast Quality
[metadata]
type = quality
setting_version = 4
material = generic_pla_175
quality_type = fast
weight = -1
[values]
adhesion_type = skirt
layer_height = 0.2
layer_height_0 = 0.2
cool_fan_enabled = True
cool_fan_full_at_height = 0.4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
cool_min_layer_time = 5
cool_min_speed = 20

View file

@ -0,0 +1,25 @@
[general]
version = 2
definition = deltacomb
name = High Quality
[metadata]
type = quality
setting_version = 4
material = generic_pla_175
quality_type = high
weight = 1
[values]
adhesion_type = skirt
layer_height = 0.1
layer_height_0 = 0.1
cool_fan_enabled = True
cool_fan_full_at_height = 0.2
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
cool_min_layer_time = 5
cool_min_speed = 20
material_print_temperature_layer_0 = =default_material_print_temperature + 5

View file

@ -0,0 +1,23 @@
[general]
version = 2
definition = deltacomb
name = Normal Quality
[metadata]
type = quality
setting_version = 4
material = generic_pla_175
quality_type = normal
weight = 0
[values]
adhesion_type = skirt
layer_height = 0.15
layer_height_0 = 0.15
cool_fan_enabled = True
cool_fan_full_at_height = 0.3
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
cool_min_layer_time = 5
cool_min_speed = 20

View file

@ -78,13 +78,13 @@
"text_pressed": [12, 169, 227, 255],
"text_subtext": [0, 0, 0, 255],
"text_emphasis": [255, 255, 255, 255],
"text_scene": [24, 41, 77, 255],
"text_scene": [31, 36, 39, 255],
"text_scene_hover": [70, 84, 113, 255],
"error": [255, 140, 0, 255],
"sidebar_header_bar": [31, 36, 39, 255],
"sidebar_header_active": [68, 72, 75, 255],
"sidebar_header_hover": [68, 72, 75, 255],
"sidebar_header_active": [31, 36, 39, 255],
"sidebar_header_hover": [31, 36, 39, 255],
"sidebar_header_highlight": [68, 192, 255, 255],
"sidebar_header_highlight_hover": [68, 192, 255, 255],
"sidebar_header_text_inactive": [255, 255, 255, 255],
@ -100,7 +100,7 @@
"button_text_hover": [255, 255, 255, 255],
"button_text_active": [255, 255, 255, 255],
"button_text_active_hover": [255, 255, 255, 255],
"button_disabled": [24, 41, 77, 255],
"button_disabled": [31, 36, 39, 255],
"button_disabled_text": [255, 255, 255, 101],
"button_tooltip": [31, 36, 39, 255],
@ -116,7 +116,7 @@
"action_button_text": [0, 0, 0, 255],
"action_button_border": [127, 127, 127, 255],
"action_button_hovered": [255, 255, 255, 255],
"action_button_hovered_text": [24, 41, 77, 255],
"action_button_hovered_text": [31, 36, 39, 255],
"action_button_hovered_border": [12, 169, 227, 255],
"action_button_active": [255, 255, 255, 255],
"action_button_active_text": [0, 0, 0, 255],
@ -134,7 +134,7 @@
"print_button_ready_pressed_border": [30, 186, 245, 243],
"scrollbar_background": [255, 255, 255, 255],
"scrollbar_handle": [24, 41, 77, 255],
"scrollbar_handle": [31, 36, 39, 255],
"scrollbar_handle_hover": [12, 159, 227, 255],
"scrollbar_handle_down": [12, 159, 227, 255],
@ -143,11 +143,11 @@
"setting_category_hover": [245, 245, 245, 255],
"setting_category_active": [245, 245, 245, 255],
"setting_category_active_hover": [245, 245, 245, 255],
"setting_category_text": [24, 41, 77, 255],
"setting_category_text": [31, 36, 39, 255],
"setting_category_disabled_text": [24, 41, 77, 101],
"setting_category_hover_text": [24, 41, 77, 255],
"setting_category_active_text": [24, 41, 77, 255],
"setting_category_active_hover_text": [24, 41, 77, 255],
"setting_category_hover_text": [31, 36, 39, 255],
"setting_category_active_text": [31, 36, 39, 255],
"setting_category_active_hover_text": [31, 36, 39, 255],
"setting_category_border": [245, 245, 245, 255],
"setting_category_disabled_border": [245, 245, 245, 255],
"setting_category_hover_border": [12, 159, 227, 255],
@ -155,7 +155,7 @@
"setting_category_active_hover_border": [12, 159, 227, 255],
"setting_control": [255, 255, 255, 255],
"setting_control_selected": [24, 41, 77, 255],
"setting_control_selected": [31, 36, 39, 255],
"setting_control_highlight": [255, 255, 255, 255],
"setting_control_border": [127, 127, 127, 255],
"setting_control_border_highlight": [12, 169, 227, 255],
@ -176,7 +176,7 @@
"material_compatibility_warning": [0, 0, 0, 255],
"progressbar_background": [245, 245, 245, 255],
"progressbar_control": [24, 41, 77, 255],
"progressbar_control": [31, 36, 39, 255],
"slider_groove": [245, 245, 245, 255],
"slider_groove_border": [127, 127, 127, 255],
@ -203,9 +203,9 @@
"mode_switch_hover": [255, 255, 255, 255],
"mode_switch_border": [127, 127, 127, 255],
"mode_switch_border_hover": [12, 169, 227, 255],
"mode_switch_handle": [24, 41, 77, 255],
"mode_switch_text": [24, 41, 77, 255],
"mode_switch_text_hover": [24, 41, 77, 255],
"mode_switch_handle": [31, 36, 39, 255],
"mode_switch_text": [31, 36, 39, 255],
"mode_switch_text_hover": [31, 36, 39, 255],
"mode_switch_text_checked": [12, 169, 227, 255],
"tooltip": [68, 192, 255, 255],