Created
June 20, 2012 14:40
-
-
Save damian-m-g/2960212 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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