diff --git a/resources/ui/carla_settings.ui b/resources/ui/carla_settings.ui
index d30cd91ed..169e8cf13 100644
--- a/resources/ui/carla_settings.ui
+++ b/resources/ui/carla_settings.ui
@@ -587,6 +587,13 @@
+ -
+
+
+ Auto-select items on hover
+
+
+
-
@@ -1410,7 +1417,7 @@ This mode is not available for VST plugins.
-
+
diff --git a/source/carla_host.py b/source/carla_host.py
index eeb0477b5..27063ffc7 100644
--- a/source/carla_host.py
+++ b/source/carla_host.py
@@ -861,11 +861,12 @@ class HostWindow(QMainWindow):
def setupCanvas(self):
pOptions = patchcanvas.options_t()
- pOptions.theme_name = self.fSavedSettings[CARLA_KEY_CANVAS_THEME]
- pOptions.auto_hide_groups = self.fSavedSettings[CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS]
- pOptions.use_bezier_lines = self.fSavedSettings[CARLA_KEY_CANVAS_USE_BEZIER_LINES]
- pOptions.antialiasing = self.fSavedSettings[CARLA_KEY_CANVAS_ANTIALIASING]
- pOptions.eyecandy = self.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY]
+ pOptions.theme_name = self.fSavedSettings[CARLA_KEY_CANVAS_THEME]
+ pOptions.auto_hide_groups = self.fSavedSettings[CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS]
+ pOptions.auto_select_items = self.fSavedSettings[CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS]
+ pOptions.use_bezier_lines = self.fSavedSettings[CARLA_KEY_CANVAS_USE_BEZIER_LINES]
+ pOptions.antialiasing = self.fSavedSettings[CARLA_KEY_CANVAS_ANTIALIASING]
+ pOptions.eyecandy = self.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY]
pFeatures = patchcanvas.features_t()
pFeatures.group_info = False
@@ -1272,19 +1273,20 @@ class HostWindow(QMainWindow):
# TODO - complete this
self.fSavedSettings = {
- CARLA_KEY_MAIN_PROJECT_FOLDER: settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, type=str),
- CARLA_KEY_MAIN_REFRESH_INTERVAL: settings.value(CARLA_KEY_MAIN_REFRESH_INTERVAL, CARLA_DEFAULT_MAIN_REFRESH_INTERVAL, type=int),
- CARLA_KEY_MAIN_USE_CUSTOM_SKINS: settings.value(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS, type=bool),
- CARLA_KEY_CANVAS_THEME: settings.value(CARLA_KEY_CANVAS_THEME, CARLA_DEFAULT_CANVAS_THEME, type=str),
- CARLA_KEY_CANVAS_SIZE: settings.value(CARLA_KEY_CANVAS_SIZE, CARLA_DEFAULT_CANVAS_SIZE, type=str),
- CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS: settings.value(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS, type=bool),
- CARLA_KEY_CANVAS_USE_BEZIER_LINES: settings.value(CARLA_KEY_CANVAS_USE_BEZIER_LINES, CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES, type=bool),
- CARLA_KEY_CANVAS_EYE_CANDY: settings.value(CARLA_KEY_CANVAS_EYE_CANDY, CARLA_DEFAULT_CANVAS_EYE_CANDY, type=int),
- CARLA_KEY_CANVAS_USE_OPENGL: settings.value(CARLA_KEY_CANVAS_USE_OPENGL, CARLA_DEFAULT_CANVAS_USE_OPENGL, type=bool),
- CARLA_KEY_CANVAS_ANTIALIASING: settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, type=int),
- CARLA_KEY_CANVAS_HQ_ANTIALIASING: settings.value(CARLA_KEY_CANVAS_HQ_ANTIALIASING, CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING, type=bool),
- CARLA_KEY_CUSTOM_PAINTING: (settings.value(CARLA_KEY_MAIN_USE_PRO_THEME, True, type=bool) and
- settings.value(CARLA_KEY_MAIN_PRO_THEME_COLOR, "Black", type=str).lower() == "black")
+ CARLA_KEY_MAIN_PROJECT_FOLDER: settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, type=str),
+ CARLA_KEY_MAIN_REFRESH_INTERVAL: settings.value(CARLA_KEY_MAIN_REFRESH_INTERVAL, CARLA_DEFAULT_MAIN_REFRESH_INTERVAL, type=int),
+ CARLA_KEY_MAIN_USE_CUSTOM_SKINS: settings.value(CARLA_KEY_MAIN_USE_CUSTOM_SKINS, CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS, type=bool),
+ CARLA_KEY_CANVAS_THEME: settings.value(CARLA_KEY_CANVAS_THEME, CARLA_DEFAULT_CANVAS_THEME, type=str),
+ CARLA_KEY_CANVAS_SIZE: settings.value(CARLA_KEY_CANVAS_SIZE, CARLA_DEFAULT_CANVAS_SIZE, type=str),
+ CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS: settings.value(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS, type=bool),
+ CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS: settings.value(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS, type=bool),
+ CARLA_KEY_CANVAS_USE_BEZIER_LINES: settings.value(CARLA_KEY_CANVAS_USE_BEZIER_LINES, CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES, type=bool),
+ CARLA_KEY_CANVAS_EYE_CANDY: settings.value(CARLA_KEY_CANVAS_EYE_CANDY, CARLA_DEFAULT_CANVAS_EYE_CANDY, type=int),
+ CARLA_KEY_CANVAS_USE_OPENGL: settings.value(CARLA_KEY_CANVAS_USE_OPENGL, CARLA_DEFAULT_CANVAS_USE_OPENGL, type=bool),
+ CARLA_KEY_CANVAS_ANTIALIASING: settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, type=int),
+ CARLA_KEY_CANVAS_HQ_ANTIALIASING : settings.value(CARLA_KEY_CANVAS_HQ_ANTIALIASING, CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING, type=bool),
+ CARLA_KEY_CUSTOM_PAINTING: (settings.value(CARLA_KEY_MAIN_USE_PRO_THEME, True, type=bool) and
+ settings.value(CARLA_KEY_MAIN_PRO_THEME_COLOR, "Black", type=str).lower() == "black")
}
self.fMiniCanvasUpdateTimeout = 1000 if self.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY] == patchcanvas.EYECANDY_FULL else 0
diff --git a/source/carla_settings.py b/source/carla_settings.py
index 6ed2f5cda..cd03a3d7b 100755
--- a/source/carla_settings.py
+++ b/source/carla_settings.py
@@ -320,6 +320,7 @@ class CarlaSettingsW(QDialog):
self.ui.cb_canvas_size.setCurrentIndex(self.ui.cb_canvas_size.findText(settings.value(CARLA_KEY_CANVAS_SIZE, CARLA_DEFAULT_CANVAS_SIZE, type=str)))
self.ui.cb_canvas_bezier_lines.setChecked(settings.value(CARLA_KEY_CANVAS_USE_BEZIER_LINES, CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES, type=bool))
self.ui.cb_canvas_hide_groups.setChecked(settings.value(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS, type=bool))
+ self.ui.cb_canvas_auto_select.setChecked(settings.value(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS, type=bool))
self.ui.cb_canvas_eyecandy.setCheckState(settings.value(CARLA_KEY_CANVAS_EYE_CANDY, CARLA_DEFAULT_CANVAS_EYE_CANDY, type=int))
self.ui.cb_canvas_use_opengl.setChecked(settings.value(CARLA_KEY_CANVAS_USE_OPENGL, CARLA_DEFAULT_CANVAS_USE_OPENGL, type=bool) and self.ui.cb_canvas_use_opengl.isEnabled())
self.ui.cb_canvas_render_aa.setCheckState(settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, type=int))
@@ -439,14 +440,15 @@ class CarlaSettingsW(QDialog):
# ----------------------------------------------------------------------------------------------------
# Canvas
- settings.setValue(CARLA_KEY_CANVAS_THEME, self.ui.cb_canvas_theme.currentText())
- settings.setValue(CARLA_KEY_CANVAS_SIZE, self.ui.cb_canvas_size.currentText())
- settings.setValue(CARLA_KEY_CANVAS_USE_BEZIER_LINES, self.ui.cb_canvas_bezier_lines.isChecked())
- settings.setValue(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, self.ui.cb_canvas_hide_groups.isChecked())
- settings.setValue(CARLA_KEY_CANVAS_EYE_CANDY, self.ui.cb_canvas_eyecandy.checkState()) # 0, 1, 2 match their enum variants
- settings.setValue(CARLA_KEY_CANVAS_USE_OPENGL, self.ui.cb_canvas_use_opengl.isChecked())
- settings.setValue(CARLA_KEY_CANVAS_HQ_ANTIALIASING, self.ui.cb_canvas_render_hq_aa.isChecked())
- settings.setValue(CARLA_KEY_CANVAS_ANTIALIASING, self.ui.cb_canvas_render_aa.checkState()) # 0, 1, 2 match their enum variants
+ settings.setValue(CARLA_KEY_CANVAS_THEME, self.ui.cb_canvas_theme.currentText())
+ settings.setValue(CARLA_KEY_CANVAS_SIZE, self.ui.cb_canvas_size.currentText())
+ settings.setValue(CARLA_KEY_CANVAS_USE_BEZIER_LINES, self.ui.cb_canvas_bezier_lines.isChecked())
+ settings.setValue(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, self.ui.cb_canvas_hide_groups.isChecked())
+ settings.setValue(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, self.ui.cb_canvas_auto_select.isChecked())
+ settings.setValue(CARLA_KEY_CANVAS_EYE_CANDY, self.ui.cb_canvas_eyecandy.checkState()) # 0, 1, 2 match their enum variants
+ settings.setValue(CARLA_KEY_CANVAS_USE_OPENGL, self.ui.cb_canvas_use_opengl.isChecked())
+ settings.setValue(CARLA_KEY_CANVAS_HQ_ANTIALIASING, self.ui.cb_canvas_render_hq_aa.isChecked())
+ settings.setValue(CARLA_KEY_CANVAS_ANTIALIASING, self.ui.cb_canvas_render_aa.checkState()) # 0, 1, 2 match their enum variants
# ----------------------------------------------------------------------------------------------------
# Engine
@@ -567,6 +569,7 @@ class CarlaSettingsW(QDialog):
self.ui.cb_canvas_size.setCurrentIndex(self.ui.cb_canvas_size.findText(CARLA_DEFAULT_CANVAS_SIZE))
self.ui.cb_canvas_bezier_lines.setChecked(CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES)
self.ui.cb_canvas_hide_groups.setChecked(CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS)
+ self.ui.cb_canvas_auto_select.setChecked(CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS)
self.ui.cb_canvas_eyecandy.setCheckState(Qt.PartiallyChecked) # CARLA_DEFAULT_CANVAS_EYE_CANDY
self.ui.cb_canvas_use_opengl.setChecked(CARLA_DEFAULT_CANVAS_USE_OPENGL and self.ui.cb_canvas_use_opengl.isEnabled())
self.ui.cb_canvas_render_aa.setCheckState(Qt.PartiallyChecked) # CARLA_DEFAULT_CANVAS_ANTIALIASING
diff --git a/source/carla_shared.py b/source/carla_shared.py
index a4496b791..5613f4254 100644
--- a/source/carla_shared.py
+++ b/source/carla_shared.py
@@ -189,14 +189,15 @@ CARLA_KEY_MAIN_PRO_THEME_COLOR = "Main/ProThemeColor" # str
CARLA_KEY_MAIN_REFRESH_INTERVAL = "Main/RefreshInterval" # int
CARLA_KEY_MAIN_USE_CUSTOM_SKINS = "Main/UseCustomSkins" # bool
-CARLA_KEY_CANVAS_THEME = "Canvas/Theme" # str
-CARLA_KEY_CANVAS_SIZE = "Canvas/Size" # str "NxN"
-CARLA_KEY_CANVAS_USE_BEZIER_LINES = "Canvas/UseBezierLines" # bool
-CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS = "Canvas/AutoHideGroups" # bool
-CARLA_KEY_CANVAS_EYE_CANDY = "Canvas/EyeCandy" # enum
-CARLA_KEY_CANVAS_USE_OPENGL = "Canvas/UseOpenGL" # bool
-CARLA_KEY_CANVAS_ANTIALIASING = "Canvas/Antialiasing" # enum
-CARLA_KEY_CANVAS_HQ_ANTIALIASING = "Canvas/HQAntialiasing" # bool
+CARLA_KEY_CANVAS_THEME = "Canvas/Theme" # str
+CARLA_KEY_CANVAS_SIZE = "Canvas/Size" # str "NxN"
+CARLA_KEY_CANVAS_USE_BEZIER_LINES = "Canvas/UseBezierLines" # bool
+CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS = "Canvas/AutoHideGroups" # bool
+CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS = "Canvas/AutoSelectItems" # bool
+CARLA_KEY_CANVAS_EYE_CANDY = "Canvas/EyeCandy" # enum
+CARLA_KEY_CANVAS_USE_OPENGL = "Canvas/UseOpenGL" # bool
+CARLA_KEY_CANVAS_ANTIALIASING = "Canvas/Antialiasing" # enum
+CARLA_KEY_CANVAS_HQ_ANTIALIASING = "Canvas/HQAntialiasing" # bool
CARLA_KEY_ENGINE_DRIVER_PREFIX = "Engine/Driver-"
CARLA_KEY_ENGINE_AUDIO_DRIVER = "Engine/AudioDriver" # str
@@ -233,16 +234,17 @@ CARLA_DEFAULT_MAIN_REFRESH_INTERVAL = 20
CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS = True
# Canvas
-CARLA_DEFAULT_CANVAS_THEME = "Modern Dark"
-CARLA_DEFAULT_CANVAS_SIZE = "3100x2400"
-CARLA_DEFAULT_CANVAS_SIZE_WIDTH = 3100
-CARLA_DEFAULT_CANVAS_SIZE_HEIGHT = 2400
-CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES = True
-CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS = True
-CARLA_DEFAULT_CANVAS_EYE_CANDY = CANVAS_EYECANDY_SMALL
-CARLA_DEFAULT_CANVAS_USE_OPENGL = False
-CARLA_DEFAULT_CANVAS_ANTIALIASING = CANVAS_ANTIALIASING_SMALL
-CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING = False
+CARLA_DEFAULT_CANVAS_THEME = "Modern Dark"
+CARLA_DEFAULT_CANVAS_SIZE = "3100x2400"
+CARLA_DEFAULT_CANVAS_SIZE_WIDTH = 3100
+CARLA_DEFAULT_CANVAS_SIZE_HEIGHT = 2400
+CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES = True
+CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS = True
+CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS = False
+CARLA_DEFAULT_CANVAS_EYE_CANDY = CANVAS_EYECANDY_SMALL
+CARLA_DEFAULT_CANVAS_USE_OPENGL = False
+CARLA_DEFAULT_CANVAS_ANTIALIASING = CANVAS_ANTIALIASING_SMALL
+CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING = False
# Engine
CARLA_DEFAULT_FORCE_STEREO = False
diff --git a/source/patchcanvas.py b/source/patchcanvas.py
index df8c44e42..b0ae6cc0c 100644
--- a/source/patchcanvas.py
+++ b/source/patchcanvas.py
@@ -106,6 +106,7 @@ class options_t(object):
__slots__ = [
'theme_name',
'auto_hide_groups',
+ 'auto_select_items',
'use_bezier_lines',
'antialiasing',
'eyecandy'
@@ -244,10 +245,11 @@ canvas.animation_list = []
options = options_t()
options.theme_name = getDefaultThemeName()
-options.auto_hide_groups = False
-options.use_bezier_lines = True
-options.antialiasing = ANTIALIASING_SMALL
-options.eyecandy = EYECANDY_SMALL
+options.auto_hide_groups = False
+options.auto_select_items = False
+options.use_bezier_lines = True
+options.antialiasing = ANTIALIASING_SMALL
+options.eyecandy = EYECANDY_SMALL
features = features_t()
features.group_info = False
@@ -313,11 +315,12 @@ def split2str(split):
# PatchCanvas API
def setOptions(new_options):
if canvas.initiated: return
- options.theme_name = new_options.theme_name
- options.auto_hide_groups = new_options.auto_hide_groups
- options.use_bezier_lines = new_options.use_bezier_lines
- options.antialiasing = new_options.antialiasing
- options.eyecandy = new_options.eyecandy
+ options.theme_name = new_options.theme_name
+ options.auto_hide_groups = new_options.auto_hide_groups
+ options.auto_select_items = new_options.auto_select_items
+ options.use_bezier_lines = new_options.use_bezier_lines
+ options.antialiasing = new_options.antialiasing
+ options.eyecandy = new_options.eyecandy
def setFeatures(new_features):
if canvas.initiated: return
@@ -1765,6 +1768,9 @@ class CanvasPort(QGraphicsItem):
self.setFlags(QGraphicsItem.ItemIsSelectable)
+ if options.auto_select_items:
+ self.setAcceptHoverEvents(True)
+
def getGroupId(self):
return self.m_group_id
@@ -1814,6 +1820,16 @@ class CanvasPort(QGraphicsItem):
def type(self):
return CanvasPortType
+ def hoverEnterEvent(self, event):
+ if options.auto_select_items:
+ self.setSelected(True)
+ QGraphicsItem.hoverEnterEvent(self, event)
+
+ def hoverLeaveEvent(self, event):
+ if options.auto_select_items:
+ self.setSelected(False)
+ QGraphicsItem.hoverLeaveEvent(self, event)
+
def mousePressEvent(self, event):
self.m_hover_item = None
self.m_mouse_down = bool(event.button() == Qt.LeftButton)
@@ -2154,6 +2170,9 @@ class CanvasBox(QGraphicsItem):
self.setFlag(QGraphicsItem.ItemIsFocusable, True)
+ if options.auto_select_items:
+ self.setAcceptHoverEvents(True)
+
self.updatePositions()
canvas.scene.addItem(self)
@@ -2602,6 +2621,13 @@ class CanvasBox(QGraphicsItem):
return event.accept()
QGraphicsItem.keyPressEvent(self, event)
+ def hoverEnterEvent(self, event):
+ if options.auto_select_items:
+ if len(canvas.scene.selectedItems()) > 0:
+ canvas.scene.clearSelection()
+ self.setSelected(True)
+ QGraphicsItem.hoverEnterEvent(self, event)
+
def mouseDoubleClickEvent(self, event):
if self.m_plugin_id >= 0:
canvas.callback(ACTION_PLUGIN_SHOW_UI if self.m_plugin_ui else ACTION_PLUGIN_EDIT, self.m_plugin_id, 0, "")