// Copyright (c) Warwick Allison, 1999.
// Qt4 conversion copyright (c) Ray Chason, 2012-2014.
// NetHack may be freely redistributed.  See license for details.

// qt_bind.h -- bindings between the Qt 4 interface and the main code

#ifndef QT4BIND_H
#define QT4BIND_H

#include "qt_main.h"

namespace nethack_qt_ {

class NetHackQtClickBuffer;

#ifdef KDE
#define NetHackQtBindBase KApplication
#elif defined(QWS)
#define NetHackQtBindBase QPEApplication
#else
#define NetHackQtBindBase QApplication
#endif

class NetHackQtBind : NetHackQtBindBase {
private:
        // Single-instance preservation...
        NetHackQtBind(int& argc, char** argv);

        static NetHackQtBind* instance;

        static NetHackQtKeyBuffer keybuffer;
        static NetHackQtClickBuffer clickbuffer;

        static QFrame* splash;
        static NetHackQtMainWindow* main;

public:
        static void qt_Splash();

        /* window interface */

        static void qt_init_nhwindows(int* argc, char** argv);
        static void qt_player_selection();
        static void qt_askname();
        static void qt_get_nh_event();
        static void qt_exit_nhwindows(const char *);
        static void qt_suspend_nhwindows(const char *);
        static void qt_resume_nhwindows();
        static winid qt_create_nhwindow(int type);
        static void qt_clear_nhwindow(winid wid);
        static void qt_display_nhwindow(winid wid, boolean block);
        static void qt_destroy_nhwindow(winid wid);
        static void qt_curs(winid wid, int x, int y);
        static void qt_putstr(winid wid, int attr, const char *text);
        static void qt_putstr(winid wid, int attr, const std::string& text);
        static void qt_putstr(winid wid, int attr, const QString& text);
        static void qt_display_file(const char *filename, boolean must_exist);
        static void qt_start_menu(winid wid, unsigned long mbehavior);
        static void qt_add_menu(winid wid, const glyph_info *glyphinfo,
                    const ANY_P * identifier, char ch, char gch, int attr, int clr,
	            const char *str, unsigned int itemflags);
	static void qt_end_menu(winid wid, const char *prompt);
        static int qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list);
        static void qt_mark_synch();
        static void qt_wait_synch();

        static void qt_cliparound(int x, int y);
        static void qt_cliparound_window(winid wid, int x, int y);
        static void qt_print_glyph(winid wid, coordxy x, coordxy y,
                                   const glyph_info *glyphingo, 
                                   const glyph_info *bkglyphinfo);
        static void qt_raw_print(const char *str);
        static void qt_raw_print_bold(const char *str);
        static const QPen nhcolor_to_pen(uint32_t c);
        static void qt_change_color(int color, long rgb, int reverse UNUSED);
        static char *qt_get_color_string(void);
        static int qt_nhgetch();
        static int qt_nh_poskey(coordxy *x, coordxy *y, int *mod);
        static void qt_nhbell();
        static int qt_doprev_message();
        static char qt_more();
        static char qt_yn_function(const char *question,
                                   const char *choices, char def);
        static void qt_getlin(const char *prompt, char *line);
        static int qt_get_ext_cmd();
        static void qt_number_pad(int);
        static void qt_delay_output();

        static void qt_preference_update(const char *optname);
        static char *qt_getmsghistory(boolean init);
        static void qt_putmsghistory(const char *msg, boolean is_restoring);

        static void qt_outrip(winid wid, int how, time_t when);
        static int qt_kbhit();
        static void qt_update_inventory(int);
        static win_request_info *qt_ctrl_nhwindow(winid, int, win_request_info *);
        static QWidget *mainWidget() { return main; }
#if defined(SND_LIB_QTSOUND) && !defined(QT_NO_SOUND)
        /* sound interface */
        static void qtsound_init_nhsound(void);
        static void qtsound_exit_nhsound(const char *);
        static void qtsound_achievement(schar, schar, int32_t);
        static void qtsound_soundeffect(char *, int32_t, int32_t);
        static void qtsound_hero_playnotes(int32_t instrument, const char *str, int32_t volume);
        static void qtsound_play_usersound(char *, int32_t, int32_t);
        static void qtsound_ambience(int32_t, int32_t, int32_t);
        static void qtsound_verbal(char *text, int32_t gender, int32_t tone, int32_t vol, int32_t moreinfo);
#endif
#ifdef IDLECHECKPOINT
        static void free_qt_input_timer(void);
#endif

private:
        virtual bool notify(QObject *receiver, QEvent *event);

        static QStringList *msgs_strings;
        static boolean msgs_saved;
        static boolean msgs_initd;
};

} // namespace nethack_qt_

#endif
