===============================================================================
 Anthem History File
===============================================================================

This history file documents the entire development of the Anthem application. It
includes every painstaking detail and so is ridiculously boring to read. It's
only really here for my own benefit, and I haven't actually decided what that is
yet.

-------------------------------------------------------------------------------
 Contents
-------------------------------------------------------------------------------

  - Daily development history
  - TODO list

-------------------------------------------------------------------------------
 Daily development history
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
March 2000

XX Started the main UI project. Based on KDE2 rather then KDE1, and my work on
   the TSE3 library. The application will be as close to the original Anthem
   (TraxSequencer) project as possible - with improvements where appropriate.

-------------------------------------------------------------------------------
May

26 Got the SongInfoWindow working.
30 Added more buttons to the toolbar, default SongWindow size. Added
   PhraseListWindow. Added the TrackWindow: doesn't have much in it yet ;-)
31 Split the TrackWindow tabs into separate windows so I can resuse them,
   giving them a generic SettingsWindow interface.
   Added a TrackWidget too. Works splendidly.

-------------------------------------------------------------------------------
June

1  (During inter-state flight :-)
   Made forwards/backwards in filter window radio buttons in a QButtonGroup
   and disabled them when offset == 0. Split the SettingsWidgets into a
   separate source file.
   Created the MiscWidgets file and the MidiClockWidget. Put this in the
   MidiParamsWidget. Gave MidiClockWidget the ability to do +ve/-ve nos
   and a special value text (hairy!). I quite like the way that Qt gives you the
   ability to componentise stuff - in RISC OS anthem I had to keep rewriting
   particular UI 'widgets' for each window. Here, I just write one general
   purpose MidiClock input widget and reuse it everywhere. This this correct!
2  A whole pile of scaffolding for new good stuff to be added. Made the TimeLine
   inherit from QScrollView, put in some slots/signals to attach it to the
   PartView scrolling mechanism. Created the Zoomable interface and declared
   the ZoomWidget which will pop-up from the PartView corner widget. Put
   zooming calls into SongWindow, TrackList and PartLisl/Timeline. Started the
   TrackListViewItem class. Declared the DestinationWidget and the KeyWidget.
4  (During oposite direction inter-state flight)
   Implemented the ZoomWidget. Created the ZoomWindow which makes the ZoomWidget
   disappear. Linked it to the song window by added a little corner widget to
   the PartView.
   Back at the ranch, the only way I could get the ZoomWindow to appear just as
   I want it to (position wise) was to inherit it from a QPopupMenu and use the
   popup method to position it. There must be a better way. The WStyle_Popup
   does the popup thing, but I couldn't even get mouse leave on the window to
   close it cunningly since going into a child widget also counts as leaving.
5  Got the vertical zooming working with the TrackList. Fixed the QHeader
   size change problem - I should have used sizeHint, not size.
   Linked the size change into PartView and made it resize accordingly.
   Added key to the TrackListViewItem so that they appear in order. Put in a
   kind of straw man timeline redraw (presumes 4/4).
7  Moved the ZoomWindow into the new MiscWindows files, then split the
   SongWindow.cpp file into several separate files (in an attempt to speed
   compilation - it's sooo slow on this laptop).
9  Got zoom buttons in the scrollbars rather than using the ZoomWidget from the
   PartView corner widget. Started a cursory PartView redraw, I can see the
   song! (Qt really does make this ludicrously easy) Made the Parts look nicer
   by using the QStyle drawPanel. Sorted!
10 Made the Parts redraw with their MidiEvents. Just as I predicted this is
   really easy thanks to the Playable interface. Anthem on RISC OS never had
   this ;-)
   Added the Track 'status' graphic - it udpates using a Listener.
11 Made a single click on the status icon toggle it. Added an AboutWindow.
   Split the SOngWindow.h file into separate parts as well as the .cpp file
   in an attempt to speed development.
   Improved the TSE3 application class, and then created a Application class.
   Used this to make QTimer that calls poll on the transport object. Linked
   the buttons on the toolbar to transport play/stop etc (via my new Transport
   class).
12 Got the timeline cursor moving, and a form of 'autoscroll' working. I still
   haven't cleared up all the scroll attachments yet; I have to prevent
   infinite recusrion. Added a TimeDisplayWidget (really needs a better name)
   that sits on the transport toolbar.
