mirror of
https://github.com/Heretek-AI/GDevelop.git
synced 2026-07-22 10:05:37 -04:00
d9c92facda
Started adding support for "dynamic extensions", meant to be written/compiled within Game Develop. In SceneCanvas::Reload, now destroy and recreate scene member when reloading, as it is necessary for dynamic libraries for example to have explicit scene destruction when preview is ended. Renamed GDE define to GD_IDE_ONLY. Renamed old gdp namespace to GDpriv. git-svn-id: svn://localhost@345 8062f311-0dae-4547-b526-b8ab9ac864a5
220 lines
10 KiB
C++
220 lines
10 KiB
C++
#include "ObjectTypeChoice.h"
|
|
|
|
//(*InternalHeaders(ObjectTypeChoice)
|
|
#include <wx/bitmap.h>
|
|
#include <wx/intl.h>
|
|
#include <wx/image.h>
|
|
#include <wx/string.h>
|
|
//*)
|
|
#include <wx/imaglist.h>
|
|
#include <string>
|
|
#include <vector>
|
|
#include "GDL/gdTreeItemStringData.h"
|
|
|
|
#include "Extensions.h"
|
|
#include "GDL/ExtensionsManager.h"
|
|
#include "GDL/Game.h"
|
|
|
|
using namespace std;
|
|
|
|
//(*IdInit(ObjectTypeChoice)
|
|
const long ObjectTypeChoice::ID_STATICBITMAP2 = wxNewId();
|
|
const long ObjectTypeChoice::ID_STATICTEXT1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_PANEL1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_STATICLINE1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_LISTCTRL1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_STATICBITMAP1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_TEXTCTRL1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_STATICLINE2 = wxNewId();
|
|
const long ObjectTypeChoice::ID_BUTTON3 = wxNewId();
|
|
const long ObjectTypeChoice::ID_BUTTON1 = wxNewId();
|
|
const long ObjectTypeChoice::ID_BUTTON2 = wxNewId();
|
|
//*)
|
|
|
|
BEGIN_EVENT_TABLE(ObjectTypeChoice,wxDialog)
|
|
//(*EventTable(ObjectTypeChoice)
|
|
//*)
|
|
END_EVENT_TABLE()
|
|
|
|
ObjectTypeChoice::ObjectTypeChoice(wxWindow* parent, Game & game_) :
|
|
game(game_)
|
|
{
|
|
//(*Initialize(ObjectTypeChoice)
|
|
wxFlexGridSizer* FlexGridSizer4;
|
|
wxFlexGridSizer* FlexGridSizer3;
|
|
wxFlexGridSizer* FlexGridSizer5;
|
|
wxFlexGridSizer* FlexGridSizer2;
|
|
wxStaticBoxSizer* StaticBoxSizer1;
|
|
wxFlexGridSizer* FlexGridSizer1;
|
|
|
|
Create(parent, wxID_ANY, _("Choisir un type d\'objet"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER, _T("wxID_ANY"));
|
|
SetClientSize(wxSize(249,163));
|
|
FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
|
|
FlexGridSizer1->AddGrowableCol(0);
|
|
FlexGridSizer1->AddGrowableRow(2);
|
|
Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1"));
|
|
Panel1->SetBackgroundColour(wxColour(255,255,255));
|
|
FlexGridSizer4 = new wxFlexGridSizer(0, 3, 0, 0);
|
|
StaticBitmap2 = new wxStaticBitmap(Panel1, ID_STATICBITMAP2, wxBitmap(wxImage(_T("res/objeticon64.png"))), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICBITMAP2"));
|
|
FlexGridSizer4->Add(StaticBitmap2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
StaticText1 = new wxStaticText(Panel1, ID_STATICTEXT1, _("Choisissez le type d\'objet à ajouter.\nLe type de l\'objet détermine la façon dont\nil est affiché, ce qu\'il fait, comment peut on\ninteragir avec..."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
|
|
FlexGridSizer4->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
Panel1->SetSizer(FlexGridSizer4);
|
|
FlexGridSizer4->Fit(Panel1);
|
|
FlexGridSizer4->SetSizeHints(Panel1);
|
|
FlexGridSizer1->Add(Panel1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
StaticLine1 = new wxStaticLine(this, ID_STATICLINE1, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE1"));
|
|
FlexGridSizer1->Add(StaticLine1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
objectsList = new wxListCtrl(this, ID_LISTCTRL1, wxDefaultPosition, wxSize(277,175), wxLC_ICON|wxLC_ALIGN_LEFT|wxLC_SINGLE_SEL, wxDefaultValidator, _T("ID_LISTCTRL1"));
|
|
FlexGridSizer1->Add(objectsList, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
StaticBoxSizer1 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Informations sur l\'objet"));
|
|
FlexGridSizer3 = new wxFlexGridSizer(0, 1, 0, 0);
|
|
FlexGridSizer3->AddGrowableCol(0);
|
|
FlexGridSizer5 = new wxFlexGridSizer(0, 2, 0, 0);
|
|
FlexGridSizer5->AddGrowableCol(1);
|
|
FlexGridSizer5->AddGrowableRow(0);
|
|
iconBmp = new wxStaticBitmap(this, ID_STATICBITMAP1, wxBitmap(wxImage(_T("res/unknown32.png")).Rescale(wxSize(32,32).GetWidth(),wxSize(32,32).GetHeight())), wxDefaultPosition, wxSize(32,32), wxSIMPLE_BORDER, _T("ID_STATICBITMAP1"));
|
|
FlexGridSizer5->Add(iconBmp, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
infoEdit = new wxTextCtrl(this, ID_TEXTCTRL1, _("Pas d\'informations sur l\'objet."), wxDefaultPosition, wxSize(227,37), wxTE_MULTILINE|wxTE_READONLY, wxDefaultValidator, _T("ID_TEXTCTRL1"));
|
|
FlexGridSizer5->Add(infoEdit, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
FlexGridSizer3->Add(FlexGridSizer5, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
StaticBoxSizer1->Add(FlexGridSizer3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
FlexGridSizer1->Add(StaticBoxSizer1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
StaticLine2 = new wxStaticLine(this, ID_STATICLINE2, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE2"));
|
|
FlexGridSizer1->Add(StaticLine2, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
FlexGridSizer2 = new wxFlexGridSizer(0, 3, 0, 0);
|
|
FlexGridSizer2->AddGrowableCol(0);
|
|
moreObjectsBt = new wxButton(this, ID_BUTTON3, _("Plus d\'objets"), wxDefaultPosition, wxSize(113,23), 0, wxDefaultValidator, _T("ID_BUTTON3"));
|
|
FlexGridSizer2->Add(moreObjectsBt, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
|
|
okBt = new wxButton(this, ID_BUTTON1, _("Ok"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
|
|
FlexGridSizer2->Add(okBt, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
|
|
cancelBt = new wxButton(this, ID_BUTTON2, _("Annuler"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
|
|
FlexGridSizer2->Add(cancelBt, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
|
|
FlexGridSizer1->Add(FlexGridSizer2, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
SetSizer(FlexGridSizer1);
|
|
FlexGridSizer1->SetSizeHints(this);
|
|
|
|
Connect(ID_LISTCTRL1,wxEVT_COMMAND_LIST_ITEM_SELECTED,(wxObjectEventFunction)&ObjectTypeChoice::OnobjectsListItemSelect);
|
|
Connect(ID_LISTCTRL1,wxEVT_COMMAND_LIST_ITEM_ACTIVATED,(wxObjectEventFunction)&ObjectTypeChoice::OnobjectsListItemActivated);
|
|
Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ObjectTypeChoice::OnmoreObjectsBtClick);
|
|
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ObjectTypeChoice::OnokBtClick);
|
|
Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&ObjectTypeChoice::OncancelBtClick);
|
|
Connect(wxID_ANY,wxEVT_CLOSE_WINDOW,(wxObjectEventFunction)&ObjectTypeChoice::OnClose);
|
|
//*)
|
|
|
|
moreObjectsBt->SetBitmap(wxBitmap("res/extensiononly16.png", wxBITMAP_TYPE_ANY));
|
|
|
|
RefreshList();
|
|
}
|
|
|
|
ObjectTypeChoice::~ObjectTypeChoice()
|
|
{
|
|
//(*Destroy(ObjectTypeChoice)
|
|
//*)
|
|
}
|
|
|
|
void ObjectTypeChoice::RefreshList()
|
|
{
|
|
objectsList->DeleteAllItems();
|
|
|
|
GDpriv::ExtensionsManager * extensionManager = GDpriv::ExtensionsManager::getInstance();
|
|
const vector < boost::shared_ptr<ExtensionBase> > extensions = extensionManager->GetExtensions();
|
|
|
|
wxImageList * imageList = new wxImageList(32,32);
|
|
imageList->Add(wxBitmap(wxImage(_T("res/unknown32.png"))));
|
|
objectsList->AssignImageList(imageList, wxIMAGE_LIST_NORMAL);
|
|
|
|
//Insert extension objects
|
|
for (unsigned int i = 0;i<extensions.size();++i)
|
|
{
|
|
//Verify if that extension is enabled
|
|
if ( find(game.extensionsUsed.begin(),
|
|
game.extensionsUsed.end(),
|
|
extensions[i]->GetName()) == game.extensionsUsed.end() )
|
|
continue;
|
|
|
|
vector<string> objectsTypes = extensions[i]->GetExtensionObjectsTypes();
|
|
for(unsigned int j = 0;j<objectsTypes.size();++j)
|
|
{
|
|
if ( objectsTypes[j] != "" ) //Cannot use directly a base object
|
|
{
|
|
imageList->Add(extensions[i]->GetObjectInfo(objectsTypes[j]).icon);
|
|
gdTreeItemStringData * associatedData = new gdTreeItemStringData(objectsTypes[j]);
|
|
|
|
wxListItem objectItem;
|
|
objectItem.SetText(extensions[i]->GetObjectInfo(objectsTypes[j]).fullname);
|
|
objectItem.SetImage(imageList->GetImageCount()-1);
|
|
objectItem.SetData(associatedData);
|
|
|
|
objectsList->InsertItem(objectItem);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ObjectTypeChoice::OnobjectsListItemSelect(wxListEvent& event)
|
|
{
|
|
//Get the object type associated with the item
|
|
wxListItem item = event.GetItem();
|
|
gdTreeItemStringData * associatedData = reinterpret_cast<gdTreeItemStringData*>(item.GetData()); //Why GetData return long ?
|
|
if ( associatedData != NULL )
|
|
{
|
|
selectedObjectType = associatedData->GetString();
|
|
}
|
|
|
|
GDpriv::ExtensionsManager * extensionManager = GDpriv::ExtensionsManager::getInstance();
|
|
const vector < boost::shared_ptr<ExtensionBase> > extensions = extensionManager->GetExtensions();
|
|
|
|
boost::shared_ptr<ExtensionBase> extension = boost::shared_ptr<ExtensionBase> ();
|
|
|
|
for (unsigned int i = 0;i<extensions.size();++i)
|
|
{
|
|
vector<string> objectsTypes = extensions[i]->GetExtensionObjectsTypes();
|
|
if ( find(objectsTypes.begin(), objectsTypes.end(), selectedObjectType) != objectsTypes.end() )
|
|
extension = extensions[i];
|
|
}
|
|
|
|
if ( extension == boost::shared_ptr<ExtensionBase> () )
|
|
return;
|
|
|
|
infoEdit->ChangeValue(extension->GetObjectInfo(selectedObjectType).informations);
|
|
iconBmp->SetBitmap(extension->GetObjectInfo(selectedObjectType).icon);
|
|
}
|
|
|
|
void ObjectTypeChoice::OnobjectsListItemActivated(wxListEvent& event)
|
|
{
|
|
//Get the object type associated with the item
|
|
wxListItem item = event.GetItem();
|
|
gdTreeItemStringData * associatedData = reinterpret_cast<gdTreeItemStringData*>(item.GetData()); //Why GetData return long ?
|
|
if ( associatedData != NULL )
|
|
{
|
|
selectedObjectType = associatedData->GetString();
|
|
}
|
|
|
|
EndModal(1);
|
|
}
|
|
|
|
void ObjectTypeChoice::OncancelBtClick(wxCommandEvent& event)
|
|
{
|
|
selectedObjectType = "";
|
|
EndModal(0);
|
|
}
|
|
|
|
void ObjectTypeChoice::OnokBtClick(wxCommandEvent& event)
|
|
{
|
|
if ( selectedObjectType != "" ) EndModal(1);
|
|
}
|
|
|
|
void ObjectTypeChoice::OnClose(wxCloseEvent& event)
|
|
{
|
|
EndModal(0);
|
|
}
|
|
|
|
void ObjectTypeChoice::OnmoreObjectsBtClick(wxCommandEvent& event)
|
|
{
|
|
Extensions dialog(this, game);
|
|
dialog.ShowModal();
|
|
|
|
RefreshList();
|
|
}
|