win32: fix always on top inifile saving and add "lockdown" option to keep mouse from breaking the window during fast stylus action
This commit is contained in:
parent
16a06984bf
commit
8b89eb1ebe
|
@ -20,6 +20,7 @@ Windows:
|
||||||
enh: add EPX and EPX1.5X resize filters
|
enh: add EPX and EPX1.5X resize filters
|
||||||
enh: add a japanese translation which will soon be stale like the others
|
enh: add a japanese translation which will soon be stale like the others
|
||||||
enh: add fancy printscreen with emulator info on it
|
enh: add fancy printscreen with emulator info on it
|
||||||
|
enh: add "lockdown" window mode to keep window safe from fast stylus action
|
||||||
|
|
||||||
Linux/OSX:
|
Linux/OSX:
|
||||||
bug: fix building for nosse2 systems
|
bug: fix building for nosse2 systems
|
||||||
|
|
|
@ -24,20 +24,18 @@
|
||||||
#include "rasterize.h"
|
#include "rasterize.h"
|
||||||
#include "gfx3d.h"
|
#include "gfx3d.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define HAVE_WX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_WX
|
#ifdef HAVE_WX
|
||||||
#include "wx/wxprec.h"
|
#include "wx/wxprec.h"
|
||||||
#include "wx/wx.h"
|
#include "wx/wx.h"
|
||||||
#include "wxdlg/wxdlg3dViewer.h"
|
#include "wxdlg/wxdlg3dViewer.h"
|
||||||
|
|
||||||
const int kVewportWidth = 512;
|
const int kViewportWidth = 256;
|
||||||
|
const int kViewportHeight = 192;
|
||||||
|
|
||||||
static SoftRasterizerEngine engine;
|
static SoftRasterizerEngine engine;
|
||||||
static Fragment _screen[kVewportWidth*384];
|
static Fragment _screen[kViewportWidth*kViewportHeight];
|
||||||
static FragmentColor _screenColor[kVewportWidth*384];
|
static FragmentColor _screenColor[kViewportWidth*kViewportHeight];
|
||||||
|
|
||||||
extern void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine);
|
extern void _HACK_Viewer_ExecUnit(SoftRasterizerEngine* engine);
|
||||||
|
|
||||||
|
@ -54,6 +52,24 @@ public:
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NewFrame()
|
||||||
|
{
|
||||||
|
listPolys->SetItemCount(viewer3d_state.polylist.count);
|
||||||
|
labelUserPolycount->SetLabel(wxString::Format("%s: %d",_("User Polys"),viewer3d_state.polylist.count));
|
||||||
|
labelFinalPolycount->SetLabel(wxString::Format("%s: %d",_("Final Polys"),viewer3d_state.polylist.count));
|
||||||
|
tree->DeleteAllItems();
|
||||||
|
wxTreeItemId root = tree->AddRoot("");
|
||||||
|
for(int i=0;i<viewer3d_state.polylist.count;i++)
|
||||||
|
{
|
||||||
|
tree->AppendItem(root,"hai kirin");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const
|
||||||
|
{
|
||||||
|
return "hi";
|
||||||
|
}
|
||||||
|
|
||||||
void RedrawPanel(wxClientDC* dc)
|
void RedrawPanel(wxClientDC* dc)
|
||||||
{
|
{
|
||||||
//------------
|
//------------
|
||||||
|
@ -63,16 +79,16 @@ public:
|
||||||
engine.indexlist = &viewer3d_state.indexlist;
|
engine.indexlist = &viewer3d_state.indexlist;
|
||||||
engine.screen = _screen;
|
engine.screen = _screen;
|
||||||
engine.screenColor = _screenColor;
|
engine.screenColor = _screenColor;
|
||||||
engine.width = kVewportWidth;
|
engine.width = kViewportWidth;
|
||||||
engine.height = 384;
|
engine.height = kViewportHeight;
|
||||||
|
|
||||||
engine.updateFogTable();
|
engine.updateFogTable();
|
||||||
|
|
||||||
engine.initFramebuffer(kVewportWidth,384,gfx3d.state.enableClearImage);
|
engine.initFramebuffer(kViewportWidth,kViewportHeight,gfx3d.state.enableClearImage);
|
||||||
engine.updateToonTable();
|
engine.updateToonTable();
|
||||||
engine.updateFloatColors();
|
engine.updateFloatColors();
|
||||||
engine.performClipping(checkMaterialInterpolate->IsChecked());
|
engine.performClipping(checkMaterialInterpolate->IsChecked());
|
||||||
engine.performViewportTransforms<true>(kVewportWidth,384);
|
engine.performViewportTransforms<true>(kViewportWidth,kViewportHeight);
|
||||||
engine.performBackfaceTests();
|
engine.performBackfaceTests();
|
||||||
engine.performCoordAdjustment(false);
|
engine.performCoordAdjustment(false);
|
||||||
engine.setupTextures(false);
|
engine.setupTextures(false);
|
||||||
|
@ -81,14 +97,14 @@ public:
|
||||||
//------------
|
//------------
|
||||||
|
|
||||||
//dc.SetBackground(*wxGREEN_BRUSH); dc.Clear();
|
//dc.SetBackground(*wxGREEN_BRUSH); dc.Clear();
|
||||||
u8 framebuffer[kVewportWidth*384*3];
|
u8 framebuffer[kViewportWidth*kViewportHeight*3];
|
||||||
for(int y=0,i=0;y<384;y++)
|
for(int y=0,i=0;y<kViewportHeight;y++)
|
||||||
for(int x=0;x<kVewportWidth;x++,i++) {
|
for(int x=0;x<kViewportWidth;x++,i++) {
|
||||||
framebuffer[i*3] = _screenColor[i].r<<2;
|
framebuffer[i*3] = _screenColor[i].r<<2;
|
||||||
framebuffer[i*3+1] = _screenColor[i].g<<2;
|
framebuffer[i*3+1] = _screenColor[i].g<<2;
|
||||||
framebuffer[i*3+2] = _screenColor[i].b<<2;
|
framebuffer[i*3+2] = _screenColor[i].b<<2;
|
||||||
}
|
}
|
||||||
wxImage image(kVewportWidth,384,framebuffer,true);
|
wxImage image(kViewportWidth,kViewportHeight,framebuffer,true);
|
||||||
wxBitmap bitmap(image);
|
wxBitmap bitmap(image);
|
||||||
dc->DrawBitmap(bitmap,0,0);
|
dc->DrawBitmap(bitmap,0,0);
|
||||||
}
|
}
|
||||||
|
@ -135,6 +151,7 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
viewer->NewFrame();
|
||||||
viewer->RepaintPanel();
|
viewer->RepaintPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
#define HAVE_WX
|
||||||
#define ENABLE_SSE
|
#define ENABLE_SSE
|
||||||
#define ENABLE_SSE2
|
#define ENABLE_SSE2
|
||||||
#ifdef DEVELOPER
|
#ifdef DEVELOPER
|
||||||
|
|
|
@ -1564,10 +1564,6 @@
|
||||||
RelativePath="..\wxdlg\wxdlg3dViewer.h"
|
RelativePath="..\wxdlg\wxdlg3dViewer.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\wxdlg\wxMain.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
</Filter>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\addons.cpp"
|
RelativePath="..\addons.cpp"
|
||||||
|
|
|
@ -613,6 +613,35 @@ void ToDSScreenRelativeCoords(s32& x, s32& y, int whichScreen)
|
||||||
|
|
||||||
// END Rotation definitions
|
// END Rotation definitions
|
||||||
|
|
||||||
|
//-----window style handling----
|
||||||
|
const u32 DWS_NORMAL = 0;
|
||||||
|
const u32 DWS_ALWAYSONTOP = 1;
|
||||||
|
const u32 DWS_LOCKDOWN = 2;
|
||||||
|
|
||||||
|
static u32 currWindowStyle = DWS_NORMAL;
|
||||||
|
static void SetStyle(u32 dws)
|
||||||
|
{
|
||||||
|
//WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
||||||
|
|
||||||
|
//pokefan's suggestion, there are a number of ways we could do this.
|
||||||
|
//i sort of like this because it is very visually indicative of being locked down
|
||||||
|
DWORD ws = GetWindowLong(MainWindow->getHWnd(),GWL_STYLE);
|
||||||
|
ws &= ~(WS_CAPTION | WS_POPUP | WS_THICKFRAME | WS_DLGFRAME );
|
||||||
|
if(dws & DWS_LOCKDOWN)
|
||||||
|
ws |= WS_POPUP | WS_DLGFRAME ;
|
||||||
|
else ws |= WS_CAPTION | WS_THICKFRAME;
|
||||||
|
SetWindowLong(MainWindow->getHWnd(),GWL_STYLE, ws);
|
||||||
|
|
||||||
|
currWindowStyle = dws;
|
||||||
|
HWND insertAfter = HWND_NOTOPMOST;
|
||||||
|
if(dws & DWS_ALWAYSONTOP)
|
||||||
|
insertAfter = HWND_TOPMOST;
|
||||||
|
SetWindowPos(MainWindow->getHWnd(), insertAfter, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 GetStyle() { return currWindowStyle; }
|
||||||
|
//---------
|
||||||
|
|
||||||
void UpdateRecentRomsMenu()
|
void UpdateRecentRomsMenu()
|
||||||
{
|
{
|
||||||
//This function will be called to populate the Recent Menu
|
//This function will be called to populate the Recent Menu
|
||||||
|
@ -2157,9 +2186,10 @@ static void RefreshMicSettings()
|
||||||
DWORD wmTimerRes;
|
DWORD wmTimerRes;
|
||||||
int _main()
|
int _main()
|
||||||
{
|
{
|
||||||
|
//7zup initialization
|
||||||
InitDecoder();
|
InitDecoder();
|
||||||
|
|
||||||
#ifdef WX_STUB
|
#ifdef HAVE_WX
|
||||||
wxInitialize();
|
wxInitialize();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2214,6 +2244,10 @@ int _main()
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 style = DWS_NORMAL;
|
||||||
|
if(GetPrivateProfileBool("Video","Window Always On Top", false, IniName)) style |= DWS_ALWAYSONTOP;
|
||||||
|
if(GetPrivateProfileBool("Video","Window Lockdown", false, IniName)) style |= DWS_LOCKDOWN;
|
||||||
|
|
||||||
windowSize = GetPrivateProfileInt("Video","Window Size", 0, IniName);
|
windowSize = GetPrivateProfileInt("Video","Window Size", 0, IniName);
|
||||||
video.rotation = GetPrivateProfileInt("Video","Window Rotate", 0, IniName);
|
video.rotation = GetPrivateProfileInt("Video","Window Rotate", 0, IniName);
|
||||||
video.rotation_userset = GetPrivateProfileInt("Video","Window Rotate Set", video.rotation, IniName);
|
video.rotation_userset = GetPrivateProfileInt("Video","Window Rotate Set", video.rotation, IniName);
|
||||||
|
@ -2288,7 +2322,7 @@ int _main()
|
||||||
|
|
||||||
MainWindow = new WINCLASS(CLASSNAME, hAppInst);
|
MainWindow = new WINCLASS(CLASSNAME, hAppInst);
|
||||||
if (!MainWindow->create((char*)EMU_DESMUME_NAME_AND_VERSION(), WndX, WndY, video.width,video.height+video.screengap,
|
if (!MainWindow->create((char*)EMU_DESMUME_NAME_AND_VERSION(), WndX, WndY, video.width,video.height+video.screengap,
|
||||||
WS_CAPTION| WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
||||||
NULL))
|
NULL))
|
||||||
{
|
{
|
||||||
MessageBox(NULL, "Error creating main window", "DeSmuME", MB_OK);
|
MessageBox(NULL, "Error creating main window", "DeSmuME", MB_OK);
|
||||||
|
@ -2296,6 +2330,8 @@ int _main()
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetStyle(style);
|
||||||
|
|
||||||
gpu_SetRotateScreen(video.rotation);
|
gpu_SetRotateScreen(video.rotation);
|
||||||
|
|
||||||
//default the firmware settings, they may get changed later
|
//default the firmware settings, they may get changed later
|
||||||
|
@ -2582,8 +2618,8 @@ int _main()
|
||||||
MainWindow->Show(SW_NORMAL);
|
MainWindow->Show(SW_NORMAL);
|
||||||
|
|
||||||
//DEBUG TEST HACK
|
//DEBUG TEST HACK
|
||||||
//driver->VIEW3D_Init();
|
driver->VIEW3D_Init();
|
||||||
//driver->view3d->Launch();
|
driver->view3d->Launch();
|
||||||
//---------
|
//---------
|
||||||
|
|
||||||
//------DO EVERYTHING
|
//------DO EVERYTHING
|
||||||
|
@ -3550,6 +3586,7 @@ void FilterUpdate (HWND hwnd, bool user)
|
||||||
WritePrivateProfileInt("Video", "Height", video.height, IniName);
|
WritePrivateProfileInt("Video", "Height", video.height, IniName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DesEnableMenuItem(HMENU hMenu, UINT uIDEnableItem, bool enable)
|
void DesEnableMenuItem(HMENU hMenu, UINT uIDEnableItem, bool enable)
|
||||||
{
|
{
|
||||||
EnableMenuItem(hMenu, uIDEnableItem, MF_BYCOMMAND | (enable?MF_ENABLED:MF_GRAYED));
|
EnableMenuItem(hMenu, uIDEnableItem, MF_BYCOMMAND | (enable?MF_ENABLED:MF_GRAYED));
|
||||||
|
@ -3646,6 +3683,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
MainWindow->checkMenu(IDC_WINDOW2_5X, ((windowSize==65534)));
|
MainWindow->checkMenu(IDC_WINDOW2_5X, ((windowSize==65534)));
|
||||||
MainWindow->checkMenu(IDC_WINDOW3X, ((windowSize==3)));
|
MainWindow->checkMenu(IDC_WINDOW3X, ((windowSize==3)));
|
||||||
MainWindow->checkMenu(IDC_WINDOW4X, ((windowSize==4)));
|
MainWindow->checkMenu(IDC_WINDOW4X, ((windowSize==4)));
|
||||||
|
MainWindow->checkMenu(IDM_ALWAYS_ON_TOP, (GetStyle()&DWS_ALWAYSONTOP)!=0);
|
||||||
|
MainWindow->checkMenu(IDM_LOCKDOWN, (GetStyle()&DWS_LOCKDOWN)!=0);
|
||||||
|
|
||||||
//Screen Separation
|
//Screen Separation
|
||||||
MainWindow->checkMenu(IDM_SCREENSEP_NONE, ((video.screengap==kGapNone)));
|
MainWindow->checkMenu(IDM_SCREENSEP_NONE, ((video.screengap==kGapNone)));
|
||||||
|
@ -5090,23 +5129,16 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
ScaleScreen(1);
|
ScaleScreen(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IDM_LOCKDOWN:
|
||||||
|
{
|
||||||
|
SetStyle(GetStyle()^DWS_LOCKDOWN);
|
||||||
|
WritePrivateProfileBool("Video", "Window Lockdown", (GetStyle()&DWS_LOCKDOWN)!=0, IniName);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
case IDM_ALWAYS_ON_TOP:
|
case IDM_ALWAYS_ON_TOP:
|
||||||
{
|
{
|
||||||
LONG exStyle = GetWindowLong(MainWindow->getHWnd(), GWL_EXSTYLE);
|
SetStyle(GetStyle()^DWS_ALWAYSONTOP);
|
||||||
UINT menuCheck = MF_BYCOMMAND;
|
WritePrivateProfileBool("Video", "Window Always On Top", (GetStyle()&DWS_ALWAYSONTOP)!=0, IniName);
|
||||||
HWND insertAfter = HWND_TOPMOST;
|
|
||||||
|
|
||||||
|
|
||||||
if(exStyle & WS_EX_TOPMOST)
|
|
||||||
{
|
|
||||||
menuCheck |= MF_UNCHECKED;
|
|
||||||
insertAfter = HWND_NOTOPMOST;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
menuCheck |= MF_CHECKED;
|
|
||||||
|
|
||||||
CheckMenuItem(mainMenu, IDM_ALWAYS_ON_TOP, menuCheck);
|
|
||||||
SetWindowPos(MainWindow->getHWnd(), insertAfter, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -699,6 +699,7 @@
|
||||||
#define IDM_CHEATS_SEARCH 40063
|
#define IDM_CHEATS_SEARCH 40063
|
||||||
#define ID_RAMSEARCH_CAPTIONTEXT 40064
|
#define ID_RAMSEARCH_CAPTIONTEXT 40064
|
||||||
#define IDM_VIEW3D 40065
|
#define IDM_VIEW3D 40065
|
||||||
|
#define IDM_LOCKDOWN 40066
|
||||||
#define IDC_LABEL_UP 50000
|
#define IDC_LABEL_UP 50000
|
||||||
#define IDC_LABEL_RIGHT 50001
|
#define IDC_LABEL_RIGHT 50001
|
||||||
#define IDC_LABEL_LEFT 50002
|
#define IDC_LABEL_LEFT 50002
|
||||||
|
@ -794,7 +795,7 @@
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 106
|
#define _APS_NEXT_RESOURCE_VALUE 106
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40010
|
#define _APS_NEXT_COMMAND_VALUE 40012
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1020
|
#define _APS_NEXT_CONTROL_VALUE 1020
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -68,6 +68,8 @@ wxdlg3dViewer::wxdlg3dViewer( wxWindow* parent, wxWindowID id, const wxString& c
|
||||||
{
|
{
|
||||||
Init();
|
Init();
|
||||||
Create(parent, id, caption, pos, size, style);
|
Create(parent, id, caption, pos, size, style);
|
||||||
|
listPolys->callbacks = this;
|
||||||
|
listPolys->InsertColumn(0,"polys");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,6 +114,10 @@ void wxdlg3dViewer::Init()
|
||||||
////@begin wxdlg3dViewer member initialisation
|
////@begin wxdlg3dViewer member initialisation
|
||||||
checkMaterialInterpolate = NULL;
|
checkMaterialInterpolate = NULL;
|
||||||
panelViewport = NULL;
|
panelViewport = NULL;
|
||||||
|
labelUserPolycount = NULL;
|
||||||
|
labelFinalPolycount = NULL;
|
||||||
|
listPolys = NULL;
|
||||||
|
tree = NULL;
|
||||||
////@end wxdlg3dViewer member initialisation
|
////@end wxdlg3dViewer member initialisation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,8 +129,6 @@ void wxdlg3dViewer::Init()
|
||||||
void wxdlg3dViewer::CreateControls()
|
void wxdlg3dViewer::CreateControls()
|
||||||
{
|
{
|
||||||
////@begin wxdlg3dViewer content construction
|
////@begin wxdlg3dViewer content construction
|
||||||
// Generated by DialogBlocks, 14/12/2009 20:51:53 (unregistered)
|
|
||||||
|
|
||||||
wxdlg3dViewer* itemDialog1 = this;
|
wxdlg3dViewer* itemDialog1 = this;
|
||||||
|
|
||||||
wxFlexGridSizer* itemFlexGridSizer2 = new wxFlexGridSizer(1, 0, 0, 0);
|
wxFlexGridSizer* itemFlexGridSizer2 = new wxFlexGridSizer(1, 0, 0, 0);
|
||||||
|
@ -135,51 +139,75 @@ void wxdlg3dViewer::CreateControls()
|
||||||
itemFlexGridSizer2->AddGrowableCol(4);
|
itemFlexGridSizer2->AddGrowableCol(4);
|
||||||
itemDialog1->SetSizer(itemFlexGridSizer2);
|
itemDialog1->SetSizer(itemFlexGridSizer2);
|
||||||
|
|
||||||
wxStaticBox* itemStaticBoxSizer3Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Display optionsss"));
|
wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
|
||||||
wxStaticBoxSizer* itemStaticBoxSizer3 = new wxStaticBoxSizer(itemStaticBoxSizer3Static, wxVERTICAL);
|
itemFlexGridSizer2->Add(itemBoxSizer3, 0, wxGROW|wxALIGN_TOP|wxALL, 5);
|
||||||
itemFlexGridSizer2->Add(itemStaticBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
|
||||||
|
wxStaticBox* itemStaticBoxSizer4Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Display optionsss"));
|
||||||
|
wxStaticBoxSizer* itemStaticBoxSizer4 = new wxStaticBoxSizer(itemStaticBoxSizer4Static, wxVERTICAL);
|
||||||
|
itemBoxSizer3->Add(itemStaticBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
checkMaterialInterpolate = new wxCheckBox( itemDialog1, ID_MATERIALINTERPOLATE, _("Material clip interpolation"), wxDefaultPosition, wxDefaultSize, 0 );
|
checkMaterialInterpolate = new wxCheckBox( itemDialog1, ID_MATERIALINTERPOLATE, _("Material clip interpolation"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
checkMaterialInterpolate->SetValue(false);
|
checkMaterialInterpolate->SetValue(false);
|
||||||
itemStaticBoxSizer3->Add(checkMaterialInterpolate, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
itemStaticBoxSizer4->Add(checkMaterialInterpolate, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
wxCheckBox* itemCheckBox5 = new wxCheckBox( itemDialog1, ID_CHECKBOX1, _("Something else"), wxDefaultPosition, wxDefaultSize, 0 );
|
wxCheckBox* itemCheckBox6 = new wxCheckBox( itemDialog1, ID_CHECKBOX1, _("Something else"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
itemCheckBox5->SetValue(false);
|
itemCheckBox6->SetValue(false);
|
||||||
itemStaticBoxSizer3->Add(itemCheckBox5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
itemStaticBoxSizer4->Add(itemCheckBox6, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
panelViewport = new wxPanel( itemDialog1, ID_PANEL, wxDefaultPosition, wxSize(512, 384), wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
|
itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
|
wxFlexGridSizer* itemFlexGridSizer8 = new wxFlexGridSizer(0, 2, 0, 0);
|
||||||
|
itemBoxSizer3->Add(itemFlexGridSizer8, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
|
panelViewport = new wxWindow( itemDialog1, ID_VIEWPORT, wxDefaultPosition, wxSize(256, 192), wxSIMPLE_BORDER );
|
||||||
itemFlexGridSizer2->Add(panelViewport, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
itemFlexGridSizer2->Add(panelViewport, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
||||||
|
|
||||||
wxStaticBox* itemStaticBoxSizer7Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Choose One"));
|
wxFlexGridSizer* itemFlexGridSizer10 = new wxFlexGridSizer(3, 1, 0, 0);
|
||||||
wxStaticBoxSizer* itemStaticBoxSizer7 = new wxStaticBoxSizer(itemStaticBoxSizer7Static, wxVERTICAL);
|
itemFlexGridSizer10->AddGrowableRow(1);
|
||||||
itemFlexGridSizer2->Add(itemStaticBoxSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_TOP|wxALL, 5);
|
itemFlexGridSizer2->Add(itemFlexGridSizer10, 1, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
||||||
|
|
||||||
wxRadioButton* itemRadioButton8 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON, _("Final Polylist"), wxDefaultPosition, wxDefaultSize, 0 );
|
wxStaticBox* itemStaticBoxSizer11Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Choose One"));
|
||||||
itemRadioButton8->SetValue(true);
|
wxStaticBoxSizer* itemStaticBoxSizer11 = new wxStaticBoxSizer(itemStaticBoxSizer11Static, wxVERTICAL);
|
||||||
itemStaticBoxSizer7->Add(itemRadioButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
itemFlexGridSizer10->Add(itemStaticBoxSizer11, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM|wxALL, 5);
|
||||||
|
|
||||||
wxRadioButton* itemRadioButton9 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON1, _("User Polylist"), wxDefaultPosition, wxDefaultSize, 0 );
|
wxRadioButton* itemRadioButton12 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON, _("Final Polylist"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
itemRadioButton9->SetValue(false);
|
itemRadioButton12->SetValue(true);
|
||||||
itemRadioButton9->Enable(false);
|
itemStaticBoxSizer11->Add(itemRadioButton12, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
itemStaticBoxSizer7->Add(itemRadioButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
|
||||||
|
|
||||||
wxRadioButton* itemRadioButton10 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON2, _("Display List"), wxDefaultPosition, wxDefaultSize, 0 );
|
wxRadioButton* itemRadioButton13 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON1, _("User Polylist"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
itemRadioButton10->SetValue(false);
|
itemRadioButton13->SetValue(false);
|
||||||
itemRadioButton10->Enable(false);
|
itemRadioButton13->Enable(false);
|
||||||
itemStaticBoxSizer7->Add(itemRadioButton10, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
itemStaticBoxSizer11->Add(itemRadioButton13, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
wxStaticLine* itemStaticLine11 = new wxStaticLine( itemDialog1, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
wxRadioButton* itemRadioButton14 = new wxRadioButton( itemDialog1, ID_RADIOBUTTON2, _("Display List"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
itemFlexGridSizer2->Add(itemStaticLine11, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
itemRadioButton14->SetValue(false);
|
||||||
|
itemRadioButton14->Enable(false);
|
||||||
|
itemStaticBoxSizer11->Add(itemRadioButton14, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
|
||||||
|
|
||||||
wxListCtrl* itemListCtrl12 = new wxListCtrl( itemDialog1, ID_LISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT );
|
itemFlexGridSizer10->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
||||||
itemFlexGridSizer2->Add(itemListCtrl12, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
|
||||||
|
|
||||||
wxTreeCtrl* itemTreeCtrl13 = new wxTreeCtrl( itemDialog1, ID_TREECTRL, wxDefaultPosition, wxSize(99, 99), wxTR_SINGLE );
|
wxStaticBox* itemStaticBoxSizer16Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Statistics"));
|
||||||
itemFlexGridSizer2->Add(itemTreeCtrl13, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
wxStaticBoxSizer* itemStaticBoxSizer16 = new wxStaticBoxSizer(itemStaticBoxSizer16Static, wxVERTICAL);
|
||||||
|
itemFlexGridSizer10->Add(itemStaticBoxSizer16, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5);
|
||||||
|
|
||||||
|
labelUserPolycount = new wxStaticText( itemDialog1, wxID_STATIC, _("User Polys"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
itemStaticBoxSizer16->Add(labelUserPolycount, 0, wxALIGN_LEFT|wxALL, 1);
|
||||||
|
|
||||||
|
labelFinalPolycount = new wxStaticText( itemDialog1, wxID_STATIC, _("Final Polys: "), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
itemStaticBoxSizer16->Add(labelFinalPolycount, 0, wxALIGN_LEFT|wxALL, 1);
|
||||||
|
|
||||||
|
wxStaticLine* itemStaticLine19 = new wxStaticLine( itemDialog1, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||||
|
itemFlexGridSizer2->Add(itemStaticLine19, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
||||||
|
|
||||||
|
listPolys = new wxDesmumeListCtrl( itemDialog1, ID_DESMUMELISTCTRL1, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_VIRTUAL );
|
||||||
|
itemFlexGridSizer2->Add(listPolys, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
||||||
|
|
||||||
|
tree = new wxTreeCtrl( itemDialog1, ID_TREECTRL, wxDefaultPosition, wxSize(99, 99), wxTR_HAS_BUTTONS |wxTR_HIDE_ROOT|wxTR_ROW_LINES|wxTR_SINGLE );
|
||||||
|
itemFlexGridSizer2->Add(tree, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW|wxALL, 5);
|
||||||
|
|
||||||
// Connect events and objects
|
// Connect events and objects
|
||||||
panelViewport->Connect(ID_PANEL, wxEVT_PAINT, wxPaintEventHandler(wxdlg3dViewer::OnPanelPaint), NULL, this);
|
panelViewport->Connect(ID_VIEWPORT, wxEVT_PAINT, wxPaintEventHandler(wxdlg3dViewer::OnPanelPaint), NULL, this);
|
||||||
panelViewport->Connect(ID_PANEL, wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(wxdlg3dViewer::OnPanelEraseBackground), NULL, this);
|
panelViewport->Connect(ID_VIEWPORT, wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(wxdlg3dViewer::OnPanelEraseBackground), NULL, this);
|
||||||
////@end wxdlg3dViewer content construction
|
////@end wxdlg3dViewer content construction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,3 +290,87 @@ void wxdlg3dViewer::OnPanelEraseBackground( wxEraseEvent& event )
|
||||||
//blank to block background clearing
|
//blank to block background clearing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxDesmumeListCtrl type definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS( wxDesmumeListCtrl, wxListCtrl )
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxDesmumeListCtrl event table definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE( wxDesmumeListCtrl, wxListCtrl )
|
||||||
|
|
||||||
|
////@begin wxDesmumeListCtrl event table entries
|
||||||
|
////@end wxDesmumeListCtrl event table entries
|
||||||
|
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxDesmumeListCtrl constructors
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxDesmumeListCtrl::wxDesmumeListCtrl()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxDesmumeListCtrl::wxDesmumeListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
Create(parent, id, pos, size, style, validator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxDesmumeListCtrl creator
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool wxDesmumeListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator)
|
||||||
|
{
|
||||||
|
////@begin wxDesmumeListCtrl creation
|
||||||
|
wxListCtrl::Create(parent, id, pos, size, style, validator);
|
||||||
|
CreateControls();
|
||||||
|
////@end wxDesmumeListCtrl creation
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wxDesmumeListCtrl destructor
|
||||||
|
*/
|
||||||
|
|
||||||
|
wxDesmumeListCtrl::~wxDesmumeListCtrl()
|
||||||
|
{
|
||||||
|
////@begin wxDesmumeListCtrl destruction
|
||||||
|
////@end wxDesmumeListCtrl destruction
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Member initialisation
|
||||||
|
*/
|
||||||
|
|
||||||
|
void wxDesmumeListCtrl::Init()
|
||||||
|
{
|
||||||
|
////@begin wxDesmumeListCtrl member initialisation
|
||||||
|
////@end wxDesmumeListCtrl member initialisation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Control creation for wxDesmumeListCtrl
|
||||||
|
*/
|
||||||
|
|
||||||
|
void wxDesmumeListCtrl::CreateControls()
|
||||||
|
{
|
||||||
|
////@begin wxDesmumeListCtrl content construction
|
||||||
|
////@end wxDesmumeListCtrl content construction
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,11 +25,21 @@
|
||||||
#include "wx/treectrl.h"
|
#include "wx/treectrl.h"
|
||||||
////@end includes
|
////@end includes
|
||||||
|
|
||||||
|
class IListCtrlCallbacks
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Forward declarations
|
* Forward declarations
|
||||||
*/
|
*/
|
||||||
|
|
||||||
////@begin forward declarations
|
////@begin forward declarations
|
||||||
|
class wxWindow;
|
||||||
|
class wxDesmumeListCtrl;
|
||||||
|
class wxTreeCtrl;
|
||||||
////@end forward declarations
|
////@end forward declarations
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -40,17 +50,21 @@
|
||||||
#define ID_X 10000
|
#define ID_X 10000
|
||||||
#define ID_MATERIALINTERPOLATE 10004
|
#define ID_MATERIALINTERPOLATE 10004
|
||||||
#define ID_CHECKBOX1 10008
|
#define ID_CHECKBOX1 10008
|
||||||
#define ID_PANEL 10001
|
#define ID_VIEWPORT 10002
|
||||||
#define ID_RADIOBUTTON 10005
|
#define ID_RADIOBUTTON 10005
|
||||||
#define ID_RADIOBUTTON1 10006
|
#define ID_RADIOBUTTON1 10006
|
||||||
#define ID_RADIOBUTTON2 10007
|
#define ID_RADIOBUTTON2 10007
|
||||||
#define ID_LISTCTRL 10002
|
#define ID_DESMUMELISTCTRL1 10009
|
||||||
#define ID_TREECTRL 10003
|
#define ID_TREECTRL 10003
|
||||||
#define SYMBOL_WXDLG3DVIEWER_STYLE wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxDIALOG_NO_PARENT|wxCLOSE_BOX|wxTAB_TRAVERSAL
|
#define SYMBOL_WXDLG3DVIEWER_STYLE wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxDIALOG_NO_PARENT|wxCLOSE_BOX|wxTAB_TRAVERSAL
|
||||||
#define SYMBOL_WXDLG3DVIEWER_TITLE _("3D Viewer")
|
#define SYMBOL_WXDLG3DVIEWER_TITLE _("3D Viewer")
|
||||||
#define SYMBOL_WXDLG3DVIEWER_IDNAME ID_X
|
#define SYMBOL_WXDLG3DVIEWER_IDNAME ID_X
|
||||||
#define SYMBOL_WXDLG3DVIEWER_SIZE wxSize(399, 299)
|
#define SYMBOL_WXDLG3DVIEWER_SIZE wxSize(399, 300)
|
||||||
#define SYMBOL_WXDLG3DVIEWER_POSITION wxDefaultPosition
|
#define SYMBOL_WXDLG3DVIEWER_POSITION wxDefaultPosition
|
||||||
|
#define SYMBOL_WXDESMUMELISTCTRL_STYLE wxLC_REPORT|wxLC_VIRTUAL
|
||||||
|
#define SYMBOL_WXDESMUMELISTCTRL_IDNAME ID_DESMUMELISTCTRL1
|
||||||
|
#define SYMBOL_WXDESMUMELISTCTRL_SIZE wxDefaultSize
|
||||||
|
#define SYMBOL_WXDESMUMELISTCTRL_POSITION wxDefaultPosition
|
||||||
////@end control identifiers
|
////@end control identifiers
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,7 +72,7 @@
|
||||||
* wxdlg3dViewer class declaration
|
* wxdlg3dViewer class declaration
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class wxdlg3dViewer: public wxDialog
|
class wxdlg3dViewer: public wxDialog, public IListCtrlCallbacks
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS( wxdlg3dViewer )
|
DECLARE_DYNAMIC_CLASS( wxdlg3dViewer )
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
|
@ -80,6 +94,9 @@ public:
|
||||||
/// Creates the controls and sizers
|
/// Creates the controls and sizers
|
||||||
void CreateControls();
|
void CreateControls();
|
||||||
|
|
||||||
|
virtual wxString OnGetItemText(const wxListCtrl* list, long item, long column) const {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
virtual void RepaintPanel() {}
|
virtual void RepaintPanel() {}
|
||||||
virtual void _OnPaintPanel( wxPaintEvent& event ) {};
|
virtual void _OnPaintPanel( wxPaintEvent& event ) {};
|
||||||
|
|
||||||
|
@ -91,10 +108,10 @@ public:
|
||||||
/// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_MATERIALINTERPOLATE
|
/// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_MATERIALINTERPOLATE
|
||||||
void OnMaterialInterpolateClick( wxCommandEvent& event );
|
void OnMaterialInterpolateClick( wxCommandEvent& event );
|
||||||
|
|
||||||
/// wxEVT_PAINT event handler for ID_PANEL
|
/// wxEVT_PAINT event handler for ID_VIEWPORT
|
||||||
void OnPanelPaint( wxPaintEvent& event );
|
void OnPanelPaint( wxPaintEvent& event );
|
||||||
|
|
||||||
/// wxEVT_ERASE_BACKGROUND event handler for ID_PANEL
|
/// wxEVT_ERASE_BACKGROUND event handler for ID_VIEWPORT
|
||||||
void OnPanelEraseBackground( wxEraseEvent& event );
|
void OnPanelEraseBackground( wxEraseEvent& event );
|
||||||
|
|
||||||
////@end wxdlg3dViewer event handler declarations
|
////@end wxdlg3dViewer event handler declarations
|
||||||
|
@ -113,9 +130,57 @@ public:
|
||||||
|
|
||||||
////@begin wxdlg3dViewer member variables
|
////@begin wxdlg3dViewer member variables
|
||||||
wxCheckBox* checkMaterialInterpolate;
|
wxCheckBox* checkMaterialInterpolate;
|
||||||
wxPanel* panelViewport;
|
wxWindow* panelViewport;
|
||||||
|
wxStaticText* labelUserPolycount;
|
||||||
|
wxStaticText* labelFinalPolycount;
|
||||||
|
wxDesmumeListCtrl* listPolys;
|
||||||
|
wxTreeCtrl* tree;
|
||||||
////@end wxdlg3dViewer member variables
|
////@end wxdlg3dViewer member variables
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* wxDesmumeListCtrl class declaration
|
||||||
|
*/
|
||||||
|
|
||||||
|
class wxDesmumeListCtrl: public wxListCtrl
|
||||||
|
{
|
||||||
|
DECLARE_DYNAMIC_CLASS( wxDesmumeListCtrl )
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
|
||||||
|
public:
|
||||||
|
IListCtrlCallbacks* callbacks;
|
||||||
|
|
||||||
|
virtual wxString OnGetItemText(long item, long column) const {
|
||||||
|
return callbacks->OnGetItemText(this,item,column);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Constructors
|
||||||
|
wxDesmumeListCtrl();
|
||||||
|
wxDesmumeListCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator);
|
||||||
|
|
||||||
|
/// Creation
|
||||||
|
bool Create(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~wxDesmumeListCtrl();
|
||||||
|
|
||||||
|
/// Initialises member variables
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
/// Creates the controls and sizers
|
||||||
|
void CreateControls();
|
||||||
|
|
||||||
|
////@begin wxDesmumeListCtrl event handler declarations
|
||||||
|
|
||||||
|
////@end wxDesmumeListCtrl event handler declarations
|
||||||
|
|
||||||
|
////@begin wxDesmumeListCtrl member function declarations
|
||||||
|
|
||||||
|
////@end wxDesmumeListCtrl member function declarations
|
||||||
|
|
||||||
|
////@begin wxDesmumeListCtrl member variables
|
||||||
|
////@end wxDesmumeListCtrl member variables
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// _X_H_
|
// _X_H_
|
||||||
|
|
Loading…
Reference in New Issue