13 Changed TimeDisplayWidget to MidiSchedulerTimeWidget, failed to let it have a
   frame on the toolbar (no idea why, just doesn't work). Created the
   ClockWindow which also uses this widget. Linked it to the toolbar.
   Added the SettingsWindow and linked it to a new MetronomeWidget.
14 Thanks to Rikkus managed to fully connect the scrolly bits without causing
   signal cascades using the QObject::blockSignals. Another thiing off my todo
   list. Added the MidiEcho settings widget, and space for all the other general
   settings widgets (stupidly large tabbed dialogue).
16 Finished off the KeyWidget (involving the KeyWidgetPopup and KeyOctaveWidget)
   Code works quite nicely now, with one exception. There's a strange 'feature'
   when a QSpinBox that reaches a low/high extent value in a popup window causes
   the program and WM to hang. If I set wrap on the widgets (or make the window
   a normal top level frame) it all works fine. Weird.
   Moved on to the VuWindow. Linked to the Application class.
18 Added a basic KeyboardWindow. Does good stuff. Needed to add a base value to
   the KeyOctaveWidget. I've quite enjoyed getting the basic gadgets up - they
   all took quite a while to do nicely (if at all) under RISC OS due to the lack
   of a basic toolkit. Here they're quite easy.
   Added proper file loading capability. Unfortunately, the KFileDialog
   segfaults all over the place. I trust this is a KDE bug. When I get home I'll
   update to the latest beta.
19 Linked the new TSE3_Application::Record object into the SongWindow.
   The SongWindow is turning (predicatbly) into a monolithic nightmare! it's to
   be expected, the TSE2 versoin was too. At least the design is cleaner and qt
   makes the GUI logic simple - the window just does so much it's a nightmare.
   Linked the recording to the selected Track and found that the insert Part
   facility works pleasantly.
   Fixed a scrolling redraw bug which was due to some missed signal blocks in
   the TrackList and TimeLine slots.
   Made the transport toolbar buttons update with the Transport status.
   Added the OSSMidiSchedulerWidget and OSSMidiSchedulerInfoWidget. Put it in
   the settings window (which is now ridiculously big).
 * Release 0.0.2.pre release to sourceforge.

-------------------------------------------------------------------------------
July

5  Added the PartWidget class and made both it and TrackWidget cope with being
   reshown. Did the same for the SettingsWindow.
   Added the Panic window and a tooblar button for it.
6  Finished off the Panic Window and added a disabling for the PanicWidget
   based on the status checkbox. Put this in the SimpleMidiEventFilterWidget
   then realised that it was dumb and took it out again!
   Added the PhraseSelectWidget and put it in the PartWidget.
   Put the pointer mode icons on the toolbar. Made a new partSelected signal
   for the PartView and linked to the PhraseListWindow so the selection can
   be updated.
7  Started using the TSE3_Commands classes. Started with the SongInfoWindow,
   linked the CommandHistory notifications to button state changes, it all
   works nicely. Made the SongInfoWindow keep up to date with changes in
   song info state.
8  Optimised the redraw routine in PartView to only draw the visible bits -
   with a marked speed increase! Also began turning the SettingsWidgets into
   something that can be used in the CommandHistory system. Implemented it
   for the TrackWindow.
9  Finished off TrackWindow command stuff.
   Converted the PartWindow to use a command.
   Put in the infrastructure for the PartView pointer mode, and made the toolbar
   handle the icons.
10 The PartView is a TSE3::Listener, it notices when Parts change and are
   inserted into a Track.
11 Began to put in the PartView dragging stuff. To do this I made a helper
   object, the RubberSelectionBox. This is because I will be using a similar
   functionality in the PianoRollEditor widget (when I create it).
   Gave the RubberSelectionBox a minimum and miximum size (very tedious to
   force the box to fit it, too). Linked it into the PartView so that I can
   insert Parts (without the joy of commands yet).
   Added a useful select mode drag that selects multiple Parts.
12 Added the snip command to the PartView. Also added the glue command.
13 Simple fix to Panic window so that it can update the settings correctly.
17 Added the GotoWindow. There's still some work to do on it (flag combo
   box, and maybe bar/beat malarky, but it works as it is).
   Added support of fixed box dragging as well as anchored drag to the
   RubberSelectionBox - needed some fiddling, but works nicely now.
   Linked that into the PartView stuff when dragging a selection.
18 TransportWidget.
26 Horizontal scroll now holds the current left time position.

-------------------------------------------------------------------------------
August

17 Incorporated new Part_Move command. Added the PartInsertActionWidget
   to use with Part moves.
18 Used the Part_Move command for the insert Part operation too.
21 Added grey dotted lines in the PartView at 'big' timesig positions.
   Added a filter to the RubberSelectionBox and made the PartView use it.
   Begin to make the TimeLine look at the TimeSigTrack.
22 TimeLine now handles the TimeSigTrack properly.
   Use of TSE3::Util::Snap made. The RubberSelectionBoxFilter now uses it.
   That is really sweet ;-)
   Made the menu and toolbars in the SongWindow use the KAction class, it now
   gets nice piccies!
23 Added stop to the RubberDragBox and and escape key press now halts a drag.
24 Much better KDOC for RubberSelectionBox, on the grounds it will probably
   become a separate component.
   Fixed file loading.
30 Updates to track changes to TSE3 0.0.9 -> 0.0.10.
31 And some more.

-------------------------------------------------------------------------------
September

4  When you double click a Track, the first tab opened depends on the column
   you click in. Added hack so that a subsequent click on a selected Track
   deselects it.
   Implemented solo track stuff with a lovely new button. Got the repeat
   button setting repeat status too.
5  Added synchro start to the toolbar. Made the TrackList clever tab opening
   stuff cope with collumns being moved about.
   Sent RubberSelectionBox to www.ksourcerer.org.
   Linked PhraseListWindow selection to setting Phrases in the PartView uses
   the new CommandGroup to groups Commands together.
   Created popup menus for the undo/redo buttons, but found it very hard to
   connect a popup to a KAction button.
