summaryrefslogtreecommitdiffstats
path: root/src/tellico_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tellico_utils.cpp')
-rw-r--r--src/tellico_utils.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/tellico_utils.cpp b/src/tellico_utils.cpp
new file mode 100644
index 0000000..6af6706
--- /dev/null
+++ b/src/tellico_utils.cpp
@@ -0,0 +1,218 @@
+/***************************************************************************
+ copyright : (C) 2003-2006 by Robby Stephenson
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of version 2 of the GNU General Public License as *
+ * published by the Free Software Foundation; *
+ * *
+ ***************************************************************************/
+
+#include "tellico_utils.h"
+#include "tellico_kernel.h"
+#include "latin1literal.h"
+#include "tellico_debug.h"
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <klibloader.h>
+#include <kstandarddirs.h>
+#include <kcharsets.h>
+
+#include <qregexp.h>
+#include <qdir.h>
+#include <qcursor.h>
+#include <qscrollview.h>
+
+namespace {
+ static const int STRING_STORE_SIZE = 997; // too big, too small?
+}
+
+QColor Tellico::contrastColor;
+
+QString Tellico::decodeHTML(QString text) {
+ QRegExp rx(QString::fromLatin1("&(.+);"));
+ rx.setMinimal(true);
+ int pos = rx.search(text);
+ while(pos > -1) {
+ QChar c = KCharsets::fromEntity(rx.cap(1));
+ if(!c.isNull()) {
+ text.replace(pos, rx.matchedLength(), c);
+ }
+ pos = rx.search(text, pos+1);
+ }
+ return text;
+}
+
+QString Tellico::uid(int l, bool prefix) {
+ QString uid;
+ if(prefix) {
+ uid = QString::fromLatin1("Tellico");
+ }
+ uid.append(kapp->randomString(QMAX(l - uid.length(), 0)));
+ return uid;
+}
+
+uint Tellico::toUInt(const QString& s, bool* ok) {
+ if(s.isEmpty()) {
+ if(ok) {
+ *ok = false;
+ }
+ return 0;
+ }
+
+ uint idx = 0;
+ while(s[idx].isDigit()) {
+ ++idx;
+ }
+ if(idx == 0) {
+ if(ok) {
+ *ok = false;
+ }
+ return 0;
+ }
+ return s.left(idx).toUInt(ok);
+}
+
+QString Tellico::i18nReplace(QString text) {
+ // Because QDomDocument sticks in random newlines, go ahead and grab them too
+ static QRegExp rx(QString::fromLatin1("(?:\\n+ *)*<i18n>([^<]*)</i18n>(?: *\\n+)*"));
+ int pos = rx.search(text);
+ while(pos > -1) {
+ text.replace(pos, rx.matchedLength(), i18n(rx.cap(1).utf8()));
+ pos = rx.search(text, pos+rx.matchedLength());
+ }
+ return text;
+}
+
+QStringList Tellico::findAllSubDirs(const QString& dir_) {
+ if(dir_.isEmpty()) {
+ return QStringList();
+ }
+
+ // TODO: build in symlink checking, for now, prohibit
+ QDir dir(dir_, QString::null, QDir::Name | QDir::IgnoreCase, QDir::Dirs | QDir::Readable | QDir::NoSymLinks);
+
+ QStringList allSubdirs; // the whole list
+
+ // find immediate sub directories
+ const QStringList subdirs = dir.entryList();
+ for(QStringList::ConstIterator subdir = subdirs.begin(); subdir != subdirs.end(); ++subdir) {
+ if((*subdir).isEmpty() || *subdir == Latin1Literal(".") || *subdir == Latin1Literal("..")) {
+ continue;
+ }
+ QString absSubdir = dir.absFilePath(*subdir);
+ allSubdirs += findAllSubDirs(absSubdir);
+ allSubdirs += absSubdir;
+ }
+ return allSubdirs;
+}
+
+// Based on QGDict's hash functions, Copyright (C) 1992-2000 Trolltech AS
+// and used from Juk, Copyright (C) 2003 - 2004 by Scott Wheeler
+int Tellico::stringHash(const QString& str) {
+ uint h = 0;
+ uint g = 0;
+ for(uint i = 0; i < str.length(); ++i) {
+ h = (h << 4) + str.unicode()[i].cell();
+ if((g = h & 0xf0000000)) {
+ h ^= g >> 24;
+ }
+ h &= ~g;
+ }
+
+ int index = h;
+ return index < 0 ? -index : index;
+}
+
+QString Tellico::shareString(const QString& str) {
+ static QString stringStore[STRING_STORE_SIZE];
+
+ const int hash = stringHash(str) % STRING_STORE_SIZE;
+ if(stringStore[hash] != str) {
+ stringStore[hash] = str;
+ }
+ return stringStore[hash];
+}
+
+void Tellico::updateContrastColor(const QColorGroup& cg_) {
+ // if the value difference between background and highlight is more than ???
+ // use highlight, else go lighter or darker
+ int h1, s1, v1, h2, s2, v2;
+ cg_.background().getHsv(&h1, &s1, &v1);
+
+ QColor hl = cg_.highlight();
+ hl.getHsv(&h2, &s2, &v2);
+ h2 += 120;
+ s2 = 255;
+ hl.setHsv(h2, s2, v2);
+
+ if(KABS(v2-v1) < 48) {
+ if(v1 < 128) {
+ contrastColor = hl.light();
+ } else {
+ contrastColor = hl.dark();
+ }
+ } else {
+ contrastColor = hl;
+ }
+}
+
+KLibrary* Tellico::openLibrary(const QString& libName_) {
+ QString path = KLibLoader::findLibrary(QFile::encodeName(libName_));
+ if(path.isEmpty()) {
+ kdWarning() << "Tellico::openLibrary() - Could not find library '" << libName_ << "'" << endl;
+ kdWarning() << "ERROR: " << KLibLoader::self()->lastErrorMessage() << endl;
+ return 0;
+ }
+
+ KLibrary* library = KLibLoader::self()->library(QFile::encodeName(path));
+ if(!library) {
+ kdWarning() << "Tellico::openLibrary() - Could not load library '" << libName_ << "'" << endl;
+ kdWarning() << " PATH: " << path << endl;
+ kdWarning() << "ERROR: " << KLibLoader::self()->lastErrorMessage() << endl;
+ return 0;
+ }
+
+ return library;
+}
+
+QColor Tellico::blendColors(const QColor& color1, const QColor& color2, int percent) {
+ const double factor2 = percent/100.0;
+ const double factor1 = 1.0 - factor2;
+
+ const int r = static_cast<int>(color1.red() * factor1 + color2.red() * factor2);
+ const int g = static_cast<int>(color1.green() * factor1 + color2.green() * factor2);
+ const int b = static_cast<int>(color1.blue() * factor1 + color2.blue() * factor2);
+
+ return QColor(r, g, b);
+}
+
+QString Tellico::minutes(int seconds) {
+ int min = seconds / 60;
+ seconds = seconds % 60;
+ return QString::number(min) + ':' + QString::number(seconds).rightJustify(2, '0');
+}
+
+QString Tellico::saveLocation(const QString& dir_) {
+ return KGlobal::dirs()->saveLocation("appdata", dir_, true);
+}
+
+Tellico::GUI::CursorSaver::CursorSaver(const QCursor& cursor_) : m_restored(false) {
+ kapp->setOverrideCursor(cursor_);
+}
+
+Tellico::GUI::CursorSaver::~CursorSaver() {
+ if(!m_restored) {
+ kapp->restoreOverrideCursor();
+ }
+}
+
+void Tellico::GUI::CursorSaver::restore() {
+ kapp->restoreOverrideCursor();
+ m_restored = true;
+}