There are two parameters that are affecting this search function in constructor of DropDownTreeView
which are searchable
and searchThreshold
.
searchable
, the search function will only be enabled if true
is passed in, won't be enabled otherwise.searchThreshold
, the search function will only be enabled if the count of TreeViewItem
in this drop down is larger than the threshold, won't be enabled otherwise.public class DropDownTreeView extends BasicTreeView { public constructor(Window parent, ... bool searchable=false, // Added flag to control the search. int searchThreshold=10, // Threshold when to start the search. ...
Added method enableSearch()
in 14.0 to DropDownTreeViewPopup
, which can be used to toggle search window.
/** * Enable search field. */ extend public void enableSearch(bool searchable=true, int searchThreshold=10) { this.searchable = searchable; if (searchable) { this.searchThreshold = searchThreshold; searchField = defaultSearchField(); } }
MemoryStream
.There was previously no way to load DIB images from a stream, which forced the developer to first write the image to file and then loading with the URL. Now that shouldn't be a problem anymore with this new function.
/** * Load the stream of a jpg or png image to DibImage. * * stream - The sequence of bytes that holds the image, it * should be formatted as a jpg or png file. * inlineStream - Write the URL to the image object? * props - The properties on how to read the image. * The stream can be formatted in many ways, this * object tells the reader how to interpret the data. * use - Is the image going to be used after the current thread * has run its course? Then you should set this to true. */ public DibImage dibImage(Stream stream, bool inlineStream=false, ReadImageProps props=dibImageProps, bool use=false) { if (!stream) return null; if (!props.dibPadding) props = props + ReadImageProps(dibPadding=true); ReadImageResult readResult; try { lastLoadImageErrorCode = 0; readResult = imageMagick.read(stream.array, byteCount=stream.count(), pixels=true, blob=false, props=props); } catch (OutOfMemory e) { lastLoadImageErrorCode = 3; return null; } catch (Exception e) { lastLoadImageErrorCode = 4; return null; } if (!readResult) return null; // Not including this test as we still need to read the stream to know the pixel count, // so we've already paid the price to performance if we have a gigantic image //if (imageAreaLimit > 0 and fileReadable and url.imageSize.area() > imageAreaLimit) throw ImageTooBigException(); Dib dib(); if (createDibImageFromDibBytes(readResult.pixels.array, readResult.size.w, readResult.size.h, readResult.channels, dib)) { DibImage image(alpha=props.alpha); image.dib = dib; if (!inlineStream) image.file = stream.path; image.setSize(image.dib.size); image.bitDepth = image.dib.bitDepth(); if (use) image.use(); return image; } return null; }
Nullcheck in PaneTreeNode.toS()
preventing access violation.
If the directory path used to access icons from file didn't have '/' at the end they would appear to work in developMode, but fail in releaseMode. They now fail in developMode as well, to prevent surprises at build.
/** * Put icon database finder extension directory if necessary. * * k - Key differentiating icons of different systems. * Typically this is the package of the extension * that is registering a directory. * dir - Path where icons are located. * Typically this looks something like * "custom/extension-name/res/images/". * * NOTE: The directory must end with "/" or it isn't * going to work in releaseMode. */ public void putIconDbExtensionDir(symbol k, str dir) { if (k !in iconDB) { // This will make the behavior like releaseMode. if (developMode and !dir.endsWith('/')) return; Url[] locations = cmInstalledAll(dir); if (locations.any) { for (l in locations) { } else { iconDB.finder(k, cmNative(dir)); } //Url completeDir = iconDbExtensionDir(dir); //iconDB.finder(k, completeDir); } }