~ubuntu-branches/ubuntu/lucid/kkbswitch/lucid

« back to all changes in this revision

Viewing changes to kkbswitch/kbpickicondlg.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Lior Kaplan
  • Date: 2005-09-07 02:01:14 UTC
  • Revision ID: james.westby@ubuntu.com-20050907020114-2wyo9eu21uihq86n
Tags: upstream-1.4.3
ImportĀ upstreamĀ versionĀ 1.4.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
                          kbpickicondlg.cpp  -  description
 
3
                             -------------------
 
4
    begin                : Sat Jul 21 2001
 
5
    copyright            : (C) 2001 by Leonid Zeitlin
 
6
    email                : lz@europe.com
 
7
 ***************************************************************************/
 
8
 
 
9
/***************************************************************************
 
10
 *                                                                         *
 
11
 *   This program is free software; you can redistribute it and/or modify  *
 
12
 *   it under the terms of the GNU General Public License as published by  *
 
13
 *   the Free Software Foundation; either version 2 of the License, or     *
 
14
 *   (at your option) any later version.                                   *
 
15
 *                                                                         *
 
16
 ***************************************************************************/
 
17
 
 
18
#include "kbpickicondlg.h"
 
19
 
 
20
#include <qvbox.h>
 
21
#include <qdir.h>
 
22
#include <qwhatsthis.h>
 
23
#include <qpushbutton.h>
 
24
#include <qimage.h>
 
25
 
 
26
#include <kdeversion.h>
 
27
#include <klocale.h>
 
28
#if KDE_VERSION_MAJOR >= 3
 
29
  #include <kstandarddirs.h>
 
30
#else
 
31
  #include <kstddirs.h>
 
32
#endif
 
33
#include <kglobal.h>
 
34
#include <kfiledialog.h>
 
35
#include <kmessagebox.h>
 
36
 
 
37
#include "kbconfig.h"
 
38
#include "pathlistboxitem.h"
 
39
 
 
40
KBPickIconDlg::KBPickIconDlg(const QString &currentPath, const QPixmap &currentPixmap,
 
41
  QWidget *parent, const char *name )
 
42
  : KDialogBase(parent, name, true /*modal*/, i18n("Pick an icon") /*caption*/, Ok | Cancel) {
 
43
  QVBox *page = makeVBoxMainWidget();
 
44
  
 
45
  lbIcons = new KListBox(page);
 
46
  QObject::connect(lbIcons, SIGNAL(doubleClicked(QListBoxItem*)),
 
47
    this, SLOT(slotOk()));
 
48
  QObject::connect(lbIcons, SIGNAL(returnPressed(QListBoxItem*)),
 
49
    this, SLOT(slotOk()));
 
50
  QWhatsThis::add(lbIcons, i18n("Select one of the icons"));  
 
51
 
 
52
  QPushButton *btnBrowse = new QPushButton(i18n("&Browse..."), page);
 
53
  QObject::connect(btnBrowse, SIGNAL(clicked()), this, SLOT(slotBrowseForIcon()));
 
54
  QWhatsThis::add(btnBrowse, i18n("Browse for an image file to use as an icon"));
 
55
  
 
56
  loadCountryFlags();
 
57
      
 
58
        // I am told in Red Hat 9 standard KDE flag pixmaps are missing.
 
59
  // Workaround: we have to simulate them by rescaling GKB's pixmaps
 
60
  if (lbIcons->count() == 0) {
 
61
                loadGkbCountryFlags();
 
62
        }
 
63
        lbIcons->sort();
 
64
        showCurrentPath(currentPath, currentPixmap);
 
65
  lbIcons->setFocus();
 
66
}
 
67
 
 
68
KBPickIconDlg::~KBPickIconDlg(){
 
69
}
 
70
 
 
71
/** Get the path name of the selected icon. Returns empty string if no icon selected */
 
72
QString KBPickIconDlg::getIconPath(){
 
73
  QListBoxItem *item = lbIcons->selectedItem();
 
74
        if (item) 
 
75
                return dynamic_cast<PathListBoxItem*>(item)->path;
 
76
        else return QString::null; // should not happen
 
77
}
 
78
 
 
79
/** No descriptions */
 
80
const QPixmap* KBPickIconDlg::getIcon(){
 
81
  if (lbIcons->currentItem() != -1)
 
82
    return lbIcons->pixmap(lbIcons->currentItem());
 
83
  else return NULL;
 
84
}
 
85
 
 
86
/** Browse for an arbitrary icon file */
 
87
void KBPickIconDlg::slotBrowseForIcon()
 
