[gnome-games/wip/exalm/unified-window: 10/26] collection-header-bar: Merge into CollectionView



commit 2d14718201f43df74b4367f70530452dae261212
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Fri Apr 10 03:13:09 2020 +0500

    collection-header-bar: Merge into CollectionView
    
    There's no more reason to have a separate header bar object. This allows
    to finally remove the ugly bindings.

 data/org.gnome.Games.gresource.xml |   1 -
 data/ui/collection-header-bar.ui   | 183 ------------------------------------
 data/ui/collection-view.ui         | 187 +++++++++++++++++++++++++++++++++++--
 src/meson.build                    |   1 -
 src/ui/collection-header-bar.vala  |  64 -------------
 src/ui/collection-view.vala        |  65 +++++++------
 6 files changed, 214 insertions(+), 287 deletions(-)
---
diff --git a/data/org.gnome.Games.gresource.xml b/data/org.gnome.Games.gresource.xml
index 68e1260b..7d9fe8d4 100644
--- a/data/org.gnome.Games.gresource.xml
+++ b/data/org.gnome.Games.gresource.xml
@@ -12,7 +12,6 @@
     <file preprocess="xml-stripblanks">gesture/stick-symbolic.svg</file>
     <file preprocess="xml-stripblanks">ui/application-window.ui</file>
     <file preprocess="xml-stripblanks">ui/checkmark-item.ui</file>
-    <file preprocess="xml-stripblanks">ui/collection-header-bar.ui</file>
     <file preprocess="xml-stripblanks">ui/collection-icon-view.ui</file>
     <file preprocess="xml-stripblanks">ui/collection-view.ui</file>
     <file preprocess="xml-stripblanks">ui/display-box.ui</file>
diff --git a/data/ui/collection-view.ui b/data/ui/collection-view.ui
index 97f3905f..57872117 100644
--- a/data/ui/collection-view.ui
+++ b/data/ui/collection-view.ui
@@ -7,13 +7,163 @@
     <property name="hexpand">True</property>
     <property name="vexpand">True</property>
     <property name="width-request">360</property>
-    <signal name="notify::is-folded" handler="update_bottom_bar"/>
+    <signal name="notify::is-folded" handler="on_folded_changed"/>
     <signal name="notify::is-showing-bottom-bar" handler="update_bottom_bar"/>
     <signal name="notify::is-subview-open" handler="update_bottom_bar"/>
+    <signal name="notify::is-collection-empty" handler="update_adaptive_state"/>
     <child>
-      <object class="GamesCollectionHeaderBar" id="header_bar">
+      <object class="HdyDeck" id="deck">
         <property name="visible">True</property>
