diff --git a/pcsx2/CDVD/IsoFileFormats.cpp b/pcsx2/CDVD/IsoFileFormats.cpp
index 3281881d1e..305a1bc642 100644
--- a/pcsx2/CDVD/IsoFileFormats.cpp
+++ b/pcsx2/CDVD/IsoFileFormats.cpp
@@ -71,7 +71,9 @@ bool tryIsoType(isoFile *iso, u32 size, u32 offset, u32 blockofs)
return false;
}
-int isoDetect(isoFile *iso) // based on florin's CDVDbin detection code :)
+// based on florin's CDVDbin detection code :)
+// Returns 0 if the image is valid/known/supported, or -1 if not (iso->type == ISOTYPE_ILLEGAL).
+int isoDetect(isoFile *iso)
{
char buf[32];
int len;
@@ -106,11 +108,11 @@ int isoDetect(isoFile *iso) // based on florin's CDVDbin detection code :)
iso->blocks = 16;
}
- if (tryIsoType(iso, 2048, 0, 24)) return 0; // ISO 2048
- if (tryIsoType(iso, 2336, 0, 16)) return 0; // RAW 2336
+ if (tryIsoType(iso, 2048, 0, 24)) return 0; // ISO 2048
+ if (tryIsoType(iso, 2336, 0, 16)) return 0; // RAW 2336
if (tryIsoType(iso, 2352, 0, 0)) return 0; // RAW 2352
if (tryIsoType(iso, 2448, 0, 0)) return 0; // RAWQ 2448
- if (tryIsoType(iso, 2048, 150 * 2048, 24)) return 0; // NERO ISO 2048
+ if (tryIsoType(iso, 2048, 150 * 2048, 24)) return 0; // NERO ISO 2048
if (tryIsoType(iso, 2352, 150 * 2048, 0)) return 0; // NERO RAW 2352
if (tryIsoType(iso, 2448, 150 * 2048, 0)) return 0; // NERO RAWQ 2448
if (tryIsoType(iso, 2048, -8, 24)) return 0; // ISO 2048
@@ -131,7 +133,7 @@ isoFile *isoOpen(const char *filename)
iso = (isoFile*)malloc(sizeof(isoFile));
if (iso == NULL) return NULL;
- memset(iso, 0, sizeof(isoFile));
+ memzero( *iso );
strcpy(iso->filename, filename);
iso->handle = _openfile( iso->filename, O_RDONLY);
diff --git a/pcsx2/Linux/pcsx2.cbp b/pcsx2/Linux/pcsx2.cbp
index 9b92dcc26c..034aae8564 100644
--- a/pcsx2/Linux/pcsx2.cbp
+++ b/pcsx2/Linux/pcsx2.cbp
@@ -292,6 +292,8 @@
+
+
@@ -309,6 +311,7 @@
+
diff --git a/pcsx2/gui/App.h b/pcsx2/gui/App.h
index 06cfc0bb53..35e8356005 100644
--- a/pcsx2/gui/App.h
+++ b/pcsx2/gui/App.h
@@ -23,7 +23,6 @@
#include "Utilities/EventSource.h"
#include "IniInterface.h"
-//class IniInterface;
class MainEmuFrame;
class GSFrame;
class ConsoleLogFrame;
@@ -34,6 +33,8 @@ class AppCoreThread;
#include "Utilities/wxGuiTools.h"
#include "AppConfig.h"
+#include "RecentIsoList.h"
+
#include "System.h"
#include "System/SysThreads.h"
@@ -261,55 +262,6 @@ public:
void Map( const KeyAcceleratorCode& acode, const char *searchfor );
};
-
-// --------------------------------------------------------------------------------------
-// RecentIsoList
-// --------------------------------------------------------------------------------------
-class RecentIsoList : public wxEvtHandler
-{
-protected:
- struct RecentItem
- {
- wxString Filename;
- wxMenuItem* ItemPtr;
-
- RecentItem() { ItemPtr = NULL; }
-
- RecentItem( const wxString& src ) :
- Filename( src )
- , ItemPtr( NULL )
- {
- }
- };
-
- std::vector m_Items;
-
- wxMenu* m_Menu;
- uint m_MaxLength;
- int m_cursel;
-
- wxMenuItem* m_Separator;
-
- EventListenerBinding m_Listener_SettingsLoadSave;
-
-public:
- RecentIsoList( wxMenu* menu );
- virtual ~RecentIsoList() throw();
-
- void RemoveAllFromMenu();
- void Repopulate();
- void Add( const wxString& src );
-
-protected:
- void InsertIntoMenu( int id );
- void DoSettingsLoadSave( IniInterface& ini );
-
- void OnChangedSelection( wxCommandEvent& evt );
-
- static void __evt_fastcall OnSettingsLoadSave( void* obj, IniInterface& evt );
-};
-
-
// --------------------------------------------------------------------------------------
// AppImageIds - Config and Toolbar Images and Icons
// --------------------------------------------------------------------------------------
@@ -614,11 +566,12 @@ extern void AppSaveSettings();
extern void AppApplySettings( const AppConfig* oldconf=NULL, bool saveOnSuccess=false );
extern bool SysHasValidState();
-
+extern void SysUpdateIsoSrcFile( const wxString& newIsoFile );
extern void SysStatus( const wxString& text );
extern bool HasMainFrame();
extern MainEmuFrame& GetMainFrame();
extern MainEmuFrame* GetMainFramePtr();
-extern AppCoreThread CoreThread;
\ No newline at end of file
+extern AppCoreThread CoreThread;
+
diff --git a/pcsx2/gui/AppCoreThread.cpp b/pcsx2/gui/AppCoreThread.cpp
index 8fd5bd3052..74029837b9 100644
--- a/pcsx2/gui/AppCoreThread.cpp
+++ b/pcsx2/gui/AppCoreThread.cpp
@@ -104,6 +104,14 @@ void AppCoreThread::OnResumeReady()
{
ApplySettings( g_Conf->EmuOptions );
+ if( !wxFile::Exists( g_Conf->CurrentIso ) )
+ g_Conf->CurrentIso.Clear();
+
+ sApp.GetRecentIsoList().Add( g_Conf->CurrentIso );
+ CDVDsys_SetFile( CDVDsrc_Iso, g_Conf->CurrentIso );
+
+ AppSaveSettings();
+
if( GSopen2 != NULL )
wxGetApp().OpenGsFrame();
diff --git a/pcsx2/gui/AppInit.cpp b/pcsx2/gui/AppInit.cpp
index e9b0a8e16e..baa971ae47 100644
--- a/pcsx2/gui/AppInit.cpp
+++ b/pcsx2/gui/AppInit.cpp
@@ -274,6 +274,7 @@ bool Pcsx2App::OnInit()
AppConfig_OnChangedSettingsFolder();
m_MainFrame = new MainEmuFrame( NULL, L"PCSX2" );
+ m_MainFrame->PushEventHandler( m_RecentIsoList );
if( m_ProgramLogBox )
{
diff --git a/pcsx2/gui/AppMain.cpp b/pcsx2/gui/AppMain.cpp
index 6f845e7dc9..d3b0658d55 100644
--- a/pcsx2/gui/AppMain.cpp
+++ b/pcsx2/gui/AppMain.cpp
@@ -346,6 +346,11 @@ int Pcsx2App::OnExit()
if( g_Conf )
AppSaveSettings();
+
+ sMainFrame.PopEventHandler( m_RecentIsoList );
+
+ m_RecentIsoList = NULL;
+ m_RecentIsoMenu = NULL;
return wxApp::OnExit();
}
@@ -488,6 +493,8 @@ static void _sendmsg_SysExecute()
return;
}
+ AppSaveSettings();
+
wxCommandEvent execevt( pxEVT_SysExecute );
execevt.SetInt( _sysexec_cdvdsrc_type );
wxGetApp().AddPendingEvent( execevt );
@@ -587,6 +594,13 @@ void SysStatus( const wxString& text )
sMainFrame.SetStatusText( text );
}
+// Applies a new active iso source file
+void SysUpdateIsoSrcFile( const wxString& newIsoFile )
+{
+ g_Conf->CurrentIso = newIsoFile;
+ sMainFrame.UpdateIsoSrcSelection();
+}
+
bool HasMainFrame()
{
return wxTheApp && wxGetApp().HasMainFrame();
diff --git a/pcsx2/gui/Dialogs/ConfirmationDialogs.cpp b/pcsx2/gui/Dialogs/ConfirmationDialogs.cpp
index fcf4f47a8c..0adbdfe300 100644
--- a/pcsx2/gui/Dialogs/ConfirmationDialogs.cpp
+++ b/pcsx2/gui/Dialogs/ConfirmationDialogs.cpp
@@ -171,6 +171,12 @@ Dialogs::ExtensibleConfirmation::ExtensibleConfirmation( wxWindow* parent, const
// dialogs because we offer more button types, and we don't want the MSW default behavior
// of right-justified buttons.
+ if( type.HasCustom() )
+ AddCustomButton( pxID_CUSTOM, type.GetCustomLabel() );
+
+ // Order of wxID_RESET and custom button have been picked fairly arbitrarily, since there's
+ // no standard governing those.
+
#ifdef __WXGTK__
// GTK+ / Linux inverts OK/CANCEL order -- cancel / no first, OK / Yes later. >_<
if( type.HasCancel() )
@@ -195,6 +201,9 @@ Dialogs::ExtensibleConfirmation::ExtensibleConfirmation( wxWindow* parent, const
AddActionButton( wxID_YESTOALL );
}
+ if( type.HasReset() )
+ AddCustomButton( wxID_RESET, _("Reset") );
+
#ifndef __WXGTK__
if( type.HasNo() || type.HasCancel() ) // Extra space between Affirm and Cancel Actions
m_ButtonSizer.Add(0, 0, 1, wxEXPAND, 0);
@@ -216,8 +225,20 @@ Dialogs::ExtensibleConfirmation::ExtensibleConfirmation( wxWindow* parent, const
CenterOnScreen();
}
+void Dialogs::ExtensibleConfirmation::OnActionButtonClicked( wxCommandEvent& evt )
+{
+ EndModal( evt.GetId() );
+}
+
+void Dialogs::ExtensibleConfirmation::AddCustomButton( wxWindowID id, const wxString& label )
+{
+ m_ButtonSizer.Add( new wxButton( this, id, label ), SizerFlags::StdButton() )->SetProportion( 6 );
+ Connect( id, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ExtensibleConfirmation::OnActionButtonClicked ) );
+}
+
void Dialogs::ExtensibleConfirmation::AddActionButton( wxWindowID id )
{
m_ButtonSizer.Add( new wxButton( this, id ), SizerFlags::StdButton() )->SetProportion( 6 );
+ Connect( id, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ExtensibleConfirmation::OnActionButtonClicked ) );
}
diff --git a/pcsx2/gui/Dialogs/ModalPopups.h b/pcsx2/gui/Dialogs/ModalPopups.h
index 76a6a7703c..a56df53596 100644
--- a/pcsx2/gui/Dialogs/ModalPopups.h
+++ b/pcsx2/gui/Dialogs/ModalPopups.h
@@ -21,6 +21,8 @@
#include
#include
+static const wxWindowID pxID_CUSTOM = wxID_LOWEST - 1;
+
class FirstTimeWizard : public wxWizard
{
protected:
@@ -77,12 +79,15 @@ protected:
m_Apply:1,
m_Abort:1,
m_Retry:1,
- m_Ignore:1;
+ m_Ignore:1,
+ m_Reset:1;
BITFIELD_END
+ wxString m_CustomLabel;
+
public:
ConfButtons() : bitset( 0 ) { }
-
+
ConfButtons& OK() { m_OK = true; return *this; }
ConfButtons& Cancel() { m_Cancel = true; return *this; }
ConfButtons& Apply() { m_Apply = true; return *this; }
@@ -93,9 +98,17 @@ public:
ConfButtons& Abort() { m_Abort = true; return *this; }
ConfButtons& Retry() { m_Retry = true; return *this; }
ConfButtons& Ignore() { m_Ignore = true; return *this; }
+ ConfButtons& Reset() { m_Reset = true; return *this; }
+
+ ConfButtons& Custom( const wxString& label)
+ {
+ m_CustomLabel = label;
+ return *this;
+ }
ConfButtons& OKCancel() { m_OK = m_Cancel = true; return *this; }
-
+ ConfButtons& YesNo() { m_Yes = m_No = true; return *this; }
+
bool HasOK() const { return m_OK; }
bool HasCancel() const { return m_Cancel; }
bool HasApply() const { return m_Apply; }
@@ -106,6 +119,10 @@ public:
bool HasAbort() const { return m_Abort; }
bool HasRetry() const { return m_Retry; }
bool HasIgnore() const { return m_Ignore; }
+ bool HasReset() const { return m_Reset; }
+
+ bool HasCustom() const { return !m_CustomLabel.IsEmpty(); }
+ const wxString& GetCustomLabel() const { return m_CustomLabel; }
bool Allows( wxWindowID id ) const;
@@ -180,14 +197,17 @@ namespace Dialogs
protected:
wxBoxSizer& m_ExtensibleSizer;
wxBoxSizer& m_ButtonSizer;
+
public:
ExtensibleConfirmation( wxWindow* parent, const ConfButtons& type, const wxString& title, const wxString& msg );
virtual ~ExtensibleConfirmation() throw() {}
- wxBoxSizer& GetExtensibleSizer() const { return m_ExtensibleSizer; }
+ virtual wxBoxSizer& GetExtensibleSizer() const { return m_ExtensibleSizer; }
protected:
- void AddActionButton( wxWindowID id );
+ virtual void AddActionButton( wxWindowID id );
+ virtual void AddCustomButton( wxWindowID id, const wxString& label );
+ virtual void OnActionButtonClicked( wxCommandEvent& evt );
};
wxWindowID IssueConfirmation( wxWindow* parent, const wxString& disablerKey, const ConfButtons& type, const wxString& title, const wxString& msg );
diff --git a/pcsx2/gui/IsoDropTarget.cpp b/pcsx2/gui/IsoDropTarget.cpp
new file mode 100644
index 0000000000..9c0a0399b2
--- /dev/null
+++ b/pcsx2/gui/IsoDropTarget.cpp
@@ -0,0 +1,136 @@
+/* PCSX2 - PS2 Emulator for PCs
+ * Copyright (C) 2002-2009 PCSX2 Dev Team
+ *
+ * PCSX2 is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with PCSX2.
+ * If not, see .
+ */
+
+#include "PrecompiledHeader.h"
+#include "App.h"
+#include "IsoDropTarget.h"
+
+#include "Dialogs/ModalPopups.h"
+
+#include "CDVD/IsoFileFormats.h"
+
+#include
+
+
+wxString GetMsg_ConfirmSysReset()
+{
+ return pxE( ".Popup:ConfirmSysReset",
+ L"This action will reset the existing PS2 virtual machine state; "
+ L"all current progress will be lost. Are you sure?"
+ );
+}
+
+bool IsoDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
+{
+ bool resume = CoreThread.Suspend();
+
+ if( filenames.GetCount() > 1 )
+ {
+ Dialogs::ExtensibleConfirmation( m_WindowBound, ConfButtons().Cancel(),
+ _("Drag and Drop Error"),
+ _("It is an error to drop multiple files onto a PCSX2 window. One at a time please, thank you.")
+ );
+ return false;
+ }
+
+ Console.WriteLn( L"(Drag&Drop) Received filename: " + filenames[0] );
+
+ // ---------------
+ // ELF CHECK
+ // ---------------
+ {
+ wxFileInputStream filechk( filenames[0] );
+
+ if( !filechk.IsOk() )
+ throw Exception::CreateStream( filenames[0] );
+
+ u8 ident[16];
+ filechk.Read( ident, 16 );
+ static const u8 elfIdent[4] = { 0x7f, 'E', 'L', 'F' };
+
+ if( ((u32&)ident) == ((u32&)elfIdent) )
+ {
+ Console.WriteLn( L"(Drag&Drop) Found ELF file type!" );
+
+ g_Conf->CurrentELF = filenames[0];
+
+ bool confirmed = true;
+ if( SysHasValidState() )
+ {
+ confirmed = Dialogs::IssueConfirmation( m_WindowBound, L"DragDrop:BootELF", ConfButtons().Reset().Cancel(),
+ _("Confirm PS2 Reset"),
+ _("You have dropped the following ELF binary into PCSX2:\n\n") +
+ filenames[0] + L"\n\n" + GetMsg_ConfirmSysReset()
+ ) != wxID_CANCEL;
+ }
+
+ if( confirmed )
+ {
+ sApp.SysExecute( g_Conf->CdvdSource, g_Conf->CurrentELF );
+ }
+
+ if( resume ) CoreThread.Resume();
+ return true;
+ }
+ }
+
+ // ---------------
+ // ISO CHECK
+ // ---------------
+
+ // FIXME : The whole IsoFileFormats api (meaning isoOpen / isoDetect / etc) needs to be
+ // converted to C++ and wxInputStream . Until then this is a nasty little exception unsafe
+ // hack ;)
+
+ isoFile iso;
+ memzero( iso );
+ iso.handle = _openfile( filenames[0].ToUTF8(), O_RDONLY);
+
+ if( iso.handle == NULL )
+ throw Exception::CreateStream( filenames[0] );
+
+ if( isoDetect( &iso ) == 0 )
+ {
+ Console.WriteLn( L"(Drag&Drop) Found valid ISO file type!" );
+
+ bool confirmed = true;
+ wxWindowID result = wxID_RESET;
+
+ if( SysHasValidState() )
+ {
+ result = Dialogs::IssueConfirmation( m_WindowBound, L"DragDrop:BootIso", ConfButtons().Reset().Cancel().Custom(_("Swap Disc")),
+ _("Confirm PS2 Reset"),
+ _("You have dropped the following ISO image into PCSX2:\n\n") +
+ filenames[0] + L"\n\n" +
+ _("Do you want to swap discs or boot the new image (via system reset)?")
+ );
+ }
+
+ if( result != wxID_CANCEL )
+ {
+ SysUpdateIsoSrcFile( filenames[0] );
+ if( result != wxID_RESET )
+ CDVDsys_ChangeSource( CDVDsrc_Iso );
+ else
+ {
+ sApp.SysExecute( CDVDsrc_Iso );
+ }
+ }
+ }
+
+ _closefile( iso.handle );
+ if( resume ) CoreThread.Resume();
+ return true;
+}
diff --git a/pcsx2/gui/IsoDropTarget.h b/pcsx2/gui/IsoDropTarget.h
new file mode 100644
index 0000000000..2b5e353917
--- /dev/null
+++ b/pcsx2/gui/IsoDropTarget.h
@@ -0,0 +1,35 @@
+/* PCSX2 - PS2 Emulator for PCs
+ * Copyright (C) 2002-2009 PCSX2 Dev Team
+ *
+ * PCSX2 is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with PCSX2.
+ * If not, see .
+ */
+
+#pragma once
+
+#include
+
+// --------------------------------------------------------------------------------------
+// IsoDropTarget
+// --------------------------------------------------------------------------------------
+class IsoDropTarget : public wxFileDropTarget
+{
+protected:
+ wxWindow* m_WindowBound;
+
+public:
+ IsoDropTarget( wxWindow* parent ) : wxFileDropTarget()
+ {
+ m_WindowBound = parent;
+ }
+
+ virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames);
+};
diff --git a/pcsx2/gui/MainFrame.cpp b/pcsx2/gui/MainFrame.cpp
index 8ae8e14915..9455ac3a4f 100644
--- a/pcsx2/gui/MainFrame.cpp
+++ b/pcsx2/gui/MainFrame.cpp
@@ -17,6 +17,9 @@
#include "MainFrame.h"
#include "ConsoleLogger.h"
+#include "Dialogs/ModalPopups.h"
+#include "IsoDropTarget.h"
+
#include "Resources/EmbeddedImage.h"
#include "Resources/AppIcon16.h"
#include "Resources/AppIcon32.h"
@@ -56,14 +59,6 @@ void MainEmuFrame::UpdateIsoSrcSelection()
}
sMenuBar.Check( cdsrc, true );
m_statusbar.SetStatusText( CDVD_SourceLabels[g_Conf->CdvdSource], 1 );
-}
-
-void MainEmuFrame::UpdateIsoSrcFile()
-{
- UpdateIsoSrcSelection();
- const bool exists = wxFile::Exists( g_Conf->CurrentIso );
- if( !exists )
- g_Conf->CurrentIso.Clear();
//sMenuBar.SetLabel( MenuId_Src_Iso, wxsFormat( L"%s -> %s", _("Iso"),
// exists ? Path::GetFilename(g_Conf->CurrentIso).c_str() : _("Empty") ) );
@@ -147,7 +142,6 @@ void MainEmuFrame::ConnectMenus()
ConnectMenu( MenuId_Config_Multitap0Toggle, Menu_MultitapToggle_Click );
ConnectMenu( MenuId_Config_Multitap1Toggle, Menu_MultitapToggle_Click );
- ConnectMenuRange(wxID_FILE1, 20, Menu_IsoRecent_Click);
ConnectMenuRange(MenuId_Config_GS, PluginId_Count, Menu_ConfigPlugin_Click);
ConnectMenuRange(MenuId_Src_Iso, 3, Menu_CdvdSource_Click);
@@ -443,7 +437,7 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title):
Connect( wxEVT_MOVE, wxMoveEventHandler (MainEmuFrame::OnMoveAround) );
Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler(MainEmuFrame::OnCloseWindow) );
- UpdateIsoSrcFile();
+ SetDropTarget( new IsoDropTarget( this ) );
}
MainEmuFrame::~MainEmuFrame() throw()
@@ -515,7 +509,7 @@ void MainEmuFrame::ApplySettings()
menubar.Check( MenuId_Config_Multitap0Toggle, g_Conf->EmuOptions.MultitapPort0_Enabled );
menubar.Check( MenuId_Config_Multitap1Toggle, g_Conf->EmuOptions.MultitapPort1_Enabled );
- UpdateIsoSrcFile();
+ UpdateIsoSrcSelection();
}
// ------------------------------------------------------------------------
diff --git a/pcsx2/gui/MainFrame.h b/pcsx2/gui/MainFrame.h
index 5577438830..76f3c16bb8 100644
--- a/pcsx2/gui/MainFrame.h
+++ b/pcsx2/gui/MainFrame.h
@@ -131,7 +131,6 @@ public:
void OnLogBoxHidden();
bool IsPaused() const { return GetMenuBar()->IsChecked( MenuId_Sys_SuspendResume ); }
- void UpdateIsoSrcFile();
void UpdateIsoSrcSelection();
void ReloadRecentLists();
@@ -153,9 +152,7 @@ protected:
void Menu_ConfigSettings_Click(wxCommandEvent &event);
void Menu_SelectBios_Click(wxCommandEvent &event);
- void Menu_RunIso_Click(wxCommandEvent &event);
void Menu_IsoBrowse_Click(wxCommandEvent &event);
- void Menu_IsoRecent_Click(wxCommandEvent &event);
void Menu_SkipBiosToggle_Click(wxCommandEvent &event);
void Menu_EnablePatches_Click(wxCommandEvent &event);
@@ -182,7 +179,7 @@ protected:
void Menu_ShowConsole(wxCommandEvent &event);
void Menu_ShowAboutBox(wxCommandEvent &event);
- bool _DoSelectIsoBrowser();
+ bool _DoSelectIsoBrowser( wxString& dest );
bool _DoSelectELFBrowser();
// ------------------------------------------------------------------------
diff --git a/pcsx2/gui/MainMenuClicks.cpp b/pcsx2/gui/MainMenuClicks.cpp
index 0c47a110be..849ce48066 100644
--- a/pcsx2/gui/MainMenuClicks.cpp
+++ b/pcsx2/gui/MainMenuClicks.cpp
@@ -24,6 +24,7 @@
using namespace Dialogs;
+extern wxString GetMsg_ConfirmSysReset();
void MainEmuFrame::Menu_ConfigSettings_Click(wxCommandEvent &event)
{
@@ -37,20 +38,26 @@ void MainEmuFrame::Menu_SelectBios_Click(wxCommandEvent &event)
void MainEmuFrame::Menu_CdvdSource_Click( wxCommandEvent &event )
{
+ CDVD_SourceType newSource = CDVDsrc_NoDisc;
+
switch( event.GetId() )
{
- case MenuId_Src_Iso: g_Conf->CdvdSource = CDVDsrc_Iso; break;
- case MenuId_Src_Plugin: g_Conf->CdvdSource = CDVDsrc_Plugin; break;
- case MenuId_Src_NoDisc: g_Conf->CdvdSource = CDVDsrc_NoDisc; break;
+ case MenuId_Src_Iso: newSource = CDVDsrc_Iso; break;
+ case MenuId_Src_Plugin: newSource = CDVDsrc_Plugin; break;
+ case MenuId_Src_NoDisc: newSource = CDVDsrc_NoDisc; break;
jNO_DEFAULT
}
- UpdateIsoSrcSelection();
- AppSaveSettings();
+
+ if( g_Conf->CdvdSource == newSource ) return;
+
+ bool resume = CoreThread.Suspend();
+ CDVDsys_ChangeSource( g_Conf->CdvdSource = newSource );
+ if( resume ) CoreThread.Resume();
}
// Returns FALSE if the user cancelled the action.
-bool MainEmuFrame::_DoSelectIsoBrowser()
+bool MainEmuFrame::_DoSelectIsoBrowser( wxString& result )
{
static const wxChar* isoFilterTypes =
L"All Supported (.iso .mdf .nrg .bin .img .dump)|*.iso;*.mdf;*.nrg;*.bin;*.img;*.dump|"
@@ -63,12 +70,9 @@ bool MainEmuFrame::_DoSelectIsoBrowser()
if( ctrl.ShowModal() != wxID_CANCEL )
{
- g_Conf->Folders.RunIso = wxFileName( ctrl.GetPath() ).GetPath();
- g_Conf->CurrentIso = ctrl.GetPath();
- sApp.GetRecentIsoList().Add( g_Conf->CurrentIso );
-
- AppSaveSettings();
- UpdateIsoSrcFile();
+ result = ctrl.GetPath();
+ g_Conf->Folders.RunIso = wxFileName( result ).GetPath();
+ //sApp.GetRecentIsoList().Add( result );
return true;
}
@@ -88,7 +92,6 @@ bool MainEmuFrame::_DoSelectELFBrowser()
{
g_Conf->Folders.RunELF = wxFileName( ctrl.GetPath() ).GetPath();
g_Conf->CurrentELF = ctrl.GetPath();
- AppSaveSettings();
return true;
}
@@ -101,55 +104,46 @@ void MainEmuFrame::Menu_BootCdvd_Click( wxCommandEvent &event )
if( (g_Conf->CdvdSource == CDVDsrc_Iso) && !wxFileExists(g_Conf->CurrentIso) )
{
- if( !_DoSelectIsoBrowser() )
+ wxString result;
+ if( !_DoSelectIsoBrowser( result ) )
{
CoreThread.Resume();
return;
}
+
+ SysUpdateIsoSrcFile( result );
}
if( SysHasValidState() )
{
- // [TODO] : Add one of 'dems checkboxes that read like "[x] don't show this stupid shit again, kthx."
- bool result = Msgbox::OkCancel( pxE( ".Popup:ConfirmSysReset", L"This will reset the emulator and your current emulation session will be lost. Are you sure?") );
+ bool confirmed = IssueConfirmation( this, L"BootCdvd:ConfirmReset", ConfButtons().Yes().Cancel(),
+ _("Confirm PS2 Reset"), GetMsg_ConfirmSysReset()
+ ) != wxID_CANCEL;
- if( !result )
+ if( !confirmed )
{
CoreThread.Resume();
return;
}
}
- g_Conf->EmuOptions.SkipBiosSplash = GetMenuBar()->IsChecked( MenuId_SkipBiosToggle );
- g_Conf->EmuOptions.EnablePatches = GetMenuBar()->IsChecked( MenuId_EnablePatches );
- AppSaveSettings();
-
sApp.SysExecute( g_Conf->CdvdSource );
}
void MainEmuFrame::Menu_IsoBrowse_Click( wxCommandEvent &event )
{
bool resume = CoreThread.Suspend();
- _DoSelectIsoBrowser();
- if( resume ) CoreThread.Resume();
-}
+ wxString result;
-void MainEmuFrame::Menu_RunIso_Click( wxCommandEvent &event )
-{
- CoreThread.Suspend();
-
- if( _DoSelectIsoBrowser() )
+ if( _DoSelectIsoBrowser( result ) )
{
- sApp.SysExecute( CDVDsrc_Iso );
+ // This command does an on-the-fly change of CD media without automatic reset.
+ // (useful for disc swapping)
+
+ SysUpdateIsoSrcFile( result );
}
- CoreThread.Resume();
-}
-
-void MainEmuFrame::Menu_IsoRecent_Click(wxCommandEvent &event)
-{
- //Console.Status( "%d", event.GetId() - g_RecentIsoList->GetBaseId() );
- //Console.WriteLn( Color_Magenta, g_RecentIsoList->GetHistoryFile( event.GetId() - g_RecentIsoList->GetBaseId() ) );
+ if( resume ) CoreThread.Resume();
}
#include "IniInterface.h"
@@ -185,13 +179,13 @@ void MainEmuFrame::Menu_EnablePatches_Click( wxCommandEvent &event )
void MainEmuFrame::Menu_OpenELF_Click(wxCommandEvent &event)
{
- CoreThread.Suspend();
+ bool resume = CoreThread.Suspend();
if( _DoSelectELFBrowser() )
{
sApp.SysExecute( g_Conf->CdvdSource, g_Conf->CurrentELF );
}
- CoreThread.Resume();
+ if( resume ) CoreThread.Resume();
}
void MainEmuFrame::Menu_LoadStates_Click(wxCommandEvent &event)
diff --git a/pcsx2/gui/RecentIsoList.cpp b/pcsx2/gui/RecentIsoList.cpp
index faefc7910a..4aa99ed264 100644
--- a/pcsx2/gui/RecentIsoList.cpp
+++ b/pcsx2/gui/RecentIsoList.cpp
@@ -23,11 +23,12 @@ RecentIsoList::RecentIsoList( wxMenu* menu ) :
, m_Separator( NULL )
, m_Listener_SettingsLoadSave( wxGetApp().Source_SettingsLoadSave(), EventListener( this, OnSettingsLoadSave ) )
{
- m_Menu->Connect( wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(RecentIsoList::OnChangedSelection) );
+ Connect( wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(RecentIsoList::OnChangedSelection) );
}
RecentIsoList::~RecentIsoList() throw()
{
+ Disconnect( wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(RecentIsoList::OnChangedSelection) );
}
void RecentIsoList::OnChangedSelection( wxCommandEvent& evt )
@@ -36,14 +37,20 @@ void RecentIsoList::OnChangedSelection( wxCommandEvent& evt )
uint i=0;
for( ; iGetId() != evt.GetId()) ) continue;
+ if( (m_Items[i].ItemPtr != NULL) && (m_Items[i].ItemPtr->GetId() == evt.GetId()) ) break;
}
- if( i >= m_Items.size() ) return;
+ if( i >= m_Items.size() )
+ {
+ evt.Skip();
+ return;
+ }
m_cursel = i;
- g_Conf->CurrentIso = m_Items[i].Filename;
- sMainFrame.UpdateIsoSrcFile();
+
+ bool resume = CoreThread.Suspend();
+ SysUpdateIsoSrcFile( m_Items[i].Filename );
+ if( resume ) CoreThread.Resume();
}
void RecentIsoList::RemoveAllFromMenu()
@@ -53,9 +60,10 @@ void RecentIsoList::RemoveAllFromMenu()
int cnt = m_Items.size();
for( int i=0; iDestroy( m_Items[i].ItemPtr );
- m_Items[i].ItemPtr = NULL;
+ RecentItem& curitem( m_Items[i] );
+ if( curitem.ItemPtr == NULL ) continue;
+ m_Menu->Destroy( curitem.ItemPtr );
+ curitem.ItemPtr = NULL;
}
if( m_Separator != NULL )
diff --git a/pcsx2/gui/RecentIsoList.h b/pcsx2/gui/RecentIsoList.h
new file mode 100644
index 0000000000..eddc534ada
--- /dev/null
+++ b/pcsx2/gui/RecentIsoList.h
@@ -0,0 +1,63 @@
+/* PCSX2 - PS2 Emulator for PCs
+ * Copyright (C) 2002-2009 PCSX2 Dev Team
+ *
+ * PCSX2 is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with PCSX2.
+ * If not, see .
+ */
+
+#pragma once
+
+// --------------------------------------------------------------------------------------
+// RecentIsoList
+// --------------------------------------------------------------------------------------
+class RecentIsoList : public wxEvtHandler
+{
+protected:
+ struct RecentItem
+ {
+ wxString Filename;
+ wxMenuItem* ItemPtr;
+
+ RecentItem() { ItemPtr = NULL; }
+
+ RecentItem( const wxString& src ) :
+ Filename( src )
+ , ItemPtr( NULL )
+ {
+ }
+ };
+
+ std::vector m_Items;
+
+ wxMenu* m_Menu;
+ uint m_MaxLength;
+ int m_cursel;
+
+ wxMenuItem* m_Separator;
+
+ EventListenerBinding m_Listener_SettingsLoadSave;
+
+public:
+ RecentIsoList( wxMenu* menu );
+ virtual ~RecentIsoList() throw();
+
+ void RemoveAllFromMenu();
+ void Repopulate();
+ void Add( const wxString& src );
+
+protected:
+ void InsertIntoMenu( int id );
+ void DoSettingsLoadSave( IniInterface& ini );
+ void OnChangedSelection( wxCommandEvent& evt );
+
+ static void __evt_fastcall OnSettingsLoadSave( void* obj, IniInterface& evt );
+};
+
diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
index 2b51e0c2e5..cb70dd4e4a 100644
--- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
+++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
@@ -1828,6 +1828,10 @@
RelativePath="..\..\gui\IniInterface.cpp"
>
+
+
@@ -2417,10 +2421,18 @@
RelativePath="..\..\gui\IniInterface.h"
>
+
+
+
+