6  Got the undo/redo menu stuff working nicely. Involved a bit of a nasty hack
   to get the undo/redo KAction tool button ID so I can attach a delayed popup.
   I think that this can be got around in the latest KDE sources, but I'll wait
   until I can be bothered to compile them...
   A click in the timeline sets 'now'. TimeLine also displays repeat markers
   (now TES has simple ones in Song rather than the RepeatTrack). Ctrl clicks
   set these.
7  TimeLineWindow redraw after marker move works. Added snap to TimeLine.
   Removed the solo button from the toolbar and put it in the TrackList instead.
   Added the punch-in button. Fixed bugs in DestinationWidget.
22 Did some more on the PhraseEditors - they now appear when you press Edit
   in the PhraseList window, and I've started the list editor. The changing
   still causes a crash, though...
26 Installed the latest Qt 2.2.0 and KDe snapshot. Modifications to the app to
   run under the new environment. A number of annoying thigns have changed.
   Put in some scaffolding for cut/copy/paste.
 * Release 0.0.3
28 Stopped that annoying flicker as the PartView was updated every time focus
   entered and left. Did this by giving it a focus proxy. Hacky but effective.
   More flicker busting - the TimeLine emitted widthChanged when the width
   was being checked and hadn't in fact changed. Removing this prevents
   too many signals. Also stopped the PartView updating whenever it got a
   slotChangeWidget - whatever caused the width change would surely notify
   it anyway.
   Made the clipboard status reflect in cut, copy and paste actions.

-------------------------------------------------------------------------------
October
  
2  Added a cunning autoScroll facility to the RubberSelectionBox class.
3  Investigated a redraw bug for the rubber box when auto scroll kicks in.
   Basically, the window scroll causes a thin sliver of window to be exposed,
   but the undraw of selection box is bogus because there has never been
   a box there before. Thanks to XOR plotting the world goes euchy.
4  Implemented a fix by temporarily removing the box from the screen during
   auto scroll.
   The next release will just be a tarball of my source dir, since "make dist"
   seems well and truly broken.
 * Release 0.0.4
11 Started to add the Instruments window.
12 Part delete (some of 'cut') now works.
18 Sorted out the configure scripts to avoid the nasty bodgy initialising.
   Aaaaaaaaaaaagggggggggggghhhhh. The CVS repository has died. Bother.
   Restored from a backup, but a lot of revision information has been lost
   (2000-09-26 -> 2000-10-17).
   Finally worked out how to remove the horrible MUNGEPIX hack. You can set
   $KDEDIRS to include a directory which contains "share/pixmaps/*" Yay.
   Moved gfx directory to be share/pixmaps.
19 Niced up the custom about window. Removed the _bodge.h for good.
 * 0.0.5 Release
20 It turns out that my improvements to TimeLine widthChanged that prevented
   flicker stopped repainting when the horizontal scroll changed. Fixed.
23 Fixed to work with latest TSE3 where Part::track() and Track::song() methods
   have been renamed parent().
   Got a lot of good Instrument window stuff going - you can now laod
   instruments.
24 File saving works OK now.
25 Got the command line args to handle loading files, removed the temporary
   load file hack. Any type of file can be loaded, uses a FileRecogniser.
   If no files can be loaded, an empty default file loads.
   You can now again safely pass a null song pointer to the SongWindow - it
   won't crash.
   Part events cannot be redraw outside of their parent Part any more.

-------------------------------------------------------------------------------
November

1  Moved all SongWindow files into the songwindow subdir, and fought the 
   "standard" build structure to let me build it there.
   Moved PhraseEditor stuff into phraseeditors.
2  Having got the above working, moved around all of the rest of the source
   files into a more logical directory order.
6  Added a Select submenu to the Edit menu, and made the latter appear when
   you RMB over PartView.
7  Implemented part start/end drags, and mostly got the command working that
   implements it. Nice. Altered the PartView RMB menu so it isn't identical
   to the Edit menu.
8  Added modified to SongWindow. Began more work on changeSong.
   Added a changeSong to TrackList, TimeLine, PartView and PhraseListWindow.
   Implemented it in SongWindow, altered Application::load to use it.
   Linked to this in SongWindow::open.
   (Did all this at home without KDE2, so not compiled!)
9  The flaky build environment when bits up so I had to reconstruct it (took
   the env files from BibleTime).
   Added a splash screen. Completed support for the changeSong in SongWindow.
   It works nicely. Added a modified status thingy, which opens in a new window
   if the file has been modified. Also altered SongWindow setCaptioning so
   the modified status is shown.
10 Made the splash screen a little more clever: it stays open for a fixed
   period of time and show()s and deletes itself.
   If you close a modified SongWindow, it will ask you whether you want to
   save first.
13 Implemented revert in the SongWindow. Gave the PartSelection paste to
   clipboard stuff a working implementation.
   Added QStringStreambuf, a streambuf that allows me to send ostream data to
   a QString. Neat and easy! Used by Clipboard.cpp.
   Removed loadSong from main.cpp and used the load built into the Application
   class.
   Gave the Application a QProgressDialog for how the Song loading is coming
   along.
