## videocardDialog.py - A graphical kickstart file generator
## Copyright (C) 2001-2003 Red Hat, Inc.

## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.

## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

import gtk
import gobject
from rhpl.translate import _, N_,textdomain
#from rhpl.xhwstate import *
import string

TRUE = 1
FALSE = 0

class VideocardDialog:
    #TODO: Is this list correct?
    drivers = ["mga", "ati", "chips", "cirrus", "cyrix", "fbdev",
               "glint", "i128", "i740", "i810", "mga", "neomagic",
               "newport", "nv", "r128", "radeon", "rendition", "s3",
               "s3virge", "savage", "siliconmotion", "sis", "tdfx",
               "trident", "tseng", "vesa", "vga", "via", "voodoo", "vmware"]

    def __init__(self, xml, videocard, hardware_state):
        self.xml = xml
        self.videocard = videocard
        self.hardware_state = hardware_state
        self.probed_path = None
 
        xml.get_widget("videocard_icon").set_from_file("/usr/share/system-config-display/pixmaps/videocard.png")

        self.changing_selection = 0
        
        dialog = xml.get_widget("videocard_dialog")
        dialog.set_transient_for(xml.get_widget("display_dialog"))
        dialog.set_modal(TRUE)

        videocard_store = gtk.ListStore(gobject.TYPE_STRING)
        self.videocard_store = videocard_store

        iter = videocard_store.append()
        videocard_store.set_value(iter, 0, "Custom")
        card_list = videocard.cardsDB().keys()
        card_list.sort()

        default_name = self.hardware_state.get_videocard_name()

        for name in card_list:
            iter = videocard_store.append()
            videocard_store.set_value(iter, 0, name)

            if name == default_name:
                self.probed_path = videocard_store.get_path(iter)

        self.tree_view = xml.get_widget("videocard_tree")
        self.tree_view.set_model(videocard_store)
        selection = self.tree_view.get_selection()
        # Select the first before setting up callback, to avoid first callback.
        selection.select_iter(videocard_store.get_iter_first())
        selection.connect("changed", self.selection_changed)

        self.vc_col = gtk.TreeViewColumn(None, gtk.CellRendererText(), text=0)
        self.tree_view.append_column(self.vc_col)

        self.type_entry = xml.get_widget("videocard_type_entry")
        self.driver_entry = xml.get_widget("videocard_driver_entry")

        button = xml.get_widget("videocard_probe_button")
        button.connect("clicked", self.probe_videocard)
        primary = videocard.primaryCard()
        button.set_sensitive(primary != None and primary.getCardData() != None)

        self.hydrate(self.hardware_state)

    def goto_row(self, cardname):
        if not self.probed_path:
            #no point in trying to seek to the path if it doesn't exist
            return

        self.tree_view.expand_row(self.probed_path[0], TRUE)
        self.changing_selection = 1
        selection = self.tree_view.get_selection()
        iter = self.videocard_store.get_iter(self.probed_path)

        selection.select_iter(iter)
        self.changing_selection = 0
        self.tree_view.set_cursor(self.probed_path, self.vc_col, FALSE)
        self.tree_view.scroll_to_cell(self.probed_path, self.vc_col, TRUE, 0.5, 0.0)
        
    def set_card_data(self, carddata, goto_row):
        name = carddata["NAME"];
        if goto_row:
            self.goto_row(name)
        if carddata.has_key("LINE"):
            lines = carddata["LINE"]

    def probe_videocard(self, widget):
        if self.probed_path:
            self.goto_row(self.probed_path)

    def custom_mem_toggled(self, checkbutton):
        self.mem_optionmenu.set_sensitive(checkbutton.get_active())

    def selection_changed(self, selection):
        if self.changing_selection:
            return
        (store, iter) = selection.get_selected()
        if iter == None:
            return
        name = self.videocard_store.get_value(iter, 0)

        if self.videocard.cardsDB().has_key(name):
            carddata = self.videocard.cardsDB()[name]
            self.set_card_data(carddata, 0)
        
    def hydrate(self, state):
        name = state.get_videocard_name()
        self.goto_row(name)

    def dehydrate(self, state):
        (store, iter) = self.tree_view.get_selection().get_selected()
        if iter == None:
            return
        name = self.videocard_store.get_value(iter, 0)
        carddata = self.videocard.cardsDB()[name]
        driver = carddata["DRIVER"]

        state.set_videocard_name(name)
        state.set_videocard_driver(driver)
        
    def run(self):
        dialog = self.xml.get_widget("videocard_dialog")
        dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        dialog.present()
        while 1:
            res = dialog.run()
            
            if res != gtk.RESPONSE_OK:
                dialog.hide()
                return FALSE
            
            break
        
        dialog.hide()
        return TRUE
