Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
f7d86ad
buttonClicked[int] -> idClicked
ales-erjavec May 8, 2021
9de6a26
Replace use of obsolete QPalette.Foreground/Background
ales-erjavec Feb 22, 2022
f7ba44f
Replace use of obsolete QLineEdit.textMargins
ales-erjavec Feb 22, 2022
8766dc8
owtreeviewer2d: Remove use of obsolete render flag
ales-erjavec Sep 2, 2021
de14bac
Replace QComboBox.activated[str] with QComboBox.textActivated
ales-erjavec May 8, 2021
f307ebf
Remove use of obsolete QComboBox.highlighted[int] signal
ales-erjavec Feb 23, 2022
3f2deef
Remove use of obsolete QLayout.margin property
ales-erjavec Feb 23, 2022
8716639
Replace use of obsolete Qt.BackgroundColorRole
ales-erjavec Feb 24, 2022
6db82a6
Fix calls to QCheckBox.setCheckState
ales-erjavec Feb 24, 2022
c41c4a9
Fix Qt.PenStyle comparisons
ales-erjavec Feb 24, 2022
d1c19e1
Replace use of obsolete QWheelEvent constructor
ales-erjavec Feb 24, 2022
e54ef14
Use Qt.NoModifier instead of 0
ales-erjavec Feb 24, 2022
dadd33e
Use Qt.PenStyle instead of integer constants
ales-erjavec Feb 24, 2022
f993f59
Replace use of obsolete QMouseEvent constructor overload
ales-erjavec Feb 24, 2022
ac94128
Fix use of Qt.ItemFlags in tests
ales-erjavec Feb 24, 2022
43e852d
owdatasets: Replace use of obsolete QFontMetrics.width
ales-erjavec Mar 2, 2022
3e5e69a
utils: Remove duplicated code already in orange-widget-base
ales-erjavec Mar 7, 2022
7e7567a
Use qcombobox_emit_activated where appropriate
ales-erjavec Mar 7, 2022
ce169d7
customizableplot: Use static QFontDatabase members
ales-erjavec Mar 7, 2022
3c9b24f
owcsvimport: Unwrap int enum constant (PyQt6 compatibility)
ales-erjavec Mar 7, 2022
f15ce5d
textimport: Remove bitwise enum tests
ales-erjavec Mar 7, 2022
6619b1b
gui: Check for QWheelEvent.source
ales-erjavec Mar 7, 2022
e61a8ba
headerview: PyQt6 compat
ales-erjavec Mar 7, 2022
1a47ea9
Replace an obsolete QDragEvent constructor call
ales-erjavec Mar 7, 2022
a79116a
Fix QDateTime constructors on Qt6
ales-erjavec Mar 7, 2022
fd36c8e
graphicsview: Fix PyQt6 compatibility
ales-erjavec Mar 7, 2022
fe158dd
test_owdistribution: Remove use of obsolete qApp
ales-erjavec Mar 7, 2022
179196a
owgroupby: Fix PyQt6 compatibility
ales-erjavec Mar 7, 2022
33bf3d9
test_owpivot: Fix test for PyQt6
ales-erjavec Mar 7, 2022
dd4000d
owrank: PyQt6 compatibility
ales-erjavec Mar 7, 2022
a85d136
test_owrank: Skip migration test on Qt6
ales-erjavec Mar 7, 2022
12dc686
pythoneditor: PyQt6 compatibility
ales-erjavec Mar 7, 2022
2ff5d9e
CI: Test with PyQt6
ales-erjavec Mar 10, 2022
85b83db
graphicspixmapwidget: PyQt6 compatibility
ales-erjavec Jun 1, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ jobs:
python-version: 3.7
tox_env: orange-oldest
name: Oldest dependencies
- os: ubuntu-20.04
python-version: 3.9
tox_env: pyqt6
name: PyQt6


