April 5, 2019No News in a WhileDabo is largely in maintenance mode, which is why there aren't any recent news entries.posted at: 16:20 |
May 10, 2013Dabo 0.9.10 Released
Please see the Release Notes for v0.9.10
We are working toward 1.0 Real Soon Now.
posted at: 12:05 |
Jan 27, 2013Dabo 0.9.7 ReleasedWe are gearing up for the 1.0 release, and have put in some changes based on found problems by our users. Here are the changes: Release Notes for v0.9.7posted at: 15:27 Dabo 0.9.8 Released
Please see the Release Notes for v0.9.8
posted at: 15:27 |
Jan 24, 2013Dabo 0.9.6 Released, and we moved to GitHubWe've transitioned from Subversion to Git, and you can now find us at https://github.com/dabodev/dabo . We do our ongoing work on the 'working' branch and will periodically - hopefully often - bump the version and merge into 'master'. Version 0.9.6 was released a couple weeks ago, and version 0.9.5 about a week before that. Here are the change logs for each: Cheers!posted at: 23:45 |
Aug 05, 2012Web Update revision 7219 PostedFramework: posted at: 13:49 |
May 29, 2012Web Update revision 7192 Posted- Fixed an issue where grids would ignore the Precision setting with Decimal values. posted at: 13:05 |
May 10, 2012Web Update revision 7178 Posted- Fixed a bug in dGrid introduced in the last commit. posted at: 14:49 |
May 09, 2012Web Update revision 7176 Posted- Fixed a bug in dGrid that would raise an exception if a grid had no records. posted at: 14:20 |
May 02, 2012Web Update revision 7173 Posted- Some minor bug fixes since the last Web Update was released. posted at: 13:35 |
Apr 30, 2012Web Update revision 7166 Posted- Added the Minesweeper game to the DaboDemo app. posted at: 13:49 Web Update revision 7164 Posted- Fixed a typo that accidentally made it into the last release posted at: 09:20 Web Update revision 7159 PostedUI Layer Changes- Added a setRowHeight() method to allow programmatic setting of row heights. If SameSizeRows is True, setting any row height changes them all, just as if the row had been resized in the UI. - Changed the default for Idle events in a form to refresh once per second instead of continuously; this can be modified with the IdleRefreshInterval property. - Fixed the problem of all grid columns using the default string renderer, even if they had set an explicit DataType. - Added basic copy functionality to grids. By default strings are enclosed in double quotes, values in the same row are separated by tabs, and rows are separated by newlines. These are all configurable as settings, though. - Renamed the 'dShell' class to 'dShellForm', and the '_Shell' class to 'dShell', making embedding the shell into other apps much easier. - Enhanced dHtmlBox to allow link hrefs to refer to application or form methods. - Fixed a problem that prevented a grid column's DynamicVisible property from being updated when the column was hidden. - Added a dropped file handler for the interactive shell's editor. - Fixed dynamic properties issues in dToolBarItem class - Improved the appearance of dSpinner under Windows. - Added a check to prevent adding a sizer more than once to another sizer. - Added a RowNavigationEvent that is raised when the user moves through the data using next(), last(), etc. - Enhanced the dLinePlot class, and added a demo class for it into DaboDemo. - Fixed a problem on MacOS where the Preferences menu item would become disabled. - Made sure that the "check spelling as you type" option works on MacOS. Bizobj Layer Changes- Added dBizobj.DataSourceName property, corresponding to real source table name for business object, which allows you to create multiple business objects with same table as source on single form. - Added new property RequeryChildrenOnNavigate to dBizobj, allowing a way to (temporarily) suspend requerying any child bizobjs when navigating. - Fixed a problem in dBizobj where setting self.exitScan caused all future scans to exit immediately. - Added getChangedStatus() to dBizobj, which returns the information in getRecordStatus(), but for all the changed rows in the bizobj, including changed child bizobjs. - Added explicit support for dBizobj multiple-field search in seek() and locate(). Data Layer Changes- Added convenience function getFieldVals(), which just decorates input and output to/from getDataSet() to return the dict of field/value pairs in the current or specified row. - Got SQLite to work correctly with BLOBs. - Fixed a problem in the many-to-many routines where the cursor was using its KeyField instead of the 'other' tables pkCol. - Fix dbMsSQL.getFields() method issue handling table names with schema. - Added dCursorMixin.setDataSet() method to directly populate a cursor's data. Changes to Tools- Replaced the old non-working MenuDesigner with a version that actually works. - Report Writer: Improved the display of memos with more data than can be displayed to show as much as possible, followed by an ellipsis. - Added dShell support to the Class Designer. - Added 'Precision' to the exposed dColumn properties in the Class Designer. posted at: 07:50 |
Oct 03, 2011Web Update revision 6866 PostedGeneral Framework Changes:- Lots of docstring changes to improve Sphinx documentation- You can now override the setting of the language defined by locale. - Changed default Encoding for datasets to the one declared for the backend. - Added dApp.displayInfoMessage() which presents a dialog with a checkbox for the user to choose if they will see this particular message in the future. - Added getSharedAppDataDirectory() fuction, which returns application shared data directory. - Improved debugging by including the current call stack in every callAfter/setAfter call, so that errors can show the path that led to the *after method being called. - Fixed an issue where calling the _initModuleNames() method would not update with any changes since the app first launched. With this change, bizobjs created or changed in the Class Designer will now be available when test running the class. Bizobj/DB Layer Changes:- Augmented the Data Type Mismatch error to show the table name and not just the field name.- Fixed an issue where newly-added records in cursors that had never been requeried didn't know their data structure, even though DataStructure had been set explicitly. - Improved the getDataSet() method to eliminate the need for looping through all rows. - Fixed issue with dBizobj wrong cursor assignment for newly created grandchild cursors. - Added argument to biz.save() to optionally prevent child bizobjs from getting saved. - Added the Connection property to dBizobj. - Multiple improvements in the handling of child bizobjs and changed rows in dBizobj. - Added an optional TypeStructure property to dDataSet to provide 'hints' to the class in determining data types. - Fixed the case where seek(..., near=True) worked correctly except in the case where we were seeking a value greater than that of the last row, in which case it would stick the record pointer on the first row instead of the last row. - Added helper getBizobj() function to dDialog so that controls in the dialog can still find their bizobjs with 'self.Form.getBizobj()'. - Added basic methods to dBizobj and dCursorMixin for handling many-to-many (M-M) relationships. - Changed the logic for data binding with bizobjs. Now you can bind to any attribute of the bizobj, not just columns in the bizobj's data set. - Made some improvements to support for MS SQL connections. - Changed the value returned by dCursorMixin's RowCount to 0 from -1 for the case where the cursor has not yet been requeried. Logically it makes more sense, and we don't rely on a value of -1 for this anywhere. - Improved the way that dBizobj's isAnyChanged() method determines changes. UI Changes:- Added the 'ChildObjects' property to sizers. This will return a list of the objects managed by the sizer, whether they be controls, sizers, or spacers. The 'Children' property still returns a list of sizer items.- Fixed the dDockForm and dDockPanel classes so that the properties work again. - The DataSource property for controls can now be set to a callable, which will be evaluated each time the property is accessed. This makes it possible to have a dynamic DataSource. - Added the 'moveTabOrderBefore()' and 'moveTabOrderAfter()' methods to improve control over tab order. - Added the ability to flip displayed images in the dImage control horizontally or vertically. - Added the ability for dImage to recognize rotation information in image files that store it, and adjust its display accordingly. - The grid's header area now defaults to white, while the default grid column header background color is grey. - dGrid's SelectionForeColor and SelectionBackColor weren't settable from initProperties() or from the constructor. Fixed. - Added the 'UpdateInactivePages' property to the paged controls; this limits propagation of update event to the active page only when set to False - Pages now have the DeferredUpdates property to handle delayed updates, until page become selected. - Fixed some flushValue() problems in dTextBoxMixin, and improved its internal data type support. - Added the ButtonShape property to dBorderlessButton. - Added ability to associate a node in dTreeView with a file path. - Fixed the issues with the segfault/bus error with dGrid that was being seen when running the Class Designer under Python 2.7. - Changed the header context menu in dGrid so that if ResizableColumns is False, the options to autosize the column is not available. - Changed the background color of column 1 in the demo code for dGrid to something a little less ugly. - Enhanced the 'makeDirTree()' method to accept a list of file patterns for both including and excluding. Also added checks for upper/lower case versions of those patterns. - Added the DataUpdateDelay property to dForm to control delay between when business data changes and UI controls get updated; setting to None means that controls are immediately updated with changes. - Fixed some flickering issues with dForm when refreshing. - Added the convenience classes dSizerH and dSizerV for making horizontal and vertical sizers, respectively. Yes, I am lazy. - Fixed problem with some paged controls not properly working with setAll() method. - The dDockForm classes use the agw version of the AUI libraries if available. - Added the 'MovableTabs' property to the dDockTabs class; when False, the tabs cannot be rearranged or docked. This must be specified when the control is instantiated. - Added helper getBizobj() function to dDialog so that controls in the dialog can still find their bizobjs with 'self.Form.getBizobj()'. - Added the UseSmartFocus property to dPageFrame, which will 'remember' the control that had focus on a page, and reset focus to that control when the page becomes active. - Fixed dSpinner control flush on update issue. - Added dDatePicker control based on native wx.DatePickerCtrl. - Changes the InteractiveChange event so that it is raised after the data source update to better synchronize between biz and UI layers. - Added global setting autoDisableDataControls to handle new data controls behavior on empty dataset. - Added ReadOnly property to dRichTextBox. - Added the ShellCommandRun event, which is raised whenever dShell executes a command in its interpreter. - Added the PersistSecretData property that overrides IsSecret property allowing to store sensitive data in encrypted form. - Added the NumericBlankToZero property to dTextBoxMixin. When true, blanking a numeric field will be interpreted as setting it to zero. - Fixed an issue with dPageStyled where 'select' parameter was by default set to True and fired the PageChanging event on every newly added page. - Added a Rounded Rectangle to the available DrawObjects. ReportWriter Changes:- Deprecated Frameset/Paragraph; Added Memo which accomplishes the same thing in the same way without the developer needing to know about the hierarchy.- Removed the auto-updating of the _def default properties when the main property changes, as it was causing unneeded cruft in the rfxml. - Changed default expr of String and Memo to "String" and "Memo", respectively. - Improved Memo's Leading property to easily be able to specify single- or double-space, and to modify that with any number of + or - chars, like "single+++" to have single-space plus a little bit. - Added a new report object, "Defaults", with one initial default to set: FontName. If String or Memo don't have FontName explicitly set, the report default will be queried. If that isn't explicitly set, the base default will be queried. The base default is Helvetica, but I suggest installing DejaVuSans or some other true-type font that has extended symbols that will likely be encountered in user data, expecially in non-US locales. - Bad font names will no longer crash the reportWriter, they'll simply be substituted with Helvetica, Helvetica-Bold, Helvetica-Oblique, or Helvetica-BoldOblique. - Added code to defend against converting anything other than the most common Frameset/Paragraph. It is possible but unlikely that rfxml's exist in the wild with multiple subobjects of Frameset, and this will keep those from getting converted. - Add the system truetype font paths to reportWriter, which will result in auto-registration of specific fonts upon first use. - Fixed an issue with Memos in which data that was too long resulted in nothing being printed. Instead, the message '<<< string too long >>>' will be printed so the developer knows what needs to be fixed. - Fixed the reprinting of group headers from the printing of a detail band so that they only reprint group headers higher in the list than the current group - Allow for the image expression to evaluate to None, and just don't print anything in that case. Report Designer Changes:- Enhanced the ReportDesigner by making Shift+Enter on an object activate the propsheet editor for the currently selected property in the propsheet.- Enhanced ReportDesigner to show the paragraph object expression on the design surface. In addition, made it so when you click on the Frameset, the Paragraph is what gets selected. You can still select the Frameset object by clicking on it in the object tree. - Deprecated Frameset/Paragraph; Added Memo which accomplishes the same thing in the same way but the appdev doesn't need to know about the hierarchy. - Changed default expr of String and Memo to "String" and "Memo", respectively. - Changed dynamically-sized bands (height = None) to use height_def for display in the designer, instead of the hard-coded 75pt used previously. If no height_def has been explicitly set, the 75 is still used to avoid the default of 0, which would be confusing. - ReportDesigner looked horrible on Mac because of dark default background. Fixed. - Fixed a bug in the designer when changing the height of a band where the height was None (dynamic) previously. Class Designer Changes:- Replaced the painted of dSizerPanel with a nested panel. I prefer the look of the painted border, but it flickers way too much due to the excessive number of repaints.- Added needed self.refresh() after a Zoom operation to avoid artifacts. - Added code to save/restore the zoom level. - Changes the layout when editing sizers so that the two panels are horizontally arranged. Previously, the vertical arrangement was too tall for some screen resolutions. Thought I had committed this a while ago. - The search dialog of the Class Designer Editor will search *all* of your code for the class, and not just the currently displayed method. - There is now a popup that allows you to quickly navigate to any existing method of any object. To access that popup, click the down triangle in the top left corner of the editor window, or press Ctrl+J to activate the method list. - Incorporated the ability to edit text files while remaining in the Class Designer. - Changed the Class Designer to use the directory in which it was started, not the 'ide' directory, as its HomeDirectory. posted at: 07:50 |
Feb 19, 2011Web Update revision 6450 Posted- dCursorMixin: Refactored CursorRecord out of dabo.db.dCursorMixin into dabo.db. Now both dCursorMixin and dBizobj can use the class to instantiate their own Record instances. This effectively means that assigning to biz.Record.field no longer calls cur.setFieldVal() directly but instead calls biz.setFieldVal(), allowing easy interference to be run by appdev code. posted at: 08:20 |
Nov 22, 2010Web Update revision 6201 Posted- Fixed a potential problem when starting Dabo if a default encoding was not set. posted at: 09:05 |
Nov 21, 2010Web Update revision 6199 Posted- Fixed some WordWrap issues with labels. posted at: 08:50 |
Oct 16, 2010Web Update revision 6108 Posted- Abstracted out the columns in dListControl. You can now change column captions without losing your data and other column settings. posted at: 16:20 |
Sep 13, 2010Web Update revision 6020 Posted+ Cleaned up the code base by removing all trailing whitespace. posted at: 06:20 |
Sep 12, 2010Dabo 0.9.3 ReleasedIt's been way too long since we did an official release, but all that's |
Update to keep your copy of the framework up to date, you don't need to do anything - you already have the code in this release. posted at: 16:19 |
Jul 12, 2010Web Update revision 5924 Posted- Reverts a behavioral change introduced accidentally in r5846. Now scan() will requery child bizobjs by default. posted at: 06:20 |
Jul 07, 2010Web Update revision 5910 Posted- Added the dRichTextBox class, which allows for basic rich text editing and display. posted at: 07:50 |
Apr 25, 2010New Screencast: The Dabo Shell and the UI Browse CommandI've just created a new screencast that I wanted to do based on feedback posted at: 09:35 |
Mar 28, 2010Web Update revision 5765 Posted- Fixed a bug in the JsonConverter imports. |
- dDateTextBox: allows the user to clear the date (set to None) by adding a shortcut ('N') - dReportWriter: Fixed bug with spanning objects: if the group didn't print for whatever reason, the spanning never started. Therefore, we can't try to draw the object. - Fixed a bug in dGrid's incremental search on Windows. - Refactored the 'resolvePathAndUpdate()' method into dabo.lib.utils instead of dabo.ui.uiwx - Added window scrolling events to dGrid and dScrollPanel, so that your code can now handle them if needed. - Added optional argument to cur.execute() to convert any ?'s to the backend's paramPlaceholder. - Made the localization installation process a little more sane, as it seems that it is especially prone to errors. Now, instead of abending when the dabo localization file isn't found, it prints an error and continues. The app will continue to work fine, but no translations will be done. - Fixed a bug that prevented boolean values in grid columns from being properly restored. Trac issue #1247. - Added a flag to avoid an unnecessary pointer movement caused by setting the DataSource of the grid to a bizobj after the bizobj had already been created and had its record pointer set. Trac issue #1314. - The logic for constructing the filtering WHERE clause in child bizobjs has been corrected to by fully paramterized, instead of 'injecting' the value directly into the SQL. - Fixed a problem when re-opening designs for custom classes. Reported by Martinecz Miklós. - Added the 'GridCellEditEnd' event, which is raised when a grid cell editor is hidden, whether the value has been changed or not. - Fixed a potential issue in the Class Designer Property Sheet in which you could be editing the value of a property of one control, and then navigate to a different control and have your change accidentally be applied to the second control. - Fixed the Crypto property so that setting it to a crypto object will result in the encrypt() and decrypt() methods using that object. - Fixed a bug in the filterByExpression() method that only replace the first occurrence of a field name in the expression. Reported by Ricardo Aráoz. - Changed the Face setter to ignore attempts to set it to 'MS Shell Dlg*' font face names, which can happen when a cdxml file created on Windows is opened on Mac or Linux. - Changed the HomeDirectory setter to write an errorLog entry instead of throwing an exception when an invalid path is passed. Again, this is an issue with moving a cdxml from one system to another. - Changed the behavior when attempting to set the Face to a non-existent fontface. Instead of throwing an error, an entry is written to the Dabo error log describing the issue. - Updated dLed to make it data-aware. It can now be bound to a DataSource and DataField, and have its Color reflect the underlying boolean value. posted at: 12:05 |
Feb 16, 2010Web Update revision 5694 Posted- POTENTIAL BREAKAGE: Revamped the handling of pathing. If you have file path references in your cdxml or cnxml files, this could break your old files. Pathing is now relative to the HomeDirectory of your app, instead of the location of the tool that created the file. posted at: 15:00 |
Dec 30, 2009Web Update revision 5580 Posted- Added support for the pudb debugger if it is installed. posted at: 09:10 |
Dec 19, 2009Web Update revision 5561 Posted- Fixed the download_url in setup.py to match the current download location. I guess easy_install has been broken for a while. Thanks Carl Karsten for finding and reporting the problem, along with a solution! posted at: 12:14 |
Dec 12, 2009Web Update revision 5550 Posted
- Added some events to dReportWriter: ReportCancel, ReportBegin, ReportEnd, and ReportIteration. Your code can bind to them like any other Dabo event. posted at: 07:47 |
Dec 10, 2008Dabo 0.9.0 ReleasedWe are proud (and relieved!) to finally release Dabo 0.9.0, the first official release of the framework in six months. We haven't been taking it easy during that period; rather, we made some changes that clean up some weak spots in the codebase, and as a result can offer a much more solid framework, and are on course for a 1.0 release in the near future. To do this, we made some decisions that break backwards compatibility. We dropped support for Python versions earlier than 2.4, and wxPython versions below 2.8. Supporting everything is nice to aim for, but completely impractical. There is also a major addition to the framework: the ability to deploy Dabo applications as true web apps. Imagine: being able to develop a rich internet app using nothing but Python on both the client and server! It's still early in the development process, so it's lacking a lot of the supporting tools, and almost no documentation has been created, but that will be coming in the next few weeks/months. When you deploy your app as a web app, all data access and business logic is on the server, and the framework automatically handles the communication between the client and server. The framework also automatically grabs file changes from the server, making UI updates seamless and quick. Lots more interesting stuff will be happening in this area in the near future, so stay tuned! You can grab the latest version from the Download Page A fairly comprehensive list of the changes we've made since the last release can be found here: ChangeLog. -- Ed Leafe posted at: 12:50 |
Jun 03, 2008Dabo 0.8.4 Released
Six months since the last release, but many improvements have been made!
[changelog]
posted at: 16:51 |
Dec 11, 2007Dabo 0.8.3 Released
We've gotten good feedback from a number of you - it feels like the number of
people trying out Dabo is growing. From now on we'll try to keep to a 5-week
point release cycle. But once you download and install a point release, you
can always use the new Web Update feature to stay updated. The changes in
0.8.3 can be seen in the change log . Enjoy!
posted at: 13:16 |
Oct 25, 2007Dabo 0.8.2 Released
We are pleased to announce Dabo 0.8.2, which has many many changes since the last version, including web update, better performance, more widgets, a preference dialog you can use in your apps, and better database support. For a full list of changes, view the
change log . Enjoy!
posted at: 11:35 |
Oct 11, 2007Using raiseEvent()Sometimes, even if you know the framework as well as I do, you re- discover a feature that you had forgotten about. This happened tonight as I was going over the interaction between a grid and its form, so I thought I'd pass it along. When any of the events that cause the current record pointer to move are handled by the form, it generates a dEvents.RowNumChanged event, to which grids can bind so that they can update their display. The form code looked like: dabo.ui.callAfter(self.raiseEvent, dEvents.RowNumChanged) and the event handler in the grid would run this code: try: self.CurrentRow = self.getBizobj().RowNumber except AttributeError: pass In other words, the grid knew that the row had changed, but had no idea what the new row was. It had to then get a reference to the bizobj for that grid, if any, and then ask that bizobj for its current row number. Why is this inefficient? Because the code that raised the event *knew* the old and new row numbers; the fact that they were different was why it was raising the event in the first place. Then I remembered that you can pass data along to raiseEvent(); any keyword parameters you add are set as event data. So I changed the form code to read: dabo.ui.callAfter(self.raiseEvent, dEvents.RowNumChanged, newRowNumber=biz.RowNumber, oldRowNumber=oldRowNum) ...and now the grid's event handler can just reference those values directly! They will have the same names as the parameter keys: try: self.CurrentRow = evt.newRowNumber except AttributeError: pass This may be a small savings overall, but I thought that it illustrated a handy mechanism built into the Dabo event class that you might use to improve your applications. posted at: 18:10 |
May 09, 2007Dabo 0.8 ReleasedI guess we shouldn't have said that Dabo 0.8 is just around the corner! Oh, well... here it is finally. We've really been ramping up the development in anticipation of 1.0 later this year. Please see the change log for all the details, and grab Dabo 0.8 from the download page. Enjoy! posted at: 03:21 |
Feb 27, 2007Dabo Session at PyCon 2007 available onlineLast weekend was PyCon 2007 in Dallas, Texas. We recorded my session on Developing Desktop Applications with Dabo, and have posted the video for those who could not make the conference. It's available at: http://dabodev.com/ pycon2007. posted at: 15:21 |
Jan 18, 2007Dabo 0.7.2 Released (with wxPython 2.8 Support). Dabo 0.8 Around the Corner.We've released Dabo 0.7.2, DaboIDE 0.7.1, and DaboDemo 0.7.2. These are all stable releases and the most important fix is that wxPython 2.8 is finally supported. See the ChangeLog, and download here. Enjoy! posted at: 08:30 |
Dec 21, 2006Dabo Runtime Engine For Windows 0.7.1 ReleasedI've just posted an update to the Runtime Engine that fixes some pathing issues that could arise in a few situations - thanks to Joe Brown for helping me work this out. Otherwise the contents are the same as the 0.7 release. As usual, you can grab it from the Download Page, or via FTP at ftp://dabodev.com/dabo/win. posted at: 14:19 |