gba gpu view: copy to clipboard implemented. also some stuff for some other stuff which i really shouldn't be doing because it's pointless when the core doesn't work for some things.
This commit is contained in:
parent
20e7710a5c
commit
dca6dfdaeb
|
@ -232,6 +232,12 @@
|
||||||
<Compile Include="GBAtools\MobileBmpView.Designer.cs">
|
<Compile Include="GBAtools\MobileBmpView.Designer.cs">
|
||||||
<DependentUpon>MobileBmpView.cs</DependentUpon>
|
<DependentUpon>MobileBmpView.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="GBAtools\MobileDetailView.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="GBAtools\MobileDetailView.Designer.cs">
|
||||||
|
<DependentUpon>MobileDetailView.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="GBtools\BmpView.cs">
|
<Compile Include="GBtools\BmpView.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
@ -509,6 +515,9 @@
|
||||||
<EmbeddedResource Include="GBAtools\MobileBmpView.resx">
|
<EmbeddedResource Include="GBAtools\MobileBmpView.resx">
|
||||||
<DependentUpon>MobileBmpView.cs</DependentUpon>
|
<DependentUpon>MobileBmpView.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="GBAtools\MobileDetailView.resx">
|
||||||
|
<DependentUpon>MobileDetailView.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="GBtools\CGBColorChooserForm.resx">
|
<EmbeddedResource Include="GBtools\CGBColorChooserForm.resx">
|
||||||
<DependentUpon>CGBColorChooserForm.cs</DependentUpon>
|
<DependentUpon>CGBColorChooserForm.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|
|
@ -28,16 +28,19 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.listBoxWidgets = new System.Windows.Forms.ListBox();
|
this.listBoxWidgets = new System.Windows.Forms.ListBox();
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
this.panel1 = new System.Windows.Forms.Panel();
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
this.buttonShowWidget = new System.Windows.Forms.Button();
|
this.buttonShowWidget = new System.Windows.Forms.Button();
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||||
this.radioButtonFrame = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioButtonScanline = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioButtonManual = new System.Windows.Forms.RadioButton();
|
|
||||||
this.hScrollBar1 = new System.Windows.Forms.HScrollBar();
|
|
||||||
this.buttonRefresh = new System.Windows.Forms.Button();
|
this.buttonRefresh = new System.Windows.Forms.Button();
|
||||||
|
this.hScrollBar1 = new System.Windows.Forms.HScrollBar();
|
||||||
|
this.radioButtonManual = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioButtonScanline = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioButtonFrame = new System.Windows.Forms.RadioButton();
|
||||||
|
this.labelClipboard = new System.Windows.Forms.Label();
|
||||||
|
this.timerMessage = new System.Windows.Forms.Timer(this.components);
|
||||||
this.groupBox1.SuspendLayout();
|
this.groupBox1.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
@ -45,7 +48,7 @@
|
||||||
//
|
//
|
||||||
this.listBoxWidgets.Location = new System.Drawing.Point(12, 25);
|
this.listBoxWidgets.Location = new System.Drawing.Point(12, 25);
|
||||||
this.listBoxWidgets.Name = "listBoxWidgets";
|
this.listBoxWidgets.Name = "listBoxWidgets";
|
||||||
this.listBoxWidgets.Size = new System.Drawing.Size(120, 160);
|
this.listBoxWidgets.Size = new System.Drawing.Size(137, 160);
|
||||||
this.listBoxWidgets.TabIndex = 0;
|
this.listBoxWidgets.TabIndex = 0;
|
||||||
this.listBoxWidgets.DoubleClick += new System.EventHandler(this.listBoxWidgets_DoubleClick);
|
this.listBoxWidgets.DoubleClick += new System.EventHandler(this.listBoxWidgets_DoubleClick);
|
||||||
//
|
//
|
||||||
|
@ -54,10 +57,11 @@
|
||||||
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.panel1.AutoScroll = true;
|
||||||
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
|
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
|
||||||
this.panel1.Location = new System.Drawing.Point(138, 12);
|
this.panel1.Location = new System.Drawing.Point(155, 0);
|
||||||
this.panel1.Name = "panel1";
|
this.panel1.Name = "panel1";
|
||||||
this.panel1.Size = new System.Drawing.Size(486, 381);
|
this.panel1.Size = new System.Drawing.Size(481, 405);
|
||||||
this.panel1.TabIndex = 1;
|
this.panel1.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// label1
|
// label1
|
||||||
|
@ -88,32 +92,30 @@
|
||||||
this.groupBox1.Controls.Add(this.radioButtonFrame);
|
this.groupBox1.Controls.Add(this.radioButtonFrame);
|
||||||
this.groupBox1.Location = new System.Drawing.Point(15, 220);
|
this.groupBox1.Location = new System.Drawing.Point(15, 220);
|
||||||
this.groupBox1.Name = "groupBox1";
|
this.groupBox1.Name = "groupBox1";
|
||||||
this.groupBox1.Size = new System.Drawing.Size(117, 173);
|
this.groupBox1.Size = new System.Drawing.Size(134, 133);
|
||||||
this.groupBox1.TabIndex = 4;
|
this.groupBox1.TabIndex = 4;
|
||||||
this.groupBox1.TabStop = false;
|
this.groupBox1.TabStop = false;
|
||||||
this.groupBox1.Text = "Refresh";
|
this.groupBox1.Text = "Refresh";
|
||||||
//
|
//
|
||||||
// radioButtonFrame
|
// buttonRefresh
|
||||||
//
|
//
|
||||||
this.radioButtonFrame.AutoSize = true;
|
this.buttonRefresh.Location = new System.Drawing.Point(6, 104);
|
||||||
this.radioButtonFrame.Location = new System.Drawing.Point(6, 19);
|
this.buttonRefresh.Name = "buttonRefresh";
|
||||||
this.radioButtonFrame.Name = "radioButtonFrame";
|
this.buttonRefresh.Size = new System.Drawing.Size(75, 23);
|
||||||
this.radioButtonFrame.Size = new System.Drawing.Size(54, 17);
|
this.buttonRefresh.TabIndex = 4;
|
||||||
this.radioButtonFrame.TabIndex = 0;
|
this.buttonRefresh.Text = "Refresh";
|
||||||
this.radioButtonFrame.Text = "Frame";
|
this.buttonRefresh.UseVisualStyleBackColor = true;
|
||||||
this.radioButtonFrame.UseVisualStyleBackColor = true;
|
this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click);
|
||||||
this.radioButtonFrame.CheckedChanged += new System.EventHandler(this.radioButtonFrame_CheckedChanged);
|
|
||||||
//
|
//
|
||||||
// radioButtonScanline
|
// hScrollBar1
|
||||||
//
|
//
|
||||||
this.radioButtonScanline.AutoSize = true;
|
this.hScrollBar1.LargeChange = 20;
|
||||||
this.radioButtonScanline.Location = new System.Drawing.Point(6, 42);
|
this.hScrollBar1.Location = new System.Drawing.Point(3, 62);
|
||||||
this.radioButtonScanline.Name = "radioButtonScanline";
|
this.hScrollBar1.Maximum = 246;
|
||||||
this.radioButtonScanline.Size = new System.Drawing.Size(66, 17);
|
this.hScrollBar1.Name = "hScrollBar1";
|
||||||
this.radioButtonScanline.TabIndex = 1;
|
this.hScrollBar1.Size = new System.Drawing.Size(128, 16);
|
||||||
this.radioButtonScanline.Text = "Scanline";
|
this.hScrollBar1.TabIndex = 3;
|
||||||
this.radioButtonScanline.UseVisualStyleBackColor = true;
|
this.hScrollBar1.ValueChanged += new System.EventHandler(this.hScrollBar1_ValueChanged);
|
||||||
this.radioButtonScanline.CheckedChanged += new System.EventHandler(this.radioButtonScanline_CheckedChanged);
|
|
||||||
//
|
//
|
||||||
// radioButtonManual
|
// radioButtonManual
|
||||||
//
|
//
|
||||||
|
@ -127,41 +129,61 @@
|
||||||
this.radioButtonManual.UseVisualStyleBackColor = true;
|
this.radioButtonManual.UseVisualStyleBackColor = true;
|
||||||
this.radioButtonManual.CheckedChanged += new System.EventHandler(this.radioButtonManual_CheckedChanged);
|
this.radioButtonManual.CheckedChanged += new System.EventHandler(this.radioButtonManual_CheckedChanged);
|
||||||
//
|
//
|
||||||
// hScrollBar1
|
// radioButtonScanline
|
||||||
//
|
//
|
||||||
this.hScrollBar1.LargeChange = 20;
|
this.radioButtonScanline.AutoSize = true;
|
||||||
this.hScrollBar1.Location = new System.Drawing.Point(3, 62);
|
this.radioButtonScanline.Location = new System.Drawing.Point(6, 42);
|
||||||
this.hScrollBar1.Maximum = 246;
|
this.radioButtonScanline.Name = "radioButtonScanline";
|
||||||
this.hScrollBar1.Name = "hScrollBar1";
|
this.radioButtonScanline.Size = new System.Drawing.Size(66, 17);
|
||||||
this.hScrollBar1.Size = new System.Drawing.Size(111, 16);
|
this.radioButtonScanline.TabIndex = 1;
|
||||||
this.hScrollBar1.TabIndex = 3;
|
this.radioButtonScanline.Text = "Scanline";
|
||||||
this.hScrollBar1.ValueChanged += new System.EventHandler(this.hScrollBar1_ValueChanged);
|
this.radioButtonScanline.UseVisualStyleBackColor = true;
|
||||||
|
this.radioButtonScanline.CheckedChanged += new System.EventHandler(this.radioButtonScanline_CheckedChanged);
|
||||||
//
|
//
|
||||||
// buttonRefresh
|
// radioButtonFrame
|
||||||
//
|
//
|
||||||
this.buttonRefresh.Location = new System.Drawing.Point(6, 104);
|
this.radioButtonFrame.AutoSize = true;
|
||||||
this.buttonRefresh.Name = "buttonRefresh";
|
this.radioButtonFrame.Location = new System.Drawing.Point(6, 19);
|
||||||
this.buttonRefresh.Size = new System.Drawing.Size(75, 23);
|
this.radioButtonFrame.Name = "radioButtonFrame";
|
||||||
this.buttonRefresh.TabIndex = 4;
|
this.radioButtonFrame.Size = new System.Drawing.Size(54, 17);
|
||||||
this.buttonRefresh.Text = "Refresh";
|
this.radioButtonFrame.TabIndex = 0;
|
||||||
this.buttonRefresh.UseVisualStyleBackColor = true;
|
this.radioButtonFrame.Text = "Frame";
|
||||||
this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click);
|
this.radioButtonFrame.UseVisualStyleBackColor = true;
|
||||||
|
this.radioButtonFrame.CheckedChanged += new System.EventHandler(this.radioButtonFrame_CheckedChanged);
|
||||||
|
//
|
||||||
|
// labelClipboard
|
||||||
|
//
|
||||||
|
this.labelClipboard.AutoSize = true;
|
||||||
|
this.labelClipboard.Location = new System.Drawing.Point(9, 356);
|
||||||
|
this.labelClipboard.MaximumSize = new System.Drawing.Size(145, 0);
|
||||||
|
this.labelClipboard.Name = "labelClipboard";
|
||||||
|
this.labelClipboard.Size = new System.Drawing.Size(117, 26);
|
||||||
|
this.labelClipboard.TabIndex = 5;
|
||||||
|
this.labelClipboard.Text = "CTRL + C: Copy under mouse to clipboard.";
|
||||||
|
//
|
||||||
|
// timerMessage
|
||||||
|
//
|
||||||
|
this.timerMessage.Interval = 5000;
|
||||||
|
this.timerMessage.Tick += new System.EventHandler(this.timerMessage_Tick);
|
||||||
//
|
//
|
||||||
// GBAGPUView
|
// GBAGPUView
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(636, 405);
|
this.ClientSize = new System.Drawing.Size(636, 405);
|
||||||
|
this.Controls.Add(this.labelClipboard);
|
||||||
this.Controls.Add(this.groupBox1);
|
this.Controls.Add(this.groupBox1);
|
||||||
this.Controls.Add(this.buttonShowWidget);
|
this.Controls.Add(this.buttonShowWidget);
|
||||||
this.Controls.Add(this.label1);
|
this.Controls.Add(this.label1);
|
||||||
this.Controls.Add(this.panel1);
|
this.Controls.Add(this.panel1);
|
||||||
this.Controls.Add(this.listBoxWidgets);
|
this.Controls.Add(this.listBoxWidgets);
|
||||||
|
this.KeyPreview = true;
|
||||||
this.Name = "GBAGPUView";
|
this.Name = "GBAGPUView";
|
||||||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
|
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
|
||||||
this.Text = "GBA GPU Viewer";
|
this.Text = "GBA GPU Viewer";
|
||||||
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.GBAGPUView_FormClosed);
|
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.GBAGPUView_FormClosed);
|
||||||
this.Load += new System.EventHandler(this.GBAGPUView_Load);
|
this.Load += new System.EventHandler(this.GBAGPUView_Load);
|
||||||
|
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GBAGPUView_KeyDown);
|
||||||
this.groupBox1.ResumeLayout(false);
|
this.groupBox1.ResumeLayout(false);
|
||||||
this.groupBox1.PerformLayout();
|
this.groupBox1.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
@ -181,6 +203,8 @@
|
||||||
private System.Windows.Forms.RadioButton radioButtonManual;
|
private System.Windows.Forms.RadioButton radioButtonManual;
|
||||||
private System.Windows.Forms.RadioButton radioButtonScanline;
|
private System.Windows.Forms.RadioButton radioButtonScanline;
|
||||||
private System.Windows.Forms.RadioButton radioButtonFrame;
|
private System.Windows.Forms.RadioButton radioButtonFrame;
|
||||||
|
private System.Windows.Forms.Label labelClipboard;
|
||||||
|
private System.Windows.Forms.Timer timerMessage;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -24,6 +24,8 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
|
|
||||||
MobileBmpView bg0, bg1, bg2, bg3, bgpal, sppal, sprites, bgtiles16, bgtiles256, sptiles16, sptiles256;
|
MobileBmpView bg0, bg1, bg2, bg3, bgpal, sppal, sprites, bgtiles16, bgtiles256, sptiles16, sptiles256;
|
||||||
|
|
||||||
|
MobileDetailView details, memory;
|
||||||
|
|
||||||
public GBAGPUView()
|
public GBAGPUView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
@ -76,8 +78,8 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe void DrawTile16(int* dest, int pitch, byte* tile, ushort *palette, bool hflip, bool vflip)
|
unsafe void DrawTile16(int* dest, int pitch, byte* tile, ushort* palette, bool hflip, bool vflip)
|
||||||
{
|
{
|
||||||
if (vflip)
|
if (vflip)
|
||||||
{
|
{
|
||||||
|
@ -172,7 +174,7 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
|
|
||||||
byte* tiles = (byte*)vram + ((bgcnt & 0xc) << 12);
|
byte* tiles = (byte*)vram + ((bgcnt & 0xc) << 12);
|
||||||
|
|
||||||
ushort *nametable = (ushort*)vram + ((bgcnt & 0x1f00) << 2);
|
ushort* nametable = (ushort*)vram + ((bgcnt & 0x1f00) << 2);
|
||||||
|
|
||||||
bool eightbit = bgcnt.Bit(7);
|
bool eightbit = bgcnt.Bit(7);
|
||||||
|
|
||||||
|
@ -256,8 +258,8 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
|
|
||||||
int* pixels = (int*)lockdata.Scan0;
|
int* pixels = (int*)lockdata.Scan0;
|
||||||
int pitch = lockdata.Stride / sizeof(int);
|
int pitch = lockdata.Stride / sizeof(int);
|
||||||
|
|
||||||
ushort *frame = (ushort*)vram;
|
ushort* frame = (ushort*)vram;
|
||||||
|
|
||||||
for (int y = 0; y < 160; y++)
|
for (int y = 0; y < 160; y++)
|
||||||
{
|
{
|
||||||
|
@ -266,7 +268,7 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
pixels -= 240;
|
pixels -= 240;
|
||||||
pixels += pitch;
|
pixels += pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
bmp.UnlockBits(lockdata);
|
bmp.UnlockBits(lockdata);
|
||||||
mbv.bmpView.Refresh();
|
mbv.bmpView.Refresh();
|
||||||
}
|
}
|
||||||
|
@ -607,43 +609,74 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
if (sprites.ShouldDraw) DrawSprites(sprites);
|
if (sprites.ShouldDraw) DrawSprites(sprites);
|
||||||
}
|
}
|
||||||
|
|
||||||
MobileBmpView MakeWidget(string text, int w, int h)
|
MobileBmpView MakeMBVWidget(string text, int w, int h)
|
||||||
{
|
{
|
||||||
var mbv = new MobileBmpView();
|
var mbv = new MobileBmpView();
|
||||||
mbv.Text = text;
|
mbv.Text = text;
|
||||||
|
mbv.bmpView.Text = text;
|
||||||
mbv.TopLevel = false;
|
mbv.TopLevel = false;
|
||||||
mbv.ChangeViewSize(w, h);
|
mbv.ChangeViewSize(w, h);
|
||||||
mbv.bmpView.Clear();
|
mbv.bmpView.Clear();
|
||||||
mbv.FormClosing += delegate(object sender, FormClosingEventArgs e)
|
|
||||||
{
|
|
||||||
e.Cancel = true;
|
|
||||||
listBoxWidgets.Items.Add(sender);
|
|
||||||
(sender as Form).Hide();
|
|
||||||
};
|
|
||||||
// hackish, and why doesn't winforms handle this directly?
|
|
||||||
mbv.bmpView.Click += (o, e) => (o as Control).Parent.BringToFront();
|
|
||||||
panel1.Controls.Add(mbv);
|
panel1.Controls.Add(mbv);
|
||||||
listBoxWidgets.Items.Add(mbv);
|
listBoxWidgets.Items.Add(mbv);
|
||||||
return mbv;
|
return mbv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MobileDetailView MakeMDVWidget(string text, int w, int h)
|
||||||
|
{
|
||||||
|
var mdv = new MobileDetailView();
|
||||||
|
mdv.Text = text;
|
||||||
|
mdv.bmpView.Text = text;
|
||||||
|
mdv.TopLevel = false;
|
||||||
|
mdv.ClientSize = new Size(w, h);
|
||||||
|
mdv.bmpView.Clear();
|
||||||
|
panel1.Controls.Add(mdv);
|
||||||
|
listBoxWidgets.Items.Add(mdv);
|
||||||
|
return mdv;
|
||||||
|
}
|
||||||
|
|
||||||
void GenerateWidgets()
|
void GenerateWidgets()
|
||||||
{
|
{
|
||||||
listBoxWidgets.BeginUpdate();
|
listBoxWidgets.BeginUpdate();
|
||||||
bg0 = MakeWidget("Background 0", 256, 256);
|
bg0 = MakeMBVWidget("Background 0", 256, 256);
|
||||||
bg1 = MakeWidget("Background 1", 256, 256);
|
bg1 = MakeMBVWidget("Background 1", 256, 256);
|
||||||
bg2 = MakeWidget("Background 2", 256, 256);
|
bg2 = MakeMBVWidget("Background 2", 256, 256);
|
||||||
bg3 = MakeWidget("Background 3", 256, 256);
|
bg3 = MakeMBVWidget("Background 3", 256, 256);
|
||||||
bgpal = MakeWidget("Background Palettes", 256, 256);
|
bgpal = MakeMBVWidget("Background Palettes", 256, 256);
|
||||||
sppal = MakeWidget("Sprite Palettes", 256, 256);
|
sppal = MakeMBVWidget("Sprite Palettes", 256, 256);
|
||||||
sprites = MakeWidget("Sprites", 1024, 512);
|
sprites = MakeMBVWidget("Sprites", 1024, 512);
|
||||||
sptiles16 = MakeWidget("Sprite Tiles (4bpp)", 256, 256);
|
sptiles16 = MakeMBVWidget("Sprite Tiles (4bpp)", 256, 256);
|
||||||
sptiles256 = MakeWidget("Sprite Tiles (8bpp)", 128, 256);
|
sptiles256 = MakeMBVWidget("Sprite Tiles (8bpp)", 128, 256);
|
||||||
bgtiles16 = MakeWidget("Background Tiles (4bpp)", 512, 256);
|
bgtiles16 = MakeMBVWidget("Background Tiles (4bpp)", 512, 256);
|
||||||
bgtiles256 = MakeWidget("Background Tiles (8bpp)", 256, 256);
|
bgtiles256 = MakeMBVWidget("Background Tiles (8bpp)", 256, 256);
|
||||||
|
details = MakeMDVWidget("Details", 128, 192);
|
||||||
|
memory = MakeMDVWidget("Details - Memory", 128, 192);
|
||||||
listBoxWidgets.EndUpdate();
|
listBoxWidgets.EndUpdate();
|
||||||
|
|
||||||
|
foreach (var f in listBoxWidgets.Items)
|
||||||
|
{
|
||||||
|
Form form = (Form)f;
|
||||||
|
// close becomes hide
|
||||||
|
form.FormClosing += delegate(object sender, FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
e.Cancel = true;
|
||||||
|
listBoxWidgets.Items.Add(sender);
|
||||||
|
(sender as Form).Hide();
|
||||||
|
};
|
||||||
|
// hackish, and why doesn't winforms handle this directly?
|
||||||
|
BringToFrontHack(form, form);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void BringToFrontHack(Control c, Control top)
|
||||||
|
{
|
||||||
|
c.Click += (o, e) => top.BringToFront();
|
||||||
|
if (c.HasChildren)
|
||||||
|
foreach (Control cc in c.Controls)
|
||||||
|
BringToFrontHack(cc, top);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Restart()
|
public void Restart()
|
||||||
{
|
{
|
||||||
gba = Global.Emulator as Emulation.Consoles.Nintendo.GBA.GBA;
|
gba = Global.Emulator as Emulation.Consoles.Nintendo.GBA.GBA;
|
||||||
|
@ -693,9 +726,9 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
{
|
{
|
||||||
if (listBoxWidgets.SelectedItem != null)
|
if (listBoxWidgets.SelectedItem != null)
|
||||||
{
|
{
|
||||||
var mbv = listBoxWidgets.SelectedItem as MobileBmpView;
|
var form = listBoxWidgets.SelectedItem as Form;
|
||||||
mbv.Show();
|
form.Show();
|
||||||
mbv.BringToFront();
|
form.BringToFront();
|
||||||
listBoxWidgets.Items.RemoveAt(listBoxWidgets.SelectedIndex);
|
listBoxWidgets.Items.RemoveAt(listBoxWidgets.SelectedIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -710,6 +743,8 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
ShowSelectedWidget();
|
ShowSelectedWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region refresh control
|
||||||
|
|
||||||
int cbscanline;
|
int cbscanline;
|
||||||
int cbscanline_emu = 500;
|
int cbscanline_emu = 500;
|
||||||
|
|
||||||
|
@ -761,6 +796,8 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
DrawEverything();
|
DrawEverything();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
private void GBAGPUView_FormClosed(object sender, FormClosedEventArgs e)
|
private void GBAGPUView_FormClosed(object sender, FormClosedEventArgs e)
|
||||||
{
|
{
|
||||||
if (gba != null)
|
if (gba != null)
|
||||||
|
@ -769,5 +806,39 @@ namespace BizHawk.MultiClient.GBAtools
|
||||||
gba = null;
|
gba = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region copy to clipboard
|
||||||
|
|
||||||
|
private void timerMessage_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
timerMessage.Stop();
|
||||||
|
labelClipboard.Text = "CTRL + C: Copy under mouse to clipboard.";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GBAGPUView_KeyDown(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
if (Control.ModifierKeys.HasFlag(Keys.Control) && e.KeyCode == Keys.C)
|
||||||
|
{
|
||||||
|
// find the control under the mouse
|
||||||
|
Point m = System.Windows.Forms.Cursor.Position;
|
||||||
|
Control top = this;
|
||||||
|
Control found = null;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
found = top.GetChildAtPoint(top.PointToClient(m));
|
||||||
|
top = found;
|
||||||
|
} while (found != null && found.HasChildren);
|
||||||
|
|
||||||
|
if (found != null && found is BmpView)
|
||||||
|
{
|
||||||
|
var bv = found as BmpView;
|
||||||
|
Clipboard.SetImage(bv.bmp);
|
||||||
|
labelClipboard.Text = found.Text + " copied to clipboard.";
|
||||||
|
timerMessage.Stop();
|
||||||
|
timerMessage.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,4 +117,10 @@
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="timerMessage.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
|
<value>63</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
|
@ -0,0 +1,103 @@
|
||||||
|
namespace BizHawk.MultiClient.GBAtools
|
||||||
|
{
|
||||||
|
partial class MobileDetailView
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.bmpView1 = new BizHawk.MultiClient.GBtools.BmpView();
|
||||||
|
this.listView1 = new System.Windows.Forms.ListView();
|
||||||
|
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
|
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
|
this.tableLayoutPanel1.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// tableLayoutPanel1
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel1.ColumnCount = 1;
|
||||||
|
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.bmpView1, 0, 0);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.listView1, 0, 1);
|
||||||
|
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||||
|
this.tableLayoutPanel1.RowCount = 2;
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 140F));
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.Size = new System.Drawing.Size(142, 332);
|
||||||
|
this.tableLayoutPanel1.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// bmpView1
|
||||||
|
//
|
||||||
|
this.bmpView1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.bmpView1.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.bmpView1.Name = "bmpView1";
|
||||||
|
this.bmpView1.Size = new System.Drawing.Size(136, 134);
|
||||||
|
this.bmpView1.TabIndex = 0;
|
||||||
|
this.bmpView1.Text = "bmpView1";
|
||||||
|
//
|
||||||
|
// listView1
|
||||||
|
//
|
||||||
|
this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||||
|
this.columnHeader1,
|
||||||
|
this.columnHeader2});
|
||||||
|
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.listView1.GridLines = true;
|
||||||
|
this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
|
||||||
|
this.listView1.Location = new System.Drawing.Point(3, 143);
|
||||||
|
this.listView1.Name = "listView1";
|
||||||
|
this.listView1.Size = new System.Drawing.Size(136, 186);
|
||||||
|
this.listView1.TabIndex = 1;
|
||||||
|
this.listView1.UseCompatibleStateImageBehavior = false;
|
||||||
|
this.listView1.View = System.Windows.Forms.View.Details;
|
||||||
|
this.listView1.SizeChanged += new System.EventHandler(this.listView1_SizeChanged);
|
||||||
|
//
|
||||||
|
// MobileDetailView
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(142, 332);
|
||||||
|
this.Controls.Add(this.tableLayoutPanel1);
|
||||||
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
|
||||||
|
this.Name = "MobileDetailView";
|
||||||
|
this.Text = "MobileDetailView";
|
||||||
|
this.SizeChanged += new System.EventHandler(this.MobileDetailView_SizeChanged);
|
||||||
|
this.tableLayoutPanel1.ResumeLayout(false);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||||
|
private GBtools.BmpView bmpView1;
|
||||||
|
private System.Windows.Forms.ListView listView1;
|
||||||
|
private System.Windows.Forms.ColumnHeader columnHeader1;
|
||||||
|
private System.Windows.Forms.ColumnHeader columnHeader2;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace BizHawk.MultiClient.GBAtools
|
||||||
|
{
|
||||||
|
public partial class MobileDetailView : Form
|
||||||
|
{
|
||||||
|
public MobileDetailView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public GBtools.BmpView bmpView { get { return bmpView1; } }
|
||||||
|
|
||||||
|
[Browsable(false)]
|
||||||
|
public bool ShouldDraw { get { return this.Visible; } }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDetails(IList<Tuple<string, string>> details)
|
||||||
|
{
|
||||||
|
listView1.Items.Clear();
|
||||||
|
foreach (var t in details)
|
||||||
|
{
|
||||||
|
listView1.Items.Add(new ListViewItem(new string[] { t.Item1, t.Item2 }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MobileDetailView_SizeChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// bmp view is always square
|
||||||
|
tableLayoutPanel1.RowStyles[0].Height = ClientSize.Width;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void listView1_SizeChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
listView1.Columns[0].Width = listView1.Width / 2;
|
||||||
|
listView1.Columns[1].Width = listView1.Width / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
Loading…
Reference in New Issue