Compare commits

..

8 Commits

Author SHA1 Message Date
Bane Stojkovic a38f1ec5ad Update update.xml 2026-10-30 09:44:37 +01:00
Bane Stojkovic 53ee3556b9 include bounds, selection to ai project 2026-10-30 09:44:25 +01:00
Bane Stojkovic bd585a7a7a Update update.xml 2026-10-30 09:44:25 +01:00
Bane Stojkovic 21aece2e79 'AI Circuit Analyzer' offers to log in instead of just showing the error 2026-10-30 09:44:25 +01:00
Bane Stojkovic 9f557836fa Update AiEditScriptEditorTest.java 2026-10-30 09:44:25 +01:00
Bane Stojkovic 4d04fe8491 warning on unknown op 2026-10-30 09:44:25 +01:00
Bane Stojkovic 36fc5e119c Update update.xml 2026-10-30 09:44:25 +01:00
Bane Stojkovic 7d296565a9 Update update.xml 2026-10-30 09:44:24 +01:00
25 changed files with 23 additions and 179 deletions
-3
View File
@@ -11,9 +11,6 @@
<option name="ENABLED" value="true" />
</pattern>
</extension>
<RunnerSettings RunnerId="Profile ">
<option name="yk-options-v2" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;!DOCTYPE properties SYSTEM &quot;http://java.sun.com/dtd/properties.dtd&quot;&gt;&#10;&lt;properties&gt;&#10;&lt;entry key=&quot;advanced-options&quot;&gt;on_exit=snapshot&lt;/entry&gt;&#10;&lt;entry key=&quot;jfr&quot;&gt;Off&lt;/entry&gt;&#10;&lt;entry key=&quot;cpu&quot;&gt;Sampling&lt;/entry&gt;&#10;&lt;entry key=&quot;monitor&quot;&gt;Off&lt;/entry&gt;&#10;&lt;entry key=&quot;telemetry&quot;&gt;On&lt;/entry&gt;&#10;&lt;entry key=&quot;thread&quot;&gt;States and stacks&lt;/entry&gt;&#10;&lt;entry key=&quot;time&quot;&gt;Wall time&lt;/entry&gt;&#10;&lt;entry key=&quot;alloc&quot;&gt;Off&lt;/entry&gt;&#10;&lt;entry key=&quot;launch-ui&quot;&gt;true&lt;/entry&gt;&#10;&lt;entry key=&quot;exceptions&quot;&gt;On&lt;/entry&gt;&#10;&lt;/properties&gt;&#10;" />
</RunnerSettings>
<method v="2">
<option name="Make" enabled="true" />
</method>
@@ -142,7 +142,7 @@ public class ChatbotService {
plugInPort.getCloudService().getMachineId(), fileName, circuitFile, clientAnalysisFile, prompt);
// TODO: comment out before the release, responses are logged for testing only
// LOG.debug("Raw chatbot response: " + rawResponse);
LOG.debug("Raw chatbot response: " + rawResponse);
if (rawResponse == null || rawResponse.isBlank()) {
throw new CloudException(SERVER_ERROR_PLEASE_TRY_AGAIN);
@@ -662,7 +662,7 @@
<minor>9</minor>
<build>0</build>
</versionNumber>
<releaseDate>2026-10-30 00:00:00.000 CET</releaseDate>
<releaseDate>2026-10-17 00:00:00.000 CET</releaseDate>
<name></name>
<changes>
<org.diylc.appframework.update.Change>
-5
View File
@@ -96,11 +96,6 @@
<artifactId>commons-compiler</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>net.java.balloontip</groupId>
<artifactId>balloontip</artifactId>
@@ -25,6 +25,7 @@ import java.util.Arrays;
import java.util.Properties;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.diylc.appframework.miscutils.ConfigurationManager;
@@ -41,7 +42,6 @@ import org.diylc.serialization.ProjectFileManager;
import org.diylc.swing.gui.MainFrame;
import org.diylc.swing.gui.TemplateDialog;
import org.diylc.swing.plugins.file.ProjectDrawingProvider;
import org.diylc.utils.LookAndFeelUtils;
/**
* Main class that runs DIYLC.
@@ -136,7 +136,7 @@ public class DIYLCStarter {
LOG.info("Configuration dump end.");
try {
LookAndFeelUtils.applyLookAndFeel();
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// Apply configurable font scaling from VM argument: -Dorg.diylc.fontScaleFactor=X
org.diylc.utils.FontScalingUtils.applyFontScaling();
@@ -34,7 +34,6 @@ import javax.swing.SwingConstants;
import javax.swing.border.MatteBorder;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.appframework.miscutils.IConfigListener;
import org.diylc.utils.LookAndFeelUtils;
/***
* Panel that has a clickable line that can used to collapse and expand the contents of the panel.
@@ -50,8 +49,7 @@ public class CollapsiblePanel extends JPanel {
private MatteBorderEx border;
private String visibilityConfigKey;
private Color defaultColor =
LookAndFeelUtils.themeColor(Color.lightGray, new Color(85, 88, 90));
private Color defaultColor = Color.lightGray;
private Color highlightColor = Color.decode("#66CCFF");
/**
@@ -24,13 +24,11 @@ import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.swingframework.ButtonDialog;
import org.diylc.common.IPlugInPort;
import org.diylc.utils.IconLoader;
import org.diylc.utils.LookAndFeelUtils;
public class InfoDialog extends ButtonDialog {
@@ -55,10 +53,9 @@ public class InfoDialog extends ButtonDialog {
protected JComponent getMainComponent() {
JLabel label = new JLabel("<html>" + message + "</html>");
label.setIcon(IconLoader.Help.getIcon());
label.setBackground(UIManager.getColor("List.background"));
label.setBackground(Color.white);
label.setOpaque(true);
label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0,
LookAndFeelUtils.themeColor(Color.lightGray, new Color(85, 88, 90))), BorderFactory.createEmptyBorder(16, 16, 16, 16)));
label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.lightGray), BorderFactory.createEmptyBorder(16, 16, 16, 16)));
label.setIconTextGap(8);
return label;
}
@@ -60,7 +60,6 @@ import org.diylc.common.IPlugInPort;
import org.diylc.common.PropertyWrapper;
import org.diylc.core.IView;
import org.diylc.presenter.Presenter;
import org.diylc.utils.LookAndFeelUtils;
public class TemplateDialog extends JDialog {
@@ -202,8 +201,7 @@ public class TemplateDialog extends JDialog {
public JPanel getInfoPanel() {
if (infoPanel == null) {
infoPanel = new JPanel();
infoPanel.setBackground(
LookAndFeelUtils.themeColor(Color.decode("#FFFFCC"), Color.decode("#4B4B3A")));
infoPanel.setBackground(Color.decode("#FFFFCC"));
infoPanel.setBorder(new JTextField().getBorder());
JLabel infoLabel =
new JLabel(
@@ -36,7 +36,6 @@ import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.ITask;
@@ -92,7 +91,7 @@ public class CommentDialog extends JDialog {
private JPanel getListPanel() {
if (listPanel == null) {
listPanel = new JPanel(new GridBagLayout());
listPanel.setBackground(UIManager.getColor("List.background"));
listPanel.setBackground(Color.white);
for (CommentEntity c : comments) {
addComment(c);
@@ -108,7 +107,7 @@ public class CommentDialog extends JDialog {
private JPanel getMainPanel() {
if (mainPanel == null) {
mainPanel = new JPanel(new GridBagLayout());
mainPanel.setBackground(UIManager.getColor("List.background"));
mainPanel.setBackground(Color.white);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
@@ -21,6 +21,7 @@
*/
package org.diylc.swing.plugins.cloud.view.browser;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
@@ -36,7 +37,6 @@ import javax.swing.JRootPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.apache.log4j.Logger;
@@ -167,7 +167,7 @@ public class CloudBrowserFrame extends JFrame implements ISimpleView {
if (searchPanel == null) {
searchPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
searchPanel.setBackground(UIManager.getColor("List.background"));
searchPanel.setBackground(Color.white);
gbc.anchor = GridBagConstraints.NORTH;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridx = 0;
@@ -18,6 +18,7 @@
*/
package org.diylc.swing.plugins.cloud.view.browser;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Graphics;
@@ -47,7 +48,6 @@ import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.text.DefaultCaret;
import org.apache.log4j.Logger;
import org.diylc.appframework.miscutils.InMemoryConfigurationManager;
@@ -507,7 +507,7 @@ public class ResultsScrollPanel extends JScrollPane {
}
});
buttonPanel.setBackground(UIManager.getColor("List.background"));
buttonPanel.setBackground(Color.white);
buttonPanel.add(downloadButton);
if (showEditControls) {
buttonPanel.add(editButton);
@@ -651,7 +651,7 @@ public class ResultsScrollPanel extends JScrollPane {
private JPanel getResultsPanel() {
if (resultsPanel == null) {
resultsPanel = new JPanel(new GridBagLayout());
resultsPanel.setBackground(UIManager.getColor("List.background"));
resultsPanel.setBackground(Color.white);
}
return resultsPanel;
}
@@ -21,6 +21,7 @@
*/
package org.diylc.swing.plugins.cloud.view.browser;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
@@ -30,7 +31,6 @@ import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import org.diylc.utils.IconLoader;
@@ -48,7 +48,7 @@ public class SearchHeaderPanel extends JPanel {
public SearchHeaderPanel() {
setLayout(new GridBagLayout());
this.setBackground(UIManager.getColor("List.background"));
this.setBackground(Color.white);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.insets = new Insets(2, 2, 2, 2);
@@ -43,7 +43,6 @@ import org.diylc.lang.Language;
import org.diylc.swing.ActionFactory;
import org.diylc.swing.ISwingUI;
import org.diylc.utils.IconLoader;
import org.diylc.utils.LookAndFeelUtils;
import org.diylc.utils.ResourceUtils;
/**
@@ -57,7 +56,6 @@ public class ConfigPlugin implements IPlugIn {
private static final String CONFIG_MENU = "Config";
private static final String THEME_MENU = "Theme";
private static final String UI_THEME_MENU = "UI Theme";
private static final String RULER_MENU = "Ruler Inch Subdivision...";
private static final String SNAP_MENU = "Snap To";
private static final String CATEGORIES_MENU = "Component Categories";
@@ -70,7 +68,6 @@ public class ConfigPlugin implements IPlugIn {
private static final String LANGUAGE_MENU = LangUtil.translate("Language");
private static final String LANG_RESTART = LangUtil.translate("Language selection will be applied after the application is restarted.");
private static final String UI_THEME_RESTART = LangUtil.translate("UI theme selection will be applied after the application is restarted.");
public static final String THEMES_DIR = "themes";
private ISwingUI swingUI;
@@ -141,14 +138,6 @@ public class ConfigPlugin implements IPlugIn {
} catch (Exception e) {
LOG.error("Error while setting up language menu", e);
}
swingUI.injectSubmenu(UI_THEME_MENU, IconLoader.WindowColors.getIcon(), CONFIG_MENU);
for (String uiTheme : new String[] {LookAndFeelUtils.UI_THEME_SYSTEM,
LookAndFeelUtils.UI_THEME_LIGHT, LookAndFeelUtils.UI_THEME_DARK}) {
swingUI.injectMenuAction(ActionFactory.getInstance().createToggleAction(uiTheme,
LookAndFeelUtils.UI_THEME_KEY, UI_THEME_MENU, LookAndFeelUtils.UI_THEME_DEFAULT),
UI_THEME_MENU);
}
swingUI.injectMenuAction(
@@ -242,16 +231,6 @@ public class ConfigPlugin implements IPlugIn {
swingUI.showMessage(LANG_RESTART, LANGUAGE_MENU, ISwingUI.INFORMATION_MESSAGE);
}
});
ConfigurationManager.getInstance().addConfigListener(LookAndFeelUtils.UI_THEME_KEY,
new IConfigListener() {
@Override
public void valueChanged(String key, Object value) {
swingUI.showMessage(UI_THEME_RESTART, LangUtil.translate(UI_THEME_MENU),
ISwingUI.INFORMATION_MESSAGE);
}
});
}
@Override
@@ -47,7 +47,6 @@ import org.diylc.swing.gui.ComponentPopupMenu;
import org.diylc.swing.gui.DragDropList;
import org.diylc.swing.gui.IDragDropListListener;
import org.diylc.swing.gui.SearchTextField;
import org.diylc.utils.LookAndFeelUtils;
public class ExplorerPane extends JPanel {
@@ -589,9 +588,6 @@ public class ExplorerPane extends JPanel {
private Map<String, ComponentType> componentTypes;
private String layerColor = LookAndFeelUtils.themeHtmlColor("#c0c0c0", "#707070");
private String valueColor = LookAndFeelUtils.themeHtmlColor("#666666", "#a0a0a0");
public ComponentListCellRenderer(Map<String, List<ComponentType>> componentTypeMap) {
this.componentTypes = componentTypeMap.values().stream().flatMap(x -> x.stream())
.collect(Collectors.toMap(x -> x.getInstanceClass().getCanonicalName(), x -> x));
@@ -628,12 +624,12 @@ public class ExplorerPane extends JPanel {
}
} else {
if (valueForDisplay == null || valueForDisplay.trim().isEmpty()) {
renderer.setText(String.format("<html><font color='%s'>[L%s]</font> %s</html>",
layerColor, layerId, component.getName()));
renderer.setText(String.format("<html><font color='#c0c0c0'>[L%s]</font> %s</html>",
layerId, component.getName()));
} else {
renderer.setText(String.format(
"<html><font color='%s'>[L%s]</font> %s (<font color='%s'>%s</font>)</html>",
layerColor, layerId, component.getName(), valueColor, valueForDisplay));
"<html><font color='#c0c0c0'>[L%s]</font> %s (<font color='#666666'>%s</font>)</html>",
layerId, component.getName(), valueForDisplay));
}
}
} else {
@@ -660,8 +656,8 @@ public class ExplorerPane extends JPanel {
renderer.setText(String.format("<html>[L%s] <b>%s</b> (<b>%s</b>)</html>", maxLayerId, groupName, componentCount));
} else {
renderer.setText(String.format(
"<html><font color='%s'>[L%s]</font> %s (<font color='%s'>%s</font>)</html>",
layerColor, maxLayerId, groupName, valueColor, componentCount));
"<html><font color='#c0c0c0'>[L%s]</font> %s (<font color='#666666'>%s</font>)</html>",
maxLayerId, groupName, componentCount));
}
}
@@ -1,85 +0,0 @@
/*
DIY Layout Creator (DIYLC).
Copyright (c) 2009-2025 held jointly by the individual authors.
This file is part of DIYLC.
DIYLC is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DIYLC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
*/
package org.diylc.utils;
import java.awt.Color;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import com.formdev.flatlaf.FlatDarkLaf;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.themes.FlatMacDarkLaf;
import com.formdev.flatlaf.themes.FlatMacLightLaf;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.appframework.miscutils.Utils;
/**
* Installs the Swing look and feel selected under Config > UI Theme. The native look and feel
* remains the default; the light and dark themes are provided by FlatLaf.
*
* @author Branislav Stojkovic
*/
public class LookAndFeelUtils {
public static final String UI_THEME_KEY = "uiTheme";
public static final String UI_THEME_SYSTEM = "System";
public static final String UI_THEME_LIGHT = "Light";
public static final String UI_THEME_DARK = "Dark";
public static final String UI_THEME_DEFAULT = UI_THEME_SYSTEM;
/**
* Installs the configured look and feel. Must run before any UI component is created, since
* switching requires an application restart.
*/
public static void applyLookAndFeel() throws ClassNotFoundException, InstantiationException,
IllegalAccessException, UnsupportedLookAndFeelException {
String theme = ConfigurationManager.getInstance().readString(UI_THEME_KEY, UI_THEME_DEFAULT);
if (UI_THEME_DARK.equalsIgnoreCase(theme)) {
UIManager.setLookAndFeel(Utils.isMac() ? new FlatMacDarkLaf() : new FlatDarkLaf());
} else if (UI_THEME_LIGHT.equalsIgnoreCase(theme)) {
UIManager.setLookAndFeel(Utils.isMac() ? new FlatMacLightLaf() : new FlatLightLaf());
} else {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
}
public static boolean isDark() {
return FlatLaf.isLafDark();
}
/**
* Picks between two variants of a color that the look and feel does not provide, such as an
* accent or a highlight.
*/
public static Color themeColor(Color light, Color dark) {
return isDark() ? dark : light;
}
/**
* Same as {@link #themeColor(Color, Color)} for colors embedded into HTML, in "#rrggbb" form.
*/
public static String themeHtmlColor(String light, String dark) {
return isDark() ? dark : light;
}
}
@@ -714,6 +714,3 @@ Reconnect %s to %s|%s mit %s neu verbinden
Editing your circuit:|Der Bearbeitung Ihrer Schaltung:
Generating new layouts:|Der Erstellung neuer Layouts:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|Der KI-Schaltungsanalysator erfordert ein DIYLC-Cloud-Konto. Möchten Sie sich jetzt anmelden?
UI Theme|UI-Design
System|System
UI theme selection will be applied after the application is restarted.|Das gewählte UI-Design wird nach Neustart der Anwendung verwendet.
@@ -707,6 +707,3 @@ Reconnect %s to %s
Editing your circuit:
Generating new layouts:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?
UI Theme
System
UI theme selection will be applied after the application is restarted.
@@ -710,6 +710,3 @@ Reconnect %s to %s|Reconectar %s a %s
Editing your circuit:|Edición de su circuito:
Generating new layouts:|Generación de nuevos diseños:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|El Analizador de Circuitos IA requiere una cuenta de DIYLC Cloud. ¿Desea iniciar sesión ahora?
UI Theme|Tema de la interfaz
System|Sistema
UI theme selection will be applied after the application is restarted.|La selección del tema de la interfaz se aplicará después de reiniciar la aplicación.
@@ -709,6 +709,3 @@ Reconnect %s to %s|Reconnecter %s à %s
Editing your circuit:|La modification de votre circuit :
Generating new layouts:|La génération de nouvelles implantations :
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|L'analyseur de circuit IA nécessite un compte DIYLC Cloud. Voulez-vous vous connecter maintenant ?
UI Theme|Thème de l'interface
System|Système
UI theme selection will be applied after the application is restarted.|La sélection du thème de l'interface sera appliquée après le redémarrage de l'application.
@@ -711,6 +711,3 @@ Reconnect %s to %s|Ricollega %s a %s
Editing your circuit:|Modifica del tuo circuito:
Generating new layouts:|Generazione di nuovi layout:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|L'Analizzatore di Circuiti IA richiede un account DIYLC Cloud. Vuoi accedere ora?
UI Theme|Tema dell'interfaccia
System|Sistema
UI theme selection will be applied after the application is restarted.|La selezione del tema dell'interfaccia verrà applicata dopo il riavvio dell'applicazione.
@@ -715,6 +715,3 @@ Reconnect %s to %s|%s opnieuw verbinden met %s
Editing your circuit:|Uw schakeling bewerken:
Generating new layouts:|Nieuwe layouts genereren:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|De AI Circuit Analysator vereist een DIYLC Cloud-account. Wilt u nu inloggen?
UI Theme|Interfacethema
System|Systeem
UI theme selection will be applied after the application is restarted.|Interfacethema wordt toegepast nadat het programma opnieuw is opgestart.
@@ -710,6 +710,3 @@ Reconnect %s to %s|Reconectar %s a %s
Editing your circuit:|Edição do seu circuito:
Generating new layouts:|Geração de novos layouts:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|O Analisador de Circuito IA requer uma conta DIYLC Cloud. Deseja entrar agora?
UI Theme|Tema da interface
System|Sistema
UI theme selection will be applied after the application is restarted.|A seleção do tema da interface se aplicará depois de reiniciar o aplicativo.
@@ -706,6 +706,3 @@ Reconnect %s to %s|Ponovo poveži %s sa %s
Editing your circuit:|Izmenama vašeg kola:
Generating new layouts:|Generisanju novih rasporeda:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI Analizator Kola zahteva DIYLC Cloud nalog. Da li želite da se prijavite sada?
UI Theme|Tema interfejsa
System|Sistemska
UI theme selection will be applied after the application is restarted.|Odabir teme interfejsa će biti primenjen nakon sledećeg pokretanja aplikacije.
@@ -708,6 +708,3 @@ Reconnect %s to %s|%s को %s से फिर से जोड़ें
Editing your circuit:|आपके सर्किट को संपादित करना:
Generating new layouts:|नए लेआउट बनाना:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI सर्किट विश्लेषक के लिए DIYLC Cloud खाते की आवश्यकता है। क्या आप अभी लॉग इन करना चाहेंगे?
UI Theme|UI थीम
System|सिस्टम
UI theme selection will be applied after the application is restarted.|UI थीम चयन एप्लिकेशन रीस्टार्ट होने के बाद लागू होगा।
@@ -708,6 +708,3 @@ Reconnect %s to %s|将 %s 重新连接到 %s
Editing your circuit:|编辑您的电路:
Generating new layouts:|生成新的布局:
AI Circuit Analyzer requires a DIYLC Cloud account. Would you like to log in now?|AI电路分析器需要 DIYLC Cloud 账户。是否立即登录?
UI Theme|界面主题
System|系统
UI theme selection will be applied after the application is restarted.|界面主题选择将在应用程序重启后生效。