summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpescuma <pescuma@c086bb3d-8645-0410-b8da-73a8550f86e7>2009-01-09 02:46:23 +0000
committerpescuma <pescuma@c086bb3d-8645-0410-b8da-73a8550f86e7>2009-01-09 02:46:23 +0000
commit283ebdc88fe0867c50f56306bf53dcdeec0da013 (patch)
treeabab71b8038f352d2db28390bc2922936b96b19a
parentfefa34c8d2d2501ca1ec2e7cd57f98a8816f3939 (diff)
skins: List of skins and notification on options
git-svn-id: http://pescuma.googlecode.com/svn/trunk/Miranda@126 c086bb3d-8645-0410-b8da-73a8550f86e7
-rw-r--r--Plugins/skins/MirandaSkinnedDialog.cpp72
-rw-r--r--Plugins/skins/MirandaSkinnedDialog.h18
-rw-r--r--Plugins/skins/SkinLib/SkinnedDialog.cpp17
-rw-r--r--Plugins/skins/SkinLib/SkinnedDialog.h2
-rw-r--r--Plugins/skins/commons.h2
-rw-r--r--Plugins/skins/m_skins.h4
-rw-r--r--Plugins/skins/m_skins_cpp.h2
-rw-r--r--Plugins/skins/options.cpp25
-rw-r--r--Plugins/skins/resource.h3
-rw-r--r--Plugins/skins/skins.cpp54
10 files changed, 163 insertions, 36 deletions
diff --git a/Plugins/skins/MirandaSkinnedDialog.cpp b/Plugins/skins/MirandaSkinnedDialog.cpp
index 03fa01c..8f9f42a 100644
--- a/Plugins/skins/MirandaSkinnedDialog.cpp
+++ b/Plugins/skins/MirandaSkinnedDialog.cpp
@@ -5,8 +5,9 @@
MirandaSkinnedDialog::MirandaSkinnedDialog(const char *name, const char *aModule)
- : SkinnedDialog(name), module(aModule)
+ : SkinnedDialog(name), module(aModule), skinChangedCallback(NULL), skinChangedCallbackParam(NULL)
{
+ getSettting("Skin", _T(DEFAULT_SKIN_NAME), skinName);
}
MirandaSkinnedDialog::~MirandaSkinnedDialog()
@@ -18,19 +19,26 @@ const char * MirandaSkinnedDialog::getModule() const
return module.c_str();
}
-const TCHAR * MirandaSkinnedDialog::getSkinName()
+const TCHAR * MirandaSkinnedDialog::getSkinName() const
{
- getSettting("Skin", _T(DEFAULT_SKIN_NAME), skinName);
-
return skinName.c_str();
}
+void MirandaSkinnedDialog::setSkinName(const TCHAR *name)
+{
+ if (skinName == name)
+ return;
+
+ skinName = name;
+ setSettting("Skin", skinName.c_str());
+ updateFilename();
+}
+
bool MirandaSkinnedDialog::finishedConfiguring()
{
updateFilename();
- SkinOptions * opts = getOpts();
- if (getDefaultState() == NULL || opts == NULL)
+ if (getDefaultState() == NULL || getOpts() == NULL)
return false;
for(unsigned int i = 0; i < getFieldCount(); ++i)
@@ -39,27 +47,13 @@ bool MirandaSkinnedDialog::finishedConfiguring()
field->configure();
}
- for(unsigned int i = 0; i < opts->getNumOptions(); ++i)
- {
- SkinOption *opt = opts->getOption(i);
- loadFromDB(opt);
- opt->setOnChangeCallback(&staticOnOptionChange, this);
- }
-
return true;
}
void MirandaSkinnedDialog::updateFilename()
{
std::tstring filename;
- filename = skinsFolder;
- filename += _T("\\");
- filename += getSkinName();
- filename += _T("\\");
- filename += Utf8ToTchar(getName());
- filename += _T(".");
- filename += _T(SKIN_EXTENSION);
-
+ getSkinnedDialogFilename(filename, getSkinName(), getName());
setFilename(filename.c_str());
}
@@ -91,6 +85,8 @@ void MirandaSkinnedDialog::storeToDB(const SkinOptions *opts)
{
for (unsigned int i = 0; i < opts->getNumOptions(); i++)
storeToDB(opts->getOption(i));
+
+ fireOnSkinChanged();
}
void MirandaSkinnedDialog::storeToDB(const SkinOption *opt)
@@ -200,6 +196,40 @@ void MirandaSkinnedDialog::getSettingName(char *setting, const char * name)
_snprintf(setting, SETTING_NAME_SIZE, "%s_%s", getName(), name);
}
+void MirandaSkinnedDialog::setOnSkinChangedCallback(MirandaSkinnedCallback cb, void *param)
+{
+ skinChangedCallback = cb;
+ skinChangedCallbackParam = param;
+}
+
+void MirandaSkinnedDialog::fireOnSkinChanged()
+{
+ if (skinChangedCallback != NULL)
+ skinChangedCallback(skinChangedCallbackParam, this);
+}
+
+int MirandaSkinnedDialog::compile()
+{
+ int ret = SkinnedDialog::compile();
+
+ if (ret == 2)
+ {
+ SkinOptions * opts = getOpts();
+ _ASSERT(opts != NULL);
+
+ for(unsigned int i = 0; i < opts->getNumOptions(); ++i)
+ {
+ SkinOption *opt = opts->getOption(i);
+ loadFromDB(opt);
+ opt->setOnChangeCallback(&staticOnOptionChange, this);
+ }
+
+ fireOnSkinChanged();
+ }
+
+ return ret;
+}
+
void MirandaSkinnedDialog::onOptionChange(const SkinOption *opt)
{
storeToDB(opt);
diff --git a/Plugins/skins/MirandaSkinnedDialog.h b/Plugins/skins/MirandaSkinnedDialog.h
index b8efdd3..4615126 100644
--- a/Plugins/skins/MirandaSkinnedDialog.h
+++ b/Plugins/skins/MirandaSkinnedDialog.h
@@ -4,6 +4,9 @@
#include "SkinLib\SkinnedDialog.h"
class SkinOption;
+class MirandaSkinnedDialog;
+
+typedef void (*MirandaSkinnedCallback)(void *param, const MirandaSkinnedDialog *dlg);
class MirandaSkinnedDialog : public SkinnedDialog
@@ -13,15 +16,24 @@ public:
virtual ~MirandaSkinnedDialog();
virtual const char * getModule() const;
- virtual const TCHAR * getSkinName();
+
+ virtual const TCHAR * getSkinName() const;
+ virtual void setSkinName(const TCHAR *name);
virtual bool finishedConfiguring();
- void storeToDB(const SkinOptions *opts);
+ virtual void storeToDB(const SkinOptions *opts);
+
+ virtual void setOnSkinChangedCallback(MirandaSkinnedCallback cb, void *param);
+
+protected:
+ virtual int compile();
private:
std::string module;
std::tstring skinName;
+ MirandaSkinnedCallback skinChangedCallback;
+ void *skinChangedCallbackParam;
void updateFilename();
@@ -39,6 +51,8 @@ private:
inline void getSettingName(char *setting, const char * name);
+ void fireOnSkinChanged();
+
void onOptionChange(const SkinOption *opt);
static void staticOnOptionChange(void *param, const SkinOption *opt);
diff --git a/Plugins/skins/SkinLib/SkinnedDialog.cpp b/Plugins/skins/SkinLib/SkinnedDialog.cpp
index d3abe0c..fdca335 100644
--- a/Plugins/skins/SkinLib/SkinnedDialog.cpp
+++ b/Plugins/skins/SkinLib/SkinnedDialog.cpp
@@ -58,22 +58,21 @@ void SkinnedDialog::setSize(const Size &size)
releaseState();
}
-bool SkinnedDialog::compile()
+int SkinnedDialog::compile()
{
- bool changed = fileChanged();
- if (!changed)
- return true;
+ if (!fileChanged())
+ return 1;
releaseCompiledScript();
struct _stat st = {0};
if (_tstat(filename.c_str(), &st) != 0)
- return false;
+ return 0;
std::tstring text;
readFile(text);
if (text.size() <= 0)
- return false;
+ return 0;
script = new V8Script();
script->setExceptionCallback(errorCallback, errorCallbackParam);
@@ -81,7 +80,7 @@ bool SkinnedDialog::compile()
if (!script->compile(text.c_str(), this))
{
releaseCompiledScript();
- return false;
+ return 0;
}
std::pair<SkinOptions *,DialogState *> pair = script->configure(this);
@@ -90,12 +89,12 @@ bool SkinnedDialog::compile()
if (opts == NULL)
{
releaseCompiledScript();
- return false;
+ return 0;
}
fileChangedTime = st.st_mtime;
- return true;
+ return 2;
}
DialogState * SkinnedDialog::getState()
diff --git a/Plugins/skins/SkinLib/SkinnedDialog.h b/Plugins/skins/SkinLib/SkinnedDialog.h
index 6cbb4a3..ea99280 100644
--- a/Plugins/skins/SkinLib/SkinnedDialog.h
+++ b/Plugins/skins/SkinLib/SkinnedDialog.h
@@ -60,7 +60,7 @@ public:
protected:
virtual bool fileChanged();
- virtual bool compile();
+ virtual int compile(); /// @return 0 error, 1 no change, 2 compiled
virtual void trace(TCHAR *msg, ...);
diff --git a/Plugins/skins/commons.h b/Plugins/skins/commons.h
index 05bafe7..b31dbbe 100644
--- a/Plugins/skins/commons.h
+++ b/Plugins/skins/commons.h
@@ -101,6 +101,8 @@ extern TCHAR skinsFolder[1024];
extern std::vector<MirandaSkinnedDialog *> dlgs;
+void getSkinnedDialogFilename(std::tstring &ret, const TCHAR *skin, const char *dialogName);
+void getAvaiableSkins(std::vector<std::tstring> &skins, MirandaSkinnedDialog *dlg = NULL);
// See if a protocol service exists
diff --git a/Plugins/skins/m_skins.h b/Plugins/skins/m_skins.h
index 1f967aa..7011b82 100644
--- a/Plugins/skins/m_skins.h
+++ b/Plugins/skins/m_skins.h
@@ -31,11 +31,14 @@ typedef void * SKINNED_FIELD;
typedef void * SKINNED_DIALOG_STATE;
typedef void * SKINNED_FIELD_STATE;
+typedef void (*SkinOptionsChangedCallback)(void *param, SKINNED_DIALOG dlg);
+
#define SKN_HALIGN_LEFT 1
#define SKN_HALIGN_CENTER 2
#define SKN_HALIGN_RIGHT 3
+
/// Some common parameters:
/// - name : internal name and name used inside skin file
/// - description : name shown to the user
@@ -48,6 +51,7 @@ struct SKIN_INTERFACE
// Global methods
SKINNED_DIALOG (*RegisterDialog)(const char *name, const char *description, const char *module);
void (*DeleteDialog)(SKINNED_DIALOG dlg);
+ void (*SetSkinChangedCallback)(SKINNED_DIALOG dlg, SkinOptionsChangedCallback cb, void *param);
void (*FinishedConfiguring)(SKINNED_DIALOG dlg);
// Dialog methods
diff --git a/Plugins/skins/m_skins_cpp.h b/Plugins/skins/m_skins_cpp.h
index a459c61..e398f52 100644
--- a/Plugins/skins/m_skins_cpp.h
+++ b/Plugins/skins/m_skins_cpp.h
@@ -156,6 +156,8 @@ public:
BOOL isValid() { return dlg != NULL; }
+ void setSkinChangedCallback(SkinOptionsChangedCallback cb, void *param) { mski.SetSkinChangedCallback(dlg, cb, param); }
+
void finishedConfiguring() { mski.FinishedConfiguring(dlg); }
void setSize(int width, int height) { mski.SetDialogSize(dlg, width, height); }
diff --git a/Plugins/skins/options.cpp b/Plugins/skins/options.cpp
index eab82c4..730df6d 100644
--- a/Plugins/skins/options.cpp
+++ b/Plugins/skins/options.cpp
@@ -133,6 +133,15 @@ static BOOL CALLBACK SkinOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
_ASSERT(dlg != NULL);
SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) NULL);
+ std::vector<std::tstring> skins;
+ getAvaiableSkins(skins, dlg);
+ for(unsigned int i = 0; i < skins.size(); i++)
+ {
+ std::tstring &sk = skins[i];
+ SendDlgItemMessage(hwndDlg, IDC_SKIN, CB_ADDSTRING, 0, (LONG) skins[i].c_str());
+ }
+ SendDlgItemMessage(hwndDlg, IDC_SKIN, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)dlg->getSkinName());
+
HWND skinOptsLabel = GetDlgItem(hwndDlg, IDC_SKIN_OPTS_L);
SkinOptions *opts = dlg->getOpts();
@@ -348,6 +357,13 @@ static BOOL CALLBACK SkinOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
if (dlg == NULL)
break;
+ if (LOWORD(wParam) == IDC_SKIN)
+ {
+ if (HIWORD(wParam) == CBN_SELCHANGE && (HWND)lParam == GetFocus())
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+
SkinOptions *opts = dlg->getOpts();
if (opts == NULL)
break;
@@ -431,6 +447,15 @@ static BOOL CALLBACK SkinOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
dlg->storeToDB(opts);
+ // TODO Correctly handle changing skins
+ int pos = SendDlgItemMessage(hwndDlg, IDC_SKIN, CB_GETCURSEL, 0, 0);
+ if (pos != CB_ERR)
+ {
+ TCHAR tmp[1024];
+ GetWindowText(GetDlgItem(hwndDlg, IDC_SKIN), tmp, MAX_REGS(tmp));
+ dlg->setSkinName(tmp);
+ }
+
return TRUE;
}
break;
diff --git a/Plugins/skins/resource.h b/Plugins/skins/resource.h
index bedb36e..d275032 100644
--- a/Plugins/skins/resource.h
+++ b/Plugins/skins/resource.h
@@ -4,9 +4,6 @@
//
#define IDD_OPTIONS 119
#define IDD_SKIN_OPT 119
-#define IDC_AUTO_USER 1066
-#define IDC_ONLY_ISOLATED2 1087
-#define IDC_COMBO1 1087
#define IDC_SKIN 1087
#define IDC_SKIN_OPTS_L 1088
#define IDC_SKIN_L -1
diff --git a/Plugins/skins/skins.cpp b/Plugins/skins/skins.cpp
index d65f6d8..793fb14 100644
--- a/Plugins/skins/skins.cpp
+++ b/Plugins/skins/skins.cpp
@@ -307,6 +307,50 @@ MirandaSkinnedDialog *GetDialog(const char *name)
return NULL;
}
+void getSkinnedDialogFilename(std::tstring &ret, const TCHAR *skin, const char *dialogName)
+{
+ ret = skinsFolder;
+ ret += _T("\\");
+ ret += skin;
+ ret += _T("\\");
+ ret += CharToTchar(dialogName);
+ ret += _T(".");
+ ret += _T(SKIN_EXTENSION);
+}
+
+void getAvaiableSkins(std::vector<std::tstring> &skins, MirandaSkinnedDialog *dlg)
+{
+ TCHAR file[1024];
+ mir_sntprintf(file, MAX_REGS(file), _T("%s\\*"), skinsFolder);
+
+ WIN32_FIND_DATA ffd = {0};
+ HANDLE hFFD = FindFirstFile(file, &ffd);
+ if (hFFD == INVALID_HANDLE_VALUE)
+ return;
+
+ do
+ {
+ if (lstrcmp(ffd.cFileName, _T(".")) == 0 || lstrcmp(ffd.cFileName, _T("..")) == 0)
+ continue;
+
+ mir_sntprintf(file, MAX_REGS(file), _T("%s\\%s"), skinsFolder, ffd.cFileName);
+ if (!DirExists(file))
+ continue;
+
+ if (dlg != NULL)
+ {
+ std::tstring filename;
+ getSkinnedDialogFilename(filename, ffd.cFileName, dlg->getName());
+ if (!FileExists(filename.c_str()))
+ continue;
+ }
+
+ skins.push_back(std::tstring(ffd.cFileName));
+ }
+ while(FindNextFile(hFFD, &ffd));
+
+ FindClose(hFFD);
+}
void OnError(void *param, const TCHAR *err)
{
@@ -363,6 +407,15 @@ void Interface_DeleteDialog(SKINNED_DIALOG aDlg)
delete dlg;
}
+void Interface_SetSkinChangedCallback(SKINNED_DIALOG aDlg, SkinOptionsChangedCallback cb, void *param)
+{
+ if (aDlg == NULL)
+ return;
+
+ MirandaSkinnedDialog * dlg = (MirandaSkinnedDialog *) aDlg;
+ dlg->setOnSkinChangedCallback((MirandaSkinnedCallback) cb, param);
+}
+
void Interface_FinishedConfiguring(SKINNED_DIALOG aDlg)
{
if (aDlg == NULL)
@@ -758,6 +811,7 @@ static int Service_GetInterface(WPARAM wParam, LPARAM lParam)
mski->RegisterDialog = &Interface_RegisterDialog;
mski->DeleteDialog = &Interface_DeleteDialog;
+ mski->SetSkinChangedCallback = &Interface_SetSkinChangedCallback;
mski->FinishedConfiguring = &Interface_FinishedConfiguring;
mski->AddTextField = &Interface_AddTextField;