========================================================================= Newest versions are at the top! Contact: Stephan - stephan@wanderinghorse.net Rusty - bozo@sj.znet.com ========================================================================= 0.4.9 (02 Jan 2001): Mariusz Przygodzki found that if you had to existing ~/qub_config.xml, 0.4.8 would crash on startup. This is fixed. (Thanks, Mariusz! ========================================================================= 0.4.8 (01 Jan 2001): Note that this is probably the last release before we switch to using libGCom, which will hopefully be sometime in the next 2 months. It requires basically a whole rewrite, but it will give us lots of flexibility we didn't have before, as well as simplify the code base. - Added configuration variable "file.extensions.images", which takes a list like "gif jpeg png". Any files with these extensions will show up with an "image" icon in the directory view, and will be treated as image files by QUB (for example, it will try to add the file to the board). - Internal cleanups. Any classes whose files were named in little letters have now been renamed to match the class name (Java style). This affects: qub.{h,cpp}, icons.h, dirview.{h,cpp}. The exception is propertylisteditor, which simply slipped through. That'll be replaced later. - Added global function GConfigFile & ::conf(), which returns a reference to the global config object. This is now the official way to get the global configuration object. Include "gubglobals.h" to use it. - Added a Game Piece Preview mode in the tree view. To activate it, set the key "tree.preview.pieces" to "true" in the config editor, then click the Apply button. You will have to close and re-open any open directories to see this change. Note that this is slow as molases, and not optimized in any way, but it looks cool. *Note that this CRASHES* qub if you browse a dir which contains a file which has a GPiece subclass as it's root node! I don't know why yet, but it only affects Ogres which come with the Cisco gamepiece set, so I'm not soooo worried about it. - Painting of GPieces has been redone in a generic way, so we can get a "screen shot" of a piece's appearance at any moment. This is how the piece preview was done, and how drag/drop will be done in the future. - Added some automatic layout management for the config editor table. - SerialTree.h now has a template function for deserializing objects, which will ease the monotony of deserializing things. Call it like: // (assuming tree == a SerialTree *) GPiece *piece = ::deserialize( tree, (GPiece *)NULL, "GPiece" ); or ConfigFile *cf = ::deserialize( tree, (ConfigFile *)NULL, "ConfigFile" ); - Config editor now automatically updates individual fields if an outside entity edits them, and you won't lose your own editing unless it was exactly that field. - Added a "variable expansion" function to allow use of variables inside of strings, where the values for are pulled from the global configuration object. This allows easier maintenance of configurations. For example, instead of writing: gameset.root=/home/stephan/gamesets plugins.dir=/home/stephan/gamesets/plugins you write: plugins.dir=%_gameset.root_%/plugins The function to do this is GUBUtil::parseVars( const QString &stringToParse, const PropertyList *pl = 0 ) The PropertyList defaults to the global configuration object. Call it like: // config vars: // gameset.root=/home/foo/bar // my.fav.gameset=checkers/0.1 QString s = GUBUtil::( "%_gameset.root_%/%_my.fav.gameset_%" ); // returns "/home/foo/bar/checkers/0.1" (Of course, we should use string constants, instead of hard-coded strings here. Constant values for the config file keys (most of them) can be found in qub/inikeys.h.) If the PropertyList is null, it will harmlessly return the string passed to it. Parameters passed to qub on the command line can take advantage of this, like: qub %_gameset.root_%/DemoGame.xml This is useful because it allows portable scripts and desktop icons to be created :). It can also be used in saved games and the config file, to make it more portable across other machines. - libfunUtil: Added: QString SerialTree::toString() to return an XML string of the serialized data. ========================================================================= 0.4.7 (8 Nov 2000): - All drag-n-drop internals for the game board and all pieces use XML internally. - You can now copy in-play pieces by holding the Control key while dragging them. - Holding down the Shift key while dragging a piece will now drag all pieces which are actually touching that piece (bug: also drags board notes, etc, which happen to be touching it). - Main window and external board window now have nice icons in your task tray and task list. - Piece double-click behaviour is now configurable to some degree. Use a piece's right-click popup menu to change it. If you are editing a saved piece, use the PropertyList key "action_doubleclick" and following properties (defined in GPiece.{h,cpp}), without quotes: "flip" = flip over "rotate_right" = rotate right 30 degrees. "rotate_left" = rotate left 30 degrees. "edit_properties" = launches the properties editor. "remove" = removes the piece from the board. More will be added later. ========================================================================= 0.4.6 (26 Oct 2000): - QT 2.2.0+ is now required. - Game board can now be split into it's own window, allowing almost full screen usage of the game board. - Fixed a bug which caused a crash when adding graphics (not XML files) to the game and no backsides.filter is set in the config file. - Config file is no longer ~/qub.ini, but ~/qub_config.xml. Sorry, but there is no backward-compatibility support, so you'll have to re-set your options. But... - Config file can now be edited from within QUB. See the Config Editor tab in the main window. Most options won't apply immediately, but some will (like the gameset.root property). - DragLabel (and it's subclasses, GPiece and BoardNote) can now have any number of arbitrary properties set. This will allow built-in record sheets and such without having to use the Note field to do it. Use the right-click popup menu on a piece to edit it's properties. - Major work done on the underlying plugins code. It's not yet usable for the general public, though. These extensions include the ability to import plugins from sources other than those available to QUB at compile-time. - Took some extra icons out of the Ogre Records plugin. They just cluttered up the view. - Double-middle-clicking a piece launches it's property editor. Double-left-clicking a opens it's property editor if the piece has only one side. - Added first GPiece subclass, GOgrePiece, which extends the basic GPiece behaviour with some game-specific behaviour. See the gev-cisco gameset, version 0.6, for an example of how to use this (just double-click any Ogre piece). - Serialization change in class Ogre. Please delete [gameset.root]/plugins/ogre/ogres.xml and let it be regenerated. VPs have now been replaced by Ciscos, since those are the standard I have settled on for VP calculations. ========================================================================= 0.4.5 (15 July 2000): - Automasking is back in as an option, but we're not using QT's automasking because it crashes with rotated pieces (and doesn't actually do exactly what we want, anyway). - Rotation of an automasked piece is back in. - Game now shows a "wait" cursor while loading a game. - Fixed bug which caused the status bar toggle to not work correctly if the status bar's initial setting was hidden. Apparently, if a statusbar does not start out visible, then it can't be made visible later. This is worked around by starting it visible, then setting it to the user's setting. More than you ever wanted to know, I'm sure. - Some very minor hoverhelp/whatsthis text changes. ========================================================================= 0.4.4 (9 July 2000): - The Biggie: fixed a bad bug which caused all pieces to be on their last side after saving. The savegame was not broken, only the board, forcing the player to reload the file he had just saved. - When saving a piece by itself, it's filename will default to it's own name. ========================================================================= 0.4.3 (8 July 2000): - Game pieces now show their proper name as hoverhelp if they have a name, otherwise they'll still use the old format (the image name, minus the extension). - Added "save to file" option for individual pieces. This is useful mainly during gameset design. Note that all attributes, including location will be saved, so they'll need to be edited before being used generically. - Game piece serialization of pixmap names cleaned up. This version can load savegames from earlier QUB versions, but will always save in a newer format which is INCOMPATIBLE with earlier versions of QUB, so using an older version to load a game game saved in this version not work correctly (pieces will not have their graphics). - You can now middle-click on the board to center the view on that spot. Makes navigation of large maps much simpler (until we get a minimap). - Tabs can now have their own icons. - Ogre records plugin is way revamped. Still not yet complete, however. Still need to add saving and tying to a specific Ogre counter on the game board. - Fixed minor bug in dice plugin where the text area would not scroll down automatically when rolls were made. - Fixed bug in qub.cpp which caused game notes to be lost when loading a single-piece xml file. No, really this time. - Fixed bug which caused "clear board" toolbar and menu items to not function after loading a game. - Cleaned up the loading of XML files in qub.cpp, making it simpler to add built-in support for more types. All plugging in and unplugging is now handled in QUB instead of GUB. Not exactly as planned, but it's okay. - Can now load GPlugins from xml files. :) An xml file like: Ogre Record Sheets Ogres Will create an OgreRecordsPlugin and plug it in, with the tab title "Ogres". There is still work to do here. For example, to get plugins to load/save with a game. ========================================================================= 0.4.2 (24 June 2000): - Fixed bug in qub.cpp which caused game notes to be lost when loading a single-piece xml file. - Full-screen-mode toggle is out because of bugs with it and drag/drop. - Game board's "center dropped pieces" toggle is no longer stored in savegames, as this is more of a personal preference than a game setting. - Added very simple Ogre record sheet plugin. This will be expanded into clickable things someday. - New plugins menu in QUB, which allows plugging in of the compiled-in plugins, and unplugging of any plugins. - Basic dice roller plugin added. - GPiece pixmap strings can now be separated by newlines (\n) in the xml data. This allows prettier files, which is useful when hand-editing them. Eventually this will replace the &-separated strings, and the current image index will be stored in it's own XML node. ========================================================================= 0.4.1 (17 June 2000): - Plugging in and unplugging is now working, at least for the HTML plugin. I will now start to throw together a few more standard plugins, which will be available at all times via the menus... next version. - Fixed bug which kept loaded pieces from showing a drag icon until they were flipped over once. - If the tree view finds a file called qub.ini in a directory, it will parse that file as the ini file, and merge in it's settings with the global settings. All of them. This makes it very simple for a game directory to set the prefered colors and toggle states of the pieces, saving lots of clicking. - ConfigFile now emits signalChange( const QString & ) when a value is set, but only if the value is changed. Tie this to your UI controls, and they'll be self-updating. :) - Color selection dialog now saves your Custom Colors in qub.ini. - For consistency, I made all XML tags I could find lower-case. This will break compatibility with savegames (sorry), but it's nothing a quick text replacement won't fix. Also the "usernotes" node of GPiece has been renamed to "note", again for consistency across classes. These should use symbolic constants, but I just can't make myself do it. - Took useless de/serialize( QString ) out of DragLabel. - If you double-click an XML file which has a single GPiece node in it, the piece will be added to the board. If you make any of these files, use x=-1 and y=-1 to get the board to add them where the place marker (that little white box with the red x) is. Or just leave the x and y properties out. More details on this will be posted to the website soon, as there are some things to consider regarding the usage of default settings. - Took out some lame, deprecated functions from GPiece. - Automasking is DISABLED for now. It's crashing under QT2 when used with rotated pieces. - Game board now has a "center here" menu option, and the menu has been rearranged to group Actions and Options togher. - GConfigFile now holds an app-global static config object, accessible via shared(). This is replacing GUBUtil::getConfig() to save lots of build time. I'm tired o waiting for a whole rebuild every time GUBUtil changes, when some classes only use GUBUtil for getConfig(). GUBUtil::getConfig() is still there, and uses the same config object. - Piece defaults are now all stored in the ini, including the colors. - Started adding QWhatsThis help. This will make it easier to figure out how to use it. - The Default Piece Settings control is now more compact, and nicer looking. - More of the UI controls write their state directly to the config object as they are updating, instead of at destruction time, meaning that it's state change is immediately available to other objects which might want to check that value. The config object will be extended to emit signals when it's updated. - GConfigFile now extends fun/ConfigFile, giving it more functionality and better file support. It now keeps the order of keys, allows multi-line values, etc. This will be used to allow it to save to XML, too, which would allow super-config files. - Got rid of the "global.automask" option. Automasking is always available now, but optional. - Added txt files to the HTML browser. A limitation in the browser keeps it from recognizing README files as text unless they have a txt extension. - Double-click an HTML or TXT file to have it loaded into a tab. The HTML widget only handles basic HTML, though. No forms, for example. Tap Ctrl-W to close each of these windows. - Fixed bug in KTabBar which would cause new tabs to be mis-drawn if tabs were removed, then more were added. This looks like it is QT2-specific. - Most basic plugin functionality moved from BasePlugin to GPlugin, since GPlugin can't be pure virtual because of problems serializing it. - More consistency in Icons class. pixmaps() and getPixmap() now share common functionality, so the file dialogs, piece selection tree, and any other icon users can now share the global icon settings. - Just a note: I had no clue that QT already had autoMask() and setAutoMask() functions. I played with these, but could only get fully transparent pieces, to the point that they are wireframe: you can only see the border, and you can even click in the middle of them to move the placemarker. You can only turn the piece visible again if you are showing the border, otherwise all mouse events _go right through it!_ Strange. That's TRUE masking, not just pixmap masking, as I had hoped for. ========================================================================= 0.4.0 (10 June 2000): All versions from here on WILL REQUIRE QT 2.0 OR HIGHER! It is SOOOOOOO MUCH BETTER! Now I'm really looking forward to KDE2 :). Rusty eloped with QT2 over two days when I was out of town and moved us very quickly (and effectively) over to QT2. It looks a LOT better. It appears to take a lot longer to build, though. The many fixes/additions since 0.3.3: - Dragging pieces around now shows their icon during the drag. A bug is keeping this from working until after a piece has been flipped once. Dunno why yet. - removed QUB::status( QString & ). In QT 2.1 I see infinite recursion between that and the the const char * version. - dirview.percent ini file directive changed to dirview.width, after QT2 made the splitter's position-setter function defined as taking pixel offset. - QT2 allows the pieces to be dropped on top of each other and themselves. THIS is Cool As Fhhhhh... - Pieces now move to the top of the stack when clicked. :) This is implemented in DragLabel, so you'll need to call DragLabel::mousePressEvent() if you override that function. - Color selections now use QColorDialogs. MUCH better. - The config file now has all of it's set() methods as slots, so UI controls can tie right in. This three liner'll make it easier for us to develop configuration mechanisms like dialogs and self-updating widgets. - In the ever-going hunt for more screen real-estate, toggles for the toolbar and status bar have been added. This frees up a hex or two of space, which is better than nothing. If the statusbar is off, the titlebar takes over as the status line. When the status bar is turned on, the title takes on it's original form. These are in qub.ini under toolbar.show and status.show. These menu items should be expanded to use checkbox menus, but those things are such a pain in the ass to use in QT (there is no QCheckBoxMenuItem, and I... donwannasubclassthatbadboyrightnow). - General game notes were moved into GUB. Makes more sense for the notes to be tied to the game, instead of the board. To use the notes, simply edit the text in the "Game Notes" tab. When the game is saved, the notes are saved with it. When a game is loaded, the notes are loaded from the game. GBoard still has a note, but it's not currently accessible by the user or used for anything. I figure that too many places for notes will just confuse people. There is probably some genuine use for board-only notes, but we'll need to make them distinct enought that people don't confuse them with the game notes. Finally, scenario designers can embed the scenario text within the game file. An HTML renderer will be around some day (once we go to QT2), so you'll be able to include HTML scenario instructions :). I tried taking the KDE html widget, but it's too tied in to KDE to be immediately useful for us. GUB emits a signalNoteUpdated() when this happens, so you can watch it. - The Icons class now has some static methods for getting and setting icons. Use it to store your (non-gamepiece) icons, and get them (by name) later. This will be more extended to use non-compiled-in images, allowing themability for the user interface, just like KDE, GNOME, etc., have. I'm contemplating a couple possibilities for a "qub system directory" to hold these things. - Added a StringTokenizer class, taken from a deeply-buried spot int the KDE HTML widget's code. This one appears to not hammer your char * like strtok() does. :). I needed this because I was getting all kinds of futzed up results in ImageFlipper::parse() with strtok(), where it was hammering things which [I didn't think] it should have been. I guess that's why the man page says "never call this function." This is getting more like Java every day ;). - QuickDice are here. Add the following to your ~/qub.ini: dice=1d6 2d6 8d27 1d100 to add those dice to your toolbar :). Always use #d#, where the #'s can be any POSITIVE numbers. If you wanna know how this works, see DieButton.cpp and QUB::parseDice(). The parseDice() functionality needs to be moved into a static in DieButton, but I don't wanna deal with passing back an array or QList full of DieButtons right now. QuickDice default to "1d6 3d6 1d10 2d10 1d100". - DUH! I can't believe I didn't get this sooner: I took out an efficiency hack from GUBUtil::setBackSide(), so if you have backside.filter set (in qub.ini), like: backside.filter=-side2 -side3 -side4 Then have the piece: mypiece.gif You can now get additional sides by naming them: mypiece-side2.gif mypiece-side3.gif This is much less cumbersome than last revision's suggestion. NOTE: The longer this list is, the slower it works, because it looks for all possibilities before giving up. It appears that 2-3 items in the list has a minimal effect, but throwing 6+ in there can drastically descrease piece loading performance. This does NOT have a performance affect on loading a game, where the sides of the pieces are already stored, only when double-clicking to add a piece via the selection list. - My GAWD, another stupid one! The ini directive "backside.filter" has had NO effect so far - the hard-coded default was always taken because of a badly-placed line of code in GUBUtil !!!. My fault! - Finally solved the long-bugging question about why kdoc couldn't get GPiece's API docs right. The bug was in gubglobals.h, where I had empty GPiece and DragLabel declarations. I need them declared there for some hashtables, but I don't wanna include GPiece and DragLabel there because I don't want all .cpp files to depend indirectly on those .h's (and thus be rebuilt every time GPiece.h or DragLabel.h gets touched). Those are now ifdef'd, which gets around this problem. - GPlugin is no longer pure virtual. This was needed for de/serialization to work. - GUB.cpp's plugin API slightly expanded. Subject to adjustment at some point in the future, though. - yet another kapp.h include was laying around in GUB.cpp. I honestly don't dislike KDE (it rocks!) - I just don't want QUB to depend on KDE. ========================================================================= 0.3.3 (5 June 2000): - Lots more API docs were filled out and/or updated. - Yet another kcolordlg.h taken out of PieceDefaultsSetter.cpp. - Changed the "drag threshold" from 3 pixels to 2 (DragLabel.cpp). - Moved BoardNote's generic message handling capabilities into DragLabel, so GPiece could play with them, too. Pieces now have an editable note. - PlaceMarker has been removed from all serialization. This is an instance-specific "helper" which should never be saved. - QUB will now prompt before overwriting a file, and remembers your directory for the next time the dialog opens. - Selecting pieces via the selection now gives the ability to auto-load more than 2 sides per piece (finally, the 3-sided infantry piece I've wanted for GEV). This works by naming the files like you normally would for backsides, like: gev.gif gev-back.gif Then make two more: gev-back-back.gif gev-back-back-back.gif for a 4-sided GEV piece :). Note that you do not have to use "-back". You can use any suffix which is defined in ~/qub.ini as: backside.filter=... For example: backside.filter=-back .disabled -shock -2 Would try to find back sides for the "extensions" '-back', '.disabled', '-shock', and '-2'. These are not true extensions, however - they are the part of the name between the base filename and the extension. This support will be changed in the future, to make it cleaner. - ~/qub.ini now sets a default comment for backside.filter (I didn't realize I had left this out). - Board notes are now saved :). - Board notes are now removed when "Remove all pieces" is selected. - Serialization (saving) is now taken care of at a deeper level (DragLabel class, instead of GPiece), so any class which subclasses DragLabel (like GPiece and BoardNote) will have at least minimal serialization support built in. This broke compatbility with savegames from 0.3.2a. If you have savegame you really want to keep, here's how: Open it in a text editor and make the following text replacements. -- to -- -- to -- - Signaling of the desire to be removed from the board was moved from GPiece to DragLabel. This was needed to make removal possible after deserialization. ========================================================================= 0.3.2a (Also 3 June 2000): Es gab ein Problem mit den Release von 0.3.2 - my modem disconnected while uploading it to SF, and then I didn't have permissions to nuke it. SF probably isn't in this weekend, so probably won't get to my request to nuke it. Thus I'm going to go ahead and release the things I've fixed/added since then (it's been a productive day): - File dialogs now have more icons in them, making them easier to browse. - Savegames automatically tag .xml to their name, and the loader will default it's file selection list to "*.xml" (plus it will start out in your gameset.root). - Took a tab control from WebMaker 0.8.5. That will eventually be populated with plugins :). - Can now load a game by double-clicking an XML file. :) - Note to self: completely rewrite the icon service system. This is way too much of a pain in the ass to maintain. Make a static provider which returns Icons by name. ========================================================================= 0.3.2 (3 June 2000): - Hoverhelp on pieces is fixed. - Fixed bug which kept pieces from being removable after loading a game. - Savegames now use relative paths for graphics, so they should work across different systems. All paths are relative to the gameset.root. - Configure is made with --disable-shared by default, because I can't get shared to work (it crashes during saving). To re-enable it, edit Makefile.am, find this line: AM_DISABLE_LIBRARIES and add change it to: dnl AM_DISABLE_LIBRARIES ========================================================================= 0.3.1 (1 June 2000): Most change notes were lost in a cvs snafu. Basically, loading and saving now work. To build it, you MAY have to do: configure --disable-shared to get it to work. Some people don't need this, though. ========================================================================= 0.3.0: - Fixed a bug in GBoard::addDragLabel() which incorrectly disregarded a piece's location when a piece was already at ( x>0 && y>0 ). - n-seitig Stückchen sind da! A piece may now have any number of sides (up to an arbitralily-imposed internal limit of 50, there only to try to get around a possible bug which would cause an enldess loop). See the API docs for GPiece::setPixmaps() for full details. - Added a "toggle tree view" toolbar button. - Moved some enums which were outside classes into their respective classes. - Tree view's width is now saved in the ini file on exit. - Moved code which loads default game board from qub.cpp into GBoard.cpp. - QString *BoardNote::getNote() has been changed to QString BoardNote::getNote() - Adding notes to the board was locking up because of some recent changes in BoardNote. This is fixed (or worked around - it appears to be a QT bug). - Added getLocation() to settable splitter, but it's quite dumb. It can only return values set via setLocation() (it doesn't take into account user drags). - Got initial XML saving/loading in! Thanks, Rusty! Unfortunately, the XML tools won't compile on my unit, so I haven't yet been able to play :(. - Started the long task of moving my API docs from the cpp files to the .h files (hey, I'm a Java developer - it just makes more sense to me to have the docs next to the code, or they won't get updated very often). I can see the merits of .h docs, but I'm so used to javadoc and so unused to separate class definitions and implementations. Gimme a break, willya? - Forgot to checkin the ChangeLog in CVS tag R0_2_11, which means that when people check it out they'll have an incorrect ChangeLog. Ah, man. I think the version number in config.h might have been wrong, too. Oh, well. - Removed a leftover #include , which has been long-gone. Not terribly important right now, since the build process still looks for KDE. - I just noticed that the config file IS saved if you kill QUB with your window manager's close button. - Added KEY_PIECE_CACHE ('piece.cache') ini directive, which will control the image cache size for the piece graphics. Defaults to QT's internal default (1MB, per QT 1.4x's docs). ========================================================================= 0.2.11: Released 22 May 2000 - Ooops: Removing pieces was broken. This is fixed, but a bit kludgy. I need to settle on a better, more stable model for this. There is an inconsistency when removing pieces: When removing one using it's Remove Piece popup menu, GUB called delete() on the piece. When removing all pieces via the Remove All Pieces board popup menu item, GBoard::removeAllPieces() calls delete(). These need to be consolidated into a single clean-up step. - I think I messed up when I made toSaveString() a member of DragLabel. I need to implement fromSaveString(), and it should be static, but that no workie - static virtual. I've changed GPiece toSaveString() to serialize() and made it a virtual member of DragLabel. I've also added deserialize(), but it doesn't do anything yet. serialize() should probably be a QByteArray, but I don't wanna jack with that. QString extends QByteArray, anyway. Hopefully serialize/deserialize will be useful in network synching and possibly saving (except that Rusty is working on a cool XML-based save/load, which will make serialize() much less useful). ========================================================================= 0.2.10: Released 21 May 2000 - I hear Rusty has just about got some load/save support done. It's not in this release, though. It's in XML, too :) :) :). - File menu now has icons. - Minor changes to config file. More default comments and version number stamp. - It appears that I had futzed up setting background colors for transparent gif images. It's now been changed somewhat: There is now a "piece.globalautomask" qub.ini key when can enable the usage of automasking. It is off by default because it futzes with the ability of pieces made from GIFs to draw their selected background color. If you use transparent GIFs as pieces (as I suspect most people will, since they are more flexible than BMPs or XPMs in this regard), you need not do anything, and leave that key gone. If you want to use BMPs or XPMs (image formats which don't support transparency) then add the line pieces.globalautomask=1 to ~/qub.ini and then restart QUB. This needs to happen at program startup because that's when some crucial global parameters do their work. This is probably a stop-gap measure. If someone writes a new mask generator (like QPixmap::createHeuristicMask(), but one which masks ALL pixels dots of the given color) this will become basically a non-issue. Automask really needs to be set before a piece is brought into the game (before it is ever repaint()ed. Thus, I've removed that option from GPiecePopup. Note: I tried handling this based on whether the pixmap has an an alpha channel or not, but this didn't completely solve the funkiness when toggling automask on and off for a piece. By the way (in case you ever, for whatever twist of fate, happen to see this, just because you uncomment the code in GPiecePopup which enables this support): starting with auto mask off, then turning it on, then changing the piece's bg color, then turning masking off for that piece will give odd results when the piece is rotated to angles which are not multiples of 90. ========================================================================= 0.2.9: - Added "piece.automask" boolean to qub.ini. If this is set to true, then pieces added to the board will be drawn with a heuristic mask. This means that all adjacent pixels, starting at the top/left, with the same color as that pixel, will be made transparent. This is a way to allow changing of background colors for graphics formats which don't support transparency. For example, it can be used with BMP and XPM files to allow you to change your piece's background colors. It works quite fine for squarish pieces which have only a siluette (someone wanna spell that for me?), like Ogre and GEV pieces, but does not work well for detailed pieces with "see-through spots"in the graphic itself. Use it for checkers, but not for... for... well, whatever. I'll add it to the Piece Defaults UI one of these days. - In preperation for saving/loading I've reworked piece loading, off-loading most of the work to GUB::addGraphic(), instead of in QUB. This is so other clients of GUB could take advantage of some of the functionality. - Fixed a very minor UI annoyance in NoteDialog. - Just realized the reason for the "always starts up a few pixels down and to the right, compared to how it looked when I closed it last time" syndrome. It's because the widget location as set by setGeometry() takes the window decorations into account, but geometry() does not take them into account! There's gotta be a way around this. I can't hard-code values here because each theme and each WM is different. - Changed the default board map to a different grid. It looks more... interesting. Rusty's works of genius: These changes are mostly for getting "make dist" to include everything. Some stuff (like po/Makefile.am) was commented out entirely. - Moved qub/docs to doc, added doc/api, and a configure test for kdoc, and rules for building API documents (not being installed yet, though). - Added doc, doc/api, later, and qub/templates to SUBDIRS in Makefile.am so that their contents are included by "make dist" - Added NEWS (pretty much useless), removed "AUTOMAKE_OPTIONS = foreign" from Makefile.am. ========================================================================= 0.2.8: - This release is going to be much bigger than normal because 'make dist' isn't working for me. So... I am packing everything up by hand. - Game board can now have arbitrary notes laid on it. Right-click on the board and use the Add Note menu item. Right-click the note to remove it and right- or double-click it to edit it. They are note movable yet. - GConfigFile::commentKey() now works, and comments are printed above the key in the ini file when it's saved. - Still having problems with the X/Y coordinate marker. If I put it in the status bar, like the API docs say I can, it gets put in it's own window! If I put it in the toolbar (awkward, but okay), I _sometimes_ (~50%) get a segfault on startup. - Toolbar now has an exit button. - INI file is now saved before exit, as long as you don't use the upper-right X button to close the app (if someone can tell me how to intercept that close request, I'll add that support in). Most settings are saved correctly. - The following booleans are now used from qub.ini: piece.border piece.cover board.center.pieces Set to 1 for true, 0 for false. - Implemented GConfigFile::getBool() - Basic piece serialization done (GPiece::to/fromSaveString()). It's flexible and can be changed for any given savegame file (or storage medium, like network transport). - Color chooser dialog is MUCH improved. It is a whole lot more user-friendly now. - Note to self: Need to change GUBUtil::setBackSides() to use QFileInfo::baseName(), instead of chopping up the name manually. - Icons.cpp is now used as a QFileIconProvider for the QFileDialogs, which means that the dialogs now have file icons :). Cute, huh? Okay, it was just another way to put off writing a save/load feature. This originally had more features with it, but I've never rewritten them after some CVS snaffu killed it while working on 0.2.7. - Fixed erroneous URL in lsm file. - Hoverhelp on the game pieces appears to be fixed. Changed getShortName() to QString getShortName() to do this. Dunno why it worked with char * before, though. - Menu bar is behaving now (it was pushing the slider bar over to the far right(!!!). It's just got a File menu with an Exit at the moment, but it works. - Changed some code in GUBUtil which gave compiler warnings. - Took out a lot of debug output. - Ooops. About box had 'GUB' in the GPL line. Fixed. ========================================================================= 0.2.7: God, damn... CVS just hosed my Open toolbar entry and dialogs, plus all the slots and support I had added to GUB for this. I have no idea what else it hosed. Retype... - KDE dependencies are all gone. It is now a 100% pure QT application. :) - qubrc is GONE (because it was a KDE thing). Now uses ~/qub.ini. - Ooops. hoverhelp for About button said "About GUB". Fixed. - Added slotSave()/slotLoad() to GUB. Can be called w/o parms to have GUB launch a file browser. - Moved all of QUB's slots to private. - added GUBUtil::fyiDialog() for OK dialogs. - Open AND Save dialogs now do something. Save actually saves (but in a useless format, and it will overwrite whatever file you choose, so be careful). Load does nothing. - Hoverhelp for GPieces is broken. ADDED, THEN DELETED BY CVS: WILL BE RE-ADDED IN 0.2.8! - Icons.cpp is now used as a QFileIconProvider for the QFileDialogs, which means that the dialogs now have file icons :). Cute, huh? Okay, it was just another way to put off writing a save/load feature. A static instance of Icons is created in init(), which gets called in main(). Added a static pixmap( const char *filename ) which will give you a QPixmap for that filename or a NULL if it doesn't know. You can also use a cheat, and use it to get image icons with something like this: const QPixmap *p = Icons::pixmap( ".xpm" ); ========================================================================= 0.2.6: - 0.2.5 would not build under some compilers because of a const/non-const char conversion in GBoard.cpp. This has been fixed. - Board is now set to 10x the default graphic's height/width, instead of an arbitrary number. It gives nicer tiling. :) - Removed border around the map. It gave me the feeling of boundaries which should be there, visually confining the map even if it's not intended to be visualized that way. It's out. Uncomment it in GBoard::GBoard if you want it back. - WOW! On one of my system the pieces come in to play resized to several hundred pixels across! Eeeekkk! Ahhh... it happens when you don't have a "gameset.root" set. Hmmm. I guess that means I'll have to write a dialog to cofigure that. Oh, well. This bug was compounded by the GUBUtil::makeRelative(). In any case, it's fixed, apparently. I can still break if you add pieces whos graphics do not exist (you'll need to be a programmer to do that, not a player). - Fixed a bug in GUBUtil::makeRelative(). It was stripping out all / in a path if the gameset.root == "/" (which it does by default if one is not set). This broke loading of pieces, as their paths became usrhomewandergamesetsgev-ciscocp.alpha.gif. - For this release I've unset QUB_DEBUG in gubglobals.h, which was a directive to auto-load a piece from my drive. This is what caused the previous bug to show up (I used a relative path on a system where gameset.root was not set). ========================================================================= 0.2.5: - Added a bool to GBoard::removeAllPieces(), so you can say whether you want the removal to be optional. It defaults to true, which says to show the warning. - Removed extra calls to checking checkboxes in GPiecePopup - they were useless because they had an effect only when the popup was not visible. - GUBUtil::colorHexCode(): fixed handling of digits. They are now properly 2-digits per hex number. - Changed default hex map to look more blueprint-like. The other was too bright. - GBoard now extends QFrame, instead of QWidget. - Added a small (2-pixel) border around the game board. - Added GUBUtil::get/setHomeDir(). This should be used to find the "home dir" for the game sets on the current system (from the ini file, or changed via settings dialogs). All saved data must omit this part of their path so the data will be portable across systems. Home dir is now set via "gameset.root" instead of "tree.root". - Added some KEY_ #defines in gubglobals.h for qubrc key names. - Added QString DirView::getRoot(). - Added QString GUBUtil::makeRelative( const char * ). Turns a path into a path relative to the game root by truncating the given path. - GPieces can now load files based on full paths or paths relative to the game root. This appears to work, but requires support code in GUBUtil::setBackSides() (that should probably be moved into GPiece, anyway). ========================================================================= 0.2.4 01 May 2000 - Coolness! I just found this cool feature of Cervisia which lets me edit this file from within Cervisia, and have that message appear as my comment when I commit a file into CVS. Except that the font is too small to read. Oh, well. It was a good idea, anyway. - GBoard now has a default background image, a static XPM compiled in. it's not as big as it looks (it's about 6k), it's just tiled over and over. - Color selection dialog is no longer KDE's. It's primitive, but it works. If someone wants to make it react some way when a color is clicked, please stop by GColorChooser.cpp. ========================================================================= 0.2.3: 30 April 2000 - Moved around rotation menu. It now covers all angles for hex or square grid facings on standard wide- and long-grain maps. - I think I broke the make in the last release. It's fixed now, anyway. - "Next piece goes here" piece on gameboard has been moved into it's own class: PlaceMarker. Looks much nicer now. - Fixed messed up popup menu checkbox "Cover piece" in GPiecePopup. Had to start out the ID_ enum with a number higher than 0 (the rotation menu was internally set at that ID, apparently). - Tooltip for pieces is now just the base part of it's filename, minus the path and extension, instead of the whole path (that looked bad). ========================================================================= 0.2.2: 30 April 2000 - Added a popup to the game board. Class is GBoardPopup. - Center dropped pieces toggle. - Remove all pieces. - Added functions to get and set the toggle for centering of dropped pieces. (By the way, that's fucked up that QT doesn't have a menu item class which automatically takes care of it's own checkbox. It's no wonder so many QT applications are missing this little nicety.) - GPiecePopup completely rewritten. No longer recreates all menu items on each popup. (It was doing that because it's static, but I've found a better way of managing the menu items). - Toggle checkboxed in GPiecePopup are now appropriately checked. - Nicer layout, using separators. - Fixed bug in GUB.status() which caused it from diplaying it's output. I had been making a wrong assumption about how QUB worked. ========================================================================= 0.2.1: 29 April 2000 - Added support for automatically setting the back side of a file if one matching a filter is found. See GUBUtil::setBackSide(). The filter is set via GPiece::setBacksideFilter( QString ) It's static, by the way. This function can be used to automatically try to find and load the back side of a piece. So, if someone loads the piece "tank.gif" and qub finds a file in the same directory called "tank-disabled.gif" or "tank-back.gif", then it will automatically set the back side to that. Set this in qubrc with something like: backside.filter=-back .disabled -shock - Double-clicking a piece now flips it over. - Main window now uses the config file key dirview.percent to determine placement of splitter panel. This number is a percentage of the main window's width. Previously it used a pixel offset, but this is not how the panel's API works (the API docs say it takes "the distance from the left (or top) edge of the widget", which is apparently wrong). ========================================================================= 29 April 2000 0.2 uploaded. First upload with a version number. Only Rusty has any other copy. - Directory browser had all KDE code stripped out. It's now 100% QT. - Icons are now static, available via the Icons class. ========================================================================= ========================================================================= The End =========================================================================