Hello community,
here is the log from the commit of package python-orange-widget-base for
openSUSE:Factory checked in at 2020-02-05 19:44:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-orange-widget-base (Old)
and /work/SRC/openSUSE:Factory/.python-orange-widget-base.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-orange-widget-base"
Wed Feb 5 19:44:07 2020 rev:2 rq:770296 version:4.3.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-orange-widget-base/python-orange-widget-base.changes
2019-12-12 23:19:12.886207821 +0100
+++
/work/SRC/openSUSE:Factory/.python-orange-widget-base.new.26092/python-orange-widget-base.changes
2020-02-05 19:44:51.851358050 +0100
@@ -1,0 +2,10 @@
+Wed Feb 5 14:08:28 UTC 2020 - Todd R <[email protected]>
+
+- Update to 4.3.0
+ * stateinfo: add auto format for numbers
+ * gui.checkBox: Show specific state when disabled
+ * gui.comboBox: Fix stored label
+ * widgetsscheme: Reorder pending signals to match
+ * Context: Add __eq__ and __hash__
+
+-------------------------------------------------------------------
Old:
----
orange-widget-base-4.2.0.tar.gz
New:
----
orange-widget-base-4.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-orange-widget-base.spec ++++++
--- /var/tmp/diff_new_pack.msbVVT/_old 2020-02-05 19:44:52.775358490 +0100
+++ /var/tmp/diff_new_pack.msbVVT/_new 2020-02-05 19:44:52.775358490 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-orange-widget-base
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,22 +12,23 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-orange-widget-base
-Version: 4.2.0
+Version: 4.3.0
Release: 0
-License: GPL-3.0+
Summary: Base Widget for Orange Canvas
-Url: http://orange.biolab.si/
+License: GPL-3.0-or-later
Group: Development/Languages/Python
+URL: https://github.com/biolab/orange-widget-base/
Source:
https://files.pythonhosted.org/packages/source/o/orange-widget-base/orange-widget-base-%{version}.tar.gz
-BuildRequires: python-rpm-macros
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
+BuildRequires: python-rpm-macros
Requires: python-AnyQt
Requires: python-matplotlib
Requires: python-orange-canvas-core >= 0.1.8
++++++ orange-widget-base-4.2.0.tar.gz -> orange-widget-base-4.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/PKG-INFO
new/orange-widget-base-4.3.0/PKG-INFO
--- old/orange-widget-base-4.2.0/PKG-INFO 2019-11-19 14:46:30.000000000
+0100
+++ new/orange-widget-base-4.3.0/PKG-INFO 2019-12-16 09:45:58.000000000
+0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: orange-widget-base
-Version: 4.2.0
+Version: 4.3.0
Summary: Base Widget for Orange Canvas
Home-page: http://orange.biolab.si/
Author: Bioinformatics Laboratory, FRI UL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orange-widget-base-4.2.0/orange_widget_base.egg-info/PKG-INFO
new/orange-widget-base-4.3.0/orange_widget_base.egg-info/PKG-INFO
--- old/orange-widget-base-4.2.0/orange_widget_base.egg-info/PKG-INFO
2019-11-19 14:46:29.000000000 +0100
+++ new/orange-widget-base-4.3.0/orange_widget_base.egg-info/PKG-INFO
2019-12-16 09:45:58.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: orange-widget-base
-Version: 4.2.0
+Version: 4.3.0
Summary: Base Widget for Orange Canvas
Home-page: http://orange.biolab.si/
Author: Bioinformatics Laboratory, FRI UL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/gui.py
new/orange-widget-base-4.3.0/orangewidget/gui.py
--- old/orange-widget-base-4.2.0/orangewidget/gui.py 2019-11-08
16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/gui.py 2019-12-11
15:23:26.000000000 +0100
@@ -702,9 +702,42 @@
decimals=decimals, spinType=float, **misc)
+class CheckBoxWithDisabledState(QtWidgets.QCheckBox):
+ def __init__(self, label, parent, disabledState):
+ super().__init__(label, parent)
+ self.disabledState = disabledState
+ # self.trueState is always stored as Qt.Checked, Qt.PartiallyChecked
+ # or Qt.Unchecked, even if the button is two-state, because in
+ # setCheckState, which is used for setting it, "true" would result
+ # in partially checked.
+ self.trueState = self.checkState()
+
+ def changeEvent(self, event):
+ super().changeEvent(event)
+ if event.type() == event.EnabledChange:
+ self._updateChecked()
+
+ def setCheckState(self, state):
+ self.trueState = state
+ self._updateChecked()
+
+ def setChecked(self, state):
+ self._storeTrueState(state)
+ self._updateChecked()
+
+ def _updateChecked(self):
+ if self.isEnabled():
+ super().setCheckState(self.trueState)
+ else:
+ super().setCheckState(self.disabledState)
+
+ def _storeTrueState(self, state):
+ self.trueState = Qt.Checked if state else Qt.Unchecked
+
+
def checkBox(widget, master, value, label, box=None,
callback=None, getwidget=False, id_=None, labelWidth=None,
- disables=None, **misc):
+ disables=None, stateWhenDisabled=None, **misc):
"""
A simple checkbox.
@@ -732,6 +765,9 @@
:param disables: a list of widgets that are disabled if the check box is
unchecked
:type disables: list or QWidget or None
+ :param stateWhenDisabled: the shown state of the checkbox when it is
+ disabled (default: None, unaffected)
+ :type stateWhenDisabled: bool or Qt.CheckState or None
:return: constructed check box; if is is placed within a box, the box is
return in the attribute `box`
:rtype: QCheckBox
@@ -740,7 +776,11 @@
b = hBox(widget, box, addToLayout=False)
else:
b = widget
- cbox = QtWidgets.QCheckBox(label, b)
+ if stateWhenDisabled is not None:
+ cbox = CheckBoxWithDisabledState(label, b, stateWhenDisabled)
+ cbox.clicked.connect(cbox._storeTrueState)
+ else:
+ cbox = QtWidgets.QCheckBox(label, b)
if labelWidth:
cbox.setFixedSize(labelWidth, cbox.sizeHint().height())
@@ -1413,7 +1453,7 @@
if box or label:
hb = widgetBox(widget, box, orientation, addToLayout=False)
if label is not None:
- widgetLabel(hb, label, labelWidth)
+ widget_label = widgetLabel(hb, label, labelWidth)
else:
hb = widget
@@ -1427,7 +1467,7 @@
combo.setMinimumContentsLength(contentsLength)
combo.box = hb
- combo.label = label
+ combo.label = widget_label
for item in items:
if isinstance(item, (tuple, list)):
combo.addItem(*item)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/settings.py
new/orange-widget-base-4.3.0/orangewidget/settings.py
--- old/orange-widget-base-4.2.0/orangewidget/settings.py 2019-10-23
09:28:29.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/settings.py 2019-12-11
15:23:26.000000000 +0100
@@ -693,7 +693,7 @@
class Context:
- """Class for data thad defines context and
+ """Class for data that defines context and
values that should be applied to widget if given context
is encountered."""
def __init__(self, **argkw):
@@ -701,12 +701,12 @@
self.values = {}
self.__dict__.update(argkw)
- def __getstate__(self):
- state = dict(self.__dict__)
- for nc in getattr(self, "no_copy", []):
- if nc in state:
- del state[nc]
- return state
+ def __eq__(self, other):
+ self_state = self.__dict__.copy()
+ del self_state["time"]
+ other_state = other.__dict__.copy()
+ del other_state["time"]
+ return self_state == other_state
class ContextHandler(SettingsHandler):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orange-widget-base-4.2.0/orangewidget/tests/test_context_handler.py
new/orange-widget-base-4.3.0/orangewidget/tests/test_context_handler.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_context_handler.py
2019-06-19 09:33:10.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_context_handler.py
2019-12-11 15:23:26.000000000 +0100
@@ -247,3 +247,14 @@
self.assertIn("param2=2", output)
self.assertIn("param1=3", output)
self.assertIn("param2=4", output)
+
+
+class TestContext(TestCase):
+ def test_context_eq(self):
+ context1 = Context(x=12, y=["a", "list"], time=3.14)
+ context2 = Context(x=12, y=["a", "list"], time=2.71)
+ context3 = Context(x=13, y=["a", "list"], time=2.71)
+ self.assertTrue(context1 == context2)
+ self.assertFalse(context2 == context3)
+
+ self.assertRaises(TypeError, hash, context1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orange-widget-base-4.2.0/orangewidget/tests/test_gui.py
new/orange-widget-base-4.3.0/orangewidget/tests/test_gui.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_gui.py 2019-10-23
09:28:29.000000000 +0200
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_gui.py 2019-12-11
15:23:26.000000000 +0100
@@ -74,3 +74,131 @@
# notification should not be called again
with self.assertRaises(TimeoutError):
self.process_events(lambda: len(call.call_args_list) > 1,
timeout=1000)
+
+
+class TestCheckBoxWithDisabledState(GuiTest):
+ def test_check_checkbox_disable_false(self):
+ widget = OWBaseWidget()
+ widget.some_option = False
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=False)
+ self.assertFalse(cb.isChecked())
+ cb.setEnabled(False)
+ self.assertFalse(cb.isChecked())
+ widget.some_option = True
+ self.assertFalse(cb.isChecked())
+ cb.setEnabled(True)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = False
+ self.assertFalse(cb.isChecked())
+
+ cb.setDisabled(True)
+ self.assertFalse(cb.isChecked())
+ widget.some_option = True
+ self.assertFalse(cb.isChecked())
+ cb.setDisabled(False)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = False
+ self.assertFalse(cb.isChecked())
+
+ def test_check_checkbox_disable_true(self):
+ widget = OWBaseWidget()
+ widget.some_option = False
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=True)
+ self.assertFalse(cb.isChecked())
+ cb.setEnabled(False)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = True
+ self.assertTrue(cb.isChecked())
+ cb.setEnabled(True)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = False
+ self.assertFalse(cb.isChecked())
+
+ cb.setDisabled(True)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = True
+ self.assertTrue(cb.isChecked())
+ cb.setDisabled(False)
+ self.assertTrue(cb.isChecked())
+ widget.some_option = False
+ self.assertFalse(cb.isChecked())
+
+ def test_clicks(self):
+ widget = OWBaseWidget()
+ widget.some_option = False
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=False)
+ cb.clicked.emit(True)
+ cb.setEnabled(False)
+ cb.setEnabled(True)
+ self.assertTrue(cb.isChecked())
+
+ def test_set_checked(self):
+ widget = OWBaseWidget()
+
+ widget.some_option = False
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=False)
+ self.assertFalse(cb.isChecked())
+ cb.setEnabled(False)
+ cb.setChecked(True)
+ self.assertFalse(cb.isChecked())
+ cb.setEnabled(True)
+ self.assertTrue(cb.isChecked())
+
+ widget.some_option = True
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=True)
+ self.assertTrue(cb.isChecked())
+ cb.setEnabled(False)
+ cb.setChecked(False)
+ self.assertTrue(cb.isChecked())
+ cb.setEnabled(True)
+ self.assertFalse(cb.isChecked())
+
+ def test_set_check_state(self):
+ widget = OWBaseWidget()
+
+ widget.some_option = 0
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=Qt.Unchecked)
+ cb.setCheckState(Qt.Unchecked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+ cb.setCheckState(Qt.PartiallyChecked)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+ cb.setEnabled(True)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+ cb.setCheckState(Qt.Checked)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+ cb.setEnabled(True)
+ self.assertEqual(cb.checkState(), Qt.Checked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+
+ widget.some_option = 2
+ cb = gui.checkBox(widget, widget, "some_option", "foo",
+ stateWhenDisabled=Qt.PartiallyChecked)
+ cb.setCheckState(Qt.Unchecked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+
+ cb.setCheckState(Qt.Unchecked)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+ cb.setEnabled(True)
+ self.assertEqual(cb.checkState(), Qt.Unchecked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+
+ cb.setCheckState(Qt.Checked)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
+ cb.setEnabled(True)
+ self.assertEqual(cb.checkState(), Qt.Checked)
+ cb.setEnabled(False)
+ self.assertEqual(cb.checkState(), Qt.PartiallyChecked)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orange-widget-base-4.2.0/orangewidget/tests/test_widget.py
new/orange-widget-base-4.3.0/orangewidget/tests/test_widget.py
--- old/orange-widget-base-4.2.0/orangewidget/tests/test_widget.py
2019-11-08 16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/tests/test_widget.py
2019-12-11 15:23:26.000000000 +0100
@@ -13,7 +13,7 @@
from orangewidget.gui import OWComponent
from orangewidget.settings import Setting, SettingProvider
from orangewidget.tests.base import WidgetTest
-from orangewidget.widget import OWBaseWidget, Msg
+from orangewidget.widget import OWBaseWidget, Msg, StateInfo
from orangewidget.utils.messagewidget import MessagesWidget
@@ -430,6 +430,13 @@
self.assertEqual(inmsg.summarize().text, "Foo")
self.assertFalse(inmsg.summarize().icon.isNull())
+ info.set_input_summary(12_345)
+ info.set_output_summary(1234)
+
+ self.assertEqual(inmsg.summarize().text, "12.3k")
+ self.assertEqual(inmsg.summarize().informativeText, "12345")
+ self.assertEqual(outmsg.summarize().text, "1234")
+
info.set_input_summary("Foo", "A foo that bars",)
info.set_input_summary(None)
@@ -455,3 +462,16 @@
with self.assertRaises(TypeError):
info.set_output_summary(info.NoOutput, "a")
+
+ with self.assertRaises(TypeError):
+ info.set_output_summary(1234, "a")
+
+ def test_format_number(self):
+ self.assertEqual(StateInfo.format_number(9999), "9999")
+ self.assertEqual(StateInfo.format_number(12_345), "12.3k")
+ self.assertEqual(StateInfo.format_number(12_000), "12k")
+ self.assertEqual(StateInfo.format_number(123_456), "123k")
+ self.assertEqual(StateInfo.format_number(99_999), "100k")
+ self.assertEqual(StateInfo.format_number(1_234_567), "1.23M")
+ self.assertEqual(StateInfo.format_number(999_999), "1M")
+ self.assertEqual(StateInfo.format_number(1_000_000), "1M")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/version.py
new/orange-widget-base-4.3.0/orangewidget/version.py
--- old/orange-widget-base-4.2.0/orangewidget/version.py 2019-11-19
14:46:29.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/version.py 2019-12-16
09:45:58.000000000 +0100
@@ -1,8 +1,8 @@
# THIS FILE IS GENERATED FROM ORANGE-WIDGET-BASE SETUP.PY
-short_version = '4.2.0'
-version = '4.2.0'
-full_version = '4.2.0'
-git_revision = 'e9fc6abee0b62aaa78149d4bfbf8d3758f3ed8d8'
+short_version = '4.3.0'
+version = '4.3.0'
+full_version = '4.3.0'
+git_revision = '9bfc975eba10070c05cc3513c0d8eb9b496c2d10'
release = True
if not release:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/orangewidget/widget.py
new/orange-widget-base-4.3.0/orangewidget/widget.py
--- old/orange-widget-base-4.2.0/orangewidget/widget.py 2019-11-08
16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/widget.py 2019-12-11
15:23:26.000000000 +0100
@@ -4,6 +4,7 @@
import warnings
import textwrap
from operator import attrgetter
+from math import log10
from typing import Optional, Union
@@ -1377,6 +1378,9 @@
Dynamic = Dynamic
+metric_suffix = ['', 'k', 'M', 'G', 'T', 'P']
+
+
class StateInfo(QObject):
"""
A namespace for OWBaseWidget's detailed input/output/state summary
reporting.
@@ -1511,7 +1515,7 @@
def set_input_summary(self, summary, details="", icon=QIcon(),
format=Qt.PlainText):
- # type: (Union[StateInfo.Summary, str, None], str, QIcon,
Qt.TextFormat) -> None
+ # type: (Union[StateInfo.Summary, str, int, None], str, QIcon,
Qt.TextFormat) -> None
"""
Set the input summary description.
@@ -1525,12 +1529,13 @@
----
`set_input_summary(None)` clears/resets the current summary. Use
`set_input_summary(StateInfo.NoInput)` to indicate no input state.
+ `set_input_summary(int)` to have automatically formatted summary
Parameters
----------
- summary : Union[Optional[StateInfo.Message], str]
- A populated `StateInfo.Message` instance or
- a short text description (should not exceed 16 characters).
+ summary : Union[Optional[StateInfo.Message], str, int]
+ A populated `StateInfo.Message` instance or a short text
+ description (should not exceed 16 characters) or an integer.
details : str
A detailed description (only applicable if summary is a string).
icon : QIcon
@@ -1557,6 +1562,11 @@
summary = StateInfo.Summary(summary, details, icon, format=format)
if summary.icon.isNull():
summary = summary.updated(icon=summary.default_icon("input"))
+ elif isinstance(summary, int):
+ assert_single_arg()
+ formatted_summary = self.format_number(summary)
+ summary = StateInfo.Summary(formatted_summary, str(summary),
+
StateInfo.Summary.default_icon("input"))
else:
raise TypeError("'None', 'str' or 'Message' instance expected, "
"got '{}'" .format(type(summary).__name__))
@@ -1567,7 +1577,7 @@
def set_output_summary(self, summary, details="", icon=QIcon(),
format=Qt.PlainText):
- # type: (Union[StateInfo.Summary, str, None], str, QIcon,
Qt.TextFormat) -> None
+ # type: (Union[StateInfo.Summary, str, int, None], str, QIcon,
Qt.TextFormat) -> None
"""
Set the output summary description.
@@ -1575,12 +1585,13 @@
----
`set_output_summary(None)` clears/resets the current summary. Use
`set_output_summary(StateInfo.NoOutput)` to indicate no output state.
+ `set_output_summary(int)` to have automatically formatted summary
Parameters
----------
- summary : Union[StateInfo.Summary, str, None]
+ summary : Union[StateInfo.Summary, str, int, None]
A populated `StateInfo.Summary` instance or a short text
- description (should not exceed 16 characters).
+ description (should not exceed 16 characters) or an integer.
details : str
A detailed description (only applicable if `summary` is a string).
icon : QIcon
@@ -1606,6 +1617,11 @@
summary = StateInfo.Summary(summary, details, icon, format=format)
if summary.icon.isNull():
summary = summary.updated(icon=summary.default_icon("output"))
+ elif isinstance(summary, int):
+ assert_single_arg()
+ formatted_summary = self.format_number(summary)
+ summary = StateInfo.Summary(formatted_summary, str(summary),
+
StateInfo.Summary.default_icon("output"))
else:
raise TypeError("'None', 'str' or 'Message' instance expected, "
"got '{}'" .format(type(summary).__name__))
@@ -1614,5 +1630,23 @@
self.__output_summary = summary
self.output_summary_changed.emit(summary)
+ @staticmethod
+ def format_number(n: int) -> str:
+ """
+ Format integers larger then 9999 with metric suffix and at most 3
digits.
+
+ Example:
+ >>> StateInfo.format_number(12_345)
+ '12.3k'
+ """
+ if n < 10_000:
+ return str(n)
+ mag = int(log10(n) // 3)
+ n = n / 10 ** (mag * 3)
+ if n >= 999.5:
+ # rounding to higher order
+ n = 1
+ mag += 1
+ return f"{n:.3g}{metric_suffix[mag]}"
# pylint: disable=too-many-lines
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/orange-widget-base-4.2.0/orangewidget/workflow/widgetsscheme.py
new/orange-widget-base-4.3.0/orangewidget/workflow/widgetsscheme.py
--- old/orange-widget-base-4.2.0/orangewidget/workflow/widgetsscheme.py
2019-11-08 16:39:45.000000000 +0100
+++ new/orange-widget-base-4.3.0/orangewidget/workflow/widgetsscheme.py
2019-12-11 15:23:26.000000000 +0100
@@ -773,9 +773,23 @@
Deliver input signals to an OWBaseWidget instance.
"""
- widget = self.scheme().widget_for_node(node)
- if widget is not None:
- self.process_signals_for_widget(node, widget, signals)
+ scheme = self.scheme()
+ assert scheme is not None
+ widget = scheme.widget_for_node(node)
+ if widget is None:
+ return
+ # `signals` are in the order they were 'enqueued' for delivery.
+ # Reorder them to match the order of links in the model.
+ _order = {
+ l: i for i, l in enumerate(scheme.find_links(sink_node=node))
+ }
+
+ def order(signal: Signal) -> int:
+ # if link is not in the workflow we are processing the final
+ # 'reset' (None) delivery for a removed connection.
+ return _order.get(signal.link, -1)
+ signals = sorted(signals, key=order)
+ self.process_signals_for_widget(node, widget, signals)
def compress_signals(self, signals):
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/orange-widget-base-4.2.0/setup.py
new/orange-widget-base-4.3.0/setup.py
--- old/orange-widget-base-4.2.0/setup.py 2019-11-19 14:26:45.000000000
+0100
+++ new/orange-widget-base-4.3.0/setup.py 2019-12-16 09:43:13.000000000
+0100
@@ -5,7 +5,7 @@
from setuptools import setup, find_packages, Command
NAME = 'orange-widget-base'
-VERSION = '4.2.0'
+VERSION = '4.3.0'
ISRELEASED = True
# full version identifier including a git revision identifier for development
# build/releases (this is filled/updated in `write_version_py`)