[gnome-games/wip/exalm/libhandy3: 1/2] wip: narrow mode



commit 8aed0fdab4e77d09f8e40c1fc7c8d2e508746d53
Author: Alexander Mikhaylenko <exalm7659 gmail com>
Date:   Sun Sep 16 12:33:17 2018 +0500

    wip: narrow mode

 data/gtk-style.css                |  6 ++++++
 data/ui/application-window.ui     |  1 +
 data/ui/collection-box.ui         | 14 ++++++++++++++
 data/ui/collection-header-bar.ui  |  9 ++++++++-
 data/ui/search-bar.ui             |  2 +-
 data/ui/sidebar-view.ui           | 39 ++++++++++++++++++++++++---------------
 src/ui/application-window.vala    | 20 ++++++++++++++++++++
 src/ui/collection-box.vala        |  8 ++++++++
 src/ui/collection-header-bar.vala | 24 ++++++++++++++++++------
 src/ui/sidebar-view.vala          | 15 +++++++++++++++
 10 files changed, 115 insertions(+), 23 deletions(-)
---
diff --git a/data/gtk-style.css b/data/gtk-style.css
index 59413d5a..bea289fb 100644
--- a/data/gtk-style.css
+++ b/data/gtk-style.css
@@ -63,3 +63,9 @@ headerbar.titlebar headerbar:not(.titlebar) {
   background-image: none;
   box-shadow: none;
 }
+
+stackswitcher.narrow > button {
+  padding-left: 0;
+  padding-right: 0;
+}
+
diff --git a/data/ui/application-window.ui b/data/ui/application-window.ui
index 9efae3e7..df4aca47 100644
--- a/data/ui/application-window.ui
+++ b/data/ui/application-window.ui
@@ -6,6 +6,7 @@
     <property name="default_width">768</property>
     <property name="default_height">600</property>
     <property name="show_menubar">False</property>
+    <signal name="configure-event" handler="on_configure_event"/>
     <signal name="delete-event" after="yes" handler="on_delete_event"/>
     <signal name="key-press-event" after="yes" handler="on_key_pressed"/>
     <signal name="button-press-event" after="yes" handler="on_button_pressed"/>
diff --git a/data/ui/collection-box.ui b/data/ui/collection-box.ui
index 5864ab3b..4af7efdc 100644
--- a/data/ui/collection-box.ui
+++ b/data/ui/collection-box.ui
@@ -104,6 +104,20 @@
         </child>
       </object>
     </child>
+    <child>
+      <object class="GtkActionBar" id="narrow_action_bar">
+        <property name="visible">False</property>
+        <child type="center">
+          <object class="GtkStackSwitcher" id="view_switcher">
+            <property name="visible">True</property>
+            <property name="stack">viewstack</property>
+            <style>
+              <class name="narrow"/>
+            </style>
+          </object>
+        </child>
+      </object>
+    </child>
   </template>
   <object class="GtkImage" id="close_icon">
     <property name="visible">True</property>
diff --git a/data/ui/collection-header-bar.ui b/data/ui/collection-header-bar.ui
index 9c50a47a..ae3ce53b 100644
--- a/data/ui/collection-header-bar.ui
+++ b/data/ui/collection-header-bar.ui
@@ -56,19 +56,26 @@
       <object class="GtkStack" id="title_stack">
         <property name="visible">True</property>
         <property name="transition-type">GTK_STACK_TRANSITION_TYPE_CROSSFADE</property>
+        <property name="hhomogeneous">False</property>
         <child>
           <object class="GtkStackSwitcher" id="view_switcher">
             <property name="visible">True</property>
           </object>
+          <packing>
+            <property name="name">view_switcher</property>
+          </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="empty_title">
+          <object class="GtkLabel">
             <property name="visible">True</property>
             <property name="label" translatable="yes">Games</property>
             <style>
               <class name="title"/>
             </style>
           </object>
+          <packing>
+            <property name="name">title</property>
+          </packing>
         </child>
       </object>
     </child>
diff --git a/data/ui/search-bar.ui b/data/ui/search-bar.ui
index 3416d49f..6767a6a2 100644
--- a/data/ui/search-bar.ui
+++ b/data/ui/search-bar.ui
@@ -6,7 +6,7 @@
     <child>
       <object class="GtkSearchEntry" id="entry">
         <property name="visible">True</property>
-        <property name="width-chars">40</property>
+        <property name="width-chars">4</property>
         <signal name="search-changed" handler="on_search_changed"/>
         <signal name="activate" handler="on_search_activated"/>
       </object>
