Verified Commit 1f040cbb authored by Zander Brown's avatar Zander Brown 🔲
Browse files

headerbar: unify the new/back buttons

Intentionally takes up space even in the "none" state to prevent odd HdySwitcher behaviour when changing pages
parent 54fef1b5
......@@ -586,10 +586,11 @@ public class Face : Gtk.Stack, Clocks.Clock {
public string icon_name { get; construct set; }
public HeaderBar header_bar { get; construct set; }
public PanelId panel_id { get; construct set; }
public ButtonMode button_mode { get; private set; default = NEW; }
private ContentStore alarms;
private GLib.Settings settings;
private Gtk.Button new_button;
[GtkChild]
private Gtk.Widget empty_view;
[GtkChild]
......@@ -627,13 +628,6 @@ public class Face : Gtk.Stack, Clocks.Clock {
}
});
// Translators: "New" refers to an alarm
new_button = new Gtk.Button.with_label (C_("Alarm", "New"));
new_button.valign = Gtk.Align.CENTER;
new_button.no_show_all = true;
new_button.action_name = "win.new";
header_bar.pack_start (new_button);
content_view.bind_model (alarms, (item) => {
return new Tile ((Item)item);
});
......@@ -758,18 +752,19 @@ public class Face : Gtk.Stack, Clocks.Clock {
public void update_header_bar () {
switch (header_bar.mode) {
case HeaderBar.Mode.NORMAL:
new_button.show ();
content_view.update_header_bar ();
break;
case HeaderBar.Mode.SELECTION:
content_view.update_header_bar ();
break;
case HeaderBar.Mode.STANDALONE:
header_bar.title = ringing_panel.alarm.name;
break;
default:
assert_not_reached ();
case HeaderBar.Mode.NORMAL:
button_mode = NEW;
content_view.update_header_bar ();
break;
case HeaderBar.Mode.SELECTION:
content_view.update_header_bar ();
break;
case HeaderBar.Mode.STANDALONE:
button_mode = NONE;
header_bar.title = ringing_panel.alarm.name;
break;
default:
assert_not_reached ();
}
}
}
......
......@@ -42,6 +42,12 @@ public enum PanelId {
public const int N_PANELS = 4;
public enum ButtonMode {
NEW,
BACK,
NONE
}
public interface Clock : GLib.Object {
public abstract string label { get; protected construct set; }
public abstract string icon_name { get; protected construct set; }
......@@ -51,6 +57,9 @@ public interface Clock : GLib.Object {
public virtual void activate_new () {
}
public virtual void activate_back () {
}
public virtual void activate_select_all () {
}
......
/*
* © 2013 Paolo Borelli <pborelli@gnome.org>
* © 2019 Bilal Elmoussaoui <bilal.elmoussaoui@gnome.org> &
* Zander Brown <zbrown@gnome.org>
*
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
public class Clocks.HeaderBar : Gtk.HeaderBar {
public enum Mode {
NORMAL,
SELECTION,
STANDALONE
}
[CCode (notify = false)]
public Mode mode {
get {
return _mode;
}
set {
if (_mode != value) {
_mode = value;
if (_mode == Mode.SELECTION) {
get_style_context ().add_class ("selection-mode");
button_stack.hide ();
} else {
get_style_context ().remove_class ("selection-mode");
button_stack.show ();
}
notify_property ("mode");
}
}
}
public ButtonMode button_mode {
get {
return _button_mode;
}
set {
switch (value) {
case NEW:
button_stack.visible_child_name = "new";
break;
case BACK:
button_stack.visible_child_name = "back";
break;
case NONE:
button_stack.visible_child_name = "none";
break;
}
}
}
private Mode _mode;
private ButtonMode _button_mode;
private Gtk.Stack button_stack;
construct {
button_stack = new Gtk.Stack ();
button_stack.homogeneous = true;
button_stack.transition_type = CROSSFADE;
button_stack.show ();
var new_button = new Gtk.Button.from_icon_name ("list-add-symbolic",
BUTTON);
new_button.tooltip_text = _("New");
new_button.action_name = "win.new";
new_button.show ();
button_stack.add_named (new_button, "new");
var back_button = new Gtk.Button.from_icon_name ("go-previous-symbolic",
BUTTON);
back_button.tooltip_text = _("Back");
back_button.action_name = "win.back";
back_button.show ();
button_stack.add_named (back_button, "back");
var empty = new Gtk.Box (VERTICAL, 0);
empty.show ();
button_stack.add_named (empty, "none");
pack_start (button_stack);
}
public void clear () {
custom_title = null;
foreach (Gtk.Widget w in get_children ()) {
if (w == button_stack) {
continue;
}
w.hide ();
}
}
}
......@@ -7,6 +7,7 @@ clocks_vala_sources = [
'application.vala',
'clock.vala',
'geocoding.vala',
'headerbar.vala',
'main.vala',
'search-provider.vala',
'stopwatch.vala',
......
......@@ -116,6 +116,11 @@ public class Face : Gtk.Box, Clocks.Clock {
public string icon_name { get; construct set; }
public HeaderBar header_bar { get; construct set; }
public PanelId panel_id { get; construct set; }
public ButtonMode button_mode {
get {
return NONE;
}
}
public State state { get; private set; default = State.RESET; }
......
......@@ -75,6 +75,7 @@ public class Face : Gtk.Stack, Clocks.Clock {
public string icon_name { get; construct set; }
public HeaderBar header_bar { get; construct set; }
public PanelId panel_id { get; construct set; }
public ButtonMode button_mode { get; private set; default = NONE; }
public State state { get; private set; default = State.STOPPED; }
......
......@@ -18,44 +18,6 @@
namespace Clocks {
public class HeaderBar : Gtk.HeaderBar {
public enum Mode {
NORMAL,
SELECTION,
STANDALONE
}
[CCode (notify = false)]
public Mode mode {
get {
return _mode;
}
set {
if (_mode != value) {
_mode = value;
if (_mode == Mode.SELECTION) {
get_style_context ().add_class ("selection-mode");
} else {
get_style_context ().remove_class ("selection-mode");
}
notify_property ("mode");
}
}
}
private Mode _mode;
public void clear () {
custom_title = null;
foreach (Gtk.Widget w in get_children ()) {
w.hide ();
}
}
}
public interface ContentItem : GLib.Object {
public abstract string name { get; set; }
public abstract bool selectable { get; set; default = true; }
......
......@@ -24,6 +24,7 @@ public class Window : Gtk.ApplicationWindow {
// primary menu
{ "show-primary-menu", on_show_primary_menu_activate, null, "false", null },
{ "new", on_new_activate },
{ "back", on_back_activate },
{ "help", on_help_activate },
{ "about", on_about_activate },
......@@ -52,6 +53,8 @@ public class Window : Gtk.ApplicationWindow {
private GLib.Settings settings;
private Gtk.Widget[] panels;
private Binding bind_button_mode = null;
public Window (Application app) {
Object (application: app);
......@@ -94,8 +97,17 @@ public class Window : Gtk.ApplicationWindow {
var stack_id = stack.notify["visible-child"].connect (() => {
var help_overlay = get_help_overlay ();
help_overlay.view_name = Type.from_instance(stack.visible_child).name();
var page = stack.visible_child;
help_overlay.view_name = Type.from_instance (page).name();
update_header_bar ();
if (bind_button_mode != null) {
bind_button_mode.unbind ();
}
bind_button_mode = page.bind_property ("button-mode",
header_bar,
"button-mode",
SYNC_CREATE);
});
var header_bar_id = header_bar.notify["mode"].connect (() => {
......@@ -183,6 +195,10 @@ public class Window : Gtk.ApplicationWindow {
((Clock) stack.visible_child).activate_new ();
}
private void on_back_activate () {
((Clock) stack.visible_child).activate_back ();
}
private void on_select_all_activate () {
((Clock) stack.visible_child).activate_select_all ();
}
......
......@@ -342,11 +342,11 @@ public class Face : Gtk.Stack, Clocks.Clock {
public string icon_name { get; construct set; }
public HeaderBar header_bar { get; construct set; }
public PanelId panel_id { get; construct set; }
public ButtonMode button_mode { get; private set; default = NEW; }
private ContentStore locations;
private GLib.Settings settings;
private Gtk.Button new_button;
private Gtk.Button back_button;
private Item standalone_location;
[GtkChild]
private Gtk.Widget empty_view;
......@@ -383,23 +383,6 @@ public class Face : Gtk.Stack, Clocks.Clock {
return 0;
});
// Translators: "New" refers to a world clock
new_button = new Gtk.Button.with_label (C_("World clock", "New"));
new_button.valign = Gtk.Align.CENTER;
new_button.no_show_all = true;
new_button.action_name = "win.new";
header_bar.pack_start (new_button);
back_button = new Gtk.Button ();
var back_button_image = new Gtk.Image.from_icon_name ("go-previous-symbolic", Gtk.IconSize.MENU);
back_button.valign = Gtk.Align.CENTER;
back_button.set_image (back_button_image);
back_button.no_show_all = true;
back_button.clicked.connect (() => {
reset_view ();
});
header_bar.pack_start (back_button);
content_view.bind_model (locations, (item) => {
return new Tile ((Item)item);
});
......@@ -528,6 +511,11 @@ public class Face : Gtk.Stack, Clocks.Clock {
dialog.show ();
}
public void activate_back () {
reset_view ();
button_mode = NEW;
}
public void activate_select_all () {
content_view.select_all ();
}
......@@ -545,12 +533,6 @@ public class Face : Gtk.Stack, Clocks.Clock {
return content_view.escape_pressed ();
}
public void back () {
if (visible_child == standalone) {
reset_view ();
}
}
public void reset_view () {
standalone_location = null;
visible_child = locations.get_n_items () == 0 ? empty_view : content_view;
......@@ -562,8 +544,8 @@ public class Face : Gtk.Stack, Clocks.Clock {
case HeaderBar.Mode.NORMAL:
header_bar.title = _("Clocks");
header_bar.subtitle = null;
new_button.show ();
content_view.update_header_bar ();
button_mode = NEW;
break;
case HeaderBar.Mode.SELECTION:
content_view.update_header_bar ();
......@@ -575,7 +557,7 @@ public class Face : Gtk.Stack, Clocks.Clock {
header_bar.title = standalone_location.city_name;
}
header_bar.subtitle = standalone_location.country_name;
back_button.show ();
button_mode = BACK;
break;
default:
assert_not_reached ();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment