diff --git a/src/main/java/org/rococy/roomit/MainWindow.java b/src/main/java/org/rococy/roomit/MainWindow.java index 2a33d1c..0dbfb35 100644 --- a/src/main/java/org/rococy/roomit/MainWindow.java +++ b/src/main/java/org/rococy/roomit/MainWindow.java @@ -71,12 +71,12 @@ public class MainWindow extends Application { stage.setFullScreenExitHint(""); // 置顶 stage.setAlwaysOnTop(true); + // 禁止缩小 + stage.setResizable(false); // 设置窗口透明 stage.initStyle(StageStyle.TRANSPARENT); // 将窗口显示出来 -// stage.show(); - - new ToolsWindow().show(); + stage.show(); } catch ( IOException e) { e.printStackTrace(); diff --git a/src/main/java/org/rococy/roomit/ToolsWindow.java b/src/main/java/org/rococy/roomit/ToolsWindow.java index 71a66f8..496bc5f 100644 --- a/src/main/java/org/rococy/roomit/ToolsWindow.java +++ b/src/main/java/org/rococy/roomit/ToolsWindow.java @@ -1,10 +1,13 @@ package org.rococy.roomit; import javafx.application.Application; +import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; +import javafx.scene.paint.Paint; import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.WindowEvent; import java.io.IOException; @@ -18,25 +21,43 @@ public class ToolsWindow extends Application { private final Stage stage = new Stage(); + private static final ToolsWindow TOOLS_WINDOW = new ToolsWindow(); + + private ToolsWindow() { + } + + public static ToolsWindow getInstance() { + return TOOLS_WINDOW; + } + { - // 设置标题 - stage.setTitle("Roomit-工具箱"); - // 居中 - stage.centerOnScreen(); - // 只有一个x的任务栏 - stage.setResizable(false); - stage.initModality(Modality.APPLICATION_MODAL); - // 置顶 - stage.setAlwaysOnTop(true); + try { + // 加载FXML文件 + FXMLLoader fxmlLoader = new FXMLLoader(SettingWindow.class.getResource("fxml/toolsWindow.fxml")); + Scene scene = new Scene(fxmlLoader.load()); + // 透明背景 + scene.setFill(Paint.valueOf("#00000000")); + // 设置场景 + stage.setScene(scene); + // 设置标题 + stage.setTitle("Roomit-工具箱"); + // 居中 + stage.centerOnScreen(); + // 只有一个x的任务栏 + stage.setResizable(false); + stage.initModality(Modality.APPLICATION_MODAL); + // 置顶 + stage.setAlwaysOnTop(true); + } catch (IOException e) { + e.printStackTrace(); + } } @Override public void start(Stage stage) throws IOException { - // 加载FXML文件 - FXMLLoader fxmlLoader = new FXMLLoader(SettingWindow.class.getResource("fxml/toolsWindow.fxml")); - Scene scene = new Scene(fxmlLoader.load()); - // 设置场景 - stage.setScene(scene); + if (stage.isShowing()) { + return; + } // 将窗口显示出来 stage.show(); } @@ -49,4 +70,16 @@ public class ToolsWindow extends Application { } } + public boolean isShowing() { + return stage.isShowing(); + } + + public void setOnHidden(EventHandler value) { + stage.setOnHidden(value); + } + + public void hide() { + stage.hide(); + } + } diff --git a/src/main/java/org/rococy/roomit/control/RoomItCanvas.java b/src/main/java/org/rococy/roomit/control/RoomItCanvas.java index 3c66521..5f4a574 100644 --- a/src/main/java/org/rococy/roomit/control/RoomItCanvas.java +++ b/src/main/java/org/rococy/roomit/control/RoomItCanvas.java @@ -3,10 +3,12 @@ package org.rococy.roomit.control; import javafx.scene.Node; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.StrokeLineCap; import javafx.scene.shape.StrokeLineJoin; import org.rococy.roomit.config.ConfigurationManager; +import org.rococy.roomit.constant.GlobalConsts; import org.rococy.roomit.domain.BrushConfiguration; import org.rococy.roomit.domain.CanvasPoint; import org.rococy.roomit.util.ScreenUtils; @@ -136,7 +138,8 @@ public class RoomItCanvas extends Canvas { private void initGraphics() { gc = this.getGraphicsContext2D(); // 画笔颜色 - gc.setStroke(Paint.valueOf(configuration.getStrokeColor())); + String strokeColor = configuration.getStrokeColor(); + gc.setStroke(Paint.valueOf(strokeColor.equals(GlobalConsts.THEME_COLOR) ? Color.RED.toString() : strokeColor)); // 线条宽度 gc.setLineWidth(configuration.getLineWidth()); // 让线变得圆滑 diff --git a/src/main/java/org/rococy/roomit/controller/MainWindowController.java b/src/main/java/org/rococy/roomit/controller/MainWindowController.java index 5ce6ad6..877db4e 100644 --- a/src/main/java/org/rococy/roomit/controller/MainWindowController.java +++ b/src/main/java/org/rococy/roomit/controller/MainWindowController.java @@ -10,10 +10,12 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.Background; import javafx.scene.shape.Shape; import javafx.stage.Stage; +import org.rococy.roomit.ToolsWindow; import org.rococy.roomit.config.ConfigurationManager; import org.rococy.roomit.constant.KeyBoardConsts; import org.rococy.roomit.control.Container; import org.rococy.roomit.control.*; +import org.rococy.roomit.controller.base.BaseController; import org.rococy.roomit.cursor.RoomItCursor; import org.rococy.roomit.domain.KeyBoardConfiguration; import org.rococy.roomit.event.RoomItCursorEvent; @@ -37,7 +39,7 @@ import java.util.ResourceBundle; * @author Rococy * @date 2022/9/8 */ -public class MainWindowController implements Initializable { +public class MainWindowController extends BaseController implements Initializable { @FXML private Container container; @@ -91,59 +93,7 @@ public class MainWindowController implements Initializable { @FXML public void windowKeyPressed(KeyEvent event) { - String keyBoardText = KeyBoardUtils.parse(event); - - switch (keyBoardConfiguration.getType(keyBoardText)) { - // 切换为画笔 - case KeyBoardConsts.BRUSH: { - changeState(BRUSH_SYMBOL); - break; - } - - // 切换为绘制矩形状态 - case KeyBoardConsts.RECTANGLE: { - changeState(RECTANGLE_SYMBOL); - shapePane.switchToDrawRectangle(); - break; - } - - // 切换为绘制椭圆状态 - case KeyBoardConsts.ELLIPSE: { - changeState(ELLIPSE_SYMBOL); - shapePane.switchToDrawEllipse(); - break; - } - - // 弹出颜色框 picker - case KeyBoardConsts.COLOR_PICKER: { - ejectColorPicker(); - break; - } - - // 鼠标放大操作 expand - case KeyBoardConsts.EXPEND_MOUSE: { - cursor.expand(globalMouseX, globalMouseY); - break; - } - - // 清空操作 clear - case KeyBoardConsts.CLEAR: { - this.clear(); - break; - } - - // 回退操作 - case KeyBoardConsts.BACK: { - canvasGroup.undo(); - break; - } - - // 将截图放入剪切板操作 - case KeyBoardConsts.SCREENSHOT_AND_COPY: { - this.captureToClipBoard(); - break; - } - } + this.triggerKeyboard(KeyBoardUtils.parse(event)); } @FXML @@ -169,6 +119,60 @@ public class MainWindowController implements Initializable { initDrawingBoard(); } + public void triggerKeyboard(String keyBoardText) { + switch (keyBoardConfiguration.getType(keyBoardText)) { + // 切换为画笔 + case KeyBoardConsts.BRUSH -> changeState(BRUSH_SYMBOL); + + // 切换为绘制矩形状态 + case KeyBoardConsts.RECTANGLE -> { + changeState(RECTANGLE_SYMBOL); + shapePane.switchToDrawRectangle(); + } + + // 切换为绘制椭圆状态 + case KeyBoardConsts.ELLIPSE -> { + changeState(ELLIPSE_SYMBOL); + shapePane.switchToDrawEllipse(); + } + + case KeyBoardConsts.TOOLS -> ejectToolsWindow(); + + // 弹出颜色框 picker + case KeyBoardConsts.COLOR_PICKER -> ejectColorPicker(); + + // 鼠标放大操作 expand + case KeyBoardConsts.EXPEND_MOUSE -> cursor.expand(globalMouseX, globalMouseY); + + // 清空操作 clear + case KeyBoardConsts.CLEAR -> this.clear(); + + // 回退操作 + case KeyBoardConsts.BACK -> canvasGroup.undo(); + + // 将截图放入剪切板操作 + case KeyBoardConsts.SCREENSHOT_AND_COPY -> { + ToolsWindow toolsWindow = ToolsWindow.getInstance(); + if (toolsWindow.isShowing()) { + toolsWindow.setOnHidden(e -> { + try { + Thread.sleep(500); + this.captureToClipBoard(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + }); + toolsWindow.hide(); + } else { + this.captureToClipBoard(); + } + } + + case KeyBoardConsts.OPEN_OR_CLOSE -> container.getScene().getWindow().hide(); + } + } + + /** * 初始化最外层的pane */ @@ -301,6 +305,13 @@ public class MainWindowController implements Initializable { colorPicker.show(); } + /** + * 弹出工具箱 + */ + private void ejectToolsWindow() { + ToolsWindow.getInstance().show(); + } + /** * 截屏并粘贴至剪切板 */ @@ -323,7 +334,12 @@ public class MainWindowController implements Initializable { container.setCursor(Cursor.DEFAULT); }); - toast.setOnTransparentReleased(() -> ((Stage) container.getScene().getWindow()).close()); + toast.setOnTransparentReleased(() -> { + Stage stage = ((Stage) container.getScene().getWindow()); + if (stage != null) { + stage.close(); + } + }); container.addChildren(toast); } catch (AWTException e) { diff --git a/src/main/java/org/rococy/roomit/controller/ToolsWindowController.java b/src/main/java/org/rococy/roomit/controller/ToolsWindowController.java index ee30d88..136e9a8 100644 --- a/src/main/java/org/rococy/roomit/controller/ToolsWindowController.java +++ b/src/main/java/org/rococy/roomit/controller/ToolsWindowController.java @@ -1,9 +1,77 @@ package org.rococy.roomit.controller; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Tooltip; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.TilePane; +import javafx.scene.layout.VBox; +import org.rococy.roomit.config.ConfigurationManager; +import org.rococy.roomit.controller.context.ControllerContext; +import org.rococy.roomit.domain.KeyBoardConfiguration; + +import java.net.URL; +import java.util.ResourceBundle; + /** * @author Rococy * @date 2022/10/6 */ -public class ToolsWindowController { +public class ToolsWindowController implements Initializable { + @FXML + private TilePane container; + + @FXML + private VBox brushImageWrapper; + + @FXML + private VBox rectangleImageWrapper; + + @FXML + private VBox ellipseImageWrapper; + + @FXML + private VBox colorPickerImageWrapper; + + @FXML + private VBox expendMouseImageWrapper; + + @FXML + private VBox clearImageWrapper; + + @FXML + private VBox screenshotAndCopyImageWrapper; + + @FXML + private VBox openOrCloseImageWrapper; + + private final KeyBoardConfiguration keyBoardConfiguration = ConfigurationManager.getKeyboardConfiguration(); + + @Override + public void initialize(URL location, ResourceBundle resources) { + Tooltip.install(brushImageWrapper, new Tooltip("画笔")); + Tooltip.install(rectangleImageWrapper, new Tooltip("矩形")); + Tooltip.install(ellipseImageWrapper, new Tooltip("椭圆")); + Tooltip.install(colorPickerImageWrapper, new Tooltip("颜色选择器")); + Tooltip.install(expendMouseImageWrapper, new Tooltip("鼠标放大")); + Tooltip.install(clearImageWrapper, new Tooltip("清空画板")); + Tooltip.install(screenshotAndCopyImageWrapper, new Tooltip("截屏并复制")); + Tooltip.install(openOrCloseImageWrapper, new Tooltip("打开或关闭画板")); + } + + @FXML + public void vBoxMouseClicked(MouseEvent event) { + String keyboardType = (String) ((VBox) event.getSource()).getUserData(); + String keyBoardText = keyBoardConfiguration.getKeyBoardMap().get(keyboardType); + MainWindowController mainWindowController = this.getMainController(); + mainWindowController.triggerKeyboard(keyBoardText); + + // 隐藏当前窗口 + container.getScene().getWindow().hide(); + } + + private MainWindowController getMainController() { + return (MainWindowController) ControllerContext.getControllerByType(MainWindowController.class); + } } diff --git a/src/main/java/org/rococy/roomit/controller/base/BaseController.java b/src/main/java/org/rococy/roomit/controller/base/BaseController.java new file mode 100644 index 0000000..851d119 --- /dev/null +++ b/src/main/java/org/rococy/roomit/controller/base/BaseController.java @@ -0,0 +1,15 @@ +package org.rococy.roomit.controller.base; + +import org.rococy.roomit.controller.context.ControllerContext; + +/** + * @author Rococy + * @date 2022/10/7 + */ +public abstract class BaseController { + + public BaseController() { + ControllerContext.addController(this); + } + +} diff --git a/src/main/java/org/rococy/roomit/controller/context/ControllerContext.java b/src/main/java/org/rococy/roomit/controller/context/ControllerContext.java new file mode 100644 index 0000000..44ddcf4 --- /dev/null +++ b/src/main/java/org/rococy/roomit/controller/context/ControllerContext.java @@ -0,0 +1,28 @@ +package org.rococy.roomit.controller.context; + +import org.rococy.roomit.controller.base.BaseController; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Rococy + * @date 2022/10/7 + */ +public class ControllerContext { + + private static final Map CONTROLLER_MAP = new HashMap<>(4); + + public static void addController(BaseController baseController) { + CONTROLLER_MAP.put(baseController.getClass().getSimpleName(), baseController); + } + + public static BaseController getControllerByType(Class type) { + for (BaseController controller : CONTROLLER_MAP.values()) { + if (controller.getClass() == type) { + return controller; + } + } + return null; + } +} diff --git a/src/main/resources/org/rococy/roomit/css/tools.css b/src/main/resources/org/rococy/roomit/css/tools.css new file mode 100644 index 0000000..2f69e34 --- /dev/null +++ b/src/main/resources/org/rococy/roomit/css/tools.css @@ -0,0 +1,23 @@ +#container { + -fx-background-radius: 5px; + -fx-pref-width: 480px; + -fx-pref-height: 200px; +} + +.vbox { + -fx-pref-width: 120px; + -fx-pref-height: 100px; + -fx-background-color: #00000000; + -fx-cursor: hand; + -fx-alignment: center; +} + +.vbox:hover { + -fx-background-color: #ececec; +} + +.tooltip { + -fx-background-color: #fff; + -fx-text-fill: #000; + -fx-font-size: 12px; +} diff --git a/src/main/resources/org/rococy/roomit/fxml/mainWindow.fxml b/src/main/resources/org/rococy/roomit/fxml/mainWindow.fxml index c745a16..f232ebd 100644 --- a/src/main/resources/org/rococy/roomit/fxml/mainWindow.fxml +++ b/src/main/resources/org/rococy/roomit/fxml/mainWindow.fxml @@ -10,7 +10,6 @@ id="container" onMouseEntered="#windowMouseEntered" onKeyPressed="#windowKeyPressed"> - diff --git a/src/main/resources/org/rococy/roomit/fxml/toolsWindow.fxml b/src/main/resources/org/rococy/roomit/fxml/toolsWindow.fxml index d90cd0d..08c1a06 100644 --- a/src/main/resources/org/rococy/roomit/fxml/toolsWindow.fxml +++ b/src/main/resources/org/rococy/roomit/fxml/toolsWindow.fxml @@ -1,21 +1,55 @@ - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + diff --git a/src/main/resources/org/rococy/roomit/img/brush-logo.png b/src/main/resources/org/rococy/roomit/img/brush-logo.png new file mode 100644 index 0000000..68b1cdc Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/brush-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/clear-logo.png b/src/main/resources/org/rococy/roomit/img/clear-logo.png new file mode 100644 index 0000000..fa5a888 Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/clear-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/color-picker-logo.png b/src/main/resources/org/rococy/roomit/img/color-picker-logo.png new file mode 100644 index 0000000..1aaebce Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/color-picker-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/ellipse-logo.png b/src/main/resources/org/rococy/roomit/img/ellipse-logo.png new file mode 100644 index 0000000..d092160 Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/ellipse-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/mouse-logo.png b/src/main/resources/org/rococy/roomit/img/mouse-logo.png new file mode 100644 index 0000000..e95c37b Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/mouse-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/open-or-close-logo.png b/src/main/resources/org/rococy/roomit/img/open-or-close-logo.png new file mode 100644 index 0000000..9cd0f6c Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/open-or-close-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/rectangle-logo.png b/src/main/resources/org/rococy/roomit/img/rectangle-logo.png new file mode 100644 index 0000000..43752e1 Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/rectangle-logo.png differ diff --git a/src/main/resources/org/rococy/roomit/img/screenshot-logo.png b/src/main/resources/org/rococy/roomit/img/screenshot-logo.png new file mode 100644 index 0000000..fe054aa Binary files /dev/null and b/src/main/resources/org/rococy/roomit/img/screenshot-logo.png differ