Signed-off-by: falkTX <falktx@falktx.com>tags/v2.1-rc1
| @@ -2460,6 +2460,13 @@ | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| <item> | |||
| <widget class="QCheckBox" name="cb_canvas_inline_displays"> | |||
| <property name="text"> | |||
| <string>Render Ardour-style "Inline Displays"</string> | |||
| </property> | |||
| </widget> | |||
| </item> | |||
| </layout> | |||
| </widget> | |||
| </item> | |||
| @@ -1337,13 +1337,14 @@ class HostWindow(QMainWindow): | |||
| 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.inline_displays = self.fSavedSettings[CARLA_KEY_CANVAS_INLINE_DISPLAYS] | |||
| if self.fSavedSettings[CARLA_KEY_CANVAS_FANCY_EYE_CANDY]: | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_FULL | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_FULL | |||
| elif self.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY]: | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_SMALL | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_SMALL | |||
| else: | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_NONE | |||
| pOptions.eyecandy = patchcanvas.EYECANDY_NONE | |||
| pFeatures = patchcanvas.features_t() | |||
| pFeatures.group_info = False | |||
| @@ -1702,6 +1703,7 @@ class HostWindow(QMainWindow): | |||
| 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_CANVAS_INLINE_DISPLAYS: settings.value(CARLA_KEY_CANVAS_INLINE_DISPLAYS, CARLA_DEFAULT_CANVAS_INLINE_DISPLAYS, 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"), | |||
| } | |||
| @@ -376,6 +376,7 @@ class CarlaSettingsW(QDialog): | |||
| 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)) | |||
| self.ui.cb_canvas_render_hq_aa.setChecked(settings.value(CARLA_KEY_CANVAS_HQ_ANTIALIASING, CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING, type=bool) and self.ui.cb_canvas_render_hq_aa.isEnabled()) | |||
| self.ui.cb_canvas_inline_displays.setChecked(settings.value(CARLA_KEY_CANVAS_INLINE_DISPLAYS, CARLA_DEFAULT_CANVAS_INLINE_DISPLAYS, type=bool)) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| @@ -599,6 +600,7 @@ class CarlaSettingsW(QDialog): | |||
| 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_INLINE_DISPLAYS, self.ui.cb_canvas_inline_displays.isChecked()) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| @@ -901,6 +903,7 @@ class CarlaSettingsW(QDialog): | |||
| self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_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_hq_aa.setChecked(CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING and self.ui.cb_canvas_render_hq_aa.isEnabled()) | |||
| self.ui.cb_canvas_inline_displays.setChecked(CARLA_DEFAULT_CANVAS_INLINE_DISPLAYS) | |||
| self.ui.ch_engine_force_stereo.setChecked(CARLA_DEFAULT_FORCE_STEREO) | |||
| self.ui.ch_engine_prefer_plugin_bridges.setChecked(CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES) | |||
| @@ -933,16 +936,19 @@ class CarlaSettingsW(QDialog): | |||
| @pyqtSlot(bool) | |||
| def slot_canvasEyeCandyToggled(self, toggled): | |||
| if not toggled: | |||
| # disable fancy eyecandy too | |||
| self.ui.cb_canvas_fancy_eyecandy.setChecked(False) | |||
| @pyqtSlot(bool) | |||
| def slot_canvasFancyEyeCandyToggled(self, toggled): | |||
| if toggled: | |||
| # make sure normal eyecandy is enabled too | |||
| self.ui.cb_canvas_eyecandy.setChecked(True) | |||
| @pyqtSlot(bool) | |||
| def slot_canvasOpenGLToggled(self, toggled): | |||
| if not toggled: | |||
| # uncheck GL specific option | |||
| self.ui.cb_canvas_render_hq_aa.setChecked(False) | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| @@ -198,6 +198,7 @@ CARLA_KEY_CANVAS_FANCY_EYE_CANDY = "Canvas/FancyEyeCandy" # bool | |||
| 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_INLINE_DISPLAYS = "Canvas/InlineDisplays" # bool | |||
| CARLA_KEY_ENGINE_DRIVER_PREFIX = "Engine/Driver-" | |||
| CARLA_KEY_ENGINE_AUDIO_DRIVER = "Engine/AudioDriver" # str | |||
| @@ -270,6 +271,7 @@ CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY = False | |||
| CARLA_DEFAULT_CANVAS_USE_OPENGL = False | |||
| CARLA_DEFAULT_CANVAS_ANTIALIASING = CANVAS_ANTIALIASING_SMALL | |||
| CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING = False | |||
| CARLA_DEFAULT_CANVAS_INLINE_DISPLAYS = False | |||
| # Engine | |||
| CARLA_DEFAULT_FORCE_STEREO = False | |||
| @@ -107,7 +107,8 @@ class options_t(object): | |||
| 'auto_select_items', | |||
| 'use_bezier_lines', | |||
| 'antialiasing', | |||
| 'eyecandy' | |||
| 'eyecandy', | |||
| 'inline_displays' | |||
| ] | |||
| # Canvas features | |||
| @@ -255,6 +256,7 @@ options.auto_select_items = False | |||
| options.use_bezier_lines = True | |||
| options.antialiasing = ANTIALIASING_SMALL | |||
| options.eyecandy = EYECANDY_SMALL | |||
| options.inline_displays = False | |||
| features = features_t() | |||
| features.group_info = False | |||
| @@ -272,6 +274,7 @@ def setOptions(new_options): | |||
| options.use_bezier_lines = new_options.use_bezier_lines | |||
| options.antialiasing = new_options.antialiasing | |||
| options.eyecandy = new_options.eyecandy | |||
| options.inline_displays = new_options.inline_displays | |||
| def setFeatures(new_features): | |||
| if canvas.initiated: return | |||
| @@ -73,6 +73,10 @@ class cb_line_t(object): | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| class CanvasBox(QGraphicsItem): | |||
| INLINE_DISPLAY_DISABLED = 0 | |||
| INLINE_DISPLAY_ENABLED = 1 | |||
| INLINE_DISPLAY_CACHED = 2 | |||
| def __init__(self, group_id, group_name, icon, parent=None): | |||
| QGraphicsItem.__init__(self) | |||
| self.setParentItem(parent) | |||
| @@ -84,7 +88,7 @@ class CanvasBox(QGraphicsItem): | |||
| # plugin Id, < 0 if invalid | |||
| self.m_plugin_id = -1 | |||
| self.m_plugin_ui = False | |||
| self.m_plugin_inline = False | |||
| self.m_plugin_inline = self.INLINE_DISPLAY_DISABLED | |||
| # Base Variables | |||
| self.p_width = 50 | |||
| @@ -99,6 +103,7 @@ class CanvasBox(QGraphicsItem): | |||
| self.m_cursor_moving = False | |||
| self.m_forced_split = False | |||
| self.m_mouse_down = False | |||
| self.m_inline_image = None | |||
| self.m_port_list_ids = [] | |||
| self.m_connection_lines = [] | |||
| @@ -163,10 +168,17 @@ class CanvasBox(QGraphicsItem): | |||
| def getPortList(self): | |||
| return self.m_port_list_ids | |||
| def redrawInlineDisplay(self): | |||
| if self.m_plugin_inline == self.INLINE_DISPLAY_CACHED: | |||
| self.m_plugin_inline = self.INLINE_DISPLAY_ENABLED | |||
| def setAsPlugin(self, plugin_id, hasUI, hasInlineDisplay): | |||
| if hasInlineDisplay and not options.inline_displays: | |||
| hasInlineDisplay = False | |||
| self.m_plugin_id = plugin_id | |||
| self.m_plugin_ui = hasUI | |||
| self.m_plugin_inline = hasInlineDisplay | |||
| self.m_plugin_inline = self.INLINE_DISPLAY_ENABLED if hasInlineDisplay else self.INLINE_DISPLAY_DISABLED | |||
| self.update() | |||
| def setIcon(self, icon): | |||
| @@ -265,7 +277,7 @@ class CanvasBox(QGraphicsItem): | |||
| # Check Text Name size | |||
| app_name_size = QFontMetrics(self.m_font_name).width(self.m_group_name) + 30 | |||
| self.p_width = max(200 if self.m_plugin_inline else 50, app_name_size) | |||
| self.p_width = max(200 if self.m_plugin_inline != self.INLINE_DISPLAY_DISABLED else 50, app_name_size) | |||
| # Get Port List | |||
| port_list = [] | |||
| @@ -311,7 +323,7 @@ class CanvasBox(QGraphicsItem): | |||
| port.widget.setY(last_out_pos) | |||
| last_out_pos += port_spacing | |||
| self.p_width = max(self.p_width, (100 if self.m_plugin_inline else 30) + max_in_width + max_out_width) | |||
| self.p_width = max(self.p_width, (100 if self.m_plugin_inline != self.INLINE_DISPLAY_DISABLED else 30) + max_in_width + max_out_width) | |||
| self.p_width_in = max_in_width | |||
| self.p_width_out = max_out_width | |||
| @@ -623,19 +635,7 @@ class CanvasBox(QGraphicsItem): | |||
| painter.drawRect(rect) | |||
| # Draw plugin inline display if supported | |||
| if self.m_plugin_id >= 0 and self.m_plugin_id <= MAX_PLUGIN_ID_ALLOWED and self.m_plugin_inline: | |||
| inwidth = self.p_width - self.p_width_in - self.p_width_out - 16 | |||
| inheight = self.p_height - canvas.theme.box_header_height | |||
| scaling = canvas.scene.getScaleFactor() * canvas.scene.getDevicePixelRatioF() | |||
| size = "%i:%i" % (int(inwidth*scaling), int(inheight*scaling)) | |||
| data = canvas.callback(ACTION_INLINE_DISPLAY, self.m_plugin_id, 0, size) | |||
| if data is not None: | |||
| image = QImage(data['data'], data['width'], data['height'], data['stride'], QImage.Format_ARGB32) | |||
| srcx = self.p_width_in + 7 | |||
| srcy = int(canvas.theme.box_header_height | |||
| + (self.p_height - canvas.theme.box_header_height) / 2 | |||
| - data['height'] / 2 / scaling - 1) | |||
| painter.drawImage(QRectF(srcx, srcy, inwidth, inheight), image) | |||
| self.paintInlineDisplay(painter) | |||
| # Draw pixmap header | |||
| rect.setHeight(canvas.theme.box_header_height) | |||
| @@ -671,4 +671,27 @@ class CanvasBox(QGraphicsItem): | |||
| painter.restore() | |||
| def paintInlineDisplay(self, painter): | |||
| if self.m_plugin_id < 0 or self.m_plugin_id > MAX_PLUGIN_ID_ALLOWED: | |||
| return | |||
| if self.m_plugin_inline == self.INLINE_DISPLAY_DISABLED: | |||
| return | |||
| if not options.inline_displays: | |||
| return | |||
| if self.m_plugin_inline == self.INLINE_DISPLAY_ENABLED: | |||
| inwidth = self.p_width - self.p_width_in - self.p_width_out - 16 | |||
| inheight = self.p_height - canvas.theme.box_header_height | |||
| scaling = canvas.scene.getScaleFactor() * canvas.scene.getDevicePixelRatioF() | |||
| size = "%i:%i" % (int(inwidth*scaling), int(inheight*scaling)) | |||
| data = canvas.callback(ACTION_INLINE_DISPLAY, self.m_plugin_id, 0, size) | |||
| self.m_inline_image = QImage(data['data'], data['width'], data['height'], data['stride'], QImage.Format_ARGB32) | |||
| #self.m_plugin_inline = self.INLINE_DISPLAY_CACHED | |||
| srcx = self.p_width_in + 7 | |||
| srcy = int(canvas.theme.box_header_height | |||
| + (self.p_height - canvas.theme.box_header_height) / 2 | |||
| - data['height'] / 2 / scaling - 1) | |||
| painter.drawImage(QRectF(srcx, srcy, inwidth, inheight), self.m_inline_image) | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| @@ -932,12 +932,12 @@ def handlePluginRemoved(plugin_id): | |||
| group.plugin_inline = False | |||
| group.widgets[0].m_plugin_id = -1 | |||
| group.widgets[0].m_plugin_ui = False | |||
| group.widgets[0].m_plugin_inline = False | |||
| group.widgets[0].m_plugin_inline = CanvasBox.INLINE_DISPLAY_DISABLED | |||
| if group.split and group.widgets[1]: | |||
| group.widgets[1].m_plugin_id = -1 | |||
| group.widgets[1].m_plugin_ui = False | |||
| group.widgets[1].m_plugin_inline = False | |||
| group.widgets[1].m_plugin_inline = CanvasBox.INLINE_DISPLAY_DISABLED | |||
| for group in canvas.group_list: | |||
| if group.plugin_id < plugin_id or group.plugin_id > MAX_PLUGIN_ID_ALLOWED: | |||
| @@ -968,11 +968,11 @@ def handleAllPluginsRemoved(): | |||
| group.plugin_inline = False | |||
| group.widgets[0].m_plugin_id = -1 | |||
| group.widgets[0].m_plugin_ui = False | |||
| group.widgets[0].m_plugin_inline = False | |||
| group.widgets[0].m_plugin_inline = CanvasBox.INLINE_DISPLAY_DISABLED | |||
| if group.split and group.widgets[1]: | |||
| group.widgets[1].m_plugin_id = -1 | |||
| group.widgets[1].m_plugin_ui = False | |||
| group.widgets[1].m_plugin_inline = False | |||
| group.widgets[1].m_plugin_inline = CanvasBox.INLINE_DISPLAY_DISABLED | |||
| # ------------------------------------------------------------------------------------------------------------ | |||