From 3061f756dbdc0bd5937df68206b5d759aa832a2d Mon Sep 17 00:00:00 2001 From: Joachim Meyer Date: Sat, 13 Sep 2014 22:47:50 +0200 Subject: [PATCH 1/3] Fixes #563, adds the ability to open a file directly in the IDE (with the right editor), without adding it to the project (Windows). --- Core/Contents/Source/PolyWinCore.cpp | 20 ++++++++++++++++-- IDE/Build/Windows2013/Polycode.rc | Bin 9330 -> 12372 bytes IDE/Build/Windows2013/Polycode.sln | 8 +++---- IDE/Build/Windows2013/resource.h | Bin 3298 -> 4328 bytes .../WindowsShared/PolycodeWinIDEView.cpp | 3 +++ IDE/Contents/Include/PolycodeEditor.h | 4 +++- IDE/Contents/Include/PolycodeEditorManager.h | 2 ++ IDE/Contents/Include/PolycodeIDEApp.h | 1 + IDE/Contents/Source/PolycodeEditor.cpp | 4 ++++ IDE/Contents/Source/PolycodeEditorManager.cpp | 11 ++++++++++ IDE/Contents/Source/PolycodeEntityEditor.cpp | 3 +-- IDE/Contents/Source/PolycodeIDEApp.cpp | 9 ++++++++ 12 files changed, 56 insertions(+), 9 deletions(-) diff --git a/Core/Contents/Source/PolyWinCore.cpp b/Core/Contents/Source/PolyWinCore.cpp index 4f06a0a35..a52c3eac5 100644 --- a/Core/Contents/Source/PolyWinCore.cpp +++ b/Core/Contents/Source/PolyWinCore.cpp @@ -1137,7 +1137,7 @@ std::vector Win32Core::openFilePicker(std::vector ext ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir=NULL; - if(allowMultiple) { + if(!allowMultiple) { ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER; } else { ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT|OFN_EXPLORER; @@ -1147,7 +1147,23 @@ std::vector Win32Core::openFilePicker(std::vector ext if(GetOpenFileName(&ofn)) { if(allowMultiple) { - + String dir = fBuffer; + size_t pos = dir.length(), last = 0; + while (true){ + if (fBuffer[pos + 1] == NULL){ + if (retVec.size() == 0){ + retVec.push_back(dir); + } + break; + } else { + String fileName; + for (last = pos + 1; fBuffer[pos + 1] != NULL; pos++){ + fileName.append(fBuffer[pos + 1]); + } + retVec.push_back(dir + "/" + fileName); + pos++; + } + } } else { retVec.push_back(String(fBuffer)); } diff --git a/IDE/Build/Windows2013/Polycode.rc b/IDE/Build/Windows2013/Polycode.rc index d73e4349ed9eb7946a7d6c4553a62dbeeeda39dd..8f4b134a13c79fbd72ebd3d693dc9115234130d4 100644 GIT binary patch literal 12372 zcmds7Yj4{&6y@gu`wyB53@fsv-PS+gxK8RVi48kR+aZ9FB~6>nb&S|)T429@+c~_x z6-iOD9&OE>^l<-Y{6dMWm%+W|?VsyvsL5swO#;}(YSW_4COrT8%IQZVbaU_K!kMWKXbasMKM;QOm&U%2m zN4R@}cHioy-jRO$cy}MjpP3)=?lJo9;*N|7dra_DtXSktT8iaOdpHFpzhTy=U!Cp8 zty(pJEq_0OXYrnieZC9Y_pN7O?__nvJ?)u!yz;h`pKy$$=tr8&5%cgVR*Nh1e&v_M zyQJm}*JsdZ@%0(XB1FG5L{xX42iE^y!pi7T(1$*ZVA(^vlD>pz7~oD1{l(TfQqDLcu5}zcgar@5ztnsWf76Gh_X4TM$13-A zmcG@0 z!w|FHm_LEy0tkF0WB6%m(lS6*gkcDd56rJX)CIM5k?aA-)OttSmdgXi4WB91Zo4()o-0ro-VaVh%FtqvB+bKoKNWfS73zELYP30LJ}hN7xOGhD?enn<)c zC%ce8<9No1aoc!a$jguh#+3uCy^IIcZmaUr#Zi@;imVJr6KcwNbw(Nsz9b}psXJ#5BXZcmDInQ?O3d7utczcMY&Y{n9 z&_I1C<`e!jA6W|1A}^U$u!5@&x-N{Ib>wMuq?e`&ViTb`_;K@f$M5Ifgn z*C%CBtWpt1Ae0wJ`Eh6c2;>CX!;IP2-rs9bqDYwGF!mmJlqmkZ9*I8-=iY`cmTQ8` z#cXc+f$DQN*WoTA%rH87Q3m)_aB~owt!G`o^9)AS>qAP6w3sZ zkRs*@j4oM4+O4b=zIGDHd#k50EOIZ?mk@`qoy-JTRc(hzG~gX{msRlvsE;A@xkN4s z%5sFF5vR2gy773(6V<+=Hbms+1$89X+@_Af$=9~_$@quM#8BJ5Pd^zE|SSIkqtp=lz#{payGDd)!rAjHL7bx*Z~2@* zxB9nP=Za2S^5?>?n6zy9%1FJ_=WO{4E0UB=7l%X|%*&+yGzO=Op71^KsGr$kC=JyK zwj!As;*Msz(dpH;I=vcNCvsU~x+_pK#`71hH-9W6q`Z@X>r zlt*A8e>CzcLew5lc{Cm3$>QiZqV{;oGqDg4Et?rw9L=YYS8=o+(`P>>l8D{K)}BA* zS#ro9&5m6RuAQ~Vqm@VZt=YNY(F!OdhJ0Pr#nu+jDLe%$u1^XyBE+M05Eny+KBhmE zsd$KTztiqJN{FW|U(z+1U&xp2yAHjqe93Sz4A(uS#c9B}I93bv3Oh3lM$@w|vfMF5n}P z{_XLwni_kvi-)twch*?$?~cynX=9h-O(jotXAx`~&1LBP)i10F@C|u<_2kzM5#`zg z2CY%V5w+o1wfHyVSXn;(InXur6>6cr7BrRS*PUneZ5BMsWme1&X%ozmS&QJ#K<+tA zP;24tK-MyuOVh_B_>RZ@p?9`gz^_rPAIPpy?%2Ft^<83Qg8Qu5aF?jm7UuT*6?dMp zrpQ_u=i@ccG~<)qjBnA0m0;G=EQdgf@JTjVSrs%UkwO^jTMJxLsiMS7|=_7t) z#fQ77$`0*U*2jI8VxApTLeFw-2N?L}Zi#`_Af2Y9AqP?#wDXz7%d& zgr?xLR#PUBr@IfPoC@ydDm%Uu73V-bhgMKuS#v0oLh-J!Cc82>s|w?y(F%*U+|PFf w%lp6XxNNuEnp#YM=I(zNZ$q9c57n2seBPXMqAS+!8LV8s0fzhT<9i?f1E9OO!2kdN delta 1762 zcmb7FT}V@582(HhXWQ94o}HbYoin$y<2JXNBK;vHk*lVX=$bk-247t8> z2uj{Ay6VC!kqW~uLc9oyAnKwbyv;yDqPz%-ATN5q@9Ye%P3>ar``+`s&-1)LXZvvG zd)M4zb?7|NNt_Il0=YmY$T>2G_kKK$vfC9HY1Zafs@JOOUBp3BHwBk$r!`7@fG%rv8nU;n3q<&_y8mw8frjER8q~AROdVn+S3Yr9VMKiv*}jArAxRqiGxeQnhF(L-5G#SiVr4b ziE1}*KYw!y1Nd8)f+=4kzF};Ox0slP-A5Igwo@qjf{)699XYb<$g;X$`9n0zwQ0ie TPJ2GTp2%(cuQfl?{A1T2V(@BP diff --git a/IDE/Build/Windows2013/Polycode.sln b/IDE/Build/Windows2013/Polycode.sln index 02b3dad1f..67ae375fa 100644 --- a/IDE/Build/Windows2013/Polycode.sln +++ b/IDE/Build/Windows2013/Polycode.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2013 for Windows Desktop -VisualStudioVersion = 12.0.21005.1 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Polycode", "Polycode.vcxproj", "{D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}" EndProject @@ -18,8 +18,8 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|Win32.ActiveCfg = Debug|x64 - {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|Win32.Build.0 = Debug|x64 + {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|Win32.ActiveCfg = Debug|Win32 + {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|Win32.Build.0 = Debug|Win32 {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|x64.ActiveCfg = Debug|x64 {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Debug|x64.Build.0 = Debug|x64 {D6C2171B-9167-4FB6-851A-DC1CEDCFC43D}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/IDE/Build/Windows2013/resource.h b/IDE/Build/Windows2013/resource.h index de8ce96948a0217bac086562161c9359c81e324c..e1e0b7a7f1f58e627118b36c7b78069335cc413d 100644 GIT binary patch delta 616 zcmY*W&ubGw6n>N4?2pO1L=8*Ylr&pZs`#U(X_7tJA5j#dEuj|dK`BPCAQ3`EkDfi0 zOh56c9_ponpn?Yv(!ZrAj~3?Sq4;*T3i6m4=DqKI^S*Bm#(u`5W`2#H(m>6&Zg0{f z8qyZ;HM&IudPq;`8TI+zrwxndHu{p{HDQlMzzofG4wClUG8jL~*mG{Z56*s7rBNcS$?p$;vp z!}FpI5md0^6mh|kN}of+X<%1ObD?6z2E9bfv_kh7jkiuasd z-1_HMVg#r4&<^r9_|Ll81OX1Lo2kzUPP#Ehc8GPml(9<;Y-8Sc`!5lG+bJ50c~jWV zo3RsCd6oF5tZPa~cyCQjF3=K3CbmZlw95AMsA24wp}IP(;HcnzeId66cAW@63S~5c GPk#XB1*nn$ delta 479 zcmXYt%}X0m6vgkG$;>$KO>~q&6g4J7=)%?}(M*gM3C0hE5T&#WODWXWf*`tRUAPhK zAJA%#`%)Kf1g#%SLGUlojY|brZWY(jJI`=8@80vfhjZU;>ZW}o+#DGg{!Bk;p1x9& z7HEmS&?2pHH_!byo-FdKkK!chHCK|})Au?(N2>>?{Q}!Y8*C$iQDef*QHF96jSKgc znxHAF&^T`uv2UiZ;kKaW`l5(#E9wG#lpcP{60YP+>`94-xNjBNBa2PZftu`L_R&fG zQLT~WL{f%AHc#VBwc%b>Q1wa-ExWzA^g1<>rHm$W@g(Nrq0)x+Sa)_BpKOU=b|?mQ zjQ_S&Wj^a2#~kF%-=Yh9w&#>-nr3Jgf1P2}oFRN@7rt+se^HE diff --git a/IDE/Build/WindowsShared/PolycodeWinIDEView.cpp b/IDE/Build/WindowsShared/PolycodeWinIDEView.cpp index c6f06ab8e..3504734a8 100644 --- a/IDE/Build/WindowsShared/PolycodeWinIDEView.cpp +++ b/IDE/Build/WindowsShared/PolycodeWinIDEView.cpp @@ -70,6 +70,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_FILE_OPEN_PROJECT: globalApp->openProject(); break; + case ID_FILE_OPEN_FILE: + globalApp->openFilePicker(); + break; case ID_FILE_CLOSE_FILE: globalApp->closeFile(); break; diff --git a/IDE/Contents/Include/PolycodeEditor.h b/IDE/Contents/Include/PolycodeEditor.h index c02b6fac8..8261c03a5 100644 --- a/IDE/Contents/Include/PolycodeEditor.h +++ b/IDE/Contents/Include/PolycodeEditor.h @@ -127,7 +127,9 @@ class PolycodeEditorFactory { bool canHandleExtension(String extension); + std::vector getExtensions(); + protected: - std::vector extensions; + std::vector extensions; }; diff --git a/IDE/Contents/Include/PolycodeEditorManager.h b/IDE/Contents/Include/PolycodeEditorManager.h index 5854b1d52..f93ec3794 100644 --- a/IDE/Contents/Include/PolycodeEditorManager.h +++ b/IDE/Contents/Include/PolycodeEditorManager.h @@ -38,6 +38,8 @@ class PolycodeEditorManager : public EventDispatcher { void registerEditorFactory(PolycodeEditorFactory *editorFactory); PolycodeEditorFactory *getEditorFactoryForExtension(String extension); + + std::vector getExtensionsWithEditor(); void handleEvent(Event *event); diff --git a/IDE/Contents/Include/PolycodeIDEApp.h b/IDE/Contents/Include/PolycodeIDEApp.h index e90347d44..5c64cb8ef 100644 --- a/IDE/Contents/Include/PolycodeIDEApp.h +++ b/IDE/Contents/Include/PolycodeIDEApp.h @@ -68,6 +68,7 @@ class PolycodeIDEApp : public EventDispatcher { void openFileInProject(PolycodeProject *project, String filePath); void openFile(OSFileEntry file); + void openFilePicker(); void stopProject(); diff --git a/IDE/Contents/Source/PolycodeEditor.cpp b/IDE/Contents/Source/PolycodeEditor.cpp index 37e33b679..4afe3f086 100644 --- a/IDE/Contents/Source/PolycodeEditor.cpp +++ b/IDE/Contents/Source/PolycodeEditor.cpp @@ -42,6 +42,10 @@ bool PolycodeEditorFactory::canHandleExtension(String extension) { return false; } +std::vector PolycodeEditorFactory::getExtensions(){ + return extensions; +} + void PolycodeEditor::setFilePath(String newPath) { filePath = newPath; } diff --git a/IDE/Contents/Source/PolycodeEditorManager.cpp b/IDE/Contents/Source/PolycodeEditorManager.cpp index bddfc7241..066f9d197 100644 --- a/IDE/Contents/Source/PolycodeEditorManager.cpp +++ b/IDE/Contents/Source/PolycodeEditorManager.cpp @@ -45,6 +45,17 @@ PolycodeEditorFactory *PolycodeEditorManager::getEditorFactoryForExtension(Strin return NULL; } +std::vector PolycodeEditorManager::getExtensionsWithEditor(){ + std::vector extensions; + for (int i = 0; i < editorFactories.size(); i++) { + PolycodeEditorFactory *factory = editorFactories[i]; + for (int e = 0; e < factory->getExtensions().size(); e++){ + extensions.push_back(CoreFileExtension(factory->getExtensions()[e], factory->getExtensions()[e])); + } + } + return extensions; +} + PolycodeEditor *PolycodeEditorManager::createEditorForExtension(String extension) { for(int i=0;i < editorFactories.size(); i++) { PolycodeEditorFactory *factory = editorFactories[i]; diff --git a/IDE/Contents/Source/PolycodeEntityEditor.cpp b/IDE/Contents/Source/PolycodeEntityEditor.cpp index 91e001fb0..d5b120f78 100644 --- a/IDE/Contents/Source/PolycodeEntityEditor.cpp +++ b/IDE/Contents/Source/PolycodeEntityEditor.cpp @@ -2535,5 +2535,4 @@ void PolycodeEntityEditor::saveFile() { void PolycodeEntityEditor::Resize(int x, int y) { mainSizer->Resize(x, y); PolycodeEditor::Resize(x,y); -} - +} \ No newline at end of file diff --git a/IDE/Contents/Source/PolycodeIDEApp.cpp b/IDE/Contents/Source/PolycodeIDEApp.cpp index c57cff82f..c2e6b9404 100644 --- a/IDE/Contents/Source/PolycodeIDEApp.cpp +++ b/IDE/Contents/Source/PolycodeIDEApp.cpp @@ -703,6 +703,15 @@ void PolycodeIDEApp::openFile(OSFileEntry file) { } } +void PolycodeIDEApp::openFilePicker() { + std::vector extensions = editorManager->getExtensionsWithEditor(); + extensions.insert(extensions.begin(), CoreFileExtension("All Types", "*")); + std::vector filePaths = core->openFilePicker(extensions, true); + for (int f = 0; f < filePaths.size(); f++){ + openFile(OSFileEntry(filePaths[f], OSFileEntry::TYPE_FILE)); + } +} + void PolycodeIDEApp::handleEvent(Event *event) { if(event->getDispatcher() == frame->assetImporterWindow) { From 4b6fae14a9f103b9a8e4709885ba99a27784b558 Mon Sep 17 00:00:00 2001 From: Joachim Meyer Date: Sat, 13 Sep 2014 23:13:00 +0200 Subject: [PATCH 2/3] Hopefully (not tested) add the function to Linux IDE to open files directly. --- IDE/Contents/Source/PolycodeIDEApp.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/IDE/Contents/Source/PolycodeIDEApp.cpp b/IDE/Contents/Source/PolycodeIDEApp.cpp index c2e6b9404..f67252a4a 100644 --- a/IDE/Contents/Source/PolycodeIDEApp.cpp +++ b/IDE/Contents/Source/PolycodeIDEApp.cpp @@ -187,6 +187,7 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() { fileEntry->addItem("New File", "new_file", KEY_n); fileEntry->addItem("New Project", "new_project", KEY_LSHIFT, KEY_n); fileEntry->addItem("New Folder", "new_folder", KEY_LSHIFT, KEY_f); + fileEntry->addItem("Open File", "open_file", KEY_o); fileEntry->addItem("Open Project", "open_project", KEY_LSHIFT, KEY_o); fileEntry->addItem("Close Project", "close_project", KEY_LSHIFT, KEY_w); fileEntry->addItem("Close File", "close_file", KEY_w); @@ -781,7 +782,9 @@ void PolycodeIDEApp::handleEvent(Event *event) { newProject(); } else if(action == "new_folder") { newGroup(); - } else if(action == "open_project") { + } else if (action == "open_file") { + openFilePicker(); + } else if (action == "open_project") { openProject(); } else if(action == "close_project") { closeProject(); From 9d8110d89ad71a5a4eeff32615306fb569e706dd Mon Sep 17 00:00:00 2001 From: Joachim Meyer Date: Mon, 15 Sep 2014 14:34:51 +0200 Subject: [PATCH 3/3] Fix PolycodeIDEApp::openFilePicker() to be able to use PolycodeUI file dialogs. --- IDE/Contents/Source/PolycodeIDEApp.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/IDE/Contents/Source/PolycodeIDEApp.cpp b/IDE/Contents/Source/PolycodeIDEApp.cpp index f67252a4a..6014f8a89 100644 --- a/IDE/Contents/Source/PolycodeIDEApp.cpp +++ b/IDE/Contents/Source/PolycodeIDEApp.cpp @@ -706,11 +706,21 @@ void PolycodeIDEApp::openFile(OSFileEntry file) { void PolycodeIDEApp::openFilePicker() { std::vector extensions = editorManager->getExtensionsWithEditor(); + #ifdef USE_POLYCODEUI_FILE_DIALOGS + std::vector exts; + for(int e = 0; e < extensions.size(); e++){ + exts.push_back((extensions[e].extension)); + } + frame->showFileBrowser(CoreServices::getInstance()->getCore()->getUserHomeDirectory(), false, exts, false); + frame->fileDialog->addEventListener(this, UIEvent::OK_EVENT); + frame->fileDialog->action = "openFile"; +#else extensions.insert(extensions.begin(), CoreFileExtension("All Types", "*")); std::vector filePaths = core->openFilePicker(extensions, true); for (int f = 0; f < filePaths.size(); f++){ openFile(OSFileEntry(filePaths[f], OSFileEntry::TYPE_FILE)); } +#endif } void PolycodeIDEApp::handleEvent(Event *event) { @@ -768,6 +778,8 @@ void PolycodeIDEApp::handleEvent(Event *event) { frame->assetImporterWindow->setSourceFileAndTargetFolder(path, projectManager->activeFolder, projectManager->activeFolder.replace(projectManager->getActiveProject()->getRootFolder(), "")); frame->showModal(frame->assetImporterWindow); frame->assetImporterWindow->addEventListener(this, UIEvent::OK_EVENT); + } else if(frame->fileDialog->action == "openFile") { + openFile(OSFileEntry(path, OSFileEntry::TYPE_FILE)); } } }