Skip to content

Instantly share code, notes, and snippets.

@damian-m-g
Created June 20, 2012 14:40
Show Gist options
  • Save damian-m-g/2960212 to your computer and use it in GitHub Desktop.
Save damian-m-g/2960212 to your computer and use it in GitHub Desktop.
#encoding: utf-8
#[Parte del modelo MVC] Vista
#[Descripcion] Solapa que forma parte de +Lenguetas+. Su contenido es lo referente a materiales, al material como objeto individual.
class LenguetaMateriales
#Crea un objeto +FXTabItem+(una solapa) y una "página" vinculada en donde se encuentra la interfaz para manipular este departamento. _p_ es el widget padre, debería ser una instancia de *Lenguetas*.
def initialize(p, ventanaprin)
lengueta_materiales = FXTabItem.new(p, "Materiales\tBase de datos de materiales\tTodos los materiales existentes en el globo Cablevisión. Se pueden modificar sus datos o agregar nuevos.")
hoja_materiales = FXPacker.new(p, opts: LAYOUT_FILL|FRAME_RAISED)
horizontal = FXHorizontalFrame.new(hoja_materiales, opts: LAYOUT_FILL, padRight: 0)
tabla = TablaDeMateriales.new(horizontal)
separador = FXVerticalSeparator.new(horizontal, opts: SEPARATOR_RIDGE|LAYOUT_FILL_Y, padLeft: 4, padTop: 0, padBottom: 0)
vertical = FXVerticalFrame.new(horizontal, opts: LAYOUT_FILL)
BuscadorMateriales.new(vertical, ventanaprin, tabla)
#Es la caja en donde van los botones: "Modificar Material" y "Agregar Material"
ManipuladorDeListado.new(vertical)
FiltroDeMateriales.new(vertical)
#Pinto los widgets de este scope
Pintor.pintar_fondo(Pintor::LILA, lengueta_materiales, hoja_materiales, horizontal, separador, vertical)
Pintor.pintar_sombra(Pintor::SOMBRA_LILA, lengueta_materiales, hoja_materiales)
Pintor.pintar_sombra(Pintor::NEGRO, separador)
Pintor.pintar_hilite(Pintor::LILA, separador)
end
end
#[Parte del modelo MVC] Vista
#[Padre] FXTable
#[Descripción] La tabla de materiales es la encargada de mostrar todos los materiales que manipula X y X. Su tamaño es fixed: varía según la resolución de pantalla que utiliza el usuario. Todas las columnas tienen "fixed" ancho, menos "Descripción", que es calculada -también- según la resolución de pantalla utilizada por el usuario. A continuación se muestran los diferentes estilos de patrones que otorga FXRuby para usar en el comando setItemStipple: (Nota: mientras más nivel mas densidad del patrón el la celda)*0* = nada; *1* = puntos nl 1; *2* = puntos nl 2; *3* = puntos nl 3; *4* = puntos nl 4; *5* = cruces nl 1; *6* = cruces nl 2; *7* = cruces nl 3; *8* = cruces nl 4; *9* = cruces nl 5; *10* = cruces nl 6; *11* = cruces nl 7; *12* = cruces nl 8; *13* = cruces nl 9; *14* = cruces nl 10; *15* = inversion: puntos blancos, el resto del color especificado(stippleColor); *16* = el fondo del color especificado(stippleColor); *17* = 3 lineas horizontales; *18* = lineas verticales; *19* = cuadriculado nl 1; *20* = lineas diagonales hacia la derecha; *21* = lineas diagonales hacia la izquierda; *22* = lineas diagonales entrecruzadas(tejido); *23* = cuadriculado nl 2; <b>23 ~ 31</b> = cuadriculado nl 2; *32* = en adelante comienza a repetir los patrones pero modificando la justificacion del texto, primero cambiandolo a derecha y despues iterando por los otros modos. No chequeado hasta algún final por considerarlo sin sentido en el momento de investigación.
class TablaDeMateriales < FXTable
attr_accessor :tamaños_de_columnas
#Crea el widget más importante de la plantilla "Materiales": la tabla de materiales. _p_ es el widget padre.
def initialize(p)
#Relacion: ancho de tabla vs ancho de pantalla
@relacion_tabla_vs_resolucion = 77.734375
#Los tamaños de todas las columnas, menos la de descripción que es calculada posteriormente dinámicamente.
@tamaños_de_columnas = [48, 67, 15, 61, 61, 61, 61, 61, 61]
#Inicializo de entrada el ancho de la tabla, posteriormente puede variar si el usuario cambia la resolución de pantalla. Por esta cuestión el cálculo se realiza mediante un método, pues luego puede ser llamado para recalcular.
@ancho_de_tabla = calcular_ancho_de_tabla()
#Inicializo el ancho de la columna "Descripción", también puede variar si el usuario cambia la resolución de pantalla. Por esta cuestión el cálculo se realiza mediante un método, pues luego puede ser llamado para recalcular.
@ancho_de_descripcion = calcular_ancho_de_descripcion(@ancho_de_tabla, 16, @tamaños_de_columnas)
#Tabla ordenada según la sig. resolución: el primer dígito indica si ascendente(:true) o descendentemente(:false) según el alfabeto, el segundo dígito indica según los valores de que columna.
@orden_segun = [:true, 0]
#Array de materiales ordenados según "Motor de orden" de la clase.
@materiales_ordenados = $materiales
#Creo la tabla literalmente
tabla = super(p, width: @ancho_de_tabla, opts: TABLE_NO_COLSELECT|TABLE_NO_ROWSELECT|TABLE_READONLY|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH)
#Establesco algunos atributos de la tabla.
tabla.setTableSize(440, 10)
tabla.gridColor = Pintor::NEGRO
tabla.stippleColor = FXRGB(235, 235, 235)
#Cuando clickeo alguna celda se seleccionan todas las celdas de la fila que le corresponde, y además esto me permite que no se puedan seleccionar mas de una celda/fila, es lo que quiero!!!
tabla.connect(SEL_SELECTED) {|sender, selector, data| tabla.selectRow(data.row)}
#Me refiero al encabezado de títulos de filas, el cual NO QUIERO que se vea.
encabezado_de_filas = tabla.rowHeader
encabezado_de_filas.width = 0
encabezado_de_filas.layoutHints = (LAYOUT_FIX_WIDTH|HEADER_VERTICAL|FRAME_NORMAL)
#Me refiero al encabezado de títulos de columnas, los cuales necesito que sean "botones", los cuales al ser clickeados van a modificar el orden de la tabla según el parametro del label clickeado por orden alfabético, como la mayoría de las tablas.
encabezado_de_columnas = tabla.columnHeader
encabezado_de_columnas.helpText = ('Código CAPSI | Código Cablevisión | Descripción | Familia | Real Teórico | Base Rosario | Base San Lorenzo | Móviles | Para Devolución | Sobrante')
encabezado_de_columnas.headerStyle = HEADER_BUTTON|HEADER_NORMAL
#Motor de orden. TODO: Dejado para cuando la tabla esté totalmente llena de valores, entonces se puede pensar mejor, sino seria parcial.
#Inserto el tamaño(variable) de la columna "Descripción", el primer parámetro debe ser 2(por estética y conveniencia) y establesco los nombres de las columnas.
@tamaños_de_columnas.insert(2, @ancho_de_descripcion)
nombres_de_encabezados = ['C.CAP.', 'C.Cablev.', 'Descripción', 'F', 'Real T.', 'B.Ros', 'B.S.L.', 'Móviles', 'P/Devol.', 'Sobrante']
#Le doy "forma" a la tabla.
0.upto(9) do |num|
tabla.setColumnWidth(num, @tamaños_de_columnas[num])
tabla.setColumnText(num, nombres_de_encabezados[num])
tabla.setColumnJustify(num, FXHeaderItem::CENTER_X)
end
#Lleno las primeras 4 columnas con contenido fijo.
TablaDeMateriales.llenar_tabla(tabla, $materiales)
end
#Método utilizado por el software para calcular el ancho dispuesto para la tabla de materiales.
def calcular_ancho_de_tabla
(($ancho_de_pantalla/100.0)*@relacion_tabla_vs_resolucion).round
end
#Utilizado para calcular cual va a ser el ancho destinado para la columna "Descripción" de la tabla de materiales. <em>ancho_de_tabla</em> es el ancho total del widget *TablaDeMateriales*; _resto_ representa el ancho del ScrollBar, el cual forma parte del tamaño total de la tabla, salvo que se modifique este valor es siempre 16; <em>ancho_de_otras_columnas</em> debe ser un Array en donde cada item representa el ancho de una de las 9 columnas(la que se calcula es excluida obvio).
def calcular_ancho_de_descripcion(ancho_de_tabla, resto, ancho_de_otras_columnas)
ancho_de_tabla-resto-(ancho_de_otras_columnas.inject(:+))
end
# Llena las primeras 4 columnas(valores fijos-modificables manualmente) de la tabla(un objeto *TablaDeMateriales*) tomando como referencia la variable global *$materiales*, también internamente formatea la tabla para ganar belleza estética. _referencia_ debe ser un Array con objetos de tipo *Materiales* como items, es de donde se va a sacar la información para llenar la tabla.
def self.llenar_tabla(tabla, referencia)
#Arranco de fila 0.
fila = 0
referencia.each do |item|
tabla.setItemText(fila, 0, item.codigo_capsi.to_s);tabla.setItemJustify(fila, 0, FXTableItem::CENTER_X)
tabla.setItemText(fila, 1, item.codigo_cablevision.to_s)
tabla.setItemText(fila, 2, item.descripcion);tabla.setItemJustify(fila, 2, FXTableItem::CENTER_X)
tabla.setItemIcon(fila, 3, item.familia)
tabla.setRowHeight(fila, 15)
fila += 1
end
tabla.visibleRows = referencia.length
end
end
#[Parte del modelo MVC] Vista
#[Descripción] Dentro de esta clase se encuentran los widgets que hacen al buscador/filtrador de materiales. El objetivo de este conjunto es proveerle al cliente una interfaz para ubicar uno o unos materiales en particular ingresando texto en una casilla.
class BuscadorMateriales
#Crea un conjunto de widgets que conforman al <b>Buscador de Materiales</b>. _p_ es el padre en donde va a ir ubicado este packer. <em>centro_de_pantalla</em> es el padre en donde van a flotar las ventana de información que surgan. <em>tabla_principal</em> es la tabla de la planilla presente, se refiere a la tabla de materiales, que se utiliza para averiguar los tamaños de las primeras 4 columnas, sus valores y demás para mostrar los materiales avistados.
def initialize(p, centro_de_pantalla, tabla_principal)
#Se hace referencia a la tabla de materiales, la principal, la que contiene todos los objetos. De ella se sacará información relevante.
@@centro_de_pantalla = centro_de_pantalla
@@tabla_principal = tabla_principal
#Creo los widgets
caja = FXGroupBox.new(p, 'Avistar', opts: LAYOUT_FILL_X|FRAME_LINE)
linea = FXHorizontalFrame.new(caja, opts: LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT)
#La siguiente variable se establece de instancia porque su contenido es importante para los métodos de esta clase.
@caja_de_texto = FXTextField.new(linea, 3, opts: LAYOUT_FILL_X|TEXTFIELD_ENTER_ONLY)
#Disparo si...
@caja_de_texto.connect(SEL_COMMAND, method(:avistar))
#La siguiente variable se establece de instancia porque su contenido es importante para los métodos de esta clase.
@boton = FXButton.new(linea, "\tAvistar!\tAvistar materiales que coincidan con el patrón ingresado(como mínimo 3 caracteres). Se mira en la columna 'Código Cablevisión' y 'Descripción'." , $iconos[:avm])
#El usuario pulsa el botón "Avistar", entonces comienzo el avistamiento...
@boton.connect(SEL_COMMAND, method(:avistar))
#También si existe focus en el botón y el usuario presiona enter se ejecuta el avistamiento; o si presiona TAB muevo el focus manualmente al próximo widget ya que por motivos desconocidos en este caso FXRuby no me pasa el focus al siguiente widget.
@boton.connect(SEL_KEYPRESS) do |sender, selector, data|
#Si la tecla enter es presionada el sig. código no se ejecuta.
unless enter_presionado_en_boton?(data, method(:avistar))
#Si TAB fue presionado establesco el focus al siguiente widget, el mas cercano. Para hacerlo escalo aguas arriba y luego me voy directo al sig. widget focuseable.
if data.code == KEY_Tab then @boton.parent.parent.next.first.first.setFocus end
end
end
#Pinto los widgets
Pintor.pintar_fondo(Pintor::LILA, caja, linea)
Pintor.pintar_sombra(Pintor::SOMBRA_LILA, @boton)
end
#Chequeo si teniendo focus en el botón, el usuario presionó la tecla Enter, si fue así ejecuto el avistamiento...
def enter_presionado_en_boton?(data, metodo)
#Averiguo que tecla fue presionada
tecla_presionada = data.code
#Y me fijo si esta es 'Enter' o 'Intro'(El 'Enter' en el keypad) y si es así casteo avistar()
if (tecla_presionada == KEY_KP_Enter) || (tecla_presionada == KEY_Return) then metodo.call() end
end
#Se castea al presionar el botón "Avistar!". Busca en la <b>lista de materiales</b> por objetos que coincidan con el patrón ingresado en la caja de texto adyacente. Si encuentra uno, dirige el focus directamente a ese item en la tabla; si encuentra más de dos despliega un objeto FXDialogBox en el centro de la pantalla con información de los objetos avistados, si hago doble click en alguno de esos objetos encontrados esta ventana se cierra y se dirije el focus a la ubicación en la >b>lista de materiales</b> del objeto elegido; se deben ingresar mas de 3 caracteres para que tenga efecto la búsqueda. En este método _self_ no es el widget que llamó a este método, el widget es solo una parte de quien es self: el objeto que contiene ese widget. <b>Los 3 argumentos del método son obligatorios por FXRuby, aunque en este caso, internamente no se usan.</b>
def avistar(sender=nil, selector=nil, data=nil)
escrito = @caja_de_texto.text
#Adentro de esta variable van items "materiales" cuales fueron matcheados por lo "escrito".
materiales_avistados = []
#Como mínimo el usuario debe escribir 3 caracteres. De otra forma muestro una ventana de advertencia con el requisito.
if escrito.length > 2
$materiales.each do |item|
#Itero en los valores de las columnas "Código Cablevisión" y "Descripción". 'regexp' es 'escrito' pasado a objeto Regexp.
#Aparentemente el encoding de FXRuby no es explícitamente utf-8, no estoy muy seguro si en general, en este caso particular es asi.
regexp = Regexp.new(escrito.force_encoding('utf-8'), Regexp::IGNORECASE)
if regexp.match(item.descripcion)
materiales_avistados.push(item)
elsif
regexp.match(item.codigo_cablevision.to_s)
materiales_avistados.push(item)
end
end
cantidad_materiales_avistados = materiales_avistados.length
case cantidad_materiales_avistados
when 0
FXMessageBox.information(@@centro_de_pantalla, MBOX_OK, 'Informo', "No he avistado ningún material con el patrón: '#{escrito}'.")
#Si encontré 1 material lo focuseo en la tabla de materiales llamando al método 'un_avistado'.
when 1
un_avistado(materiales_avistados)
#Si encontré mas de 1 material llamo al sig. método:
else
avistados(escrito, materiales_avistados, cantidad_materiales_avistados)
end
else
#La ventana de advertencia que se ejecuta si el usuario tipeó menos de 3 caracereres.
FXMessageBox.information(@@centro_de_pantalla, MBOX_OK, 'Informo', 'Acepto 3 caracteres como mínimo')
end
end
def un_avistado(materiales_avistados)
regexp2 = /^#{materiales_avistados[0].codigo_capsi.to_s}$/
fila = nil
iteraciones = 0
@@tabla_principal.each_row do |contenido_de_fila|
if regexp2.match(contenido_de_fila[0].to_s)
fila = iteraciones
end
iteraciones += 1
end
@@tabla_principal.selectRow(fila)
@@tabla_principal.makePositionVisible(fila, 4)
end
def avistados(escrito, materiales_avistados, cantidad_materiales_avistados)
#Debo hacer el cálculo del ancho de la tabla porque es dinámico, puede variar. Establesco la siguiente variable a 3(píxeles). Esta variable luego va a servir para establecer el ancho exacto de la tabla, también va a servir como referencia para establecer el ancho del diálogo.
ancho_de_tabla = 3
0.upto(3) {|numero_de_columna| ancho_de_tabla += @@tabla_principal.getColumnWidth(numero_de_columna)}
#El alto de la ventana emergente también es dinámico, pues dependiendo el número de items encontrados varía. 15 es el alto de cada fila. 120 es lo que van a ocupar el resto de los widgets en alto. Estética.
alto_de_dialogo = 120 + (cantidad_materiales_avistados*15)
#Genero la caja de diálogo en sl server-side y client-side.
dialogo = FXDialogBox.new(@@centro_de_pantalla, "Informo", opts: DECOR_BORDER|DECOR_TITLE|LAYOUT_EXPLICIT, width: (ancho_de_tabla +30), height: alto_de_dialogo, padBottom: 5)
vertical = FXVerticalFrame.new(dialogo, opts: LAYOUT_FILL)
etiqueta = FXLabel.new(vertical, "Avisté #{cantidad_materiales_avistados} materiales con el patrón: '#{escrito}'.", $iconos[:inf])
#Es necesario ubicar un objeto FXTable dentro de un FXHorizontalFrame por cuestión estética, pues en este caso, con el otro layout manager(vertical) me quedan unos píxeles extras sin rellenar en la parte de abajo y no encontré otra solución salvo pintandola del mismo color que el entorno para disimularlos, accedí a la opción siguiente.
plantilla_de_tabla = FXHorizontalFrame.new(vertical, opts: LAYOUT_FILL)
@tabla_secundaria = FXTable.new(plantilla_de_tabla, opts: TABLE_NO_COLSELECT|TABLE_NO_ROWSELECT|TABLE_READONLY|LAYOUT_FILL_X|LAYOUT_FIX_WIDTH, width: ancho_de_tabla)
#Cuando el usuario seleccione una celda necesito que se pinte toda la fila de esa celda, por estética.
@tabla_secundaria.connect(SEL_SELECTED) {|sender, selector, data| @tabla_secundaria.selectRow(data.row)}
#Establesco algunos atributos de la tabla.
@tabla_secundaria.setTableSize(cantidad_materiales_avistados, 4)
@tabla_secundaria.gridColor = Pintor::NEGRO
@tabla_secundaria.columnHeader.helpText = ('Código CAPSI | Código Cablevisión | Descripción | Familia')
#Me refiero al encabezado de títulos de filas, el cual NO QUIERO que se vea.
encabezado_de_filas = @tabla_secundaria.rowHeader
encabezado_de_filas.width = 0
encabezado_de_filas.layoutHints = (LAYOUT_FIX_WIDTH|HEADER_VERTICAL|FRAME_NORMAL)
#Establesco nombres de encabezados
nombres_de_encabezados = ['C.CAP.', 'C.Cablev.', 'Descripción', 'F']
#Le doy "forma" a la tabla.
0.upto(3) do |num|
@tabla_secundaria.setColumnWidth(num, @@tabla_principal.tamaños_de_columnas[num])
@tabla_secundaria.setColumnText(num, nombres_de_encabezados[num])
@tabla_secundaria.setColumnJustify(num, FXHeaderItem::CENTER_X)
end
#Llamo al método de instancia 'llenar_tabla', heredado de TablaDeMateriales.
TablaDeMateriales.llenar_tabla(@tabla_secundaria, materiales_avistados)
#Los widgets que le siguen a la tabla...
separador = FXHorizontalSeparator.new(vertical, opts: SEPARATOR_RIDGE|LAYOUT_FILL_X)
separador.shadowColor = Pintor::NEGRO
plantilla_de_botones = FXHorizontalFrame.new(vertical, opts: LAYOUT_FILL_X|PACK_UNIFORM_WIDTH, padTop: 0, padBottom: 0)
b_cancelar = FXButton.new(plantilla_de_botones, 'Cancelar', target: dialogo, selector: FXDialogBox::ID_CANCEL, opts: LAYOUT_FILL_Y|LAYOUT_RIGHT|BUTTON_NORMAL|BUTTON_INITIAL|BUTTON_DEFAULT)
b_trasladarse = FXButton.new(plantilla_de_botones, 'Trasladarse', target: dialogo, selector: FXDialogBox::ID_ACCEPT, opts: LAYOUT_FILL_Y|LAYOUT_RIGHT|BUTTON_NORMAL)
b_trasladarse.connect(SEL_KEYPRESS) {|sender, selector, data| enter_presionado_en_boton?(data, method(:trasladarse))}
if dialogo.execute(PLACEMENT_SCREEN) == 1
trasladarse()
end
end
def trasladarse
#TODO: Crear metodo para ir al item seleccionad en el dialogo 'avistados'.
end
end
#[Parte del modelo MVC] Vista
#[Descripción] Crea una "caja" en donde van ubicados 2 botones que modifican el listado original de materiales. Cuando se presionen cualquiera de los dos botones va a aparecer una ventana emergente para realizar una función.
class ManipuladorDeListado
#Crea varios widgets que tienen la función de manipular el listado de materiales agregando nuevos o modificando existentes. _p_ es el widget padre en donde este conjunto va a ir ubicado.
def initialize(p)
caja = FXGroupBox.new(p, 'Listado', opts: LAYOUT_FILL_X|FRAME_LINE)
columna = FXVerticalFrame.new(caja, opts: LAYOUT_FILL_X|PACK_UNIFORM_HEIGHT, vSpacing: 1)
boton1 = FXButton.new(columna, "Agregar Material\tIngresar nuevo material\tIncorporar un nuevo material a la aplicación.", opts: LAYOUT_FILL_X|FRAME_LINE)
boton2 = FXButton.new(columna, "Modificar Material\tAlterar material seleccionado\tTransformar los atributos de un material existente.", opts: LAYOUT_FILL_X|FRAME_LINE)
boton3 = FXButton.new(columna, "Eliminar Material\tSuprimir item seleccionado de la lista\tExcluye el material seleccionado de la tabla y de la aplicación", opts: LAYOUT_FILL_X|FRAME_LINE)
Pintor.pintar_fondo(Pintor::LILA, caja, columna)
Pintor.pintar_sombra(Pintor::SOMBRA_LILA, boton1, boton2, boton3)
end
end
#[Parte del modelo MVC] Vista
#[Descripción] Esta clase refiere a un grupo de widgets que se encargan de "filtrar" items de la lista de materiales para una mejor interpretación de lo que se está buscando.
class FiltroDeMateriales
#Crea todos los widgets correspondientes al filtrado de items de la lista de materiales. _p_ es el widget padre en donde este conjunto va ubicado.
def initialize(p)
#Esta caja es la que va a contener las otras 2
caja_padre = FXGroupBox.new(p, 'Filtro', opts: LAYOUT_FILL_X|FRAME_LINE)
#A continuación la creación de las dos cajas hijas
caja_familia = FXGroupBox.new(caja_padre, 'Familia', opts: LAYOUT_FILL_X|FRAME_LINE)
caja_existencia = FXGroupBox.new(caja_padre, 'Existencia', opts: LAYOUT_FILL_X|FRAME_LINE)
#Lleno caja_familia con widgets
vertical_familia = FXVerticalFrame.new(caja_familia, opts: LAYOUT_FILL_X)
#Los "checks" por defecto van a estar todos activados.
horizontal_f_1 = FXHorizontalFrame.new(vertical_familia, opts: LAYOUT_FILL_X, padBottom: 0)
check_f_1 = FXCheckButton.new(horizontal_f_1, 'Eventos')
check_f_1.connect(SEL_COMMAND) do |sender, selector, data|
puts sender
end
FXLabel.new(horizontal_f_1, nil, $iconos[:eve], opts: LAYOUT_RIGHT).backColor=(Pintor::LILA)
horizontal_f_2 = FXHorizontalFrame.new(vertical_familia, opts: LAYOUT_FILL_X, padTop: 0, padBottom: 0)
check_f_2 = FXCheckButton.new(horizontal_f_2, 'Edificios')
FXLabel.new(horizontal_f_2, nil, $iconos[:edi], opts: LAYOUT_RIGHT).backColor=(Pintor::LILA)
horizontal_f_3 = FXHorizontalFrame.new(vertical_familia, opts: LAYOUT_FILL_X, padTop: 0, padBottom: 0)
check_f_3 = FXCheckButton.new(horizontal_f_3, 'Obra y Mantenimiento')
FXLabel.new(horizontal_f_3, nil, $iconos[:oym], opts: LAYOUT_RIGHT).backColor=(Pintor::LILA)
horizontal_f_4 = FXHorizontalFrame.new(vertical_familia, opts: LAYOUT_FILL_X, padTop: 0)
check_f_4 = FXCheckButton.new(horizontal_f_4, 'Indumentaria')
FXLabel.new(horizontal_f_4, nil, $iconos[:ind], opts: LAYOUT_RIGHT).backColor=(Pintor::LILA)
#Con el solo propósito de ahorrar código creo el sig. Array, y establesco que "de entrada" todos los checks estén en estado TRUE.
familias = [check_f_1, check_f_2, check_f_3, check_f_4]
familias.each {|check| check.setCheck(TRUE)}
#TODO: Darle funcionalidad a la primera parte del filtro. Un FXDataTarget en este caso no es la solución.
#TODO: Obsoleto hasta que tenga casi toda la aplicación terminada ya que necesito la tabla completa, con todos los valores.
#Lleno caja_existencia con widgets
vertical_existencia = FXVerticalFrame.new(caja_existencia, opts: LAYOUT_FILL_X)
#Por defecto el radio_1 va a estar presionado solamente. No pueden estar los dos a la vez, cuando está uno el otro no. Tener activado radio_1 "engrisea" a todos los checks que están debajo, los hace inmodificables, ya que 'Todos' es justamente: todos. Cuando está el radio_2 activado si se pueden modificar los checks de abajo.
radio_1 = FXRadioButton.new(vertical_existencia, 'Todos', padLeft: 6)
radio_2 = FXRadioButton.new(vertical_existencia, 'Existentes', padLeft: 6)
FXHorizontalSeparator.new(vertical_existencia, opts: SEPARATOR_LINE|LAYOUT_FILL, padLeft: 0, padRight: 0, padTop: 4, padBottom: 4).backColor=(Pintor::LILA)
#Por defecto todos "engriseados" debido a que el 'radio_1' se encuentra activado por defecto.
check_e_1 = FXCheckButton.new(vertical_existencia, 'Base Rosario', padLeft: 6)
check_e_2 = FXCheckButton.new(vertical_existencia, 'Base San Lorenzo', padLeft: 6)
check_e_3 = FXCheckButton.new(vertical_existencia, 'Móviles', padLeft: 6)
check_e_4 = FXCheckButton.new(vertical_existencia, 'p/Devolución', padLeft: 6)
check_e_5 = FXCheckButton.new(vertical_existencia, 'Sobrante', padLeft: 6)
Pintor.pintar_fondo(Pintor::LILA, caja_padre, caja_familia, caja_existencia, vertical_familia, horizontal_f_1, check_f_1, horizontal_f_2, check_f_2, horizontal_f_3, check_f_3, horizontal_f_4, check_f_4, vertical_existencia, radio_1, radio_2, check_e_1, check_e_2, check_e_3, check_e_4, check_e_5)
Pintor.pintar_hilite(Pintor::LILA, check_f_1, check_f_2, check_f_3, check_f_4, check_e_1, check_e_2, check_e_3, check_e_4, check_e_5)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment