# # # patch "res/guitone.qrc" # from [62342ad04bd984fa2c0afa866b86f312509dee14] # to [7659620548e011928a39d80b3d1e8088a0a7cb9f] # # patch "src/model/IconProvider.cpp" # from [d592eab5935e4e3c310d07276bdd34aae44d99ee] # to [3672a30d7f27afdad5361809ab67d09d7350e7cb] # # patch "src/model/IconProvider.h" # from [514ff91ca3015e2285555dd3decf0e42207cad5e] # to [107e25867b3c2f41cca16469b8de3d669f096966] # # patch "src/model/WorkspaceItem.cpp" # from [4d13f4a1c882172f952c01326960bcf8e1ccc991] # to [ffac4afb4b7e9163bebb4bc51d0a10c5accc878b] # # patch "src/model/WorkspaceItem.h" # from [7fea1ba5b24232318f23a53afc74d387e45205b0] # to [7cb74cc1ba628fc44af9bf601d99ac238bd67ed6] # # patch "src/stable.h" # from [156b68c2371359c998ada42cee2aa33d68046132] # to [2e0f2e1a3953c8322726b86377b7902fe9263313] # ============================================================ --- res/guitone.qrc 62342ad04bd984fa2c0afa866b86f312509dee14 +++ res/guitone.qrc 7659620548e011928a39d80b3d1e8088a0a7cb9f @@ -1,5 +1,25 @@ - monkey_on_16x16.png + overlays/added_missing.png + overlays/added.png + overlays/dropped_added_missing.png + overlays/dropped_added.png + overlays/dropped.png + overlays/dropped_rename_target_missing.png + overlays/dropped_rename_target.png + overlays/dropped_unknown.png + overlays/ignored.png + overlays/missing.png + overlays/patched.png + overlays/rename_source_added_missing.png + overlays/rename_source_added.png + overlays/rename_source.png + overlays/rename_source_target_missing.png + overlays/rename_source_target.png + overlays/rename_source_unknown.png + overlays/rename_target_missing.png + overlays/rename_target.png + overlays/unchanged.png + overlays/unknown.png ============================================================ --- src/model/IconProvider.cpp d592eab5935e4e3c310d07276bdd34aae44d99ee +++ src/model/IconProvider.cpp 3672a30d7f27afdad5361809ab67d09d7350e7cb @@ -22,60 +22,211 @@ #include "IconProvider.h" #include "WorkspaceItem.h" +/** + * There are 45 possible status combinations, some of them are invalid + * We only provide for a bunch of these own icons + * (more info: http://venge.net/monotone/docs/Automation.html#Automation) + * + * Basic codes + * ----------- + * + * M 0 0 missing + * AP 0 0 added + * D 0 0 dropped + * R 1 0 renamed-from-this + * R 0 1 renamed-to-this + * P 0 0 patched + * 0 0 unchanged + * U 0 0 unknown + * I 0 0 ignored + * + * Combinations and used icons + * --------------------------- + * + * In general, we don't show the "patched" state if there is another + * state up to the item (added, renamed, etc.) + * + * ' ': unchanged.png + * ' P': patched.png + * ' U': unknown.png + * ' I': ignored.png + * ' M': missing.png + * + * ' A ': added.png (invalid) + * ' AP': added.png + * ' AU': added.png (invalid) + * ' AI': added.png (invalid?) + * ' AM': added_missing.png + * + * ' R ': rename_target.png + * ' RP': rename_target.png + * ' RU': rename_target.png (invalid) + * ' RI': rename_target.png (invalid?) + * ' RM': rename_target_missing.png + * + * 'D ': dropped.png + * 'D P': dropped.png (invalid) + * 'D U': dropped_unknown.png + * 'D I': dropped.png (invalid?) + * 'D M': dropped.png (invalid) + * + * 'DA ': dropped_added.png (invalid) + * 'DAP': dropped_added.png + * 'DAU': dropped_added.png (invalid) + * 'DAI': dropped_added.png (invalid?) + * 'DAM': dropped_added_missing.png + * + * 'DR ': dropped_rename_target.png + * 'DRP': dropped_rename_target.png + * 'DRU': dropped_rename_target.png (invalid) + * 'DRI': dropped_rename_target.png (invalid) + * 'DRM': dropped_rename_target_missing.png + * + * 'R ': rename_source.png + * 'R P': rename_source.png (invalid) + * 'R U': rename_source_unknown.png + * 'R I': rename_source_unknown.png (invalid?) + * 'R M': rename_source_unknown.png (invalid) + * + * 'RA ': rename_source_added.png (invalid) + * 'RAP': rename_source_added.png + * 'RAU': rename_source_added_missing.png (invalid) + * 'RAI': rename_source_added_missing.png (invalid?) + * 'RAM': rename_source_added_missing.png + * + * 'RR ': rename_source_target.png + * 'RRP': rename_source_target.png + * 'RRU': rename_source_target_missing.png (invalid) + * 'RRI': rename_source_target_missing.png (invalid?) + * 'RRM': rename_source_target_missing.png + */ + IconProvider::IconProvider(void) { - iconDirUnchanged = new QIcon(); - iconDirChanged = new QIcon(); - iconDirUnknown = new QIcon(); - iconDirIgnored = new QIcon(); - iconFileNormal = new QIcon(); - QStyle *style = QApplication::style(); - iconDirUnchanged->addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon)); - iconDirUnchanged->addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Active, QIcon::On); - iconDirChanged->addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon)); - iconDirChanged->addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Active, QIcon::On); - iconDirUnknown->addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon)); - iconDirUnknown->addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Active, QIcon::On); - iconDirIgnored->addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon)); - iconDirIgnored->addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Active, QIcon::On); + QStyle *style = QApplication::style(); + + // + // default icons if no state matches + // + fileIcons[0] = QIcon(style->standardPixmap(QStyle::SP_FileIcon)); + + folderIcons[0] = QIcon(style->standardPixmap(QStyle::SP_DirClosedIcon)); + folderIcons[0].addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Active, QIcon::On); + + // + // assign possible item states to the appropriate overlay + // we currently have 21 icons for roughly 45 states + // + QMap states; + states[WorkspaceItem::Unchanged] = QString(":/overlays/unchanged.png"); + states[WorkspaceItem::Patched] = QString(":/overlays/patched.png"); + states[WorkspaceItem::Unknown] = QString(":/overlays/unknown.png"); + states[WorkspaceItem::Ignored] = QString(":/overlays/ignored.png"); + states[WorkspaceItem::Missing] = QString(":/overlays/missing.png"); + + states[WorkspaceItem::Added|WorkspaceItem::Unchanged] = QString(":/overlays/added.png"); + states[WorkspaceItem::Added|WorkspaceItem::Patched] = QString(":/overlays/added.png"); + states[WorkspaceItem::Added|WorkspaceItem::Unknown] = QString(":/overlays/added.png"); + states[WorkspaceItem::Added|WorkspaceItem::Ignored] = QString(":/overlays/added.png"); + states[WorkspaceItem::Added|WorkspaceItem::Missing] = QString(":/overlays/added_missing.png"); + + states[WorkspaceItem::RenamedTo|WorkspaceItem::Unchanged] = QString(":/overlays/rename_target.png"); + states[WorkspaceItem::RenamedTo|WorkspaceItem::Patched] = QString(":/overlays/rename_target.png"); + states[WorkspaceItem::RenamedTo|WorkspaceItem::Unknown] = QString(":/overlays/rename_target.png"); + states[WorkspaceItem::RenamedTo|WorkspaceItem::Ignored] = QString(":/overlays/rename_target.png"); + states[WorkspaceItem::RenamedTo|WorkspaceItem::Missing] = QString(":/overlays/rename_target_missing.png"); + + states[WorkspaceItem::Dropped|WorkspaceItem::Unchanged] = QString(":/overlays/dropped.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Patched] = QString(":/overlays/dropped.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Unknown] = QString(":/overlays/dropped_unknown.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Ignored] = QString(":/overlays/dropped.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Missing] = QString(":/overlays/dropped.png"); - iconFileNormal->addPixmap(style->standardPixmap(QStyle::SP_FileIcon)); -} + states[WorkspaceItem::Dropped|WorkspaceItem::Added|WorkspaceItem::Unchanged] = QString(":/overlays/dropped_added.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Added|WorkspaceItem::Patched] = QString(":/overlays/dropped_added.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Added|WorkspaceItem::Unknown] = QString(":/overlays/dropped_added.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Added|WorkspaceItem::Ignored] = QString(":/overlays/dropped_added.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::Added|WorkspaceItem::Missing] = QString(":/overlays/dropped_added_missing.png"); -IconProvider::~IconProvider(void) -{ - delete iconDirUnchanged; - delete iconDirChanged; - delete iconDirUnknown; - delete iconDirIgnored; - delete iconFileNormal; + states[WorkspaceItem::Dropped|WorkspaceItem::RenamedTo|WorkspaceItem::Unchanged] = QString(":/overlays/dropped_rename_target.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::RenamedTo|WorkspaceItem::Patched] = QString(":/overlays/dropped_rename_target.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::RenamedTo|WorkspaceItem::Unknown] = QString(":/overlays/dropped_rename_target.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::RenamedTo|WorkspaceItem::Ignored] = QString(":/overlays/dropped_rename_target.png"); + states[WorkspaceItem::Dropped|WorkspaceItem::RenamedTo|WorkspaceItem::Missing] = QString(":/overlays/dropped_rename_target_missing.png"); + + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Unchanged] = QString(":/overlays/rename_source.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Patched] = QString(":/overlays/rename_source.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Unknown] = QString(":/overlays/rename_source_unknown.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Ignored] = QString(":/overlays/rename_source_unknown.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Missing] = QString(":/overlays/rename_source_unknown.png"); + + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Added|WorkspaceItem::Unchanged] = QString(":/overlays/rename_source_added.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Added|WorkspaceItem::Patched] = QString(":/overlays/rename_source_added.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Added|WorkspaceItem::Unknown] = QString(":/overlays/rename_source_added_missing.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Added|WorkspaceItem::Ignored] = QString(":/overlays/rename_source_added_missing.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::Added|WorkspaceItem::Missing] = QString(":/overlays/rename_source_added_missing.png"); + + states[WorkspaceItem::RenamedFrom|WorkspaceItem::RenamedTo|WorkspaceItem::Unchanged] = QString(":/overlays/rename_source_target.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::RenamedTo|WorkspaceItem::Patched] = QString(":/overlays/rename_source_target.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::RenamedTo|WorkspaceItem::Unknown] = QString(":/overlays/rename_source_target_missing.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::RenamedTo|WorkspaceItem::Ignored] = QString(":/overlays/rename_source_target_missing.png"); + states[WorkspaceItem::RenamedFrom|WorkspaceItem::RenamedTo|WorkspaceItem::Missing] = QString(":/overlays/rename_source_target_missing.png"); + + + QMapIterator i(states); + + while (i.hasNext()) + { + i.next(); + int state = i.key(); + QImage overlay(i.value()); + overlay.createAlphaMask(); + + // the basic icons have to be recreated for each state + // since we later paint on them + QImage fileImage(style->standardPixmap(QStyle::SP_FileIcon).toImage()); + QImage folderImageClosed(style->standardPixmap(QStyle::SP_DirClosedIcon).toImage()); + QImage folderImageOpened(style->standardPixmap(QStyle::SP_DirOpenIcon).toImage()); + + // file icon + QPainter filePainter(&fileImage); + filePainter.drawImage(0, 0, overlay); + filePainter.end(); + fileIcons[state] = QIcon(QPixmap::fromImage(fileImage)); + + // folder icon + QPainter folderPainter1(&folderImageClosed); + folderPainter1.drawImage(0, 0, overlay); + folderPainter1.end(); + QPainter folderPainter2(&folderImageOpened); + folderPainter2.drawImage(0, 0, overlay); + folderPainter2.end(); + + folderIcons[state] = QIcon(QPixmap::fromImage(folderImageClosed)); + folderIcons[state].addPixmap(QPixmap::fromImage(folderImageOpened), QIcon::Active, QIcon::On); + } } +IconProvider::~IconProvider(void) {} + QIcon IconProvider::getIcon(WorkspaceItem* item) { - if(item->isDirectory()) + int status = item->getStatus(); + + if (item->isDirectory()) { - if(item->hasStatus(WorkspaceItem::Unchanged)) - { - return *iconDirUnchanged; - } - else if(item->hasStatus(WorkspaceItem::Patched)) - { - return *iconDirChanged; - } - else if(item->hasStatus(WorkspaceItem::Unknown)) - { - return *iconDirUnknown; - } - else if(item->hasStatus(WorkspaceItem::Ignored)) + if (folderIcons.contains(status)) { - return *iconDirIgnored; + return folderIcons.value(status); } - // TODO: missing icon states: renamed from/to, added, dropped - return *iconDirUnknown; - } - - - // TODO: icon states of files... - return *iconFileNormal; + // default icon + return folderIcons.value(0); + } + + if (fileIcons.contains(status)) + { + return fileIcons.value(status); + } + // default icon + return fileIcons.value(0); } ============================================================ --- src/model/IconProvider.h 514ff91ca3015e2285555dd3decf0e42207cad5e +++ src/model/IconProvider.h 107e25867b3c2f41cca16469b8de3d669f096966 @@ -22,7 +22,6 @@ #define ICONPROVIDER_H class WorkspaceItem; -class QIcon; class IconProvider { @@ -32,11 +31,10 @@ QIcon getIcon(WorkspaceItem* item); private: - QIcon *iconDirUnchanged; - QIcon *iconDirChanged; - QIcon *iconDirUnknown; - QIcon *iconDirIgnored; - QIcon *iconFileNormal; + // file and folder icons + // (maybe we manage it to even include normal file icons here once?!) + QMap fileIcons; + QMap folderIcons; }; #endif ============================================================ --- src/model/WorkspaceItem.cpp 4d13f4a1c882172f952c01326960bcf8e1ccc991 +++ src/model/WorkspaceItem.cpp ffac4afb4b7e9163bebb4bc51d0a10c5accc878b @@ -20,6 +20,16 @@ #include "WorkspaceItem.h" +const int WorkspaceItem::RenamedFrom = 1; +const int WorkspaceItem::RenamedTo = 2; +const int WorkspaceItem::Added = 4; +const int WorkspaceItem::Dropped = 8; +const int WorkspaceItem::Missing = 16; +const int WorkspaceItem::Patched = 32; +const int WorkspaceItem::Unchanged = 64; +const int WorkspaceItem::Unknown = 128; +const int WorkspaceItem::Ignored = 256; + WorkspaceItem::WorkspaceItem() { parentItem = this; ============================================================ --- src/model/WorkspaceItem.h 7fea1ba5b24232318f23a53afc74d387e45205b0 +++ src/model/WorkspaceItem.h 7cb74cc1ba628fc44af9bf601d99ac238bd67ed6 @@ -60,15 +60,15 @@ QVariant data(int, int) const; - static const int RenamedFrom = 1; - static const int RenamedTo = 2; - static const int Added = 4; - static const int Dropped = 8; - static const int Missing = 16; - static const int Patched = 32; - static const int Unchanged = 64; - static const int Unknown = 128; - static const int Ignored = 256; + static const int RenamedFrom; + static const int RenamedTo; + static const int Added; + static const int Dropped; + static const int Missing; + static const int Patched; + static const int Unchanged; + static const int Unknown; + static const int Ignored; private: WorkspaceItem *renamed_from; ============================================================ --- src/stable.h 156b68c2371359c998ada42cee2aa33d68046132 +++ src/stable.h 2e0f2e1a3953c8322726b86377b7902fe9263313 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -45,7 +46,4 @@ #include #include -// Other lib includes -#include - #endif