Subject: [PATCH] Dynamically set number of control panel columns
From: [email-masked]
To: [email-masked]
Cc: [email-masked], [email-masked], [email-masked], anishmangal2002 <[email-masked]>
Date: Sun, 20 Jun 2010 22:57:46 +0530

From: anishmangal2002 <[email-masked]>

This patch sets the number of icon-columns in the control
panel based on the screen resolution. This patch also sets
the table row spacing to GRID_CELL_SIZE.

How the number of columns are calculated:
Let 'W' be the screen width, 's' be the GRID_CELL_SIZE and
'n' be the number of icon columns that can be comfortably
accomodated. Further, lets assume that the width an icon
and its text-label occupies a horizontal space equivalent to
(2.5 * s). We may represent 'W', 'n' and 's' by the following
expression:

     W - (2 * s) =  (n * s + s) + (2.5 * n * s)

where 'W - (2 * s)' is the width of the control panel menu,
'(n * s + s)' is the cumulative column spacing of 'n' icons,
and '(2.5 * n * s)' is the width occupied by 'n' icons and
their text-labels. From the above, 'n' may be computed as

     n = (1/3.5) * ( w/s - 3 )

Signed-off-by: anishmangal2002 <[email-masked]>
---
 src/jarabe/controlpanel/gui.py |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/jarabe/controlpanel/gui.py b/src/jarabe/controlpanel/gui.py
index 51d9820..4a54310 100644
--- a/src/jarabe/controlpanel/gui.py
+++ b/src/jarabe/controlpanel/gui.py
@@ -33,7 +33,6 @@ from jarabe.controlpanel.toolbar import SectionToolbar
 from jarabe import config
 
 _logger = logging.getLogger('ControlPanel')
-_MAX_COLUMNS = 5
 
 class ControlPanel(gtk.Window):
     __gtype_name__ = 'SugarControlPanel'
@@ -41,6 +40,9 @@ class ControlPanel(gtk.Window):
     def __init__(self):
         gtk.Window.__init__(self)
 
+        self._MAX_COLUMNS = int( 0.285 * ( ( gtk.gdk.screen_width() /
+            style.GRID_CELL_SIZE ) - 3.0 ) )
+
         self.set_border_width(style.LINE_WIDTH)
         offset = style.GRID_CELL_SIZE
         width = gtk.gdk.screen_width() - offset * 2
@@ -110,6 +112,7 @@ class ControlPanel(gtk.Window):
 
         self._table = gtk.Table()
         self._table.set_col_spacings(style.GRID_CELL_SIZE)
+        self._table.set_row_spacings(style.GRID_CELL_SIZE)
         self._table.set_border_width(style.GRID_CELL_SIZE)
 
         self._scrolledwindow = gtk.ScrolledWindow()
@@ -134,8 +137,15 @@ class ControlPanel(gtk.Window):
         except ImportError:
             del self._options['keyboard']
 
-        row = 0
-        column = 2
+        # If the screen width only supports two columns, start
+        # placing from the second row.
+        if self._MAX_COLUMNS == 2:
+            row = 1
+            column = 0
+        else:
+            row = 0
+            column = 2
+
         options = self._options.keys()
         options.sort()
 
@@ -157,7 +167,7 @@ class ControlPanel(gtk.Window):
                                    column, column + 1,
                                    row, row + 1)
                 column += 1
-                if column == _MAX_COLUMNS:
+                if column == self._MAX_COLUMNS:
                     column = 0
                     row += 1
 
-- 
1.7.0.1