14 Created the TSE3ProgressDialog instead of just putting it into the
   Application. Instrument settings window now uses progress stuff too.
   Altered some of the run-time Qt messages from having template SettingsWidget
   classes by altering the hierarchy. This should be completely get-around-able
   when Trolltech get "moc" capable of handling the Q_OBJECT macro in a
   template class.
   Began to split the individual SettingsWidgets.cpp classes into their own
   files - there's a lot of them!
15 Finished slipping SettingsWidgets into separate files.
   Revert only reverts if there has been a modification.
   Played around with the PartView display a bit.
   Added PartViewWidget and PartViewList.
   Put an Apply button in the Settings window.
16 Moved the SettingsWindow creation into Application so there is only
   one per application.
   Really got the PartView display improved beyond recognition. Now implements
   every option, including the new 'dot' display and non-filled boxes.
   Linked this completely to the PartViewWidget. Very nice indeed. Use of
   the style()->drawPanel has been greatly improved: now produces a panel that
   uses the colour rather than a plain box. Setting panel width to 2 helped.
   Created the DPColourWidget.
17 Put apply button in Part widget. More work on the DPColourWidget, to get it
   showing the colours and doing the custom colour with a KColorDialog.
   PartView bolds the text in a selected Part. Apply in TrackWindow.
   Created the PresetColoursWidget and put it in the SettingsWindow.
   Made the PhraseListWindow use the little colour switches too.
   It is also now a Listener to PhraseList and DisplayParams, although it
   does nothing with them yet.
20 Implemented saveProperties and readProperites so that a RESTORE should
   work OK.
 * Release 0.0.6
23 Split gadgets MiscWidgets into their own files.
24 Finished mods to other #includes in the after math of this.
25 Added sliders to the ZoomWidget, altered the Zoomable interface so it also
   provides a percentage setting for use with the slider.
27 Removed the Buttons in the ZoomWidget. Made it update as it is opened.
   Added a popup menu to the PhraseList. Created a PhraseWidget and a
   PhraseWindow which is opened via this menu.
30 Altered the PhraseSelectionWidget so that it can be writable. Made the
   NewPhraseWindow dialogue use such a writeable widget.

-------------------------------------------------------------------------------
December

1  Added the inspiring Application settings widget.
6  Put that hideous cout text info into a static Application method so that it
   can be displayed more quickly when choices are being loaded, etc.
12 More work on the InstrumentsWidget, adding a list of port/channels to the
   destBox as a tree view.
13 More implementation of the InstrumentWidget - there is a combo box below
   the destBox that you can set the current instrument with. Channels aren't
   selectable unless the main port setting is "<None>".
   Put a "Reset" button in the settings window.
14 Polished off the behaviour of this widget.
17 Implemented saving in all formats, including asking whether you want to
   save as MIDI format 0 and 1.
18 If you don't give an extension for the saved file, defaults to .tse3.
   Gave the KeyOctaveWidget a more 3D look, and added the lastLine feature
   so that you don't have to have a double line with adjoining octaves.

-------------------------------------------------------------------------------
January 2001

2  Bugfixed SongWindow::changeSong - it dodn't change the PhraseListWindow
   properly.
3  Put a slider in the GotoWindow so you can quickly go to a place in the song.
4  Added .cvsignore files to make "cvs -nq update" less noisy.
   Finished off the GotoWindow slider, now tracks changes in the song, and the
   slider and ClockWidget are locked together. Really quite neat.
6  Converted the SongWindow to inherit from KMainWindow, not KTMainWindow.
   Added a Track menu to the SongWindow, and put the goto window as an icon
   on the standard toolbar.
7  Created the NewTrackWindow.
15 Began to add a SystemTray widget for some helpful feedback.
16 Finished off the implementation of the SystemTrayWidget. Two LEDs blink for
   MIDI input/output. A pixmap shows the current playing status. I haven't
   worked out how to get the dimensions quite right yet, though.
   Made the TimeLine autoscrolling an option. Had to munge the PartViewList
   to accomodate this, though. Added accessors for each child to the SongWindow
   and then changed the PartViewList to a SongWindowList.
   Sweet feature: if you have two (or more) windows open and play a song, the
   window with the unplayed songs have a timeline cursor that blinks grey -
   this will be very useful.
   PartView::changeSong updates PartView height.
   I noticed a comedy bug: with two SongWindows open it was possible to hit
   record, record some MIDI, and then when stopped get two NewPhraseWindows
   appearing. Of course, one lead to a crash. A quick TSE3 API change and
   appropriate alterations to SongWindow.
   Fixed the configure.in.in: if the wrong version of TSE3 was installed, the
   script carried on regardless.
17 Moved the KRecentFilesAction into the Appliction class to be used as one
   global object. I can then save it's properties on start/exit.
   Made the SongWindow open/save network transparent.
   Gave the TrackList a TrackListSelection. In order to tie them together they
   are both now owned by the SongWindow.
   Attemped to fix the number of TrackList columns that are shown at startup,
   but I'm jiggered if I can.
