Exemple #1
0
    def __init__(
        self, parent, id=wx.ID_ANY, position=wx.DefaultPosition, size=wx.DefaultSize, tabela="", colunas=[], tupla=()
    ):
        wx.Frame.__init__(self, parent, id, tabela, wx.DefaultPosition, size)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        self.tabela = tabela
        self.tupla = tupla
        self.colunas = colunas
        obs = dbManager.RESTRICOES[tabela]

        tuplaAtual = mostraTupla(self, size=wx.Size(size.GetWidth(), 100), tupla=tupla, colunas=colunas)
        sizer.Add(tuplaAtual)

        # lista de campos de input
        self.campos = []
        for c in colunas:
            observacao = obs.get(c[0])
            # Nada de ignorar, comportamento básico: "Label [ctrl]"
            if not (observacao in ("ignore", "seq", "pk") or type(observacao) is int):
                txt = wx.StaticText(self, wx.ID_ANY, "Novo " + dbManager.getColunaBonita(c[0]))
                ## Cada tipo de dados pede um input diferente, digo bora ##
                # Número: IntCtrl, com máximo e mínimo
                if c[1] is cx_Oracle.NUMBER:
                    ctrl = IntCtrl(self, min=0, max=c[4] and 10 ** c[4] or None)
                # Data: DatePickerCtrl, pq né
                elif c[1] is cx_Oracle.DATETIME:
                    ctrl = meuDatePicker(self)
                # Enum (CHAR/VARCHAR2 com CHECK): Choice com as possibilidades
                elif type(observacao) is tuple:
                    ctrl = wx.Choice(self, choices=observacao)
                # String (CHAR/VARCHAR2): TextCtrl
                else:
                    ctrl = wx.TextCtrl(self)

                # adiciona o "Label [ctrl]" no BoxSizer, pra ficar tudo bonitão
                hbox = wx.BoxSizer(wx.HORIZONTAL)
                hbox.Add(txt, flag=wx.CENTER | wx.RIGHT, border=10)
                hbox.Add(ctrl, proportion=1)
                sizer.Add(hbox, flag=wx.EXPAND)
                # salva na lista, pra podermos pegar depois
                self.campos.append((c, ctrl))

        # Se não tem campos a atualizar, deixa quieto
        if len(self.campos) == 0:
            raise Exception("Tabela não permite atualizações")

        cancelButton = wx.Button(self, self.ID_CANCELA, "Cancelar")
        self.Bind(wx.EVT_BUTTON, self.onCancel, id=self.ID_CANCELA)

        atualizaButton = wx.Button(self, self.ID_ATUALIZA, "Atualizar")
        self.Bind(wx.EVT_BUTTON, self.onAtualiza, id=self.ID_ATUALIZA)
        # põe os dois botões na mesma linha
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(atualizaButton, flag=wx.RIGHT, border=50)
        hbox.Add(cancelButton, flag=wx.LEFT, border=50)

        sizer.Add(hbox, flag=wx.ALIGN_CENTER | wx.TOP, border=10, proportion=1)
Exemple #2
0
    def __init__(self, parent, id=wx.ID_ANY, position=wx.DefaultPosition, size=wx.DefaultSize, colunas=[], tupla=()):
        wx.ListCtrl.__init__(self, parent, id, position, size, wx.LC_REPORT | wx.LC_VIRTUAL)
        self.tupla = tupla
        self.colunas = colunas

        # tamanhos calculados
        width = len(colunas)
        columnWidth = self.GetSize().GetWidth() / width
        # insere as colunas
        for i, c in enumerate(colunas):
            self.InsertColumn(i, dbManager.getColunaBonita(c[0]), width=columnWidth)

        self.SetItemCount(1)
Exemple #3
0
    def setValues (self, colunas, valores):
        """Troca os valores atuais listados"""
        # limpa primeiro
        self.ClearAll ()
        # salva os valores pra tabela
        self.colunas = colunas
        self.valores = valores
        height = len (valores)
        width = len (colunas)
        columnWidth = self.GetSize ().GetWidth () / width

        # insere as colunas
        for i, c in enumerate (colunas):
            self.InsertColumn (i, dbManager.getColunaBonita (c[0]), width = columnWidth)

        self.SetItemCount (height)
