Files
2026-02-02 04:50:13 +01:00

188 lines
4.6 KiB
C++

/* 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 <http://www.gnu.org/licenses/>.
*
*/
/* 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