services:
postgres:
Expand Down Expand Up @@ -120,6 +125,14 @@ jobs:
python-version: 3.8
tox_env: orange-latest
name: Latest
- os: windows-latest
python-version: 3.9
tox_env: pyqt6
name: PyQt6
- os: macos-10.15
python-version: 3.9
tox_env: pyqt6
name: PyQt6

steps:
- uses: actions/checkout@v2
Expand Down
5 changes: 3 additions & 2 deletions Orange/widgets/data/owcsvimport.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,10 @@
import numpy as np
import pandas.errors
import pandas as pd

from pandas.api import types as pdtypes

from orangewidget.utils import enum_as_int

import Orange.data
from Orange.misc.collections import natural_sorted

Expand Down Expand Up @@ -753,7 +754,7 @@ def update_buttons(cbindex):
self.import_options_button, QDialogButtonBox.ActionRole
)
button_box.setStyleSheet(
"button-layout: {:d};".format(QDialogButtonBox.MacLayout)
"button-layout: {:d};".format(enum_as_int(QDialogButtonBox.MacLayout))
)
self.controlArea.layout().addWidget(button_box)
self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Maximum)
Expand Down
2 changes: 1 addition & 1 deletion Orange/widgets/data/owdatasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ def __set_index(self, f):
)

