~ubuntu-branches/ubuntu/trusty/guiqwt/trusty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
== Version 2.2.1 ==

=== New features (since v2.2.0) ===

  * Added support for plot items serialization/deserialization to/from HDF5:
    * See `save_item`, `load_item`, `save_items` and `load_items` functions in `guiqwt.io`
    * io.save_item/load_item (HDF5): None can be saved/loaded instead of a real item
    * See `serialize` (save to) and `deserialize` (load from) methods in plot objects (save all items) or plot item objects
    * See the new test `loadsaveitems_hdf5.py`
  * builder/images: added option 'center_on' to center image data on point of coordinates 'center_on' (tuple)
  * Flip/Rotate widget/dialog: added method 'set_parameters' to set default transform parameters
  * guiqwt.tools.SignalStatsTool.move: added X range to label
  * BaseCurveWidget/BaseImageWidget: added argument `curve_antialiasing` to switch on/off the curve antialiasing feature (this option may be passed to CurveWidget, CurveDialog, ImageWidget or ImageDialog through the `options` dictionary)
  * (Issue 29) Added test 'customize_shape_tool.py' to demonstrate how easy it is to customize a shape created with a tool like RectangleTool, EllipseTool, etc.
  * (Issue 37) Plot axis widget: added support for mouse double-click to set the axis range

=== Possible API compatibility issues (since v2.2.0) ===

  * guiqwt now requires Python 2.6 (Python 2.5 support has been dropped)
  * `guiqwt.io` module: file type filters are now sorted depending on data types
    * `iohandler.load_filters` and `iohandler.save_filters` properties have been replaced by a method `iohandler.get_filters`:
      * iohandler.load_filter --> iohandler.get_filters('load')
      * iohandler.save_filter --> iohandler.get_filters('save')
  * guidata.hdf5io.HDF5Reader.read: argument 'dataset' was renamed to 'instance'
  * MaskedImageItem: masked_areas attribute is now a list of MaskedArea objects (so that MaskedImageItem objects serialization is easier to implement)
  * Removed deprecated tools DuplicateCurveTool and DeleteCurveTool

=== Bug fixes (since v2.2.0) ===

  * MaskedImageItem/bugfix: fixed rounding error when applying mask to item
  * io.imread: drastically reduced loading time with PIL.Image
  * RGB images support: fixed vertical orientation issue
  * Fixed memory leaks in selection tool, image/curve stats tools and contrast tool
  * Curve plot: setting axis scale of both X and Y axes at the same time was not working
  * Issue 27: fixed FTBFS on kfreebsd due to Werror flag (patch from Frédéric Picca)
  * FreeFormTool/MultiLineTool: fixed warning when clicking the first two points if these two points are at the exact same position (happened only when creating such a shape on an empty canvas)
  * Fixed "Edit data..." tool: `oedit` function returns None when dialog is canceled or an array when it's validated (fixed "truth value" error)
  * (Issue 32) pyplot/better compatibility with Matplotlib: `plot` now accepts lists instead of NumPy arrays
  * (Issue 33) tools.LoadItemsTool: parent constructor was not called
  * (Issue 36) plot.PlotManager: fixed typo when setting the plot manager to `plot_id`

----

== Version 2.2.0 ==