18 A fairly major hacking session to get the TrackList to use the
   TrackSelection. This meant that I had to stop the usual KListView usage and
   make the AnthemKListView much more clever, it filters mouse clicks and
   decides when it would like a selection. This information is then sent to the
   TrackSelection, which performs a notification which the list view picks back
   up and performs widget highlighting. Also removed the communication between
   TrackList and PartView to do their deselection (when you select a Track, all
   Parts are deselected) because the TrackSelection and PartSelection objects
   contain this functionality now.
   Then hacked the SongWindow so that the copy and cut buttons listen to the
   Track- and PartSelection notifications rather than signals from the two
   widget classes.
19 Using a combination of gdb and printfs found an evil bug where the program
   crashed when loading a new Song with a Track selected. Turns out that the
   TrackList's TrackSelection_Selected callback presumes that tracks are
   parented, when it mihgt not be.
   Sorted out the zoom icons: gave the scrollbar buttons little pixmaps and
   converted the buttons to QToolButtons. Nicer. Gave the ZoomWindow a couple
   of icons too.
   Made the play/stop/record/ff/rew icons look nicer, and made them switch on
   rather than change icon when selected.
   Sorted out the ZoomWindow so that the vertical scale runs in the same
   direction as the horizontal one.
22 Hitting the stop toggle button when already stopped no longer deselects it.
   Work on the PhraseEditors. Added midi0X.xpm icons for the list editor.
   Implemented the PhraseEditor stop/play buttons, with highlighting in the
   SongWindow stylee. Added accept/reject/revert buttons, but haven't
   implemented them yet.
   Fix to insideous little PhraseEditor crash - impl detr called from
   PhraseEditor's QObject dtor meant that the toolBar() had already been deleted
   and then ~ListEditor tried to remove it's icons. Random crashes.
   Ah ha! Fixed a weird runtime diagnostic. If you have a widget that uses
   signals/slots (ListEditor) that derives from a widget class
   (PhraseEditorBase) which derives from QWidget, and the middle layer
   (PhraseEditorBase) doesn't contain the Q_OBJECT macro (even though the
   middle level doesn't use signals/slots) at runtime you get weird diagnostics
   about the "cleanupEventFilter" slot not being defined. Sorted.
   Moved the splash screen across from RISC OS since it looks a bit nicer than
   what I was using. I will do a proper one some time...
23 Got the NewTrackWindow working. Mdae it use the TrackSelection, and update
   dynamically with the existence of a selection or lack thereof.
   Moved my hacked KListView into gadgets as FilteredKListView, so that the
   ListEditor can use it too, it has a weird selection model involving the
   TSE3::PhraseEdit class.
   Added the SongWindow::slotClearHistory.
   Made the TrackWindow and PartWindow proper listeners so if their object is
   deleted they disappear.
   The ListEditor sets a good initial size for the Type column.
   Changed executable name from "kanthem" to "anthem".
   Sweet little icons in the ListEditor showing the event type.
   Inserting of events in the ListEditor, with a facility that remembers the
   settings of the last clicked on events to be used for the inserted events.
   Made the ListEditorImpl update the display when an event is inserted.
24 With some effort got the selection mechanism working with the ListEditor,
   and got insert and delete working harmoniously.
   Added an append menu item to the SongWindow for me to implement later.
   Made the PhraseEditor listen to the PhraseEdit object and track the modified
   status. Shows this in titlebar. Also is a PhraseListener so that when the
   original Phrase is deleted the PhraseEditor won't try to use it again.
   Implemented PhraseEditor revert mechanism.
 * Release 0.0.7
30 Application.cpp uses the FileRecogniser to load songs now.
31 Made some new accept/reject icons. Implemented reject in PhraseEditor.
   Implemented ListEditor channel/time setting dialogue. If you insert an
   item now, the list editor also does a setCurrent - it's tidier that way.
   Closing the PhraseEditor acts as a reject - I now trap it.
   Finally discovered why the splitter behaves so badly when the SongWindow
   is resized. I admit that I was sure it was a bug in KDE/Qt. But, I had
   implemented a SongWindow::resizeEvent which looked right, but in fact
   muked the world up. Removing it now works perfectly. I think that it was
   added in the early days of development because the KTMainWindow didn't
   do resizes properly.
   I was forced to add the ARecentFilesAction class. KRecentFilesAction is
   just not good enough. If you have more than one then they don't reflect
   to show each other's files, and which do you save to the properties file?
   If you have one global one, each window attached to it, and then when you
   click on a file, all windows load it. ARecentFilesAction works around this
   whole clumsy area. Not nice.
   The slotOpenNew in the SongWindow doesn't always open a new SongWindow -
   if the file has not been modified then a new Song is put in the current
   window.
   Included work around for bug in QScrollWindow::resizeContents in PartView -
   if the new size is smaller than the current parent window size, the
   difference is not updated, so you can get old cruft hanging around there.
   I had to override resizeContents to fix this. Sigh.

-------------------------------------------------------------------------------
February