scw = self.view.setColumnWidth
width = self.view.fontMetrics().width
width = self.view.fontMetrics().horizontalAdvance
self.view.resizeColumnToContents(0)
scw(self.Header.title, width("X" * 37))
scw(self.Header.size, 20 + max(width("888 bytes "), width("9999.9 MB ")))
Expand Down
15 changes: 1 addition & 14 deletions Orange/widgets/data/owdiscretize.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from AnyQt.QtCore import (
Qt, QTimer, QPoint, QItemSelectionModel, QSize, QAbstractListModel,
pyqtSignal as Signal)
)
from AnyQt.QtGui import (
QValidator, QPalette, QDoubleValidator, QIntValidator, QColor)
from AnyQt.QtWidgets import (
Expand All @@ -26,18 +26,6 @@
from Orange.widgets.widget import Input, Output
from Orange.widgets.data.oweditdomain import FixedSizeButton


# Remove this when we require PyQt 5.15
if not hasattr(QButtonGroup, "idClicked"):
class QButtonGroup(QButtonGroup): # pylint: disable=function-redefined
idClicked = Signal(int)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.buttonClicked.connect(
lambda button: self.idClicked.emit(self.id(button)))


re_custom_sep = re.compile(r"\s*,\s*")
time_units = ["year", "month", "day", "week", "hour", "minute", "second"]
INVALID_WIDTH = "invalid width"
Expand Down Expand Up @@ -537,7 +525,6 @@ def __init__(self):
self._create_buttons(box)
gui.auto_apply(self.buttonsArea, self, "autosend")
gui.rubber(self.buttonsArea)

self.varview.select_default()

def _create_var_list(self, box):
Expand Down
6 changes: 3 additions & 3 deletions Orange/widgets/data/oweditdomain.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ def __init__(self, parent=None, **kwargs):
self.unlink_var_cb.toggled.connect(self._set_unlink)
form.addRow("", self.unlink_var_cb)

vlayout = QVBoxLayout(margin=0, spacing=1)
vlayout = QVBoxLayout(spacing=1)
self.labels_edit = view = QTreeView(
objectName="annotation-pairs-edit",
rootIsDecorated=False,
Expand Down Expand Up @@ -1121,7 +1121,7 @@ def __init__(self, *args, **kwargs):
flags=Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
)

vlayout = QVBoxLayout(spacing=1, margin=0)
vlayout = QVBoxLayout(spacing=1)
self.values_edit = QListView(
editTriggers=QListView.DoubleClicked | QListView.EditKeyPressed,
selectionMode=QListView.ExtendedSelection,
Expand All @@ -1137,7 +1137,7 @@ def __init__(self, *args, **kwargs):
self.values_model.rowsMoved.connect(self.on_value_selection_changed)

vlayout.addWidget(self.values_edit)
hlayout = QHBoxLayout(spacing=1, margin=0)
hlayout = QHBoxLayout(spacing=1)

self.categories_action_group = group = QActionGroup(
self, objectName="action-group-categories", enabled=False
Expand Down
2 changes: 1 addition & 1 deletion Orange/widgets/data/owfeatureconstructor.py
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ def generate_newname(fmt):
toplayout.addWidget(self.editorstack, 10)

# Layout for the list view
layout = QVBoxLayout(spacing=1, margin=0)
layout = QVBoxLayout(spacing=1)
self.featuremodel = DescriptorModel(parent=self)

self.featureview = QListView(
Expand Down
5 changes: 3 additions & 2 deletions Orange/widgets/data/owfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def package(w):

self.sheet_box = gui.hBox(None, addToLayout=False, margin=0)
self.sheet_combo = QComboBox()
self.sheet_combo.activated[str].connect(self.select_sheet)
self.sheet_combo.textActivated.connect(self.select_sheet)
self.sheet_combo.setSizePolicy(Policy.Expanding, Policy.Fixed)
self.sheet_combo.setMinimumSize(QSize(50, 1))
self.sheet_label = QLabel()
Expand All @@ -240,7 +240,8 @@ def package(w):
url_combo.setEditable(True)
url_combo.setInsertPolicy(url_combo.InsertAtTop)
url_edit = url_combo.lineEdit()
l, t, r, b = url_edit.getTextMargins()
margins = url_edit.textMargins()
l, t, r, b = margins.left(), margins.top(), margins.right(), margins.bottom()
url_edit.setTextMargins(l + 5, t, r, b)
layout.addWidget(url_combo, 3, 1, 1, 3)
url_combo.activated.connect(self._url_set)
Expand Down
3 changes: 2 additions & 1 deletion Orange/widgets/data/owgroupby.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from orangewidget.settings import ContextSetting, Setting
from orangewidget.utils.listview import ListViewSearch
from orangewidget.utils.signals import Input, Output
from orangewidget.utils import enum_as_int
from orangewidget.widget import Msg

from Orange.data import (
Expand Down Expand Up @@ -279,7 +280,7 @@ def nextCheckState(self) -> None:
self.setCheckState(Qt.PartiallyChecked)
# since checkbox state stay same signal is not emitted
# automatically but we need a callback call so we emit it
self.stateChanged.emit(Qt.PartiallyChecked)
self.stateChanged.emit(enum_as_int(Qt.PartiallyChecked))
else: # self.checkState() == Qt.Unchecked
# if unchecked: check if all can be checked else partially check
self.setCheckState(
Expand Down
9 changes: 5 additions & 4 deletions Orange/widgets/data/owimpute.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ def __init__(self):
box.layout().addLayout(box_layout)

button_group = QButtonGroup()
button_group.buttonClicked[int].connect(self.set_default_method)
button_group.idClicked.connect(self.set_default_method)

for i, (method, _) in enumerate(list(METHODS.items())[1:-1]):
imputer = self.create_imputer(method)
Expand Down Expand Up @@ -257,10 +257,11 @@ def set_default_time(datetime):
self.selection = self.varview.selectionModel()

box.layout().addWidget(self.varview)
vertical_layout = QVBoxLayout(margin=0)
vertical_layout = QVBoxLayout()

self.methods_container = QWidget(enabled=False)
method_layout = QVBoxLayout(margin=0)
method_layout = QVBoxLayout()
method_layout.setContentsMargins(0, 0, 0, 0)
self.methods_container.setLayout(method_layout)

button_group = QButtonGroup()
Expand All @@ -284,7 +285,7 @@ def set_default_time(datetime):
value_stack.addWidget(self.value_double)
method_layout.addWidget(value_stack)

button_group.buttonClicked[int].connect(
button_group.idClicked.connect(
self.set_method_for_current_selection
)

Expand Down
5 changes: 2 additions & 3 deletions Orange/widgets/data/owpythonscript.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,12 +286,12 @@ def paintEvent(self, event):
p.drawRoundedRect(rect, 5, 5)
p.restore()

textstart = (width - fm.width(self.indicator_text)) // 2
textstart = (width - fm.horizontalAdvance(self.indicator_text)) // 2
p.drawText(textstart, height // 2 + 5, self.indicator_text)

def minimumSizeHint(self):
fm = QFontMetrics(self.font())
width = round(fm.width(self.indicator_text)) + 10
width = int(round(fm.horizontalAdvance(self.indicator_text)) + 10)
height = fm.height() + 6
return QSize(width, height)

Expand Down Expand Up @@ -637,7 +637,6 @@ def _(width):
self.editorBox.layout().addWidget(return_stmt)

self.editorBox.setAlignment(Qt.AlignVCenter)
self.text.setTabStopWidth(4)

self.text.modificationChanged[bool].connect(self.onModificationChanged)

Expand Down
5 changes: 3 additions & 2 deletions Orange/widgets/data/owrank.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ def _set_select_manual():
grid.setContentsMargins(0, 0, 0, 0)
grid.setSpacing(6)
self.selectButtons = QButtonGroup()
self.selectButtons.buttonClicked[int].connect(self.setSelectionMethod)
self.selectButtons.idClicked.connect(self.setSelectionMethod)

def button(text, buttonid, toolTip=None):
b = QRadioButton(text)
Expand Down Expand Up @@ -605,7 +605,8 @@ def headerClick(self, index):
sort_column = self.ranksModel.sortColumn() - 2 # -2 for '#' (discrete count) column
self.sorting = (sort_column, sort_order)

def methodSelectionChanged(self, state, method_name):
def methodSelectionChanged(self, state: int, method_name):
state = Qt.CheckState(state)
if state == Qt.Checked:
self.selected_methods.add(method_name)
elif method_name in self.selected_methods:
Expand Down
21 changes: 10 additions & 11 deletions Orange/widgets/data/tests/test_owcreateinstance.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,10 @@ def test_set_value(self):
self.callback.assert_called_once()


def _datetime(y, m, d) -> QDateTime:
return QDateTime(QDate(y, m, d), QTime(0, 0))


class TestTimeVariableEditor(GuiTest):
@classmethod
def setUpClass(cls):
Expand All @@ -387,13 +391,12 @@ def setUp(self):

def test_init(self):
self.assertEqual(self.editor.value, 0)
self.assertEqual(self.editor._edit.dateTime(),
QDateTime(QDate(1970, 1, 1)))
self.assertEqual(self.editor._edit.dateTime(), _datetime(1970, 1, 1))
self.callback.assert_not_called()

def test_edit(self):
""" Edit datetimeedit by user. """
datetime = QDateTime(QDate(2001, 9, 9))
datetime = _datetime(2001, 9, 9,)
self.editor._edit.setDateTime(datetime)
self.assertEqual(self.editor.value, 999993600)
self.assertEqual(self.editor._edit.dateTime(), datetime)
Expand All @@ -403,8 +406,7 @@ def test_set_value(self):
""" Programmatically set datetimeedit value. """
value = 999993600
self.editor.value = value
self.assertEqual(self.editor._edit.dateTime(),
QDateTime(QDate(2001, 9, 9)))
self.assertEqual(self.editor._edit.dateTime(), _datetime(2001, 9, 9))
self.assertEqual(self.editor.value, value)
self.callback.assert_called_once()

Expand All @@ -415,8 +417,7 @@ def test_have_date_have_time(self):
callback
)
self.assertEqual(editor.value, 0)
self.assertEqual(self.editor._edit.dateTime(),
QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0)))
self.assertEqual(self.editor._edit.dateTime(), _datetime(1970, 1, 1))
self.callback.assert_not_called()

datetime = QDateTime(QDate(2001, 9, 9), QTime(1, 2, 3))
Expand All @@ -431,8 +432,7 @@ def test_have_time(self):
self.parent, TimeVariable("var", have_time=1), callback
)
self.assertEqual(editor.value, 0)
self.assertEqual(self.editor._edit.dateTime(),
QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0)))
self.assertEqual(self.editor._edit.dateTime(), _datetime(1970, 1, 1))
self.callback.assert_not_called()

datetime = QDateTime(QDate(1900, 1, 1), QTime(1, 2, 3))
Expand All @@ -445,8 +445,7 @@ def test_no_date_no_time(self):
callback = Mock()
editor = TimeVariableEditor(self.parent, TimeVariable("var"), callback)
self.assertEqual(editor.value, 0)
self.assertEqual(self.editor._edit.dateTime(),
QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0)))
self.assertEqual(self.editor._edit.dateTime(), _datetime(1970, 1, 1))
self.callback.assert_not_called()

