On Sat, Jun 14, 2008 at 02:07:10PM +0100, Tom Hennigan wrote: > > On 13 Jun 2008, at 23:18, Youness Alaoui wrote: > >> >> >> On 6/13/08, Tom Hennigan <[EMAIL PROTECTED]> wrote: >> The plugins system is crap lol. Please re-write it. It is bad python. >> >> hehe! no problem! even if it's crap you still did something :p Alen said >> that he has a good plugin system for elloquence, we might use that.. or >> look at emesene's plugin system... although I think right now we should >> leave plugins support at the end! >> >> >> And the cocoa gui (so far!) is a poc. I will rewrite this after next week >> (when my exams finish :-D) >> >> yeah but it's still there... just like any other front end, they are all >> PoC... btw, a mac user is cocoa crazy and he wasn't able to make it work, >> looks like getMainWindow returns None... > He needs to run it from a bundle, rather than just python amsn2.py. > (Otherwise the nibs won't load properly, which build the interface). > There's a file in the root dir called setupCocoa.py, all he does is: > python setupCocoa.py py2app -A > And then he can run the application from dist/aMSN2.app > All there is so far is the login window, and a logging in screen. No > contact list yet. I'll work on this in a week, as I have exams at the > moment. > > - Tom > ok cool! thanks for the answer.. I forgot about setupCocoa.py.. I'll pass along the message. Thanks! KKRT
>> >> - Tom >> >> On 13 Jun 2008, at 19:09, Youness Alaoui wrote: >> >>> hehe, >>> yeah, it's getting more interesting with the many new developers >>> (welcome, if I didn't say it before:p)! >>> Actually, Tom wrote a plugins system, and did the cocoa GUI, so I wasn't >>> alone in there :p >>> And lephilousophe helped a lot with the design and did the initial proofs >>> of concept for gtk and QT during the 'investigate the proper toolkit' >>> phase (way before any real code or ui abstraction). >>> Then jandem did the gtk front end and now profoX is doing the QT front >>> end! >>> >>> KaKaRoTo >>> >>> >>> On 6/13/08, [EMAIL PROTECTED] <[EMAIL PROTECTED]> >>> wrote: >>> >>> >>> 2008/6/12 Youness Alaoui <[EMAIL PROTECTED]>: >>> >>> >>> On 6/12/08, [EMAIL PROTECTED] <[EMAIL PROTECTED]> >>> wrote: >>> That's genius :) It's like a huge cake of abstraction! I love it - this >>> way front-end developers can concentrate on what's important to them! >>> This modular approach also means the team can be so much more efficient! >>> >>> Thanks! >>> >>> Great work everyone who worked on this, it's looking good for the future! >>> >>> me :( >>> >>> You brave soldier ;) Don't worry, looks like everything is set to become >>> much more active! >>> >>> >>> Tom >>> >>> 2008/6/12 Youness Alaoui <[EMAIL PROTECTED]>: >>> Hi All, >>> >>> This email is to explain a bit the design and structure of aMSN2.. so >>> it's leaning more towards developers than towards users... >>> As I explained in my previous mail, the design is simle : >>> 1 - three layers : protocol, core, gui >>> 2 - the protocol is taken care of by pymsn >>> 3 - the gui is abstracted and any front end can be used (multi-front end >>> client) >>> 4 - the programming language is python... >>> >>> So for the technical details, first, download the source code. I've now >>> imported it into our public SVN, and you can get it from the SVN URL : >>> https://amsn.svn.sourceforge.net/svnroot/amsn/trunk/amsn2 >>> You will see the three layers in the amsn2 subdir, we have : >>> gui/ >>> core/ >>> protocol/ >>> >>> The idea is that the protocol layer will be the glue between pymsn and >>> the core, it will receive events from the core and notify pymsn, and it >>> will receive events from pymsn and notify the core. >>> This allows for one thing : modularity! I do not want to have code mixed >>> everywhere again like we had with aMSN 0.x... This would also 'in theory' >>> allow for switching to a different protocol or to a different library, >>> BUT we do NOT want to do this. It was decided that aMSN is an MSN clone >>> and if you want a multi protocol client, there are many good ones out >>> there.. we want to concentrate on the MSN protocol so users can have a >>> fully featured client, we want all our efforts to go into MSN >>> compatibility. End of the discussion! >>> >>> The GUI layer takes care of all our GUI needs, we have a 'manager' that >>> basically stores which front ends we have installed and allows us to >>> access their classes... a front end can register itself from anywhere by >>> calling the guiManager.registerFrontEnd, and giving it its module >>> (sys.modules[__name__] ). >>> Alen has maybe a different idea about this and we'll see what he comes up >>> with, so this design can change a little... >>> NOTE that everything so far is in proof of concept mode and anything can >>> change at any time! >>> The way I see the front ends is a bit like a set of mega widgets... or an >>> 'abstracted toolkit API' but higher level... >>> I will talk again about front ends once I explain the core a bit... >>> >>> The core.. the most important thing out there.. that's the heart of >>> aMSN2, we want every front end to act the same, to have the same >>> features, and this will be accomplished thanks to the core! The core is >>> the glue between the protocol and the UI, it will take care of profiles, >>> configuration, options, non-protocol/ui features, etc... >>> The most important part of the Core in terms of the other layers is the >>> 'views' concept. This design will allow us to have a really nice client, >>> easy to build new front ends, and a consistent feature set amongst all >>> the front ends... >>> What is a View? Well it's simple, it's how we want the user to 'view' our >>> UI. For example, the GUI doesn't need to know if a contact is online, >>> away or busy.. the UI doesn't need to know a contact's nickname or psm, >>> or a group's "count/total".... the UI only needs to know *what* to show >>> the user... If we tell the UI to show a specific icon (depending on the >>> state) for a contact, as well as what 'name' to give the contact >>> (including the PSM.. or not, depending on the user's options)... and if >>> we tell the UI that the group's name is "X (count/total)".. that's all it >>> really needs to know...right ? >>> well, that's what the views are all about, they tell the UI how to >>> display an object... >>> >>> So there's this magical thing that I called 'StringView'... it's a 'view' >>> on a 'string'... basically, it's a list of elements specifying how the >>> string should be displayed... A StringView can be something like this : >>> list : color red text "my nickname" image <img> text "<-- that was a >>> smiley" color grey text "(away)" color red text "\n" italic true text >>> "psm" italic false >>> (the stringview can also contains tags...) >>> >>> With a StringView we can represent anything we want.. the nickname of a >>> user, including smileys, including status, including the psm, etc.. >>> The reason why we do it like this is because : >>> 1 - we don't want every front end to have code for parsing the smileys >>> (what about custom smileys) >>> 2 - we don't want every front to need to access the user's preferences >>> like "show psm beside the nickname"/"show psm under nickname"/"don't show >>> the psm" >>> 3 - the UI doesn't need to know the status/whatever of a user, it just >>> needs to know *how* to display it.. because that's what the user will see >>> in the end... >>> >>> >>> So.. now that you know about the StingView, let's talk about >>> ContactView.. as you can see every ContactView has a unique identifier >>> representing the contact.. an 'icon', which will be an Image that gets >>> built by the core (using the front end Image class API).. it can be a >>> buddy icon depending on the status or the display picture (depends on the >>> user's options), it can also contain 'emblems' like 'blocked', or 'away' >>> emblem on top of the display picture, or a 'alarm' emblem if the user has >>> one... >>> We do not want the front end to need to look through the options, or to >>> query the core for whether a contact has an alarm or not, or query the >>> protocol to see if the contact is blocked or not.... >>> The ContactView also has a 'name'.. that's a StringView to represent the >>> contact.. it will contain the nickname (or custom nickname), parsed >>> smileys, the psm (depends on option)... the color of the nickname will >>> depend on the status of the contact, or depends if the user sets a >>> 'custom color' on the user.. etc... You now understand that we don't want >>> every UI to start checking if the user has set a custom nickname for the >>> user, or if there's a global custom nickname (or psm), or if he has a >>> custom color for the user, etc... >>> The ContactView also contains a 'dp' attribute which is an Image with the >>> display picture of the user... the reason why this is different from the >>> 'icon' attribute is because we might want to show them both.. for example >>> : >>> [icon] nickname [ display ] >>> psm [ picture ] >>> >>> Like pidgin does for example... whether that attribute contains the DP or >>> nothing will depend on the user's options again... >>> Finally, we have a 'menu' which is the contextual menu when you right >>> click on the user (it's a MenuView item describing what the menu >>> contains) and a 'tooltip' which is a TooltipView on what to show in the >>> tooltip... >>> >>> Now, I'll expain what the GroupView class is... it's a view on a group.. >>> hehe.. it's the same thing again, the unique id, the icon (will change >>> from collapsed to expanded icon), the name (StringView containing the >>> name of the group + the count/total), menu and tooltip.. but we have one >>> more item : 'contacts'.. it's an ordered list of the contacts contained >>> inside that group... >>> >>> The other view classes are pretty much self explanatory... >>> Now, we move the front end.. the front end is given to the core as a >>> module object, the module contains all the classes we want/need and the >>> core creates them as he needs... >>> Any front end should implement the amsn2.gui.base.* classes, we have a >>> few classes in there, it's not that complicated : >>> mainloop : this is just an abstraction over the main loop.... pymsn needs >>> the glib mainloop (hopefully removed soon), but you might want to run the >>> qt/gtk/efl main loop, depending on what toolkit you use.. you implement >>> this here... >>> main : the main window, this window will contain the login screen or >>> contact list... the login window and contact list windows will need to >>> use this window to show themselves inside of it.. why.. because we don't >>> want to have a window appear/disappear when you start logging in... >>> image : simple class to abstract an image.. use whatever library you want >>> to represent an image.. (QImage? gdkpixbug... etc...) >>> login : this is the login window... the base classe has documentation on >>> each function.. it should be straight forward... this implementation is >>> not yet finished, as we need a way to feed the login window the list of >>> profiles as well as the list of "sign in as " statuses for each profile >>> (if a profile has a saved custom state).... >>> contact_list : this is the interesting one... the base classes functions >>> are documented so it should be simple but I still want to explain this a >>> bit : >>> When you look at the api, you will notice something, there are only 4 >>> functions : >>> contactUpdated, groupAdded, groupRemoved, groupUpdated... >>> You might be asking "humm.. why isn't there a contactAdded, >>> contactRemoved, etc...", well, it's simple... here's how it would work, >>> on initial connect, you get a bunch of calls to groupAdded with the >>> groups of your contact list, in each of those groups, you have the >>> contacts (remember, GroupView.contacts), so the front end gets this, and >>> displays the group with its contacts... >>> in every possible scenario of the contact list getting modified, the 4 >>> functions are enough to make the UI sync with the protocol... >>> nickname changed : groupUpdated + contactUpdated ( the groupUpdated is >>> called if the sorting is done by nickname, so the front end gets the new >>> ordered list of contacts and it reorders the contacts in the UI) >>> psm changed : contactUpdated >>> status changed : groupUpdated + contactUpdated (the groupUpdated because >>> the sorting can be done on status, or if the user goes offline (if we >>> group offline contacts together, then we get groupUpdated for both >>> groups) the 'name' (count/total) of the group might also change, and >>> contactUpdated because the '(status)' or color might change) >>> new user : groupUpdated (the list of contacts has one more, the UI adds >>> it when it synchronizes the UI list with the groupview.contacts list) >>> deleted user : groupUpdated (same as above) >>> contact blocked, unblocked, etc... whatever : contactUpdated >>> sorting changed (ascending/descending/alphabetically, etc..) : >>> groupUpdated >>> >>> etc... >>> What this means is that the sorting is of course left to the Core.. the >>> core decides on how to sort the contacts, etc.. it's not the UI's job.. >>> but it also means that the UI must keep on each group widget, the ordered >>> list of contacts that are shown with their unique id, so it can >>> resynchronize itself when it gets a groupUpdated... of course, you can >>> just delete all contacts from the UI and rebuild them.. but try to be >>> optimal in terms of performance please... thanks... >>> This also means that.. I know, you won't like it.. but! it is >>> necessary... when a user clicks on a group, you must NOT collapse/expand >>> it.. you must tell the core about that event and let the core decide... >>> sending you a groupUpdated() with an empty list of contacts in the >>> GroupView... >>> The reason is simple : >>> 1 - the GroupView gives you the 'icon' for the group.. and that's what's >>> deciding if the icon is expanded/collapsed... >>> 2 - imagine an option 'never collapse groups'... we don't want a UI that >>> ignores that option... >>> 3 - imagine the option on a contact "always show this contact"... so we >>> would want a 'collapsed' group.. but still showing a contact... >>> 4 - what about 'collapse/expand' on double-click only... >>> >>> to be able to do all that, we need the UI to work this way! I know that >>> for some toolkits it will be easy/intuitive but for others (like gtk with >>> its treeview) it will actually involve more work... sorry about that! >>> >>> Also please note that *for now*, we don't have all that working... humm.. >>> yeah.. there's not much done with the icons.. the protocol doesn't do >>> much.. there is no "group_clicked" or anything like that yet.. so be >>> patient and we'll try to make the core evolve as fast as possible... >>> >>> any comments are appreciated! >>> >>> Thanks for reading! >>> KaKaRoTo >>> >>> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php >>> _______________________________________________ >>> Amsn-devel mailing list >>> Amsn-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/amsn-devel >>> >>> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php >>> _______________________________________________ >>> Amsn-devel mailing list >>> Amsn-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/amsn-devel >>> >>> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php >>> _______________________________________________ >>> Amsn-devel mailing list >>> Amsn-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/amsn-devel >>> >>> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php >>> _______________________________________________ >>> Amsn-devel mailing list >>> Amsn-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/amsn-devel >>> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php_______________________________________________ >>> Amsn-devel mailing list >>> Amsn-devel@lists.sourceforge.net ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ Amsn-devel mailing list Amsn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/amsn-devel