about summary refs log tree commit diff
path: root/app/controllers
diff options
context:
space:
mode:
authorkibigo! <marrus-sh@users.noreply.github.com>2017-11-30 19:29:47 -0800
committerkibigo! <marrus-sh@users.noreply.github.com>2017-11-30 19:29:47 -0800
commit541fe9b110fce15c42ba15df27926552c234afd0 (patch)
treef4c0a74cb87d4d40ca44e99f1825fa9cd47edf96 /app/controllers
parent8812bab6875024f76c59ab43d1dd3717e5e6da68 (diff)
Skins support
Diffstat (limited to 'app/controllers')
-rw-r--r--app/controllers/application_controller.rb43
-rw-r--r--app/controllers/settings/preferences_controller.rb1
2 files changed, 30 insertions, 14 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 7cc4eea27..f5753963d 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -12,6 +12,8 @@ class ApplicationController < ActionController::Base
 
   helper_method :current_account
   helper_method :current_session
+  helper_method :current_theme
+  helper_method :current_skin
   helper_method :single_user_mode?
 
   rescue_from ActionController::RoutingError, with: :not_found
@@ -52,14 +54,14 @@ class ApplicationController < ActionController::Base
     new_user_session_path
   end
 
-  def pack(data, pack_name)
+  def pack(data, pack_name, skin = 'default')
     return nil unless pack?(data, pack_name)
     pack_data = {
       common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'),
       name: data['name'],
       pack: pack_name,
       preload: nil,
-      stylesheet: false
+      skin: nil,
     }
     if data['pack'][pack_name].is_a?(Hash)
       pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false
@@ -68,7 +70,11 @@ class ApplicationController < ActionController::Base
         pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String)
         pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array)
       end
-      pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet']
+      if skin != 'default' && data['skin'][skin]
+        pack_data[:skin] = skin if data['skin'][skin].include?(pack_name)
+      else  #  default skin
+        pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet']
+      end
     end
     pack_data
   end
@@ -80,39 +86,39 @@ class ApplicationController < ActionController::Base
     false
   end
 
-  def nil_pack(data, pack_name)
+  def nil_pack(data, pack_name, skin = 'default')
     {
-      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'),
+      common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin),
       name: data['name'],
       pack: nil,
       preload: nil,
-      stylesheet: false
+      skin: nil,
     }
   end
 
-  def resolve_pack(data, pack_name)
-    result = pack(data, pack_name)
+  def resolve_pack(data, pack_name, skin = 'default')
+    result = pack(data, pack_name, skin)
     unless result
       if data['name'] && data.key?('fallback')
         if data['fallback'].nil?
-          return nil_pack(data, pack_name)
+          return nil_pack(data, pack_name, skin)
         elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback'])
-          return resolve_pack(Themes.instance.get(data['fallback']), pack_name)
+          return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin)
         elsif data['fallback'].is_a?(Array)
           data['fallback'].each do |fallback|
-            return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback)
+            return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback)
           end
         end
-        return nil_pack(data, pack_name)
+        return nil_pack(data, pack_name, skin)
       end
-      return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name)
+      return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin)
     end
     result
   end
 
   def use_pack(pack_name)
     @core = resolve_pack(Themes.instance.core, pack_name)
-    @theme = resolve_pack(Themes.instance.get(current_theme), pack_name)
+    @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin)
   end
 
   protected
@@ -154,6 +160,15 @@ class ApplicationController < ActionController::Base
     current_user.setting_theme
   end
 
+  def default_skin
+    'default'
+  end
+
+  def current_skin
+    return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin
+    current_user.setting_skin
+  end
+
   def cache_collection(raw, klass)
     return raw unless klass.respond_to?(:with_includes)
 
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index 3aefd90a2..56baebed2 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -39,6 +39,7 @@ class Settings::PreferencesController < Settings::BaseController
       :setting_system_font_ui,
       :setting_noindex,
       :setting_theme,
+      :setting_skin,
       notification_emails: %i(follow follow_request reblog favourite mention digest),
       interactions: %i(must_be_follower must_be_following)
     )