Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/input.cc2
-rw-r--r--src/ui/button.cc18
-rw-r--r--src/ui/button.h11
-rw-r--r--src/ui/ui.cc64
-rw-r--r--src/ui/ui.h12
-rw-r--r--src/ui/widget.cc50
-rw-r--r--src/ui/widget.h24
7 files changed, 129 insertions, 52 deletions
diff --git a/src/client/input.cc b/src/client/input.cc
index 41f79fe..0020a1f 100644
--- a/src/client/input.cc
+++ b/src/client/input.cc
@@ -714,7 +714,7 @@ void frame(float seconds)
mouse_x = event.motion.x;
mouse_y = event.motion.y;
mouse_lastmoved = client()->time();
- ui::root()->event_mousecursor((float) mouse_x, (float) mouse_y);
+ ui::root()->event_mousemove((float) mouse_x, (float) mouse_y);
break;
case SDL_MOUSEBUTTONDOWN:
diff --git a/src/ui/button.cc b/src/ui/button.cc
index 0910995..e06e883 100644
--- a/src/ui/button.cc
+++ b/src/ui/button.cc
@@ -41,9 +41,18 @@ void Button::set_command(std::string const &command)
button_command.assign(command);
}
-void Button::draw()
+void Button::draw_border()
{
- Label::draw();
+ if (!border())
+ return;
+
+ if (palette()) {
+ if (has_focus())
+ render::gl::color(palette()->foreground());
+ else
+ render::gl::color(palette()->border());
+ }
+ render::primitives::border(global_location(), size());
}
void Button::draw_text()
@@ -61,12 +70,12 @@ void Button::draw_text()
render::primitives::text_centered(global_location(), size(), text());
}
-void Button::event_keypress(unsigned int key, unsigned int modifier)
+void Button::keypress(unsigned int key, unsigned int modifier)
{
}
-void Button::event_keyrelease(unsigned int key, unsigned int modifier)
+void Button::keyrelease(unsigned int key, unsigned int modifier)
{
if (key == 512 + SDL_BUTTON_LEFT) {
core::cmd() << button_command << std::endl;
@@ -75,4 +84,3 @@ void Button::event_keyrelease(unsigned int key, unsigned int modifier)
}
-
diff --git a/src/ui/button.h b/src/ui/button.h
index bdf310b..34c3ba4 100644
--- a/src/ui/button.h
+++ b/src/ui/button.h
@@ -25,14 +25,15 @@ public:
/// print button description
virtual void print(size_t indent);
- /// handle keyboard input
- virtual void event_keypress(unsigned int key, unsigned int modifier);
- virtual void event_keyrelease(unsigned int key, unsigned int modifier);
+ /// handle keyboard events
+ virtual void keypress(unsigned int key, unsigned int modifier);
+ virtual void keyrelease(unsigned int key, unsigned int modifier);
protected:
- virtual void draw();
+ /// draw the button border
+ virtual void draw_border();
- /// draw the button
+ /// draw the button text
virtual void draw_text();
private:
diff --git a/src/ui/ui.cc b/src/ui/ui.cc
index 0700c37..d6c53f0 100644
--- a/src/ui/ui.cc
+++ b/src/ui/ui.cc
@@ -168,8 +168,8 @@ void shutdown()
UI::UI() : Window(0)
{
- set_palette(new Palette());
- set_label("user interface");
+ set_palette(&ui_palette);
+ set_label("root");
set_size(1024, 768);
set_border(false);
@@ -237,16 +237,16 @@ void UI::load()
} else if (ini.in_section("colors")) {
if (ini.got_key_color("foreground", color)) {
- widget_palette->set_foreground(color);
+ ui_palette.set_foreground(color);
continue;
} else if (ini.got_key_color("highlight", color)) {
- widget_palette->set_highlight(color);
+ ui_palette.set_highlight(color);
continue;
} else if (ini.got_key_color("background", color)) {
- widget_palette->set_background(color);
+ ui_palette.set_background(color);
continue;
} else if (ini.got_key_color("border", color)) {
- widget_palette->set_border(color);
+ ui_palette.set_border(color);
continue;
} else {
ini.unkown_key();
@@ -257,6 +257,24 @@ void UI::load()
con_debug << " " << ini.name() << " " << window_children.size() << " menus" << std::endl;
ini.close();
+
+ // fallback main menu
+ if (!find_window("main")) {
+ con_warn << "menu 'main' not found, using default" << std::endl;
+ Menu *menu = new Menu(this, "main");
+ menu->add_label("Main Menu");
+ menu->add_button("Connect", "connect");
+ menu->add_button("Quit", "quit");
+ }
+
+ // fallback game menu
+ if (!find_window("game")) {
+ con_warn << "menu 'game' not found, using default" << std::endl;
+ Menu *menu = new Menu(this, "game");
+ menu->add_label("Game Menu");
+ menu->add_button("Disconnect", "disconnect");
+ menu->add_button("Quit", "quit");
+ }
}
UI::~UI()
@@ -297,22 +315,30 @@ void UI::remove_window(Window *window)
Window::remove_window(window);
}
-void UI::show_window(char const *label)
+Window *UI::find_window(const char *label)
{
- Windows::iterator it;
- for (it = window_children.begin(); it != window_children.end(); it++) {
+ for (Windows::iterator it = window_children.begin(); it != window_children.end(); it++) {
if ((*it)->label().compare(label) == 0) {
+ return (*it);
+ }
+ }
+ return 0;
+}
+
+void UI::show_window(const char *label)
+{
+ Window *window = find_window(label);
+
+ if (window) {
if (ui_active_window)
ui_active_window->hide();
- ui_active_window = (*it);
+ ui_active_window = window;
ui_active_window->event_resize();
ui_active_window->show();
- ui_focus = this;
- return;
- }
+ ui_focus = window;
+ } else {
+ con_warn << "Unknown window '" << label << "'" << std::endl;
}
-
- con_warn << "Unknown window '" << label << "'" << std::endl;
}
void UI::hide_window()
@@ -329,21 +355,19 @@ void UI::frame()
event_draw();
}
-void UI::event_mousecursor(float x, float y)
+void UI::event_mousemove(float x, float y)
{
mouse_cursor.assign(x, y);
}
void UI::event_keypress(unsigned int key, unsigned int modifier)
{
- if (ui_focus != this)
- ui_focus->event_keypress(key, modifier);
+ ui_focus->keypress(key, modifier);
}
void UI::event_keyrelease(unsigned int key, unsigned int modifier)
{
- if (ui_focus != this)
- ui_focus->event_keyrelease(key, modifier);
+ ui_focus->keyrelease(key, modifier);
}
}
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 28b6997..5195cbd 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -31,7 +31,7 @@ public:
void load();
/// make a window the active window
- void show_window(char const *label);
+ void show_window(const char *label);
/// hide the active window
void hide_window();
@@ -40,11 +40,11 @@ public:
Window *active() { return ui_active_window; }
/// handle mouse cursor
- virtual void event_mousecursor(float x, float y);
+ void event_mousemove(float x, float y);
/// handle keyboard input
- virtual void event_keypress(unsigned int key, unsigned int modifier);
- virtual void event_keyrelease(unsigned int key, unsigned int modifier);
+ void event_keypress(unsigned int key, unsigned int modifier);
+ void event_keyrelease(unsigned int key, unsigned int modifier);
/// run a user interface frame
void frame();
@@ -53,10 +53,14 @@ public:
inline Widget *focus() { return ui_focus; }
protected:
+ Window *find_window(const char *label);
+
virtual void add_window(Window *window);
virtual void remove_window(Window *window);
private:
+ Palette ui_palette;
+
Window *ui_active_window;
Widget *ui_focus;
math::Vector2f mouse_cursor;
diff --git a/src/ui/widget.cc b/src/ui/widget.cc
index 506d1e7..11d7427 100644
--- a/src/ui/widget.cc
+++ b/src/ui/widget.cc
@@ -13,18 +13,20 @@
namespace ui {
Widget::Widget(Widget *parent) {
- widget_parent = parent;
widget_visible = true;
widget_border = true;
widget_background = false;
+ widget_palette = 0;
widget_label.assign("widget");
- if (widget_parent) {
- parent->add_child(this);
- widget_palette = parent->widget_palette;
+ if (!parent) {
+ widget_parent = root();
} else {
- widget_palette = 0;
+ widget_parent = parent;
}
+
+ if (widget_parent)
+ widget_parent->add_child(this);
}
Widget::~Widget()
@@ -52,6 +54,14 @@ void Widget::print(size_t indent)
con_print << aux::pad_left(marker, indent*2) << label() << std::endl;
}
+Palette const *Widget::palette() const {
+ if (widget_palette) {
+ return widget_palette;
+ } else {
+ return parent()->palette();
+ }
+}
+
void Widget::show()
{
widget_visible = true;
@@ -135,6 +145,30 @@ void Widget::remove_child(Widget *child)
}
}
+void Widget::raise()
+{
+ if (!parent())
+ return;
+
+ Children::iterator it = find_child(this);
+ if (it != parent()->children().end()) {
+ parent()->children().erase(it);
+ parent()->children().push_front(this);
+ }
+}
+
+void Widget::lower()
+{
+ if (!parent())
+ return;
+
+ Children::iterator it = find_child(this);
+ if (it != parent()->children().end()) {
+ parent()->children().erase(it);
+ parent()->children().push_back(this);
+ }
+}
+
void Widget::event_resize()
{
resize();
@@ -215,13 +249,13 @@ bool Widget::has_focus() const
return (root()->focus() == this);
}
-void Widget::event_mousecursor(float x, float y)
+void Widget::mousemove(float x, float y)
{}
-void Widget::event_keypress(unsigned int key, unsigned int modifier)
+void Widget::keypress(unsigned int key, unsigned int modifier)
{}
-void Widget::event_keyrelease(unsigned int key, unsigned int modifier)
+void Widget::keyrelease(unsigned int key, unsigned int modifier)
{}
}
diff --git a/src/ui/widget.h b/src/ui/widget.h
index 13f392e..26832c7 100644
--- a/src/ui/widget.h
+++ b/src/ui/widget.h
@@ -45,7 +45,6 @@ public:
inline float const height() const { return widget_size.y; }
- inline Palette const *palette() const { return widget_palette; }
inline std::string const &label() const { return widget_label; }
@@ -53,10 +52,12 @@ public:
inline bool background() const { return widget_background; }
- inline Widget *parent() { return widget_parent; }
+ inline Widget *parent() const { return widget_parent; }
inline bool visible() const { return widget_visible; }
+ Palette const *palette() const;
+
bool has_focus() const;
@@ -99,17 +100,23 @@ public:
/// draw event
virtual void event_draw();
- /// handle mouse cursor
- virtual void event_mousecursor(float x, float y);
+ /// handle mouse movement
+ virtual void mousemove(float x, float y);
- /// handle keyboard input
- virtual void event_keypress(unsigned int key, unsigned int modifier);
+ /// handle keyboard events
+ virtual void keypress(unsigned int key, unsigned int modifier);
- virtual void event_keyrelease(unsigned int key, unsigned int modifier);
+ virtual void keyrelease(unsigned int key, unsigned int modifier);
/// child widgets
inline Children &children() { return widget_children; }
+ /// raise the widget to the top of the widget stack
+ void raise();
+
+ /// lower the widget to the bottom of the widget stack
+ void lower();
+
protected:
/// draw the widget
virtual void draw();
@@ -171,8 +178,6 @@ protected:
*/
Widget *find_focus(math::Vector2f const & pos);
- Palette *widget_palette;
-
private:
bool widget_visible;
bool widget_background;
@@ -183,6 +188,7 @@ private:
Children widget_children;
+ Palette *widget_palette;
Widget *widget_parent;
Children::iterator find_child(Widget *child);