-        <property name="swipe-group">swipe_group</property>
+        <child>
+          <object class="HdyHeaderBar" id="header_bar">
+            <property name="visible">True</property>
+            <property name="show-close-button">True</property>
+            <property name="centering-policy">strict</property>
+            <style>
+              <class name="titlebar"/>
+            </style>
+            <child>
+              <object class="GtkButton" id="add_game">
+                <property name="visible">True</property>
+                <property name="valign">center</property>
+                <property name="action-name">app.add-game-files</property>
+                <style>
+                  <class name="image-button"/>
+                </style>
+                <child internal-child="accessible">
+                  <object class="AtkObject" id="a11y-back">
+                    <property name="accessible-name" translatable="yes">Add game files…</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkImage" id="add_game_image">
+                    <property name="visible">True</property>
+                    <property name="icon-name">list-add-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="pack-type">start</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkMenuButton" id="menu">
+                <property name="menu-model">primary_menu</property>
+                <!-- Translators: tooltip for the application menu button -->
+                <property name="tooltip-text" translatable="yes">Menu</property>
+                <property name="valign">center</property>
+                <property name="visible">True</property>
+                <style>
+                  <class name="image-button"/>
+                </style>
+                <child>
+                  <object class="GtkImage" id="menu_image">
+                    <property name="visible">True</property>
+                    <property name="icon-name">open-menu-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="pack-type">end</property>
+              </packing>
+            </child>
+            <child type="title">
+              <object class="HdyViewSwitcherTitle" id="view_switcher_title">
+                <property name="visible">True</property>
+                <property name="title" translatable="yes">Games</property>
+                <property name="stack">viewstack</property>
+                <property name="view-switcher-enabled" bind-source="GamesCollectionView" 
bind-property="is-collection-empty" bind-flags="bidirectional|sync-create|invert-boolean"/>
+                <signal name="notify::title-visible" handler="update_adaptive_state"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToggleButton" id="search">
+                <property name="visible">True</property>
+                <property name="valign">center</property>
+                <property name="active" bind-source="GamesCollectionView" bind-property="search-mode" 
bind-flags="bidirectional"/>
+                <property name="sensitive" bind-source="GamesCollectionView" 
bind-property="is-collection-empty" bind-flags="bidirectional|invert-boolean"/>
+                <style>
+                  <class name="image-button"/>
+                </style>
+                <child internal-child="accessible">
+                  <object class="AtkObject" id="a11y-search">
+                    <property name="accessible-name" translatable="yes">Search</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkImage" id="search_image">
+                    <property name="visible">True</property>
+                    <property name="icon-name">edit-find-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="pack-type">end</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="HdyHeaderBar" id="subview_header_bar">
+            <property name="visible">True</property>
+            <property name="show_close_button">True</property>
+            <property name="title" bind-source="GamesCollectionView" bind-property="subview-title" 
bind-flags="bidirectional"/>
+            <style>
+              <class name="titlebar"/>
+            </style>
+            <child>
+              <object class="GtkButton">
+                <property name="visible">True</property>
+                <property name="valign">center</property>
+                <signal name="clicked" handler="on_subview_back_clicked"/>
+                <style>
+                  <class name="image-button"/>
+                </style>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">Back</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">go-previous-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToggleButton" id="search_subview">
+                <property name="visible">True</property>
+                <property name="valign">center</property>
+                <property name="active" bind-source="GamesCollectionView" bind-property="search-mode" 
bind-flags="bidirectional"/>
+                <property name="sensitive" bind-source="GamesCollectionView" 
bind-property="is-collection-empty" bind-flags="bidirectional|invert-boolean"/>
+                <style>
+                  <class name="image-button"/>
+                </style>
+                <child internal-child="accessible">
+                  <object class="AtkObject">
+                    <property name="accessible-name" translatable="yes">Search</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkImage">
+                    <property name="visible">True</property>
+                    <property name="icon-name">edit-find-symbolic</property>
+                    <property name="icon-size">1</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="pack-type">end</property>
+              </packing>
+            </child>
+          </object>
+        </child>
       </object>
     </child>
     <child>
@@ -112,12 +262,17 @@
                   <object class="GtkButton">
                     <property name="visible">True</property>
                     <property name="can-focus">True</property>
-                    <property name="image">close_icon</property>
                     <property name="always-show-image">True</property>
                     <signal name="clicked" handler="on_loading_notification_closed"/>
                     <style>
                       <class name="flat"/>
                     </style>
+                    <child>
+                      <object class="GtkImage">
+                        <property name="visible">True</property>
+                        <property name="icon-name">window-close-symbolic</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
                 <style>
@@ -137,8 +292,24 @@
     </child>
   </template>
   <object class="HdySwipeGroup" id="swipe_group"/>
-  <object class="GtkImage" id="close_icon">
-    <property name="visible">True</property>
-    <property name="icon-name">window-close-symbolic</property>
-  </object>
+  <menu id="primary_menu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Pr_eferences</attribute>
+        <attribute name="action">app.preferences</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
+        <attribute name="action">win.show-help-overlay</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Help</attribute>
+        <attribute name="action">app.help</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_About Games</attribute>
+        <attribute name="action">app.about</attribute>
+      </item>
+    </section>
+  </menu>
 </interface>