5  Changed the kanthem subdir to anthem.
13 Added some infrastucture so that phrase editors can be plugged in.
   Hid most of PhraseEditor behind a pimpl in the process.
   Changed PhraseEditor from a KMainWindow so stop it getting confused.
   PhraseEditor no longer inherits from KMainWindow which stops weird hangs
   sometimes. I had asked on the kde-devel list about this, but got no answer.
   In the end I noticed that KFileDialog uses a KToolBar without being a
   KMainWindow, so this is what I do too - you do get a diagnostic, though...
   Added KDE_ICON = AUTO to icons makefile - this may fix icon installation.
   Turned all PhraseEditors into objects generated by a PhraseEditorFactory -
   just to prove that the system works OK. It does.
18 Made the PartView a SongListener so it can notice when Tracks are inserted.
   Implemented the RMB add track action. Implemented Song_TrackRemoved in the
   PartView and TrackList. Needed to add an extra "index" parameter to the
   event to implement this!
 * Release 0.0.8
   Added a closeEvent handler to the PhraseEditor so that it can trap closes
   like the older version did. Also set the WDestructiveClose to ensure
   that PhraseEditors are deleted.
18 Made the PartView a SongListener so it can notice when Tracks are inserted.
   Implemented the RMB add track action. Implemented Song_TrackRemoved in the
   PartView and TrackList. Needed to add an extra "index" parameter to the
   event to implement this!
   Created a docbook manual file, not a lot in it yet, though :-)
19 Made the PartView menu honour the contents scroll settings!
   The TrackList can now reliably do Track insert and remove.
   Imported some of the RISC OS Anthem manual chapters into the new docbook
   manual.
   Implemented the shift key in the FilteredKListView widget since it was
   annoying me. Also fixed some control press behaviour.
   PhraseEditor accept now works.
   When new Phrases are inserted, the PhraseList selects and shows them.
20 If you don't have a Track selected when you record data, the NewPhraseWindow
   does not enable the "Insert phrase" checkbox.
   Added a "keep open" checkbox to the NewPhraseWindow, so that you can
   choose to leave a PhraseEditor open after having accepted an edit.
21 Much hair pulling out over a TSE3 notifier 'feature' - see TSE3 history.
22 NewPhraseWindow now suggests a new Phrase name if you don't specify one.
   There is a real problem with exceptions: if any get passed up to any KDE
   or Qt code, it segfaults because it's all built with --no-rtti. Sigh.
   Made the PartView a PhraseListener so that it can notice when Phrases are
   updated.

-------------------------------------------------------------------------------
March

13 OSSMidiScheduler settings widget uses latest TSE3 OSSMidiScheduler, and
   actually does some setting.
19 Setting the preset colours now works. Save now clears the modified status.
21 Added the KdeMidiScheduler stuff, so I can diagnose problems with output.
   It's quite neat, really. I had to make another streambuf to plonk output
   in a QTextView, then make a new factory which creates the widget and
   captures the output. Works OK (ish).
22 Added a cmd line --stream parameter that swithes this on/off and prevented
   crashes on exit. Quite nice now. So now I can debug the lack of Panic
   output...
   Exposed a row of hidden buttons in the PanicWidget - you can now see the
   "All notes off" settings.
   Added a copy button to the KdeMidiSchedulerWidget, and a warning if you try
   to close the window.
   Came across a Qt bug - if you append to a QTextView, and then set the scroll
   position to bottom (in order to display that text) immediately, the redraw
   fails. To work around this I have had to craft a timer callback scroll
   system. I've designed it so that it won't scroll down until events have
   stopped for about a second.
   Added a combo box to the DestinationWidget that contains the port names.
   I've been meaining to do that for ages.
   Used a more standard about dialogue.
   The SystemTrayWidget given a dtor which detaches from the Transport callback.
   This prevents a crash when you exit Anthem whilst playing.
   After having added some new events to TSE3, PartView was extended to update
   Parts who's Phrase DisplayParams, or Part sub component (MidiFilter et al)
   has altered.
   The Track has had a DisplayParams added to it. Showed this in the TrackList.
   In order to make life easier created ColourPixmap::newPixmap(DisplayParams).
23 Now there is the new Phrase event for DisplayParamsAltered, made the
   PhraseListWindow use that.
   Fixed but in PhraseListWindow new phrase slot causing crash (song == 0).
   PartView is a PresetColours listener so that it can redraw the display
   appropriately.
   The TrackWindow now supports opening automatically on the DisplayParams
   tab, and the TrackList handles this nicely.
   The Application class handles the error case when loading files - this helps
   when you specify a non-existant file on the command line.
   Relaid out the PresetColoursWidget now there's a new preset colour. This
   version should be more future extensible.
 * Release 0.0.9
26 Finally worked out how to set the QSplitter size at startup. You just need
   to defer it until you've actually shown the splitter. Sigh. I can't get it
   to exact pixel, mind you. The sizes you pass the QSplitter are not absolute,
   but relative.
   Added paramString to the TrackWindow, and made the TrackList use it for the
   params column. Made TrackListViewItems MidiParams listeners.
   The TrackList always has a horizontal scroll bar to ensure no scrolling
   problems when the splitter shows the whole thing, yet the PartView still has
   a scroll bar.
   Bugfix: DestinationWidget setting port combo when any == false
   Began to add the ListEditor_NoteEditor.
