summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormbkma <[email protected]>2019-04-23 21:07:07 +0200
committerraveit65 <[email protected]>2019-05-07 21:13:40 +0200
commit3d27093a45116cc0ecbf1b568b9cc5efed98e2a3 (patch)
tree0f9be9bc8c240ef8c43976da1e3ded73a74abcb1
parent47c3325358011aba0e1db6d2ee430237d51d13db (diff)
downloadmate-calc-3d27093a45116cc0ecbf1b568b9cc5efed98e2a3.tar.bz2
mate-calc-3d27093a45116cc0ecbf1b568b9cc5efed98e2a3.tar.xz
mp-equation: add pre-defined physical constants
This adds some fundamental physical constants: - Velocity of Light "c₀", 299,792,458 m/s - Magnetic constant, "μ₀", 1.2566370614×10⁻ N/A² - Electric constant, "ε₀", 8.85418782×10⁻¹² s⁴A²/m³kg - Newtonian constant of gravitation, "G", 6.67408×10⁻¹¹ m³/(s²kg) - Planck constant, "h", 6.62607004×10⁻³⁴ m²kg/s - Elementary charge, "e", 1.6021766208(98)×10⁻¹⁹ C - Electron mass, "mₑ", 9.10938356×10⁻³¹ kg - Proton mass, "mₚ", 1.672621898(21)×10⁻²⁷ kg - Avogrado constant, "Nₐ", 6.02214086×10²³ mol⁻¹ They are taken from https://en.wikipedia.org/wiki/Physical_constant#Universal_constants To insert them one would enter the corresponding symbol or use the gui. They are set to a MPNumber from string.
-rw-r--r--src/buttons-advanced.ui47
-rw-r--r--src/math-buttons.c61
-rw-r--r--src/mp-equation.c46
3 files changed, 148 insertions, 6 deletions
diff --git a/src/buttons-advanced.ui b/src/buttons-advanced.ui
index c668b25..df93b8d 100644
--- a/src/buttons-advanced.ui
+++ b/src/buttons-advanced.ui
@@ -766,8 +766,8 @@
</child>
</object>
<packing>
- <property name="left_attach">9</property>
- <property name="top_attach">4</property>
+ <property name="left_attach">10</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
@@ -861,7 +861,7 @@
<signal name="clicked" handler="button_cb" swapped="no"/>
</object>
<packing>
- <property name="left_attach">10</property>
+ <property name="left_attach">9</property>
<property name="top_attach">4</property>
</packing>
</child>
@@ -949,7 +949,46 @@
</packing>
</child>
<child>
- <placeholder/>
+ <object class="GtkButton" id="calc_const_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="const_cb" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">const</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkArrow" id="arrow3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="arrow_type">down</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">10</property>
+ <property name="top_attach">4</property>
+ </packing>
</child>
</object>
</child>
diff --git a/src/math-buttons.c b/src/math-buttons.c
index 50b15a7..22d8570 100644
--- a/src/math-buttons.c
+++ b/src/math-buttons.c
@@ -45,6 +45,7 @@ struct MathButtonsPrivate
GtkWidget *shift_left_menu, *shift_right_menu;
GtkWidget *function_menu;
+ GtkWidget *const_menu;
GList *superscript_toggles;
GList *subscript_toggles;
@@ -125,6 +126,9 @@ static ButtonData button_data[] = {
{"function", NULL, FUNCTION,
/* Tooltip for the additional functions button */
N_("Additional Functions")},
+ {"const", NULL, FUNCTION,
+ /* Tooltip for the additional constant button */
+ N_("Additional constants")},
{"x_pow_y", "^", FUNCTION,
/* Tooltip for the exponent button */
N_("Exponent [^ or **]")},
@@ -1021,6 +1025,63 @@ function_cb(GtkWidget *widget, MathButtons *buttons)
popup_button_menu(widget, GTK_MENU(buttons->priv->function_menu));
}
+static void
+insert_const_cb(GtkWidget *widget, MathButtons *buttons)
+{
+ math_equation_insert(buttons->priv->equation, g_object_get_data(G_OBJECT(widget), "const"));
+}
+
+
+void const_cb(GtkWidget *widget, MathButtons *buttons);
+G_MODULE_EXPORT
+void
+const_cb(GtkWidget *widget, MathButtons *buttons)
+{
+ if (!buttons->priv->const_menu) {
+ gint i;
+ GtkWidget *menu;
+ struct
+ {
+ gchar *name, *constant;
+ } constants[] =
+ {
+ { /* Tooltip for the c₀ component button */
+ N_("Velocity of Light"), "c₀" },
+ { /* Tooltip for the μ₀ component button */
+ N_("Magnetic constant"), "μ₀" },
+ { /* Tooltip for the ε₀ button */
+ N_("Electric constant"), "ε₀" },
+ { /* Tooltip for the G button */
+ N_("Newtonian constant of gravitation"), "G" },
+ { /* Tooltip for the h button */
+ N_("Planck constant"), "h" },
+ { /* Tooltip for the e button */
+ N_("Elementary charge"), "e" },
+ { /* Tooltip for the mₑ button */
+ N_("Electron mass"), "mₑ" },
+ { /* Tooltip for the mₚ button */
+ N_("Proton mass"), "mₚ" },
+ { /* Tooltip for the Nₐ button */
+ N_("Avogrado constant"), "Nₐ" },
+ { NULL, NULL }
+ };
+
+ menu = buttons->priv->const_menu = gtk_menu_new();
+ gtk_menu_set_reserve_toggle_size(GTK_MENU(menu), FALSE);
+
+ for (i = 0; constants[i].name != NULL; i++) {
+ GtkWidget *item;
+
+ item = gtk_menu_item_new_with_label(_(constants[i].name));
+ g_object_set_data(G_OBJECT(item), "const", g_strdup(constants[i].constant));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ g_signal_connect(item, "activate", G_CALLBACK(insert_const_cb), buttons);
+ gtk_widget_show(item);
+ }
+ }
+
+ popup_button_menu(widget, GTK_MENU(buttons->priv->const_menu));
+}
void factorize_cb(GtkWidget *widget, MathButtons *buttons);
G_MODULE_EXPORT
diff --git a/src/mp-equation.c b/src/mp-equation.c
index b80408e..fd3ea5a 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -18,7 +18,19 @@ static int
variable_is_defined(ParserState *state, const char *name)
{
/* FIXME: Make more generic */
- if (strcmp(name, "e") == 0 || strcmp(name, "i") == 0 || strcmp(name, "π") == 0 || strcmp(name, "pi") == 0)
+ if (strcmp(name, "e") == 0 ||
+ strcmp(name, "i") == 0 ||
+ strcmp(name, "π") == 0 ||
+ strcmp(name, "pi") == 0 ||
+ strcmp(name, "c₀") == 0 ||
+ strcmp(name, "μ₀") == 0 ||
+ strcmp(name, "ε₀") == 0 ||
+ strcmp(name, "G") == 0 ||
+ strcmp(name, "h") == 0 ||
+ strcmp(name, "e") == 0 ||
+ strcmp(name, "mₑ") == 0 ||
+ strcmp(name, "mₚ") == 0 ||
+ strcmp(name, "Nₐ") == 0)
return 1;
if (state->options->variable_is_defined)
return state->options->variable_is_defined(name, state->options->callback_data);
@@ -37,6 +49,24 @@ get_variable(ParserState *state, const char *name, MPNumber *z)
mp_get_i(z);
else if (strcmp(name, "π") == 0 || strcmp(name, "pi") == 0)
mp_get_pi(z);
+ else if (strcmp(name, "c₀") == 0)
+ mp_set_from_string("299792458", 10, z); /* velocity of light */
+ else if (strcmp(name, "μ₀") == 0)
+ mp_set_from_string("0.0000012566370614", 10, z); /* magnetic constant */
+ else if (strcmp(name, "ε₀") == 0)
+ mp_set_from_string("0.000000000008854187817", 10, z); /* electric constant */
+ else if (strcmp(name, "G") == 0)
+ mp_set_from_string("0.0000000000667310", 10, z); /* Newtonian constant of gravitation */
+ else if (strcmp(name, "h") == 0)
+ mp_set_from_string("0.000000000000000000000000000000000662606876", 10, z); /* Planck constant */
+ else if (strcmp(name, "e") == 0)
+ mp_set_from_string("0.0000000000000000001602176462", 10, z); /* elementary charge */
+ else if (strcmp(name, "mₑ") == 0)
+ mp_set_from_string("0.000000000000000000000000000000910938188", 10, z); /* electron mass */
+ else if (strcmp(name, "mₚ") == 0)
+ mp_set_from_string("0.00000000000000000000000000167262158", 10, z); /* proton mass */
+ else if (strcmp(name, "Nₐ") == 0)
+ mp_set_from_string("602214199000000000000000", 10, z); /* Avogrado constant */
else if (state->options->get_variable)
result = state->options->get_variable(name, z, state->options->callback_data);
else
@@ -49,7 +79,19 @@ static void
set_variable(ParserState *state, const char *name, const MPNumber *x)
{
// Reserved words, e, π, mod, and, or, xor, not, abs, log, ln, sqrt, int, frac, sin, cos, ...
- if (strcmp(name, "e") == 0 || strcmp(name, "i") == 0 || strcmp(name, "π") == 0 || strcmp(name, "pi") == 0)
+ if (strcmp(name, "e") == 0 ||
+ strcmp(name, "i") == 0 ||
+ strcmp(name, "π") == 0 ||
+ strcmp(name, "pi") == 0 ||
+ strcmp(name, "c₀") == 0 ||
+ strcmp(name, "μ₀") == 0 ||
+ strcmp(name, "ε₀") == 0 ||
+ strcmp(name, "G") == 0 ||
+ strcmp(name, "h") == 0 ||
+ strcmp(name, "e") == 0 ||
+ strcmp(name, "mₑ") == 0 ||
+ strcmp(name, "mₚ") == 0 ||
+ strcmp(name, "Nₐ") == 0)
return; // FALSE
if (state->options->set_variable)