Dev Meeting Log 20120309

From PCGen
Jump to: navigation, search

Below is the log of our developer IRC chat on Friday night/Saturday morning. In attendance were: Connor (cpmeister), Drew, Eric (maredudd), James, Stefan (Zaister), and Tom (thpr).


  • UI Architecture Walkthrough
  • Other Business


  • Label architecture diagram with the package names (Tom)
  • Schedule new meeting for the other 2 major topics (Tom/James)


(10:05 AM) [Arch_SB]thpr: So welcome all to the Code/Arch team meeting.
(10:05 AM) [Arch_SB]thpr: We had three topics from the list
(10:06 AM) [Arch_SB]thpr: - New UI update / structure for the team (James/Connor)
(10:06 AM) [Arch_SB]thpr: - Facet status / restructure / key principles of the design (see notes from the _dev list to provide a start of the background here - Tom)
(10:06 AM) [Arch_SB]thpr: - Future of PCG creation/parsing (Tom)
(10:06 AM) [Arch_SB]thpr: Then we can do open topics if there is anything additional
(10:06 AM) [Arch_SB]thpr: Questions before we have James/Connor go?
(10:06 AM) James[Code_SB]: Sounds good to me
(10:07 AM) [Arch_SB]thpr: ok, off to you James
(10:07 AM) James[Code_SB]: Connor would you prefer to present on the arch changes? I'm happy either way
(10:07 AM) devonjones_ [] entered the room.
(10:08 AM) James[Code_SB]: Hi Devon
(10:08 AM) cpmeister: hey, the last one
(10:08 AM) devonjones_: hiya
(10:08 AM) [Arch_SB]thpr: Hey Devon, we're just getting started
(10:08 AM) devonjones_: cool
(10:09 AM) [Arch_SB]thpr: Your floor Connor

UI Architecture Walkthrough

(10:09 AM) cpmeister: where would you like me to start? The UI facade layer? the new startup system? new property persistence?
(10:09 AM) James[Code_SB]: Maybe start with the UI facade structure
(10:09 AM) [Arch_SB]thpr: let's start with the UI, since that was the project
(10:09 AM) cpmeister: k

UI Facade Structure

