1 // SCCS Id: @(#)qt_win.h 3.4 1999/11/19
2 // Copyright (c) Warwick Allison, 1999.
3 // NetHack may be freely redistributed. See license for details.
5 // Qt Binding for NetHack 3.4
7 // Unfortunately, this doesn't use Qt as well as I would like,
8 // primarily because NetHack is fundamentally a getkey-type
9 // program rather than being event driven (hence the ugly key
10 // and click buffer rather), but also because this is my first
11 // major application of Qt.
17 #define QT_CLEAN_NAMESPACE
20 #include <qpushbutton.h>
21 #include <qbuttongroup.h>
23 #include <qlineedit.h>
25 #include <qpe/qpeapplication.h>
27 #include <qapplication.h>
30 #include <qcheckbox.h>
33 #include <qlistview.h>
34 #include <qmessagebox.h>
38 #include <qcombobox.h>
39 #include <qscrollview.h>
41 #include <qttableview.h>
42 // Should stop using QTableView
43 #define QTableView QtTableView
45 #include <qtableview.h>
47 #include <qmainwindow.h>
48 #include <qwidgetstack.h>
52 #include <ktopwidget.h>
62 //////////////////////////////////////////////////////////////
64 // The beautiful, abstracted and well-modelled classes...
66 //////////////////////////////////////////////////////////////
68 class NetHackQtGlyphs;
70 class NetHackQtLineEdit : public QLineEdit {
73 NetHackQtLineEdit(QWidget* parent, const char* name);
75 void fakeEvent(int key, int ascii, int state);
78 class NetHackQtSettings : public QDialog {
81 // Size of window - used to decide default sizes
82 NetHackQtSettings(int width, int height);
84 NetHackQtGlyphs& glyphs();
85 const QFont& normalFont();
86 const QFont& normalFixedFont();
87 const QFont& largeFont();
96 void toggleGlyphSize();
97 void setGlyphSize(bool);
109 QFont normal, normalfixed, large;
111 NetHackQtGlyphs* theglyphs;
117 class NetHackQtKeyBuffer {
119 NetHackQtKeyBuffer();
124 void Put(int k, int ascii, int state);
126 void Put(const char* str);
132 int TopAscii() const;
133 int TopState() const;
143 class NetHackQtClickBuffer {
145 NetHackQtClickBuffer();
150 void Put(int x, int y, int mod);
159 enum { maxclick=64 };
167 class NetHackQtSavedGameSelector : public QDialog {
169 NetHackQtSavedGameSelector(const char** saved);
174 class NetHackQtPlayerSelector : private QDialog {
177 enum { R_None=-1, R_Quit=-2, R_Rand=-3 };
179 NetHackQtPlayerSelector(NetHackQtKeyBuffer&);
182 virtual void done(int);
188 void selectName(const QString& n);
192 void selectGender(int);
193 void selectAlignment(int);
199 NetHackQtKeyBuffer& keysource;
202 QRadioButton **gender;
203 QRadioButton **alignment;
204 bool fully_specified_role;
207 class NetHackQtStringRequestor : QDialog {
210 NetHackQtLineEdit input;
213 NetHackQtKeyBuffer& keysource;
215 virtual void done(int);
218 NetHackQtStringRequestor(NetHackQtKeyBuffer&, const char* p,const char* cancelstr="Cancel");
219 void SetDefault(const char*);
220 bool Get(char* buffer, int maxchar=80);
221 virtual void resizeEvent(QResizeEvent*);
224 class NetHackQtExtCmdRequestor : public QDialog {
227 NetHackQtKeyBuffer& keysource;
230 NetHackQtExtCmdRequestor(NetHackQtKeyBuffer& ks);
239 class NetHackQtWindow {
242 virtual ~NetHackQtWindow();
244 virtual QWidget* Widget() =0;
246 virtual void Clear();
247 virtual void Display(bool block);
248 virtual bool Destroy();
249 virtual void CursorTo(int x,int y);
250 virtual void PutStr(int attr, const char* text);
251 virtual void StartMenu();
252 virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
253 const char* str, bool presel);
254 virtual void EndMenu(const char* prompt);
255 virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
256 virtual void ClipAround(int x,int y);
257 virtual void PrintGlyph(int x,int y,int glyph);
258 virtual void UseRIP(int how);
263 class NetHackQtGlyphs {
267 int width() const { return size.width(); }
268 int height() const { return size.height(); }
270 void setSize(int w, int h);
272 void drawGlyph(QPainter&, int glyph, int pixelx, int pixely);
273 void drawCell(QPainter&, int glyph, int cellx, int celly);
282 class BlackScrollView : public QScrollView {
286 viewport()->setBackgroundColor(black);
290 class NetHackQtMapWindow : public QWidget, public NetHackQtWindow {
293 NetHackQtClickBuffer& clicksink;
294 unsigned short glyph[ROWNO][COLNO];
295 unsigned short& Glyph(int x, int y) { return glyph[y][x]; }
297 BlackScrollView viewport;
298 QPixmap pet_annotation;
304 void Changed(int x,int y);
311 void moveMessages(int x, int y);
314 virtual void paintEvent(QPaintEvent*);
315 virtual void mousePressEvent(QMouseEvent*);
318 NetHackQtMapWindow(NetHackQtClickBuffer& click_sink);
319 ~NetHackQtMapWindow();
321 virtual QWidget* Widget();
322 virtual bool Destroy();
324 virtual void Clear();
325 virtual void Display(bool block);
326 virtual void CursorTo(int x,int y);
327 virtual void PutStr(int attr, const char* text);
328 virtual void ClipAround(int x,int y);
329 virtual void PrintGlyph(int x,int y,int glyph);
331 void Scroll(int dx, int dy);
334 void displayMessages(bool block);
335 void putMessage(int attr, const char* text);
336 void clearMessages();
341 class NetHackQtScrollText;
342 class NetHackQtMessageWindow : QObject, public NetHackQtWindow {
345 NetHackQtMessageWindow();
346 ~NetHackQtMessageWindow();
348 virtual QWidget* Widget();
349 virtual void Clear();
350 virtual void Display(bool block);
351 virtual void PutStr(int attr, const char* text);
353 void Scroll(int dx, int dy);
355 void setMap(NetHackQtMapWindow*);
358 NetHackQtScrollText* list;
360 NetHackQtMapWindow* map;
366 class NetHackQtLabelledIcon : public QWidget {
368 NetHackQtLabelledIcon(QWidget* parent, const char* label);
369 NetHackQtLabelledIcon(QWidget* parent, const char* label, const QPixmap& icon);
371 enum { NoNum=-99999 };
372 void setLabel(const char*, bool lower=TRUE); // a string
373 void setLabel(const char*, long, const char* tail=""); // a number
374 void setLabel(const char*, long show_value, long comparative_value, const char* tail="");
375 void setIcon(const QPixmap&);
376 virtual void setFont(const QFont&);
378 void highlightWhenChanging();
380 void dissipateHighlight();
385 void resizeEvent(QResizeEvent*);
388 void initHighlight();
389 void setAlignments();
390 void highlight(const QPalette& highlight);
395 int turn_count; /* last time the value changed */
403 class NetHackQtStatusWindow : QWidget, public NetHackQtWindow {
406 NetHackQtStatusWindow();
408 virtual QWidget* Widget();
410 virtual void Clear();
411 virtual void Display(bool block);
412 virtual void CursorTo(int x,int y);
413 virtual void PutStr(int attr, const char* text);
415 void fadeHighlighting();
418 void resizeEvent(QResizeEvent*);
424 enum { hilight_time=1 };
447 QPixmap p_encumber[5];
449 NetHackQtLabelledIcon name;
450 NetHackQtLabelledIcon dlevel;
452 NetHackQtLabelledIcon str;
453 NetHackQtLabelledIcon dex;
454 NetHackQtLabelledIcon con;
455 NetHackQtLabelledIcon intel;
456 NetHackQtLabelledIcon wis;
457 NetHackQtLabelledIcon cha;
459 NetHackQtLabelledIcon gold;
460 NetHackQtLabelledIcon hp;
461 NetHackQtLabelledIcon power;
462 NetHackQtLabelledIcon ac;
463 NetHackQtLabelledIcon level;
464 NetHackQtLabelledIcon exp;
465 NetHackQtLabelledIcon align;
467 NetHackQtLabelledIcon time;
468 NetHackQtLabelledIcon score;
470 NetHackQtLabelledIcon hunger;
471 NetHackQtLabelledIcon confused;
472 NetHackQtLabelledIcon sick_fp;
473 NetHackQtLabelledIcon sick_il;
474 NetHackQtLabelledIcon blind;
475 NetHackQtLabelledIcon stunned;
476 NetHackQtLabelledIcon hallu;
477 NetHackQtLabelledIcon encumber;
489 void checkTurnEvents();
492 class NetHackQtMenuDialog : public QDialog {
495 NetHackQtMenuDialog();
501 virtual void done(int);
504 void resizeEvent(QResizeEvent*);
511 class NetHackQtMenuWindow : public QTableView, public NetHackQtWindow {
514 NetHackQtMenuWindow(NetHackQtKeyBuffer&);
515 ~NetHackQtMenuWindow();
517 virtual QWidget* Widget();
519 virtual void StartMenu();
520 virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
521 const char* str, bool presel);
522 virtual void EndMenu(const char* prompt);
523 virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
532 void ToggleSelect(int);
535 virtual void keyPressEvent(QKeyEvent*);
536 //virtual void mouseDoubleClickEvent(QMouseEvent*);
537 virtual void mousePressEvent(QMouseEvent*);
538 virtual void mouseReleaseEvent(QMouseEvent*);
539 virtual void mouseMoveEvent(QMouseEvent*);
540 virtual void focusOutEvent(QFocusEvent*);
541 virtual void focusInEvent(QFocusEvent*);
543 virtual void paintCell(QPainter*, int, int);
544 virtual int cellWidth(int col);
559 bool Selectable() const { return identifier.a_void!=0; }
562 QArray<MenuItem> item;
569 NetHackQtKeyBuffer& keysource;
571 NetHackQtMenuDialog* dialog;
589 class NetHackQtTextListBox;
591 class NetHackQtRIP : public QWidget {
593 static QPixmap* pixmap;
598 NetHackQtRIP(QWidget* parent);
600 void setLines(char** l, int n);
603 virtual void paintEvent(QPaintEvent* event);
604 QSize sizeHint() const;
608 class NetHackQtTextWindow : public QDialog, public NetHackQtWindow {
611 NetHackQtTextWindow(NetHackQtKeyBuffer&);
612 ~NetHackQtTextWindow();
614 virtual QWidget* Widget();
616 virtual void Clear();
617 virtual bool Destroy();
618 virtual void Display(bool block);
619 virtual void PutStr(int attr, const char* text);
620 virtual void UseRIP(int how);
626 virtual void done(int);
627 virtual void keyPressEvent(QKeyEvent*);
633 NetHackQtKeyBuffer& keysource;
640 NetHackQtTextListBox* lines;
645 class NetHackQtMenuOrTextWindow : public NetHackQtWindow {
647 NetHackQtWindow* actual;
648 NetHackQtKeyBuffer& keysource;
651 NetHackQtMenuOrTextWindow(NetHackQtKeyBuffer&);
653 virtual QWidget* Widget();
656 virtual void Clear();
657 virtual bool Destroy();
658 virtual void Display(bool block);
659 virtual void PutStr(int attr, const char* text);
662 virtual void StartMenu();
663 virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
664 const char* str, bool presel);
665 virtual void EndMenu(const char* prompt);
666 virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
670 class NetHackQtDelay : QObject {
675 NetHackQtDelay(int ms);
677 virtual void timerEvent(QTimerEvent* timer);
681 class NetHackQtInvUsageWindow : public QWidget {
683 NetHackQtInvUsageWindow(QWidget* parent);
684 virtual void paintEvent(QPaintEvent*);
686 void drawWorn(QPainter& painter, obj*, int x, int y, bool canbe=TRUE);
689 // This class is the main widget for NetHack
691 // It is a collection of Message, Map, and Status windows. In the current
692 // version of nethack there is only one of each, and this class makes this
693 // assumption, not showing itself until all are inserted.
695 // This class simply knows how to layout such children sensibly.
697 // Since it is only responsible for layout, the class does not
698 // note the actual class of the windows.
704 class NetHackQtMainWindow : public KTopLevelWidget {
707 NetHackQtMainWindow(NetHackQtKeyBuffer&);
709 void AddMessageWindow(NetHackQtMessageWindow* window);
710 void AddMapWindow(NetHackQtMapWindow* window);
711 void AddStatusWindow(NetHackQtStatusWindow* window);
712 void RemoveWindow(NetHackQtWindow* window);
713 void updateInventory();
715 void fadeHighlighting();
718 void doMenuItem(int);
719 void doKeys(const QString&);
722 virtual void resizeEvent(QResizeEvent*);
723 virtual void keyPressEvent(QKeyEvent*);
724 virtual void keyReleaseEvent(QKeyEvent* event);
725 virtual void closeEvent(QCloseEvent*);
731 void raiseMessages();
742 NetHackQtMessageWindow* message;
743 NetHackQtMapWindow* map;
744 NetHackQtStatusWindow* status;
745 NetHackQtInvUsageWindow* invusage;
747 NetHackQtKeyBuffer& keysink;
754 class NetHackQtYnDialog : QDialog {
757 const char* question;
760 NetHackQtKeyBuffer& keysource;
763 virtual void keyPressEvent(QKeyEvent*);
764 virtual void done(int);
770 NetHackQtYnDialog(NetHackQtKeyBuffer& keysource,const char*,const char*,char);
776 #define NetHackQtBindBase KApplication
778 #define NetHackQtBindBase QPEApplication
780 #define NetHackQtBindBase QApplication
783 class NetHackQtBind : NetHackQtBindBase {
785 // Single-instance preservation...
786 NetHackQtBind(int& argc, char** argv);
788 static NetHackQtBind* instance;
790 static NetHackQtKeyBuffer keybuffer;
791 static NetHackQtClickBuffer clickbuffer;
793 static QWidget* splash;
794 static NetHackQtMainWindow* main;
797 static void qt_init_nhwindows(int* argc, char** argv);
798 static void qt_player_selection();
799 static void qt_askname();
800 static void qt_get_nh_event();
801 static void qt_exit_nhwindows(const char *);
802 static void qt_suspend_nhwindows(const char *);
803 static void qt_resume_nhwindows();
804 static winid qt_create_nhwindow(int type);
805 static void qt_clear_nhwindow(winid wid);
806 static void qt_display_nhwindow(winid wid, BOOLEAN_P block);
807 static void qt_destroy_nhwindow(winid wid);
808 static void qt_curs(winid wid, int x, int y);
809 static void qt_putstr(winid wid, int attr, const char *text);
810 static void qt_display_file(const char *filename, BOOLEAN_P must_exist);
811 static void qt_start_menu(winid wid);
812 static void qt_add_menu(winid wid, int glyph,
813 const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr,
814 const char *str, BOOLEAN_P presel);
815 static void qt_end_menu(winid wid, const char *prompt);
816 static int qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list);
817 static void qt_update_inventory();
818 static void qt_mark_synch();
819 static void qt_wait_synch();
821 static void qt_cliparound(int x, int y);
822 static void qt_cliparound_window(winid wid, int x, int y);
823 static void qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph);
824 static void qt_raw_print(const char *str);
825 static void qt_raw_print_bold(const char *str);
826 static int qt_nhgetch();
827 static int qt_nh_poskey(int *x, int *y, int *mod);
828 static void qt_nhbell();
829 static int qt_doprev_message();
830 static char qt_yn_function(const char *question, const char *choices, CHAR_P def);
831 static void qt_getlin(const char *prompt, char *line);
832 static int qt_get_ext_cmd();
833 static void qt_number_pad(int);
834 static void qt_delay_output();
835 static void qt_start_screen();
836 static void qt_end_screen();
838 static void qt_outrip(winid wid, int how);
839 static int qt_kbhit();
842 virtual bool notify(QObject *receiver, QEvent *event);