add action to create course in course creator mode
|
Before Width: | Height: | Size: 647 B After Width: | Height: | Size: 647 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 654 B After Width: | Height: | Size: 654 B |
|
Before Width: | Height: | Size: 674 B After Width: | Height: | Size: 674 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 674 B After Width: | Height: | Size: 674 B |
@@ -15,7 +15,9 @@ public class EducationalCoreIcons {
|
||||
|
||||
public static final Icon CheckTask = load("/icons/com/jetbrains/edu/learning/CheckTask.png"); // 16x16
|
||||
public static final Icon Course = load("/icons/com/jetbrains/edu/learning/Course.png"); // 16x16
|
||||
public static final Icon CourseCreationProjectType = load("/icons/com/jetbrains/edu/learning/CourseCreationProjectType.png"); // 16x16
|
||||
public static final Icon CourseProgress = load("/icons/com/jetbrains/edu/learning/CourseProgress.png"); // 13x13
|
||||
public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16
|
||||
public static final Icon InterpreterGear = load("/icons/com/jetbrains/edu/learning/interpreterGear.png"); // 16x16
|
||||
public static final Icon Lesson = load("/icons/com/jetbrains/edu/learning/Lesson.png"); // 16x16
|
||||
public static final Icon LessonCompl = load("/icons/com/jetbrains/edu/learning/LessonCompl.png"); // 16x16
|
||||
|
||||
@@ -45,6 +45,11 @@
|
||||
<add-to-group group-id="CCProjectViewGroup" anchor="last"/>
|
||||
</action>
|
||||
<action class="com.jetbrains.edu.coursecreator.PyCCChangeCourseInfo" id="ChangeCourseInfo" overrides="true"/>
|
||||
|
||||
<action id="Edu.CCNewCourse" class="com.jetbrains.edu.coursecreator.PyCCCreateCourseAction">
|
||||
<add-to-group group-id="WelcomeScreen.QuickStart" anchor="after" relative-to-action="Edu.StartCourse"/>
|
||||
<add-to-group group-id="FileMenu" anchor="after" relative-to-action="Edu.StartCourse"/>
|
||||
</action>
|
||||
</actions>
|
||||
|
||||
<project-components>
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.jetbrains.edu.coursecreator;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.AbstractNewProjectDialog;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.DefaultActionGroup;
|
||||
import com.intellij.openapi.actionSystem.Presentation;
|
||||
import com.jetbrains.edu.learning.StudySettings;
|
||||
import icons.EducationalCoreIcons;
|
||||
|
||||
public class PyCCCreateCourseAction extends AnAction {
|
||||
public PyCCCreateCourseAction() {
|
||||
super("Create New Course", "Create New Course", EducationalCoreIcons.EducationalProjectType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
AbstractNewProjectDialog dialog = new AbstractNewProjectDialog() {
|
||||
@Override
|
||||
protected DefaultActionGroup createRootStep() {
|
||||
return new PyCCCreateCourseProjectStep();
|
||||
}
|
||||
};
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
Presentation presentation = e.getPresentation();
|
||||
presentation.setEnabledAndVisible(StudySettings.getInstance().isCourseCreatorEnabled());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.jetbrains.edu.coursecreator;
|
||||
|
||||
import com.intellij.platform.DirectoryProjectGenerator;
|
||||
import com.jetbrains.python.newProject.steps.PyCharmNewProjectStep;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
class PyCCCreateCourseProjectStep extends PyCharmNewProjectStep {
|
||||
|
||||
public PyCCCreateCourseProjectStep() {
|
||||
super(new MyCustomization());
|
||||
}
|
||||
|
||||
protected static class MyCustomization extends Customization {
|
||||
private final PyCCProjectGenerator myGenerator = new PyCCProjectGenerator();
|
||||
public MyCustomization() {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected DirectoryProjectGenerator[] getProjectGenerators() {
|
||||
return new DirectoryProjectGenerator[] {};
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected DirectoryProjectGenerator createEmptyProjectGenerator() {
|
||||
return myGenerator;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@ import com.jetbrains.python.PythonLanguage;
|
||||
import com.jetbrains.python.newProject.PyNewProjectSettings;
|
||||
import com.jetbrains.python.newProject.PythonProjectGenerator;
|
||||
import com.jetbrains.python.remote.PyProjectSynchronizer;
|
||||
import icons.InteractiveLearningPythonIcons;
|
||||
import icons.EducationalCoreIcons;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -48,7 +48,7 @@ public class PyCCProjectGenerator extends PythonProjectGenerator<PyNewProjectSet
|
||||
@Nullable
|
||||
@Override
|
||||
public Icon getLogo() {
|
||||
return InteractiveLearningPythonIcons.CourseCreationProjectType;
|
||||
return EducationalCoreIcons.CourseCreationProjectType;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,18 +2,12 @@ package com.jetbrains.edu.learning;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightSettings;
|
||||
import com.intellij.ide.util.PropertiesComponent;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.openapi.components.ApplicationComponent;
|
||||
import com.intellij.openapi.extensions.ExtensionPoint;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.extensions.ExtensionsArea;
|
||||
import com.intellij.openapi.fileTypes.FileTypeManager;
|
||||
import com.intellij.openapi.project.ex.ProjectManagerEx;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.platform.DirectoryProjectGenerator;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
import com.jetbrains.edu.coursecreator.PyCCProjectGenerator;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
|
||||
import java.io.File;
|
||||
@@ -21,7 +15,6 @@ import java.io.File;
|
||||
@SuppressWarnings({"UtilityClassWithoutPrivateConstructor", "UtilityClassWithPublicConstructor"})
|
||||
public class PyStudyInitialConfigurator implements ApplicationComponent {
|
||||
@NonNls private static final String CONFIGURED_V40 = "StudyPyCharm.InitialConfiguration40";
|
||||
private final PyCCProjectGenerator myGenerator = new PyCCProjectGenerator();
|
||||
|
||||
/**
|
||||
* @noinspection UnusedParameters
|
||||
@@ -36,20 +29,5 @@ public class PyStudyInitialConfigurator implements ApplicationComponent {
|
||||
FileUtil.delete(courses);
|
||||
propertiesComponent.setValue(CONFIGURED_V40, "true");
|
||||
}
|
||||
ApplicationManager.getApplication().getMessageBus().connect().subscribe(StudySettings.SETTINGS_CHANGED, () -> {
|
||||
ExtensionsArea rootArea = Extensions.getArea(null);
|
||||
final boolean creatorEnabled = StudySettings.getInstance().isCourseCreatorEnabled();
|
||||
final ExtensionPoint<DirectoryProjectGenerator> extensionPoint = rootArea.getExtensionPoint(DirectoryProjectGenerator.EP_NAME);
|
||||
if (creatorEnabled) {
|
||||
if (!extensionPoint.hasExtension(myGenerator)) {
|
||||
extensionPoint.registerExtension(myGenerator);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (extensionPoint.hasExtension(myGenerator)) {
|
||||
extensionPoint.unregisterExtension(myGenerator);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package icons;
|
||||
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* NOTE THIS FILE IS AUTO-GENERATED
|
||||
* DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead
|
||||
*/
|
||||
public class InteractiveLearningPythonIcons {
|
||||
private static Icon load(String path) {
|
||||
return IconLoader.getIcon(path, InteractiveLearningPythonIcons.class);
|
||||
}
|
||||
|
||||
public static final Icon CourseCreationProjectType = load("/icons/com/jetbrains/edu/learning/CourseCreationProjectType.png"); // 16x16
|
||||
public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16
|
||||
}
|
||||
@@ -61,6 +61,7 @@ import com.intellij.openapi.project.ex.ProjectManagerEx;
|
||||
import com.intellij.openapi.startup.StartupManager;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.*;
|
||||
@@ -201,11 +202,15 @@ public class PyCharmEduInitialConfigurator {
|
||||
if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) {
|
||||
GeneralSettings.getInstance().setShowTipsOnStartup(false);
|
||||
patchKeymap();
|
||||
showInitialConfigurationDialog();
|
||||
propertiesComponent.setValue(DISPLAYED_PROPERTY, "true");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) {
|
||||
showInitialConfigurationDialog();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||