[gnome-games/wip/exalm/cleanups: 5/5] media-selector: Merge into MediaMenuButton



commit d352c6003e16d03b7b7c15a1883fc865b30c12cb
Author: Alexander Mikhaylenko <exalm7659 gmail com>
Date:   Wed May 29 18:35:57 2019 +0500

    media-selector: Merge into MediaMenuButton
    
    Also fix a visual bug.

 data/org.gnome.Games.gresource.xml |  1 -
 data/ui/media-menu-button.ui       | 19 +++++++++
 data/ui/media-selector.ui          | 23 -----------
 src/meson.build                    |  1 -
 src/ui/display-header-bar.vala     | 11 +-----
 src/ui/media-menu-button.vala      | 80 ++++++++++++++++++++++++++++++++-----
 src/ui/media-selector.vala         | 81 --------------------------------------
 7 files changed, 91 insertions(+), 125 deletions(-)
---
diff --git a/data/org.gnome.Games.gresource.xml b/data/org.gnome.Games.gresource.xml
index 8c6cb252..2a73870a 100644
--- a/data/org.gnome.Games.gresource.xml
+++ b/data/org.gnome.Games.gresource.xml
@@ -29,7 +29,6 @@
     <file preprocess="xml-stripblanks">ui/keyboard-mapper.ui</file>
     <file preprocess="xml-stripblanks">ui/keyboard-tester.ui</file>
     <file preprocess="xml-stripblanks">ui/media-menu-button.ui</file>
-    <file preprocess="xml-stripblanks">ui/media-selector.ui</file>
     <file preprocess="xml-stripblanks">ui/platforms-view.ui</file>
     <file preprocess="xml-stripblanks">ui/platform-list-item.ui</file>
     <file preprocess="xml-stripblanks">ui/preferences-page.ui</file>
diff --git a/data/ui/media-menu-button.ui b/data/ui/media-menu-button.ui
index 9a023388..4c53dde8 100644
--- a/data/ui/media-menu-button.ui
+++ b/data/ui/media-menu-button.ui
@@ -7,6 +7,7 @@
         <property name="visible">True</property>
         <property name="valign">center</property>
         <property name="use-underline">True</property>
+        <property name="popover">popover</property>
         <style>
           <class name="image-button"/>
         </style>
@@ -23,4 +24,22 @@
       </object>
     </child>
   </template>
+  <object class="GtkPopover" id="popover">
+    <property name="visible">False</property>
+    <property name="relative-to">menu_button</property>
+    <child>
+      <object class="GtkFrame">
+        <property name="visible">True</property>
+        <property name="margin">6</property>
+        <property name="shadow-type">in</property>
+        <child>
+          <object class="GtkListBox" id="list_box">
+            <property name="visible">True</property>
+            <property name="selection-mode">none</property>
+            <signal name="row-activated" after="yes" handler="on_row_activated"/>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
 </interface>
diff --git a/src/meson.build b/src/meson.build
index 735a4951..e679c6d7 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -154,7 +154,6 @@ vala_sources = [
   'ui/keyboard-mapper.vala',
   'ui/keyboard-tester.vala',
   'ui/konami-code.vala',
-  'ui/media-selector.vala',
   'ui/media-menu-button.vala',
   'ui/message-dialog.vala',
   'ui/platform-list-item.vala',
diff --git a/src/ui/display-header-bar.vala b/src/ui/display-header-bar.vala
index 9fc09f10..f8346573 100644
--- a/src/ui/display-header-bar.vala
+++ b/src/ui/display-header-bar.vala
@@ -19,14 +19,9 @@ private class Games.DisplayHeaderBar : Gtk.Bin {
        public bool is_fullscreen { get; set; }
 
        public MediaSet? media_set {
-               set {
-                       media_button.media_set = value;
-                       media_selector.media_set = value;
-               }
+               set { media_button.media_set = value; }
        }
 
-       private MediaSelector media_selector;
-
        [GtkChild]
        private InputModeSwitcher input_mode_switcher;
        private Runner _runner;
@@ -71,10 +66,6 @@ private class Games.DisplayHeaderBar : Gtk.Bin {
 
        construct {
                settings = new Settings ("org.gnome.Games");
-
-               media_selector = new MediaSelector ();
-               media_selector.relative_to = media_button;
-               media_button.popover = media_selector;
        }
 
        [GtkCallback]
diff --git a/src/ui/media-menu-button.vala b/src/ui/media-menu-button.vala
index 4fdc0a14..0cfc7a7f 100644
--- a/src/ui/media-menu-button.vala
+++ b/src/ui/media-menu-button.vala
@@ -5,27 +5,89 @@ private class Games.MediaMenuButton : Gtk.Bin {
        [GtkChild]
        private Gtk.Image media_image;
        [GtkChild]
-       private Gtk.MenuButton menu_button;
+       private Gtk.Popover popover;
+       [GtkChild]
+       private Gtk.ListBox list_box;
 
        private MediaSet _media_set;
        public MediaSet media_set {
                get { return _media_set; }
                set {
+                       if (media_set_changed_id != 0) {
+                               _media_set.disconnect (media_set_changed_id);
+                               media_set_changed_id = 0;
+                       }
+
                        _media_set = value;
 
-                       if (media_set == null || media_set.get_size () < 2) {
-                               hide ();
+                       if (_media_set != null) {
+                               media_set_changed_id = _media_set.notify["selected-media-number"].connect 
(reset_media);
+                               media_image.set_from_gicon (media_set.icon, Gtk.IconSize.BUTTON);
+                       }
+
+                       reset_media ();
+               }
+       }
+
+       private ulong media_set_changed_id = 0;
+
+       private void reset_media () {
+               remove_media ();
+               update_media ();
+
+               visible = (media_set != null && media_set.get_size () > 1);
+       }
 
-                               return;
+       private void update_media () {
+               var media_number = 0;
+
+               if (_media_set == null)
+                       return;
+
+               _media_set.foreach_media ((media) => {
+                       string media_name;
+                       if (media.title == null)
+                               media_name = _("Media %d").printf (media_number);
+                       else {
+                               try {
+                                       media_name = media.title.get_title ();
+                               }
+                               catch (Error e) {
+                                       warning (e.message);
+
+                                       media_name = "";
+                               }
                        }
 
-                       media_image.set_from_gicon (media_set.icon, Gtk.IconSize.BUTTON);
+                       var checkmark_item = new CheckmarkItem (media_name);
+                       var media_has_uris = (media.get_uris ().length != 0);
+                       checkmark_item.sensitive = media_has_uris;
+                       var is_current_media = (_media_set.selected_media_number == media_number);
+                       checkmark_item.checkmark_visible = is_current_media;
+                       list_box.add (checkmark_item);
 
-                       show ();
-               }
+                       media_number++;
+               });
+       }
+
+       private void remove_media () {
+               list_box.foreach ((child) => child.destroy ());
        }
 
-       public Gtk.Popover popover {
-               set { menu_button.popover = value; }
+       [GtkCallback]
+       private void on_row_activated (Gtk.ListBoxRow activated_row) {
+               var media_number = activated_row.get_index ();
+               _media_set.selected_media_number = media_number;
+
+               var i = 0;
+               var row = list_box.get_row_at_index (i);
+               while (row != null) {
+                       var checkmark_item = row as CheckmarkItem;
+                       checkmark_item.checkmark_visible = (i == media_number);
+
+                       row = list_box.get_row_at_index (++i);
+               }
+
+               popover.popdown ();
        }
 }


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