[simple-scan] Support dark preference



commit 06c9e608c17ce9a9121051b582310081ccab0ebf
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Wed Jan 12 10:59:38 2022 +0000

    Support dark preference

 meson.build          |  4 ++--
 src/app-window.vala  | 34 +-------------------------
 src/book-view.vala   | 13 ++++------
 src/page-icon.vala   | 68 ++++++++++++++++++++++++++++++++++++++++++----------
 src/page-view.vala   | 15 +++++-------
 src/simple-scan.vala |  1 +
 6 files changed, 69 insertions(+), 66 deletions(-)
---
diff --git a/meson.build b/meson.build
index c4a3bac2..81aabbda 100644
--- a/meson.build
+++ b/meson.build
@@ -7,7 +7,7 @@ project ('simple-scan', ['vala', 'c'],
          ],
          meson_version: '>= 0.37.1')
 
-# FIXME Disable --disable-since-check after libhandy 1.2 is released
+# FIXME Disable --disable-since-check after libhandy 1.6 is released
 add_project_arguments (
   '--disable-since-check',
   language: 'vala'
@@ -29,7 +29,7 @@ glib_dep = dependency ('glib-2.0', version: '>= 2.38')
 gtk_dep = dependency ('gtk+-3.0', version: '>=3.24')
 gmodule_dep = dependency ('gmodule-export-2.0')
 gthread_dep = dependency ('gthread-2.0')
-libhandy_dep = dependency ('libhandy-1', version: '>= 1.1.90', required: false)
+libhandy_dep = dependency ('libhandy-1', version: '>= 1.5.0', required: false)
 zlib_dep = dependency ('zlib')
 cairo_dep = dependency ('cairo')
 gdk_pixbuf_dep = dependency ('gdk-pixbuf-2.0')
diff --git a/src/app-window.vala b/src/app-window.vala
index f7a45bd2..59d421cb 100644
--- a/src/app-window.vala
+++ b/src/app-window.vala
@@ -1399,39 +1399,7 @@ public class AppWindow : Hdy.ApplicationWindow
                 box.add (page_box);
             }
 
-            /* Get colours for each page (from Tango palette) */
-            var r = 1.0;
-            var g = 1.0;
-            var b = 1.0;
-            switch (side)
-            {
-            case 'F':
-                /* Plum */
-                r = 0x75 / 255.0;
-                g = 0x50 / 255.0;
-                b = 0x7B / 255.0;
-                break;
-            case 'B':
-                /* Orange */
-                r = 0xF5 / 255.0;
-                g = 0x79 / 255.0;
-                b = 0.0;
-                break;
-            case 'C':
-                /* Butter to Scarlet Red */
-                var p = (items[i] - '1') / 5.0;
-                r = (0xED / 255.0) * (1 - p) + 0xCC * p;
-                g = (0xD4 / 255.0) * (1 - p);
-                b = 0;
-                break;
-            }
-
-            /* Mix with white to look more paper like */
-            r = r + (1.0 - r) * 0.7;
-            g = g + (1.0 - g) * 0.7;
-            b = b + (1.0 - b) * 0.7;
-
-            var icon = new PageIcon ("%c".printf (items[i]), r, g, b);
+            var icon = new PageIcon (side, items[i] - '1');
             icon.visible = true;
             page_box.add (icon);
         }
