fluxbox/src/FbTk/Theme.hh

184 lines
5.4 KiB
C++
Raw Normal View History

2002-12-02 19:34:54 +00:00
// Theme.hh for FbTk - Fluxbox ToolKit
2003-05-18 22:12:25 +00:00
// Copyright (c) 2002 - 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
2002-12-02 19:34:54 +00:00
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
2003-08-28 23:06:27 +00:00
// $Id: Theme.hh,v 1.9 2003/08/28 23:05:29 fluxgen Exp $
2002-12-02 19:34:54 +00:00
2003-04-25 18:13:29 +00:00
/**
@file holds ThemeItem<T>, Theme and ThemeManager which is the base for any theme
*/
2002-12-02 19:34:54 +00:00
2002-12-16 11:01:43 +00:00
#ifndef FBTK_THEME_HH
#define FBTK_THEME_HH
2002-12-02 19:34:54 +00:00
#include <string>
#include <list>
#include <string>
2003-05-18 22:12:25 +00:00
#include "XrmDatabaseHelper.hh"
#include "Subject.hh"
2002-12-02 19:34:54 +00:00
namespace FbTk {
class Theme;
2002-12-16 11:01:43 +00:00
/// Base class for ThemeItem, holds name and altname
2002-12-02 19:34:54 +00:00
/**
2002-12-16 11:01:43 +00:00
@see ThemeItem
*/
2002-12-02 19:34:54 +00:00
class ThemeItem_base {
public:
ThemeItem_base(const std::string &name, const std::string &altname):
m_name(name), m_altname(altname) { }
virtual ~ThemeItem_base() { }
virtual void setFromString(const char *str) = 0;
virtual void setDefaultValue() = 0;
virtual void load() = 0; // if it needs to load additional stuff
const std::string &name() const { return m_name; }
const std::string &altName() const { return m_altname; }
private:
std::string m_name, m_altname;
};
2002-12-16 11:01:43 +00:00
2003-04-25 18:13:29 +00:00
/// template ThemeItem class for basic theme items
/// to use this you need to specialize setDefaultValue, setFromString and load
2002-12-02 19:34:54 +00:00
template <typename T>
class ThemeItem:public ThemeItem_base {
public:
ThemeItem(FbTk::Theme &tm, const std::string &name, const std::string &altname);
virtual ~ThemeItem();
/// specialized
void setDefaultValue();
/// specialized
void setFromString(const char *strval);
/// specialized
void load();
/**
@name access operators
*/
/**@{*/
inline T& operator*() { return m_value; }
inline const T& operator*() const { return m_value; }
inline T *operator->() { return &m_value; }
inline const T *operator->() const { return &m_value; }
/**@}*/
2003-08-19 21:25:26 +00:00
FbTk::Theme &theme() { return m_tm; }
2002-12-02 19:34:54 +00:00
private:
T m_value;
FbTk::Theme &m_tm;
};
2002-12-16 11:01:43 +00:00
/// Hold ThemeItems. Use this to create a Theme set
2002-12-02 19:34:54 +00:00
class Theme {
public:
explicit Theme(int screen_num); // create a theme for a specific screen
virtual ~Theme();
virtual void reconfigTheme() = 0;
int screenNum() const { return m_screen_num; }
std::list<ThemeItem_base *> &itemList() { return m_themeitems; }
const std::list<ThemeItem_base *> &itemList() const { return m_themeitems; }
/// add ThemeItem
template <typename T>
void add(ThemeItem<T> &item);
/// remove ThemeItem
template <typename T>
void remove(ThemeItem<T> &item);
2003-08-19 21:25:26 +00:00
virtual bool fallback(ThemeItem_base &base) { return false; }
FbTk::Subject &reconfigSig() { return m_reconfig_sig; }
2003-08-28 23:06:27 +00:00
2002-12-02 19:34:54 +00:00
private:
const int m_screen_num;
typedef std::list<ThemeItem_base *> ItemList;
ItemList m_themeitems;
FbTk::Subject m_reconfig_sig;
2002-12-02 19:34:54 +00:00
};
2002-12-16 11:01:43 +00:00
/// Singleton theme manager
2002-12-02 19:34:54 +00:00
/**
2002-12-16 11:01:43 +00:00
Use this to load all the registred themes
2002-12-02 19:34:54 +00:00
*/
class ThemeManager {
public:
static ThemeManager &instance();
2003-08-28 23:06:27 +00:00
bool load(const std::string &filename);
2002-12-02 19:34:54 +00:00
std::string resourceValue(const std::string &name, const std::string &altname);
void loadTheme(Theme &tm);
2003-08-19 21:25:26 +00:00
bool loadItem(ThemeItem_base &resource);
bool loadItem(ThemeItem_base &resource, const std::string &name, const std::string &altname);
2003-08-28 23:06:27 +00:00
bool verbose() const { return m_verbose; }
void setVerbose(bool value) { m_verbose = value; }
2002-12-02 19:34:54 +00:00
private:
ThemeManager();
~ThemeManager() { }
friend class FbTk::Theme; // so only theme can register itself in constructor
/// @return false if screen_num if out of
2002-12-16 11:01:43 +00:00
/// range or theme already registered, else true
2002-12-02 19:34:54 +00:00
bool registerTheme(FbTk::Theme &tm);
/// @return false if theme isn't registred in the manager
bool unregisterTheme(FbTk::Theme &tm);
/// map each theme manager to a screen
typedef std::list<FbTk::Theme *> ThemeList;
ThemeList m_themelist;
const int m_max_screens;
XrmDatabaseHelper m_database;
2003-08-28 23:06:27 +00:00
bool m_verbose;
2002-12-02 19:34:54 +00:00
};
template <typename T>
ThemeItem<T>::ThemeItem(FbTk::Theme &tm,
const std::string &name, const std::string &altname):
ThemeItem_base(name, altname),
m_tm(tm) {
tm.add(*this);
setDefaultValue();
2002-12-02 19:34:54 +00:00
}
template <typename T>
ThemeItem<T>::~ThemeItem() {
m_tm.remove(*this);
}
template <typename T>
void Theme::add(ThemeItem<T> &item) {
m_themeitems.push_back(&item);
m_themeitems.unique();
}
template <typename T>
void Theme::remove(ThemeItem<T> &item) {
m_themeitems.remove(&item);
}
}; // end namespace FbTk
2002-12-16 11:01:43 +00:00
#endif // FBTK_THEME_HH
2002-12-02 19:34:54 +00:00