A Theme is a base class object that is created and customized as ThemeName.
It is constructed during program initialization in a theme plugin PluginTClient,
defined in a plugins/theme_name source directory.
theme_name.C and theme_name.h are derived "Theme" class object constructors.
A Theme is constructed during initialization in init_theme (mwindow.C). The theme
plugin is accessed using the "name" from preferences, and that theme plugin is loaded,
and it contains the code to construct that theme. A Theme object has functions and data
that cinelerra uses to do a variety of customizations, such as default_window_positions,
and it can modify gui defaults, like default_text_color, when it is initialized. The theme
plugin contains a "new_theme" function, that allocates and constructs a ThemeName
object, with a base classes of BC_Theme (gui setup), Theme (cin defaults), and
ThemeName, with definitions and overrides that create the custom theme.
To create a new theme, a new plugin is needed:
==== Code:
#include "header files.h"
PluginClient* new_plugin(PluginServer *server)
{
return new NameMain(server);
}
NameMain::NameMain(PluginServer *server)
: PluginTClient(server)
{
}
NameMain::~NameMain()
{
}
const char* NameMain::plugin_title() { return N_("Name"); }
Theme* NameMain::new_theme()
{
theme = new ThemeName;
extern unsigned char _binary_theme_name_data_start[];
theme->set_data(_binary_theme_name_data_start);
return theme;
}
Name::Name()
: Theme()
{
}
Name::~Name()
{
delete stuff;
}
When a theme is constructed by NameMain::new_theme(), it sets a pointer to a
block of data created in the plugin build that contains all of the png data files in the
plugins/theme_name/data directory. These images may define or override the
appearance of gui images, such as "ok.png" (the ok button). There are usually
a large number of images that need to be defined. The theme plugin adds them
to the theme image data in the theme->initialize() function. The best list
of theme image setup is probably in SUV (plugins/theme_suv/suv.[Ch]).
The easy way to create a new theme is to copy an existing theme and change its
name to ThemeName, and be sure to change plugin_title() to the new name,
then tweak the definitions until you are happy with the results. The file names
and Makefile also need to be updated to the new theme "name". The source
can by manually re/built by invoking make in the plugins/theme_name directory.
Once it is built into the plugin library, it will be discovered by the plugin probe,
and it will become an available theme in the preferences.
If you are ready to add it to the main build, then theme_name should be included
in the DIRS targets of the plugins/Makefile, and the plugin_defs needs theme_name
in the themes list.
Themes usually require considerable time to create from scratch. For example,
the SUV theme has over 800 lines in the initialize function, and has over 500
png images in the data directory. Most of these images and data values are
required to be initialized by the custom theme constructor; very tedious and
time consuming work. Creating a new theme is usually a lot of work.