1
0
Files
otyaSMILEBASIC/SMILEBASIC/dialog.d
2016-12-25 22:48:29 +09:00

167 lines
4.1 KiB
D

module otya.smilebasic.dialog;
import otya.smilebasic.petitcomputer;
import otya.smilebasic.project;
import derelict.sdl2.sdl;
import derelict.sdl2.image;
import derelict.opengl3.gl;
import derelict.opengl3.gl3;
class DialogBase
{
abstract void render();
}
enum SelectionType
{
ok,
noYes,
backNext,
cancelConfirm,
cancelExecute,
next,
}
enum ButtonResult
{
a = 128,
b = 129,
x = 130,
y = 131,
up = 132,
down = 133,
left = 134,
right = 135,
l = 136,
r = 137,
touch = 140,
}
class DialogButton
{
int x, y, width, height;
GraphicPage background;
DialogResult result;
bool isPressed;
this(GraphicPage background, int x, int y, DialogResult result)
{
this.background = background;
this.x = x;
this.y = y;
this.width = background.surface.w;
this.height = background.surface.h;
this.result = result;
}
}
class DialogResources
{
public GraphicPage button1;
public GraphicPage button2;
public this(SDL_Renderer* renderer, GLenum textureScaleMode)
{
button1 = new GraphicPage("dialogresource/yes.png");
button1.createTexture(renderer, textureScaleMode);
button2 = new GraphicPage("dialogresource/no.png");
button2.createTexture(renderer, textureScaleMode);
}
}
class Dialog : DialogBase
{
private PetitComputer petitcom;
this(PetitComputer petitcom)
{
this.petitcom = petitcom;
}
private int result;
private SDL_Rect area;
DialogButton[] buttons;
void renderBackground()
{
int w = 16, h = 16;
glDepthMask(GL_FALSE);
glDisable(GL_TEXTURE_2D);
glColor3ub(248, 248, 248);
glBegin(GL_QUADS);
glVertex2i(0, 0);
glVertex2i(area.w, 0);
glVertex2i(area.w, area.h);
glVertex2i(0, area.h);
glEnd();
glColor3ub(192, 192, 192);
glBegin(GL_LINES);
for (int y = 0; y < area.h; y += h)
{
glVertex2i(0, y);
glVertex2i(area.w, y);
}
for (int x = 0; x < area.w; x += w)
{
glVertex2i(x, 0);
glVertex2i(x, area.h);
}
glEnd();
glDepthMask(GL_TRUE);
}
void renderButton(DialogButton button)
{
glDepthMask(GL_FALSE);
glEnable(GL_TEXTURE_2D);
glColor3ub(255, 255, 255);
glBindTexture(GL_TEXTURE_2D, button.background.glTexture);
glBegin(GL_QUADS);
glTexCoord2i(0, 0);
glVertex2i(button.x, button.y);
glTexCoord2i(1, 0);
glVertex2i(button.x + button.width, button.y);
glTexCoord2i(1, 1);
glVertex2i(button.x + button.width, button.y + button.height);
glTexCoord2i(0, 1);
glVertex2i(button.x, button.y + button.height);
glEnd();
glDisable(GL_TEXTURE_2D);
glDepthMask(GL_TRUE);
}
override void render()
{
petitcom.chScreen2(area.x, area.y, area.w, area.h);
renderBackground();
foreach (b; buttons)
{
renderButton(b);
}
}
int show(wstring text)
{
petitcom.dialog = this;
area = petitcom.showTouchScreen();
int buttonMarginWidth = 12;
int buttonMarginHeight = 12;
buttons = [
new DialogButton(
petitcom.dialogResource.button1,
area.w - buttonMarginWidth - petitcom.dialogResource.button1.surface.w,
area.h - buttonMarginHeight - petitcom.dialogResource.button1.surface.h,
DialogResult.SUCCESS
),
new DialogButton(
petitcom.dialogResource.button2,
buttonMarginWidth,
area.h - buttonMarginHeight - petitcom.dialogResource.button1.surface.h,
DialogResult.CANCEL
)
];
while (true)
{
auto to = petitcom.touchPosition();
SDL_Delay(16);
}
petitcom.hideTouchScreen();
return result;
}
}