diff --git a/data/ui/sidebar-view.ui b/data/ui/sidebar-view.ui
index 8b8f8d27..9dce0e45 100644
--- a/data/ui/sidebar-view.ui
+++ b/data/ui/sidebar-view.ui
@@ -7,26 +7,35 @@
     <signal name="map" after="yes" handler="on_map"/>
     <signal name="unmap" after="no" handler="on_unmap"/>
     <child>
-      <object class="GtkScrolledWindow">
+      <object class="HdyLeaflet" id="leaflet">
         <property name="visible">True</property>
-        <property name="vexpand">True</property>
-        <property name="width_request">250</property>
+        <property name="mode_transition_type">slide</property>
+        <property name="child_transition_type">slide</property>
+        <property name="fold">unfolded</property>
+        <signal name="notify::fold" handler="on_fold_changed" after="yes"/>
         <child>
-          <object class="GtkListBox" id="list_box">
+          <object class="GtkScrolledWindow">
             <property name="visible">True</property>
-            <signal name="row-activated" handler="on_list_box_row_activated"/>
-            <signal name="row-selected" handler="on_list_box_row_selected"/>
-            <style>
-              <class name="sidebar"/>
-            </style>
+            <property name="vexpand">True</property>
+            <property name="width_request">250</property>
+            <child>
+              <object class="GtkListBox" id="list_box">
+                <property name="visible">True</property>
+                <signal name="row-activated" handler="on_list_box_row_activated"/>
+                <signal name="row-selected" handler="on_list_box_row_selected"/>
+                <style>
+                  <class name="sidebar"/>
+                </style>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GamesCollectionIconView" id="collection_view">
+            <property name="visible">True</property>
+            <property name="expand">True</property>
           </object>
         </child>
-      </object>
-    </child>
-    <child>
-      <object class="GamesCollectionIconView" id="collection_view">
-        <property name="visible">True</property>
-        <property name="expand">True</property>
       </object>
     </child>
   </template>
diff --git a/src/ui/application-window.vala b/src/ui/application-window.vala
index 7082d393..4ead319e 100644
--- a/src/ui/application-window.vala
+++ b/src/ui/application-window.vala
@@ -65,6 +65,8 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
 
        public bool loading_notification { get; set; }
 
+       public bool is_narrow { get; set; }
+
        [GtkChild]
        private Gtk.Stack content_box;
        [GtkChild]
@@ -84,9 +86,11 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
        private Binding box_search_binding;
        private Binding box_fullscreen_binding;
        private Binding box_empty_collection_binding;
+       private Binding box_narrow_binding;
        private Binding header_bar_search_binding;
        private Binding header_bar_fullscreen_binding;
        private Binding header_bar_empty_collection_binding;
+       private Binding header_bar_narrow_binding;
        private Binding loading_notification_binding;
 
        private Cancellable run_game_cancellable;
@@ -110,11 +114,16 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
                        is_collection_empty = collection.get_n_items () == 0;
                });
                is_collection_empty = collection.get_n_items () == 0;
