]> source.dussan.org Git - redmine.git/commitdiff
Added basic Theme support.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 10 Oct 2007 17:17:37 +0000 (17:17 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 10 Oct 2007 17:17:37 +0000 (17:17 +0000)
Theme is set at application level (in Admin -> Settings).
For now, themes can override stylesheets only (application.css).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@818 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/views/settings/edit.rhtml
config/settings.yml
lang/en.yml
lang/fr.yml
lib/redmine.rb
lib/redmine/themes.rb [new file with mode: 0644]
public/themes/README [new file with mode: 0644]

index 2accdc715166c045f1b46290df6b7ad38cd71e46..736e6c421b25b6a72ecce9eb413cef6718c1d808 100644 (file)
@@ -13,6 +13,9 @@
 <%= text_area_tag 'settings[welcome_text]', Setting.welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %></p>
 <%= wikitoolbar_for 'settings[welcome_text]' %>
 
+<p><label><%= l(:label_theme) %></label>
+<%= select_tag 'settings[ui_theme]', options_for_select( ([[l(:label_default), '']] + Redmine::Themes.themes.collect {|t| [t.name, t.id]}), Setting.ui_theme) %></p>
+
 <p><label><%= l(:setting_default_language) %></label>
 <%= select_tag 'settings[default_language]', options_for_select( lang_options_for_select(false), Setting.default_language) %></p>
 
index b5ed26a1faaa14bb86d17cd5c34d5c49d02833a3..e2897775eeed08268f8ece53578a768ce20a1328 100644 (file)
@@ -92,4 +92,6 @@ issue_list_default_columns:
 # multiple values accepted, comma separated
 repositories_encodings:
   default: ''
+ui_theme:
+  default: ''
   
\ No newline at end of file
index af3faf49bda6b9d6530b53f1e26d2bf4b5298783..d48456172089c35e5b52af43049df3680289ed09 100644 (file)
@@ -431,6 +431,8 @@ label_changeset_plural: Changesets
 label_default_columns: Default columns
 label_no_change_option: (No change)
 label_bulk_edit_selected_issues: Bulk edit selected issues
+label_theme: Theme
+label_default: Default
 
 button_login: Login
 button_submit: Submit
index a42ead91322c68247a2a1a95b694756483cf5c32..03c77b6b4e5a57a4d805934e72ab5fd7a7c64998 100644 (file)
@@ -431,6 +431,8 @@ label_changeset_plural: Révisions
 label_default_columns: Colonnes par défaut
 label_no_change_option: (Pas de changement)
 label_bulk_edit_selected_issues: Modifier les demandes sélectionnées
+label_theme: Thème
+label_default: Défaut
 
 button_login: Connexion
 button_submit: Soumettre
index cb6af8aed1be868d7152a0c8dfd185387dbd68ef..ceb531551605ac3ea3e8d0720858808e661f3263 100644 (file)
@@ -1,6 +1,7 @@
 require 'redmine/access_control'
 require 'redmine/menu_manager'
 require 'redmine/mime_type'
+require 'redmine/themes'
 require 'redmine/plugin'
 
 begin
diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb
new file mode 100644 (file)
index 0000000..abbd34c
--- /dev/null
@@ -0,0 +1,72 @@
+# redMine - project management software
+# Copyright (C) 2006-2007  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Themes
+  
+    # Return an array of installed themes
+    def self.themes
+      @@installed_themes ||= scan_themes
+    end
+    
+    # Rescan themes directory
+    def self.rescan
+      @@installed_themes = scan_themes
+    end
+    
+    # Return theme for given id, or nil if it's not found
+    def self.theme(id)
+      themes.find {|t| t.id == id}
+    end
+  
+    # Class used to represent a theme
+    class Theme
+      attr_reader :name, :dir, :stylesheets
+      
+      def initialize(path)
+        @dir = File.basename(path)
+        @name = @dir.humanize
+        @stylesheets = Dir.glob("#{path}/stylesheets/*.css").collect {|f| File.basename(f).gsub(/\.css$/, '')}
+      end
+      
+      # Directory name used as the theme id
+      def id; dir end
+
+      def <=>(theme)
+        name <=> theme.name
+      end
+    end
+    
+    private
+        
+    def self.scan_themes
+      dirs = Dir.glob('public/themes/*').select do |f|
+        # A theme should at least override application.css
+        File.directory?(f) && File.exist?("#{f}/stylesheets/application.css")
+      end
+      dirs.collect {|dir| Theme.new(dir)}.sort
+    end
+  end
+end
+
+module ApplicationHelper
+  def stylesheet_path(source)
+    @current_theme ||= Redmine::Themes.theme(Setting.ui_theme)
+    super((@current_theme && @current_theme.stylesheets.include?(source)) ?
+      "/themes/#{@current_theme.dir}/stylesheets/#{source}" : source)
+  end
+end
diff --git a/public/themes/README b/public/themes/README
new file mode 100644 (file)
index 0000000..1af3d19
--- /dev/null
@@ -0,0 +1 @@
+Put your Redmine themes here.