Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ sources = files(
'src/Services/Parsing/Parser.vala',
'src/Services/Parsing/Token.vala',
'src/Services/RecentsManager.vala',
'src/Services/ZoomManager.vala',
'src/UI/MainWindow.vala',
'src/UI/WelcomeView.vala',
'src/Widgets/ActionBar.vala',
Expand Down
51 changes: 51 additions & 0 deletions src/Services/ZoomManager.vala
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* SPDX-License-Identifier: MIT
* SPDX-FileCopyrightText: 2017-2025 Spreadsheet Developers
*/

public class Spreadsheet.Services.ZoomManager : Object {
public const int ZOOM_LEVEL_MIN = 10;
public const int ZOOM_LEVEL_MAX = 400;
public const int ZOOM_LEVEL_STEP = 10;
public const int ZOOM_LEVEL_DEFAULT = 100;

public int zoom_level { get; set; }

public static unowned ZoomManager get_default () {
if (instance == null) {
instance = new ZoomManager ();
}

return instance;
}
private static ZoomManager? instance = null;

private ZoomManager () {
}

construct {
App.settings.bind ("zoom-level", this, "zoom_level", SettingsBindFlags.DEFAULT);
}

public void zoom_out () {
int level = zoom_level - ZOOM_LEVEL_STEP;
if (level < ZOOM_LEVEL_MIN) {
return;
}

zoom_level = level;
}

public void zoom_in () {
int level = zoom_level + ZOOM_LEVEL_STEP;
if (level > ZOOM_LEVEL_MAX) {
return;
}

zoom_level = level;
}

public void zoom_reset () {
zoom_level = ZOOM_LEVEL_DEFAULT;
}
}
67 changes: 28 additions & 39 deletions src/Widgets/ActionBar.vala
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,25 @@
* SPDX-FileCopyrightText: 2017-2025 Spreadsheet Developers
*/

public class Spreadsheet.Widgets.ActionBar : Adw.Bin {
public signal void zoom_level_changed ();

private const double ZOOM_LEVEL_MIN = 10.0;
private const double ZOOM_LEVEL_MAX = 400.0;
private const double ZOOM_LEVEL_STEP = 10.0;
private const double ZOOM_LEVEL_DEFAULT = 100.0;
using Spreadsheet.Services;

public class Spreadsheet.Widgets.ActionBar : Adw.Bin {
private Gtk.Adjustment zoom_scale_adj;

public int zoom_level {
get {
return App.settings.get_int ("zoom-level");
}
set {
zoom_scale_adj.value = value;
App.settings.set_int ("zoom-level", value);
}
}

public string zoom_level_text {
owned get {
return "%i %%".printf (zoom_level);
}
}

construct {
unowned var zoom_manager = ZoomManager.get_default ();

zoom_scale_adj = new Gtk.Adjustment (
zoom_level,
ZOOM_LEVEL_MIN,
ZOOM_LEVEL_MAX,
ZOOM_LEVEL_STEP,
ZOOM_LEVEL_STEP,
ZoomManager.ZOOM_LEVEL_DEFAULT,
ZoomManager.ZOOM_LEVEL_MIN,
ZoomManager.ZOOM_LEVEL_MAX,
ZoomManager.ZOOM_LEVEL_STEP,
ZoomManager.ZOOM_LEVEL_STEP,
0.0
);

var zoom_scale = new Gtk.Scale (Gtk.Orientation.HORIZONTAL, zoom_scale_adj) {
tooltip_text = (_("Zoom in/out the sheet")),
tooltip_text = _("Zoom in/out the sheet"),
draw_value = false,
margin_top = 3,
margin_bottom = 3,
Expand All @@ -49,8 +30,8 @@ public class Spreadsheet.Widgets.ActionBar : Adw.Bin {
};
zoom_scale.set_size_request (100, 0);

var zoom_level_button = new Gtk.Button.with_label (zoom_level_text) {
tooltip_text = (_("Reset to the default zoom level")),
var zoom_level_button = new Gtk.Button () {
tooltip_text = _("Reset to the default zoom level"),
margin_end = 12
};

Expand All @@ -60,14 +41,22 @@ public class Spreadsheet.Widgets.ActionBar : Adw.Bin {

child = action_bar;

zoom_scale_adj.value_changed.connect (() => {
zoom_level = (int) zoom_scale_adj.value;
zoom_level_button.label = zoom_level_text;
zoom_level_changed ();
});

zoom_level_button.clicked.connect ((event) => {
zoom_level = (int) ZOOM_LEVEL_DEFAULT;
zoom_manager.bind_property ("zoom_level",
zoom_scale_adj, "value",
BindingFlags.BIDIRECTIONAL | BindingFlags.SYNC_CREATE);

zoom_scale_adj.bind_property ("value",
zoom_level_button, "label",
BindingFlags.DEFAULT | BindingFlags.SYNC_CREATE,
(binding, _value, ref _label) => {
var zoom_level = (double) _value;
// Display as integer because we don't need precise zoom level
_label = "%i %%".printf ((int) zoom_level);
return true;
});

zoom_level_button.clicked.connect (() => {
zoom_manager.zoom_reset ();
});
}
}
17 changes: 10 additions & 7 deletions src/Widgets/Sheet.vala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/

using Spreadsheet.Models;
using Spreadsheet.Services;
using Spreadsheet.UI;

public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {
Expand Down Expand Up @@ -50,6 +51,7 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {
private double border;

private MainWindow window;
private unowned ZoomManager zoom_manager;
private bool is_holding_ctrl = false;

public Sheet (Page page, MainWindow window) {
Expand All @@ -58,6 +60,7 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {
);

this.window = window;
zoom_manager = ZoomManager.get_default ();

focusable = true;
focus_on_click = true;
Expand Down Expand Up @@ -90,7 +93,7 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {

update_zoom_level ();

window.action_bar.zoom_level_changed.connect (() => {
zoom_manager.notify["zoom-level"].connect (() => {
update_zoom_level ();
});

Expand Down Expand Up @@ -219,12 +222,12 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {

// Only sensitive for horizontal scroll
if (y_delta > 0) {
window.action_bar.zoom_level -= 10;
zoom_manager.zoom_out ();
return true;
}

if (y_delta < 0) {
window.action_bar.zoom_level += 10;
zoom_manager.zoom_in ();
return true;
}

Expand All @@ -235,13 +238,13 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {
if ((state & Gdk.ModifierType.CONTROL_MASK) != 0) {
switch (keyval) {
case Gdk.Key.plus:
window.action_bar.zoom_level += 10;
zoom_manager.zoom_in ();
return true;
case Gdk.Key.minus:
window.action_bar.zoom_level -= 10;
zoom_manager.zoom_out ();
return true;
case Gdk.Key.@0:
window.action_bar.zoom_level = 100;
zoom_manager.zoom_reset ();
return true;
case Gdk.Key.Home:
select (0, 0);
Expand Down Expand Up @@ -323,7 +326,7 @@ public class Spreadsheet.Widgets.Sheet : Gtk.DrawingArea {
}

private void update_zoom_level () {
double zoom_level = window.action_bar.zoom_level * 0.01;
double zoom_level = zoom_manager.zoom_level * 0.01;

width = DEFAULT_WIDTH * zoom_level;
height = DEFAULT_HEIGHT * zoom_level;
Expand Down