Exemple #4
0
    def __init__ (self, parent, id, position, size, tabela, obs = {}):
        """Ctor. 'obs' é um dicionário que mostra algumas observações sobre
        alguns campos (por nome), como por exemplo CONSTRAINTs de vários tipos.

        Observações possíveis (a partir do tipo/valor):
            'ignore' - ignora campo
            (tupla) - enum, lista de valores fixos (bom pra quando tem CHECK IN)
        """
        wx.Panel.__init__ (self, parent, id, position, size)
        self.tabela = tabela
        self.db = dbManager.getDbManager ()
        colunas = self.db.getTableInfo (tabela)
        #print colunas

        self.campos = []

        sizer = wx.BoxSizer (wx.VERTICAL)
        self.SetSizer (sizer)
        # primeira coisa (se tiver), põe as opções de FKs
        if obs.get ('fks'):
            # nossa lista de campos dependentes de FK
            self.fkCtrlList = []
            self.fks = obs['fks']
            self.fkChoices = []
            for i, fk in enumerate (self.fks):
                # descobre quais são as possíveis fks, e mostra pa nóis
                txt = wx.StaticText (self, wx.ID_ANY, 'FK ' + fk.descricao)
                chaves = fk.getKeys ()
                ctrl = wx.Choice (self, id = self.ID_FK + i, choices = chaves)
                self.fkChoices.append (ctrl)
                # e adiciona no BoxSizer
                hbox = wx.BoxSizer (wx.HORIZONTAL)
                hbox.Add (txt, flag = wx.CENTER | wx.RIGHT, border = 10)
                hbox.Add (ctrl, proportion = 1)
                sizer.Add (hbox, flag = wx.EXPAND)
                # adiciona uma posição no fkCtrls
                self.fkCtrlList.append ([])
                self.Bind (wx.EVT_CHOICE, self.atualizaFks, id = self.ID_FK + i)

        for c in colunas:
            observacao = obs.get (c[0])
            # Nada de ignorar, comportamento básico: "Label [ctrl]"
            if observacao != 'ignore':
                txt = wx.StaticText (self, wx.ID_ANY, dbManager.getColunaBonita (c[0]) +
                        (observacao == 'seq' and ' (seq)' or ''))
                ## Cada tipo de dados pede um input diferente, digo bora ##
                # Número: IntCtrl, com máximo e mínimo
                if c[1] is cx_Oracle.NUMBER:
                    if observacao == 'seq':
                        ctrl = sequenceCtrl (self, tabela = tabela)
                    else:
                        ctrl = IntCtrl (self, min = 0, max = c[4] and 10 ** c[4] or None)
                # Data: DatePickerCtrl, pq né
                elif c[1] is cx_Oracle.DATETIME:
                    ctrl = wx.DatePickerCtrl (self)
                # Enum (CHAR/VARCHAR2 com CHECK): Choice com as possibilidades
                elif type (observacao) is tuple:
                    ctrl = wx.Choice (self, choices = observacao)
                    ctrl.SetSelection (0)
                # String (CHAR/VARCHAR2): TextCtrl
                else:
                    ctrl = wx.TextCtrl (self)

                # FKs: salva o Ctrl na lista de Ctrls das FKs
                if type (observacao) is int:
                    # salva o Ctrl, pra que possamos completar quando as FKs
                    # forem selecionadas
                    self.fkCtrlList[observacao].append (ctrl)

                # adiciona o "Label [ctrl]" no BoxSizer, pra ficar tudo bonitão
                hbox = wx.BoxSizer (wx.HORIZONTAL)
                hbox.Add (txt, flag = wx.CENTER | wx.RIGHT, border = 10)
                hbox.Add (ctrl, proportion = 1)
                sizer.Add (hbox, flag = wx.EXPAND)
                # salva na lista, pra podermos pegar depois
                self.campos.append ((c[0], ctrl))

        # nosso botão de inserir tupla
        addButton = wx.Button (self, self.ID_INSERT, label = 'Inserir')
        sizer.Add ((-1, 20))
        sizer.Add (addButton, flag = wx.ALIGN_CENTER)
        self.Bind (wx.EVT_BUTTON, self.insere, id = self.ID_INSERT)