27 ListEditor_NoteEditor now fully operational. Mde the KeyWidgets a bit nicer;
   the popup object now is a QPopupMenu, for example.
   Added the ListEditor_DataEditor, and now the ListEditor can edit all data
   types. Sweet.
   Added the PhraseSelectEditWidget. This adds an edit button, which can
   open a PhraseEditor. This is the feature that Andrew Rawsley asked for in
   the original RISC OS Anthem. I'm not sure that I like it, but I include it
   because that's what the old version did.
   The Application now keeps a tab on what SongWindows exist. This means that
   the PhraseSelectEditWidget can open a PhraseEditor with the correct parent.
28 Added -oss and -alsa command line options. Added settings for the GS/XG
   device IDs to the PanicWidget.
30 Added toClipboard for TrackSelection and Phrase. Implemented cut for the
   TrackList and PhraseListWindow. That's nice. Now just need to do all the
   pastes...
   PhraseEditor::updateCaption gets cleverer, can now say whether you are
   editing a new Phrase, or of the Phrase being edited has been deleted.
 * Release 0.0.10
   Spaced out GotoWindow better.

-------------------------------------------------------------------------------
April

3  Began the VoiceWidget, a clever widget that will allow you to choose a voice
   by either name or number.
4  Split the MidiParamsSpinBox widget from settings/MidiParams.cpp to it's own
   file. More work with the VoiceWidget.
5  The ListEditor's delete button is disabled when there is no selection.
   More work on the VoiceWidget. Put a "By number" popup window which contains
   what used to be in the settings/MidiParams.h widget. Works well. Still
   haven't done any of the by name stuff, though.
   Made a click on no Part in the PartView clear both the selected Part and
   the selected Track.

-------------------------------------------------------------------------------
May

28-
31 Got the VoiceWidget working. It's really nice to select voices by name now.
   Added a separate "bank" spin box to adjust the consolidated value. The label
   greys out when there is an inconsistency.

-------------------------------------------------------------------------------
June

25 Added some plugin scaffolding to the Application class.
27 Added a plugin settings window, nothing in it yet!
31 Started a ControlWidget.

-------------------------------------------------------------------------------
July

11 Finally sorted out that stupid icon installation problem.
17 Implemented most of the plugin support - the loading stuff, at least, and
   then created the guts of the PluginWidget.
18 Implemented saving/loading the plugin list.
 * Release 0.0.11

(A large lull in development, due to personal reasons.)

-------------------------------------------------------------------------------
January 2002

17 Builds against latest TSE3.
 * Release 0.0.12
21 Added "make anthem-dist" rule for my convenience.

-------------------------------------------------------------------------------
March

22 Added SongWindow Part menu, and got to build with next TSE3 release.

-------------------------------------------------------------------------------
April

19 Coverted to the new TSE3 library, with the minor mods it needs for the API.
   Now, the port stuff is way out of line and will need a re-work.
   Fixed VoiceWidget bug where it presumed patchForBank always returned a
   non-zero object.
   Added a setClock signal to PartView to patch into SongView.
20 Added setClock to the TimeLine too, connected to the SongWindow. Added
   view options to the SongWindow. Put in a SongWindow settings option for it.
   Added a properties option to RMB SongWindow menu, works for Track and Part
   views.
22 Added a MidiSchedulerTimeSlider for the SongWindow toolbar.
   Clicking in the PartView only sets the clock if the scheduler is running.
   The clock setting is snapped. Added snap to the MidiSchedulerTimeSlider.
23 Split up the SongWindow toolbars into many toolbars. Added a settings menu,
   added configure key bindings.
24 Added the ClockDisplayWidget. Reimplemented MidiSchedulerTimeWidget in
   terms of it. Added a markers toolbar with set left/right buttons.
   TimeLine redraws when changeSong called.
25 TimeLine displays flags. Added a flag toolbar with prev, next and add
   buttons implemented. The prev and next are fairly intelligent implementations
   that will skip a flag you're currently on. Added a KComboBox to the flag
   toolbar. SongWindow is now a FlagListener too. Added a QTimer so that I
   can update this combo box nicely every time the song position changes. Nice.
   The PartView updates the from and to dotted blue markers when they move.
   The PartWindow listens for Part_Reparented as this is more important than
   Notifier_Deleted. Same for TrackWindow.
26 Added dragSetsMarkers option to PartView, and setting in the PartViewWidget.
   Made the repeat makers look a lot prettier.
   Created the PortWidget. Used it in the PanicWidget.
28 Finished off the PortWidget - a frightening bit of logic for some reason.
   Put a PianoRollEditor widget into the build system - with a factory to
   create it. Doesn't do anything yet, though.
   Removed the Port filter box from the MidiFilterWidget.
   Added a ChannelWidget too, in a bid to decomission the DestinationWidget.
   Split the PortSpinBox to a base class to help with the messy minus magic
   value logic. Converted the MidiFilter to use these two new widgets.
   Sorted out DesintationWidget::toText with newer "magic" values.
