diff --git a/data/com.github.subhadeepjasu.pebbles.gschema.xml.in b/data/com.github.subhadeepjasu.pebbles.gschema.xml.in index f93921f3..0921e260 100644 --- a/data/com.github.subhadeepjasu.pebbles.gschema.xml.in +++ b/data/com.github.subhadeepjasu.pebbles.gschema.xml.in @@ -102,6 +102,11 @@ Choose the number system Select the number system. + + false + Calculus Mode: Derivative/Definite Integral + True if Definite Integral mode, False if Derivative mode + "0" Last input in Scientific View @@ -117,6 +122,21 @@ Last input in Calculator View Last input in Calculator View + + "" + Last input upper limit in Calculus View + Last input upper limit for definite integral in Calculus View + + + "" + Last input lower limit in Calculus View + Last input lower limit for definite integral in Calculus View + + + "" + Last input x limit in Calculus View + Last input x limit for derivative in Calculus View + [] Last input equations in Graphing View diff --git a/data/com.github.subhadeepjasu.pebbles.metainfo.xml.in b/data/com.github.subhadeepjasu.pebbles.metainfo.xml.in index 32667930..0f75ef28 100644 --- a/data/com.github.subhadeepjasu.pebbles.metainfo.xml.in +++ b/data/com.github.subhadeepjasu.pebbles.metainfo.xml.in @@ -49,7 +49,7 @@ Calculator - + Subhadeep Jasu https://subhadeepjasu.github.io/#/project/pebbles @@ -61,18 +61,18 @@ #84AEAA - rgb(39,40,99) + #272863 com.github.subhadeepjasu.pebbles com.github.subhadeepjasu.pebbles.desktop Scientific Mode - https://raw.githubusercontent.com/SubhadeepJasu/pebbles/master/screenshots/ScreenshotScientific.png + https://raw.githubusercontent.com/SubhadeepJasu/pebbles/master/screenshots/ScientificMode.png Scientific Mode - https://raw.githubusercontent.com/SubhadeepJasu/pebbles/master/screenshots/ScreenshotScientificDark.png + https://raw.githubusercontent.com/SubhadeepJasu/pebbles/master/screenshots/ScientificModeDark.png diff --git a/data/ui/date_view.blp b/data/ui/date_view.blp index 08ff00f9..32877b84 100644 --- a/data/ui/date_view.blp +++ b/data/ui/date_view.blp @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Subhadeep Jasu using Gtk 4.0; -using Adw 1; template $PebblesDateView: $PebblesView { selected_view: bind date_stack.visible-child-name; diff --git a/src/Settings.vala b/src/Settings.vala index ff06ea6f..40ab34c6 100644 --- a/src/Settings.vala +++ b/src/Settings.vala @@ -23,6 +23,7 @@ namespace Pebbles { public const string KEY_DECIMAL_PLACES = "decimal-places"; public const string KEY_INTEGRATION_RESOLUTION = "integration-resolution"; public const string KEY_DERIVATIVE_ACCURACY = "derivative-accuracy"; + public const string KEY_CALCULUS_MODE = "calculus-mode"; public const string KEY_FOREX_API_KEY = "forex-api-key"; public const string KEY_FOREX_API_TIMESTAMP = "forex-timestamp"; public const string KEY_FOREX_RATES_CACHE = "forex-rates-cache"; @@ -32,6 +33,9 @@ namespace Pebbles { public const string KEY_LAST_INPUT_SCIENTIFIC = "last-input-scientific"; public const string KEY_LAST_INPUT_PROGRAMMER = "last-input-programmer"; public const string KEY_LAST_INPUT_CALCULUS = "last-input-calculus"; + public const string KEY_LAST_INPUT_CALCULUS_X = "last-input-calculus-x"; + public const string KEY_LAST_INPUT_CALCULUS_UPPER_LIM = "last-input-calculus-upper-lim"; + public const string KEY_LAST_INPUT_CALCULUS_LOWER_LIM = "last-input-calculus-lower-lim"; public const string KEY_LAST_INPUT_GRAPHING = "last-input-graphing"; public const string KEY_DATE_DIFF_FROM = "date-diff-from"; public const string KEY_DATE_DIFF_TO = "date-diff-to"; @@ -60,6 +64,7 @@ namespace Pebbles { keys.append (KEY_GLOBAL_ANGLE_UNIT); keys.append (KEY_GLOBAL_WORD_LENGTH); keys.append (KEY_NUMBER_SYSTEM); + keys.append (KEY_CALCULUS_MODE); keys.append (KEY_LAST_INPUT_SCIENTIFIC); keys.append (KEY_LAST_INPUT_PROGRAMMER); keys.append (KEY_LAST_INPUT_CALCULUS); @@ -181,6 +186,11 @@ namespace Pebbles { set { set_enum (KEY_NUMBER_SYSTEM, value); } } + public bool calculus_mode { + get { return get_boolean (KEY_CALCULUS_MODE); } + set { set_boolean (KEY_CALCULUS_MODE, value); } + } + public string last_input_scientific { owned get { return get_string (KEY_LAST_INPUT_SCIENTIFIC); } set { set_string (KEY_LAST_INPUT_SCIENTIFIC, value); } @@ -196,6 +206,21 @@ namespace Pebbles { set { set_string (KEY_LAST_INPUT_CALCULUS, value); } } + public string last_input_calculus_x { + owned get { return get_string (KEY_LAST_INPUT_CALCULUS_X); } + set { set_string (KEY_LAST_INPUT_CALCULUS_X, value); } + } + + public string last_input_calculus_upper_lim { + owned get { return get_string (KEY_LAST_INPUT_CALCULUS_UPPER_LIM); } + set { set_string (KEY_LAST_INPUT_CALCULUS_UPPER_LIM, value); } + } + + public string last_input_calculus_lower_lim { + owned get { return get_string (KEY_LAST_INPUT_CALCULUS_LOWER_LIM); } + set { set_string (KEY_LAST_INPUT_CALCULUS_LOWER_LIM, value); } + } + public string[] last_input_graphing { owned get { return get_strv (KEY_LAST_INPUT_GRAPHING); } set { set_strv (KEY_LAST_INPUT_GRAPHING, value); } diff --git a/src/shell/MainWindow.vala b/src/shell/MainWindow.vala index d0fb1614..3de1a258 100644 --- a/src/shell/MainWindow.vala +++ b/src/shell/MainWindow.vala @@ -73,6 +73,7 @@ namespace Pebbles { public Gtk.Stack date_header_box_stack; public Gtk.Switch diff_mode_switch; public Gtk.Switch add_mode_switch; + public Granite.ModeSwitch calculus_mode_button; [GtkChild] private unowned Gtk.Box currency_header_box; [GtkChild] @@ -274,12 +275,14 @@ namespace Pebbles { on_change_mode (); }); - var calculus_mode_button = new Granite.ModeSwitch.from_icon_name ( + calculus_mode_button = new Granite.ModeSwitch.from_icon_name ( "derivative-mode-symbolic", "integral-mode-symbolic" ); calculus_header_box.append (calculus_mode_button); - + if (settings.load_last_session) { + calculus_mode_button.active = settings.calculus_mode; + } calculus_mode_button.notify["active"].connect (() => { calculus_view.integral_mode = calculus_mode_button.active; }); @@ -682,6 +685,14 @@ namespace Pebbles { on_memory_clear (global ? "global" : Context.SCIENTIFIC); }); + calculus_view.on_memory_recall.connect ((global) => { + return on_memory_recall (global ? "global" : Context.CALCULUS); + }); + + calculus_view.on_memory_clear.connect ((global) => { + on_memory_clear (global ? "global" : Context.CALCULUS); + }); + statistics_view.on_memory_recall.connect ((global) => { return on_memory_recall (global ? "global" : Context.STATISTICS); }); @@ -939,7 +950,6 @@ namespace Pebbles { protected void history_recall (HistoryModel _history) { switch (_history.context) { case Context.SCIENTIFIC: - case Context.CALCULUS: case Context.GRAPHING: settings.global_angle_unit = (GlobalAngleUnit) _history.metadata.metadata_1; switch (settings.global_angle_unit) { @@ -960,6 +970,28 @@ namespace Pebbles { break; } break; + case Context.CALCULUS: + settings.global_angle_unit = (GlobalAngleUnit) _history.metadata.metadata_1; + switch (settings.global_angle_unit) { + case RAD: + angle_mode.label_text = "RAD"; + graph_angle_mode.label_text = "RAD"; + calculus_angle_mode.label_text = "RAD"; + break; + case GRAD: + angle_mode.label_text = "GRA"; + graph_angle_mode.label_text = "GRA"; + calculus_angle_mode.label_text = "GRA"; + break; + case DEG: + angle_mode.label_text = "DEG"; + graph_angle_mode.label_text = "DEG"; + calculus_angle_mode.label_text = "DEG"; + break; + } + settings.calculus_mode = _history.metadata.metadata_2 == 1; + calculus_mode_button.active = settings.calculus_mode; + break; case Context.PROGRAMMER: settings.global_word_length = (GlobalWordLength) _history.metadata.metadata_1; switch (settings.global_word_length) { diff --git a/src/shell/views/CalculusView.vala b/src/shell/views/CalculusView.vala index c9459aed..0b32adea 100644 --- a/src/shell/views/CalculusView.vala +++ b/src/shell/views/CalculusView.vala @@ -69,6 +69,8 @@ namespace Pebbles { protected string constant_label { get; private set; default = "C"; } protected string constant_desc { get; private set; default = ""; } + private Settings settings; + public signal void on_evaluate ( string input, bool integral_mode, @@ -80,6 +82,7 @@ namespace Pebbles { public signal void on_memory_clear (bool global); construct { + settings = Pebbles.Settings.get_default (); display.on_input.connect ((text) => { on_evaluate ( text, @@ -89,6 +92,10 @@ namespace Pebbles { ); }); + if (settings.load_last_session) { + integral_mode = settings.calculus_mode; + } + load_constant_button (); Settings.get_default ().changed.connect ((key) => { if (key == "constant-key-value1" || key == "constant-key-value2") { @@ -99,6 +106,7 @@ namespace Pebbles { public void show_result (string result) { display.show_result (result); + settings.calculus_mode = integral_mode; } [GtkCallback] @@ -244,8 +252,6 @@ namespace Pebbles { } private void load_constant_button () { - var settings = Pebbles.Settings.get_default (); - var key = shift_button.active ? settings.constant_key_value2 : settings.constant_key_value1; switch (key) { case ARCHIMEDES: diff --git a/src/shell/widgets/displays/CalculusDisplay.vala b/src/shell/widgets/displays/CalculusDisplay.vala index 1e5ba88d..529d3de0 100644 --- a/src/shell/widgets/displays/CalculusDisplay.vala +++ b/src/shell/widgets/displays/CalculusDisplay.vala @@ -86,6 +86,12 @@ namespace Pebbles { }); + if (settings.load_last_session) { + limit_entry_a.text = settings.last_input_calculus_lower_lim; + limit_entry_b.text = settings.last_input_calculus_upper_lim; + limit_entry_der.text = settings.last_input_calculus_x; + } + focus_controller_main = new Gtk.EventControllerFocus (); focus_controller_main.enter.connect (() => { focused_entry = main_entry; @@ -120,16 +126,19 @@ namespace Pebbles { [GtkCallback] public void set_limit_a (Gtk.Editable entry) { limit_a = double.parse (entry.text); + settings.last_input_calculus_lower_lim = entry.text; } [GtkCallback] public void set_limit_b (Gtk.Editable entry) { limit_b = double.parse (entry.text); + settings.last_input_calculus_upper_lim = entry.text; } [GtkCallback] public void set_limit_x (Gtk.Editable entry) { limit_x = double.parse (entry.text); + settings.last_input_calculus_x = entry.text; } [GtkCallback] @@ -148,6 +157,12 @@ namespace Pebbles { main_entry.set_text (data.input); main_entry.set_position ((int) main_entry.text_length); main_label.set_text (data.result); + if (data.metadata.metadata_2 == 1) { + limit_entry_a.text = data.metadata.metadata_3; + limit_entry_b.text = data.metadata.metadata_4; + } else { + limit_entry_der.text = data.metadata.metadata_3; + } } public void show_result (string result) {