88
{
 
89
        QString iconPath = KFileDialog::getOpenFileName(QString::null,
 
90
          i18n("*.png *.jpg *.gif *.xpm|Icon files (*.png, *.jpg, *.gif, *.xpm)\n*.*|All files (*.*)"));
 
91
        if (iconPath.isEmpty()) return;  
 
92
  QImage img;
 
93
  if (img.load(iconPath)) {
 
94
                double aspectRatio = img.width() / img.height();
 
95
                QString message = QString::null;
 
96
                bool too_big, too_wide, too_narrow;
 
97
                too_narrow = aspectRatio < FLAG_ICON_WIDTH / FLAG_ICON_HEIGHT - 0.1;
 
98
                too_wide = aspectRatio > FLAG_ICON_WIDTH / FLAG_ICON_HEIGHT + 0.1;
 
99
                too_big = img.width() > FLAG_ICON_WIDTH * 2;
 
100
                if (too_big || too_narrow || too_wide) {
 
101
                message = i18n("The size of this image (%1 by %2) is not good.\n"
 
102
                  "Preferred size for the layout icons is %3 by %4.\n")
 
103
                    .arg(img.width()).arg(img.height()).arg(FLAG_ICON_WIDTH).arg(FLAG_ICON_HEIGHT);
 
104
      if (too_big) {
 
105
        QString msg_tail = "";
 
106
        if (too_wide) msg_tail = i18n(" and also too wide");
 
107
                                else if (too_narrow) msg_tail += i18n(" and also too narrow");
 
108
                                message += i18n("This image is too big%1.").arg(msg_tail);
 
109
                        }
 
110
                        else if (too_wide) message += i18n("This image is too wide.");
 
111
                        else if (too_narrow) message += i18n("This image is too narrow.");
 
112
                message += "\n";
 
113
      message += i18n("KKBSwitch will scale it to appropriate size, but the result may not look very good.\n"
 
114
        "Are you sure you want to use this image?");
 
115
      if (KMessageBox::questionYesNo(this, message)     != KMessageBox::Yes) return;
 
116
                }         
 
117
                if (img.width() > FLAG_ICON_WIDTH + 3 || img.height() > FLAG_ICON_HEIGHT + 3)
 
118
                  img = img.smoothScale(FLAG_ICON_WIDTH, FLAG_ICON_HEIGHT);
 
119
                QPixmap pix;
 
120
                pix.convertFromImage(img);
 
121
    PathListBoxItem *item = new PathListBoxItem(lbIcons, pix, QFileInfo(iconPath).fileName(), 
 
122
      iconPath);
 
123
    lbIcons->setSelected(item, true);
 
124
    lbIcons->centerCurrentItem();
 
125
  }
 
126
  else KMessageBox::error(this, i18n("Cannot read icon from file %1. "
 
127
    "Either it is not an image file or it is corrupt.").arg(iconPath));
 
128
}
 
129
 
 
130
void KBPickIconDlg::loadCountryFlags()
 
131
{
 
132
  QPixmap pix;
 
133
  QDir dir;
 
134
  QStringList locales;
 
135
  QString path;
 
136
  QStringList dirs = KGlobal::dirs()->findDirs("locale", "l10n");
 
137
  
 
138
  for (QStringList::Iterator dirIter = dirs.begin(); dirIter != dirs.end(); dirIter++) {
 
139
    dir.setPath(*dirIter);
 
140
    locales = dir.entryList(QDir::Dirs, QDir::Name);
 
141
    for (QStringList::Iterator iter = locales.begin(); iter != locales.end(); iter++) {
 
142
      path = dir.path() + "/" + *iter + "/flag.png";
 
143
      if (*iter != "." && *iter != ".." && pix.load(path)) {
 
144
                                KConfig config(dir.path() + "/" + *iter + "/entry.desktop", true, false,
 
145
                                  "locale" /*doesn't really matter*/);
 
146
        config.setGroup("KCM Locale");
 
147
        new PathListBoxItem(lbIcons, pix, config.readEntry("Name"), path);
 
148
      }
 
149
    }
 
150
  }
 
151
}
 
152
        
 
153
void KBPickIconDlg::loadGkbCountryFlags()
 
154
{
 
155
  QDir dir;
 
156
  QString path, code, name;
 
157
  QPixmap pix;
 
158
  QImage img;
 
159
        
 
160
  dir.setPath("/usr/share/pixmaps/gkb");
 
161
  const QFileInfoList *icons = dir.entryInfoList(QDir::Files, QDir::Name);
 
162
  if (icons) {
 
163
                QFileInfoListIterator iter(*icons);
 
164
                QFileInfo *info;
 
165
    for (; (info = iter.current()); ++iter) {
 
166
      path = info->filePath();
 
167
      code = info->baseName();
 
168
      if (img.load(path)) {
 
169
                                KConfig config("l10n/" + code + "/entry.desktop", true, false, "locale");
 
170
                                config.setGroup("KCM Locale");
 
171
                                name = config.readEntry("Name");
 
172
                                if (!name.isNull()) {
 
173
                                        pix.convertFromImage(img.smoothScale(FLAG_ICON_WIDTH, FLAG_ICON_HEIGHT));
 
174
          new PathListBoxItem(lbIcons, pix, name, path);
 
175
        }
 
176
      }
 
177
    }
 
178
  }
 
179
}
 
180
 
 
181
void KBPickIconDlg::showCurrentPath(const QString &currentPath,
 
182
  const QPixmap &currentPixmap)
 
183
{
 
184
        PathListBoxItem *item = NULL;
 
185
  bool itemFound = false;
 
186
  for (unsigned i = 0; i < lbIcons->count(); i++) {
 
187
                item = dynamic_cast<PathListBoxItem*>(lbIcons->item(i));
 
188
                if (item->path == currentPath) {
 
189
      itemFound = true;
 
190
      break;
 
191
    }  
 
192
        }
 
193
  // why this strange manipulation of HScrollBarMode?
 
194
  // Strangely, without it, if the selected item is the last in the listbox, it ends up
 
195
  // being obscured by the horizontal scrollbar
 
196
  lbIcons->setHScrollBarMode(QScrollView::AlwaysOn);
 
197
  if (!itemFound) item = new PathListBoxItem(lbIcons, currentPixmap, 
 
198
    QFileInfo(currentPath).fileName(), currentPath);
 
199
  lbIcons->updateScrollBars();  
 
200
  lbIcons->setSelected(item, true);
 
201
        lbIcons->ensureCurrentVisible();
 
202
  lbIcons->setHScrollBarMode(QScrollView::Auto);  
 
203
}