/** * \file filelistitem.cpp * Item in filelist. * * \b Project: Kid3 * \author Urs Fleisch * \date 02 Oct 2006 * * Copyright (C) 2006-2007 Urs Fleisch * * This file is part of Kid3. * * Kid3 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 option) any later version. * * Kid3 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, see . */ #include "filelistitem.h" #include "filelist.h" #include "taggedfile.h" #include "dirinfo.h" #include "kid3.h" #include #include #include #include /** Empty pixmap, will be allocated in constructor */ QPixmap* FileListItem::nullPixmap = 0; /** Pixmap for modified file, will be allocated in constructor */ QPixmap* FileListItem::modifiedPixmap = 0; /** Pixmap for V1V2, will be allocated in constructor */ QPixmap* FileListItem::v1v2Pixmap = 0; /** Pixmap for V1, will be allocated in constructor */ QPixmap* FileListItem::v1Pixmap = 0; /** Pixmap for V2, will be allocated in constructor */ QPixmap* FileListItem::v2Pixmap = 0; /** Pixmap for "no tag", will be allocated in constructor */ QPixmap* FileListItem::notagPixmap = 0; /** Pixmap for closed folder, will be allocated in constructor */ QPixmap* FileListItem::folderClosedPixmap = 0; /** Pixmap for open folder, will be allocated in constructor */ QPixmap* FileListItem::folderOpenPixmap = 0; /* The bitmaps are stored here instead of using KDE bitmaps to make it work for the Qt only versions. */ /** picture for modified pixmap */ static const char* const modified_xpm[] = { "16 16 33 1", ". c None", "B c None", "A c None", "C c None", "D c None", "E c None", "# c #000000", "b c #006562", "j c #414041", "x c #525552", "f c #529594", "e c #52959c", "w c #5a555a", "v c #626162", "u c #626562", "r c #737173", "p c #737573", "q c #7b757b", "o c #838183", "m c #838583", "z c #8b8d8b", "l c #949194", "k c #9c959c", "i c #a4a1a4", "h c #a4a5a4", "y c #b4b6b4", "g c #bdb6bd", "a c #c5c2c5", "s c #c5c6c5", "c c #cdc6cd", "t c #dedade", "n c #eeeaee", "d c #ffffff", ".......##.......", "......#ab#......", ".....#cbde#.....", "....#abdddf#....", "...#gbddddde#...", "..#hijddddddf#..", ".#kjkljdddddd##.", "#mjnjmojddddjma#", "#jnpnjqrjddjqs#.", "#drtttjuvjjua#..", ".#dasajjwxws#...", "..#dyjzljxa#...A", "...#jrrjws#...AB", "....#cjxa#...ACB", ".....#cs#...ADE.", "......##...ABB.." }; /** picture for empty pixmap */ static const char* const null_xpm[] = { "16 16 2 1", "# c None", ". c None", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#.", ".#.#.#.#.#.#.#.#", "#.#.#.#.#.#.#.#." }; /** picture with V1 and V2 */ static const char* const v1v2_xpm[] = { "16 16 3 1", " c None", ". c #FFFFFF", "+ c #000000", " ", " .. .. . ", " .+ .+ .+ ", " .+ .+ .++ ", " .+.+ .+.+ ", " .+.+ .+ ", " .+ .+ ", " ", " .. .. .. ", " .+ .+ .++. ", " .+ .+.+ .+ ", " .+.+ .+ ", " .+.+ .+.. ", " .+ .++++ ", " ", " "}; /** picture with V1 */ static const char* const v1_xpm[] = { "16 16 3 1", " c None", ". c #FFFFFF", "+ c #000000", " ", " .. .. . ", " .+ .+ .+ ", " .+ .+ .++ ", " .+.+ .+.+ ", " .+.+ .+ ", " .+ .+ ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; /** picture with V2 */ static const char* const v2_xpm[] = { "16 16 3 1", " c None", ". c #FFFFFF", "+ c #000000", " ", " ", " ", " ", " ", " ", " ", " ", " .. .. .. ", " .+ .+ .++. ", " .+ .+.+ .+ ", " .+.+ .+ ", " .+.+ .+.. ", " .+ .++++ ", " ", " "}; /** picture with NO TAG */ static const char* const notag_xpm[] = { "16 16 3 1", " c None", ". c #FFFFFF", "+ c #000000", " ", " .. .. .. ", " .+. .+ .++. ", " .++..+.+ .+ ", " .+.+.+.+ .+ ", " .+ .++.+..+ ", " .+ .+ .++ ", " ", " .... . .. ", " .+++ .+. .++ ", " .+ .+.+.+ .. ", " .+ .+++.+.++ ", " .+ .+.+.+..+ ", " .+ .+.+ .++ ", " ", " "}; /** picture with closed folder */ static const char* folder_closed_xpm[]={ "16 16 10 1", " c #0E279A", ". c #2852AF", "+ c #2B66D3", "@ c #2A83FE", "# c #627CB1", "$ c #5FA1FC", "% c #B0B2CA", "& c #89BEF9", "* c #CDE9FD", "= c #FCFFFC", "==++++++========", "=+======+=======", "+==*=*==#++++++=", "+**=*****=*=*=*+", ".********+++++++", ".*******+&====&+", ".*&+++++&=&&&&&+", ".&+$=*===$$$$$$+", ".&+@$@$@$$$$$@$+", ".&.@@@@@@@@@@@@ ", ".& @@@@@@@@@@@@ ", ".& ===========% ", ".& ===========% ", ".$ %%%%%%%%%%%% ", "=. =", "================"}; /** picture with open folder */ static const char* folder_open_xpm[]={ "16 16 10 1", " c #0E279A", ". c #2852AF", "+ c #2B66D3", "@ c #2A83FE", "# c #627CB1", "$ c #5FA1FC", "% c #B0B2CA", "& c #89BEF9", "* c #CDE9FD", "= c #FCFFFC", "==++++++========", "=+======+=======", "+==*=*==#++++++=", "+**=*****=*=*=*+", ".********+++++++", ".*******+&====*+", ".*&+++++#=&&&&&+", ".&+$=*==*$$$$$$+", ".&+$$@$$@$$$$$@ ", ".$+@@@@@@@@@@@@ ", "..+@@@@@@@@@@@+ ", ".+%===========.=", ". %==========% =", ". %%%%%%%%%%%% =", "= =", "================"}; /** * Constructor. * * @param parent parent file list * @param after this item is inserted after item @a after * @param file tagged file (will be owned by this item) */ FileListItem::FileListItem(FileList* parent, FileListItem* after, TaggedFile* file) : #if QT_VERSION >= 0x040000 QTreeWidgetItem(parent, after), #else QListViewItem(parent, after), #endif m_file(file), m_dirInfo(0) { init(); } /** * Constructor for non top-level items. * * @param parent parent file list item * @param after this item is inserted after item @a after * @param file tagged file (will be owned by this item) */ FileListItem::FileListItem(FileListItem* parent, FileListItem* after, TaggedFile* file) : #if QT_VERSION >= 0x040000 QTreeWidgetItem(parent, after), m_isOpen(false), #else QListViewItem(parent, after), #endif m_file(file), m_dirInfo(0) { init(); } /** * Initialize file list item. * Common initialization for all constructors. */ void FileListItem::init() { setInSelection(false); if (m_file) { setText(0, m_file->getFilename()); } // this two objects should be destructed when the program terminates. // static QPixmap objects are not possible: // "QPaintDevice: Must construct a QApplication before a QPaintDevice" if (!nullPixmap) { nullPixmap = new QPixmap((const char **)null_xpm); } if (!modifiedPixmap) { modifiedPixmap = new QPixmap((const char **)modified_xpm); } if (!v1v2Pixmap) { v1v2Pixmap = new QPixmap((const char **)v1v2_xpm); } if (!v1Pixmap) { v1Pixmap = new QPixmap((const char **)v1_xpm); } if (!v2Pixmap) { v2Pixmap = new QPixmap((const char **)v2_xpm); } if (!notagPixmap) { notagPixmap = new QPixmap((const char **)notag_xpm); } if (!folderClosedPixmap) { folderClosedPixmap = new QPixmap((const char **)folder_closed_xpm); } if (!folderOpenPixmap) { folderOpenPixmap = new QPixmap((const char **)folder_open_xpm); } updateIcons(); } /** * Destructor. */ FileListItem::~FileListItem() { delete m_file; delete m_dirInfo; } #if QT_VERSION >= 0x040000 /** * Opens or closes an item. * * @param o true to open */ void FileListItem::setOpen(bool o) { if (m_dirInfo) { m_isOpen = o; setIcon(0, o ? *folderOpenPixmap : *folderClosedPixmap); if (o && !childCount()) { treeWidget()->setUpdatesEnabled(false); FileList::readSubDirectory(m_dirInfo, this, 0); treeWidget()->setUpdatesEnabled(true); } updateIcons(); } } #else /** * Paints the contents of one column of an item. * * @param p painter * @param cg color group * @param column number of column * @param width width * @param align alignment */ void FileListItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) { if (Kid3App::s_miscCfg.m_markTruncations && column == 0 && m_file && m_file->getTruncationFlags() != 0) { QColorGroup g(cg); g.setColor(QColorGroup::Base, Qt::red); QListViewItem::paintCell(p, g, column, width, align); } else { QListViewItem::paintCell(p, cg, column, width, align); } } /** * Opens or closes an item. * * @param o true to open */ void FileListItem::setOpen(bool o) { if (m_dirInfo) { setPixmap(0, o ? *folderOpenPixmap : *folderClosedPixmap); if (o && !childCount()) { listView()->setUpdatesEnabled(false); FileList::readSubDirectory(m_dirInfo, this, 0); listView()->setUpdatesEnabled(true); } updateIcons(); } QListViewItem::setOpen(o); } /** * Called before showing the item. */ void FileListItem::setup() { if (!m_file) { setExpandable(true); } QListViewItem::setup(); } #endif /** * Set tagged file. * The item takes ownership of this file and the old file is deleted. * * @param file tagged file. */ void FileListItem::setFile(TaggedFile* file) { if (m_file) { delete m_file; } m_file = file; if (m_file) { setText(0, m_file->getFilename()); } updateIcons(); } /** * Set directory information. * An item can represent a file (file is set) or * a directory (directory information is set). * The item takes ownership of this directory information * and the old information is deleted. * * @param dirInfo directory information */ void FileListItem::setDirInfo(DirInfo* dirInfo) { if (m_dirInfo) { delete m_dirInfo; } m_dirInfo = dirInfo; if (m_dirInfo) { QFileInfo fi(m_dirInfo->getDirname()); setText(0, fi.fileName()); setOpen(false); } } /** * Update the icons according to the modificaton state and the tags present. */ void FileListItem::updateIcons() { if (m_file) { if (m_file->isChanged()) { QCM_setIcon(0, *modifiedPixmap); } else { static const QPixmap* tagpm[] = { notagPixmap, v1Pixmap, v2Pixmap, v1v2Pixmap, nullPixmap }; int tagpmIdx; if (!m_file->isTagInformationRead()) { tagpmIdx = 4; } else { tagpmIdx = 0; if (m_file->hasTagV1()) { tagpmIdx |= 1; } if (m_file->hasTagV2()) { tagpmIdx |= 2; } } QCM_setIcon(0, *tagpm[tagpmIdx]); } #if QT_VERSION >= 0x040200 if (Kid3App::s_miscCfg.m_markTruncations && m_file->getTruncationFlags() != 0) { setBackground(0, Qt::red); } else { setBackground(0, Qt::NoBrush); } #elif QT_VERSION >= 0x040000 if (Kid3App::s_miscCfg.m_markTruncations && m_file->getTruncationFlags() != 0) { setBackgroundColor(0, Qt::red); } else { setBackgroundColor(0, QColor()); } #endif } } /** * Update the text according to the file name. */ void FileListItem::updateText() { if (m_file) { setText(0, m_file->getFilename()); } } /** * Set directory name. * Sets a new directory name if the item represents a directory. * * @param dirName new directory name */ void FileListItem::setDirName(const QString& dirName) { if (m_dirInfo) { m_dirInfo->setDirname(dirName); QFileInfo fi(dirName); setText(0, fi.fileName()); setOpen(false); } }