(10:10 AM) cpmeister: the new UI is built upon the new facade layer to enforce separation between the UI and the core
(10:10 AM) cpmeister: I'm sure everyone knows that
(10:11 AM) cpmeister: but extreme care has gone into making sure that the core is reference ONLY through these facades
(10:12 AM) cpmeister: at this point, it is very easy to swap out the current UI for any other
(10:13 AM) cpmeister: a main boon to the facade layer is it's event dispatch system which automatically triggers listeners for changes within the facades
(10:13 AM) devonjones_: so the facades facilitate both retrieving information as well as applying changes?
(10:13 AM) James[Code_SB]: Yes
(10:14 AM) [Arch_SB]thpr: So help on what automatic means here...
(10:14 AM) [Arch_SB]thpr: Is there a system polling the core which then triggers events so the UI is actually interrupt driven?
(10:14 AM) James[Code_SB]: The facade layer generally presents a dynamic list of current items which the UI will subscribe to and thus be notified when any changes happen
(10:14 AM) devonjones_: are the facades capable of outputting any piece of data that can also be accessed via export tokens?
(10:15 AM) devonjones_: or is it a subset?
(10:15 AM) James[Code_SB]: So you might have a list of applied templates which the facade maintains and when this is changed an event is fired and if the UI is listening it can react to the change
(10:15 AM) James[Code_SB]: The facade covers a subset
(10:16 AM) [Arch_SB]thpr: So anything (anything displayed anyway) that can be changed in the core eventually fires an event, even if the only way to know about the change would be to poll the core?
(10:16 AM) James[Code_SB]: Yes
(10:17 AM) James[Code_SB]: Connor, maybe this is a good time to cover references?
(10:17 AM) [Arch_SB]thpr: So a global poll is done after every change
(10:17 AM) [Arch_SB]thpr: ?
(10:17 AM) cpmeister: sure James
(10:17 AM) cpmeister: right now there are a few classes which form the base of the event/listener system
(10:18 AM) cpmeister: one of them is the ReferenceFacade, which simply holds a reference to an object and the UI can attach listeners to it when the reference changes
(10:18 AM) [Arch_SB]thpr: That would be for something like Race? (which the PC can have only one)?
(10:18 AM) cpmeister: indeed
(10:19 AM) cpmeister: its up to the facade layer implementation to make sure that these references stay up to date when changes in the core occur
(10:20 AM) James[Code_SB]: One important feature is that the reference detects if the set is change and only fires events when a change happens
(10:20 AM) [Arch_SB]thpr: Does the facade assume it's the only master?
(10:20 AM) James[Code_SB]: Yes
(10:21 AM) [Arch_SB]thpr: So if you change something secretly, all bets are off
(10:21 AM) James[Code_SB]: Yep
(10:21 AM) [Arch_SB]thpr: In effect, you can capture the state with the set calls on the way into the core and fire the event after the core finishes, without having to poll the core
(10:21 AM) James[Code_SB]: Yes
(10:21 AM) [Arch_SB]thpr: for something like Race anyway
(10:21 AM) [Arch_SB]thpr: ok
(10:21 AM) devonjones_: say i want to listen from something that is a statistic that is derived. Say the attack bonus with a weapon, or a variable. Can I set a listener against a derived value like that?
(10:22 AM) James[Code_SB]: but sideffects need amangement, so a lot gets scanned after a change of race or class
(10:22 AM) [Arch_SB]thpr: which is kind of the global poll I was referring to after a change
(10:22 AM) James[Code_SB]: That's right
(10:22 AM) [Arch_SB]thpr: ok
(10:23 AM) James[Code_SB]: I'd really like to move the facade itself towards listening to the facets, but we can cover that later
(10:23 AM) [Arch_SB]thpr: Yea, we
(10:23 AM) [Arch_SB]thpr: will come to that discussion
(10:23 AM) James[Code_SB]: @Devon, currently no, but the structure would help you if you wanted to do that
(10:23 AM) [Arch_SB]thpr: @Devon: For BONUSes, the core will actually let you do that
(10:23 AM) devonjones_: cool
(10:24 AM) [Arch_SB]thpr: (check out BonusChangeFacet)
(10:25 AM) [Arch_SB]thpr: anyway, sorry, I was off topic talking about the core, back to Connor
(10:25 AM) cpmeister: are we done discussing the ReferenceFacade?
(10:25 AM) [Arch_SB]thpr: I am for now
(10:25 AM) devonjones_: I don't have any other questions, not sure for others
(10:26 AM) James[Code_SB]: all good
(10:26 AM) cpmeister: k, on to the ListFacades
(10:27 AM) cpmeister: these are basically a list upon which changes can be listened to
(10:27 AM) cpmeister: right now it covers simple adding and deleting of single elements
(10:27 AM) [Arch_SB]thpr: The phrasing of which leads me to ask... do we ever believe we need something more?
(10:28 AM) cpmeister: if more than one element changes in a single call then a third type of event is dispatched telling listeners that the list should be rechecked from scratch
(10:28 AM) cpmeister: @tom for the most part no
(10:29 AM) James[Code_SB]: I think we do have another case we need to expand them to cover which is where data attached to an item in the list changes
(10:29 AM) cpmeister: but there can be time when single changes would not be the most efficient, such as languages changes when a race is selected
(10:29 AM) cpmeister: yes, that situation needs to be addressed
(10:30 AM) [Arch_SB]thpr: So we probably need a similar situation on the base ReferenceFacade too James?
(10:30 AM) cpmeister: for now this usually has been handled on a per list basis, but the behavior is common enough that a general solution needs to be found
(10:32 AM) cpmeister: for example, a ListFacade containing ReferenceFacades
(10:32 AM) cpmeister: trying to listen to the internal reference facades becomes difficult especially when references can be added or removed from the list
(10:32 AM) devonjones_: perhaps if a Facade is added, ListFacade can detect that it subclasses Facade and automatically subscribe?
(10:33 AM) devonjones_: and unsubscribe upon removal
(10:33 AM) [Arch_SB]thpr: I'm trying to figure out what is meant by "somethign is attached to an item"... does that mean like RACE was granted another LANGAUTO because someone pulled up the LST editor?
(10:33 AM) James[Code_SB]: No, think about abilities
(10:33 AM) James[Code_SB]: and mult support
(10:34 AM) [Arch_SB]thpr: OH, associations
(10:34 AM) James[Code_SB]: So if a choice changes I;d like to get a changed event'
(10:34 AM) James[Code_SB]: yep
(10:34 AM) [Arch_SB]thpr: got it
(10:34 AM) [Arch_SB]thpr: So in that case, I'm not sure I'd go down the path of having something delve into the contents of the list
(10:35 AM) [Arch_SB]thpr: The core has the same problem of being able to detect those types of changes
(10:35 AM) [Arch_SB]thpr: And I didn't want to have to write a whole slew of code to special case Ability... in fact I somewhat refused to do that because it makes everything really weird by having to cast, pull out category, and all that junk
(10:35 AM) [Arch_SB]thpr: The core has two methods of thinking about Abilities.
(10:36 AM) [Arch_SB]thpr: One is the base abilities (Martial Weapon Proficiency, Dodge, etc.)
(10:36 AM) [Arch_SB]thpr: Another is each Ability with a single association.
(10:36 AM) [Arch_SB]thpr: That way if you only want to know the abilities (because you're responding to add TEMPLATE: things it would have granted you pay attention to the former
(10:36 AM) [Arch_SB]thpr: If you are based on a BONUS with a %LIST inside it, then you pay attention to the latter
(10:37 AM) [Arch_SB]thpr: it prevents treating Ability as a special case due to MULT:YES and we may want to adopt something similar for the UI
(10:37 AM) [Arch_SB]thpr: So the core in the former case is passing around Ability objects, in the latter a CategorizedAbilitySelection
(10:38 AM) [Arch_SB]thpr: That way, there is no casting or having to check for a Category only when you get Ability - it's all in 1 package
(10:38 AM) James[Code_SB]: To be honest I thik that's too low a level of detail for the UI
(10:39 AM) James[Code_SB]: Effectively what it is interested in is "fields on this row may have changed, refresh the data for it"
(10:39 AM) James[Code_SB]: There is no real concern that it is an ability, or an association etc
(10:39 AM) [Arch_SB]thpr: True, but the new UI forced some special casing on Ability back into the core, which I think needs a good think through
(10:40 AM) [Arch_SB]thpr: of why that had to happen
(10:40 AM) James[Code_SB]: Sure
(10:40 AM) James[Code_SB]: Happy to delve into that with you some time
(10:41 AM) [Arch_SB]thpr: k, that one's on the shelf for later, go on Connor
(10:41 AM) cpmeister: is there anything else you can think of thats Facade related? James?
(10:42 AM) James[Code_SB]: No, I think we've covered it pretty well


(10:42 AM) [Arch_SB]thpr: We've had a few threading issues come up in the last few weeks, so at some point I'd like to understand how many threads are in the UI (or at least the assumptions it makes about threading) and what it assumes about the core's ability to handle queries or sets from multiple threads
(10:42 AM) [Arch_SB]thpr: not sure if that's best handled now or not
(10:43 AM) cpmeister: for now it is just 2 types of threads, the UI event thread and the export sheet threads
(10:43 AM) [Arch_SB]thpr: Specifically, some changes made to MovementFacet indicated a read is happening in a thread concurrently to a write in another thread (since a variable triggered an NPE and it's never null when exiting any method
(10:44 AM) James[Code_SB]: Just quickly, there are really only two main threads - the swing worker and the character sheet thread
(10:44 AM) [Arch_SB]thpr: and both can call the facade?
(10:44 AM) James[Code_SB]: no
(10:45 AM) James[Code_SB]: The character sheet thread will use the export system via the facade
(10:45 AM) cpmeister: there is also another thread on the summay tab for the html character info
(10:46 AM) James[Code_SB]: Yes so potentially multiple export threads running is the worst case
(10:46 AM) James[Code_SB]: and sadly export currently forces an update of the character
(10:46 AM) James[Code_SB]: Which I suspect is where some of the issue comes from
(10:46 AM) [Arch_SB]thpr: ok. And since we still clone PC and that forces resets we can end up with one read thread and one write thread. ok. good to know
(10:47 AM) cpmeister: well, one write thread and multiple read threads
(10:47 AM) [Arch_SB]thpr: That may take some thinking and work to make the core resiliant to that (wasn't designed for it)
(10:47 AM) James[Code_SB]: You'd think but have a lok at, BufferedWriter)
(10:47 AM) [Arch_SB]thpr: k
(10:49 AM) cpmeister: any other issues?
(10:49 AM) [Arch_SB]thpr: not at the moment
(10:50 AM) cpmeister: so, startup system or property persistence system next?
(10:50 AM) [Arch_SB]thpr: startup is good
(10:50 AM) cpmeister: k


(10:51 AM) cpmeister: the startup system has been greatly revised and has been moved into its own package (pcgen.system)
(10:51 AM) cpmeister: the main entry point is which contains a highly simplified startup process
(10:52 AM) cpmeister: so of the major changes are in the handling of plugin and dataset loading
(10:53 AM) cpmeister: these all extend a new class PCGenTask which allow for its implementations to notify listeners when the task progress has changed
(10:53 AM) devonjones_: I would really like us to consider persisting memory from the last run of all the rules so that we can have a much quicker startup to the point of being able to modify a character
(10:54 AM) cpmeister: for the game mode and campaign loading this has required the creating of a new loader classes which monitor the progress of the loads
(10:54 AM) [Arch_SB]thpr: So there is still 1 entry point for both UI and non-UI?
(10:54 AM) devonjones_: (just noting since it's startup related)
(10:54 AM) cpmeister: yes
(10:54 AM) [Arch_SB]thpr: @Devon: That is something we want to look at, just hasn't had someone to do it
(10:55 AM) cpmeister: @Tom: yes those are both in the
(10:55 AM) [Arch_SB]thpr: and we need to hash out what is done automatically vs. cached, how you trigger reloads, that type of stuff
(10:56 AM) cpmeister: no work has been put into that kind of system yet
(10:56 AM) cpmeister: but it is definitely worth discussing
(10:57 AM) James[Code_SB]: Probably off tiopic just for now though :)
(10:57 AM) Maredudd [~maredudd@] entered the room.
(10:57 AM) cpmeister: anyhow, the new game mode and campaign loaders have made the old PersistenceManager obsolete
(10:58 AM) cpmeister: unfortunately, we can't uncouple PersistenceManager since it is still used as a static container for the currently selected sources
(10:58 AM) [Arch_SB]thpr: ok, wait, so pcgen.persistence is basically deprecated?
(10:58 AM) cpmeister: no, just PersistenceManager
(10:59 AM) [Arch_SB]thpr: ah, ok, so just the container for LstSystemLoader. thanks
(10:59 AM) Maredudd left the room.
(10:59 AM) cpmeister: well, the new loaders are composed of code copied from the LstSystemLoader, so the LstSystemLoader is also deprecated
(11:00 AM) [Arch_SB]thpr: ok
(11:00 AM) cpmeister: the loading process is the same, but the code has just moved
(11:01 AM) Maredudd [~maredudd@] entered the room.
(11:01 AM) [Arch_SB]thpr: I see, so CampaignFileLoader and SourceFileLoader at this point
(11:01 AM) [Arch_SB]thpr: and GameModeFileLoader
(11:01 AM) cpmeister: yes
(11:01 AM) [Arch_SB]thpr: that's nice, LstSystemLoader was big anyway
(11:02 AM) cpmeister: :)
(11:02 AM) James[Code_SB]: @Connor, speaking of tasks, I was thinking it might be good to move character load into a task so it gets a progress bar like source loading
(11:03 AM) [Admin_SB]Andrew: 2nd the motion
(11:03 AM) [Arch_SB]thpr: So tasks are progress listeners? Do they do anything else?
(11:03 AM) [Admin_SB]Andrew: :)
(11:03 AM) cpmeister: @Tom: no, not really. Just set them up and execute them
(11:03 AM) [Arch_SB]thpr: k
(11:04 AM) cpmeister: I'm not sure that making character loading a task would be worth while since the process is generally very fast
(11:05 AM) devonjones_: @James I agree, the abuse character loading subjects the interface to really makes the software look bad
(11:06 AM) cpmeister: I'm not sure about other people's systems but mine usually creates a character in less than a second
(11:07 AM) James[Code_SB]: For higher level or comple characters it can take a little bit longer for me
(11:08 AM) James[Code_SB]: Enough to notice the pause and sometimes wonder if the request is being processed
(11:08 AM) devonjones_: so to be fair, I'm still using 5.17.8 on my main system
(11:08 AM) devonjones_: but it takes like 10-20 seconds
(11:08 AM) devonjones_: maybe more
(11:08 AM) devonjones_: 7th level character
(11:08 AM) [Admin_SB]Andrew: 20-30 seconds, my characters are complex
(11:08 AM) cpmeister: ah, I see where the load times can blow up then
(11:08 AM) devonjones_: if the new UI has fixed that I havn't verified it with my actual characters
(11:09 AM) [Admin_SB]Andrew: @devon - my load times are against the trunk
(11:09 AM) devonjones_: loading and saving both lock up the UI, and honestly it's unplesant
(11:09 AM) devonjones_: it should totally be on it's own thread
(11:09 AM) cpmeister: very well, lets try to move character loading into a task then
(11:09 AM) devonjones_: saving as well.....
(11:10 AM) devonjones_: it could just be one persistence thread
(11:10 AM) cpmeister: there could be problems with using multiple threads though
(11:10 AM) James[Code_SB]: Sorry for taking things off topic again
(11:11 AM) Zaister: loading feels faster with the new UI, but still noticeable
(11:11 AM) cpmeister: what if the user changes the character while it is saving?
(11:11 AM) [Arch_SB]thpr: Let's just FREQ the request and keep going. Andrew can you capture that one?
(11:11 AM) [Admin_SB]Andrew: Sure
(11:11 AM) [Arch_SB]thpr: let's hash out the potential issues and design offline
(11:11 AM) cpmeister: k
(11:11 AM) James[Code_SB]: @Andrew I'm happy to create that one
(11:12 AM) cpmeister: James, is there anything else you can think of that is startup related?
(11:13 AM) James[Code_SB]: New command line stuff including PDF output, but its pretty stright forward
(11:13 AM) cpmeister: any other questions?
(11:13 AM) James[Code_SB]: So I think we've covered that topic well
(11:14 AM) [Arch_SB]thpr: I have one other non-preference UI question
(11:14 AM) [Arch_SB]thpr: but not sure where it fits
(11:14 AM) cpmeister: shoot
(11:15 AM) [Arch_SB]thpr: actually, forget it, too much in the weeds for the present - let's go on to persistence

Property Persistence

(11:15 AM) cpmeister: onto property persistence
(11:16 AM) cpmeister: the new code has the addition of the PropertyContext classes
(11:16 AM) cpmeister: these serve as general hashmaps maping strings to string derived values
(11:17 AM) cpmeister: eventually they will serve as a replacement for the SettingsHandler class which has grown much too large
(11:17 AM) cpmeister: the PropertyContexts are each stored in their own file
(11:18 AM) cpmeister: right now we have one for general preferences, one for UI preferences, and another for legacy preferences (SettingsHandler)
(11:18 AM) [Arch_SB]thpr: In effect, we have modularized the preferences?
(11:18 AM) cpmeister: correct
(11:19 AM) cpmeister: but PropertyContexts have other features as well
(11:19 AM) [Arch_SB]thpr: So occasionally we end up asking people to delete pcgen.ini, does this impact that?
(11:19 AM) [Arch_SB]thpr: is there more to delete now?
(11:19 AM) cpmeister: yes and no
(11:20 AM) cpmeister: as it was before, the use can simply delete the folder containing the files to start preferences from scratch
(11:20 AM) cpmeister: so no real added work there
(11:20 AM) [Arch_SB]thpr: k
(11:21 AM) cpmeister: but since it is modularized the we would have to identify where an offending property is stored before we could ask the user delete the file
(11:21 AM) [Arch_SB]thpr: right ok
(11:22 AM) cpmeister: anyway, the PropertyContext have 2 additional features, one is that they can be listened to
(11:22 AM) cpmeister: anywhere in the code a listener can be attached to a PropertyContext to track changes in specific properties
(11:22 AM) cpmeister: or even all properties
(11:23 AM) cpmeister: so far this feature hasn't been utilized very much but it exists for flexibility
(11:23 AM) cpmeister: the second feature is that within a PropertyContext a child context can be created
(11:24 AM) cpmeister: this allows for a set of properties to be isolated without having to create a new file for them
(11:24 AM) cpmeister: in general this works by adding a prefix to all the child properties that are stored in the parent context
(11:24 AM) devonjones_: is there a way we could implement this /without/ requiring the user to delete the ini files anymore?
(11:25 AM) cpmeister: that all depends on how well property checking is performed
(11:26 AM) cpmeister: the only reason the issue of deleting arises is that somewhere in the code it doesn't do checks to make sure that the property value is valid
(11:26 AM) [Arch_SB]thpr: Hopefully it's only in a dire problem you even ask them to do it
(11:26 AM) devonjones_: if we are going to compete with commercial vendors, that kind of UI thing needs to b e considered
(11:26 AM) devonjones_: as it stands, I have a strong tendency to keep a seperate copy of PCGen for every campaign
(11:27 AM) devonjones_: which is fine for me, but can't really be expected of average users
(11:28 AM) [Arch_SB]thpr: So are you thinking we need a button that auto deletes the files, or a lot more testing on loading/saving prefs or both?
(11:28 AM) cpmeister: oh, I forgot to mention the startup property context, config.ini
(11:28 AM) cpmeister: this file contains all of the startup information for pcgen
(11:28 AM) James[Code_SB]: I think a factory reset option somewhere would be handy
(11:28 AM) cpmeister: namely the location of all the directories
(11:28 AM) devonjones_: I think we need a pref scheme that lets us remove suspect preferences
(11:28 AM) cpmeister: if this file is deleted pcgen essentially returns to factory defaults
(11:28 AM) devonjones_: perhaps a string on a per setting basis that lets is identify the code version that wrote it
(11:29 AM) devonjones_: s/is/us/
(11:29 AM) cpmeister: that is asuming you to point the new config into the same directories as the old one
(11:29 AM) cpmeister: *asuming you don't
(11:29 AM) [Arch_SB]thpr: I think we need to capture that requirement and take it to the lists to flesh out what it means needs to be done
(11:29 AM) [Arch_SB]thpr: Not sure we're going to want to hammer through it here
(11:30 AM) devonjones_: that's fair
(11:30 AM) [Arch_SB]thpr: So a question on the properties
(11:31 AM) [Arch_SB]thpr: SettingsHandler tended to be very setBlah and getBlah focused. By the description, you are using more of a HashMap concept, where the key is known by the caller vs. using a separate method. Is there a list of those keys we are storing somewhere so folks know where to look?
(11:32 AM) cpmeister: for preferences, these keys are stored in custom subclasses of PropertyContext
(11:32 AM) cpmeister: like in for instance
(11:32 AM) ***[Admin_SB]Andrew is away from keyboard
(11:32 AM) [Arch_SB]thpr: ok
(11:33 AM) cpmeister: but for arbitrary properties, like UI column locations these is no requirement for the keys to be known externally
(11:34 AM) cpmeister: any other questions?
(11:34 AM) [Arch_SB]thpr: not at the moment
(11:35 AM) James[Code_SB]: none here
(11:35 AM) devonjones_: same
(11:35 AM) cpmeister: I think that covers the changes from the new UI, onto facets?
(11:36 AM) [Arch_SB]thpr: Just as a note I need to noodle on the preferences / settings thing. May come back to that in a future meeting on next steps there before we do a full conversion from SettingsHandler
(11:37 AM) [Arch_SB]thpr: Also want to note the conversation (I think from the lists) that indicated the game mode info currently in SettingsHandler doesn't belong there and wouldn't get moved into the property system - it needs a new, appropriate home (that can handle more than one being loaded)
(11:37 AM) James[Code_SB]: As I work on things I'm dragging setting out from SettingsHandler and into the new system
(11:37 AM) [Arch_SB]thpr: (just to keep all those thoughts in one place)
(11:37 AM) cpmeister: oh, I guess there is one last thing I could mention about the property contexts
(11:38 AM) cpmeister: the old SettingsHandler had a two layers of persistence
(11:38 AM) cpmeister: one was local variables and the second layer was the internal hashmap
(11:38 AM) cpmeister: the new property system only has a single layer, the hashmap layer
(11:38 AM) cpmeister: not sure what problems this might cause but thought it was worth mentioning
(11:39 AM) [Arch_SB]thpr: k
(11:40 AM) cpmeister: I think thats it from me
(11:40 AM) [Arch_SB]thpr: Anything else on the new UI project?
(11:41 AM) [Arch_SB]thpr: We generally hold these to 2 hours, so I'm not sure we want to delve into either of the other 2 major topics due to time risk. Any objections to deferring those to another meeting?

UI Delegate

(11:41 AM) James[Code_SB]: Oh the uidelegate would be useful to mention
(11:41 AM) cpmeister: ah yes, the UIDelegate
(11:41 AM) James[Code_SB]: The facade sometimes needs to ask the uiser things or let the user know of issues
(11:42 AM) James[Code_SB]: To avoid it coding in swing dependancies etc it gets passed a UIDelegate via which it can interact with whatever UI is in place
(11:42 AM) James[Code_SB]: This is currently assuming dialogs, but it would interesting to see how this worked on a mobile device for instance
(11:43 AM) James[Code_SB]: The uidelegate in the case of the new UI is the main PCGen frame, which implemnts the appropriate interface
(11:44 AM) James[Code_SB]: any questions on that one?
(11:44 AM) [Arch_SB]thpr: So theoretically, those methods on UIDelegate are called from the Facade?
(11:44 AM) [Arch_SB]thpr: So a "you need to do X event" coming out of the core goes through that part of the Facade in order to get the answer returned to the core?
(11:44 AM) James[Code_SB]: That's the intent
(11:44 AM) [Arch_SB]thpr: which gives the core a way to call the Facade/UI without having a swing dependency
(11:45 AM) James[Code_SB]: I have yet to subvert the choosers for instance to use that system but it is on my todo list (damn is that list long too)
(11:45 AM) [Arch_SB]thpr: (hopefully obvious that the code may not LITERALLY work that way in the method calls, but by intent)
(11:45 AM) devonjones_: so at least with android, if I'm understanding it, it actually fits reasonably well. The API does a lot to keep 'real work' separated from UI.
(11:45 AM) devonjones_: probably on android I would fire an intent when I say the dialog request
(11:46 AM) devonjones_: s/say/saw/
(11:46 AM) James[Code_SB]: cool, so it sounds like it could work
(11:46 AM) cpmeister: @Devon, IIRC android doesn't do a very good job of supporting modal dialogs
(11:47 AM) devonjones_: it depends on your app design
(11:47 AM) devonjones_: it does have a modal dialog
(11:48 AM) cpmeister: its not modal in the same sense as it is in Swing
(11:48 AM) devonjones_: I suspect, based on this conversation, I would probably need to make the pcgen core into it's own activity
(11:49 AM) cpmeister: well, I think we might be getting a bit off topic
(11:49 AM) devonjones_: this is true
(11:49 AM) cpmeister: lets save the conversation for later
(11:49 AM) devonjones_: yes, very
(11:49 AM) [Arch_SB]thpr: ok, any last questions on the UI?
(11:49 AM) James[Code_SB]: None here :P

Other Business

(11:50 AM) [Arch_SB]thpr: Any objections to scheduling a new meeting for the other 2 major topics? (we'll find time with a thread on _dev)
(11:50 AM) devonjones_: none here
(11:50 AM) James[Code_SB]: No that should be fine
(11:50 AM) cpmeister: none here
(11:50 AM) Zaister: ok with me
(11:50 AM) James[Code_SB]: I'll post this meeting chat to the wiki so we can refer people to it for a description of the UI architecture
(11:50 AM) [Arch_SB]thpr: Any open topics folks want to hit in the last 10 min?
(11:51 AM) devonjones_: yes
(11:51 AM) devonjones_: so the architecture at
(11:51 AM) devonjones_: I would like to propose that we move to every box in that being it's own jar
(11:52 AM) devonjones_: I think it has a lot of benefits for the existing app
(11:52 AM) James[Code_SB]: I can't say I am overly keen on that idea
(11:52 AM) cpmeister: me neither
(11:52 AM) devonjones_: it gives us a way to enforce the the arch borders
(11:52 AM) devonjones_: to ensure that nothing from one box is calling into another box
(11:53 AM) James[Code_SB]: I thinik they should be packages but having different jars makes user startup harder and install problems harder to diagnose
(11:53 AM) devonjones_: it also makes interfacing with pcgen outside of the existing app much easier, as you can use the ones you nee
(11:53 AM) devonjones_: need
(11:53 AM) [Arch_SB]thpr: I think it would be good to note - either way - that some of them are still inexorably linked at the moment
(11:53 AM) devonjones_: we already have a large number of jars
(11:54 AM) James[Code_SB]: I don't think that sort of static analysis should drive the ditrbution
(11:54 AM) devonjones_: @Tom: right, moving to this woudl help us idntigy where the code is breaking arch
(11:54 AM) James[Code_SB]: Yes, but they are quite different and cause enoguh headaches
(11:54 AM) devonjones_: god, my typing is sucking, sorry
(11:55 AM) devonjones_: so to be clear, I am angling towards being able to make an android app, and I want to be forward with that
(11:55 AM) [Arch_SB]thpr: So just thinking about this a bit - right now are we at a point where a non-UI call can operate without ever trying to load a UI class?
(11:56 AM) devonjones_: and one of the big problems is that in it's one jar state, frankly it's simply not possible
(11:56 AM) [Arch_SB]thpr: That would have broken in the old UI
(11:56 AM) cpmeister: for the most part yes, but there are still some linkages in the core to the old UI which have not been resolved
(11:56 AM) James[Code_SB]: but are on the agenda
(11:56 AM) cpmeister: but from what I can tell most all the linkages from the new UI to the core have been eliminated
(11:57 AM) [Arch_SB]thpr: ok
(11:57 AM) James[Code_SB]: @Connor I think we might still have some work in the sources dialog - I thikn the facade needs to be expanded there
(11:58 AM) devonjones_: my gut is that without splitting a goal of splitting things, we can't actually enforce strict arch borders
(11:58 AM) James[Code_SB]: As a suggestion, a first, uncontrovertial stage for this topic would be being able to label each box with a package name
(11:58 AM) [Arch_SB]thpr: We should try creating a JAR without the UI and runnign it through to get a PDF and see if we can pull it off in a headless fashion
(11:58 AM) devonjones_: and I think if we manage to get those strict borders into place, it has high value for the existing project
(11:58 AM) devonjones_: @James: very reasonable start
(12:00 PM) [Arch_SB]thpr: ok, so I'll try to dig up that figure and label it with the package names
(12:00 PM) James[Code_SB]: Cool
(12:00 PM) [Arch_SB]thpr: and we'll start there
(12:00 PM) [Arch_SB]thpr: I think tehre are 2 projects out of this though. One is I can identify what classes / behaviors are violating the package names they should be in
(12:00 PM) James[Code_SB]: and we should go the other way and add package docs to point each package back to the arch layers
(12:01 PM) [Arch_SB]thpr: and the other is my comment about seeing if we can get a headless mode running to produce a PDF to "prove" we have the UI detached. Obviously this may be scheduled for a future date once some additional work is done, but I think we should have that as a target. that make sense?
(12:01 PM) cpmeister: makes sense
(12:02 PM) devonjones_: yes, and that gets me much closer to my goal
(12:02 PM) devonjones_: so as a more restrained approach
(12:02 PM) [Arch_SB]thpr: ok, we're past 8. Any last comments on this before we close?
(12:02 PM) devonjones_: I would at least like to propose an ant target that produces a jar that can produce PDFs and has no swing links
(12:03 PM) James[Code_SB]: None here
(12:03 PM) devonjones_: ok, I can hold that question until next meeting
(12:03 PM) devonjones_: so retracted for now
(12:03 PM) [Arch_SB]thpr: I think there is work to do before we can get to that anyway
(12:03 PM) devonjones_: oh, clearly
(12:03 PM) [Arch_SB]thpr: from what I can tell from James' and Connor's comments
(12:03 PM) devonjones_: I'm purely talking goals
(12:04 PM) James[Code_SB]: I'd be surprised if there was a to left to do there - I think it is reasonably close
(12:04 PM) [Arch_SB]thpr: ok, thanks everyone for attending, [swipes Andrew's gavel and bangs, then hands it back]