29 Started moving "common" widgets into a new directory (tse3/kdeui) which
   can eventually be made into a standalone library.
   Removed the DestinationWidget outright.
   Moved PortWidget and ChannelWidget into tse3/kdeui. Moved SnapWidget.
 * Release 0.0.14
30 Added tip of the day. Made the splash screen slightly less annoying.
   Started converting SongWindow to XMLGUI. Added the configure toolbars
   dialogue now I have XMLGUI underway (it took me ages to find this dialog
   since it's got an about-face name).

-------------------------------------------------------------------------------
May

1  A whole pile more XMLGUI modifications to the SongWindow. It's mostly there,
   now. I still have an issue with non-standard actions (auto-repeating
   actions, for example).
2  /Even more/ XML GUI work. It's quite tedious to move across, but it is
   better. In order to insert generic widgets into the toolbars it turns out
   that I have to write custom KActions. Did this for the ClockDisplayWidgets.
   Added some new operations like goStart/End/From/To and the transport menu.
   Created a generic QWidgetAction, and made all remaining SongWindow toolbar
   widgets use this. Excellent! Surprised that isn't in KDE.
3  Removed the ClockDisplayWidget since I can now just use the generic
   QWidgetAction. Added keyboard shortcuts for transport actions and pointer
   modes. Created the AutoRepeatAction for the rew/ff buttons (bit of a hack,
   but it works).
   Put the undo and redo action menus back in, with a little post createGUI
   hackery. There isn't a nicer way to do this. I didn't want to create a
   new KAction, since those actions should be KStdActions to get the
   accelerators, graphics, et al. I could have written a wrapper action
   that wrapped a std action and put a popup in the toolbar, but I'd have had
   to override every method, and that's VERY brittle. This hack is the best of
   a bad lot.
   Converted the settings window to a tabbed dialogue box, like most other
   KDE apps.
   Created the RMB menu from the XMLGUI.
   Implemented the select in track option, plus a new select in selected tracks.
   Performed the spade work for the hide/show toolbars action list.
4  Began to get this to compile under KDE3. Some API calls have changed. Altered
   the Makefile.cvs to autodetect the KDE type, and create the appropriate
   "admin" directory.
   Implemented the marker actions on the part menu. Then made these and the
   set both markers action update with the PartSelection.
6  Finally for the KDE 3 port. It seems to work OK, but the liquid style
   won't draw me coloured panels.
7  Worked out a neater compatibility layer for KDE 2/KDE 3 code.
8  Fixed some minor backporting issues. Put some more cleverness into the
   Makefile.cvs to put the KDEDIR into the path. Updated build docs.
 * Release 0.0.15
9  Created the FlagComboBox widget and moved all the nasty logic out of the
   SongWindow. It's nice to do this, I can resuse the widget, and it cleans
   up the SongWindow class a bit.
   Put a FlagComboBox in the GotoWindow.
   Tidied up the layout of Vu bar window. Fixed how it selected which port
   to update (and a crash). Implemented in/out/both selection and put this
   in settings dialogue.
   Made PartView settings look nicer by twiddling the scroll view.
10 Fixed the MidiSchedulerInfoWidget, and added a little more information.
   Put it into a scrollview.

-------------------------------------------------------------------------------
June

14 Sorted out the annoying action behaviour of the play/stop/record buttons.

-------------------------------------------------------------------------------
July

28 Fixed to compile with gcc 3.x. Changed email address to pete@cthree.org since
   I no longer work for Pace.
 * Release 0.0.16

-------------------------------------------------------------------------------
October

22 Fixed distribution so it builds "out of the box".

-------------------------------------------------------------------------------
 TODO
-------------------------------------------------------------------------------

Remove ARecentFilesAction

SongWindow
  - songs with 0 tracks?
  - Merge
  - Insert a series of controllers, series of tempos
  - tempo track display
  - timesig track display
  - lyric track display
  - current tempo, timesig
  - extend song info: filename, original type, modified, file date
  - keyboard shortcuts
  - shift left/right in toolbar - impossible?
  - work out how cut/paste works in KDE2
  - song info dialogue: filename, size, tracks, parts, events
  - all those Part operations (change pos = start/end/length)

Other windows
  - Phrase editors:
    - Piano roll (which is also drum and stave roll)
    - Step editor (or incorporate into other editors?)
  - Split Part window:
      ( ) into eual parts     []
      (o) split at time       []
      ( ) split at Part time  []
      ( ) split repeatedly
             starting time    []
             and then every   []
      ( ) split at each flag
      ( ) split repeatedly when silent at least []
  - tempo/timesig/flag track windows
  - destinations

Settings
  - Make PPQN settable???
  - Clock: internal, MIDI sync, SMPTE.MTC sync, audio sync
  - MIDI out: send start/continue/stop/clock
     - use start, never continue
     - song position pointer

Widgets
  - DestinationWidget using TSE3 port naming
  - VelocityWidget
  - other stuff in the PanicWidget
  - tidying keyboard widget edge
  - tidying vu widget
  - mixing desk
  - GoTo window: start,end,left/right marker buttons

Other
  - Audio/plugin integration
  - Internationalisation (not done yet becase I'm too lazy)

-------------------------------------------------------------------------------
