feat: add actions for getting and selecting contest and problem

This commit is contained in:
Johannes Frohnmeyer 2024-05-12 13:37:23 +02:00
parent 8b4b8bf540
commit d44e00afa0
Signed by: Johannes
GPG Key ID: E76429612C2929F4
4 changed files with 207 additions and 0 deletions

View File

@ -0,0 +1,83 @@
package io.gitlab.jfronny.sdom.actions
import com.intellij.icons.AllIcons
import com.intellij.notification.Notification
import com.intellij.notification.NotificationAction
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.ex.ComboBoxAction
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.ui.popup.JBPopup
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.util.Condition
import io.gitlab.jfronny.sdom.SDom
import io.gitlab.jfronny.sdom.model.Contest
import java.awt.Dimension
import javax.swing.JComponent
class SDContestSelectionComboBoxAction : ComboBoxAction(), DumbAware {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
private val icon = AllIcons.Actions.ListChanges
override fun update(e: AnActionEvent) {
e.presentation.isEnabledAndVisible = SDom.loggedIn
e.presentation.icon = icon
SDom.currentContest?.let { e.presentation.setText(it.name, false) }
}
override fun createPopupActionGroup(button: JComponent, dataContext: DataContext): DefaultActionGroup {
val actionGroup = DefaultActionGroup()
actionGroup.addAll(SDom.contests.map { SelectContestAction(it, it == SDom.currentContest) })
return actionGroup
}
override fun createActionPopup(
group: DefaultActionGroup,
context: DataContext,
disposeCallback: Runnable?
): JBPopup {
val popup = JBPopupFactory.getInstance().createActionGroupPopup(
myPopupTitle,
group,
context,
null,
shouldShowDisabledActions(),
disposeCallback,
maxRows,
preselectCondition,
null
)
popup.setMinimumSize(Dimension(minWidth, minHeight))
return popup
}
override fun getPreselectCondition(): Condition<AnAction> =
Condition<AnAction> { if (it is SelectContestAction) it.isSelected else false }
override fun shouldShowDisabledActions(): Boolean = true
private class SelectContestAction(
private val contest: Contest,
val isSelected: Boolean
) : DumbAwareAction() {
init {
val name = contest.name
templatePresentation.setText(name, false)
}
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
SDom.currentContest = contest
}
}
}
class SDContestSelectionNotificationAction(text: String) : NotificationAction(text) {
constructor() : this("")
private val selectionAction = SDContestSelectionComboBoxAction()
override fun actionPerformed(e: AnActionEvent, notification: Notification) = selectionAction.actionPerformed(e)
}

View File

@ -0,0 +1,21 @@
package io.gitlab.jfronny.sdom.actions
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareAction
import io.gitlab.jfronny.sdom.SDom
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
class SDGetContestsAction : DumbAwareAction() {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
CoroutineScope(Job() + Dispatchers.IO).launch {
SDom.getContests()
SDom.loadProperties(e.project)
}
}
}

View File

@ -0,0 +1,20 @@
package io.gitlab.jfronny.sdom.actions
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareAction
import io.gitlab.jfronny.sdom.SDom
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
class SDGetProblemsAction : DumbAwareAction() {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
CoroutineScope(Job() + Dispatchers.IO).launch {
SDom.getProblems()
}
}
}

View File

@ -0,0 +1,83 @@
package io.gitlab.jfronny.sdom.actions
import com.intellij.icons.AllIcons
import com.intellij.notification.Notification
import com.intellij.notification.NotificationAction
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.ex.ComboBoxAction
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.ui.popup.JBPopup
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.util.Condition
import io.gitlab.jfronny.sdom.SDom
import io.gitlab.jfronny.sdom.model.Problem
import java.awt.Dimension
import javax.swing.JComponent
class SDProblemSelectionComboBoxAction : ComboBoxAction(), DumbAware {
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
private val icon = AllIcons.Actions.ListChanges
override fun update(e: AnActionEvent) {
e.presentation.isEnabledAndVisible = SDom.loggedIn
e.presentation.icon = icon
SDom.currentProblem?.let { e.presentation.setText(it.name, false) }
}
override fun createPopupActionGroup(button: JComponent, dataContext: DataContext): DefaultActionGroup {
val actionGroup = DefaultActionGroup()
actionGroup.addAll(SDom.problems.map { SelectProblemAction(it, it == SDom.currentProblem) })
return actionGroup
}
override fun createActionPopup(
group: DefaultActionGroup,
context: DataContext,
disposeCallback: Runnable?
): JBPopup {
val popup = JBPopupFactory.getInstance().createActionGroupPopup(
myPopupTitle,
group,
context,
null,
shouldShowDisabledActions(),
disposeCallback,
maxRows,
preselectCondition,
null
)
popup.setMinimumSize(Dimension(minWidth, minHeight))
return popup
}
override fun getPreselectCondition(): Condition<AnAction> =
Condition<AnAction> { if (it is SelectProblemAction) it.isSelected else false }
override fun shouldShowDisabledActions(): Boolean = true
private class SelectProblemAction(
private val problem: Problem,
val isSelected: Boolean
) : DumbAwareAction() {
init {
val name = problem.name
templatePresentation.setText(name, false)
}
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
override fun actionPerformed(e: AnActionEvent) {
SDom.currentProblem = problem
}
}
}
class SDProblemSelectionNotificationAction(text: String) : NotificationAction(text) {
constructor() : this("")
private val selectionAction = SDProblemSelectionComboBoxAction()
override fun actionPerformed(e: AnActionEvent, notification: Notification) = selectionAction.actionPerformed(e)
}