Skip to content
Permalink
Browse files

Merge remote-tracking branch 'biolab/master'

Revert "Fix for crash on empty data, better handling on sparcisity changes"

This reverts commit 246795b9bc2c343d4214cf42a986f2a6be40b732.

Fix for empty data crash, better handling of sparse data


Merge remote-tracking branch 'origin/owsave' into owsave
  • Loading branch information...
golbog committed Oct 25, 2018
1 parent 371a193 commit 9045f49ce259b184fec3b23fe284bc13065b089f
Showing with 11,313 additions and 4,427 deletions.
  1. +63 βˆ’1 CHANGELOG.md
  2. +39 βˆ’17 Orange/canvas/application/canvasmain.py
  3. +2 βˆ’2 Orange/canvas/application/widgettoolbox.py
  4. +0 βˆ’18 Orange/canvas/canvas/items/annotationitem.py
  5. +21 βˆ’0 Orange/canvas/document/commands.py
  6. +20 βˆ’0 Orange/canvas/document/interactions.py
  7. +74 βˆ’3 Orange/canvas/document/quickmenu.py
  8. +228 βˆ’51 Orange/canvas/document/schemeedit.py
  9. +115 βˆ’0 Orange/canvas/document/suggestions.py
  10. +15 βˆ’1 Orange/canvas/gui/quickhelp.py
  11. +9 βˆ’0 Orange/canvas/help/provider.py
  12. BIN Orange/canvas/icons/CanvasIcon.png
  13. +87 βˆ’56 Orange/canvas/icons/orange-canvas.svg
  14. BIN Orange/canvas/icons/orange.ico
  15. +24 βˆ’10 Orange/canvas/scheme/readwrite.py
  16. +26 βˆ’2 Orange/canvas/scheme/scheme.py
  17. +105 βˆ’1 Orange/canvas/scheme/widgetsscheme.py
  18. +2 βˆ’2 Orange/clustering/kmeans.py
  19. +123 βˆ’0 Orange/clustering/louvain.py
  20. +1 βˆ’0 Orange/data/__init__.py
  21. +5 βˆ’0 Orange/data/filter.py
  22. +29 βˆ’15 Orange/data/io.py
  23. +50 βˆ’1 Orange/data/pandas_compat.py
  24. +4 βˆ’2 Orange/data/sql/backend/postgres.py
  25. +8 βˆ’11 Orange/data/table.py
  26. +37 βˆ’1 Orange/data/tests/test_pandas.py
  27. +20 βˆ’3 Orange/data/tests/test_variable.py
  28. +24 βˆ’4 Orange/data/variable.py
  29. +3 βˆ’2 Orange/distance/distance.py
  30. +2 βˆ’2 Orange/preprocess/preprocess.py
  31. +2 βˆ’2 Orange/preprocess/score.py
  32. +5 βˆ’0 Orange/statistics/util.py
  33. +7 βˆ’1 Orange/tests/__init__.py
  34. +13 βˆ’0 Orange/tests/test_basic_stats.py
  35. +15 βˆ’0 Orange/tests/test_clustering_kmeans.py
  36. +69 βˆ’66 Orange/tests/test_contingency.py
  37. +29 βˆ’21 Orange/tests/test_distribution.py
  38. +2 βˆ’19 Orange/tests/test_evaluation_scoring.py
  39. +28 βˆ’1 Orange/tests/test_io.py
  40. +2 βˆ’1 Orange/tests/test_preprocess.py
  41. +12 βˆ’2 Orange/tests/test_statistics.py
  42. +11 βˆ’0 Orange/tests/test_tab_reader.py
  43. +15 βˆ’1 Orange/tests/test_value.py
  44. +30 βˆ’23 Orange/widgets/data/icons/Concatenate.svg
  45. +25 βˆ’23 Orange/widgets/data/icons/MergeData.svg
  46. +24 βˆ’0 Orange/widgets/data/icons/SelectByDataIndex.svg
  47. +1 βˆ’0 Orange/widgets/data/owconcatenate.py
  48. +1 βˆ’1 Orange/widgets/data/owcontinuize.py
  49. +1 βˆ’1 Orange/widgets/data/owcreateclass.py
  50. +1 βˆ’1 Orange/widgets/data/owdatainfo.py
  51. +1 βˆ’1 Orange/widgets/data/owdatasampler.py
  52. +1 βˆ’0 Orange/widgets/data/owdatasets.py
  53. +1 βˆ’0 Orange/widgets/data/owdiscretize.py
  54. +1,188 βˆ’478 Orange/widgets/data/oweditdomain.py
  55. +1 βˆ’0 Orange/widgets/data/owfeatureconstructor.py
  56. +10 βˆ’1 Orange/widgets/data/owfile.py
  57. +1 βˆ’0 Orange/widgets/data/owimpute.py
  58. +1 βˆ’0 Orange/widgets/data/owmergedata.py
  59. +1 βˆ’1 Orange/widgets/data/owoutliers.py
  60. +1 βˆ’1 Orange/widgets/data/owpaintdata.py
  61. +27 βˆ’20 Orange/widgets/data/owpreprocess.py
  62. +1 βˆ’1 Orange/widgets/data/owpurgedomain.py
  63. +1 βˆ’0 Orange/widgets/data/owpythonscript.py
  64. +1 βˆ’0 Orange/widgets/data/owrandomize.py
  65. +1 βˆ’0 Orange/widgets/data/owrank.py
  66. +135 βˆ’30 Orange/widgets/data/owsave.py
  67. +106 βˆ’0 Orange/widgets/data/owselectbydataindex.py
  68. +1 βˆ’0 Orange/widgets/data/owselectcolumns.py
  69. +1 βˆ’0 Orange/widgets/data/owselectrows.py
  70. +62 βˆ’24 Orange/widgets/data/owsql.py
  71. +13 βˆ’0 Orange/widgets/data/owtable.py
  72. +1 βˆ’0 Orange/widgets/data/owtranspose.py
  73. +174 βˆ’110 Orange/widgets/data/tests/test_oweditdomain.py
  74. +75 βˆ’2 Orange/widgets/data/tests/test_owfile.py
  75. +51 βˆ’42 Orange/widgets/data/tests/test_owsave.py
  76. +26 βˆ’0 Orange/widgets/data/tests/test_owselectbydataindex.py
  77. +93 βˆ’0 Orange/widgets/data/tests/test_owsql.py
  78. +1 βˆ’0 Orange/widgets/evaluate/owcalibrationplot.py
  79. +1 βˆ’0 Orange/widgets/evaluate/owconfusionmatrix.py
  80. +1 βˆ’0 Orange/widgets/evaluate/owliftcurve.py
  81. +1 βˆ’0 Orange/widgets/evaluate/owpredictions.py
  82. +68 βˆ’2 Orange/widgets/evaluate/owrocanalysis.py
  83. +1 βˆ’0 Orange/widgets/evaluate/owtestlearners.py
  84. +60 βˆ’0 Orange/widgets/evaluate/tests/test_owrocanalysis.py
  85. +31 βˆ’0 Orange/widgets/io.py
  86. +1 βˆ’0 Orange/widgets/model/owadaboost.py
  87. +1 βˆ’0 Orange/widgets/model/owconstant.py
  88. +1 βˆ’0 Orange/widgets/model/owknn.py
  89. +1 βˆ’0 Orange/widgets/model/owlinearregression.py
  90. +1 βˆ’0 Orange/widgets/model/owloadmodel.py
  91. +1 βˆ’0 Orange/widgets/model/owlogisticregression.py
  92. +1 βˆ’0 Orange/widgets/model/ownaivebayes.py
  93. +2 βˆ’0 Orange/widgets/model/owneuralnetwork.py
  94. +1 βˆ’0 Orange/widgets/model/owrandomforest.py
  95. +1 βˆ’0 Orange/widgets/model/owrules.py
  96. +1 βˆ’0 Orange/widgets/model/owsavemodel.py
  97. +1 βˆ’0 Orange/widgets/model/owsgd.py
  98. +1 βˆ’0 Orange/widgets/model/owsvm.py
  99. +1 βˆ’0 Orange/widgets/model/owtree.py
  100. +87 βˆ’56 Orange/widgets/report/icons/scheme.svg
  101. +10 βˆ’2 Orange/widgets/report/owreport.py
  102. +2 βˆ’2 Orange/widgets/report/report.py
  103. +36 βˆ’0 Orange/widgets/report/tests/test_report.py
  104. +140 βˆ’1 Orange/widgets/tests/base.py
  105. +38 βˆ’1 Orange/widgets/tests/test_io.py
  106. +43 βˆ’0 Orange/widgets/tests/test_matplotlib_export.py
  107. +1 βˆ’2 Orange/widgets/tests/test_widget.py
  108. +15 βˆ’1 Orange/widgets/tests/utils.py
  109. +25 βˆ’0 Orange/widgets/unsupervised/icons/LouvainClustering.svg
  110. +1 βˆ’0 Orange/widgets/unsupervised/owcorrespondence.py
  111. +1 βˆ’1 Orange/widgets/unsupervised/owdistancefile.py
  112. +1 βˆ’0 Orange/widgets/unsupervised/owdistancemap.py
  113. +1 βˆ’0 Orange/widgets/unsupervised/owdistancematrix.py
  114. +1 βˆ’0 Orange/widgets/unsupervised/owdistances.py
  115. +1 βˆ’0 Orange/widgets/unsupervised/owdistancetransformation.py
  116. +22 βˆ’11 Orange/widgets/unsupervised/owhierarchicalclustering.py
  117. +13 βˆ’1 Orange/widgets/unsupervised/owkmeans.py
  118. +379 βˆ’0 Orange/widgets/unsupervised/owlouvainclustering.py
  119. +1 βˆ’0 Orange/widgets/unsupervised/owmanifoldlearning.py
  120. +210 βˆ’293 Orange/widgets/unsupervised/owmds.py
  121. +1 βˆ’0 Orange/widgets/unsupervised/owpca.py
  122. +7 βˆ’0 Orange/widgets/unsupervised/tests/test_owkmeans.py
  123. +96 βˆ’0 Orange/widgets/unsupervised/tests/test_owlouvain.py
  124. +36 βˆ’35 Orange/widgets/unsupervised/tests/test_owmds.py
  125. +355 βˆ’0 Orange/widgets/utils/combobox.py
  126. +43 βˆ’4 Orange/widgets/utils/concurrent.py
  127. +11 βˆ’18 Orange/widgets/utils/filedialogs.py
  128. +46 βˆ’8 Orange/widgets/utils/itemmodels.py
  129. +215 βˆ’0 Orange/widgets/utils/matplotlib_export.py
  130. +112 βˆ’63 Orange/widgets/utils/plot/owplotgui.py
  131. +864 βˆ’0 Orange/widgets/utils/plot/owplotgui_obsolete.py
  132. +0 βˆ’180 Orange/widgets/utils/scaling.py
  133. +135 βˆ’0 Orange/widgets/utils/tests/test_combobox.py
  134. +22 βˆ’0 Orange/widgets/utils/tests/test_filedialogs.py
  135. +41 βˆ’6 Orange/widgets/utils/tests/test_itemmodels.py
  136. +8 βˆ’8 Orange/widgets/utils/webview.py
  137. +71 βˆ’30 Orange/widgets/visualize/owboxplot.py
  138. +3 βˆ’2 Orange/widgets/visualize/owdistributions.py
  139. +314 βˆ’592 Orange/widgets/visualize/owfreeviz.py
  140. +13 βˆ’3 Orange/widgets/visualize/owheatmap.py
  141. +1 βˆ’2 Orange/widgets/visualize/owlinearprojection.py
  142. +1 βˆ’0 Orange/widgets/visualize/owmosaic.py
  143. +1 βˆ’0 Orange/widgets/visualize/ownomogram.py
  144. +1 βˆ’0 Orange/widgets/visualize/owpythagorastree.py
  145. +1 βˆ’0 Orange/widgets/visualize/owpythagoreanforest.py
  146. +328 βˆ’540 Orange/widgets/visualize/owradviz.py
  147. +1 βˆ’0 Orange/widgets/visualize/owruleviewer.py
  148. +251 βˆ’141 Orange/widgets/visualize/owscatterplot.py
  149. +992 βˆ’670 Orange/widgets/visualize/owscatterplotgraph.py
  150. +1,506 βˆ’0 Orange/widgets/visualize/owscatterplotgraph_obsolete.py
  151. +1 βˆ’0 Orange/widgets/visualize/owsieve.py
  152. +21 βˆ’6 Orange/widgets/visualize/owsilhouetteplot.py
  153. +1 βˆ’0 Orange/widgets/visualize/owtreeviewer.py
  154. +1 βˆ’0 Orange/widgets/visualize/owvenndiagram.py
  155. +58 βˆ’5 Orange/widgets/visualize/tests/test_owboxplot.py
  156. +20 βˆ’66 Orange/widgets/visualize/tests/test_owfreeviz.py
  157. +14 βˆ’0 Orange/widgets/visualize/tests/test_owheatmap.py
  158. +32 βˆ’9 Orange/widgets/visualize/tests/test_owlinearprojection.py
  159. +9 βˆ’27 Orange/widgets/visualize/tests/test_owradviz.py
  160. +53 βˆ’64 Orange/widgets/visualize/tests/test_owscatterplot.py
  161. +42 βˆ’14 Orange/widgets/visualize/tests/test_owsilhouetteplot.py
  162. +1 βˆ’3 Orange/widgets/visualize/utils/__init__.py
  163. +115 βˆ’0 Orange/widgets/visualize/utils/component.py
  164. +187 βˆ’2 Orange/widgets/visualize/utils/plotutils.py
  165. +107 βˆ’32 Orange/widgets/widget.py
  166. +11 βˆ’12 appveyor.yml
  167. +1 βˆ’0 conda-recipe/meta.yaml
  168. BIN distribute/icon-256.png
  169. BIN distribute/icon-48.png
  170. +88 βˆ’216 distribute/orange-canvas.svg
  171. +2 βˆ’0 doc/visual-programming/source/index.rst
  172. +25 βˆ’34 doc/visual-programming/source/widgets/data/datasampler.rst
  173. +7 βˆ’21 doc/visual-programming/source/widgets/data/editdomain.rst
  174. +1 βˆ’1 doc/visual-programming/source/widgets/data/file.rst
  175. BIN doc/visual-programming/source/widgets/data/icons/select-by-data-index.png
  176. BIN doc/visual-programming/source/widgets/data/images/DataSampler-Example-OverUnderSampling.png
  177. BIN doc/visual-programming/source/widgets/data/images/DataSampler-Example.png
  178. BIN doc/visual-programming/source/widgets/data/images/DataSampler-Example1.png
  179. BIN doc/visual-programming/source/widgets/data/images/DataSampler-Example2.png
  180. BIN doc/visual-programming/source/widgets/data/images/DataSampler-stamped.png
  181. BIN doc/visual-programming/source/widgets/data/images/EditDomain-Example.png
  182. BIN doc/visual-programming/source/widgets/data/images/EditDomain-stamped.png
  183. BIN doc/visual-programming/source/widgets/data/images/EditDomain.png
  184. BIN doc/visual-programming/source/widgets/data/images/Preprocess-Example.png
  185. BIN doc/visual-programming/source/widgets/data/images/Preprocess-Example1.png
  186. BIN doc/visual-programming/source/widgets/data/images/Preprocess-cont.png
  187. BIN doc/visual-programming/source/widgets/data/images/Preprocess1-stamped.png
  188. BIN doc/visual-programming/source/widgets/data/images/Preprocess2-stamped.png
  189. BIN doc/visual-programming/source/widgets/data/images/SQLTable-Example.png
  190. BIN doc/visual-programming/source/widgets/data/images/SQLTable-stamped.png
  191. BIN doc/visual-programming/source/widgets/data/images/Select-by-Data-Index-Example1.png
  192. BIN doc/visual-programming/source/widgets/data/images/Select-by-Data-Index-stamped.png
  193. BIN doc/visual-programming/source/widgets/data/images/preprocess-stamped.png
  194. BIN doc/visual-programming/source/widgets/data/images/sql.png
  195. +48 βˆ’37 doc/visual-programming/source/widgets/data/preprocess.rst
  196. +1 βˆ’1 doc/visual-programming/source/widgets/data/pythonscript.rst
  197. +1 βˆ’1 doc/visual-programming/source/widgets/data/rank.rst
  198. +35 βˆ’0 doc/visual-programming/source/widgets/data/select-by-data-index.rst
  199. +1 βˆ’1 doc/visual-programming/source/widgets/data/selectcolumns.rst
  200. +49 βˆ’5 doc/visual-programming/source/widgets/data/sqltable.rst
  201. +1 βˆ’1 doc/visual-programming/source/widgets/evaluation/calibrationplot.rst
  202. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-DataTable.png
  203. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-Example1.png
  204. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-Example2.png
  205. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-ExampleScatterplot.png
  206. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-Schema.png
  207. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions-stamped.png
  208. BIN doc/visual-programming/source/widgets/evaluation/images/Predictions.png
  209. +29 βˆ’55 doc/visual-programming/source/widgets/evaluation/predictions.rst
  210. +1 βˆ’1 doc/visual-programming/source/widgets/model/linearregression.rst
  211. +1 βˆ’1 doc/visual-programming/source/widgets/model/loadmodel.rst
  212. +1 βˆ’1 doc/visual-programming/source/widgets/model/randomforest.rst
  213. +1 βˆ’1 doc/visual-programming/source/widgets/unsupervised/PCA.rst
  214. +1 βˆ’1 doc/visual-programming/source/widgets/unsupervised/distancetransformation.rst
  215. BIN doc/visual-programming/source/widgets/unsupervised/images/Louvain-Example.png
  216. BIN doc/visual-programming/source/widgets/unsupervised/images/Louvain-stamped.png
  217. +45 βˆ’0 doc/visual-programming/source/widgets/unsupervised/louvainclustering.rst
  218. +1 βˆ’1 doc/visual-programming/source/widgets/unsupervised/manifoldlearning.rst
  219. +1 βˆ’1 doc/visual-programming/source/widgets/unsupervised/mds.rst
  220. +1 βˆ’1 doc/visual-programming/source/widgets/visualize/cn2ruleviewer.rst
  221. +1 βˆ’1 doc/visual-programming/source/widgets/visualize/distributions.rst
  222. +2 βˆ’2 doc/visual-programming/source/widgets/visualize/pythagoreanforest.rst
  223. +2 βˆ’1 doc/visual-programming/source/widgets/visualize/scatterplot.rst
  224. +6 βˆ’5 doc/visual-programming/source/widgets/visualize/silhouetteplot.rst
  225. +1 βˆ’1 doc/visual-programming/source/widgets/visualize/treeviewer.rst
  226. +2 βˆ’0 requirements-core.txt
  227. +1 βˆ’2 requirements-gui.txt
  228. +37 βˆ’17 scripts/macos/create-dmg-installer.sh
  229. BIN scripts/macos/dmg-resources/VolumeIcon.icns
  230. +8 βˆ’1 scripts/macos/python-framework.sh
  231. +1 βˆ’0 scripts/macos/requirements.txt
  232. +47 βˆ’19 scripts/macos/sign-app.sh
  233. +99 βˆ’0 scripts/macos/sign-dmg.sh
  234. BIN scripts/macos/skeleton.app/Contents/Resources/orange.icns
  235. BIN scripts/macos/skeleton.app/Contents/Resources/schema.icns
  236. BIN scripts/windows/Orange.ico
  237. BIN scripts/windows/OrangeInstall.ico
  238. BIN scripts/windows/OrangeOWS.ico
  239. +1 βˆ’1 scripts/windows/build-conda-installer.sh
  240. +1 βˆ’1 scripts/windows/build-win-installer.sh
  241. +1 βˆ’0 scripts/windows/specs/PY34-win32.txt
  242. +1 βˆ’1 setup.py
