/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program 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 3 of the License, or * (at your option) any later version. * * This program 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 this program. If not, see . * */ /* This is a C++ class for handling a GUI, and associated widgets */ #ifndef NUVIE_GUI_GUI_H #define NUVIE_GUI_GUI_H #include "ultima/nuvie/gui/gui_status.h" #include "ultima/nuvie/gui/gui_drag_manager.h" #include "ultima/nuvie/gui/widgets/gui_widget.h" #include "ultima/nuvie/gui/gui_font.h" #include "common/events.h" namespace Ultima { namespace Nuvie { class Configuration; class Screen; class GUI_Color; #define GUI_FULL_REDRAW true class GUI { protected: static GUI *gui; const Configuration *config; /* The display surface */ Screen *screen; GUI_Font *gui_font; GUI_DragManager *gui_drag_manager; /* Pointers for an array of widgets */ int maxwidgets; int numwidgets; GUI_Widget **widgets; /* All input will go to this widget first. */ GUI_Widget *focused_widget; // SB-X /* All input will go to this widget ONLY. */ GUI_Widget *locked_widget; // SB-X /* All input will be ignored. */ bool block_input; // SB-X /* Flag - whether or not the GUI is currently running */ int running; /* Flag - whether or not the GUI needs to be displayed */ int display; /* Flag - whether we are performing a drag and drop */ bool dragging; bool full_redraw; // this forces all widgets to redraw on the next call to Display() // some default colours GUI_Color *selected_color; public: static const int mouseclick_delay; /* SB-X */ GUI(const Configuration *c, Screen *s); ~GUI(); /* Add a widget to the GUI. The widget will be automatically deleted when the GUI is deleted. This function returns 0, or -1 if the function ran out of memory. */ int AddWidget(GUI_Widget *widget); /* remove widget from gui system but don't delete it */ bool removeWidget(GUI_Widget *widget); bool moveWidget(GUI_Widget *widget, uint32 dx, uint32 dy); /* force everything to redraw */ void force_full_redraw(); /* Display the GUI manually */ void Display(); /* Returns will return true if the GUI is still ready to handle events after a call to Run(), and false if a widget or idle function requested a quit. */ int Running(void) { return running; } /* Run the GUI. This returns when either a widget requests a quit, the idle function requests a quit, or the SDL window has been closed. If 'once' is non-zero, you need to display the GUI yourself, and the GUI event loop will run once and then return. If 'multitaskfriendly' is non-zero AND idle is nullptr, a 'WaitEvent' will be used instead of the CPU time consuming 'PollEvent'. CAVE: Any widget-'idle'-procs WON'T be executed then. */ void Run(GUI_IdleProc idle = nullptr, int once = 0, int multitaskfriendly = 0); /* Run Idle() on all widgets. */ void Idle(); // SB-X static GUI *get_gui() { return gui; } GUI_Font *get_font(); Screen *get_screen() { return screen; } GUI_Widget *get_focused_widget() { return focused_widget; } GUI_Widget *get_locked_widget() { return locked_widget; } bool get_block_input() { return block_input; } //colors GUI_Color *get_selected_color() { return selected_color; } /* Function to pass an event to the GUI widgets */ GUI_status HandleEvent(Common::Event *event); bool set_focus(GUI_Widget *widget); void clear_focus() { set_focus(nullptr); } void lock_input(GUI_Widget *widget); void unlock_input() { lock_input(nullptr); unblock(); } void block() { block_input = true; } void unblock() { block_input = false; } Common::Path get_data_dir() const; uint16 get_width() const { return screen->get_width(); } uint16 get_height() const { return screen->get_height(); } protected: /* Function to handle a GUI status */ void HandleStatus(GUI_status status); void CleanupDeletedWidgets(bool redraw = false); }; } // End of namespace Nuvie } // End of namespace Ultima #endif