mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
First draft.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/gnucash-gnome2-dev@9250 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
149
src/doc/g2-architecture.txt
Normal file
149
src/doc/g2-architecture.txt
Normal file
@@ -0,0 +1,149 @@
|
||||
0) Naming
|
||||
---------
|
||||
|
||||
g1 - The gtk1 and gnome1 libraries.
|
||||
g2 - The gtk2 and gnome2 libraries.
|
||||
|
||||
|
||||
|
||||
1) GTK2 Primer
|
||||
--------------
|
||||
|
||||
In gtk2, an "action" is a g_object that represents some action that
|
||||
the user might want to perform. This object could represent opening a
|
||||
file, toggling the toolbar, etc. The action itself has *no* gui
|
||||
component. There is no way to directly display an action to the user.
|
||||
To do that, you assign the action to one or more proxy items. These
|
||||
proxy items are the regular menu items, toolbar buttons, etc. that you
|
||||
are familiar working with. There are several advantages to this new
|
||||
system. The first is that you no longer have to write multiple action
|
||||
routines; one for a menu selection and another for a button click.
|
||||
There is a single code fragment written for when the action fires,
|
||||
regardless of how it fired. The second advantage is that you no
|
||||
longer have to enable/disable the individual menu items and buttons.
|
||||
Enabling/disabling the action itself causes all proxy items to assume
|
||||
the same state. For example, if an account isn't selected in the
|
||||
account tree window, a single function call disables the "Open
|
||||
Account" command in the main application menus, the "Open Account"
|
||||
popup menu command, and the "Open Account" toolbar button.
|
||||
|
||||
A gtk2 "menu merge" takes descriptions of two sets of menus and merges
|
||||
them into a single menu that is displayed on the screen. The first
|
||||
menu must contain attachment points in it. These attachment points
|
||||
are specified in the seconds set of menus and control where in the
|
||||
combined menu the items from the second menu appear. This second
|
||||
"merged" set of menus can easily be removed at any time.
|
||||
|
||||
Gtk2 has deprecated the clist and ctree widgets. The replacement is a
|
||||
combination of a GtkTreeModel/GtkTreeView pair of objects.
|
||||
|
||||
In G1, most objects were based on a gtk_object, and were created,
|
||||
destroyed, signaled, etc. using functions on this base object. In g2
|
||||
the base object was moved from gtk2 to glib2, so most objects now need
|
||||
to be based on the g_object object. There are still compatibility
|
||||
functions on in gtk_object but you cannot mix and match calls to
|
||||
g_object and gtk_object. You must use one function set or the other
|
||||
for any given item.
|
||||
|
||||
|
||||
|
||||
2) Windowing Architecture
|
||||
-------------------------
|
||||
|
||||
In the gtk1/gnome1 (hereafter g1) version of Gnucash, the windowing
|
||||
was based on the "Multiple Document Interface" of g1. This code was
|
||||
hard to use in the first place, and has been deprecated in g2.
|
||||
|
||||
The g2 version of gnucash is a series of plugin modules designed
|
||||
around the g2 concepts of "actions" and "menu merging". These
|
||||
concepts will be integrated into gtk2.4 release. We are currently
|
||||
using the version of this code from the "egg" (proof of concept) code.
|
||||
These files have been copied from libegg into the gnucash sources.
|
||||
[Note: Some of these files may have been replaced with their gtk2.4
|
||||
versions. Once gtk2.4 is targeted as out base platform level, they
|
||||
can be removed from the gnucash sources.]
|
||||
|
||||
The first level of this architecture is an object representing a
|
||||
"pluggable" window. This object is responsible for:
|
||||
|
||||
1) the window itself
|
||||
2) providing a framework for plugins
|
||||
3) providing a base set of menus (and actions)
|
||||
|
||||
Plugins can be one of two types. The first type is simply called a
|
||||
"plugin" (e.g. gnc-plugin-register.c) and is used to add functionality
|
||||
to the base window. This plugin provides only a menu/toolbar
|
||||
description, and a way to create the second type of plugin. The
|
||||
second type of plugin is called a "plugin page"
|
||||
(e.g. gnc-plugin-page-register.c) and provides both a menu/toolbar
|
||||
description, but also a widget that is displayed in the containing
|
||||
window. This widget may be an account tree, a register, etc. The
|
||||
plugin page must also provide a standard set of functions to interact
|
||||
with the plugin manager code.
|
||||
|
||||
|
||||
|
||||
3) Model/View Architecture
|
||||
--------------------------
|
||||
|
||||
As mentioned above, the ctree widget has been deprecated in g2. Some
|
||||
parts of gnucash have been converted to the new style using either a
|
||||
gtktreemodel/gtktreeview pair of widgets, or using a
|
||||
gtktreemodel/eggtreemodelfilter/gtktreeview triplet of widgets. The
|
||||
account tree is presented here as example of the latter.
|
||||
|
||||
In gnucash, all the accounts are stored in the engine. The account
|
||||
tree "model" (a gtktreemodel) provides a representation of these
|
||||
accounts that can be used by one or more views presented on the user's
|
||||
screen. This code is designed so that there is only one single model
|
||||
for the accounts in a given book, and this single model drives all
|
||||
views. (This code should be easily expandable to multiple sets of
|
||||
books once engine support is added.) The filters and views are
|
||||
completely independent of each other, even though they share a common
|
||||
model, so you may see different accounts in each view, have different
|
||||
accounts selected in each view, etc.
|
||||
|
||||
The account tree model is designed as a tree and contains a "pseudo"
|
||||
account that is the root node of this tree. Whether the root node is
|
||||
visible is a per-view setting. Also in the model is code to display
|
||||
the contents of any row/column intersection in the tree. The
|
||||
gtktreemodel/view base code drives the actual display, and pulls
|
||||
numbers from the account tree model as necessary to display them. For
|
||||
all intents and purposes, the model is the sole gui representation of
|
||||
the account tree. The overlaying filters and views simply limit what
|
||||
the user sees to some subset of the information in the model. There
|
||||
are very, very few instances where code interacts directly with the
|
||||
account tree model. All interaction should be done through the
|
||||
account tree view described later.
|
||||
|
||||
The next layer in the account tree is the treemodelfilter. This
|
||||
filter is automatically created when the account tree view is created.
|
||||
In most instances, this filter is used to install a "virtual root" on
|
||||
the model that hides the top level "pseudo" account from the user. At
|
||||
the time of this writing, only the account edit dialog leave this top
|
||||
node visible (so the user can create a new "top level" account.) This
|
||||
filter level is use in several places to install a visibility filter
|
||||
onto the model, controlling which accounts are visible to the user and
|
||||
which are hidden. These visibility decisions are made in real time as
|
||||
the user clicks the disclosure triangle on an account to see what
|
||||
sub-accounts it contains. This callback function for the visibility
|
||||
filter is the only place where the code should interact directly with
|
||||
the account tree model, and the only interaction should be to take the
|
||||
provided model/iter pair and ask the account tree model for the
|
||||
corresponding account. After that the callback may do whatever it
|
||||
wants on the account and then return TRUE if it wants the account to
|
||||
be visible, FALSE if not.
|
||||
|
||||
The top layer of the account tree is the account tree view. The
|
||||
underlying gtktreeview object provides all the standard tree
|
||||
manipulation functions; opening accounts to see sub-accounts, selecting
|
||||
an item, etc. The account tree view is the programming interface that
|
||||
should be used to manipulate an account tree. It provides the
|
||||
functions to create a new view, to set a filter on an existing view to
|
||||
control the visible rows, to configure the columns visible in the
|
||||
view, to get/set the selected account(s) in the view, etc. There is
|
||||
also a selection callback function available from the view, that may
|
||||
be used to decide whether or not the user can select an account in the
|
||||
view. It is used in the new account dialog, for instance, to limit
|
||||
the accounts the user may select for the opening balance to an account
|
||||
that has the same currency as the account being created.
|
||||
Reference in New Issue
Block a user