mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
GWT: Refactor TranslateApp to make the suggestion panel and the settings panel separate classes. This makes it possible to reuse them in mosg and fridge.
This commit is contained in:
@@ -0,0 +1,149 @@
|
|||||||
|
package se.chalmers.cs.gf.gwt.client;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.gwt.user.client.ui.ChangeListener;
|
||||||
|
import com.google.gwt.user.client.ui.Composite;
|
||||||
|
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||||
|
import com.google.gwt.user.client.ui.Label;
|
||||||
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
|
||||||
|
public class SettingsPanel extends Composite {
|
||||||
|
|
||||||
|
private PGF pgf;
|
||||||
|
private PGF.Grammar grammar;
|
||||||
|
|
||||||
|
private GrammarBox grammarBox;
|
||||||
|
private InputLanguageBox fromLangBox;
|
||||||
|
private OutputLanguageBox toLangBox;
|
||||||
|
|
||||||
|
private List<SettingsListener> listeners = new LinkedList<SettingsListener>();
|
||||||
|
|
||||||
|
public SettingsPanel (PGF pgf) {
|
||||||
|
this.pgf = pgf;
|
||||||
|
|
||||||
|
grammarBox = new GrammarBox();
|
||||||
|
grammarBox.addChangeListener(new ChangeListener() {
|
||||||
|
public void onChange(Widget sender) {
|
||||||
|
updateSelectedGrammar();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ChangeListener languageChangeListener = new ChangeListener() {
|
||||||
|
public void onChange(Widget sender) {
|
||||||
|
updateSelectedLanguages();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fromLangBox = new InputLanguageBox();
|
||||||
|
fromLangBox.addChangeListener(languageChangeListener);
|
||||||
|
|
||||||
|
toLangBox = new OutputLanguageBox();
|
||||||
|
toLangBox.addChangeListener(languageChangeListener);
|
||||||
|
|
||||||
|
HorizontalPanel settingsPanel = new HorizontalPanel();
|
||||||
|
settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
|
||||||
|
settingsPanel.add(new Label("Grammar:"));
|
||||||
|
settingsPanel.add(grammarBox);
|
||||||
|
settingsPanel.add(new Label("From:"));
|
||||||
|
settingsPanel.add(fromLangBox);
|
||||||
|
settingsPanel.add(new Label("To:"));
|
||||||
|
settingsPanel.add(toLangBox);
|
||||||
|
|
||||||
|
initWidget(settingsPanel);
|
||||||
|
setStylePrimaryName("my-SettingsPanel");
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface SettingsListener {
|
||||||
|
public void grammarChanged(String pgfName);
|
||||||
|
public void languagesChanged(List<String> inputLangs, List<String> outputLangs);
|
||||||
|
public void settingsError(String msg, Throwable e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSettingsListener(SettingsListener listener) {
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fireGrammarChanged() {
|
||||||
|
for (SettingsListener listener : listeners) {
|
||||||
|
listener.grammarChanged(getGrammarName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fireLanguagesChanged() {
|
||||||
|
for (SettingsListener listener : listeners) {
|
||||||
|
listener.languagesChanged(getInputLanguages(), getOutputLanguages());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fireSettingsError(String msg, Throwable e) {
|
||||||
|
for (SettingsListener listener : listeners) {
|
||||||
|
listener.settingsError(msg, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Grammars
|
||||||
|
//
|
||||||
|
|
||||||
|
public void updateAvailableGrammars() {
|
||||||
|
pgf.listGrammars(new PGF.GrammarNamesCallback() {
|
||||||
|
public void onResult(PGF.GrammarNames grammarNames) {
|
||||||
|
grammarBox.setGrammarNames(grammarNames);
|
||||||
|
// setGrammarNames() picks the first grammar automatically
|
||||||
|
updateSelectedGrammar();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onError (Throwable e) {
|
||||||
|
fireSettingsError("Error getting grammar list", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSelectedGrammar() {
|
||||||
|
fireGrammarChanged();
|
||||||
|
updateAvailableLanguages();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PGF.Grammar getGrammar() {
|
||||||
|
return grammar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGrammarName() {
|
||||||
|
return grammarBox.getSelectedGrammar();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Languages
|
||||||
|
//
|
||||||
|
|
||||||
|
public List<String> getInputLanguages() {
|
||||||
|
return fromLangBox.getSelectedValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getOutputLanguages() {
|
||||||
|
return toLangBox.getSelectedValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAvailableLanguages() {
|
||||||
|
pgf.grammar(getGrammarName(), new PGF.GrammarCallback() {
|
||||||
|
public void onResult(PGF.Grammar grammar) {
|
||||||
|
SettingsPanel.this.grammar = grammar;
|
||||||
|
fromLangBox.setGrammar(grammar);
|
||||||
|
toLangBox.setGrammar(grammar);
|
||||||
|
updateSelectedLanguages();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onError (Throwable e) {
|
||||||
|
fireSettingsError("Error getting language information", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSelectedLanguages() {
|
||||||
|
fireLanguagesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
package se.chalmers.cs.gf.gwt.client;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.GWT;
|
||||||
|
import com.google.gwt.user.client.ui.Button;
|
||||||
|
import com.google.gwt.user.client.ui.ClickListener;
|
||||||
|
import com.google.gwt.user.client.ui.Composite;
|
||||||
|
import com.google.gwt.user.client.ui.DockPanel;
|
||||||
|
import com.google.gwt.user.client.ui.HasVerticalAlignment;
|
||||||
|
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
|
||||||
|
import com.google.gwt.user.client.ui.SuggestBox;
|
||||||
|
import com.google.gwt.user.client.ui.Widget;
|
||||||
|
|
||||||
|
public class SuggestPanel extends Composite {
|
||||||
|
|
||||||
|
private CompletionOracle oracle;
|
||||||
|
private SuggestBox suggest;
|
||||||
|
private Button submitButton;
|
||||||
|
|
||||||
|
private List<SubmitListener> listeners = new LinkedList<SubmitListener>();
|
||||||
|
|
||||||
|
public SuggestPanel (PGF pgf) {
|
||||||
|
|
||||||
|
oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() {
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
GWT.log("Completion failed", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
suggest = new SuggestBox(oracle);
|
||||||
|
suggest.setLimit(10);
|
||||||
|
suggest.addKeyboardListener(new KeyboardListenerAdapter() {
|
||||||
|
public void onKeyUp (Widget sender, char keyCode, int modifiers) {
|
||||||
|
if (keyCode == KEY_ENTER) {
|
||||||
|
submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
submitButton = new Button("Submit");
|
||||||
|
submitButton.setEnabled(false);
|
||||||
|
submitButton.addClickListener(new ClickListener() {
|
||||||
|
public void onClick(Widget sender) {
|
||||||
|
submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
DockPanel mainPanel = new DockPanel();
|
||||||
|
mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
|
||||||
|
mainPanel.add(suggest, DockPanel.CENTER);
|
||||||
|
mainPanel.add(submitButton, DockPanel.EAST);
|
||||||
|
|
||||||
|
initWidget(mainPanel);
|
||||||
|
setStylePrimaryName("my-SuggestPanel");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLimit() {
|
||||||
|
return suggest.getLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText() {
|
||||||
|
return suggest.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return suggest.getTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onLoad() {
|
||||||
|
suggest.setFocus(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setButtonText (String text) {
|
||||||
|
submitButton.setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
submitButton.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrammarName(String pgfName) {
|
||||||
|
oracle.setGrammarName(pgfName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInputLangs(List<String> inputLangs) {
|
||||||
|
oracle.setInputLangs(inputLangs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLimit(int limit) {
|
||||||
|
suggest.setLimit(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setText (String text) {
|
||||||
|
suggest.setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
suggest.setTitle(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSubmitListener(SubmitListener listener) {
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void submit() {
|
||||||
|
String text = getText();
|
||||||
|
for (SubmitListener listener : listeners) {
|
||||||
|
listener.onSubmit(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface SubmitListener {
|
||||||
|
public void onSubmit(String text);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,16 +1,11 @@
|
|||||||
package se.chalmers.cs.gf.gwt.client;
|
package se.chalmers.cs.gf.gwt.client;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.google.gwt.core.client.EntryPoint;
|
import com.google.gwt.core.client.EntryPoint;
|
||||||
import com.google.gwt.user.client.ui.Button;
|
|
||||||
import com.google.gwt.user.client.ui.ChangeListener;
|
|
||||||
import com.google.gwt.user.client.ui.ClickListener;
|
|
||||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
|
||||||
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
|
|
||||||
import com.google.gwt.user.client.ui.Label;
|
import com.google.gwt.user.client.ui.Label;
|
||||||
import com.google.gwt.user.client.ui.RootPanel;
|
import com.google.gwt.user.client.ui.RootPanel;
|
||||||
import com.google.gwt.user.client.ui.SuggestBox;
|
|
||||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||||
import com.google.gwt.user.client.ui.Widget;
|
|
||||||
|
|
||||||
|
|
||||||
public class TranslateApp implements EntryPoint {
|
public class TranslateApp implements EntryPoint {
|
||||||
@@ -19,13 +14,8 @@ public class TranslateApp implements EntryPoint {
|
|||||||
|
|
||||||
private PGF pgf;
|
private PGF pgf;
|
||||||
|
|
||||||
private CompletionOracle oracle;
|
private SuggestPanel suggestPanel;
|
||||||
private SuggestBox suggest;
|
private SettingsPanel settingsPanel;
|
||||||
private PGF.Grammar grammar;
|
|
||||||
private GrammarBox grammarBox;
|
|
||||||
private InputLanguageBox fromLangBox;
|
|
||||||
private OutputLanguageBox toLangBox;
|
|
||||||
private Button translateButton;
|
|
||||||
private VerticalPanel outputPanel;
|
private VerticalPanel outputPanel;
|
||||||
private StatusPopup statusPopup;
|
private StatusPopup statusPopup;
|
||||||
|
|
||||||
@@ -36,13 +26,16 @@ public class TranslateApp implements EntryPoint {
|
|||||||
private void translate() {
|
private void translate() {
|
||||||
outputPanel.clear();
|
outputPanel.clear();
|
||||||
setStatus("Translating...");
|
setStatus("Translating...");
|
||||||
pgf.translate(getGrammarName(), suggest.getText(), fromLangBox.getSelectedValues(), null,
|
pgf.translate(settingsPanel.getGrammarName(),
|
||||||
toLangBox.getSelectedValues(), new PGF.TranslateCallback() {
|
suggestPanel.getText(),
|
||||||
|
settingsPanel.getInputLanguages(), null,
|
||||||
|
settingsPanel.getOutputLanguages(),
|
||||||
|
new PGF.TranslateCallback() {
|
||||||
public void onResult (PGF.Translations translations) {
|
public void onResult (PGF.Translations translations) {
|
||||||
for (PGF.Translation t : translations.iterable()) {
|
for (PGF.Translation t : translations.iterable()) {
|
||||||
Label l = new Label(t.getText());
|
Label l = new Label(t.getText());
|
||||||
l.addStyleName("my-translation");
|
l.addStyleName("my-translation");
|
||||||
PGF.Language lang = grammar.getLanguage(t.getTo());
|
PGF.Language lang = settingsPanel.getGrammar().getLanguage(t.getTo());
|
||||||
if (lang != null) {
|
if (lang != null) {
|
||||||
l.getElement().setLang(lang.getLanguageCode());
|
l.getElement().setLang(lang.getLanguageCode());
|
||||||
}
|
}
|
||||||
@@ -71,59 +64,19 @@ public class TranslateApp implements EntryPoint {
|
|||||||
private void clearStatus() {
|
private void clearStatus() {
|
||||||
statusPopup.clearStatus();
|
statusPopup.clearStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grammars
|
// Grammars and languages
|
||||||
//
|
//
|
||||||
|
|
||||||
private String getGrammarName() {
|
|
||||||
return grammarBox.getSelectedGrammar();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateAvailableGrammars() {
|
|
||||||
pgf.listGrammars(new PGF.GrammarNamesCallback() {
|
|
||||||
public void onResult(PGF.GrammarNames grammarNames) {
|
|
||||||
grammarBox.setGrammarNames(grammarNames);
|
|
||||||
// setGrammarNames() picks the first grammar automatically
|
|
||||||
updateSelectedGrammar();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onError (Throwable e) {
|
|
||||||
showError("Error getting grammar list", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSelectedGrammar() {
|
private void updateSelectedGrammar() {
|
||||||
oracle.setGrammarName(getGrammarName());
|
suggestPanel.setGrammarName(settingsPanel.getGrammarName());
|
||||||
updateAvailableLanguages();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Languages
|
|
||||||
//
|
|
||||||
|
|
||||||
private void updateAvailableLanguages() {
|
|
||||||
pgf.grammar(getGrammarName(), new PGF.GrammarCallback() {
|
|
||||||
public void onResult(PGF.Grammar grammar) {
|
|
||||||
TranslateApp.this.grammar = grammar;
|
|
||||||
|
|
||||||
fromLangBox.setGrammar(grammar);
|
|
||||||
toLangBox.setGrammar(grammar);
|
|
||||||
|
|
||||||
updateSelectedLanguages();
|
|
||||||
clearStatus();
|
|
||||||
translateButton.setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onError (Throwable e) {
|
|
||||||
showError("Error getting language information", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSelectedLanguages() {
|
private void updateSelectedLanguages() {
|
||||||
oracle.setInputLangs(fromLangBox.getSelectedValues());
|
suggestPanel.setInputLangs(settingsPanel.getInputLanguages());
|
||||||
|
suggestPanel.setEnabled(true);
|
||||||
|
clearStatus();
|
||||||
translate();
|
translate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,58 +89,26 @@ public class TranslateApp implements EntryPoint {
|
|||||||
statusPopup = new StatusPopup();
|
statusPopup = new StatusPopup();
|
||||||
setStatus("Loading...");
|
setStatus("Loading...");
|
||||||
|
|
||||||
oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() {
|
suggestPanel = new SuggestPanel(pgf);
|
||||||
public void onError(Throwable e) {
|
suggestPanel.setButtonText("Translate");
|
||||||
showError("Completion failed", e);
|
suggestPanel.addSubmitListener(new SuggestPanel.SubmitListener() {
|
||||||
}
|
public void onSubmit(String text) {
|
||||||
});
|
|
||||||
|
|
||||||
suggest = new SuggestBox(oracle);
|
|
||||||
suggest.addKeyboardListener(new KeyboardListenerAdapter() {
|
|
||||||
public void onKeyUp (Widget sender, char keyCode, int modifiers) {
|
|
||||||
if (keyCode == KEY_ENTER) {
|
|
||||||
translate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
grammarBox = new GrammarBox();
|
|
||||||
grammarBox.addChangeListener(new ChangeListener() {
|
|
||||||
public void onChange(Widget sender) {
|
|
||||||
updateSelectedGrammar();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ChangeListener languageChangeListener = new ChangeListener() {
|
|
||||||
public void onChange(Widget sender) {
|
|
||||||
updateSelectedLanguages();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fromLangBox = new InputLanguageBox();
|
|
||||||
fromLangBox.addChangeListener(languageChangeListener);
|
|
||||||
|
|
||||||
toLangBox = new OutputLanguageBox();
|
|
||||||
toLangBox.addChangeListener(languageChangeListener);
|
|
||||||
|
|
||||||
translateButton = new Button("Translate");
|
|
||||||
translateButton.setEnabled(false);
|
|
||||||
translateButton.addClickListener(new ClickListener() {
|
|
||||||
public void onClick(Widget sender) {
|
|
||||||
translate();
|
translate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
HorizontalPanel settingsPanel = new HorizontalPanel();
|
settingsPanel = new SettingsPanel(pgf);
|
||||||
settingsPanel.addStyleName("my-settingsPanel");
|
settingsPanel.addSettingsListener(new SettingsPanel.SettingsListener() {
|
||||||
settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
|
public void grammarChanged(String pgfName) {
|
||||||
settingsPanel.add(new Label("Grammar:"));
|
updateSelectedGrammar();
|
||||||
settingsPanel.add(grammarBox);
|
}
|
||||||
settingsPanel.add(new Label("From:"));
|
public void languagesChanged(List<String> inputLangs, List<String> outputLangs) {
|
||||||
settingsPanel.add(fromLangBox);
|
updateSelectedLanguages();
|
||||||
settingsPanel.add(new Label("To:"));
|
}
|
||||||
settingsPanel.add(toLangBox);
|
public void settingsError(String msg, Throwable e) {
|
||||||
settingsPanel.add(translateButton);
|
showError(msg,e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
outputPanel = new VerticalPanel();
|
outputPanel = new VerticalPanel();
|
||||||
outputPanel.addStyleName("my-translations");
|
outputPanel.addStyleName("my-translations");
|
||||||
@@ -195,7 +116,7 @@ public class TranslateApp implements EntryPoint {
|
|||||||
VerticalPanel vPanel = new VerticalPanel();
|
VerticalPanel vPanel = new VerticalPanel();
|
||||||
vPanel.setWidth("100%");
|
vPanel.setWidth("100%");
|
||||||
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
|
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
|
||||||
vPanel.add(suggest);
|
vPanel.add(suggestPanel);
|
||||||
vPanel.add(settingsPanel);
|
vPanel.add(settingsPanel);
|
||||||
vPanel.add(outputPanel);
|
vPanel.add(outputPanel);
|
||||||
|
|
||||||
@@ -210,7 +131,7 @@ public class TranslateApp implements EntryPoint {
|
|||||||
public void onModuleLoad() {
|
public void onModuleLoad() {
|
||||||
pgf = new PGF(pgfBaseURL);
|
pgf = new PGF(pgfBaseURL);
|
||||||
createTranslationUI();
|
createTranslationUI();
|
||||||
updateAvailableGrammars();
|
settingsPanel.updateAvailableGrammars();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
/** Add css rules here for your application. */
|
/** Add css rules here for your application. */
|
||||||
|
|
||||||
.gwt-SuggestBox {
|
.my-SuggestPanel {
|
||||||
width: 70%;
|
|
||||||
font-size: 150%;
|
|
||||||
margin: 1em 0 0.5em 0;
|
margin: 1em 0 0.5em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-settingsPanel * {
|
.my-SuggestPanel .gwt-SuggestBox {
|
||||||
|
width: 400px;
|
||||||
|
font-size: 150%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.my-SuggestPanel .gwt-Button {
|
||||||
|
font-size: 150%;
|
||||||
|
margin: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.my-SettingsPanel * {
|
||||||
margin: 0 0.4em;
|
margin: 0 0.4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user