You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/modules/theme/managementdialog.cpp

460 lines
13 KiB

//=============================================================================
//
// File : managementdialog.cpp
// Created on Sat 30 Dec 2006 14:54:56 by Szymon Stefanek
//
// This file is part of the KVIrc IRC Client distribution
// Copyright (C) 2006 Szymon Stefanek <pragma at kvirc dot net>
//
// 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 opinion) 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, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#define LVI_ICON_SIZE 32
#define LVI_BORDER 4
#define LVI_SPACING 8
#define LVI_MINIMUM_TEXT_WIDTH 300
#define LVI_MINIMUM_CELL_WIDTH (LVI_MINIMUM_TEXT_WIDTH + LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER)
#include "managementdialog.h"
#include "packthemedialog.h"
#include "savethemedialog.h"
#include "themefunctions.h"
#include "kvi_iconmanager.h"
#include "kvi_msgbox.h"
#include <tqlayout.h>
#include <tqpushbutton.h>
#include "kvi_tal_listbox.h"
#include <tqlineedit.h>
#include <kvi_tal_textedit.h>
#include <tqregexp.h>
#include <tqmessagebox.h>
#include <tqdir.h>
#include <tqstringlist.h>
#include <tqdatetime.h>
#include <tqfiledialog.h>
#include "kvi_tal_popupmenu.h"
#include <tqcombobox.h>
#include <tqpainter.h>
#include <tqtooltip.h>
#include <tqimage.h>
#include <kvi_tal_textedit.h>
//#include <tqmultilineedit.h>
#ifdef COMPILE_USE_QT4
#include <TQCloseEvent>
#endif
#include <tqbuffer.h>
#include "kvi_options.h"
#include "kvi_locale.h"
#include "kvi_config.h"
#include "kvi_fileutils.h"
#include "kvi_app.h"
#include "kvi_frame.h"
#include "kvi_iconmanager.h"
#include "kvi_internalcmd.h"
#include "kvi_styled_controls.h"
#include "kvi_doublebuffer.h"
#include "kvi_packagefile.h"
#include "kvi_fileextensions.h"
#include "kvi_filedialog.h"
#include "kvi_dynamictooltip.h"
#include <stdlib.h> // rand & srand
extern TQRect g_rectManagementDialogGeometry;
KviThemeListBoxItem::KviThemeListBoxItem(KviTalListBox * box,KviThemeInfo * inf)
: KviTalListBoxText(box)
{
m_pThemeInfo = inf;
TQString t;
t = "<nobr><b>";
t += inf->name();
t += "</b>";
if(!inf->version().isEmpty()) {
t += "[";
t += inf->version();
t += "]";
}
if(!inf->author().isEmpty()) {
t += " <font color=\"#a0a0a0\"> ";
t += __tr2qs_ctx("by","theme");
t += " ";
t += inf->author();
t += "</font>";
}
t += "</nobr>";
t += "<br><nobr><font size=\"-1\">";
t += inf->description();
t += "</font></nobr>";
m_pText = new KviTalSimpleRichText(t,box->font());
int iWidth = box->visibleWidth();
if(iWidth < LVI_MINIMUM_CELL_WIDTH)iWidth = LVI_MINIMUM_CELL_WIDTH;
iWidth -= LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER;
m_pText->setWidth(iWidth);
}
KviThemeListBoxItem::~KviThemeListBoxItem()
{
delete m_pThemeInfo;
delete m_pText;
}
void KviThemeListBoxItem::paint(TQPainter * p)
{
KviTalListBoxText::paint(p);
p->drawPixmap(LVI_BORDER,LVI_BORDER, *(g_pIconManager->getBigIcon(TQString(KVI_BIGICON_THEME))) );
int afterIcon = LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING;
int www = p->window().width() - (afterIcon + LVI_BORDER);
m_pText->setWidth(www);
m_pText->draw(p,afterIcon,LVI_BORDER,TQRect(afterIcon,LVI_BORDER,www,p->window().height() - (LVI_BORDER * 2)),listBox()->viewport()->colorGroup());
}
int KviThemeListBoxItem::height(const KviTalListBox * lb) const
{
int iHeight = m_pText->height() + (2 * LVI_BORDER);
if(iHeight < (LVI_ICON_SIZE + (2 * LVI_BORDER)))iHeight = LVI_ICON_SIZE + (2 * LVI_BORDER);
return iHeight;
}
KviThemeManagementDialog * KviThemeManagementDialog::m_pInstance = 0;
KviThemeManagementDialog::KviThemeManagementDialog(TQWidget * parent)
: TQDialog(parent,"theme_options_widget")
{
setCaption(__tr2qs_ctx("Manage Themes - KVIrc","theme"));
setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_THEME)));
setModal(true);
m_pInstance = this;
TQGridLayout * g = new TQGridLayout(this,3,2,4,4);
KviTalHBox *hb = new KviTalHBox(this);
g->addMultiCellWidget(hb,0,0,0,1);
KviStyledToolButton * tb;
TQFrame * sep;
tb = new KviStyledToolButton(hb);
tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_SAVE)));
tb->setUsesBigPixmap(true);
TQToolTip::add(tb,__tr2qs_ctx("Save Current Theme...","theme"));
connect(tb,TQT_SIGNAL(clicked()),this,TQT_SLOT(saveCurrentTheme()));
sep = new TQFrame(hb);
sep->setFrameStyle(TQFrame::VLine | TQFrame::Sunken);
sep->setMinimumWidth(12);
m_pPackThemeButton = new KviStyledToolButton(hb);
m_pPackThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_PACK)));
m_pPackThemeButton->setUsesBigPixmap(true);
TQToolTip::add(m_pPackThemeButton,__tr2qs_ctx("Export Selected Themes to a Distributable Package","theme"));
connect(m_pPackThemeButton,TQT_SIGNAL(clicked()),this,TQT_SLOT(packTheme()));
m_pDeleteThemeButton = new KviStyledToolButton(hb);
m_pDeleteThemeButton->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_REMOVE)));
m_pDeleteThemeButton->setUsesBigPixmap(true);
TQToolTip::add(m_pDeleteThemeButton,__tr2qs_ctx("Delete Selected Themes","theme"));
connect(m_pDeleteThemeButton,TQT_SIGNAL(clicked()),this,TQT_SLOT(deleteTheme()));
sep = new TQFrame(hb);
sep->setFrameStyle(TQFrame::VLine | TQFrame::Sunken);
sep->setMinimumWidth(12);
tb = new KviStyledToolButton(hb);
tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_OPEN)));
tb->setUsesBigPixmap(true);
TQToolTip::add(tb,__tr2qs_ctx("Install Theme Package From Disk","theme"));
connect(tb,TQT_SIGNAL(clicked()),this,TQT_SLOT(installFromFile()));
tb = new KviStyledToolButton(hb);
tb->setIconSet(*(g_pIconManager->getBigIcon(KVI_BIGICON_WWW)));
tb->setUsesBigPixmap(true);
TQToolTip::add(tb,__tr2qs_ctx("Get More Themes...","theme"));
connect(tb,TQT_SIGNAL(clicked()),this,TQT_SLOT(getMoreThemes()));
TQWidget *w= new TQWidget(hb);
w->setSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Minimum);
m_pListBox = new KviTalListBox(this);
m_pListBox->setMinimumHeight(400);
m_pListBox->setMinimumWidth(400);
m_pListBox->setSelectionMode(KviTalListBox::Extended);
connect(m_pListBox,TQT_SIGNAL(doubleClicked(KviTalListBoxItem *)),this,TQT_SLOT(applyTheme(KviTalListBoxItem *)));
connect(m_pListBox,TQT_SIGNAL(contextMenuRequested(KviTalListBoxItem *,const TQPoint &)),
this,TQT_SLOT(contextMenuRequested(KviTalListBoxItem *,const TQPoint &)));
connect(m_pListBox,TQT_SIGNAL(selectionChanged()),this,TQT_SLOT(enableDisableButtons()));
g->addMultiCellWidget(m_pListBox,1,1,0,1);
KviDynamicToolTip * tip = new KviDynamicToolTip(m_pListBox);
connect(tip,TQT_SIGNAL(tipRequest(KviDynamicToolTip *,const TQPoint &)),this,TQT_SLOT(tipRequest(KviDynamicToolTip *,const TQPoint &)));
TQPushButton * b = new TQPushButton(__tr2qs("Close"),this);
connect(b,TQT_SIGNAL(clicked()),this,TQT_SLOT(closeClicked()));
g->addWidget(b,2,1);
g->setRowStretch(1,0);
g->setColStretch(0,1);
fillThemeBox();
m_pContextPopup = new KviTalPopupMenu(this);
if(g_rectManagementDialogGeometry.y() < 5)
{
g_rectManagementDialogGeometry.setY(5);
}
resize(g_rectManagementDialogGeometry.width(),
g_rectManagementDialogGeometry.height());
move(g_rectManagementDialogGeometry.x(),
g_rectManagementDialogGeometry.y());
}
KviThemeManagementDialog::~KviThemeManagementDialog()
{
g_rectManagementDialogGeometry = TQRect(pos().x(),pos().y(),size().width(),size().height());
m_pInstance = 0;
}
void KviThemeManagementDialog::closeClicked()
{
delete this;
m_pInstance = 0;
}
void KviThemeManagementDialog::display()
{
if(!m_pInstance)
m_pInstance = new KviThemeManagementDialog(g_pFrame);
m_pInstance->show();
}
void KviThemeManagementDialog::cleanup()
{
if(!m_pInstance)return;
delete m_pInstance;
m_pInstance = 0;
}
void KviThemeManagementDialog::packTheme()
{
KviPointerList<KviThemeInfo> dl;
dl.setAutoDelete(false);
for(KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->firstItem();it;it = (KviThemeListBoxItem *)it->next())
{
if(it->isSelected())
dl.append(it->themeInfo());
}
if(dl.isEmpty())return;
KviPackThemeDialog * pDialog = new KviPackThemeDialog(this,&dl);
pDialog->exec();
delete pDialog;
}
void KviThemeManagementDialog::contextMenuRequested(KviTalListBoxItem * it,const TQPoint & pos)
{
if(it)
{
m_pListBox->setCurrentItem(it);
m_pContextPopup->clear();
m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MINUS)),__tr2qs_ctx("&Remove Theme","theme"),this,TQT_SLOT(deleteTheme()));
m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ACCEPT)),__tr2qs_ctx("&Apply Theme","theme"),this,TQT_SLOT(applyCurrentTheme()));
m_pContextPopup->popup(pos);
}
}
void KviThemeManagementDialog::applyTheme ( KviTalListBoxItem * it)
{
if(it)m_pListBox->setCurrentItem(it);
applyCurrentTheme();
}
void KviThemeManagementDialog::applyCurrentTheme()
{
KviThemeListBoxItem * it = (KviThemeListBoxItem *)m_pListBox->item(m_pListBox->currentItem());
if(!it)return;
if(KviMessageBox::yesNo(__tr2qs_ctx("Apply theme - KVIrc","theme"),
__tr2qs_ctx("Do you wish to apply theme \"%Q\" (version %Q)?","theme"),
&(it->themeInfo()->name()),&(it->themeInfo()->version())))
{
TQString szPath = it->themeInfo()->absoluteDirectory();
if(szPath.isEmpty())return;
KviThemeInfo out;
if(!KviTheme::load(szPath,out))
{
TQString szErr = out.lastError();
TQString szMsg;
KviTQString::sprintf(szMsg,__tr2qs_ctx("Failed to apply the specified theme: %Q","theme"),&szErr);
TQMessageBox::critical(this,__tr2qs_ctx("Apply theme - KVIrc","theme"),szMsg,
TQMessageBox::Ok,TQMessageBox::NoButton,TQMessageBox::NoButton);
}
}
}
void KviThemeManagementDialog::deleteTheme()
{
for(KviThemeListBoxItem * pItem = (KviThemeListBoxItem *)m_pListBox->firstItem();pItem;pItem = (KviThemeListBoxItem *)pItem->next())
{
if(pItem->isSelected())
{
if(!KviMessageBox::yesNo(__tr2qs_ctx("Delete Theme - KVIrc","theme"),
__tr2qs_ctx("Do you really wish to delete theme \"%Q\" (version %Q)?","theme"),
&(pItem->themeInfo()->name()),&(pItem->themeInfo()->version())))goto jump_out;
KviFileUtils::deleteDir(pItem->themeInfo()->absoluteDirectory());
}
}
jump_out:
fillThemeBox();
}
void KviThemeManagementDialog::installFromFile()
{
int iThemeCount=0;
TQString szFileName;
TQString szError;
if(!KviFileDialog::askForOpenFileName(szFileName,__tr2qs_ctx("Open Theme - KVIrc","theme"),TQString(),"*.kvt"))
return;
if(!KviThemeFunctions::installThemePackage(szFileName,szError,this))
{
KviMessageBox::information(szError);
return;
}
fillThemeBox();
}
void KviThemeManagementDialog::getMoreThemes()
{
if(!g_pFrame)return;
g_pFrame->executeInternalCommand(KVI_INTERNALCOMMAND_OPENURL_KVIRC_THEMES);
}
void KviThemeManagementDialog::saveCurrentTheme()
{
KviSaveThemeDialog * pSaveThemeDialog = new KviSaveThemeDialog(this);
pSaveThemeDialog->exec();
delete pSaveThemeDialog;
fillThemeBox();
}
void KviThemeManagementDialog::fillThemeBox(const TQString &szDir)
{
TQDir d(szDir);
TQStringList sl = d.entryList(TQDir::Dirs);
for(TQStringList::Iterator it = sl.begin();it != sl.end();++it)
{
if(*it == ".")continue;
if(*it == "..")continue;
TQString szTest = szDir;
szTest += KVI_PATH_SEPARATOR_CHAR;
szTest += *it;
KviThemeInfo * inf = new KviThemeInfo();
if(inf->loadFromDirectory(szTest))
{
inf->setSubdirectory(*it);
KviThemeListBoxItem * item = 0;
item = new KviThemeListBoxItem(m_pListBox,inf);
} else {
delete inf;
}
}
}
void KviThemeManagementDialog::fillThemeBox()
{
m_pListBox->clear();
TQString szDir;
g_pApp->getGlobalKvircDirectory(szDir,KviApp::Themes);
fillThemeBox(szDir);
g_pApp->getLocalKvircDirectory(szDir,KviApp::Themes);
fillThemeBox(szDir);
enableDisableButtons();
}
bool KviThemeManagementDialog::hasSelectedItems()
{
for(KviTalListBoxItem * it = m_pListBox->firstItem();it;it = it->next())
{
if(it->isSelected())return true;
}
return false;
}
void KviThemeManagementDialog::enableDisableButtons()
{
bool b = hasSelectedItems();
m_pPackThemeButton->setEnabled(b);
m_pDeleteThemeButton->setEnabled(b);
}
void KviThemeManagementDialog::closeEvent(TQCloseEvent * e)
{
e->ignore();
delete this;
}
void KviThemeManagementDialog::tipRequest(KviDynamicToolTip *pTip,const TQPoint &pnt)
{
KviThemeListBoxItem * it = (KviThemeListBoxItem *)(m_pListBox->itemAt(pnt));
if(!it)return;
KviThemeInfo * pThemeInfo = it->themeInfo();
TQString szThemeDescription;
KviThemeFunctions::getThemeHtmlDescription(
szThemeDescription,
pThemeInfo->name(),
pThemeInfo->version(),
pThemeInfo->description(),
pThemeInfo->subdirectory(),
pThemeInfo->application(),
pThemeInfo->author(),
pThemeInfo->date(),
pThemeInfo->themeEngineVersion(),
pThemeInfo->mediumScreenshot(),
0
);
pTip->tip(m_pListBox->itemRect(it),szThemeDescription);
}