datetime = QDateTime(QDate(2001, 9, 9), QTime(1, 2, 3))
Expand Down
4 changes: 2 additions & 2 deletions Orange/widgets/data/tests/test_owfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import numpy as np
import scipy.sparse as sp

from AnyQt.QtCore import QMimeData, QPoint, Qt, QUrl, QThread, QObject
from AnyQt.QtCore import QMimeData, QPoint, Qt, QUrl, QThread, QObject, QPointF
from AnyQt.QtGui import QDragEnterEvent, QDropEvent
from AnyQt.QtWidgets import QComboBox

Expand Down Expand Up @@ -116,7 +116,7 @@ def _drop_event(self, url):
data.setUrls([QUrl(url)])

return QDropEvent(
QPoint(0, 0), Qt.MoveAction, data,
QPointF(0, 0), Qt.MoveAction, data,
Qt.NoButton, Qt.NoModifier, QDropEvent.Drop)

def test_check_file_size(self):
Expand Down
15 changes: 11 additions & 4 deletions Orange/widgets/data/tests/test_owpivot.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,22 +216,29 @@ def test_select_by_click(self):
simulate.combobox_activate_item(self.widget.controls.val_feature,
self.heart_disease.domain[0].name)

def pos(row, col) -> QPoint:
model = view.model()
rect = view.visualRect( # pylint:disable=protected-access
model.index(row + view._n_leading_rows,
col + view._n_leading_cols))
return rect.center()

