Un principiante en las Artes Gráficas Una experiencia en un sector que nos envuelve… El blog personal de David Pinelo.

26feb/090

Modificaciones en AbanQ

Ha sido bastante tiempo sin escribir (mucho trabajo, y demasiadas gripes una detrás de otra...) pero vuelvo por aquí.

He estado trabajando bastante en AbanQ para implementar un ERP en una imprenta. La verdad, es que, con soluciones como esta, sobran herramientas cerradas y que además, no suelen tener una adaptación tan buena como ésta tiene.

Uno de los aspectos más importantes de una aplicación, es su interfaz. Los programadores muchas veces no tienen en consideración el interfaz de las aplicaciones, pero son en muchas ocasiones un factor subjetivo clave a la hora de percibir, y por extensión valorar, una aplicación.

Y el aspecto de AbanQ en su versión para Windows, a mí me parecía... feo. Os pongo una captura de el aspecto original que tienen los ejecutables que InfoSial ofrece amablemente para descarga.

AbanQ antes de las modificaciones

AbanQ antes de las modificaciones

Otro detalle se unía a que la interfaz no me pareciera... correcta. Los formularios se abrían en determinadas zonas del escritorio ocultando muchas veces la botonera de navegación porque quedaban fuera del mismo. ¿Solución? Todos los formularios que se abran se centrarán en el escritorio.

Os voy a explicar cómo hacer estos cambios tan sencillos en el código fuente.

[Modificación 27-febrero-2009]: A petición del foro de AbanQ de Google Groups, os pongo un enlace a la aplicación compilada en windows (con MinGW) y con todos los archivos necesarios aqui. Es una versión Quick.

El primer cambio: La interfaz me parece tan fea, porque aplica una paleta de colores particular, que, para mi gusto, desentona bastante con la paleta original de Windows. Esta paleta se aplica en dos archivos ubicados dentro del directorio de fuentes de AbanQ, src/fllite/main.cpp y src/fllite/fllite.cpp.

Si buscamos en ambos archivos encontramos código como el que sigue:

  QPalette p( QColor( 222, 222, 205 ), QColor( 222, 222, 205 ) );
  p.setColor( QPalette::Active, QColorGroup::Dark, QColor( 246, 242, 246 ) );
  p.setColor( QPalette::Inactive, QColorGroup::Dark, QColor( 246, 242, 246 ) );
  p.setColor( QPalette::Disabled, QColorGroup::Dark, QColor( 246, 242, 246 ) );
  p.setColor( QPalette::Active, QColorGroup::Base, QColor( 255, 255, 238 ) );
  p.setColor( QPalette::Inactive, QColorGroup::Base, QColor( 255, 255, 238 ) );
  p.setColor( QPalette::Disabled, QColorGroup::Base, QColor( 255, 255, 238 ) );
  p.setColor( QPalette::Active, QColorGroup::Highlight, QColor( 24, 60, 139 ) );
  p.setColor( QPalette::Active, QColorGroup::HighlightedText, Qt::white );
  p.setColor( QPalette::Inactive, QColorGroup::Highlight, QColor( 24, 60, 139 ) );
  p.setColor( QPalette::Inactive, QColorGroup::HighlightedText, Qt::white );
  p.setColor( QPalette::Disabled, QColorGroup::Highlight, QColor( 24, 60, 139 ) );
  p.setColor( QPalette::Disabled, QColorGroup::HighlightedText, Qt::white );
  p.setColor( QPalette::Inactive, QColorGroup::Text, Qt::black );
  p.setColor( QPalette::Disabled, QColorGroup::Text, QColor( 100, 100, 100 ) );
  p.setColor( QPalette::Active, QColorGroup::Foreground, QColor( 30, 30, 30 ) );
  p.setColor( QPalette::Inactive, QColorGroup::Foreground, QColor( 30, 30, 30 ) );
  p.setColor( QPalette::Disabled, QColorGroup::Foreground, QColor( 100, 100, 100 ) );
  p.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( 30, 30, 30 ) );
  p.setColor( QPalette::Inactive, QColorGroup::ButtonText, QColor( 30, 30, 30 ) );
  p.setColor( QPalette::Disabled, QColorGroup::ButtonText, QColor( 100, 100, 100 ) );

Posteriromente, vemos cómo esta paleta de colores se aplica a toda la aplicación en esta línea

  FacturaLUX.setPalette( p, true );
...
  s->setPalette( p );

Simplemente comentando estas dos líneas, ya conseguimos el siguiente aspecto:

AbanQ después del cambio

AbanQ después del cambio

Para mi gusto algo mejor...

¿Y cómo se centran los formularios cuando se abren? También sencillo. AbanQ define dos clases principales para formularios que se abren fuera del entorno MDI FLFormRecordDB y FLFormSearchDB.

Ambas clases tienen un método, setMainWidget en el que se establece la Interfaz diseñada por con Qt Designer que se parametriza por cada uso del ERP. Es ese método el que se encarga de ubicar el formulario en pantalla. ¿Cómo? Ambas clases son clases hijas de QWidget que en Qt3 tiene un método, move, que permite ubicar el widget en cualquier lugar del contenedor de esos widgets. Para los formulario, el contenedor es el escritorio.

Al final de ese método, encontramos el siguiente código

  int mWidth = mainWidget_->width();
  int mHeight = mainWidget_->height();
  QWidget * actWin = qApp->activeWindow();
  QRect screen = ( actWin ? actWin->geometry() : qApp->mainWidget()->geometry() );
  QRect desk = QApplication::desktop()->geometry();
  QPoint p = screen.center() - QPoint( mWidth / 2, mHeight / 2 );
  if ( p.x() + mWidth > desk.width() )
    p.setX( desk.width() - mWidth );
  if ( p.y() + mHeight > desk.height() )
    p.setY( desk.height() - mHeight );
  if ( p.x() < 0 )
    p.setX( 0 );
  if ( p.y() < 0 )
    p.setY( 0 );
  move( p );

Este código lo vamos a dejar tal que así

  int mWidth = mainWidget_->width();
  int mHeight = mainWidget_->height();
  QRect desk = QApplication::desktop()->geometry();
  QPoint p = desk.center() - QPoint( mWidth / 2, mHeight / 2 );
  if ( p.x() + mWidth > desk.width() )
    p.setX( desk.width() - mWidth );
  if ( p.y() + mHeight > desk.height() )
    p.setY( desk.height() - mHeight );
  if ( p.x() < 0 )
    p.setX( 0 );
  if ( p.y() < 0 )
    p.setY( 0 );
  move( p );

Y listo: los formularios de edición de registro y búsqueda, aparecerán centrados.

Sólo hay que compilar bajo Windows... esto en otra entrada.