mirror of
https://github.com/ogoguel/activegs-ios.git
synced 2025-01-03 00:30:08 +00:00
371 lines
11 KiB
Plaintext
371 lines
11 KiB
Plaintext
/*
|
|
ActiveGS, Copyright 2004-2016 Olivier Goguel, https://github.com/ogoguel/ActiveGS
|
|
Based on Kegs, Copyright 2004 Kent Dickey, https://kegs.sourceforge.net
|
|
This code is covered by the GNU GPL licence
|
|
*/
|
|
|
|
#include "activegsAppDelegate.h"
|
|
#include"../ActiveGS_Karateka/KaratekaKBDController.h"
|
|
#import "UICustomKey.h"
|
|
|
|
|
|
|
|
@implementation UICustomKey
|
|
|
|
- (id)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
// Initialization code
|
|
}
|
|
return self;
|
|
}
|
|
|
|
|
|
@end
|
|
|
|
#define CUSTOM_KEY_WIDTH_DEFAULT 64.0f
|
|
#define CUSTOM_KEY_HEIGHT_DEFAULT 64.0f
|
|
|
|
float CUSTOM_KEY_WIDTH ;
|
|
float CUSTOM_KEY_HEIGHT ;
|
|
|
|
int nb_custom_keys = 0;
|
|
key_type custom_keys[MAX_CUSTOM_KEYS];
|
|
|
|
|
|
void init_custom_keys()
|
|
{
|
|
custom_keys[0].mode = INPUTMODE_LEFTRIGHTKEY;
|
|
custom_keys[0].str = @"←";
|
|
custom_keys[0].code = 0x3B;
|
|
custom_keys[0].halign = LEFT_BORDER ;
|
|
// custom_keys[0].valign = MIDDLE_BOTTOM+ 3 ;
|
|
custom_keys[0].valign = SAME_LINE + 4 ;
|
|
custom_keys[0].hfactor = 1 ;
|
|
|
|
|
|
|
|
custom_keys[1].mode = INPUTMODE_LEFTRIGHTKEY;
|
|
custom_keys[1].str = @"→";
|
|
custom_keys[1].code = 0x3C;
|
|
custom_keys[1].halign = LEFT_ALIGN + 0;
|
|
custom_keys[1].valign = SAME_LINE + 0;
|
|
custom_keys[1].hfactor = 1 ;
|
|
|
|
custom_keys[8].mode = INPUTMODE_LEFTRIGHTKEY;
|
|
custom_keys[8].str = @"SPC";
|
|
custom_keys[8].code = 0x31;
|
|
custom_keys[8].halign = LEFT_BORDER /*LEFTCENTER_ALIGN*/ + 0;
|
|
custom_keys[8].valign = TOP_ALIGN + 0;
|
|
// custom_keys[8].valign = BOTTOM_ALIGN + 0;
|
|
custom_keys[8].hfactor = 2 ;
|
|
|
|
|
|
|
|
custom_keys[2].mode = INPUTMODE_PUNCHKEY + INPUTMODE_PUNCHLEFTRIGHT;
|
|
custom_keys[2].str = @"W"; //@"Q";
|
|
custom_keys[2].halign = RIGHT_ALIGN + RIGHT_BORDER;
|
|
custom_keys[2].valign = TOP_ALIGN + 3;
|
|
custom_keys[2].code = 0x0D; //0x0C;
|
|
|
|
custom_keys[3].mode = INPUTMODE_PUNCHKEY + INPUTMODE_PUNCHLEFTRIGHT;
|
|
custom_keys[3].str = @"S"; //@"A";
|
|
custom_keys[3].halign = RIGHT_ALIGN + RIGHT_BORDER;
|
|
custom_keys[3].valign = VERTICAL_CENTER;
|
|
custom_keys[3].code = 0x01; //0x00;
|
|
|
|
custom_keys[4].mode = INPUTMODE_PUNCHKEY + INPUTMODE_PUNCHLEFTRIGHT;
|
|
custom_keys[4].str = @"X"; //@"Z";
|
|
custom_keys[4].halign = RIGHT_ALIGN + RIGHT_BORDER;
|
|
custom_keys[4].valign = BOTTOM_ALIGN +3;
|
|
custom_keys[4].code = 0x07; //0x06;
|
|
|
|
custom_keys[5].mode = INPUTMODE_PUNCHKEY ;
|
|
custom_keys[5].str = @"Q"; //@"W";
|
|
custom_keys[5].code = 0x0C; //0x0D;
|
|
custom_keys[5].halign = RIGHT_ALIGN + 2;
|
|
custom_keys[5].valign = SAME_LINE + 2;
|
|
|
|
|
|
custom_keys[6].mode = INPUTMODE_PUNCHKEY ;
|
|
custom_keys[6].str = @"A"; //@"S";
|
|
custom_keys[6].code = 0x00; //0x01;
|
|
custom_keys[6].halign = SAME_COL + 5;
|
|
custom_keys[6].valign = BOTTOM_ALIGN + 5;
|
|
|
|
|
|
custom_keys[7].mode = INPUTMODE_PUNCHKEY ;
|
|
custom_keys[7].str = @"Z"; //@"X";
|
|
custom_keys[7].code = 0x06; //0x07;
|
|
custom_keys[7].halign = SAME_COL + 6;
|
|
custom_keys[7].valign = BOTTOM_ALIGN + 6;
|
|
|
|
custom_keys[9].mode = INPUTMODE_SPACEKEY ;
|
|
custom_keys[9].str = @"SPC";
|
|
custom_keys[9].code = 0x31;
|
|
custom_keys[9].halign = RIGHT_ALIGN + RIGHT_BORDER;
|
|
custom_keys[9].valign = VERTICAL_CENTER;
|
|
custom_keys[9].vfactor = 2;
|
|
custom_keys[9].hfactor = 2;
|
|
|
|
custom_keys[10].mode = INPUTMODE_PUNCHLEFTRIGHT ;
|
|
custom_keys[10].str = @"W";
|
|
custom_keys[10].code = 0x0D;
|
|
custom_keys[10].halign = LEFT_ALIGN + LEFT_BORDER;
|
|
custom_keys[10].valign = SAME_LINE + 2;
|
|
|
|
|
|
custom_keys[11].mode = INPUTMODE_PUNCHLEFTRIGHT ;
|
|
custom_keys[11].str = @"S";
|
|
custom_keys[11].code = 0x01;
|
|
custom_keys[11].halign = LEFT_ALIGN + LEFT_BORDER;
|
|
custom_keys[11].valign = BOTTOM_ALIGN + 5;
|
|
|
|
|
|
custom_keys[12].mode = INPUTMODE_PUNCHLEFTRIGHT ;
|
|
custom_keys[12].str = @"X";
|
|
custom_keys[12].code = 0x07;
|
|
custom_keys[12].halign = LEFT_ALIGN + LEFT_BORDER;
|
|
custom_keys[12].valign = BOTTOM_ALIGN + 6;
|
|
|
|
nb_custom_keys = 13;
|
|
|
|
float res = [pManager resolutionRatio];
|
|
CUSTOM_KEY_HEIGHT = CUSTOM_KEY_HEIGHT_DEFAULT*res;
|
|
CUSTOM_KEY_WIDTH = CUSTOM_KEY_WIDTH_DEFAULT*res;
|
|
|
|
|
|
for (int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
//if (custom_keys[i].enabled)
|
|
{
|
|
UILabel* v = [[UILabel alloc]initWithFrame:CGRectMake(-1,-1,
|
|
CUSTOM_KEY_WIDTH*custom_keys[i].hfactor-2.0,
|
|
CUSTOM_KEY_HEIGHT*custom_keys[i].vfactor-2.0)];
|
|
// v.text = custom_keys[i].str;
|
|
v.backgroundColor = custom_keys[i].bgcolor_off;
|
|
v.layer.borderColor = custom_keys[i].bgcolor_on.CGColor;
|
|
v.layer.borderWidth = 1.0;
|
|
// v.textColor = [UIColor redColor];
|
|
KBDController *pKbd = [pManager getEmulatorView].kbdc;
|
|
v.textAlignment = UITextAlignmentCenter;
|
|
[v.layer setCornerRadius:6];
|
|
[pKbd.view addSubview:v];
|
|
custom_keys[i].view=v;
|
|
}
|
|
}
|
|
}
|
|
|
|
void fade_custom_keys(float _alpha)
|
|
{
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
if (custom_keys[i].view)
|
|
custom_keys[i].view.alpha = _alpha;
|
|
}
|
|
|
|
}
|
|
|
|
void touch_begin_custom_key(CGPoint p, int nbtap)
|
|
{
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
UILabel* v = custom_keys[i].view;
|
|
if (custom_keys[i].view.hidden == true )
|
|
continue;
|
|
|
|
CGRect r =v.frame;
|
|
if (CGRectContainsPoint(r,p))
|
|
{
|
|
// j'interromps le déplacement
|
|
if (inputMode & INPUTMODE_PAD)
|
|
{
|
|
setLeft(UP);
|
|
setRight(UP);
|
|
}
|
|
|
|
int code = custom_keys[i].code & 0xFF;
|
|
// printf("code %x down nbtap:%d\n",code,nbtap);
|
|
|
|
|
|
if (nbtap==2 && inputMode & INPUTMODE_BOWONDOUBLETAP)
|
|
{
|
|
if ( is_player_standing() || is_player_about_to_stand() )
|
|
{
|
|
// printf("about to bow\n");
|
|
setSpace(UP);
|
|
setB(DOWN); // Up is automatic
|
|
continue ;
|
|
}
|
|
}
|
|
|
|
if (code==0x31)
|
|
setSpace(DOWN);
|
|
else
|
|
add_event_key(code ,0);
|
|
|
|
// v.backgroundColor = custom_keys[i].bgcolor_over;
|
|
v.layer.borderColor = custom_keys[i].bgcolor_over.CGColor;
|
|
custom_keys[i].status = 1;
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
void touch_end_custom_key()
|
|
{
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
if (!custom_keys[i].status )
|
|
continue;
|
|
|
|
[UIView beginAnimations:nil context:NULL];
|
|
[UIView setAnimationDuration:0.2];
|
|
// custom_keys[i].view.backgroundColor=custom_keys[i].bgcolor_off;
|
|
custom_keys[i].view.layer.borderColor = custom_keys[i].bgcolor_on.CGColor;
|
|
[UIView commitAnimations];
|
|
|
|
int code = custom_keys[i].code & 0xFF;
|
|
|
|
if (code==0x31)
|
|
setSpace(UP);
|
|
else
|
|
add_event_key(code,1);
|
|
|
|
custom_keys[i].status = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void toggle_custom_keys(int _mode, int _hide)
|
|
{
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
if (custom_keys[i].mode & _mode)
|
|
custom_keys[i].view.hidden = _hide;
|
|
}
|
|
}
|
|
|
|
void show_custom_keys(CGRect _rv, int _mode, int _centery)
|
|
{
|
|
|
|
// KBDController *pKbd = [pManager getEmulatorView].kbdc;
|
|
CGSize screen = _rv.size;
|
|
|
|
// reset la position
|
|
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
if (!(custom_keys[i].mode & _mode))
|
|
custom_keys[i].view.hidden = true;
|
|
else
|
|
custom_keys[i].view.hidden = false;
|
|
|
|
|
|
UILabel* v = custom_keys[i].view;
|
|
CGRect r = v.frame;
|
|
r.origin.x = -1;
|
|
r.origin.y = -1;
|
|
[v setFrame:r];
|
|
}
|
|
|
|
|
|
int done;
|
|
do
|
|
{
|
|
done = 1;
|
|
|
|
for(int i=0;i<nb_custom_keys;i++)
|
|
{
|
|
/*
|
|
if (!(custom_keys[i].mode & _mode))
|
|
continue;
|
|
*/
|
|
|
|
UILabel* v = custom_keys[i].view;
|
|
CGRect r = v.frame;
|
|
if (r.origin.x != -1 && r.origin.y != -1 )
|
|
continue;
|
|
|
|
float refx=-1;
|
|
float refy=-1;
|
|
|
|
int ihref = -1;
|
|
if (custom_keys[i].halign & LEFT_BORDER)
|
|
refx = 0;
|
|
else
|
|
if (custom_keys[i].halign & RIGHT_BORDER)
|
|
refx = screen.width;
|
|
else
|
|
{
|
|
ihref= custom_keys[i].halign&0xFF;
|
|
refx = custom_keys[ihref].view.frame.origin.x;
|
|
}
|
|
|
|
int ivref = -1;
|
|
if (custom_keys[i].valign & BOTTOM_BORDER)
|
|
refy = screen.height;
|
|
else
|
|
if (custom_keys[i].valign & VERTICAL_CENTER)
|
|
{
|
|
refy = _centery - CUSTOM_KEY_HEIGHT*custom_keys[i].vfactor/2;
|
|
/*
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
|
|
refy = screen.height ;
|
|
else
|
|
refy = (screen.height - CUSTOM_KEY_HEIGHT*custom_keys[i].vfactor)/2;
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
ivref= custom_keys[i].valign&0xFF;
|
|
refy = custom_keys[ivref].view.frame.origin.y;
|
|
}
|
|
|
|
if (custom_keys[i].halign & LEFT_ALIGN && refx!=-1)
|
|
refx += CUSTOM_KEY_WIDTH*custom_keys[ihref].hfactor;
|
|
|
|
if (custom_keys[i].halign & LEFTCENTER_ALIGN && refx!=-1)
|
|
refx += CUSTOM_KEY_WIDTH*custom_keys[ihref].hfactor*0.5;
|
|
|
|
if (custom_keys[i].halign & RIGHT_ALIGN && refx!=-1)
|
|
refx -= CUSTOM_KEY_WIDTH*custom_keys[i].hfactor;
|
|
|
|
if (custom_keys[i].valign & TOP_ALIGN && refy!=-1)
|
|
refy -= CUSTOM_KEY_HEIGHT*custom_keys[i].vfactor;
|
|
if (custom_keys[i].valign & BOTTOM_ALIGN && refy!=-1)
|
|
refy += CUSTOM_KEY_HEIGHT*custom_keys[ivref].vfactor;
|
|
if (custom_keys[i].valign & MIDDLE_BOTTOM && refy!=-1)
|
|
refy += CUSTOM_KEY_HEIGHT*custom_keys[ivref].vfactor/2;
|
|
|
|
int mod=0;
|
|
if (refx!=-1 && r.origin.x ==-1)
|
|
{
|
|
mod = 1;
|
|
r.origin.x = refx;
|
|
}
|
|
|
|
if (refy!=-1 && r.origin.y ==-1)
|
|
{
|
|
mod = 1;
|
|
r.origin.y = refy;
|
|
}
|
|
|
|
if ( mod )
|
|
{
|
|
// NSLog(@"key:%d ->x:%f, y:%f",i,refx,refy);
|
|
[v setFrame:r];
|
|
}
|
|
|
|
done = 0;
|
|
}
|
|
}
|
|
while (!done);
|
|
|
|
}
|