@@ -6,6 +6,66 @@ Change Log
* ...


[3.16.0] - 2018-09-14
--------------------
##### Enhancements
* ROC analysis: show thresholds ([#3172](../../pull/3172))
* Edit Domain: Record transformations ([#3231](../../pull/3231))
* Data Table: Enable deselection ([#3189](../../pull/3189))
* Empty helper pane message ([#3210](../../pull/3210))
* Matplotlib output for Scatter plot ([#3134](../../pull/3134))
* Scatterplot: indicate overlap of points. ([#3177](../../pull/3177))
* Selection of format and compression in save data widget ([#3147](../../pull/3147))
* OWBoxPlot: add option to sort discrete distributions by size ([#3156](../../pull/3156))
* Table: speed-up computation of basic stats of given columns. ([#3166](../../pull/3166))
* Canvas: 'Window Groups' continued ([#3085](../../pull/3085))
* Combo Box Search Filter ([#3014](../../pull/3014))
* Widget Insertion ([#3179](../../pull/3179))

##### Bugfixes
* Documentation fetching with redirects ([#3248](../../pull/3248))
* DiscreteVariable reconstruction ([#3242](../../pull/3242))
* io: Handle mismatched number of header/data values ([#3237](../../pull/3237))
* OWNeuralNetwork model pickling ([#3230](../../pull/3230))
* Variable: Prevent hashing of Values of DiscreteVariable. ([#3217](../../pull/3217))


[3.15.0] - 2018-08-06
--------------------
##### Enhancements
* Silhouette Plot: Add cosine distance ([#3176](../../pull/3176))
* Add pandas_compat.table_to_frame(tab) ([#3180](../../pull/3180))
* OWSelectByDataIndex: New widget (move from Prototypes) ([#3181](../../pull/3181))
* Make filters available in Orange.data namespace. ([#3170](../../pull/3170))
* Move Louvain clustering from prototypes to core ([#3111](../../pull/3111))
* OWWidget: Collapse/expand the widget on control area toggle ([#3146](../../pull/3146))
* Rank: SklScorer should use the faster SklImputer. ([#3164](../../pull/3164))
* RecentFiles: Check for missing file in workflow dir ([#3064](../../pull/3064))
* Smart widget suggestions ([#3112](../../pull/3112))
* Match Keywords in Widget Search ([#3117](../../pull/3117))
* io: Speedup write_data ([#3115](../../pull/3115))
* OWEditDomain: Enable reordering of discrete variables ([#3119](../../pull/3119))

##### Bugfixes
* oweditdomain: Fix an IndexError when all rows are deselected ([#3183](../../pull/3183))
* OWFreeViz: fix class density size ([#3158](../../pull/3158))
* OWBoxPlot: Fix empty continuous contingency check ([#3165](../../pull/3165))
* OWSql: enforce data download for non PostgreSQL databases ([#3178](../../pull/3178))
* owlouvainclustering: Make the task completion handler a single slot ([#3182](../../pull/3182))
* OWReport: disable save and print on empty report ([#3175](../../pull/3175))
* RemoveConstant: remove constant NaN features. ([#3163](../../pull/3163))
* utils/concurrent: Switch default thread pool ([#3138](../../pull/3138))
* OWBoxPlot: Fix quartiles computation ([#3159](../../pull/3159))
* OWBoxPlot: Plot axis labels and quartiles label layout ([#3162](../../pull/3162))
* [RFC] OWHeatMap: remove empty clusters from visualization ([#3155](../../pull/3155))
* report: Fix the number of hidden rows. ([#3150](../../pull/3150))
* [RFC] KMeans upgrade sparse support ([#3140](../../pull/3140))
* WebView fixes ([#3148](../../pull/3148))
* ci/appveyor: Update test dependencies ([#3139](../../pull/3139))
* Replace use of obsolete QStyle.standardPixmap ([#3127](../../pull/3127))
* BoxPlot: Hide groups with no instances ([#3122](../../pull/3122))


[3.14.0] - 2018-07-04
--------------------
##### Enhancements
@@ -865,7 +925,9 @@ Change Log
* Initial version based on Python 1.5.2 and Qt 2.3


[next]: https://github.com/biolab/orange3/compare/3.14.0...HEAD
[next]: https://github.com/biolab/orange3/compare/3.16.0...HEAD
[3.16.0]: https://github.com/biolab/orange3/compare/3.15.0...3.16.0
[3.15.0]: https://github.com/biolab/orange3/compare/3.14.0...3.15.0
[3.14.0]: https://github.com/biolab/orange3/compare/3.13.0...3.14.0
[3.13.0]: https://github.com/biolab/orange3/compare/3.12.0...3.13.0
[3.12.0]: https://github.com/biolab/orange3/compare/3.11.0...3.12.0
@@ -273,6 +273,12 @@ def touch():
self.dock_help = canvas_tool_dock.help
self.dock_help.setMaximumHeight(150)
self.dock_help.document().setDefaultStyleSheet("h3, a {color: orange;}")
default_help = "Select a widget to show its description." \
"<br><br>" \
"See <a href='orange://examples'>workflow examples</a>, " \
"<a href='orange://tutorials'>YouTube tutorials</a>, " \
"or open the <a href='orange://welcome'>welcome screen</a>."
self.dock_help.setDefaultText(default_help)

self.dock_help_action = canvas_tool_dock.toogleQuickHelpAction()
self.dock_help_action.setText(self.tr("Show Help"))
@@ -460,15 +466,15 @@ def setup_actions(self):
)

self.tutorials_action = \
QAction(self.tr("Tutorials"), self,
QAction(self.tr("YouTube Tutorials"), self,
objectName="tutorials-action",
toolTip=self.tr("View YouTube tutorials."),
triggered=self.tutorials,
icon=canvas_icons("YouTube.svg")
)

self.examples_action = \
QAction(self.tr("Examples"), self,
QAction(self.tr("Workflow Examples"), self,
objectName="tutorial-action",
toolTip=self.tr("Browse example workflows."),
triggered=self.tutorial_scheme,
@@ -688,7 +694,7 @@ def setup_menu(self):
window_groups = self.scheme_widget.findChild(
QAction, "window-groups-action"
)
if isinstance(window_groups, QAction):
if window_groups is not None:
self.view_menu.addAction(window_groups)

self.view_menu.addSeparator()
@@ -704,6 +710,12 @@ def setup_menu(self):
self.view_menu.addSeparator()

self.view_menu.addAction(self.toogle_margins_action)
raise_widgets_action = self.scheme_widget.findChild(
QAction, "bring-widgets-to-front-action"
)
if raise_widgets_action is not None:
self.view_menu.addAction(raise_widgets_action)

self.view_menu.addAction(self.float_widgets_on_top_action)
menu_bar.addMenu(self.view_menu)

@@ -1099,6 +1111,9 @@ def load_scheme(self, filename):
scheme_doc_widget.setPath(filename)

self.add_recent_scheme(new_scheme.title, filename)
if not self.freeze_action.isChecked():
# activate the default window group.
scheme_doc_widget.activateDefaultWindowGroup()

def load_scheme_xml(self, xml):
new_scheme = widgetsscheme.WidgetsScheme(parent=self)
@@ -1316,6 +1331,7 @@ def save_scheme_to(self, scheme, filename):
# existing scheme file if `scheme.save_to` raises an error.
buffer = BytesIO()
try:
scheme.set_runtime_env("basedir", dirname)
scheme.save_to(buffer, pretty=True, pickle_fallback=True)
except Exception:
log.error("Error saving %r to %r", scheme, filename, exc_info=True)
@@ -1331,7 +1347,6 @@ def save_scheme_to(self, scheme, filename):
try:
with open(filename, "wb") as f:
f.write(buffer.getvalue())
scheme.set_runtime_env("basedir", dirname)
return True
except (IOError, OSError) as ex:
log.error("%s saving '%s'", type(ex).__name__, filename,
@@ -1522,12 +1537,13 @@ def open_examples():
)

examples_action = \
QAction(self.examples_action.text(), dialog,
icon=self.examples_action.icon(),
toolTip=self.examples_action.toolTip(),
whatsThis=self.examples_action.whatsThis(),
triggered=open_examples,
QAction(self.tr("Examples"), self,
icon=canvas_icons("Examples.svg"),
toolTip=self.tr("Browse example workflows."),
objectName="tutorial-action",
triggered=open_examples
)

tutorials_action = \
QAction(self.tr("Tutorials"), self,
objectName="tutorials-action",
@@ -1913,16 +1929,22 @@ def event(self, event):
if url.scheme() == "help" and url.authority() == "search":
try:
url = self.help.search(url)
self.show_help(url)
except KeyError:
url = None
log.info("No help topic found for %r", url)

if url:
self.show_help(url)
else:
message_information(
self.tr("There is no documentation for this widget yet."),
parent=self)
message_information(
self.tr("There is no documentation for this widget yet."),
parent=self)
elif url.scheme() == "orange":
target = url.host()
if target == "examples":
self.tutorial_scheme()
elif target == "tutorials":
self.tutorials()
elif target == "welcome":
self.welcome_dialog()
else:
log.error("No target found for %r", url)

return True

@@ -419,7 +419,7 @@ def __on_rowsInserted(self, parent, start, end):
Items have been inserted in the model.
"""
# Only the top level items (categories) are handled here.
if not parent is not None:
if parent is None:
root = self.__model.invisibleRootItem()
for i in range(start, end + 1):
item = root.child(i)
@@ -430,6 +430,6 @@ def __on_rowsRemoved(self, parent, start, end):
Rows have been removed from the model.
"""
# Only the top level items (categories) are handled here.
if not parent is not None:
if parent is None:
for i in range(end, start - 1, -1):
self.removeItem(i)
@@ -4,7 +4,6 @@
from xml.sax.saxutils import escape

import docutils.core
import CommonMark

from AnyQt.QtWidgets import (
QGraphicsItem, QGraphicsPathItem, QGraphicsWidget, QGraphicsTextItem,
@@ -175,22 +174,6 @@ def render_html(content):
return content


def render_markdown(content):
"""
Return a html fragment from markdown text content
Parameters
----------
content : str
A markdown formatted text
Returns
-------
html : str
"""
return CommonMark.commonmark(content)


def render_rst(content):
"""
Return a html fragment from a RST text content
@@ -236,7 +219,6 @@ class TextAnnotation(Annotation):
ContentRenderer = OrderedDict([
("text/plain", render_plain),
("text/rst", render_rst),
("text/markdown", render_markdown),
("text/html", render_html),
]) # type: Dict[str, Callable[[str], [str]]]

@@ -69,6 +69,27 @@ def undo(self):
self.scheme.add_link(self.link)


class InsertNodeCommand(QUndoCommand):
def __init__(self, scheme, new_node, old_link, new_links, parent=None):
QUndoCommand.__init__(self, "Insert widget into link", parent)
self.scheme = scheme
self.inserted_widget = new_node
self.original_link = old_link
self.new_links = new_links

def redo(self):
self.scheme.add_node(self.inserted_widget)
self.scheme.remove_link(self.original_link)
self.scheme.add_link(self.new_links[0])
self.scheme.add_link(self.new_links[1])

def undo(self):
self.scheme.remove_link(self.new_links[0])
self.scheme.remove_link(self.new_links[1])
self.scheme.add_link(self.original_link)
self.scheme.remove_node(self.inserted_widget)


class AddAnnotationCommand(QUndoCommand):
def __init__(self, scheme, annotation, parent=None):
QUndoCommand.__init__(self, "Add annotation", parent)
@@ -80,6 +80,7 @@ def __init__(self, document, parent=None, deleteOnEnd=True):
self.document = document
self.scene = document.scene()
self.scheme = document.scheme()
self.suggestions = document.suggestions()
self.deleteOnEnd = deleteOnEnd

self.cancelOnEsc = False
@@ -428,6 +429,7 @@ def mouseReleaseEvent(self, event):
else:
source_node = node
sink_node = self.scene.node_for_item(self.sink_item)
self.suggestions.set_direction(self.direction)
self.connect_nodes(source_node, sink_node)

if not self.isCanceled() or not self.isFinished() and \
@@ -458,6 +460,15 @@ def is_compatible(source, sink):
if self.direction == self.FROM_SINK:
# Reverse the argument order.
is_compatible = reversed_arguments(is_compatible)
suggestion_sort = self.suggestions.get_source_suggestions(from_desc.name)
else:
suggestion_sort = self.suggestions.get_sink_suggestions(from_desc.name)

def sort(left, right):
# list stores frequencies, so sign is flipped
return suggestion_sort[left] > suggestion_sort[right]

menu.setSortingFunc(sort)

def filter(index):
desc = index.data(QtWidgetRegistry.WIDGET_DESC_ROLE)
@@ -776,6 +787,15 @@ def create_new(self, pos, search_text=""):
menu = self.document.quickMenu()
menu.setFilterFunc(None)

# compares probability of the user needing the widget as a source
def defaultSort(left, right):
default_suggestions = self.suggestions.get_default_suggestions()
left_frequency = sum(default_suggestions[left].values())
right_frequency = sum(default_suggestions[right].values())
return left_frequency > right_frequency

menu.setSortingFunc(defaultSort)

action = menu.exec_(pos, search_text)
if action:
item = action.property("item")
Oops, something went wrong.

0 comments on commit 9045f49

Please sign in to comment.
You can’t perform that action at this time.