/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
 *            mainwindow.h
 *
 *  Sat Aug 21 19:50:13 2004
 *  Copyright  2004  deva
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *    This file is part of MIaV.
 *
 *    MIaV 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.
 *
 *    MIaV 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 MIaV; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */

/*
 * $Id$
 */

/*
 * $Log$
 * Revision 1.20  2005/07/25 14:27:14  deva
 * *** empty log message ***
 *
 * Revision 1.19  2005/07/23 10:11:45  deva
 * *** empty log message ***
 *
 * Revision 1.17  2005/07/22 19:20:28  deva
 * *** empty log message ***
 *
 * Revision 1.16  2005/06/16 21:28:57  deva
 * Rewrote thread object
 * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to
 * growing server queue)
 *
 * Revision 1.15  2005/06/02 20:45:01  deva
 *
 * Added clear button
 * Optimized the frame handling a little (very little!).
 *
 * Revision 1.14  2005/05/23 19:30:36  deva
 * Made some cleanup in the status bar.
 *
 * Revision 1.13  2005/05/16 16:00:57  deva
 *
 * Lots of stuff!
 *
 * Revision 1.12  2005/05/03 09:22:12  deva
 * Implemented the gui part of the info object.
 *
 * Revision 1.11  2005/05/03 08:31:59  deva
 * Removed the error object, and replaced it with a more generic info object.
 *
 * Revision 1.10  2005/05/02 20:34:38  deva
 *
 * Some hacked borky ugly scumm code to check for errors! :(
 *
 * Revision 1.9  2005/05/02 19:56:17  deva
 *
 * cpr_clicked is now blocked, if a recording session on. A messagebox explains
 * how to stop before trying to change the cpr number again.
 *
 * Revision 1.8  2005/05/01 09:56:26  deva
 * Added Id and Log tags to all files
 */

#include <config.h>
#ifdef USE_GUI
 
#ifndef __MAINWINDOW_H__
#define __MAINWINDOW_H__

#include <string>
using namespace std;

#include <qwidget.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qstatusbar.h>
#include <qtimer.h>
#include <qpixmap.h>
#include <qimage.h>

#include "videowidget.h"
#include "camera.h"
#include "cprquerydialog.h"

#include "info_gui.h"

#define INCH_IN_CM 2.54f

/**
 * First some GUI specs
 */
#define NUM_HISTORY 3
// Button sizes in cm (metric)
#define BUTTON_WIDTH 8
#define BUTTON_HEIGHT 2

/** 
 * Textstrings
 */
#define TXT_ERROR_TITLE "Der er opst�et en fejl!"
#define TXT_READY "Klar..."
#define TXT_CPRDLG_TITLE "CPRQueryDialog"
#define TXT_ASK_SAVE_TITLE "Vil du gemme filmen?"
#define TXT_ASK_SAVE "Vil du gemme filmen permanent?"
#define TXT_STOP_RECORDING_TITLE "Stop optagelsen"
#define TXT_STOP_RECORDING "Optagelsen skal standses, inden et nyt cpr nummer kan indtastes.\n\
Optagelsen standses ved tryk p� den r�de cirkel med gul streg over."
#define TXT_TIME "Tid:"
#define TXT_QUEUELENGTH "Buffer st�relse:"
#define TXT_ASK_CLEAR_SCREEN_TITLE "Fjerne data fra sk�rmen?"
#define TXT_ASK_CLEAR_SCREEN "Er du sikker p� at du vil dataene fra sk�rmen (billeder, CPR nummer og navn)?"
   
/** 
 * Images
 */
#define PIXMAP_RECORD     PIXMAPS"/record.png"
#define PIXMAP_STOP       PIXMAPS"/stop.png"

#define PIXMAP_FREEZE     PIXMAPS"/freeze.png"
#define PIXMAP_UNFREEZE   PIXMAPS"/unfreeze.png"

#define PIXMAP_CPR        PIXMAPS"/cpr.png"
#define PIXMAP_CLEAR      PIXMAPS"/clear.png"

#define PIXMAP_SNAPSHOT   PIXMAPS"/snapshot.png"
#define PIXMAP_DUMMY      PIXMAPS"/dummy.png"
#define PIXMAP_LOGO_SMALL PIXMAPS"/miav_small.png"

class MainWindow : public QWidget
{
  Q_OBJECT
public:
  MainWindow(QApplication *qApp, QWidget* parent = 0, const char* name = 0);
  ~MainWindow();
  
  void message(char* msg);

public slots:
  void cpr_clicked();
  void clear_clicked();
  void rec_clicked();
  void shoot_clicked();
  void freeze_clicked();
  void redraw_edge();
  void taskbar_update();
  void live_clicked();
 
private:
  void clear();

  Info *info;

  void createGui();
  
  Camera *camera;
  Info *cam_info;

  // Image loading routines.
  QImage *loadButtonIcon( char *name );
  QImage *loadImage( char *name );

  QImage *img_unfreeze;
  QImage *img_freeze;
  QImage *img_snapshot;
  QImage *img_cpr;
  QImage *img_clear;
  QImage *img_record;
  QImage *img_stop;
  QImage *img_logo;

  QImage *img_dummy;
  
  QLabel *lbl_version;
  QLabel *lbl_cpr;
  QLabel *lbl_name;
  QLabel *lbl_recordtime;

  QTimer *taskbartimer;

  // Used for the check_for_error_once_per_2_seconds (very ugly)
  QTimer *errtimer;

  float rec_edge_counter;
  QTimer *timer;
  QLabel *img_recedge;
  QLabel *img_history[NUM_HISTORY];
  
  QPushButton *btn_logo;
  QPushButton *btn_clear;
  QPushButton *btn_cpr;
  QPushButton *btn_rec;
  QPushButton *btn_shoot;
  QPushButton *btn_freeze;

  QStatusBar *status;
  
  VideoWidget *img_live;
  
  bool recording;
  bool frozen;

  // Configuration values
  float unit;
  int video_width;
  int video_height;

  QPushButton *createButton(char *caption, int width = BUTTON_WIDTH, int height = BUTTON_HEIGHT);
  QPushButton *createButton(char *caption, QWidget *parent, int width = BUTTON_WIDTH, int height = BUTTON_HEIGHT);
  QLabel *createLabel(char *caption, int width, int height);
};

#endif

#endif /*USE_GUI*/