diff --git a/src/meson.build b/src/meson.build
index ecd6911e..c76cb575 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -100,7 +100,6 @@ vala_sources = [
   'ui/application-window.vala',
   'ui/checkmark-item.vala',
   'ui/collection-icon-view.vala',
-  'ui/collection-header-bar.vala',
   'ui/collection-view.vala',
   'ui/display-bin.vala',
   'ui/display-box.vala',
diff --git a/src/ui/collection-view.vala b/src/ui/collection-view.vala
index e8a95e33..86b1dd9e 100644
--- a/src/ui/collection-view.vala
+++ b/src/ui/collection-view.vala
@@ -6,6 +6,14 @@ private class Games.CollectionView : Gtk.Box, UiView {
 
        public signal void game_activated (Game game);
 
+       [GtkChild]
+       private Hdy.Deck deck;
+       [GtkChild]
+       private Hdy.HeaderBar header_bar;
+       [GtkChild]
+       private Hdy.HeaderBar subview_header_bar;
+       [GtkChild]
+       private Hdy.ViewSwitcherTitle view_switcher_title;
        [GtkChild]
        private ErrorInfoBar error_info_bar;
        [GtkChild]
@@ -20,12 +28,10 @@ private class Games.CollectionView : Gtk.Box, UiView {
        private PlatformsView platform_view;
        [GtkChild]
        private Gtk.Stack empty_stack;
-       [GtkChild (name = "viewstack")]
-       private Gtk.Stack _viewstack;
        [GtkChild]
-       private Hdy.ViewSwitcherBar view_switcher_bar;
+       private Gtk.Stack viewstack;
        [GtkChild]
-       private CollectionHeaderBar header_bar;
+       private Hdy.ViewSwitcherBar view_switcher_bar;
        [GtkChild]
        private Hdy.SwipeGroup swipe_group;
 
@@ -33,10 +39,6 @@ private class Games.CollectionView : Gtk.Box, UiView {
                get { return this; }
        }
 
-       public Gtk.Stack viewstack {
-               get { return _viewstack; }
-       }
-
        private bool _is_view_active;
        public bool is_view_active {
                get { return _is_view_active; }
@@ -105,27 +107,6 @@ private class Games.CollectionView : Gtk.Box, UiView {
                        is_collection_empty = game_model.get_n_items () == 0;
                });
 
-               bind_property ("viewstack", header_bar,
-                              "viewstack", BindingFlags.SYNC_CREATE);
-
-               bind_property ("search-mode", header_bar,
-                              "search-mode", BindingFlags.BIDIRECTIONAL);
-
-               bind_property ("is-collection-empty", header_bar,
-                              "is-collection-empty", BindingFlags.BIDIRECTIONAL | BindingFlags.SYNC_CREATE);
-
-               bind_property ("is-folded", header_bar,
-                              "is-folded", BindingFlags.BIDIRECTIONAL);
-
-               bind_property ("is-showing-bottom-bar", header_bar,
-                              "is-showing-bottom-bar", BindingFlags.BIDIRECTIONAL);
-
-               bind_property ("is-subview-open", header_bar,
-                              "is-subview-open", BindingFlags.BIDIRECTIONAL);
-
-               bind_property ("subview-title", header_bar,
-                              "subview-title", BindingFlags.BIDIRECTIONAL);
-
                konami_code = new KonamiCode (window);
                konami_code.code_performed.connect (on_konami_code_performed);
        }
@@ -153,7 +134,7 @@ private class Games.CollectionView : Gtk.Box, UiView {
                if (((event.state & default_modifiers) == Gdk.ModifierType.MOD1_MASK) &&
                    (((window.get_direction () == Gtk.TextDirection.LTR) && keyval == Gdk.Key.Left) ||
                     ((window.get_direction () == Gtk.TextDirection.RTL) && keyval == Gdk.Key.Right)) &&
-                    header_bar.back ())
+                    deck.navigate (Hdy.NavigationDirection.BACK))
                        return true;
 
                if ((keyval == Gdk.Key.f || keyval == Gdk.Key.F) &&
@@ -301,8 +282,32 @@ private class Games.CollectionView : Gtk.Box, UiView {
                return false;
        }
 
+       [GtkCallback]
+       private void on_folded_changed () {
+               if (is_folded) {
+                       deck.visible_child = is_subview_open ? subview_header_bar : header_bar;
+                       swipe_group.add_swipeable (deck);
+               } else {
+                       swipe_group.remove_swipeable (deck);
+                       deck.visible_child = header_bar;
+               }
+
+               update_bottom_bar ();
+       }
+
        [GtkCallback]
        private void update_bottom_bar () {
                view_switcher_bar.reveal = is_showing_bottom_bar && (!is_folded || !is_subview_open);
        }
+
+       [GtkCallback]
+       private void update_adaptive_state () {
+               bool showing_title = view_switcher_title.title_visible;
+               is_showing_bottom_bar = showing_title && !is_collection_empty;
+       }
+
+       [GtkCallback]
+       private void on_subview_back_clicked () {
+               deck.navigate (Hdy.NavigationDirection.BACK);
+       }
 }


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