=== New features (since v2.1.6) ===

  * Added scaler module: resize function (using scaler C++ engine to resize images) which is incredibly faster than scipy.misc.imresize
  * `guiqwt.io` module was rewritten: new extensible I/O functions `imwrite`/`imread` (see section 'Possible API compatibility issues')
  * !SelectTool:
    * added Undo/Redo actions (triggered by platform's standard key sequences)
    * "Select all" action is now triggered by platform's standard key sequence
  * Added 'get_segment' test (analog to 'get_point')
  * Interactive tools: added argument 'switch_to_default_tool' (if True, when tool action is finished, plot manager will automatically switch to the default tool)
  * Added `label.!RangeInfo` object: showing !XRangeSelection shape informations (x, dx) in a label. See associated method 'range_info_label' in 'builder.make' singleton and unit test in 'tests/computations.py'.
  * Snapshot tool: added an option to apply (or not) the interpolation algorithm
  * `guiqwt.pyplot`: selecting default item type, hence allowing to use directly tools when there is only one curve/image without having to select it before
  * Added new guiqwt svg logo
  * Added new dialogs and widgets for manipulating (multiple) images:
    * Rotate&Crop dialog, widget and tool (+ test) for !TrImageItem plot items
    * Flip&Rotate dialog and widget
  * `pyplot.imshow`: added interpolation option ('nearest', 'linear', 'antialiasing')
  * `io.imagefile_to_array`: added support for 16-bit Tiff with !PhotoInterpretation=1
  * !ResizeDialog: added option "keep original size" to bypass this dialog
  * !RectangularActionTool: added option 'fix_orientation' (default: False, but set to True for the !SnapshotTool)

=== Possible API compatibility issues (since v2.1.6) ===

  * `guiqwt.io` module was rewritten -- potential API breaks:
    * `imagefile_to_array` --> `imread`
    * `array_to_imagefile` --> `imwrite`
    * `array_to_dicomfile` --> `imwrite`
    * `IMAGE_LOAD_FILTERS` --> `iohandler.load_filters`
    * `IMAGE_SAVE_FILTERS` --> `iohandler.save_filters`
    * `set_dynamic_range_from_dtype` --> `scale_data_to_dtype`

  * Created `guiqwt.widgets` package to regroup !ResizeDialog and !RotateCropDialog/Widget
  * Moved module `guiqwt.fit` to `guiqwt.widgets` package

=== Bug fixes (since v2.1.6) ===

  * `guiqwt.geometry` : fixed zero division error in `compute_angle` function
  * Fixed minimum value for histogram display
  * Fixed Issue 16: use double precision for point baseclass
  * Fixed rounding error in image.assemble_imageitems: concerns the snapshot tool, and the new rotate/crop dialog box (Rotate/Crop dialog: added a specific test checking if exported image is exactly identical to the original image when the cropping rectangle has the same size and position as the image below -- see rotatecrop.py test script).
  * scaler: linear interpolation was inactive on image edges (first/last col/row)
  * !ImagePlot widget: fixed aspect ratio when showing the widget for the first time
  * Events/Hit test:
    * Plot item: fixed !AttributeError with cursors (when clicking on the canvas with no current active item)
    * Curve item: avoid showing dividing by zero warning
  * tools.!SnapshotTool:
    * now fixing ROI orientation to avoid the negative size issue
    * now handling out of memory errors for big images

----

== Version 2.1.6 ==

=== Other changes (since v2.1.5) ===

  * guiqwt.pyplot.savefig:
    * added support for all image types supported by Qt (JPEG, TIFF, PNG, ...)
    * first argument (`fname`) may now be a file-like object (e.g. !StringIO)
  * guiqwt.baseplot/curve: added stepsize in `set_axis_limits` and removed from `set_axis_ticks`
  * guiqwt.image:
    * !QuadGridItem: allow set_data to update X,Y along with Z
    * new item !PolygonMapItem: PolygonMapItem is intended to display maps i.e. items containing several hundreds of independent polygons
  * guiqwt.builder.make.error: added options 'errorbarwidth', 'errorbarcap', 'errorbarmode' and 'errorbaralpha' (avoid having to tweak the ErrorBarParam to customize these settings)
  * guiqwt.pyplot/pydicom: avoid the annoying warning message about the DICOM dictionnary revert
  * guiqwt.tools:
    * !EditItemDataTool: new tool for editing displayed curve/image data using a GUI-based array editor (this feature requires the `spyderlib` library)

=== Bug fixes (since v2.1.5) ===

  * !ErrorBarCurveItem (error bar curves):
    * now handling NaNs uncertainties properly
    * handling runtime warnings that could end badly in draw method (example: transforming a zero in log scale)
  * Annotations/pickle bugfix: a !QString (instead of unicode) was pickled for annotation title, hence leading to compatiblity issues with !PyQt API v2
  * guiqwt.io.array_to_dicomfile: fixed value representation error for smallest/largest pixel value parameters
  * guiqwt.resizedialog.is_edit_valid: fixed compatibility issue with !PyQt API v2
  * Sift: upgraded deployment script for compatibility with guidata v1.4+
  * geometry.colvector: fixed major regression in coordinates calculations (significative impact on !TrImageItem related features)

----

== Version 2.1.5 ==

=== Other changes (since v2.1.4) ===

  * guiqwt.io: added function 'eliminate_outliers' to cut image levels histogram (previously available only for display)
  * baseplot: added method 'copy_to_clipboard' + tools: added CopyToClipboardTool (copy canevas window to clipboard)

----

== Version 2.1.4 ==

Since this version, `guiqwt` is compatible with !PyQt4 API #1 *and* API #2.
Please read carefully the coding guidelines which have been recently added to 
the documentation.

=== Bug fixes (since v2.1.3) ===

  * Sift/bugfix: difference/division operations were performed backwards (s001-s000 instead of s000-s001)
  * Sift: working directory is now changed after opening/saving signal/image
  * label.!RangeComputation: fixed bug if compute function was returning more than one result and when X-range was empty (e.g. selection is outside curve X-axis values)
  * curve.!CurvePlot: fixed pan/zoom erratic behavior for curves associated with log-scale axes
  * baseplot.!BasePlot: now performing an autoscale after changing axis lin/log scale (set_axis_scale/set_scales)
  * annotations.!AnnotatedSegment/CRITICAL: fixed an error (introduced in v2.1.0) when computing segment length (returned length was twice lower than the real value)
  * image.XYImageItem (Contributor: Carlos Pascual): fixed bug when Y-axis array is of dimension Ni+1 (where Ni is the number of rows of the image pixel data array)
  * Fixed compatiblity issues with !PyQt v4.4 (Contributor: Carlos Pascual)
  * (minor) Fixed label text (too long) of 2D-Histogram items background color in shown !DataSet
  * guiqwt.io.array_to_dicomfile/bugfix: Smallest/!LargestImagePixelValue fields had wrong type (str instead of int)
  * !LabelTool: label was not moved as expected (default: now, label is *not* attached to canvas)
  * tools.!ImageStatsTool/bugfix: image title was not shown
  * !CurvePlot: autoscale for log scales / bugfix: handling zero values
  * tools.!AxisScaleTool/bugfix: when updating its status, the tool was setting the axes scales even when not necessary, hence causing an autoscale since changeset 1159 (687e22074f8d)
  * !ItemCenterTool was not working as expected when centering annotated shapes having a specific transform matrix
  * XYImageItem objects: re-added cross-section support (removed accidently)
  * Curve autoscale method (curve.!CurvePlot/!ErrorBarCurvePlot):
    * now handles non-finite values (!NaNs and infs)
    * logarithmic scales: now excludes zero/negative values to avoid confusing the autoscale algorithm

=== Possible API compatibility issues (since v2.1.3) ===

  * Moved functions from guiqwt.io to new module guiqwt.qthelpers: exec_image_save_dialog, exec_image_open_dialog, exec_images_open_dialog
  * Markers:
    * label and constraint callbacks take now 2 arguments (the marker's coordinates) instead of 3
    * removed method 'move_point_to': use new method 'set_pos' instead (takes two arguments: x, y)
  * Removed cursors introduced in v2.1.0:
    * These cursors have been replaced by shapes.Marker (i.e. objects derived from !QwtPlotMarker)
    * Removed signals.SIG_CURSOR_MOVED, shapes.!HorizontalCursor, shapes.!VerticalCursor, annotations.AnnotatedHCursor, annotations.AnnotatedVCursor and associated builder methods (annotated_vcursor, annotated_hcursor)
    * Builder methods vcursor and hcursor were slightly changed (see tests/cursors.py to adapt your code)
    * Use markers instead of cursors (and SIG_MARKER_CHANGED instead of SIG_CURSOR_MOVED -- arguments are not identical, see signals.py):
      * base object: shapes.Marker
      * associated builder methods: marker, vcursor, hcursor, xcursor (see tests/cursors.py)
  * label.!LabelItem: renamed method 'set_position' to 'set_pos' (consistency with shapes.!PointShape, ...)
  * Annotations:
    * method `get_center` now returns coordinates *without* applying the transform matrix, i.e. in pure plot coordinates
    * the following methods were renamed to highlight the fact that the transform matrix is applied in those computations:
      * `get_center` was renamed to `get_tr_center`
      * `get_size` was renamed to `get_tr_size`
      * `get_angle` was renamed to `get_tr_angle`
      * `get_diameter` was renamed to `get_tr_diameter`
      * `get_length` was renamed to `get_tr_length`
  * Removed the following deprecated classes in `guiqwt.plot`:
      * !CurvePlotWidget (renamed to !CurveWidget)
      * !CurvePlotDialog (renamed to !CurveDialog)
      * !ImagePlotWidget (renamed to !ImageWidget)
      * !ImagePlotDialog (renamed to !ImageDialog)

=== Other changes (since v2.1.3) ===

  * Added module qthelpers: image open/save dialog helpers (moved from guiqwt.io to avoid using GUIs in this module)
  * Annotation/default style: changed string formatting from '%d' to '%.1f'
  * baseplot.!BasePlot.add_item: when adding the same item twice, printing a warning message
  * Using new guidata.qt !PyQt4->!PySide transitional package
  * Sift: ROI extraction ("Crop"-->"ROI extraction" + added the same feature for signals), added "swap axes" operation for signals/images, added "normalize" processing for signals only
  * Sift: added linear calibration (signals: X/Y axes, images: Z axis)
  * Interactive tools: added signal SIG_TOOL_JOB_FINISHED emitted when tool has finished its job + if SWITCH_TO_DEFAULT_TOOL class attribute is True, switching to the default interactive tool
  * Buider: added cross cursor and marker constructors (builder.make.marker and builder.make.xcursor, see tests/cursors.py)
  * Added !SignalStatsTool (standard curve tool) to show ymin, ymax, ymean, ... on a selected curve ROI
  * Sift: added support for curve data with error bars (I/O + operations + processing)
  * Added coding guidelines to the documentation
  * builder/make.computation/computation2d: added title option (defaults to object's (curve or image) label)
  * plot.!CurvePlot, plot.!CurveWidget: added keyword arguments 'xunit' and 'yunit' to set axes units (same syntax as labels)
  * plot.!ImagePlot, plot.!ImageWidget: added keyword arguments 'xunit', 'yunit' and 'zunit' to set axes units (same syntax as labels)
  * pyplot.imshow: added keyword argument 'mask' to support masked arrays display

----

== Version 2.1.3 ==

=== Bug fixes (since v2.1.2) ===

  * tools.!RectangularActionTool: removed unnecessary calls to setup_shape_appearance
  * tools.!ImageStatsTool/!CrossSectionTool.setup_shape / bugfix: parent method was not called
  * Sift/bugfix: Spyder's internal shell was not parented -- this was causing issues with spyderlib v2.0.11
  * Cross section/auto refresh toggle button: do not refresh plot if disabling the auto refresh mode
  * (Fixes Issue 14) tools.!CommandTool: docstring was translated from french
  * (Fixes Issue 13) Fixed precision/string formatting issue: switched from '%f' to '%g' (on-curve labels, ...)

=== Possible API compatibility issues (since v2.1.2) ===

  * baseplot.!BasePlot.get_selected_items: added argument 'z_sorted' in first position (like in get_items)

=== Other changes (since v2.1.2) ===

  * added *this* changelog
  * baseplot/plot axes styles: added support for physical unit
  * annotations/attached label: added automatic axes unit support
  * annotations: added support for measurement relative uncertainty
  * fit/Fit param widgets: added suffix label + code cleaning
  * guiqwt.io/sift: open/save image dialog code refactoring
  * tools.!ExportItemDataTool: added support for images
  * Added tool !ItemCenterTool: center objects (rectangle, ellipse and their annotated counterparts)
  * Cross section panel: when a cross section shape has been removed, clearing cross section curve before removing it (notify other panels)
  * Cross sections/update_plot: added option 'refresh' (default: True) --> we do not want to refresh the cross section panel systematically after registering a new shape
  * Annotations/annotationparam: added 'readonly' and 'private' options (bugfix: these parameters are now pickled correctly for shapes)

----

== Version 2.1.2 ==

=== Bug fixes (since v2.1.1) ===

  * 1D Computations: now support error bar curves as well as simple curves
  * test_line test: this test should have been excluded from test list + it should be possible to import it without executing it... fixed!

=== Other changes (since v2.1.1) ===

  * guiqwt.fit: code cleaning / reimplementing !FitParam.create_widgets is now supported

----

== Version 2.1.1 ==

=== Bug fixes (since v2.1.0) ===

  * Distributed source package: unwanted Sift build/dist files were eventually included in the package
  * setup.py: fixed sphinx !ImportError issue when building autodoc from source package (not finding the just built extension module)
  * !ErrorBarCurveItem/bugfix: did not support empty data
  * Cross section panel: do not compute cross section each time a plot item is added/deleted
  * annotations/Annotated cursor: couple of bugfixes + label color is changed when selecting/unselecting annotation
  * annotations/tools: code cleaning + minor bugfixes (styles were not applied as expected)
  * scaler.cpp/bugfix for float source images: values were converted to integers
  * Sift/arbitrary rotation: added option "reshape" (default: True)
  * Fix building the f90 extension on some systems
  * Curve plots: fixed autoscale behavior for logarithmic scales
  * fit/bugfix: when the fit params number was not a multiple of the layout column count, the last parameters were not shown

=== Other changes (since v2.1.0) ===

  * shapes: added !ObliqueRectangleShape
  * tools: added !ObliqueRectangleTool and !AnnotatedObliqueRectangleTool
  * Added averaged oblique cross section (panel and tools)
  * plot items/Refactoring: methods 'set_selectable', 'set_resizable', 'set_movable' and 'set_rotatable' are now mandatory for all plot items (not only the image items as before)
  * tools.!ImageMaskTool/icon: more contrasted icon (in order to discriminate easily the disabled icon from the enabled one)
  * plot.!PlotManager: added method 'get_tool' (returns tool's instance from its class, if added to manager...)
  * tools / New !ExportItemData tool: supports only curve items (for now)
  * tools.!CrossSectionTool/!AverageCrossSectionTool -- shape setup: added class attribute SHAPE_TITLE + do not hide computations anymore
  * pyplot/Axes: added methods 'set_xlim' and 'set_ylim'
  * shapes.py/image.py: code refactoring/cleaning --> geometry.py
  * Rectangular shapes/annotations: added method get_bounding_rect_coords
  * cross_section.!CrossSectionPlot: added attribute 'single_source' / if True, only one image source is processed
  * Improve pcolor, refactor scaler sources
  * Handle Nan's quietly while computing lut min/max
  * Added basic function computation on hist2d
  * Allowed Histogram2DItems to have VOI, palettes and transparent backgrounds

----

== Version 2.1.0 ==

=== Bug fixes (since v2.0.8) ===

  * cross_section: !CrossSectionWidget.update_plot argument 'obj' was not optional as in !CrossSectionPlot.update_plot
  * Contrast adjustment panel: when setting range (i.e. possible change of image data), levels histogram was not updated
  * Tests: handling I/O errors occuring when user has no write permission on current directory
  * Image items: bugfixes in !ImageItem (scale issues: replaced x0,y0,dx,dy by xmin,xmax,ymin,ymax) + added intermediate class !RawImageItem (!ImageItem without scale)
  * Image module: fixed pixel alignment issues (get_closest_indexes, ...)
  * !TrImageParam: fixed wrong class inheritance
  * !LegendBoxItem/bugfix: missing argument for include_item
  * guiqwt.image.get_filename: bugfix when filename is None
  * !ErrorBarCurveItem.set_data: now accepts None for both dx and dy (interface consistency with its parent class, !CurveItem)
  * Image items/Align rectangular shape to image pixels/bugfix: this feature was not working for scaled images (!ImageItem, !MaskImageItem, ...)
  * guiqwt.curve/image: improved autoscale method (now works with curves plotted on two different Y-axes)
  * guiqwt.image: fixed issues related to empty filename/data when pickling/unpickling items
  * !OpenFileTool: now remembers the previously browsed directory
  * Fixed !PyQt >=v4.8 compatibility issue: !PyQt is less permissive with signal string syntax (!PyQt_PyObject is mandatory for passing a Python/C++ object)
  * guiqwt.fit: fixed rounding error due to slider's non-continuous behaviour
  * guiqwt.label/bugfix: text label was reset to '' when redrawn
  * guiqwt.fit: bugfixes when using logscale
  * guiqwt.io.array_to_imagefile/text files: format is now '%d' for integer data types
  * (Fixes Issue 7) guifit: standard fit boundary excludes rightmost value
  * guiqwt/curve.py: added workaround to avoid division by zero when clicking between curves
  * guiqwt/io.py-array_to_dicomfile: fixed ambiguous VR for !PixelData when changing DICOM data (forced to 'OB')
  * Bugfix: recent versions of !PyQt don't like the QApplication reference to be stored in modules (why is that?!)
  * Annotation/get_infos: fixed unicode error occuring with py2exe distribution only

=== Possible API compatibility issues (since v2.0.8) ===

  * Panel interface: added mandatory method 'configure_panel' which is called just before adding the very first tool to the manager
  * baseplot: renamed guiqwt.baseplot.!EnhancedQwtPlot to !BasePlot

=== Other changes (since v2.0.8) ===

  * Cross sections/apply lut option turned on: now clipping data between 0 and LUT_MAX (0-1023), as it is done for displayed data
  * Added RGBImageItem
  * Scaler extension: added support for boolean arrays (e.g. for showing masks)
  * Added !DeleteItemTool (add an entry "Remove" in plot item context menu)
  * Plot items/introduced notion of "private items": new item methods: (is_private, set_private), new plot methods: (get_private_items, get_public_items)
  * !BaseImageItem.get_closest_indexes (+code refactoring): added argument 'corner' -> see new method 'get_closest_index_rect'
  * Shapes/Annotations: code cleaning/refactoring + implemented 'get_rect' method for !EllipseShape
  * Tools deriving from !InteractiveTool: added arguments 'title', 'icon' and 'tip' to customize the tool's action
  * !MaskedImageItem: added !ImageMaskTool to edit image's mask interactively
  * !ShapeParam: added attributes "private" and "readonly"
  * interfaces.IBasePlotItem: added argument 'ctrl=None' to 'move_local_point_to' (ctrl is True when 'Ctrl' button is pressed)
  * Ellipse/Circle shapes: when pressing 'Ctrl' button while resizing the shape, its center position will remain unchanged
  * guiqwt.plot: added classes !CurveWindow/!ImageWindow (derived from QMainWindow)
  * Added transitional package guiqwt.transitional (regroup all Qwt5 import statements)
  * !BasePlot: added class attributes AXIS_IDS, AXIS_NAMES (removed AXES)
  * !BasePlot: added methods 'set_axis_limits' and 'get_axis_limits'
  * !BasePlot: added method 'set_axis_ticks' to set axis major tick step size or maximum number of major ticks and maximum of minor ticks
  * Cross section panels: added interface to handle the cross section curve data when updated
  * Panel widgets are now dockable
  * guiqwt.fit: code cleaning/refactoring + added !FitWidget (similar to !FitDialog but inherits directly from QWidget)
  * guiqwt.fit: fit params may now be changed as often as needed (the param widgets are reconstructed then)
  * guiqwt.fit: replaced set_fit_func and set_fit_params by set_fit_data (non sense to be setting one without the other)
  * Added vertical/horizontal cursor plot items (+ tools + cursor info label): see builder.make.vcursor, hcursor and info_cursor
  * Cross section panel: added button "auto refresh" (enabled by default) (e.g. may be disabled for large images)
  * Added signal SIG_MASK_CHANGED, emitted by plot when an image mask has changed
  * guiqwt.fit.!FitWidget/!FitDialog: now working with no fit param
  * guiqwt.signals.SIG_ITEM_REMOVED is now emitted by plot when an item is removed from the item list panel (as before) or using the delete item tool (new)
  * Cross section plot: added tool '!DeleteItemTool'
  * guiqwt.builder/scaled image items (!ImageItem, RGBImageItem, ...): added option 'pixel_size' (alternative to xdata and ydata)
  * guiqwt.fit: added option 'param_cols' to regroup N fit parameters on each row
  * !SnapshotTool: added options to add images together (instead of the default replace behavior) + bugfixes
  * Renamed signal_app.py to sift.py (Sifia -> Sift)
  * Sift: added support for image processing
  * Image levels histogram (contrast panel): replaced the 'remove first bin' feature by an intelligent Y-axis scaling
  * guifit: reorganized layout to gain some space + added option 'size_offset' to change param label's size
  * guiqwt.plot.!CurveDialog: added attribute 'button_box' (reference to the QDialogButtonBox instance)
  * guiqwt.io: added open/save filedialog filters 'IMAGE_LOAD_FILTERS' (types supported by 'imagefile_to_array') and 'IMAGE_SAVE_FILTERS' (types supported by 'array_to_imagefile')
  * guiqwt.io: added support for "I;16B" images
  * Sift/added image operations (+ various bugfixes/enhancements): resize and rotate (90°, -90°, H/V flipping, arbritrarily rotation)
  * Sift: added run scripts + py2exe setup script + icon
  * !PanelWidget: added class attributes PANEL_TITLE and PANEL_ICON
  * guiqwt.cross_section.!CrossSectionItem: added method 'process_curve_data' (called when cross section data has changed instead of calling 'set_data' directly)
  * Tools: added 'toolbar_id' argument to all tools deriving from !CommandTool
  * setup.py: removed the hard-coded -msse2 compile flag --> added extra options --sse2 and --sse3 as a replacement
  * Added !ImageStatsTool: show statistics on selected image item's rectangular area
  * builder/images: added option 'interpolation' for all image item types (default=linear)
  * builder/images: added option 'eliminate_outliers' for some image item types (default=None)
  * Sift: added image cropping and flat-field correction features
  * Sift: added average operation + threshold/clip features to image processing menu
  * !ImageMaskTool: now emits SIG_APPLIED_MASK_TOOL when mask is applied from defined shapes + other API details
  * Sift: added support for DICOM metadata (shown as a dictionnary in a GUI-based editor)
  * Sift: new embedded Python console with a proxy to manipulate signal/image data directly!