Files
Bambu_lab/StudioBridge-src/src/main/java/rdiger36/StudioBridge/gui/ToolInfo.java
T
ske087 a50dd3b34b chore: upgrade StudioBridge v2.1.2 -> v2.1.3, add persistent-folder creation, update runbook
- Rebuild StudioBridge-2.1.3.jar from latest upstream (v2.1.3) and deploy to portable-dist
- Add ensurePersistentDirectories() so the app creates ~/.studio-bridge and Profiles at startup (GUI + --sendonly)
- Bundle full StudioBridge source under StudioBridge-src/ (with rebuild-jar.bat)
- Update launchers (Launch-StudioBridge.bat, portable-dist/StudioBridge.bat) to v2.1.3
- Add check-update.ps1 and UPDATE.md for the step-by-step update runbook
- Update README (v2.1.3, persistent data + updating sections)
- Ignore StudioBridge-src/target/ build output
2026-08-06 20:05:21 +03:00

141 lines
6.6 KiB
Java

package rdiger36.StudioBridge.gui;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Dialog.ModalExclusionType;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URI;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.LayoutStyle;
import javax.swing.SwingConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import rdiger36.StudioBridge.functions.Resize;
/**
* A dialog displaying information about the StudioBridge application.
* <p>
* This class creates a modal dialog that presents the developer's information,
* GitHub link, and icon source.
* </p>
*/
public class ToolInfo {
/**
* Constructs a ToolInfo dialog.
*
* @param frmBambuConnect The parent JFrame for positioning the dialog.
*/
public ToolInfo(JFrame frmBambuConnect) {
JDialog dialInfo = new JDialog();
dialInfo.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
dialInfo.setModal(true);
dialInfo.setAlwaysOnTop(true);
dialInfo.setTitle("StudioBridge Info");
dialInfo.setResizable(false);
dialInfo.setIconImage(Toolkit.getDefaultToolkit().getImage(ToolInfo.class.getResource("/icon.png")));
dialInfo.setBounds(100, 100, 386, 250);
dialInfo.toFront();
dialInfo.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dialInfo.dispose();
}
});
JEditorPane dtrpnDeveloper = new JEditorPane("text/html", "<html><body>\r\n" +
"Developer: Niklas (Rdiger-36)<br>\r\n" +
"GitHub: <a href=\"https://github.com/Rdiger-36/StudioBridge\">StudioBridge Repo</a><br>\r\n" +
"<br>\r\n" +
"Icon Source: <a href=\"https://www.flaticon.com/de/kostenlose-icons/3d-drucker\">Freepik - Flaticon</a>\r\n" +
"<br>\r\n" +
"<br>\r\n" +
"</body></html>");
dtrpnDeveloper.setEditable(false);
dtrpnDeveloper.setOpaque(false);
dtrpnDeveloper.setBorder(null);
dtrpnDeveloper.setFont(new Font("Segoe UI", Font.PLAIN, 14));
dtrpnDeveloper.setCaretColor(dtrpnDeveloper.getBackground());
// Hyperlink listener for handling clicks on links in the JEditorPane
dtrpnDeveloper.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ENTERED) {
dtrpnDeveloper.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else if (e.getEventType() == HyperlinkEvent.EventType.EXITED) {
dtrpnDeveloper.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} else if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
try {
String clickedText = dtrpnDeveloper.getDocument().getText(
e.getSourceElement().getStartOffset(),
e.getSourceElement().getEndOffset() - e.getSourceElement().getStartOffset());
if (clickedText.equals("StudioBridge Repo")) {
clickedText = "https://github.com/Rdiger-36/StudioBridge";
} else if (clickedText.equals("Freepik - Flaticon")) {
clickedText = "https://www.flaticon.com/de/kostenlose-icons/3d-drucker";
}
Desktop.getDesktop().browse(new URI(clickedText));
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
});
JLabel lbueberschrift = new JLabel("StudioBridge v" + MainMenu.version.substring(0, 1) + "." +
MainMenu.version.substring(1, 2) + "." + MainMenu.version.substring(2, 3));
lbueberschrift.setHorizontalAlignment(SwingConstants.CENTER);
lbueberschrift.setIconTextGap(25);
lbueberschrift.setForeground(new Color(229, 152, 67));
lbueberschrift.setFont(new Font("Segoe UI", Font.BOLD, 16));
ImageIcon icon = Resize.setNewImageIconSize(new ImageIcon(ToolInfo.class.getResource("/icon.png")), 64, 64);
lbueberschrift.setIcon(icon);
JSeparator separator = new JSeparator();
GroupLayout groupLayout = new GroupLayout(dialInfo.getContentPane());
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(lbueberschrift, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
.addComponent(separator, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
.addGroup(groupLayout.createSequentialGroup()
.addGap(10)
.addComponent(dtrpnDeveloper, GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)))
.addContainerGap())
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addComponent(lbueberschrift, GroupLayout.PREFERRED_SIZE, 91, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(separator, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(dtrpnDeveloper)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED))
);
dialInfo.requestFocus();
dialInfo.getContentPane().setLayout(groupLayout);
dialInfo.pack();
dialInfo.setLocationRelativeTo(frmBambuConnect);
dialInfo.setVisible(true);
}
}