/***************************************************************************
* Copyright (C) 2009 - 2013 by Artem 'DOOMer' Galichkin *
* doomer3d@gmail.com *
* *
* 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, see . *
***************************************************************************/
#include "src/core/config.h"
#include "core.h"
#include
#include
#include
#include
#include
#include
#include
#define CONFIG_FILE_DIR "screengrab"
#define CONFIG_FILE_NAME "screengrab.conf"
#define KEY_SAVEDIR "defDir"
#define KEY_SAVENAME "defFilename"
#define KEY_SAVEFORMAT "defImgFormat"
#define KEY_DELAY_DEF "defDelay"
#define KEY_DELAY "delay"
#define KEY_SCREENSHOT_TYPE_DEF "defScreenshotType"
#define KEY_SCREENSHOT_TYPE "screenshotType"
#define KEY_IMG_QUALITY "imageQuality"
#define KEY_FILENAMEDATE "insDateTimeInFilename"
#define KEY_DATETIME_TPL "templateDateTime"
#define KEY_FILENAME_TO_CLB "CopyFilenameToClipboard"
#define KEY_AUTOSAVE "autoSave"
#define KEY_AUTOSAVE_FIRST "autoSaveFirst"
#define KEY_SHOW_TRAY "showTrayIcon"
#define KEY_CLOSE_INTRAY "closeInTray"
#define KEY_TRAYMESSAGES "trayMessages"
#define KEY_WND_WIDTH "windowWidth"
#define KEY_WND_HEIGHT "windowHeight"
#define KEY_ZOOMBOX "zoomAroundMouse"
#define KEY_TIME_NOTIFY "timeTrayMessages"
#define KEY_ALLOW_COPIES "AllowCopies"
#define KEY_ENABLE_EXT_VIEWER "enbaleExternalView"
#define KEY_NODECOR "noDecorations"
#define KEY_INCLUDE_CURSOR "includeCursor"
#define KEY_FIT_INSIDE "fitInside"
static const QLatin1String FullScreen("FullScreen");
static const QLatin1String Window("Window");
static const QLatin1String Area("Area");
static const QLatin1String PreviousSelection("PreviousSelection");
static QString screenshotTypeToString(int v);
static int screenshotTypeFromString(const QString& str);
static QString screenshotTypeToString(int v)
{
QString r;
switch(v) {
case Core::FullScreen:
r = FullScreen;
break;
case Core::Window:
r = Window;
break;
case Core::Area:
r = Area;
break;
case Core::PreviousSelection:
r = PreviousSelection;
break;
default:
r = FullScreen;
}
return r;
}
static int screenshotTypeFromString(const QString& str)
{
int r;
if (str == FullScreen)
r = Core::FullScreen;
else if (str == Window)
r = Core::Window;
else if (str == Area)
r = Core::Area;
else if (str == PreviousSelection)
r = Core::PreviousSelection;
else
r = Core::FullScreen; // Default
return r;
}
Config* Config::ptrInstance = 0;
// constructor
Config::Config()
{
_settings = new QSettings(getConfigFile(), QSettings::IniFormat);
_shortcuts = new ShortcutManager(_settings);
// check existing config file
if (!QFile::exists(getConfigFile()))
{
// creating conf file from set defaults
QFile cf(getConfigFile());
if (cf.open(QIODevice::WriteOnly))
{
cf.close();
}
setDefaultSettings();
saveSettings();
}
_settings->setIniCodec("UTF-8");
_scrNum = 0;
}
Config::~Config()
{
delete _shortcuts;
delete _settings;
}
Config* Config::instance()
{
if (!ptrInstance)
ptrInstance = new Config;
return ptrInstance;
}
void Config::setValue(const QString &key, QVariant val)
{
_confData[key] = val;
}
QVariant Config::value(const QString &key)
{
return _confData[key];
}
void Config::killInstance()
{
if (ptrInstance)
{
delete ptrInstance;
ptrInstance = 0;
}
}
QString Config::getConfigFile()
{
return getConfigDir() + QDir::separator() + CONFIG_FILE_NAME;
}
QString Config::getConfigDir()
{
QString dir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
dir += QDir::separator();
dir += CONFIG_FILE_DIR;
QDir qdir(dir);
if (!qdir.exists())
qdir.mkpath(dir);
return dir;
}
// public methods
QString Config::getScrNumStr()
{
QString str = QString::number(_scrNum);
if (_scrNum < 10)
str.prepend("0");
return str;
}
int Config::getScrNum() const
{
return _scrNum;
}
void Config::increaseScrNum()
{
_scrNum++;
}
void Config::resetScrNum()
{
_scrNum = 0;
}
void Config::updateLastSaveDate()
{
_dateLastSaving = QDateTime::currentDateTime();
}
QDateTime Config::getLastSaveDate() const
{
return _dateLastSaving;
}
bool Config::getEnableExtView()
{
return value(KEY_ENABLE_EXT_VIEWER).toBool();
}
void Config::setEnableExtView(bool val)
{
setValue(KEY_ENABLE_EXT_VIEWER, val);
}
bool Config::getIncludeCursor()
{
return value(KEY_INCLUDE_CURSOR).toBool();
}
void Config::setIncludeCursor(bool val)
{
setValue(KEY_INCLUDE_CURSOR, val);
}
QString Config::getSaveDir()
{
return value(KEY_SAVEDIR).toString();
}
void Config::setSaveDir(QString path)
{
setValue(KEY_SAVEDIR, path);
}
QString Config::getSaveFileName()
{
return value(KEY_SAVENAME).toString();
}
void Config::setSaveFileName(QString fileName)
{
setValue(KEY_SAVENAME, fileName);
}
QString Config::getSaveFormat()
{
return value(KEY_SAVEFORMAT).toString();
}
void Config::setSaveFormat(QString format)
{
setValue(KEY_SAVEFORMAT, format);
}
quint8 Config::getDefDelay()
{
return value(KEY_DELAY_DEF).toInt();
}
void Config::setDefDelay(quint8 sec)
{
setValue(KEY_DELAY_DEF, sec);
}
quint8 Config::getDelay()
{
return value(KEY_DELAY).toInt();
}
void Config::setDelay(quint8 sec)
{
setValue(KEY_DELAY, sec);
}
int Config::getDefScreenshotType()
{
return (value(QLatin1String(KEY_SCREENSHOT_TYPE_DEF)).toInt());
}
void Config::setDefScreenshotType(const int type)
{
setValue(QLatin1String(KEY_SCREENSHOT_TYPE_DEF), type);
}
int Config::getScreenshotType()
{
return (value(QLatin1String(KEY_SCREENSHOT_TYPE)).toInt());
}
void Config::setScreenshotType(const int type)
{
setValue(QLatin1String(KEY_SCREENSHOT_TYPE), type);
}
quint8 Config::getAutoCopyFilenameOnSaving()
{
return value(KEY_FILENAME_TO_CLB).toInt();
}
void Config::setAutoCopyFilenameOnSaving(quint8 val)
{
setValue(KEY_FILENAME_TO_CLB, val);
}
quint8 Config::getTrayMessages()
{
return value(KEY_TRAYMESSAGES).toInt();
}
void Config::setTrayMessages(quint8 type)
{
setValue(KEY_TRAYMESSAGES, type);
}
bool Config::getAllowMultipleInstance()
{
return value(KEY_ALLOW_COPIES).toBool();
}
void Config::setAllowMultipleInstance(bool val)
{
setValue(KEY_ALLOW_COPIES, val);
}
bool Config::getCloseInTray()
{
return value(KEY_CLOSE_INTRAY).toBool();
}
void Config::setCloseInTray(bool val)
{
setValue(KEY_CLOSE_INTRAY, val);
}
quint8 Config::getTimeTrayMess()
{
return value(KEY_TIME_NOTIFY).toInt();
}
void Config::setTimeTrayMess(int sec)
{
setValue(KEY_TIME_NOTIFY, sec);
}
QSize Config::getRestoredWndSize()
{
QSize wndSize(value(KEY_WND_WIDTH).toInt(), value(KEY_WND_HEIGHT).toInt());
return wndSize;
}
void Config::setRestoredWndSize(int w, int h)
{
setValue(KEY_WND_WIDTH, w);
setValue(KEY_WND_HEIGHT, h);
}
bool Config::getDateTimeInFilename()
{
return value(KEY_FILENAMEDATE).toBool();
}
void Config::setDateTimeInFilename(bool val)
{
setValue(KEY_FILENAMEDATE, val);
}
bool Config::getAutoSave()
{
return value(KEY_AUTOSAVE).toBool();
}
void Config::setAutoSave(bool val)
{
setValue(KEY_AUTOSAVE, val);
}
quint8 Config::getImageQuality()
{
return value(KEY_IMG_QUALITY).toInt();
}
void Config::setImageQuality(quint8 qualuty)
{
setValue(KEY_IMG_QUALITY, qualuty);
}
bool Config::getAutoSaveFirst()
{
return value(KEY_AUTOSAVE_FIRST).toBool();
}
void Config::setAutoSaveFirst(bool val)
{
setValue(KEY_AUTOSAVE_FIRST, val);
}
QString Config::getDateTimeTpl()
{
return value(KEY_DATETIME_TPL).toString();
}
void Config::setDateTimeTpl(QString tpl)
{
setValue(KEY_DATETIME_TPL, tpl);
}
bool Config::getZoomAroundMouse()
{
return value(KEY_ZOOMBOX).toBool();
}
void Config::setZoomAroundMouse(bool val)
{
setValue(KEY_ZOOMBOX, val);
}
bool Config::getShowTrayIcon()
{
return value(KEY_SHOW_TRAY).toBool();
}
void Config::setShowTrayIcon(bool val)
{
setValue(KEY_SHOW_TRAY, val);
}
bool Config::getNoDecoration()
{
return value(KEY_NODECOR).toBool();
}
void Config::setNoDecoration(bool val)
{
setValue(KEY_NODECOR, val);
}
bool Config::getFitInside()
{
return value(KEY_FIT_INSIDE).toBool();
}
void Config::setFitInside(bool val)
{
setValue(KEY_FIT_INSIDE, val);
}
void Config::saveWndSize()
{
// saving size
_settings->beginGroup("Display");
_settings->setValue(KEY_WND_WIDTH, getRestoredWndSize().width());
_settings->setValue(KEY_WND_HEIGHT, getRestoredWndSize().height());
_settings->endGroup();
}
// load all settings from conf file
void Config::loadSettings()
{
_settings->beginGroup("Base");
setSaveDir(_settings->value(KEY_SAVEDIR, getDirNameDefault()).toString() );
setSaveFileName(_settings->value(KEY_SAVENAME,DEF_SAVE_NAME).toString());
setSaveFormat(_settings->value(KEY_SAVEFORMAT, DEF_SAVE_FORMAT).toString());
setDefDelay(_settings->value(KEY_DELAY, DEF_DELAY).toInt());
setDefScreenshotType(screenshotTypeFromString(_settings->value(QLatin1String(KEY_SCREENSHOT_TYPE_DEF)).toString()));
setAutoCopyFilenameOnSaving(_settings->value(KEY_FILENAME_TO_CLB, DEF_FILENAME_TO_CLB).toInt());
setDateTimeInFilename(_settings->value(KEY_FILENAMEDATE, DEF_DATETIME_FILENAME).toBool());
setDateTimeTpl(_settings->value(KEY_DATETIME_TPL, DEF_DATETIME_TPL).toString());
setAutoSave(_settings->value(KEY_AUTOSAVE, DEF_AUTO_SAVE).toBool());
setAutoSaveFirst(_settings->value(KEY_AUTOSAVE_FIRST, DEF_AUTO_SAVE_FIRST).toBool());
setNoDecoration(_settings->value(KEY_NODECOR, DEF_X11_NODECOR).toBool());
setImageQuality(_settings->value(KEY_IMG_QUALITY, DEF_IMG_QUALITY).toInt());
setIncludeCursor(_settings->value(KEY_INCLUDE_CURSOR, DEF_INCLUDE_CURSOR).toBool());
_settings->endGroup();
_settings->beginGroup("Display");
setTrayMessages(_settings->value(KEY_TRAYMESSAGES, DEF_TRAY_MESS_TYPE).toInt());
setTimeTrayMess(_settings->value(KEY_TIME_NOTIFY, DEF_TIME_TRAY_MESS).toInt( ));
setZoomAroundMouse(_settings->value(KEY_ZOOMBOX, DEF_ZOOM_AROUND_MOUSE).toBool());
// TODO - make set windows size without hardcode values
setRestoredWndSize(_settings->value(KEY_WND_WIDTH, DEF_WND_WIDTH).toInt(),
_settings->value(KEY_WND_HEIGHT, DEF_WND_HEIGHT).toInt());
setShowTrayIcon(_settings->value(KEY_SHOW_TRAY, DEF_SHOW_TRAY).toBool());
_settings->endGroup();
_settings->beginGroup("System");
setCloseInTray(_settings->value(KEY_CLOSE_INTRAY, DEF_CLOSE_IN_TRAY).toBool());
setAllowMultipleInstance(_settings->value(KEY_ALLOW_COPIES, DEF_ALLOW_COPIES).toBool());
setEnableExtView(_settings->value(KEY_ENABLE_EXT_VIEWER, DEF_ENABLE_EXT_VIEWER).toBool());
setFitInside(_settings->value(KEY_FIT_INSIDE, DEF_FIT_INSIDE).toBool());
_settings->endGroup();
setDelay(getDefDelay());
_shortcuts->loadSettings();
}
void Config::saveSettings()
{
_settings->beginGroup("Base");
_settings->setValue(KEY_SAVEDIR, getSaveDir());
_settings->setValue(KEY_SAVENAME, getSaveFileName());
_settings->setValue(KEY_SAVEFORMAT, getSaveFormat());
_settings->setValue(KEY_DELAY, getDefDelay());
_settings->setValue(QLatin1String(KEY_SCREENSHOT_TYPE_DEF), screenshotTypeToString(getDefScreenshotType()));
_settings->setValue(KEY_FILENAME_TO_CLB, getAutoCopyFilenameOnSaving());
_settings->setValue(KEY_FILENAMEDATE, getDateTimeInFilename());
_settings->setValue(KEY_DATETIME_TPL, getDateTimeTpl());
_settings->setValue(KEY_AUTOSAVE, getAutoSave());
_settings->setValue(KEY_AUTOSAVE_FIRST, getAutoSaveFirst());
_settings->setValue(KEY_IMG_QUALITY, getImageQuality());
_settings->setValue(KEY_NODECOR, getNoDecoration());
_settings->setValue(KEY_INCLUDE_CURSOR, getIncludeCursor());
_settings->endGroup();
_settings->beginGroup("Display");
_settings->setValue(KEY_TRAYMESSAGES, getTrayMessages());
_settings->setValue(KEY_TIME_NOTIFY, getTimeTrayMess());
_settings->setValue(KEY_ZOOMBOX, getZoomAroundMouse());
_settings->setValue(KEY_SHOW_TRAY, getShowTrayIcon());
_settings->endGroup();
saveWndSize();
_settings->beginGroup("System");
_settings->setValue(KEY_CLOSE_INTRAY, getCloseInTray());
_settings->setValue(KEY_ALLOW_COPIES, getAllowMultipleInstance());
_settings->setValue(KEY_ENABLE_EXT_VIEWER, getEnableExtView());
_settings->setValue(KEY_FIT_INSIDE, getFitInside());
_settings->endGroup();
_shortcuts->saveSettings();
resetScrNum();
}
// set default values
void Config::setDefaultSettings()
{
setSaveDir(getDirNameDefault());
setSaveFileName(DEF_SAVE_NAME);
setSaveFormat(DEF_SAVE_FORMAT);
setDefDelay(DEF_DELAY);
setScreenshotType(Core::FullScreen);
setImageQuality(DEF_IMG_QUALITY);
setDateTimeInFilename(DEF_DATETIME_FILENAME);
setDateTimeTpl(DEF_DATETIME_TPL);
setAutoCopyFilenameOnSaving(DEF_FILENAME_TO_CLB);
setAutoSave(DEF_AUTO_SAVE);
setAutoSaveFirst(DEF_AUTO_SAVE_FIRST);
setTrayMessages(DEF_TRAY_MESS_TYPE);
setIncludeCursor(DEF_INCLUDE_CURSOR);
setZoomAroundMouse(DEF_ZOOM_AROUND_MOUSE);
setCloseInTray(DEF_CLOSE_IN_TRAY);
setTimeTrayMess(DEF_TIME_TRAY_MESS);
setAllowMultipleInstance(DEF_ALLOW_COPIES);
// TODO - make set windows size without hardcode values
// setRestoredWndSize(DEF_WND_WIDTH, DEF_WND_HEIGHT);
setShowTrayIcon(DEF_SHOW_TRAY);
setEnableExtView(DEF_ENABLE_EXT_VIEWER);
setFitInside(DEF_FIT_INSIDE);
_shortcuts->setDefaultSettings();
setNoDecoration(DEF_X11_NODECOR);
setDelay(DEF_DELAY);
quint8 countModules = Core::instance()->modules()->count();
for (int i = 0; i < countModules; ++i)
Core::instance()->modules()->getModule(i)->defaultSettings();
}
// get defaukt directory path
QString Config::getDirNameDefault()
{
return QDir::homePath()+QDir::separator();
}
// get id of default save format
int Config::getDefaultFormatID()
{
return _imageFormats.indexOf(getSaveFormat());
}
QString Config::getSysLang()
{
QByteArray lang = qgetenv("LC_ALL");
if (lang.isEmpty())
lang = qgetenv("LC_MESSAGES");
if (lang.isEmpty())
lang = qgetenv("LANG");
if (!lang.isEmpty())
return QLocale (lang).name();
else
return QLocale::system().name();
}
ShortcutManager* Config::shortcuts()
{
return _shortcuts;
}