root/trunk/qt4-gui/src/dockicons/themeddockicon.cpp

Revision 6058, 5.6 kB (checked in by eugene, 10 months ago)

Major docking fix.

Line 
1// -*- c-basic-offset: 2 -*-
2/*
3 * This file is part of Licq, an instant messaging client for UNIX.
4 * Copyright (C) 2007 Licq developers
5 *
6 * Licq is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * Licq is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with Licq; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20
21#include "themeddockicon.h"
22
23#include "config.h"
24
25#include <QBitmap>
26#include <QFile>
27#include <QPainter>
28
29#include <licq_user.h>
30
31#include "config/general.h"
32#include "core/messagebox.h"
33#include "core/gui-defines.h"
34
35#include "dockiconwidget.h"
36
37using namespace LicqQtGui;
38/* TRANSLATOR LicqQtGui::ThemedDockIcon */
39
40ThemedDockIcon::ThemedDockIcon(QMenu* menu)
41  : DockIcon()
42{
43  myIcon = new DockIconWidget(menu);
44  relayDockIconSignals();
45  cleanup(true);
46  updateConfig();
47}
48
49void ThemedDockIcon::updateConfig()
50{
51  myTheme = Config::General::instance()->themedIconTheme();
52
53  cleanup();
54
55  // Open the config file and read it
56  char temp[MAX_FILENAME_LEN];
57  QString baseDockDir;
58
59  if (myTheme[0] == '/')
60  {
61    baseDockDir = myTheme;
62    if (baseDockDir[baseDockDir.length() - 1] != '/')
63      baseDockDir += "/";
64  }
65  else
66    baseDockDir = QString::fromLocal8Bit(SHARE_DIR) + QTGUI_DIR +
67      DOCK_DIR + myTheme + "/";
68
69  QByteArray filename = QFile::encodeName(baseDockDir);
70  filename.append(myTheme);
71  filename.append(".dock");
72
73  CIniFile dockFile(INI_FxWARN);
74
75  if (!dockFile.LoadFile(filename))
76  {
77    WarnUser(NULL, tr("Unable to load dock theme file:\n(%1)\n%2")
78        .arg(filename.data())
79        .arg(strerror(dockFile.Error())));
80    myIcon->hide();
81    return;
82  }
83
84  myIcon->show();
85
86  // Message icons
87  if (dockFile.SetSection("background"))
88  {
89#define READDOCK(parm, var) \
90    dockFile.ReadStr((parm), temp, "none"); \
91    if (strcmp(temp, "none") == 0) \
92      WarnUser(NULL, tr("Dock theme unspecified image: %1").arg((parm))); \
93    else \
94    { \
95      (var) = new QPixmap(baseDockDir + temp); \
96      if ((var)->isNull()) \
97      { \
98        WarnUser(NULL, tr("Unable to load dock theme image: %1").arg((parm))); \
99        delete (var); \
100        (var) = NULL; \
101      } \
102      else \
103      { \
104        dockFile.ReadStr(parm "Mask", temp, "none"); \
105        if (strcmp(temp, "none") != 0) \
106          (var)->setMask(QBitmap(baseDockDir + temp)); \
107      } \
108    }
109
110    READDOCK("NoMessages", pixNoMessages);
111    READDOCK("RegularMessages", pixRegularMessages);
112    READDOCK("SystemMessages", pixSystemMessages);
113    READDOCK("BothMessages", pixBothMessages);
114#undef READDOCK
115  }
116
117  // Status icons
118  if (dockFile.SetSection("status"))
119  {
120    QBitmap mask;
121    dockFile.ReadStr("Mask", temp, "none");
122    if (strcmp(temp, "none") != 0)
123      mask = QBitmap(baseDockDir + temp);
124#define READDOCK(parm, var) \
125    dockFile.ReadStr((parm), temp, "none"); \
126    if (strcmp(temp, "none") != 0) \
127    { \
128      (var) = new QPixmap(baseDockDir + temp); \
129      if ((var)->isNull()) \
130      { \
131        WarnUser(NULL, tr("Unable to load dock theme image: %1").arg((parm))); \
132        delete (var); \
133        (var) = NULL; \
134      } \
135      else \
136        if (!mask.isNull()) \
137          (var)->setMask(mask); \
138    }
139
140    READDOCK("Online", pixOnline);
141    READDOCK("Offline", pixOffline);
142    READDOCK("Away", pixAway);
143    READDOCK("NA", pixNA);
144    READDOCK("Occupied", pixOccupied);
145    READDOCK("DND", pixDND);
146    READDOCK("Invisible", pixInvisible);
147    READDOCK("FFC", pixFFC);
148#undef READDOCK
149  }
150
151  dockFile.CloseFile();
152
153  updateStatusIcon();
154  updateIconMessages(myNewMsg, mySysMsg);
155}
156
157ThemedDockIcon::~ThemedDockIcon()
158{
159  cleanup();
160}
161
162void ThemedDockIcon::updateIconStatus()
163{
164  DockIcon::updateIconStatus();
165
166  QPixmap* p = NULL;
167
168  if (myInvisible)
169    p = pixInvisible;
170  else
171    switch (myStatus)
172    {
173      case ICQ_STATUS_ONLINE:
174        p = pixOnline;
175        break;
176      case ICQ_STATUS_AWAY:
177        p = pixAway;
178        break;
179      case ICQ_STATUS_NA:
180        p = pixNA;
181        break;
182      case ICQ_STATUS_OCCUPIED:
183        p = pixOccupied;
184        break;
185      case ICQ_STATUS_DND:
186        p = pixDND;
187        break;
188      case ICQ_STATUS_FREEFORCHAT:
189        p = pixFFC;
190        break;
191      case ICQ_STATUS_OFFLINE:
192        p = pixOffline;
193        break;
194    }
195
196  QPixmap* face = myIcon->face();
197  if (face != NULL && p != NULL)
198  {
199    QPainter pt(face);
200    pt.drawPixmap(0, 0, *p);
201  }
202  myIcon->setFace(face, false);
203  delete face;
204}
205
206void ThemedDockIcon::updateIconMessages(int newMsg, int sysMsg)
207{
208  DockIcon::updateIconMessages(newMsg, sysMsg);
209
210  QPixmap* p = NULL;
211
212  if (newMsg > 0 && sysMsg > 0)
213    p = pixBothMessages;
214  else if (newMsg > 0)
215    p = pixRegularMessages;
216  else if (sysMsg > 0)
217    p = pixSystemMessages;
218  else
219    p = pixNoMessages;
220
221  myIcon->setFace(p);
222  updateIconStatus();
223}
224
225void ThemedDockIcon::cleanup(bool initial)
226{
227  QList<QPixmap**> pics;
228  pics << &pixNoMessages << &pixRegularMessages << &pixSystemMessages
229    << &pixBothMessages << &pixOnline << &pixOffline << &pixAway << &pixNA
230    << &pixOccupied << &pixDND << &pixInvisible << &pixFFC;
231  QPixmap** it;
232
233  if (!initial) 
234  {
235    foreach(it, pics)
236      delete *it;
237  }
238
239  foreach(it, pics)
240    *it = NULL;
241}
Note: See TracBrowser for help on using the browser.