package com.narrowtux.fmm.gui; import com.narrowtux.fmm.model.Datastore; import com.narrowtux.fmm.io.tasks.ModDownloadTask; import com.narrowtux.fmm.io.tasks.TaskService; import com.narrowtux.fmm.util.Util; import com.narrowtux.fmm.model.Version; import javafx.collections.ListChangeListener; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.Button; import javafx.scene.layout.AnchorPane; import javafx.scene.shape.Arc; import javafx.stage.Stage; import org.controlsfx.control.PopOver; import org.controlsfx.control.TaskProgressView; import java.awt.*; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class MainWindowController extends Controller { @FXML TabPane tabPane; @FXML Arc globalProgress; @FXML Button globalProgressButton; private TaskProgressView taskProgressView = new TaskProgressView(); private PopOver progressPopover = new PopOver(taskProgressView); ConsoleWindow consoleWindow = new ConsoleWindow(); private Datastore store = Datastore.getInstance(); public MainWindowController(Stage settingsStage) { this.settingsStage = settingsStage; } @Override public AnchorPane getRoot() { return root; } Stage settingsStage; @FXML AnchorPane root; @Override public void init() { progressPopover.setArrowLocation(PopOver.ArrowLocation.TOP_RIGHT); globalProgress.startAngleProperty().bind(globalProgress.lengthProperty().negate().add(90)); globalProgress.setLength(360); TaskService.getInstance().getTasks().addListener((ListChangeListener<Task>) change -> { while (change.next()) { if (change.wasAdded()) { for (Task task : change.getAddedSubList()) { taskProgressView.getTasks().add(task); task.progressProperty().addListener((obs, ov, nv) -> updateGlobalProgress(nv.equals(1d))); } } if (change.wasRemoved()) { for (Task task : change.getRemoved()) { taskProgressView.getTasks().remove(task); } } } }); // load all the tabs ModsTabController modsTabController; ModpackTabController modpackTabController; SavesTabController savesTabController; try { modsTabController = Util.loadFXML(GuiFiles.MODS_TAB, () -> new ModsTabController()).getController(); modpackTabController = Util.loadFXML(GuiFiles.MODPACKS_TAB, () -> new ModpackTabController(consoleWindow)).getController(); savesTabController = Util.loadFXML(GuiFiles.SAVES_TAB, () -> new SavesTabController()).getController(); tabPane.getTabs().addAll(modsTabController.getTab(), modpackTabController.getTab(), savesTabController.getTab()); tabPane.getSelectionModel().select(modpackTabController.getTab()); } catch (Exception e) { e.printStackTrace(); } } private long lastGlobalProgressUpdate = 0; private void updateGlobalProgress(boolean force) { if (force || System.currentTimeMillis() - lastGlobalProgressUpdate > 100) { int runningTasks = 0; int tasksWaiting = 0; double progress = 0; for (Task task : TaskService.getInstance().getTasks()) { if (task.isRunning()) { runningTasks ++; if (task.getWorkDone() >= 0) { progress += task.getProgress(); } else { tasksWaiting ++; } } } double length; if (tasksWaiting == runningTasks || runningTasks == 0) { length = 360; } else { length = 360d * (progress / (double) runningTasks); } globalProgress.setLength(length); lastGlobalProgressUpdate = System.currentTimeMillis(); } } @FXML public void onOpenDataFolderClicked() throws IOException { Desktop.getDesktop().open(Datastore.getInstance().getDataDir().toFile()); } @FXML public void onSettingsButton() { settingsStage.show(); } @FXML public void onConsoleAction(ActionEvent event) { consoleWindow.show(); } @FXML public void onProgressAction(ActionEvent event) { if (progressPopover.isShowing()) { progressPopover.hide(); } else { progressPopover.show(globalProgressButton); } } }