# column in a group
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=QPoint(208, 154))
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=pos(2, 0))
self.assertSetEqual({(3, 0), (2, 0)}, view.get_selection())

# column
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=QPoint(340, 40))
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=pos(-1, 1))
self.assertSetEqual({(0, 1), (3, 1), (1, 1), (2, 1)},
view.get_selection())

# group
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=QPoint(155, 75))
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=pos(0, -1))
self.assertSetEqual({(0, 1), (1, 0), (0, 0), (1, 1)},
view.get_selection())

# all
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=QPoint(400, 198))
QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=pos(4, 2))
self.assertSetEqual({(0, 1), (0, 0), (3, 0), (3, 1), (2, 1), (2, 0),
(1, 0), (1, 1)}, view.get_selection())

Expand Down
5 changes: 4 additions & 1 deletion Orange/widgets/data/tests/test_owrank.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import numpy as np
from sklearn.exceptions import ConvergenceWarning

from AnyQt.QtCore import Qt, QItemSelection, QItemSelectionModel
from AnyQt.QtCore import Qt, QItemSelection, QItemSelectionModel, \
QT_VERSION_INFO
from AnyQt.QtWidgets import QCheckBox, QApplication

from orangewidget.settings import Context, IncompatibleContext
Expand Down Expand Up @@ -353,6 +354,8 @@ def test_data_which_make_scorer_nan(self):
self.widget.selected_methods.add('ANOVA')
self.send_signal(self.widget.Inputs.data, table)

@unittest.skipIf(lambda: QT_VERSION_INFO < (6,),
"headerState is not restored in Qt6")
def test_setting_migration_fixes_header_state(self):
# Settings as of version 3.3.5
settings = {
Expand Down
Loading