Changeset 104

Show
Ignore:
Timestamp:
09/27/08 04:20:45 (4 years ago)
Author:
lgs
Message:

Chart type switcher

Location:
trunk/chavier
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/chavier/app.py

    r103 r104  
    22 
    33from pycha.chart import DEFAULT_OPTIONS 
    4 from pycha.bar import VerticalBarChart 
     4import pycha.bar 
     5import pycha.line 
     6import pycha.pie 
     7import pycha.scatter 
    58 
    69from chavier.gui import GUI 
    710 
    811class App(object): 
     12 
     13    CHART_TYPES = ( 
     14        pycha.bar.VerticalBarChart, 
     15        pycha.bar.HorizontalBarChart, 
     16        pycha.line.LineChart, 
     17        pycha.pie.PieChart, 
     18        pycha.scatter.ScatterplotChart, 
     19        ) 
     20 
     21    (VERTICAL_BAR_TYPE, 
     22     HORIZONTAL_BAR_TYPE, 
     23     LINE_TYPE, 
     24     PIE_TYPE, 
     25     SCATTER_TYPE) = range(len(CHART_TYPES)) 
     26 
    927    def __init__(self): 
    1028        self.gui = GUI(self) 
     
    1634        return DEFAULT_OPTIONS 
    1735 
    18     def get_chart(self, datasets, options, width, height): 
     36    def get_chart(self, datasets, options, chart_type, width, height): 
    1937        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) 
    20         chart = VerticalBarChart(surface, DEFAULT_OPTIONS) 
     38        chart_factory = self.CHART_TYPES[chart_type] 
     39        chart = chart_factory(surface, DEFAULT_OPTIONS) 
    2140        chart.addDataset(datasets) 
    2241        chart.render() 
  • trunk/chavier/gui.py

    r103 r104  
    5959 
    6060    def _create_ui_manager(self): 
    61         uimanager = gtk.UIManager() 
    62         accel_group = uimanager.get_accel_group() 
     61        self.uimanager = gtk.UIManager() 
     62        accel_group = self.uimanager.get_accel_group() 
    6363        self.main_window.add_accel_group(accel_group) 
    6464 
     
    9292                 'Update the chart', self.refresh), 
    9393                ]) 
    94         uimanager.insert_action_group(action_group, -1) 
     94        action_group.add_radio_actions([ 
     95                ('verticalbar', None, '_Vertical bars', None, 
     96                 'Use vertical bars chart', self.app.VERTICAL_BAR_TYPE), 
     97                ('horizontalbar', None, '_Horizontal bars', None, 
     98                 'Use horizontal bars chart', self.app.HORIZONTAL_BAR_TYPE), 
     99                ('line', None, '_Line', None, 
     100                 'Use lines chart', self.app.LINE_TYPE), 
     101                ('pie', None, '_Pie', None, 
     102                 'Use pie chart', self.app.PIE_TYPE), 
     103                ('scatter', None, '_Scatter', None, 
     104                 'Use scatter chart', self.app.SCATTER_TYPE), 
     105                ], self.app.VERTICAL_BAR_TYPE, self.on_chart_type_change) 
     106        self.uimanager.insert_action_group(action_group, -1) 
    95107 
    96108        ui = """<ui> 
     
    110122    <menu action="view"> 
    111123      <menuitem action="refresh"/> 
     124      <separator /> 
     125      <menuitem action="verticalbar"/> 
     126      <menuitem action="horizontalbar"/> 
     127      <menuitem action="line"/> 
     128      <menuitem action="pie"/> 
     129      <menuitem action="scatter"/> 
    112130    </menu> 
    113131  </menubar> 
     
    125143</ui> 
    126144""" 
    127         uimanager.add_ui_from_string(ui) 
    128         uimanager.ensure_update() 
    129         menubar = uimanager.get_widget('/MenuBar') 
    130         toolbar = uimanager.get_widget('/ToolBar') 
     145        self.uimanager.add_ui_from_string(ui) 
     146        self.uimanager.ensure_update() 
     147        menubar = self.uimanager.get_widget('/MenuBar') 
     148        toolbar = self.uimanager.get_widget('/ToolBar') 
    131149 
    132150        return menubar, toolbar 
     
    223241            model = treeview.get_model() 
    224242            points = [(x, y) for x, y in model] 
    225             datasets.append((name, points)) 
     243            if len(points) > 0: 
     244                datasets.append((name, points)) 
    226245        return datasets 
     246 
     247    def _get_chart_type(self): 
     248        action_group = self.uimanager.get_action_groups()[0] 
     249        action = action_group.get_action('verticalbar') 
     250        return action.get_current_value() 
    227251 
    228252    def run(self): 
     
    247271 
    248272    def drawing_area_size_allocate_event(self, widget, event, data=None): 
     273        if self.surface is not None: 
     274            self.refresh() 
     275 
     276    def on_chart_type_change(self, action, current, data=None): 
    249277        if self.surface is not None: 
    250278            self.refresh() 
     
    261289            name = dialog.get_name() 
    262290            self._create_dataset(name) 
     291            self.datasets_notebook.set_current_page(n_pages) 
    263292        dialog.destroy() 
    264293 
     
    334363    def refresh(self, action=None): 
    335364        datasets = self._get_datasets() 
    336 #        options = self._get_options() 
    337  
    338         alloc = self.drawing_area.get_allocation() 
    339         self.surface = self.app.get_chart(datasets, None, 
    340                                           alloc.width, alloc.height) 
    341         self.drawing_area.queue_draw() 
     365        if datasets: 
     366#            options = self._get_options() 
     367 
     368            chart_type = self._get_chart_type() 
     369            alloc = self.drawing_area.get_allocation() 
     370            self.surface = self.app.get_chart(datasets, None, chart_type, 
     371                                              alloc.width, alloc.height) 
     372            self.drawing_area.queue_draw() 
     373        else: 
     374            self.surface = None 
    342375 
    343376