Note: (Y) means done, (N) means not going to do, (*) means should be done, ( ) means under consideration * Scenes: ( ) Always: improve existing stickers and backgrounds ( ) kitchen, store, beach, bedroom, zoo, boating, construction site, space ( ) build an animal from parts ( ) stickers: planets, trees, better rainbow ( ) need a scene configurator --- as soon as you start grabbing gifs in a big way you need some way to organize them * Configure (*) allow separate directories for scenes and allow private scenes (*) provide restore button in the configure window to reload config file or return to defaults; maybe a defaults button as well (*) if work directory is empty string don't use a work directory (*) check if directories exist before accepting them in the configuration (*) choose a better work directory default than "./". Perhaps create one off home such as "~/.stickerscenes"? (*) perform tilda expansion in directory names ( ) consider warning the user that the work directory is not writable instead of quietly dumping the editted scene ( ) comment that save_size is compute bound on startup and doesn't represent actual memory usage, and undo_size is memory bound and does represent actual memory usage. ( ) rc and themes support (except that I don't care) ( ) allow config file to be specified on command line (so that different people can run the program from the same account). ( ) use finer grained control and thumbnail sizes ( ) store switch value (on/off) in the config file rather than only storing switches which are on and assuming the rest are off ( ) restore key repeat while in configure window ( ) command line option to override configure key "!" (so that users can't turn off pointer confinement or turn on printing for example) * Scene Selection/Initialization ( ) free images when they are no longer used. ( ) when parsing, ignore everything to the next @ when you don't understand the @ token; ignore everything on a line after '#' ( ) check pointer confinement maintained while switching between scene select and scene window ( ) acknowledge scene size specified on the newly loaded scene (easiest way is to clone the background to the new size immediately upon loading) ( ) progress dialog while loading scene ( ) put scene selection in a scrollable table ( ) provide a gallery window (next to the stop button) to save all the particularly wonderful scenes; add gallery button to the scene window which saves the current scene into the gallery; optional dialog to allow the user to name the scene? ( ) avoid double rendering when scene is maximized; fix problems with flashing sticker bar when scene is maximized * Scene Controls: (*) resize scene sometimes drops stickers!!! (*) sticker set cycle buttons '[' and ']' don't turn off immediately when you release the key (for high spin rates --- use slower spin rate until this is fixed). The solution is to separate sticker cycling from sticker bar update, and to call gtk_idle_add with the sticker bar update routine. Be sure to remove it when sticker bar finally catches up. (*) sticker notebooks need refinement (prettier tabs, notebook menu not accessible from sticker surface [right click on sticker tab to see what I mean], clicking on the raised tab doesn't select that sticker set [since no switch_page event emitted], notebook menu allows pointer escape [presumably because it is a new toplevel window which isn't subjected to the confine pointer treatment], clicking on overflow arrows doesn't cycle stickers) (*) use max of config.undo_size and config.save_size as basis for purging history in scene_push() [currently save_size is effectively less than undo_size]. (*) right mouse button doesn't work on some of the controls. It should work the same way as the left mouse button. ( ) better icons (especially print and configure) ( ) associate the signature with the scene; add a signature control to set the signature; make the signature float above the scene so that new stickers are pasted underneath. ( ) save current sticker configurations (colour, scale, rotation, mirror) when saving scene (@set sticker c colour s scale r rotation) ( ) use wait cursor whereever it needs to be used (note: wrong cursor used after maximize/restore; garbage on image after maximize/restore) ( ) aspect frame sometimes gives zero width (but doesn't seem to anymore) ( ) remove aspect frame frame (make line thickness zero width in canvas_new?) ( ) put scene controls in a scrollable list ( ) space out scene controls so younger hands have fewer accidents ( ) display the sticker name in the title bar --- educational usage when you dump in field guides to birds/flowers/trees etc.; hard to support internationalization though. ( ) show key equivalents on the surface of all control buttons ( ) allow deletion/movement of sticker which is not the most recently added ( ) provide redo in case you undo too much; would be nice to be able to add stickers before redo; would be nicer to be able to skip some stickers when redoing. ( ) slow down mouse while application is running? ( ) uncoordinated sticker sets (those with unrelated images) work better if the sticker state (colour, rotation, size, etc.) isn't applied to the entire set. That is, when changing notebook pages, don't copy the sticker state from the top page. Allow sets to be defined as coordinated or not. ( ) difficult to tell when sticker is pasted; perhaps show dashed outline around sticker while moving and remove it when pasted; audio feedback may be sufficient ( ) too much flash -- only show sample sticker while sticker control button is pressed instead of showing it continuously; show sample against a gray background; show sample next to the control rather than in the middle of the scene ( ) compositor: it would be nice to be able to build composite stickers for use on the scene which could be pasted as a unit; need to open a specialized scene window with gray background, which upon exit, saves the current bitmap as a composite sticker; add a new sticker set for composite stickers * Sounds: ( ) produce sound effects for all operations ( ) grow/shrink sounds depend on the current sticker size (use frequency; useful for brightness, et al., which both grow and shrink when you click the controls, but its hard to tell if they are growing or shrinking; doesn't work for hue, which cycles but doesn't have end points) ( ) sticker specific sounds for placing an image (click sound, paint loop) ( ) scene background sounds (init, loop, end) ( ) use esound (or other network aware multitrack mixer) * Rendering: (*) if you grow a small sticker to its maximum size, then switch to a larger sticker in the same set, the larger sticker will be too big to fit on the scene; either limit the small sticker to the maximum allowed by the larger sticker (preferable) or clip the size of the large sticker to the maximum allowed even if the scale factor would make it larger (easier to implement) (*) faster rotation by two shears and some flips; don't render pixels that are outside the transform (*) need neighbourhood weighting on shrink/grow (*) precompute rgb->hsv for all stickers (*) grab image from server is slow -- use rgb backingstore so it can be saved directly (*) use gdkrgb routines instead of imlib; need image loading library (*) cache transformed stickers (indexed by scale/rotate/flip) ( ) alpha channels to control sticker transparency -- use rgb backing store so the computation can proceed directly; may require updates to imlib to support reading alpha channels ( ) allow foreground semi-transparent layers for things like rain, text ( ) provide vector-based stickers for nice scaling/rotation; maybe use libart for rendering ( ) dll loading so that sticker rendering can be specialized to the particular sticker (e.g., fractal fern stickers); plugin needs its own sticker controls which replace the standard grow/shrink/colour controls when the sticker is selected, and must be able to convert the control state to and from a string so that it can be saved and loaded from the scene file * Housekeeping: (*) build rpm/deb files (*) restore key repeat even if program terminates abnormally ( ) write a man page ( ) add help button/screens so that all docs get translated ( ) use perror for the many possible file errors and simplify translation in the process; ( ) use an error dialog rather than the terminal to display messages; note that many errors might be generated for a single operation (e.g., opening a scene with missing stickers), so queue the messages rather than displaying them immediately. The first queue entry should set up an idle function to display the queue. The queue display function should return FALSE so that the idle handler is shut down when the queue is displayed. Use g_message(...) instead of printf for the messages, and set the queue handler function with g_log_set_handler (N) embed icons in the program to eliminate icon directory; increases executable by 50k for no particularly good reason. ( ) use scenes/icon_stickers.png as program icon ( ) gracefully handle low memory ( ) determine most compact image format and converting everything into it (png seems like the best choice) ( ) make canvas a proper widget (and remove references to canvas.blah and cursor.blah from the rest of the program) --- doesn't add any functionality, but it makes it a cleaner program. ( ) stop using "sticker" as a global variable, or at least attach it to scene ( ) distclean target should remove *.scene and *.scene.png from main dir ( ) use show/hide rather than recreating the windows when changing between scene select, scene edit and configure * Painting: ( ) provide / 0 # c as brushes (with rotation and scaling of course!) ( ) replace rest of sticker button bar with hue bar and saturation/value box (and background patterns if you are feeling ambitious) ( ) use non-linear interpolation between points for brushes (linear as a first pass). Paste brushes at every pixel on the trajectory. Vary the brushes based on the distance between the mouse sample points (i.e., based on mouse speed). ( ) use higher saturation at the center of the brush ( ) use xinput extensions for pressure/tilt * 3D scenes ( ) use opengl, gtkglarea for canvas ( ) solid modelling for stickers; size determined by distance from camera plus inherent object size and normal scaling controls ( ) normal position controls for x/y position; need new control for altitude ( ) need two additional rotation controls ( ) use opengl lighting models; stickers need to be light generators; need to control brightness/colour of the light; need to control reflection and transparency of the stickers ( ) need to control camera position and angle; maybe fix the camera to the top half of a sphere alway pointing to the center of the sphere, so that the 6 degrees of freedom (position and angle) are constrained to 2 degrees of freedom (height and angle). Then provide more awkward controls for sphere radius and sphere center so that the camera can be positioned within the scene.