+               is_narrow = false;
        }
 
        construct {
                settings = new Settings ("org.gnome.Games");
 
+               var window = get_window ();
+               var events = window.get_events ();
+               window.set_events (events | Gdk.EventMask.STRUCTURE_MASK);
+
                int width, height;
                settings.get ("window-size", "(ii)", out width, out height);
                var geometry = get_geometry ();
@@ -144,6 +153,11 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
                header_bar_empty_collection_binding = bind_property ("is-collection-empty", 
collection_header_bar, "is-collection-empty",
                                                                     BindingFlags.BIDIRECTIONAL);
 
+               box_narrow_binding = bind_property ("is-narrow", collection_box, "is-narrow",
+                                                   BindingFlags.DEFAULT);
+               header_bar_narrow_binding = bind_property ("is-narrow", collection_header_bar, "is-narrow",
+                                                          BindingFlags.DEFAULT);
+
                konami_code = new KonamiCode (this);
                konami_code.code_performed.connect (on_konami_code_performed);
 
@@ -209,6 +223,12 @@ private class Games.ApplicationWindow : Gtk.ApplicationWindow {
                        window_size_update_timeout = Timeout.add (WINDOW_SIZE_UPDATE_DELAY_MILLISECONDS, 
store_window_size);
        }
 
+       [GtkCallback]
+       public bool on_configure_event (Gtk.Widget widget, Gdk.EventConfigure event) {
+               is_narrow = event.width < 700;
+               return false;
+       }
+
        [GtkCallback]
        public bool on_delete_event () {
                return !quit_game ();
diff --git a/src/ui/collection-box.vala b/src/ui/collection-box.vala
index 79bf0290..c6d7955f 100644
--- a/src/ui/collection-box.vala
+++ b/src/ui/collection-box.vala
@@ -25,6 +25,10 @@ private class Games.CollectionBox : Gtk.Box {
        public Gtk.Stack viewstack {
                get { return _viewstack; }
        }
+       [GtkChild]
+       private Gtk.ActionBar narrow_action_bar;
+
+       public bool is_narrow { get; set; }
 
        private bool _is_collection_empty;
        public bool is_collection_empty {
@@ -43,6 +47,7 @@ private class Games.CollectionBox : Gtk.Box {
        private Binding platform_collection_binding;
        private Binding search_binding;
        private Binding loading_notification_binding;
+       private Binding narrow_action_bar_binding;
 
        public CollectionBox (ListStore collection) {
                Object (collection: collection);
@@ -62,6 +67,9 @@ private class Games.CollectionBox : Gtk.Box {
                                                BindingFlags.BIDIRECTIONAL);
                loading_notification_binding = bind_property ("loading-notification", 
loading_notification_revealer, "reveal-child",
                                                              BindingFlags.DEFAULT);
+
+               narrow_action_bar_binding = bind_property ("is-narrow", narrow_action_bar, "visible",
+                                                          BindingFlags.DEFAULT);
        }
 
        public bool gamepad_button_press_event (Manette.Event event) {
diff --git a/src/ui/collection-header-bar.vala b/src/ui/collection-header-bar.vala
index f2195538..1c42075b 100644
--- a/src/ui/collection-header-bar.vala
+++ b/src/ui/collection-header-bar.vala
@@ -3,6 +3,7 @@
 [GtkTemplate (ui = "/org/gnome/Games/ui/collection-header-bar.ui")]
 private class Games.CollectionHeaderBar : Gtk.HeaderBar {
        public bool search_mode { get; set; }
+
        private Gtk.Stack _viewstack;
        public Gtk.Stack viewstack {
                get { return _viewstack; }
@@ -17,19 +18,23 @@ private class Games.CollectionHeaderBar : Gtk.HeaderBar {
                get { return _is_collection_empty; }
                set {
                        _is_collection_empty = value;
-                       if (_is_collection_empty)
-                               title_stack.visible_child = empty_title;
-                       else
-                               title_stack.visible_child = view_switcher;
                        search.sensitive = !_is_collection_empty;
+                       update_title (Gtk.StackTransitionType.CROSSFADE);
+               }
+       }
+
+       private bool _is_narrow;
+       public bool is_narrow {
+               get { return _is_narrow; }
+               set {
+                       _is_narrow = value;
+                       update_title (Gtk.StackTransitionType.SLIDE_UP_DOWN);
                }
        }
 
        [GtkChild]
        private Gtk.Stack title_stack;
        [GtkChild]
-       private Gtk.Label empty_title;
-       [GtkChild]
        private Gtk.StackSwitcher view_switcher;
        [GtkChild]
        private Gtk.ToggleButton search;
@@ -39,4 +44,11 @@ private class Games.CollectionHeaderBar : Gtk.HeaderBar {
                search_binding = bind_property ("search-mode", search, "active",
                                                BindingFlags.BIDIRECTIONAL);
        }
+
+       private void update_title (Gtk.StackTransitionType transition) {
+               if (is_collection_empty || is_narrow)
+                       title_stack.set_visible_child_full ("title", transition);
+               else
+                       title_stack.set_visible_child_full ("view_switcher", transition);
+       }
 }
diff --git a/src/ui/sidebar-view.vala b/src/ui/sidebar-view.vala
index f3f5996e..1ac49546 100644
--- a/src/ui/sidebar-view.vala
+++ b/src/ui/sidebar-view.vala
@@ -50,6 +50,9 @@ private abstract class Games.SidebarView : Gtk.Box {
        [GtkChild]
        protected Gtk.ListBox list_box;
 
+       [GtkChild]
+       private Hdy.Leaflet leaflet;
+
        [GtkChild]
        private GamepadBrowse gamepad_browse;
 
@@ -177,6 +180,7 @@ private abstract class Games.SidebarView : Gtk.Box {
        [GtkCallback]
        private void on_list_box_row_activated (Gtk.ListBoxRow row_item) {
                collection_view.select_default_game (Gtk.DirectionType.RIGHT);
+               leaflet.visible_child = collection_view;
        }
 
        private void on_model_changed (uint position, uint removed, uint added) {
@@ -198,4 +202,15 @@ private abstract class Games.SidebarView : Gtk.Box {
 
                on_list_box_row_selected (row);
        }
+
+       [GtkCallback]
+       private void on_fold_changed (Object object, ParamSpec paramSpec) {
+               var folded = (leaflet.fold == Hdy.Fold.FOLDED);
+
+               if (folded)
+                       list_box.selection_mode = Gtk.SelectionMode.NONE;
+               else {
+                       list_box.selection_mode = Gtk.SelectionMode.SINGLE;
+               }
+       }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]