Files
fs2open.github.com/code/ui/slider.cpp
T
Zacam 4952b70488 Trunk Sync - r10911
There are a lot of changes here that should probably be examined, namely the Debug Console (which had conflicts) and Yarn's "any resolution" mainhalls code (Which also had conflicts) but for the most part this should be fairly clean.

git-svn-id: svn://svn.icculus.org/fs2open/branches/antipodes@10912 387891d4-d844-0410-90c0-e4c51a9137d3
2014-09-11 19:22:13 +10:00

296 lines
6.7 KiB
C++

/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#include "ui/uidefs.h"
#include "ui/ui.h"
#include "io/timer.h"
#include "missionui/missionscreencommon.h"
#include "bmpman/bmpman.h"
#include "gamesnd/gamesnd.h"
#include "globalincs/alphacolors.h"
/// DOT_SLIDER class down here
void UI_DOT_SLIDER_NEW::create(UI_WINDOW *wnd, int _x, int _y, int _num_pos, char *bm_slider, int slider_mask,
char *bm_left, int left_mask, int left_x, int left_y,
char *bm_right, int right_mask, int right_x, int right_y,
int _dot_width)
{
// no end buttons yet
has_end_buttons = 0;
// if any of the left/right arrow information is specified, make sure its _all_ specified
if((bm_left != NULL) || (left_mask != -1) || (bm_right != NULL) || (right_mask != -1)){
Assert((bm_left != NULL) && (left_mask >= 0) && (bm_right != NULL) && (right_mask >= 0));
if((bm_left == NULL) || (left_mask < 0) || (bm_right == NULL) || (right_mask < 0)){
return;
}
// now we know we have end buttons
has_end_buttons = 1;
}
// internal stuff
num_pos = _num_pos;
base_create(wnd, UI_KIND_DOT_SLIDER_NEW, _x, _y, 0, 20);
pos = 0;
dot_width = _dot_width;
// set bitmaps for the slider itself
button.create( wnd, "", _x, _y, 0, 0, 0, 1 );
button.set_parent(this);
button.link_hotspot(slider_mask);
button.set_bmaps(bm_slider, num_pos, 0);
button.hide();
// maybe setup buttons for the arrows
if ( has_end_buttons ) {
// Second button is the up (increase) button
up_button.create( wnd, "", right_x, right_y, 0, 0, 1, 1 );
up_button.set_parent(this);
up_button.set_highlight_action(common_play_highlight_sound);
up_button.link_hotspot(right_mask);
up_button.set_bmaps(bm_right);
// Third button is the down (decrease) button
down_button.create( wnd, "", left_x, left_y, 0, 0, 1, 1 );
down_button.set_parent(this);
down_button.set_highlight_action(common_play_highlight_sound);
down_button.link_hotspot(left_mask);
down_button.set_bmaps(bm_left);
}
}
void UI_DOT_SLIDER_NEW::draw()
{
// draw end buttons
if ( has_end_buttons ) {
up_button.draw();
down_button.draw();
}
// draw the proper dot
Assert((pos >= 0) && (pos <= num_pos));
// for position -1, we don't draw (no dots)
if(pos >= 0){
button.unhide();
button.draw_forced(pos);
button.hide();
}
}
void UI_DOT_SLIDER_NEW::process(int focus)
{
if (disabled_flag) {
if (!hidden && !my_wnd->use_hack_to_get_around_stupid_problem_flag) {
if (button.is_mouse_on() && B1_JUST_PRESSED) {
gamesnd_play_iface(SND_GENERAL_FAIL);
} else if (has_end_buttons && (up_button.is_mouse_on() || down_button.is_mouse_on())) {
gamesnd_play_iface(SND_GENERAL_FAIL);
}
if ( (hotkey >= 0) && (my_wnd->keypress == hotkey) ){
gamesnd_play_iface(SND_GENERAL_FAIL);
}
}
return;
}
// check focus and derived focus with one variable
if (my_wnd->selected_gadget == this){
focus = 1;
}
// first check the dot area
button.process(focus);
if (button.button_down() || button.pressed() || mouse_captured()) {
capture_mouse(); // while we are changing level, ignore all other buttons
pos = (ui_mouse.x - x) / dot_width;
if (pos < 0){
pos = 0;
}
// if we have 10 positions, 0 - 9 are valid
if ( pos >= num_pos ) {
pos = num_pos - 1;
}
return;
}
if ( has_end_buttons ) {
up_button.process(focus);
if (up_button.pressed()) {
if (pos < num_pos-1){
pos++;
} else {
gamesnd_play_iface(SND_GENERAL_FAIL);
}
}
down_button.process(focus);
if (down_button.pressed()) {
if(pos){
pos--;
} else {
gamesnd_play_iface(SND_GENERAL_FAIL);
}
}
}
}
//
// OLD DOT SLIDER - TO BE PHASED OUT. IF YOU NEED TO USE A UI_DOT_SLIDER, use a UI_DOT_SLIDER_NEW -------------------
//
/// DOT_SLIDER class down here
void UI_DOT_SLIDER::create(UI_WINDOW *wnd, int _x, int _y, char *bm, int id, int end_buttons, int _num_pos)
{
char filename[MAX_PATH_LEN];
int bx, by, bw, hotspot;
has_end_buttons = end_buttons;
if ( has_end_buttons ) {
bx = _x + 24;
by = _y + 1;
bw = 190;
hotspot = id + 1;
} else {
bx = _x;
by = _y;
bw = 80;
hotspot = id;
}
num_pos = _num_pos;
sprintf(filename, "%s%.2d", bm, hotspot);
first_frame = bm_load_animation(filename, &total_frames);
if (first_frame < 0) {
Error(LOCATION, "Could not load %s.ani\n", filename);
disable();
hide();
return;
}
base_create(wnd, UI_KIND_DOT_SLIDER, bx, by, bw, 20);
pos = 0;
// A DOT_SLIDER has up to 3 child buttons..
by = _y;
// First button is the region with the dots
button.create( wnd, "", bx, by, bw, 20, 0, 1 );
button.set_parent(this);
button.link_hotspot(hotspot);
button.hide();
if ( has_end_buttons ) {
// Second button is the up (increase) button
sprintf(filename, "%s%.2d", bm, id + 2);
up_button.create( wnd, "", _x + 216, _y, 22, 24, 1, 1 );
up_button.set_parent(this);
up_button.set_highlight_action(common_play_highlight_sound);
up_button.set_bmaps(filename);
up_button.link_hotspot(id + 2);
// Third button is the down (decrease) button
sprintf(filename, "%s%.2d", bm, id);
down_button.create( wnd, "", _x, _y, 22, 24, 1, 1 );
down_button.set_parent(this);
down_button.set_highlight_action(common_play_highlight_sound);
down_button.set_bmaps(filename);
down_button.link_hotspot(id);
}
}
void UI_DOT_SLIDER::destroy()
{
// release ani frames for the dots.
bm_release(first_frame);
UI_GADGET::destroy();
}
void UI_DOT_SLIDER::draw()
{
if ( has_end_buttons ) {
up_button.draw();
down_button.draw();
}
Assert((pos >= 0) && (pos <= num_pos));
gr_set_bitmap(first_frame + pos); // draw the dot level
gr_bitmap(x, y, GR_RESIZE_MENU);
}
void UI_DOT_SLIDER::process(int focus)
{
if (disabled_flag)
return;
// check focus and derived focus with one variable
if (my_wnd->selected_gadget == this)
focus = 1;
// first check the dot area
button.process(focus);
if (button.button_down() || button.pressed() || mouse_captured()) {
capture_mouse(); // while we are changing level, ignore all other buttons
if ( has_end_buttons ) {
pos = (ui_mouse.x - x + 17) / 19;
} else {
pos = (ui_mouse.x - x) / 19;
}
if (pos < 0){
pos = 0;
}
if ( pos > num_pos ){
pos = num_pos;
}
return;
}
if ( has_end_buttons ) {
up_button.process(focus);
if (up_button.pressed()) {
if (pos < num_pos){
pos++;
} else {
gamesnd_play_iface(SND_GENERAL_FAIL);
}
}
down_button.process(focus);
if (down_button.pressed()) {
if (pos){
pos--;
} else {
gamesnd_play_iface(SND_GENERAL_FAIL);
}
}
}
}