summaryrefslogtreecommitdiffstats
path: root/katomic/molek.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'katomic/molek.cpp')
-rw-r--r--katomic/molek.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/katomic/molek.cpp b/katomic/molek.cpp
new file mode 100644
index 00000000..3425ffe1
--- /dev/null
+++ b/katomic/molek.cpp
@@ -0,0 +1,158 @@
+/****************************************************************
+**
+** Implementation Molek class, derieved from Qt tutorial 8
+**
+****************************************************************/
+
+// bemerkungen : wenn paintEvent aufgerufen wird, wird das komplette
+// widget gelöscht und nur die sachen gezeichnet, die in
+// paintEvent stehen ! sollen dinge z.b nur bei maustasten-
+// druck gezeichnet werden, so muß dies in mousePressEvent
+// stehen !
+// paintEvent wird aufgerufen, falls fenster überdeckt wird,
+// oder auch einfach bewegt wird
+
+#include <config.h>
+
+#include "molek.moc"
+#include <kiconloader.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <ksimpleconfig.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <ctype.h>
+
+extern int level;
+
+Molek::Molek( QWidget *parent, const char *name ) : QWidget( parent, name ),
+ data(locate("appdata", "pics/molek.png"))
+{
+ setBackgroundColor (QColor (0, 0, 0));
+ setMinimumSize(240, 200);
+}
+
+Molek::~Molek ()
+{
+}
+
+const atom& Molek::getAtom(uint index) const
+{
+ static atom none = { 0, "" };
+
+ if (index > atoms.count() || index == 0)
+ return none;
+
+ return *atoms.at(index - 1);
+}
+
+void Molek::load (const KSimpleConfig& config)
+{
+ atoms.clear();
+ QString key;
+
+ atom current;
+
+ int atom_index = 1;
+ QString value;
+ while (true) {
+ key.sprintf("atom_%c", int2atom(atom_index));
+ value = config.readEntry(key);
+ if (value.isEmpty())
+ break;
+
+ current.obj = value.at(0).latin1();
+ value = value.mid(2);
+ if (value.isNull())
+ value = "";
+
+ strlcpy(current.conn, value.ascii(), sizeof(current.conn));
+ kdWarning( atoms.find(current) != atoms.end() )
+ << "OOOPS, duplicate atom definition in " << key << endl;
+ atoms.append(current);
+ atom_index++;
+ }
+
+ QString line;
+
+ for (int j = 0; j < MOLEK_SIZE; j++) {
+
+ key.sprintf("mole_%d", j);
+ line = config.readEntry(key);
+
+ for (int i = 0; i < MOLEK_SIZE; i++)
+ molek[i][j] = atom2int(line.at(i).latin1());
+ }
+
+ mname = i18n(config.readEntry("Name", I18N_NOOP("Noname")).latin1());
+
+ int& height = _size.rheight();
+ int& width = _size.rwidth();
+
+ height = 0;
+ width = 0;
+
+ for (int i = 0; i < MOLEK_SIZE; i++)
+ for (int j = 0; j < MOLEK_SIZE; j++) {
+ if (molek [i][j] == 0)
+ continue;
+ if (i > width) width = i;
+ if (j > height) height = j;
+ }
+ height++;
+ width++;
+
+ repaint ();
+}
+
+void Molek::paintEvent( QPaintEvent * )
+{
+ QString st = i18n("Level: %1").arg(level);
+
+ QPainter paint (this);
+ paint.setPen (QColor (190, 190, 190));
+ paint.drawText (7, height() - 36, mname);
+ paint.drawText (7, height() - 18, st);
+ // spielfeld gleich zeichnen
+ for (int i = 0; i < MOLEK_SIZE; i++)
+ for (int j = 0; j < MOLEK_SIZE; j++) {
+ int x = 10 + i * 15;
+ int y = 10 + j * 15;
+
+ if (molek[i][j] == 0)
+ continue;
+
+ // paints atoms
+ if (getAtom(molek [i] [j]).obj <= '9' && getAtom(molek [i] [j]).obj >= '1')
+ bitBlt (this, x, y, &data, (getAtom(molek [i] [j]).obj - '1') * 15, 0, 15,
+ 15, CopyROP);
+
+ // paints cristals
+ if (getAtom(molek [i] [j]).obj == 'o')
+ bitBlt (this, x, y, &data, 10 * 15, 0, 15, 15, CopyROP);
+
+ // paints connections
+ if (isdigit(getAtom(molek[i][j]).obj) || getAtom(molek[i][j]).obj == 'o')
+ for (int c = 0; c < MAX_CONNS_PER_ATOM; c++) {
+ char conn = getAtom(molek [i] [j]).conn[c];
+ if (!conn)
+ break;
+
+ if (conn >= 'a' && conn <= 'a' + 8)
+ bitBlt (this, x, y, &data, (conn - 'a') * 15, 16, 15, 15, XorROP);
+ else
+ bitBlt (this, x, y, &data, (conn - 'A') * 15, 34, 15, 15, XorROP);
+
+ }
+
+
+ // paints connections
+ if (getAtom(molek[i][j]).obj >= 'A' && getAtom(molek[i][j]).obj <= 'F')
+ bitBlt (this, x, y, &data, (getAtom(molek[i][j]).obj - 'A' + 11) * 15 , 0, 15, 15,
+ CopyROP);
+
+ }
+
+ paint.end ();
+}