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
1227 lines
49 KiB
C++
1227 lines
49 KiB
C++
#include "EditorObjectList.h"
|
|
|
|
//(*InternalHeaders(EditorObjectList)
|
|
#include <wx/bitmap.h>
|
|
#include <wx/intl.h>
|
|
#include <wx/image.h>
|
|
#include <wx/string.h>
|
|
//*)
|
|
#include <wx/toolbar.h>
|
|
#include <wx/log.h>
|
|
#include <wx/textdlg.h>
|
|
#include <wx/help.h>
|
|
#include <wx/config.h>
|
|
#include <wx/ribbon/bar.h>
|
|
#include <wx/ribbon/buttonbar.h>
|
|
#include <wx/ribbon/gallery.h>
|
|
#include <wx/ribbon/toolbar.h>
|
|
#include <wx/textdlg.h>
|
|
#include <wx/choicdlg.h>
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Game_Develop_EditorMain.h"
|
|
#include "GDL/Game.h"
|
|
#include "GDL/Scene.h"
|
|
#include "GDL/Object.h"
|
|
#include "GDL/Chercher.h"
|
|
#include "GDL/ExtensionsManager.h"
|
|
#include "GDL/CommonTools.h"
|
|
#include "MemTrace.h"
|
|
#include "Clipboard.h"
|
|
#include <algorithm>
|
|
#include <numeric>
|
|
#include "EditorObjetsGroups.h"
|
|
#include "GDL/BitmapGUIManager.h"
|
|
#include "GDL/Automatism.h"
|
|
#include "GDL/CommonTools.h"
|
|
#include "DndTextObjectsEditor.h"
|
|
#include "ObjectTypeChoice.h"
|
|
#include "InitialVariablesDialog.h"
|
|
#include "GDL/HelpFileAccess.h"
|
|
#include "GDL/AutomatismsSharedDatas.h"
|
|
#include "AutomatismTypeChoice.h"
|
|
#include "EventsRefactorer.h"
|
|
|
|
#ifdef __WXMSW__
|
|
#include <wx/msw/winundef.h>
|
|
#endif
|
|
|
|
#ifdef __WXGTK__
|
|
#include <gtk/gtk.h>
|
|
#endif
|
|
|
|
//(*IdInit(EditorObjectList)
|
|
const long EditorObjectList::ID_PANEL4 = wxNewId();
|
|
const long EditorObjectList::ID_TREECTRL1 = wxNewId();
|
|
const long EditorObjectList::idMenuModObj = wxNewId();
|
|
const long EditorObjectList::idMenuModVar = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM2 = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM5 = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM3 = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM1 = wxNewId();
|
|
const long EditorObjectList::idMenuModName = wxNewId();
|
|
const long EditorObjectList::idMenuAddObj = wxNewId();
|
|
const long EditorObjectList::idMenuDelObj = wxNewId();
|
|
const long EditorObjectList::idMoveUp = wxNewId();
|
|
const long EditorObjectList::idMoveDown = wxNewId();
|
|
const long EditorObjectList::idMenuCopy = wxNewId();
|
|
const long EditorObjectList::idMenuCut = wxNewId();
|
|
const long EditorObjectList::idMenuPaste = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM4 = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM6 = wxNewId();
|
|
const long EditorObjectList::ID_MENUITEM7 = wxNewId();
|
|
//*)
|
|
const long EditorObjectList::ID_BITMAPBUTTON1 = wxNewId();
|
|
const long EditorObjectList::ID_BITMAPBUTTON2 = wxNewId();
|
|
const long EditorObjectList::ID_BITMAPBUTTON3 = wxNewId();
|
|
const long EditorObjectList::ID_BITMAPBUTTON6 = wxNewId();
|
|
const long EditorObjectList::ID_BITMAPBUTTON7 = wxNewId();
|
|
const long EditorObjectList::idRibbonAdd = wxNewId();
|
|
const long EditorObjectList::idRibbonDel = wxNewId();
|
|
const long EditorObjectList::idRibbonUp = wxNewId();
|
|
const long EditorObjectList::idRibbonDown = wxNewId();
|
|
const long EditorObjectList::idRibbonSearch = wxNewId();
|
|
const long EditorObjectList::idRibbonModProp = wxNewId();
|
|
const long EditorObjectList::idRibbonModName = wxNewId();
|
|
const long EditorObjectList::idRibbonCopy = wxNewId();
|
|
const long EditorObjectList::idRibbonCut = wxNewId();
|
|
const long EditorObjectList::idRibbonPaste = wxNewId();
|
|
const long EditorObjectList::idRibbonHelp = wxNewId();
|
|
const long EditorObjectList::idRibbonRefresh = wxNewId();
|
|
|
|
BEGIN_EVENT_TABLE(EditorObjectList,wxPanel)
|
|
//(*EventTable(EditorObjectList)
|
|
//*)
|
|
END_EVENT_TABLE()
|
|
|
|
EditorObjectList::EditorObjectList(wxWindow* parent, Game & game_, vector < boost::shared_ptr<Object> > * objects_, MainEditorCommand & mainEditorCommand_, Scene * scene_) :
|
|
objects(objects_),
|
|
game(game_),
|
|
scene(scene_),
|
|
mainEditorCommand(mainEditorCommand_)
|
|
{
|
|
//(*Initialize(EditorObjectList)
|
|
wxMenuItem* delObjMenuI;
|
|
wxMenuItem* editNameMenuI;
|
|
wxMenuItem* editVarMenuI;
|
|
wxMenuItem* editMenuI;
|
|
wxFlexGridSizer* FlexGridSizer1;
|
|
wxMenuItem* addObjMenuI;
|
|
|
|
Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("wxID_ANY"));
|
|
FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
|
|
FlexGridSizer1->AddGrowableCol(0);
|
|
FlexGridSizer1->AddGrowableRow(1);
|
|
toolbarPanel = new wxPanel(this, ID_PANEL4, wxDefaultPosition, wxSize(-1,0), wxTAB_TRAVERSAL, _T("ID_PANEL4"));
|
|
FlexGridSizer1->Add(toolbarPanel, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
objectsList = new wxTreeCtrl(this, ID_TREECTRL1, wxPoint(-72,-72), wxSize(179,170), wxTR_EDIT_LABELS|wxTR_MULTIPLE|wxTR_DEFAULT_STYLE, wxDefaultValidator, _T("ID_TREECTRL1"));
|
|
FlexGridSizer1->Add(objectsList, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
|
|
SetSizer(FlexGridSizer1);
|
|
editMenuI = new wxMenuItem((&ContextMenu), idMenuModObj, _("Modifier les propriétés de l\'objet"), wxEmptyString, wxITEM_NORMAL);
|
|
editMenuI->SetBitmap(wxBitmap(wxImage(_T("res/editicon.png"))));
|
|
ContextMenu.Append(editMenuI);
|
|
editVarMenuI = new wxMenuItem((&ContextMenu), idMenuModVar, _("Modifier les variables initiales"), wxEmptyString, wxITEM_NORMAL);
|
|
editVarMenuI->SetBitmap(wxBitmap(wxImage(_T("res/var.png"))));
|
|
ContextMenu.Append(editVarMenuI);
|
|
automatismsMenu = new wxMenu();
|
|
automatismsMenu->AppendSeparator();
|
|
addAutomatismItem = new wxMenuItem(automatismsMenu, ID_MENUITEM2, _("Ajouter un automatisme"), wxEmptyString, wxITEM_NORMAL);
|
|
addAutomatismItem->SetBitmap(wxBitmap(wxImage(_T("res/addicon.png"))));
|
|
automatismsMenu->Append(addAutomatismItem);
|
|
renameAutomatism = new wxMenuItem(automatismsMenu, ID_MENUITEM5, _("Renommer un automatisme"), wxEmptyString, wxITEM_NORMAL);
|
|
renameAutomatism->SetBitmap(wxBitmap(wxImage(_T("res/editnom.png"))));
|
|
automatismsMenu->Append(renameAutomatism);
|
|
deleteAutomatismItem = new wxMenuItem(automatismsMenu, ID_MENUITEM3, _("Supprimer un automatisme"), wxEmptyString, wxITEM_NORMAL);
|
|
deleteAutomatismItem->SetBitmap(wxBitmap(wxImage(_T("res/deleteicon.png"))));
|
|
automatismsMenu->Append(deleteAutomatismItem);
|
|
ContextMenu.Append(ID_MENUITEM1, _("Modifier les automatismes"), automatismsMenu, wxEmptyString);
|
|
editNameMenuI = new wxMenuItem((&ContextMenu), idMenuModName, _("Modifier le nom de l\'objet"), wxEmptyString, wxITEM_NORMAL);
|
|
editNameMenuI->SetBitmap(wxBitmap(wxImage(_T("res/editnom.png"))));
|
|
ContextMenu.Append(editNameMenuI);
|
|
ContextMenu.AppendSeparator();
|
|
addObjMenuI = new wxMenuItem((&ContextMenu), idMenuAddObj, _("Ajouter un objet"), wxEmptyString, wxITEM_NORMAL);
|
|
addObjMenuI->SetBitmap(wxBitmap(wxImage(_T("res/addicon.png"))));
|
|
ContextMenu.Append(addObjMenuI);
|
|
delObjMenuI = new wxMenuItem((&ContextMenu), idMenuDelObj, _("Supprimer l\'objet\tDel"), wxEmptyString, wxITEM_NORMAL);
|
|
delObjMenuI->SetBitmap(wxBitmap(wxImage(_T("res/deleteicon.png"))));
|
|
ContextMenu.Append(delObjMenuI);
|
|
ContextMenu.AppendSeparator();
|
|
moveUpMenuI = new wxMenuItem((&ContextMenu), idMoveUp, _("Déplacer vers le haut\tCtrl-Up"), wxEmptyString, wxITEM_NORMAL);
|
|
moveUpMenuI->SetBitmap(wxBitmap(wxImage(_T("res/up.png"))));
|
|
ContextMenu.Append(moveUpMenuI);
|
|
moveDownMenuI = new wxMenuItem((&ContextMenu), idMoveDown, _("Déplacer vers le bas\tCtrl-Down"), wxEmptyString, wxITEM_NORMAL);
|
|
moveDownMenuI->SetBitmap(wxBitmap(wxImage(_T("res/down.png"))));
|
|
ContextMenu.Append(moveDownMenuI);
|
|
ContextMenu.AppendSeparator();
|
|
copyMenuI = new wxMenuItem((&ContextMenu), idMenuCopy, _("Copier\tCtrl-C"), wxEmptyString, wxITEM_NORMAL);
|
|
copyMenuI->SetBitmap(wxBitmap(wxImage(_T("res/copyicon.png"))));
|
|
ContextMenu.Append(copyMenuI);
|
|
cutMenuI = new wxMenuItem((&ContextMenu), idMenuCut, _("Couper\tCtrl-X"), wxEmptyString, wxITEM_NORMAL);
|
|
cutMenuI->SetBitmap(wxBitmap(wxImage(_T("res/cuticon.png"))));
|
|
ContextMenu.Append(cutMenuI);
|
|
pasteMenuI = new wxMenuItem((&ContextMenu), idMenuPaste, _("Coller\tCtrl-V"), wxEmptyString, wxITEM_NORMAL);
|
|
pasteMenuI->SetBitmap(wxBitmap(wxImage(_T("res/pasteicon.png"))));
|
|
ContextMenu.Append(pasteMenuI);
|
|
MenuItem1 = new wxMenuItem((&rootContextMenu), ID_MENUITEM4, _("Ajouter un objet"), wxEmptyString, wxITEM_NORMAL);
|
|
MenuItem1->SetBitmap(wxBitmap(wxImage(_T("res/addicon.png"))));
|
|
rootContextMenu.Append(MenuItem1);
|
|
rootContextMenu.AppendSeparator();
|
|
MenuItem3 = new wxMenuItem((&rootContextMenu), ID_MENUITEM6, _("Coller\tCtrl-V"), wxEmptyString, wxITEM_NORMAL);
|
|
MenuItem3->SetBitmap(wxBitmap(wxImage(_T("res/pasteicon.png"))));
|
|
rootContextMenu.Append(MenuItem3);
|
|
MenuItem2 = new wxMenuItem((&multipleContextMenu), ID_MENUITEM7, _("Supprimer les objets\tDEL"), _("Supprimer tous les objets selectionnés"), wxITEM_NORMAL);
|
|
MenuItem2->SetBitmap(wxBitmap(wxImage(_T("res/deleteicon.png"))));
|
|
multipleContextMenu.Append(MenuItem2);
|
|
FlexGridSizer1->Fit(this);
|
|
FlexGridSizer1->SetSizeHints(this);
|
|
|
|
toolbarPanel->Connect(wxEVT_SIZE,(wxObjectEventFunction)&EditorObjectList::OntoolbarPanelResize,0,this);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_BEGIN_DRAG,(wxObjectEventFunction)&EditorObjectList::OnobjectsListBeginDrag);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,(wxObjectEventFunction)&EditorObjectList::OnobjectsListBeginLabelEdit);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_END_LABEL_EDIT,(wxObjectEventFunction)&EditorObjectList::OnobjectsListEndLabelEdit);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_ITEM_ACTIVATED,(wxObjectEventFunction)&EditorObjectList::OnobjectsListItemActivated);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK,(wxObjectEventFunction)&EditorObjectList::OnobjectsListItemRightClick);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_SEL_CHANGED,(wxObjectEventFunction)&EditorObjectList::OnobjectsListSelectionChanged);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_KEY_DOWN,(wxObjectEventFunction)&EditorObjectList::OnobjectsListKeyDown);
|
|
Connect(ID_TREECTRL1,wxEVT_COMMAND_TREE_ITEM_MENU,(wxObjectEventFunction)&EditorObjectList::OnobjectsListItemMenu);
|
|
Connect(idMenuModObj,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OneditMenuISelected);
|
|
Connect(idMenuModVar,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OneditVarMenuISelected);
|
|
Connect(ID_MENUITEM2,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnaddAutomatismItemSelected);
|
|
Connect(ID_MENUITEM5,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnrenameAutomatismSelected);
|
|
Connect(ID_MENUITEM3,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OndeleteAutomatismItemSelected);
|
|
Connect(idMenuModName,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OneditNameMenuISelected);
|
|
Connect(idMenuAddObj,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnaddObjMenuISelected);
|
|
Connect(idMenuDelObj,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OndelObjMenuISelected);
|
|
Connect(idMoveUp,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnMoveUpSelected);
|
|
Connect(idMoveDown,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnMoveDownSelected);
|
|
Connect(idMenuCopy,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnCopySelected);
|
|
Connect(idMenuCut,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnCutSelected);
|
|
Connect(idMenuPaste,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnPasteSelected);
|
|
Connect(ID_MENUITEM4,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnaddObjMenuISelected);
|
|
Connect(ID_MENUITEM6,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnPasteSelected);
|
|
Connect(ID_MENUITEM7,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OndelObjMenuISelected);
|
|
Connect(wxEVT_SET_FOCUS,(wxObjectEventFunction)&EditorObjectList::OnSetFocus);
|
|
//*)
|
|
|
|
CreateToolbar();
|
|
|
|
objectsImagesList = new wxImageList(24,24, true);
|
|
objectsList->AssignImageList(objectsImagesList);
|
|
|
|
Connect(ID_BITMAPBUTTON1,wxEVT_COMMAND_TOOL_CLICKED,(wxObjectEventFunction)&EditorObjectList::OnRefreshBtClick);
|
|
Connect(ID_BITMAPBUTTON2,wxEVT_COMMAND_TOOL_CLICKED,(wxObjectEventFunction)&EditorObjectList::OnChercherBtClick);
|
|
Connect(ID_BITMAPBUTTON3,wxEVT_COMMAND_TOOL_CLICKED,(wxObjectEventFunction)&EditorObjectList::OnAideBtClick);
|
|
Connect(ID_BITMAPBUTTON6,wxEVT_COMMAND_TOOL_CLICKED,(wxObjectEventFunction)&EditorObjectList::OnMoreOptions);
|
|
|
|
SetDropTarget(new DndTextObjectsEditor(*this));
|
|
|
|
Refresh();
|
|
}
|
|
|
|
EditorObjectList::~EditorObjectList()
|
|
{
|
|
//(*Destroy(EditorObjectList)
|
|
//*)
|
|
}
|
|
|
|
/**
|
|
* Static method for creating ribbon page for this kind of editor
|
|
*/
|
|
void EditorObjectList::CreateRibbonPage(wxRibbonPage * page)
|
|
{
|
|
wxConfigBase *pConfig = wxConfigBase::Get();
|
|
bool hideLabels = false;
|
|
pConfig->Read( _T( "/Skin/HideLabels" ), &hideLabels );
|
|
|
|
{
|
|
wxRibbonPanel *ribbonPanel = new wxRibbonPanel(page, wxID_ANY, _("Liste d'objets"), wxBitmap("res/list24.png", wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE);
|
|
wxRibbonButtonBar *ribbonBar = new wxRibbonButtonBar(ribbonPanel, wxID_ANY);
|
|
ribbonBar->AddButton(idRibbonAdd, !hideLabels ? _("Ajouter un objet") : "", wxBitmap("res/add24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonDel, !hideLabels ? _("Supprimer") : "", wxBitmap("res/delete24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonUp, !hideLabels ? _("Déplacer vers le haut") : "", wxBitmap("res/up24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonDown, !hideLabels ? _("Déplacer vers le bas") : "", wxBitmap("res/down24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonSearch, !hideLabels ? _("Rechercher") : "", wxBitmap("res/search24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonRefresh, !hideLabels ? _("Rafraichir") : "", wxBitmap("res/refreshicon24.png", wxBITMAP_TYPE_ANY));
|
|
}
|
|
{
|
|
wxRibbonPanel *ribbonPanel = new wxRibbonPanel(page, wxID_ANY, _("Objet sélectionné"), wxBitmap("res/edit24.png", wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE);
|
|
wxRibbonButtonBar *ribbonBar = new wxRibbonButtonBar(ribbonPanel, wxID_ANY);
|
|
ribbonBar->AddButton(idRibbonModProp, !hideLabels ? _("Edition") : "", wxBitmap("res/editprop24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonModName, !hideLabels ? _("Editer le nom") : "", wxBitmap("res/editname24.png", wxBITMAP_TYPE_ANY));
|
|
}
|
|
{
|
|
wxRibbonPanel *ribbonPanel = new wxRibbonPanel(page, wxID_ANY, _("Presse papiers"), wxBitmap("res/copy24.png", wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE);
|
|
wxRibbonButtonBar *ribbonBar = new wxRibbonButtonBar(ribbonPanel, wxID_ANY);
|
|
ribbonBar->AddButton(idRibbonCopy, !hideLabels ? _("Copier") : "", wxBitmap("res/copy24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonCut, !hideLabels ? _("Couper") : "", wxBitmap("res/cut24.png", wxBITMAP_TYPE_ANY));
|
|
ribbonBar->AddButton(idRibbonPaste, !hideLabels ? _("Coller") : "", wxBitmap("res/paste24.png", wxBITMAP_TYPE_ANY));
|
|
}
|
|
{
|
|
wxRibbonPanel *ribbonPanel = new wxRibbonPanel(page, wxID_ANY, _("Aide"), wxBitmap("res/helpicon24.png", wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE);
|
|
wxRibbonButtonBar *ribbonBar = new wxRibbonButtonBar(ribbonPanel, wxID_ANY);
|
|
ribbonBar->AddButton(idRibbonHelp, !hideLabels ? _("Aide") : "", wxBitmap("res/helpicon24.png", wxBITMAP_TYPE_ANY));
|
|
}
|
|
|
|
}
|
|
|
|
void EditorObjectList::ConnectEvents()
|
|
{
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonAdd, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnaddObjMenuISelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonDel, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OndelObjMenuISelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonUp, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnMoveUpSelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonDown, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnMoveDownSelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonSearch, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnChercherBtClick, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonModProp, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OneditMenuISelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonModName, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OneditNameMenuISelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonCopy, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnCopySelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonCut, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnCutSelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonPaste, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnPasteSelected, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonHelp, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::OnAideBtClick, NULL, this);
|
|
mainEditorCommand.GetMainEditor()->Connect(idRibbonRefresh, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, (wxObjectEventFunction)&EditorObjectList::Refresh, NULL, this);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Création de la toolbar
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::CreateToolbar()
|
|
{
|
|
toolbar = new wxToolBar( toolbarPanel, -1, wxDefaultPosition, wxDefaultSize,
|
|
wxTB_FLAT | wxTB_NODIVIDER );
|
|
|
|
toolbar->SetToolBitmapSize( wxSize( 16, 16 ) );
|
|
toolbar->AddTool( ID_BITMAPBUTTON1, wxT( "Rafraichir" ), wxBitmap( wxImage( "res/refreshicon.png" ) ), _("Rafraichir la liste d'images") );
|
|
toolbar->AddSeparator();
|
|
toolbar->AddTool( idMenuAddObj, wxT( "Ajouter un objet" ), wxBitmap( wxImage( "res/addicon.png" ) ), _("Ajouter un objet") );
|
|
toolbar->AddTool( idMenuDelObj, wxT( "Supprimer l'objet selectionné" ), wxBitmap( wxImage( "res/deleteicon.png" ) ), _("Supprimer l'objet selectionné") );
|
|
toolbar->AddTool( idMenuModObj, wxT( "Modifier les propriétés de l'objet" ), wxBitmap( wxImage( "res/editpropicon.png" ) ), _("Modifier les propriétés de l'objet") );
|
|
toolbar->AddTool( ID_BITMAPBUTTON6, wxT( "Plus d'options d'édition ( clic droit sur la liste )" ), wxBitmap( wxImage( "res/moreicon.png" ) ), _("Plus d'options d'édition ( clic droit sur la liste )") );
|
|
toolbar->AddSeparator();
|
|
toolbar->AddTool( ID_BITMAPBUTTON2, wxT( "Rechercher un objet" ), wxBitmap( wxImage( "res/searchicon.png" ) ), _("Rechercher un objet") );
|
|
toolbar->AddSeparator();
|
|
toolbar->AddTool( ID_BITMAPBUTTON3, wxT( "Aide de l'éditeur d'objets" ), wxBitmap( wxImage( "res/helpicon.png" ) ), _("Aide de l'éditeur d'objets") );
|
|
toolbar->Realize();
|
|
|
|
//On vérifie si on est pas en mode simple.
|
|
wxConfigBase * pConfig = wxConfigBase::Get();
|
|
|
|
bool result;
|
|
pConfig->Read("/ModeSimple", &result);
|
|
|
|
if ( result )
|
|
{
|
|
toolbar->EnableTool(ID_BITMAPBUTTON1, false);
|
|
toolbar->EnableTool(ID_BITMAPBUTTON6, false);
|
|
toolbar->EnableTool(ID_BITMAPBUTTON2, false);
|
|
}
|
|
|
|
//Obligatoire avec wxGTK, sinon la toolbar ne s'affiche pas
|
|
#ifdef __WXGTK__
|
|
wxSize tbSize = toolbar->GetSize();
|
|
gtk_widget_set_usize( toolbar->m_widget, tbSize.GetWidth(), tbSize.GetHeight() );
|
|
#endif
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Redimensionement de la toolbar
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OntoolbarPanelResize(wxSizeEvent& event)
|
|
{
|
|
toolbar->SetSize(toolbarPanel->GetSize().x, -1);
|
|
}
|
|
|
|
void EditorObjectList::EnableAll()
|
|
{
|
|
wxMenuItemList list = ContextMenu.GetMenuItems();
|
|
wxMenuItemList::iterator iter;
|
|
for (iter = list.begin(); iter != list.end(); ++iter)
|
|
{
|
|
(*iter)->Enable(true);
|
|
}
|
|
|
|
toolbar->Enable(true);
|
|
}
|
|
|
|
void EditorObjectList::DisableAll()
|
|
{
|
|
wxMenuItemList list = ContextMenu.GetMenuItems();
|
|
wxMenuItemList::iterator iter;
|
|
for (iter = list.begin(); iter != list.end(); ++iter)
|
|
{
|
|
(*iter)->Enable(false);
|
|
}
|
|
|
|
toolbar->Enable(false);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Menu contextuel
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnMoreOptions( wxCommandEvent& event )
|
|
{
|
|
PopupMenu( &ContextMenu );
|
|
}
|
|
|
|
/**
|
|
* Popup context menu
|
|
*/
|
|
void EditorObjectList::OnobjectsListItemMenu(wxTreeEvent& event)
|
|
{
|
|
wxFocusEvent unusedEvent;
|
|
OnSetFocus(unusedEvent);
|
|
|
|
item = event.GetItem();
|
|
wxArrayTreeItemIds selection;
|
|
|
|
if ( item == objectsList->GetRootItem())
|
|
PopupMenu( &rootContextMenu );
|
|
else if ( objectsList->GetSelections(selection) > 1 )
|
|
{
|
|
PopupMenu( &multipleContextMenu );
|
|
}
|
|
else
|
|
{
|
|
//Find object so as to update automatisms list
|
|
string name = static_cast<string>(objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 ) return;
|
|
|
|
//Remove already present automatisms from menu
|
|
for (vector < std::pair<long, unsigned int> >::iterator idIter = idForAutomatism.begin();
|
|
idIter != idForAutomatism.end();
|
|
++idIter)
|
|
{
|
|
automatismsMenu->Destroy(idIter->first);
|
|
}
|
|
idForAutomatism.clear();
|
|
|
|
//Add each automatism of the object
|
|
vector < unsigned int > allObjectAutomatisms = objects->at(i)->GetAllAutomatismsNameIdentifiers();
|
|
for(unsigned int j = 0;j<allObjectAutomatisms.size();++j)
|
|
{
|
|
//Find an identifier for the menu item
|
|
long id = wxNewId();
|
|
|
|
idForAutomatism.push_back(std::make_pair(id, allObjectAutomatisms[j]));
|
|
wxMenuItem * menuItem = new wxMenuItem(automatismsMenu, id,
|
|
objects->at(i)->GetAutomatism(allObjectAutomatisms[j])->GetName());
|
|
automatismsMenu->Insert(0, menuItem);
|
|
Connect(id,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&EditorObjectList::OnAutomatismSelected);
|
|
}
|
|
|
|
|
|
//Popup menu
|
|
PopupMenu( &ContextMenu );
|
|
}
|
|
}
|
|
|
|
void EditorObjectList::OnobjectsListItemRightClick(wxTreeEvent& event)
|
|
{
|
|
item = event.GetItem();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// La selection a changé.
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnobjectsListSelectionChanged(wxTreeEvent& event)
|
|
{
|
|
wxFocusEvent unusedEvent;
|
|
OnSetFocus(unusedEvent);
|
|
|
|
item = event.GetItem();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Recréer le TreeCtrl
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::Refresh()
|
|
{
|
|
objectsList->DeleteAllItems();
|
|
objectsImagesList->RemoveAll();
|
|
|
|
BitmapGUIManager *bitmapGUIManager = BitmapGUIManager::getInstance();
|
|
objectsImagesList->Add(bitmapGUIManager->objects24);
|
|
|
|
objectsList->AddRoot( _( "Tous les objets" ), 0 );
|
|
|
|
//Generate thumbnails
|
|
for ( unsigned int i = 0;i < objects->size();i++ )
|
|
{
|
|
int thumbnailID = -1;
|
|
wxBitmap thumbnail;
|
|
if ( objects->at(i)->GenerateThumbnail(game, thumbnail) )
|
|
{
|
|
objectsImagesList->Add(thumbnail);
|
|
thumbnailID = objectsImagesList->GetImageCount()-1;
|
|
}
|
|
|
|
objectsList->AppendItem( objectsList->GetRootItem(), objects->at( i )->GetName(), thumbnailID );
|
|
|
|
}
|
|
|
|
objectsList->ExpandAll();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Clic sur le bouton de rafraichissement
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnRefreshBtClick( wxCommandEvent& event )
|
|
{
|
|
Refresh();
|
|
}
|
|
|
|
|
|
void EditorObjectList::OnAutomatismSelected(wxCommandEvent & event)
|
|
{
|
|
string name = static_cast<string>(objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 ) return;
|
|
|
|
unsigned int autoType = 0;
|
|
for (unsigned int i = 0;i<idForAutomatism.size();++i)
|
|
{
|
|
if ( idForAutomatism[i].first == event.GetId() )
|
|
autoType = idForAutomatism[i].second;
|
|
}
|
|
|
|
objects->at(i)->GetAutomatism(autoType)->EditAutomatism(this, game, scene, mainEditorCommand);
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Editer un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OneditMenuISelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast<string>(objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i != -1 )
|
|
{
|
|
objects->at(i)->EditObject(this, game, mainEditorCommand);
|
|
if ( scene ) scene->wasModified = true;
|
|
|
|
//Reload thumbnail
|
|
int thumbnailID = -1;
|
|
wxBitmap thumbnail;
|
|
if ( objects->at(i)->GenerateThumbnail(game, thumbnail) )
|
|
{
|
|
objectsImagesList->Add(thumbnail);
|
|
thumbnailID = objectsImagesList->GetImageCount()-1;
|
|
}
|
|
|
|
objectsList->SetItemImage( item, thumbnailID );
|
|
}
|
|
else
|
|
{
|
|
wxLogWarning( _( "L'objet à éditer n'a pas été trouvé." ) );
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Editer un objet en double cliquant dessus
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnobjectsListItemActivated(wxTreeEvent& event)
|
|
{
|
|
wxFocusEvent unusedEvent;
|
|
OnSetFocus(unusedEvent);
|
|
|
|
item = event.GetItem();
|
|
wxCommandEvent eventUseless;
|
|
OneditMenuISelected( eventUseless );
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Modifier le nom d'un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OneditNameMenuISelected(wxCommandEvent& event)
|
|
{
|
|
wxFocusEvent unusedEvent;
|
|
OnSetFocus(unusedEvent);
|
|
|
|
wxTreeItemId ItemNul = NULL;
|
|
if ( item != ItemNul && objectsList->GetItemText( item ) != _( "Tous les objets" ) )
|
|
{
|
|
objectsList->EditLabel( item );
|
|
}
|
|
else
|
|
{
|
|
wxLogStatus( _( "Aucun objet sélectionné" ) );
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Ajouter un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnaddObjMenuISelected(wxCommandEvent& event)
|
|
{
|
|
ObjectTypeChoice chooseTypeDialog(this, game);
|
|
if ( chooseTypeDialog.ShowModal() == 0 )
|
|
return;
|
|
|
|
wxString name = _("Nouvel_objet");
|
|
int i = 0;
|
|
|
|
//Tant qu'un objet avec le même nom existe, on ajoute un chiffre
|
|
while ( Picker::PickOneObject( objects, ( string ) name ) != -1 )
|
|
{
|
|
i++;
|
|
name = _("Nouvel_objet")+wxString("_");
|
|
wxString Num =ToString( i );
|
|
|
|
name += Num;
|
|
}
|
|
|
|
//Add a new object of selected type to objects list
|
|
GDpriv::ExtensionsManager * extensionsManager = GDpriv::ExtensionsManager::getInstance();
|
|
objects->push_back( extensionsManager->CreateObject(extensionsManager->GetTypeIdFromString(chooseTypeDialog.selectedObjectType),
|
|
string(name.mb_str())));
|
|
|
|
//And to the TreeCtrl
|
|
wxTreeItemId rootId = objectsList->GetRootItem();
|
|
wxTreeItemId itemAdded = objectsList->AppendItem( rootId, name );
|
|
objectsList->ExpandAll();
|
|
|
|
//Reload thumbnail
|
|
int thumbnailID = -1;
|
|
wxBitmap thumbnail;
|
|
if ( objects->back()->GenerateThumbnail(game, thumbnail) )
|
|
{
|
|
objectsImagesList->Add(thumbnail);
|
|
thumbnailID = objectsImagesList->GetImageCount()-1;
|
|
}
|
|
|
|
objectsList->SetItemImage( itemAdded, thumbnailID );
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
wxLogStatus( _( "L'objet a été correctement ajouté" ) );
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Supprimer un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OndelObjMenuISelected(wxCommandEvent& event)
|
|
{
|
|
wxArrayTreeItemIds selection;
|
|
objectsList->GetSelections(selection);
|
|
std::vector < string > objectsDeleted;
|
|
|
|
int answer = wxMessageBox(selection.GetCount() <= 1 ? _("Supprimer également toutes les références à l'objet dans les groupes et les évènements ( Soit les actions et conditions utilisant l'objet ) ?") :
|
|
wxString::Format(_("Supprimer également toutes les références aux %i objets dans les groupes et les évènements ( Soit les actions et conditions utilisant l'objet ) ?"), selection.GetCount()),
|
|
_("Confirmation de la suppression"), wxYES_NO | wxCANCEL);
|
|
|
|
if ( answer == wxCANCEL ) return;
|
|
|
|
//Removing objects
|
|
for (unsigned int i = 0;i<selection.GetCount();++i)
|
|
{
|
|
std::string objectName = string(objectsList->GetItemText( selection[i] ).mb_str());
|
|
objectsDeleted.push_back(objectName); //Generate also a list containing the names of the objects deleted.
|
|
|
|
if ( selection[i].IsOk() && objectsList->GetRootItem() != selection[i] )
|
|
{
|
|
int id = Picker::PickOneObject( objects, objectName );
|
|
if ( id != -1 )
|
|
{
|
|
vector <unsigned int> automatisms = objects->at(id)->GetAllAutomatismsNameIdentifiers();
|
|
|
|
//Remove objects
|
|
objects->erase( objects->begin() + id );
|
|
|
|
if ( scene )
|
|
{
|
|
if ( answer == wxYES )
|
|
{
|
|
EventsRefactorer::RemoveObjectInEvents(game, *scene, scene->events, objectName);
|
|
for (unsigned int g = 0;g<scene->objectGroups.size();++g)
|
|
{
|
|
if ( scene->objectGroups[g].Find(objectName)) scene->objectGroups[g].RemoveObject(objectName);
|
|
}
|
|
}
|
|
for (unsigned int p = 0;p<scene->initialObjectsPositions.size();++p)
|
|
{
|
|
if ( scene->initialObjectsPositions[p].objectName == objectName )
|
|
{
|
|
scene->initialObjectsPositions.erase(scene->initialObjectsPositions.begin() + p);
|
|
--p;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Remove automatisms shared datas if necessary
|
|
for (unsigned int i = 0;i<automatisms.size();++i)
|
|
RemoveSharedDatasIfNecessary(automatisms[i]);
|
|
}
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
}
|
|
|
|
//Removing items
|
|
void * nothing;
|
|
wxTreeItemId item = objectsList->GetFirstChild( objectsList->GetRootItem(), nothing);
|
|
while( item.IsOk() )
|
|
{
|
|
if ( find(objectsDeleted.begin(), objectsDeleted.end(), string(objectsList->GetItemText( item ).mb_str())) != objectsDeleted.end() )
|
|
{
|
|
objectsList->Delete(item);
|
|
item = objectsList->GetFirstChild(objectsList->GetRootItem(), nothing);
|
|
}
|
|
else
|
|
item = objectsList->GetNextSibling(item);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Edition du nom d'un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnobjectsListBeginLabelEdit(wxTreeEvent& event)
|
|
{
|
|
if ( objectsList->GetItemText( event.GetItem() ) != _( "Tous les objets" ) )
|
|
{
|
|
ancienNom = objectsList->GetItemText( event.GetItem() );
|
|
return;
|
|
}
|
|
|
|
//On ne touche pas au dossier "Tous les objets"
|
|
objectsList->EndEditLabel( event.GetItem(), true );
|
|
}
|
|
|
|
void EditorObjectList::OnobjectsListEndLabelEdit(wxTreeEvent& event)
|
|
{
|
|
if ( event.IsEditCancelled() ) return;
|
|
|
|
string newName = string(event.GetLabel().mb_str());
|
|
|
|
//Be sure there is not already another object with this name
|
|
if ( Picker::PickOneObject( objects, newName ) != -1 )
|
|
{
|
|
wxLogWarning( _( "Impossible de renommer l'objet : un autre objet porte déjà ce nom." ) );
|
|
Refresh();
|
|
return;
|
|
}
|
|
|
|
//Be sure the name is valid
|
|
if ( !CheckObjectName(newName) )
|
|
{
|
|
wxMessageBox(_("Le nom de l'objet contient des espaces, des caractères non autorisés ou représente un nom d'une expression. Utilisez uniquement des lettres, chiffres et underscores ( _ )."), _("Attention"), wxOK | wxICON_EXCLAMATION, this);
|
|
|
|
Refresh();
|
|
return;
|
|
}
|
|
|
|
int i = Picker::PickOneObject( objects, ancienNom );
|
|
if ( i == -1 ) return;
|
|
|
|
objects->at( i )->SetName( newName );
|
|
|
|
if ( scene ) //Change the object name in the scene.
|
|
{
|
|
EventsRefactorer::RenameObjectInEvents(game, *scene, scene->events, ancienNom, newName);
|
|
for (unsigned int p = 0;p<scene->initialObjectsPositions.size();++p)
|
|
{
|
|
if ( scene->initialObjectsPositions[p].objectName == ancienNom ) scene->initialObjectsPositions[p].objectName = newName;
|
|
}
|
|
for (unsigned int g = 0;g<scene->objectGroups.size();++g)
|
|
{
|
|
if ( scene->objectGroups[g].Find(ancienNom))
|
|
{
|
|
scene->objectGroups[g].RemoveObject(ancienNom);
|
|
scene->objectGroups[g].AddObject(newName);
|
|
}
|
|
}
|
|
|
|
scene->wasModified = true;
|
|
}
|
|
objectsList->SetItemText( event.GetItem(), event.GetLabel() );
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Check if an object name is valid
|
|
*/
|
|
bool EditorObjectList::CheckObjectName(std::string name)
|
|
{
|
|
GDpriv::ExtensionsManager * extensionsManager = GDpriv::ExtensionsManager::getInstance();
|
|
const vector < boost::shared_ptr<ExtensionBase> > extensions = extensionsManager->GetExtensions();
|
|
|
|
string allowedCharacter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
|
|
|
|
//Check for invalid names
|
|
bool nameUsedByExpression = extensionsManager->HasExpression(name) || extensionsManager->HasStrExpression(name);
|
|
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)
|
|
{
|
|
//Add each object expression
|
|
std::map<string, ExpressionInfos > allObjExpr = extensions[i]->GetAllExpressionsForObject(objectsTypes[j]);
|
|
for(std::map<string, ExpressionInfos>::const_iterator it = allObjExpr.begin(); it != allObjExpr.end(); ++it)
|
|
{
|
|
if ( name == it->first )
|
|
nameUsedByExpression = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Display warning or errors for invalid names
|
|
return !(name.find_first_not_of(allowedCharacter) != string::npos || nameUsedByExpression);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Rechercher un objet
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnChercherBtClick( wxCommandEvent& event )
|
|
{
|
|
string name = static_cast<string> (wxGetTextFromUser( _( "Entrez l'objet à rechercher" ), _( "Chercher un objet" ) ));
|
|
if ( name == "" ) return;
|
|
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i != -1 )
|
|
{
|
|
//On en a trouvé un, on le sélectionne.
|
|
void * rien;
|
|
wxTreeItemId item = objectsList->GetFirstChild( objectsList->GetRootItem(), rien);
|
|
while( objectsList->GetItemText(item) != name )
|
|
{
|
|
item = objectsList->GetNextSibling( item);
|
|
}
|
|
|
|
objectsList->SelectItem(item);
|
|
|
|
return;
|
|
} else { wxLogMessage("Aucun objet de ce nom trouvé !"); }
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Aide
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnAideBtClick( wxCommandEvent& event )
|
|
{
|
|
HelpFileAccess * helpFileAccess = HelpFileAccess::getInstance();
|
|
helpFileAccess->DisplaySection(10);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Copier
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnCopySelected(wxCommandEvent& event)
|
|
{
|
|
Clipboard * clipboard = Clipboard::getInstance();
|
|
|
|
int i = Picker::PickOneObject( objects, static_cast<string>(objectsList->GetItemText( item )) );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogWarning(_("Impossible de trouver l'objet à copier"));
|
|
return;
|
|
}
|
|
|
|
clipboard->SetObject(objects->at(i));
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Couper
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnCutSelected(wxCommandEvent& event)
|
|
{
|
|
wxTreeItemId ItemNul = NULL;
|
|
if ( item == ItemNul || objectsList->GetItemText( item ) == _( "Tous les objets de la scène" ) )
|
|
return;
|
|
|
|
Clipboard * clipboard = Clipboard::getInstance();
|
|
|
|
int i = Picker::PickOneObject( objects, string(objectsList->GetItemText( item ).mb_str()) );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogWarning(_("Impossible de trouver l'objet à couper"));
|
|
return;
|
|
}
|
|
|
|
objectsList->Delete( item );
|
|
if ( scene ) scene->wasModified = true;
|
|
|
|
clipboard->SetObject(objects->at(i));
|
|
|
|
//Remove automatisms shared datas if necessary
|
|
vector <unsigned int> automatisms = objects->at(i)->GetAllAutomatismsNameIdentifiers();
|
|
|
|
//Remove object
|
|
objects->erase(objects->begin() + i);
|
|
|
|
for (unsigned int j = 0;j<automatisms.size();++j)
|
|
RemoveSharedDatasIfNecessary(automatisms[j]);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Coller
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnPasteSelected(wxCommandEvent& event)
|
|
{
|
|
Clipboard * clipboard = Clipboard::getInstance();
|
|
|
|
if ( !clipboard->HasObject() )
|
|
{
|
|
wxLogWarning(_("Pas d'objet à coller."));
|
|
return;
|
|
}
|
|
|
|
//Add a new object of selected type to objects list
|
|
ObjSPtr object = clipboard->GetObject()->Clone();
|
|
|
|
wxString name = _( "Copie de " ) + object->GetName();
|
|
int i = 0;
|
|
|
|
//Tant qu'un objet avec le même nom existe, on ajoute un chiffre
|
|
while ( Picker::PickOneObject( objects, ( string ) name ) != -1 )
|
|
{
|
|
i++;
|
|
name = _( "Copie de " ) + object->GetName();
|
|
wxString Num =ToString( i );
|
|
|
|
name += Num;
|
|
|
|
}
|
|
|
|
//On donne un nom à l'objet
|
|
object->SetName( static_cast<string>(name) );
|
|
|
|
//On l'ajoute
|
|
objects->push_back( object );
|
|
objectsList->AppendItem( objectsList->GetRootItem(), name );
|
|
|
|
//Add object's automatism's shared datas to scene if necessary
|
|
vector <unsigned int> automatisms = object->GetAllAutomatismsNameIdentifiers();
|
|
for (unsigned int j = 0;j<automatisms.size();++j)
|
|
CreateSharedDatasIfNecessary(object->GetAutomatism(automatisms[j]));
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
wxLogStatus( _( "L'objet a été correctement ajouté" ) );
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Déplacer vers le haut
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnMoveUpSelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast< string > ( objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à déplacer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
if ( i-1 >= 0 )
|
|
{
|
|
//On déplace l'image
|
|
boost::shared_ptr<Object> object = objects->at(i);
|
|
objects->erase(objects->begin() + i );
|
|
objects->insert(objects->begin()+i-1, object);
|
|
|
|
Refresh();
|
|
if ( scene ) scene->wasModified = true;
|
|
|
|
//On la reselectionne
|
|
wxTreeItemId item = objectsList->GetLastChild(objectsList->GetRootItem());
|
|
while ( item.IsOk() )
|
|
{
|
|
if ( objectsList->GetItemText( item ) == name )
|
|
{
|
|
objectsList->SelectItem(item);
|
|
return;
|
|
}
|
|
item = objectsList->GetPrevSibling(item);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// Déplacer vers le bas
|
|
////////////////////////////////////////////////////////////
|
|
void EditorObjectList::OnMoveDownSelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast< string > ( objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à déplacer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
if ( static_cast<unsigned>(i+1) < objects->size() )
|
|
{
|
|
//On déplace l'image
|
|
boost::shared_ptr<Object> object = objects->at(i);
|
|
objects->erase(objects->begin() + i );
|
|
objects->insert(objects->begin()+i+1, object);
|
|
|
|
Refresh();
|
|
if ( scene ) scene->wasModified = true;
|
|
|
|
//On la reselectionne
|
|
wxTreeItemId item = objectsList->GetLastChild(objectsList->GetRootItem());
|
|
while ( item.IsOk() )
|
|
{
|
|
if ( objectsList->GetItemText( item ) == name )
|
|
{
|
|
objectsList->SelectItem(item);
|
|
return;
|
|
}
|
|
item = objectsList->GetPrevSibling(item);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Begin dragging object ( to sceneCanvas )
|
|
*/
|
|
void EditorObjectList::OnobjectsListBeginDrag(wxTreeEvent& event)
|
|
{
|
|
if ( event.GetItem().IsOk() && event.GetItem() != objectsList->GetRootItem() )
|
|
{
|
|
wxTextDataObject objectName(objectsList->GetItemText(event.GetItem()));
|
|
wxDropSource dragSource( this );
|
|
dragSource.SetData( objectName );
|
|
dragSource.DoDragDrop( true );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change ribbon page and connect events with the editor when selected
|
|
*/
|
|
void EditorObjectList::OnSetFocus(wxFocusEvent& event)
|
|
{
|
|
mainEditorCommand.GetRibbon()->SetActivePage(5);
|
|
ConnectEvents();
|
|
}
|
|
|
|
/**
|
|
* Editing initial variables
|
|
*/
|
|
void EditorObjectList::OneditVarMenuISelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast< string > ( objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à éditer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
InitialVariablesDialog dialog(this, objects->at(i)->variablesObjet);
|
|
if ( dialog.ShowModal() == 1 )
|
|
{
|
|
objects->at(i)->variablesObjet = dialog.variables;
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add an automatism to the object
|
|
*/
|
|
void EditorObjectList::OnaddAutomatismItemSelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast< string > ( objectsList->GetItemText( item ));
|
|
int i = Picker::PickOneObject( objects, name );
|
|
if ( i == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à éditer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
AutomatismTypeChoice dialog(this, game);
|
|
if ( dialog.ShowModal() == 1)
|
|
{
|
|
GDpriv::ExtensionsManager * extensionManager = GDpriv::ExtensionsManager::getInstance();
|
|
boost::shared_ptr<Automatism> automatism = extensionManager->CreateAutomatism(dialog.selectedAutomatismType);
|
|
|
|
if (automatism == boost::shared_ptr<Automatism>())
|
|
{
|
|
wxLogError( _( "Impossible de créer l'automatisme." ) );
|
|
return;
|
|
}
|
|
|
|
AutomatismInfo infos = extensionManager->GetAutomatismInfo(dialog.selectedAutomatismType);
|
|
|
|
//Add automatism to object
|
|
automatism->SetName(infos.defaultName);
|
|
for (unsigned int j = 0;objects->at(i)->HasAutomatism(automatism->GetAutomatismId());++j)
|
|
automatism->SetName(infos.defaultName+ToString(j));
|
|
|
|
objects->at(i)->AddAutomatism(automatism);
|
|
|
|
//Add shared datas to scene if necessary
|
|
CreateSharedDatasIfNecessary(automatism);
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
}
|
|
|
|
void EditorObjectList::OndeleteAutomatismItemSelected(wxCommandEvent& event)
|
|
{
|
|
string name = static_cast< string > ( objectsList->GetItemText( item ));
|
|
int id = Picker::PickOneObject( objects, name );
|
|
if ( id == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à éditer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
//Create automatism array
|
|
wxArrayString automatismsStr;
|
|
|
|
//Fill array
|
|
vector <unsigned int> automatisms = objects->at(id)->GetAllAutomatismsNameIdentifiers();
|
|
for (unsigned int i = 0;i<automatisms.size();++i)
|
|
automatismsStr.Add(objects->at(id)->GetAutomatism(automatisms[i])->GetName());
|
|
|
|
int selection = wxGetSingleChoiceIndex(_("Choisissez l'automatisme à supprimer"), _("Choisir l'automatisme à supprimer"), automatismsStr);
|
|
if ( selection == -1 ) return;
|
|
|
|
objects->at(id)->RemoveAutomatism(automatisms[selection]);
|
|
|
|
//Remove shared datas if necessary
|
|
RemoveSharedDatasIfNecessary(automatisms[selection]);
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
|
|
/**
|
|
* Rename an automatism
|
|
*/
|
|
void EditorObjectList::OnrenameAutomatismSelected(wxCommandEvent& event)
|
|
{
|
|
string name = string(objectsList->GetItemText( item ).mb_str());
|
|
int id = Picker::PickOneObject( objects, name );
|
|
if ( id == -1 )
|
|
{
|
|
wxLogStatus( _( "L'objet à éditer n'a pas été trouvé." ) );
|
|
return;
|
|
}
|
|
|
|
//Create automatism array
|
|
wxArrayString automatismsStr;
|
|
|
|
//Fill array
|
|
vector <unsigned int> automatisms = objects->at(id)->GetAllAutomatismsNameIdentifiers();
|
|
for (unsigned int i = 0;i<automatisms.size();++i)
|
|
automatismsStr.Add(objects->at(id)->GetAutomatism(automatisms[i])->GetName());
|
|
|
|
int selection = wxGetSingleChoiceIndex(_("Choisissez l'automatisme à renommer"), _("Choisir l'automatisme à renommer"), automatismsStr);
|
|
if ( selection == -1 ) return;
|
|
|
|
boost::shared_ptr<Automatism> automatism = objects->at(id)->GetAutomatism(automatisms[selection]);
|
|
|
|
std::string newName = string(wxGetTextFromUser("Entrez le nouveau nom de l'automatisme", "Renommer un automatisme", automatism->GetName()).mb_str());
|
|
if ( newName == automatism->GetName() || newName.empty() ) return;
|
|
|
|
//Remove shared datas if necessary
|
|
RemoveSharedDatasIfNecessary(automatism->GetAutomatismId());
|
|
|
|
automatism->SetName(newName);
|
|
CreateSharedDatasIfNecessary(automatism);
|
|
|
|
if ( scene ) scene->wasModified = true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Remove shared datas of an automatism if this automatism is not used anymore
|
|
*/
|
|
void EditorObjectList::RemoveSharedDatasIfNecessary(unsigned int automatismId)
|
|
{
|
|
if ( scene != NULL && scene->automatismsInitialSharedDatas.find(automatismId) != scene->automatismsInitialSharedDatas.end() )
|
|
{
|
|
//Check no object use this automatism anymore
|
|
for (unsigned int i = 0;i<scene->initialObjects.size();++i)
|
|
{
|
|
if (scene->initialObjects[i]->HasAutomatism(automatismId))
|
|
return;
|
|
}
|
|
for (unsigned int i = 0;i<game.globalObjects.size();++i)
|
|
{
|
|
if (game.globalObjects[i]->HasAutomatism(automatismId))
|
|
return;
|
|
}
|
|
|
|
scene->automatismsInitialSharedDatas.erase(automatismId);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create datas shared by an automatism type if these data don't yet exist.
|
|
*/
|
|
void EditorObjectList::CreateSharedDatasIfNecessary(boost::shared_ptr<Automatism> automatism)
|
|
{
|
|
GDpriv::ExtensionsManager * extensionsManager = GDpriv::ExtensionsManager::getInstance();
|
|
|
|
if ( scene != NULL && scene->automatismsInitialSharedDatas.find(automatism->GetAutomatismId()) == scene->automatismsInitialSharedDatas.end() )
|
|
{
|
|
boost::shared_ptr<AutomatismsSharedDatas> automatismsSharedDatas = extensionsManager->CreateAutomatismSharedDatas(automatism->GetTypeName());
|
|
automatismsSharedDatas->SetName(automatism->GetName());
|
|
scene->automatismsInitialSharedDatas[automatismsSharedDatas->GetAutomatismId()] = automatismsSharedDatas;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle accelerators
|
|
*/
|
|
void EditorObjectList::OnobjectsListKeyDown(wxTreeEvent& event)
|
|
{
|
|
if ( event.GetKeyCode() == WXK_DELETE )
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OndelObjMenuISelected( unusedEvent );
|
|
}
|
|
else if (event.GetKeyEvent().GetModifiers() == wxMOD_CMD)
|
|
{
|
|
switch ( event.GetKeyCode() )
|
|
{
|
|
case 67: //Ctrl C
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OnCopySelected( unusedEvent );
|
|
break;
|
|
}
|
|
case 86: //Ctrl-V
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OnPasteSelected( unusedEvent );
|
|
break;
|
|
}
|
|
case 88: //Ctrl-X
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OnCutSelected( unusedEvent );
|
|
break;
|
|
}
|
|
case WXK_UP:
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OnMoveUpSelected( unusedEvent );
|
|
break;
|
|
}
|
|
case WXK_DOWN:
|
|
{
|
|
wxCommandEvent unusedEvent;
|
|
OnMoveDownSelected( unusedEvent );
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|