diff --git a/src/book-view.vala b/src/book-view.vala
index 59e24694..df2beb4c 100644
--- a/src/book-view.vala
+++ b/src/book-view.vala
@@ -189,14 +189,7 @@ public class BookView : Gtk.Box
 
     private void add_cb (Book book, Page page)
     {
-        Gdk.RGBA page_ruler_color;
-        if (!get_style_context ().lookup_color ("theme_fg_color", out page_ruler_color))
-        {
-            warning ("Couldn't get theme_fg_color from GTK theme, needed to draw the page view ruler");
-            /* Use a bright color so that theme makers notice it. */
-            page_ruler_color.parse ("#00ff00");
-        }
-        var page_view = new PageView (page, page_ruler_color);
+        var page_view = new PageView (page);
         page_view.changed.connect (page_view_changed_cb);
         page_view.size_changed.connect (page_view_size_changed_cb);
         page_data.insert (page, page_view);
@@ -450,6 +443,8 @@ public class BookView : Gtk.Box
         for (var i = 0; i < book.n_pages; i++)
             pages.append (get_nth_page (i));
 
+        var ruler_color = get_style_context ().get_color (get_state_flags ());
+
         /* Render each page */
         foreach (var page in pages)
         {
@@ -462,7 +457,7 @@ public class BookView : Gtk.Box
 
             context.save ();
             context.translate (-x_offset, 0);
-            page.render (context);
+            page.render (context, ruler_color);
             context.restore ();
 
             if (page.selected)
diff --git a/src/page-icon.vala b/src/page-icon.vala
index 793ca5bb..f1a25ead 100644
--- a/src/page-icon.vala
+++ b/src/page-icon.vala
@@ -12,18 +12,14 @@
 
 public class PageIcon : Gtk.DrawingArea
 {
-    private string text;
-    private double r;
-    private double g;
-    private double b;
+    private char side;
+    private int position;
     private const int MINIMUM_WIDTH = 20;
 
-    public PageIcon (string text, double r = 1.0, double g = 1.0, double b = 1.0)
+    public PageIcon (char side, int position)
     {
-        this.text = text;
-        this.r = r;
-        this.g = g;
-        this.b = b;
+        this.side = side;
+        this.position = position;
     }
 
     public override void get_preferred_width (out int minimum_width, out int natural_width)
@@ -57,15 +53,61 @@ public class PageIcon : Gtk.DrawingArea
 
         c.translate ((get_allocated_width () - w) / 2, (get_allocated_height () - h) / 2);
 
-        c.rectangle (0.5, 0.5, w - 1, h - 1);
+        bool dark = Hdy.StyleManager.get_default ().dark;
+        bool hc = Hdy.StyleManager.get_default ().high_contrast;
+
+        if (dark && !hc)
+            c.rectangle (1, 1, w - 2, h - 2);
+        else
+            c.rectangle (0, 0, w, h);
+
+        Gdk.RGBA rgba = {};
+
+        switch (side)
+        {
+        case 'F':
+            /* Purple 2 */
+            rgba.parse ("#c061cb");
+            break;
+        case 'B':
+            /* Orange 3 */
+            rgba.parse ("#ff7800");
+            break;
+        default:
+            /* Yellow 3 to Red 2 */
+            Gdk.RGBA start = {}, end = {};
+            start.parse ("#f6d32d");
+            end.parse ("#ed333b");
+
+            double progress = position / 5.0;
+            rgba.red   = start.red   + (end.red   - start.red)   * progress;
+            rgba.green = start.green + (end.green - start.green) * progress;
+            rgba.blue  = start.blue  + (end.blue  - start.blue)  * progress;
+            break;
+        }
 
-        c.set_source_rgb (r, g, b);
-        c.fill_preserve ();
+        rgba.alpha = 0.3;
+
+        Gdk.cairo_set_source_rgba (c, rgba);
+        c.fill ();
 
         c.set_line_width (1.0);
-        c.set_source_rgb (0.0, 0.0, 0.0);
+        if (hc && dark)
+            c.set_source_rgba (1, 1, 1, 0.5);
+        else if (hc)
+            c.set_source_rgba (0, 0, 0, 0.5);
+        else
+            c.set_source_rgba (0, 0, 0, 0.15);
+
+        c.rectangle (0.5, 0.5, w - 1, h - 1);
         c.stroke ();
 
+        if (dark)
+            c.set_source_rgb (1, 1, 1);
+        else
+            c.set_source_rgb (0, 0, 0);
+
+        var text = @"$(position + 1)";
         Cairo.TextExtents extents;
         c.text_extents (text, out extents);
         c.translate ((w - extents.width) * 0.5 - 0.5, (h + extents.height) * 0.5 - 0.5);
diff --git a/src/page-view.vala b/src/page-view.vala
index 342df278..148dcca7 100644
--- a/src/page-view.vala
+++ b/src/page-view.vala
@@ -45,8 +45,6 @@ public class PageView : Object
         }
     }
 
-    private Gdk.RGBA ruler_color;
-
     private int ruler_width = 8;
 
     private int border_width = 2;
@@ -86,13 +84,9 @@ public class PageView : Object
     public signal void size_changed ();
     public signal void changed ();
 
-    /* It is necessary to ask the ruler color since it is themed with the GTK */
-    /* theme foreground color, and this class doesn't have any GTK widget     */
-    /* available to lookup the color. */
-    public PageView (Page page, Gdk.RGBA ruler_color)
+    public PageView (Page page)
     {
         this.page = page;
-        this.ruler_color = ruler_color;
         page.pixels_changed.connect (page_pixels_changed_cb);
         page.size_changed.connect (page_size_changed_cb);
         page.crop_changed.connect (page_overlay_changed_cb);
@@ -828,7 +822,10 @@ public class PageView : Object
         }
     }
 
-    public void render (Cairo.Context context)
+    /* It is necessary to ask the ruler color since it is themed with the GTK */
+    /* theme foreground color, and this class doesn't have any GTK widget     */
+    /* available to lookup the color. */
+    public void render (Cairo.Context context, Gdk.RGBA ruler_color)
     {
         update_animation ();
         update_page_view ();
@@ -845,7 +842,7 @@ public class PageView : Object
         context.paint ();
 
         /* Draw page border */
-        context.set_source_rgb (ruler_color.red, ruler_color.green, ruler_color.blue);
+        Gdk.cairo_set_source_rgba (context, ruler_color);
         context.set_line_width (border_width);
 
         context.rectangle (0,
diff --git a/src/simple-scan.vala b/src/simple-scan.vala
index 71f32de9..5deedcfa 100644
--- a/src/simple-scan.vala
+++ b/src/simple-scan.vala
@@ -51,6 +51,7 @@ public class SimpleScan : Gtk.Application
         base.startup ();
 
         Hdy.init ();
+        Hdy.StyleManager.get_default ().color_scheme = PREFER_LIGHT;
 
         app = new AppWindow ();
         book = app.book;


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