Ticket #603: gallery_removable_v2.diff

File gallery_removable_v2.diff, 31.4 KB (added by Aaron McCarthy <mccarthy.aaron@…>, 13 years ago)

Updated to apply cleanly to svn

  • mythgallery/mythgallery/galleryutil.h

     
    3434    static bool loadDirectory(ThumbList& itemList,
    3535                              const QString& dir, bool recurse,
    3636                              ThumbDict *itemDict, ThumbGenerator* thumbGen);
     37
     38    static QFileInfo copyFile(QFileInfo src, QFileInfo dest, bool move);
     39    static bool deleteFile(QFileInfo file);
     40    static QFileInfo copyDirectory(QFileInfo src, QFileInfo dest, bool move);
     41    static bool deleteDirectory(QFileInfo dir);
    3742};
    3843
    3944#endif /* EXIFUTIL_H */
  • mythgallery/mythgallery/iconview.cpp

     
    3131#include <mythtv/xmlparse.h>
    3232#include <mythtv/dialogbox.h>
    3333#include <mythtv/mythdbcon.h>
     34#include <mythtv/mythmediamonitor.h>
     35#include <mythtv/mythdialogs.h>
    3436
    3537#include "galleryutil.h"
    3638#include "gallerysettings.h"
     
    8486    return false;
    8587}
    8688
    87 IconView::IconView(const QString& galleryDir, MythMainWindow* parent,
    88                    const char* name )
     89IconView::IconView(const QString& galleryDir, MythMediaDevice *initialDevice,
     90                   MythMainWindow* parent, const char* name )
    8991    : MythDialog(parent, name)
    9092{
    9193    m_galleryDir = galleryDir;   
    9294
    9395    m_inMenu     = false;
     96    m_inSubMenu = false;
    9497    m_itemList.setAutoDelete(true);
    9598    m_itemDict.setAutoDelete(false);
    9699
     
    108111    m_lastCol = 0;
    109112    m_topRow  = 0;
    110113    m_isGallery  = false;
     114#ifndef _WIN32
     115    m_showDevices = false;
     116    m_currDevice = initialDevice;
     117#endif
    111118
    112119    srand(time(NULL));
    113     loadDirectory(galleryDir);
     120
     121#ifndef _WIN32
     122    if (m_currDevice)
     123    {
     124        if (!m_currDevice->isMounted(true))
     125            m_currDevice->mount();
     126
     127        connect(m_currDevice, SIGNAL(statusChanged(MediaStatus, MythMediaDevice*)),
     128                SLOT(mediaStatusChanged(MediaStatus, MythMediaDevice*)));
     129
     130        loadDirectory(m_currDevice->getMountPath());
     131    }
     132    else
     133#endif
     134        loadDirectory(galleryDir);
    114135}
    115136
    116137IconView::~IconView()
    117138{
    118     UIListBtnTypeItem* item = m_menuType->GetItemFirst();
    119     while (item) {
    120         Action *act = (Action*) item->getData();
    121         if (act)
    122             delete act;
    123         item = m_menuType->GetItemNext(item);
    124     }
    125    
     139    clearMenu(m_submenuType);
     140    clearMenu(m_menuType);
     141
    126142    delete m_thumbGen;
    127143    delete m_theme;
    128144}
     
    253269                                 item->pixmap->height()/2-bh2+sh,
    254270                                 bw-2*sw, bh-2*sh-(int)(15*hmult));
    255271
     272                if (m_itemMarked.contains(item->path))
     273                {
     274                    p.drawPixmap(xpos, ypos, m_MrkPix);
     275                }
     276
    256277            }
    257278            else {
    258279
     
    267288                                 item->pixmap->width()/2-bw2+sw,
    268289                                 item->pixmap->height()/2-bh2+sh,
    269290                                 bw-2*sw, bh-2*sh);
     291
     292                if (m_itemMarked.contains(item->path))
     293                {
     294                    p.drawPixmap(xpos, ypos, m_MrkPix);
     295                }
    270296            }
    271297           
    272298            curPos++;
     
    294320        QString action = actions[i];
    295321        if (action == "MENU") {
    296322            m_inMenu = !m_inMenu;
    297             m_menuType->SetActive(m_inMenu);
     323            m_menuType->SetActive(m_inMenu & !m_inSubMenu);
     324            m_submenuType->SetActive(m_inMenu & m_inSubMenu);
    298325            menuHandled = true;
    299326        }
    300327        else if (action == "UP") {
    301             if (m_inMenu) {
     328            if (m_inMenu & !m_inSubMenu) {
    302329                m_menuType->MoveUp();
    303330                menuHandled = true;
    304331            }
     332            else if (m_inMenu & m_inSubMenu) {
     333                m_submenuType->MoveUp();
     334                menuHandled = true;
     335            }
    305336            else
    306337                handled = moveUp();
    307338        }
    308339        else if (action == "DOWN") {
    309             if (m_inMenu) {
     340            if (m_inMenu & !m_inSubMenu) {
    310341                m_menuType->MoveDown();
    311342                menuHandled = true;
    312343            }
     344            else if (m_inMenu & m_inSubMenu) {
     345                m_submenuType->MoveDown();
     346                menuHandled = true;
     347            }
    313348            else
    314349                handled = moveDown();
    315350        }
     
    358393            actionDelete();
    359394            handled = true;
    360395        }
     396        else if (action == "MARK")
     397        {
     398            int pos = m_currRow * m_nCols + m_currCol;
     399            ThumbItem *item = m_itemList.at(pos);
     400            if (!item) {
     401                std::cerr << "The impossible happened" << std::endl;
     402                break;
     403            }
     404
     405            std::cout << "(un)marking " << item->path.ascii() << std::endl;
     406
     407            if (!m_itemMarked.contains(item->path))
     408                m_itemMarked.append(item->path);
     409            else
     410                m_itemMarked.remove(item->path);
     411
     412            handled = true;
     413        }
    361414        else if (action == "SELECT" || action == "PLAY" || action == "SLIDESHOW" || action == "RANDOMSHOW" )
    362415        {
    363416            if (m_inMenu && (action == "SELECT" || action == "PLAY") ) {
     
    373426                }
    374427       
    375428                QFileInfo fi(item->path);
     429#ifndef _WIN32
     430                // if the selected item is a mediaDevice attempt to mount it if it isn't already
     431                if (item->mediaDevice && (action == "SELECT" || action == "PLAY") )
     432                {
     433                    m_currDevice = item->mediaDevice;
     434
     435                    if (!m_currDevice->isMounted())
     436                        m_currDevice->mount();
     437
     438                    item->path = m_currDevice->getMountPath();
     439
     440                    connect(m_currDevice, SIGNAL(statusChanged(MediaStatus, MythMediaDevice*)),
     441                            SLOT(mediaStatusChanged(MediaStatus, MythMediaDevice*)));
     442                }
     443#endif
    376444                if (item->isDir && (action == "SELECT" || action == "PLAY") ) {
    377445                    loadDirectory(item->path);
    378446                    handled = true;
     
    421489        {
    422490            QString action = actions[i];
    423491            if (action == "ESCAPE") {
    424                 QDir d(m_currDir);
    425                 if (d != QDir(m_galleryDir)) {
     492#ifndef _WIN32
     493                if (m_showDevices)
     494                {
     495                    loadDirectory(m_galleryDir);
     496                    handled = true;
     497                }
     498                else
     499                {
     500#endif
     501                    QDir d(m_currDir);
     502#ifndef _WIN32
     503                    MediaMonitor *mon = MediaMonitor::getMediaMonitor();
     504                    if (mon)
     505                    {
     506                        QValueList <MythMediaDevice *> removables = mon->getMedias(MEDIATYPE_DATA);
     507                        QValueList <MythMediaDevice *>::Iterator it = removables.begin();
     508                        for (; it != removables.end(); it++)
     509                        {
     510                            if (d == QDir((*it)->getMountPath()))
     511                            {
     512                                actionShowDevices();
    426513
    427                     QString oldDirName = d.dirName();
    428                     d.cdUp();
    429                     loadDirectory(d.absPath());
     514                                // make sure previous devies is visible and selected
     515                                ThumbItem *item;
     516                                if ((*it)->getVolumeID() != "")
     517                                    item = m_itemDict.find((*it)->getVolumeID());
     518                                else
     519                                    item = m_itemDict.find((*it)->getDevicePath());
    430520
    431                     // make sure up-directory is visible and selected
    432                     ThumbItem* item = m_itemDict.find(oldDirName);
    433                     if (item) {
    434                         int pos = m_itemList.find(item);
    435                         if (pos != -1) {
    436                             m_currRow = pos/m_nCols;
    437                             m_currCol = pos-m_currRow*m_nCols;
    438                             m_topRow  = QMAX(0, m_currRow-(m_nRows-1));
     521                                if (item)
     522                                {
     523                                    int pos = m_itemList.find(item);
     524                                    if (pos != -1)
     525                                    {
     526                                        m_currRow = pos/m_nCols;
     527                                        m_currCol = pos-m_currRow*m_nCols;
     528                                        m_topRow = QMAX(0, m_currRow-(m_nRows-1));
     529                                    }
     530                                }
     531                                handled = true;
     532                                break;
     533                            }
    439534                        }
    440535                    }
    441                     handled = true;
     536                    if (!handled)
     537                    {
     538#endif
     539                        if (d != QDir(m_galleryDir)) {
     540
     541                            QString oldDirName = d.dirName();
     542                            d.cdUp();
     543                            loadDirectory(d.absPath());
     544
     545                            // make sure up-directory is visible and selected
     546                            ThumbItem* item = m_itemDict.find(oldDirName);
     547                            if (item) {
     548                                int pos = m_itemList.find(item);
     549                                if (pos != -1) {
     550                                    m_currRow = pos/m_nCols;
     551                                    m_currCol = pos-m_currRow*m_nCols;
     552                                    m_topRow  = QMAX(0, m_currRow-(m_nRows-1));
     553                                }
     554                            }
     555                            handled = true;
     556                        }
     557#ifndef _WIN32
     558                    }
    442559                }
     560#endif
    443561            }
    444562        }
    445563    }
     
    542660        exit(-1);
    543661    }
    544662
     663    m_submenuType = (UIListBtnType*)container->GetType("submenu");
     664    if (!m_menuType) {
     665        std::cerr << "MythGallery: Failed to get submenu area."
     666                  << std::endl;
     667        exit(-1);
     668    }
     669
    545670    // Menu Actions
    546671
    547672    UIListBtnTypeItem* item;
     
    549674    item->setData(new Action(&IconView::actionSlideShow));
    550675    item = new UIListBtnTypeItem(m_menuType, tr("Random"));
    551676    item->setData(new Action(&IconView::actionRandomShow));
    552     item = new UIListBtnTypeItem(m_menuType, tr("Rotate CW"));
    553     item->setData(new Action(&IconView::actionRotateCW));
    554     item = new UIListBtnTypeItem(m_menuType, tr("Rotate CCW"));
    555     item->setData(new Action(&IconView::actionRotateCCW));
     677    item = new UIListBtnTypeItem(m_menuType, tr("Meta Data..."));
     678    item->setData(new Action(&IconView::actionSubMenuMetadata));
     679    item = new UIListBtnTypeItem(m_menuType, tr("Marking..."));
     680    item->setData(new Action(&IconView::actionSubMenuMark));
     681    item = new UIListBtnTypeItem(m_menuType, tr("File..."));
     682    item->setData(new Action(&IconView::actionSubMenuFile));
    556683    item = new UIListBtnTypeItem(m_menuType, tr("Delete"));
    557684    item->setData(new Action(&IconView::actionDelete));
    558     item = new UIListBtnTypeItem(m_menuType, tr("Import"));
    559     item->setData(new Action(&IconView::actionImport));
    560685    item = new UIListBtnTypeItem(m_menuType, tr("Settings"));
    561686    item->setData(new Action(&IconView::actionSettings));
    562687   
     
    613738        m_folderSelPix = QPixmap(*img);
    614739        delete img;
    615740
     741        img = gContext->LoadScaleImage("gallery-mark.png");
     742        if (!img) {
     743            std::cerr << "Failed to load gallery-mark.png"
     744                      << std::endl;
     745            exit(-1);
     746        }
     747        m_MrkPix = QPixmap(*img);
     748        delete img;
     749
    616750        m_thumbW = m_backRegPix.width();
    617751        m_thumbH = m_backRegPix.height();
    618752        m_nCols  = m_viewRect.width()/m_thumbW - 1;
     
    629763    if (!d.exists())
    630764        return;
    631765
     766#ifndef _WIN32
     767    m_showDevices = false;
     768#endif
     769
    632770    m_currDir = d.absPath();
    633771    m_itemList.clear();
    634772    m_itemDict.clear();
     
    773911
    774912void IconView::pressMenu()
    775913{
    776     UIListBtnTypeItem* item = m_menuType->GetItemCurrent();
     914    UIListBtnTypeItem* item;
    777915
     916    if (m_inSubMenu)
     917        item = m_submenuType->GetItemCurrent();
     918    else
     919        item = m_menuType->GetItemCurrent();
     920
    778921    if (!item || !item->getData())
    779922        return;
    780923
    781924    Action *act = (Action*) item->getData();
    782925    (this->*(*act))();
     926
     927    m_menuType->SetActive(m_inMenu & !m_inSubMenu);
     928    m_submenuType->SetActive(m_inMenu & m_inSubMenu);
    783929}
    784930
     931void IconView::actionMainMenu()
     932{
     933    clearMenu(m_submenuType);
     934    m_submenuType->Reset();
     935
     936    m_inSubMenu = false;
     937}
     938
     939void IconView::actionSubMenuMetadata()
     940{
     941    clearMenu(m_submenuType);
     942    m_submenuType->Reset();
     943
     944    UIListBtnTypeItem *item;
     945    item = new UIListBtnTypeItem(m_submenuType, tr("Return"));
     946    item->setData(new Action(&IconView::actionMainMenu));
     947    item = new UIListBtnTypeItem(m_submenuType, tr("Rotate CW"));
     948    item->setData(new Action(&IconView::actionRotateCW));
     949    item = new UIListBtnTypeItem(m_submenuType, tr("Rotate CCW"));
     950    item->setData(new Action(&IconView::actionRotateCCW));
     951
     952    m_inSubMenu = true;
     953}
     954
     955void IconView::actionSubMenuMark()
     956{
     957    clearMenu(m_submenuType);
     958    m_submenuType->Reset();
     959
     960    UIListBtnTypeItem *item;
     961    item = new UIListBtnTypeItem(m_submenuType, tr("Return"));
     962    item->setData(new Action(&IconView::actionMainMenu));
     963    item = new UIListBtnTypeItem(m_submenuType, tr("Clear Marked"));
     964    item->setData(new Action(&IconView::actionClearMarked));
     965    item = new UIListBtnTypeItem(m_submenuType, tr("Select All"));
     966    item->setData(new Action(&IconView::actionSelectAll));
     967
     968    m_inSubMenu = true;
     969}
     970
     971void IconView::actionSubMenuFile()
     972{
     973    clearMenu(m_submenuType);
     974    m_submenuType->Reset();
     975
     976    UIListBtnTypeItem *item;
     977    item = new UIListBtnTypeItem(m_submenuType, tr("Return"));
     978    item->setData(new Action(&IconView::actionMainMenu));
     979#ifndef _WIN32
     980    item = new UIListBtnTypeItem(m_submenuType, tr("Show Devices"));
     981    item->setData(new Action(&IconView::actionShowDevices));
     982#endif
     983    item = new UIListBtnTypeItem(m_submenuType, tr("Import"));
     984    item->setData(new Action(&IconView::actionImport));
     985    item = new UIListBtnTypeItem(m_submenuType, tr("Copy here"));
     986    item->setData(new Action(&IconView::actionCopyHere));
     987    item = new UIListBtnTypeItem(m_submenuType, tr("Move here"));
     988    item->setData(new Action(&IconView::actionMoveHere));
     989    item = new UIListBtnTypeItem(m_submenuType, tr("Delete Marked"));
     990    item->setData(new Action(&IconView::actionDeleteMarked));
     991    item = new UIListBtnTypeItem(m_submenuType, tr("Create Dir"));
     992    item->setData(new Action(&IconView::actionMkDir));
     993
     994    m_inSubMenu = true;
     995}
     996
    785997void IconView::actionRotateCW()
    786998{
    787999    ThumbItem* item = m_itemList.at(m_currRow * m_nCols +
     
    9751187    }
    9761188}
    9771189
     1190#ifndef _WIN32
     1191void IconView::actionShowDevices()
     1192{
     1193    if (m_currDevice)
     1194    {
     1195        m_currDevice->disconnect(this);
     1196        m_currDevice = NULL;
     1197    }
     1198
     1199    m_showDevices = true;
     1200
     1201    m_itemList.clear();
     1202    m_itemDict.clear();
     1203
     1204    m_thumbGen->cancel();
     1205
     1206    /* add gallery directory */
     1207    ThumbItem *item = new ThumbItem;
     1208    item->name = QString("Gallery");
     1209    item->path = m_galleryDir;
     1210    item->isDir = true;
     1211    m_itemList.append(item);
     1212    m_itemDict.insert(item->name, item);
     1213
     1214    MediaMonitor *mon = MediaMonitor::getMediaMonitor();
     1215    if (mon)
     1216    {
     1217        QValueList <MythMediaDevice *> removables = mon->getMedias(MEDIATYPE_DATA);
     1218        QValueList <MythMediaDevice *>::Iterator it = removables.begin();
     1219        for (; it != removables.end(); it++)
     1220        {
     1221            item = new ThumbItem;
     1222            if ((*it)->getVolumeID() != "")
     1223                item->name = (*it)->getVolumeID();
     1224            else
     1225                item->name = (*it)->getDevicePath();
     1226            item->path = (*it)->getMountPath();
     1227            item->isDir = true;
     1228            item->mediaDevice = *it;
     1229            m_itemList.append(item);
     1230            m_itemDict.insert(item->name, item);
     1231        }
     1232    }
     1233
     1234    m_lastRow = QMAX((int)ceilf((float)m_itemList.count()/(float)m_nCols)-1,0);
     1235    m_lastCol = QMAX(m_itemList.count()-m_lastRow*m_nCols-1,0);
     1236}
     1237#endif
     1238
     1239void IconView::actionCopyHere()
     1240{
     1241    copyMarkedFiles(false);
     1242}
     1243
     1244void IconView::actionMoveHere()
     1245{
     1246    copyMarkedFiles(true);
     1247}
     1248
     1249void IconView::actionDeleteMarked()
     1250{
     1251    std::cerr << "deleting marked files\n";
     1252
     1253    bool cont = MythPopupBox::showOkCancelPopup(gContext->GetMainWindow(), tr("Delete Marked Files"),
     1254                                                QString(tr("Deleting %1 images and folders"))
     1255                                                .arg(m_itemMarked.count()), false);
     1256
     1257    if (cont)
     1258    {
     1259        QStringList::iterator it;
     1260        QFileInfo fi;
     1261
     1262        for (it = m_itemMarked.begin(); it != m_itemMarked.end(); it++)
     1263        {
     1264            fi.setFile(*it);
     1265
     1266            std::cerr << "fi = " << fi.absFilePath() << endl;
     1267
     1268            if (fi.exists())
     1269            {
     1270                if (fi.isDir())
     1271                {
     1272                    GalleryUtil::deleteDirectory(fi);
     1273                    std::cerr << "deleting directory " << fi.absFilePath().local8Bit() << endl;
     1274                }
     1275                else
     1276                {
     1277                    GalleryUtil::deleteFile(fi);
     1278                    std::cerr << "deleting file " << fi.absFilePath().local8Bit() << endl;
     1279                }
     1280            }
     1281        }
     1282
     1283        m_itemMarked.clear();
     1284
     1285        loadDirectory(m_currDir);
     1286    }
     1287}
     1288
     1289void IconView::actionClearMarked()
     1290{
     1291    m_itemMarked.clear();
     1292}
     1293
     1294void IconView::actionSelectAll()
     1295{
     1296    ThumbItem *item;
     1297    for (item = m_itemList.first(); item; item = m_itemList.next())
     1298    {
     1299        if (!m_itemMarked.contains(item->path))
     1300            m_itemMarked.append(item->path);
     1301    }
     1302}
     1303
     1304void IconView::actionMkDir()
     1305{
     1306    QString folderName = tr("New Folder");
     1307
     1308    bool res = MythPopupBox::showGetTextPopup(gContext->GetMainWindow(), tr("Create New Folder"),
     1309                                              tr("Create New Folder"), folderName);
     1310
     1311    if (res)
     1312    {
     1313        QDir cdir(m_currDir);
     1314        cdir.mkdir(folderName);
     1315
     1316        loadDirectory(m_currDir);
     1317    }
     1318}
     1319
    9781320void IconView::importFromDir(const QString &fromDir, const QString &toDir)
    9791321{
    9801322    QDir d(fromDir);
     
    10141356        }
    10151357    }
    10161358}
     1359
     1360void IconView::copyMarkedFiles(bool move)
     1361{
     1362    QStringList::iterator it;
     1363    QFileInfo fi;
     1364    QFileInfo dest;
     1365
     1366    for (it = m_itemMarked.begin(); it != m_itemMarked.end(); it++)
     1367    {
     1368        fi.setFile(*it);
     1369        dest.setFile(QDir(m_currDir), fi.fileName());
     1370
     1371        if (fi.exists())
     1372        {
     1373            if (fi.isDir())
     1374                dest = GalleryUtil::copyDirectory(fi, dest, move);
     1375            else
     1376                dest = GalleryUtil::copyFile(fi, dest, move);
     1377
     1378            *it = dest.absFilePath();
     1379        }
     1380    }
     1381
     1382    loadDirectory(m_currDir);
     1383}
     1384
     1385void IconView::clearMenu(UIListBtnType *menu)
     1386{
     1387    UIListBtnTypeItem* item = menu->GetItemFirst();
     1388    while (item)
     1389    {
     1390        Action *act = (Action*) item->getData();
     1391        if (act)
     1392            delete act;
     1393        item = menu->GetItemNext(item);
     1394    }
     1395}
     1396
     1397void IconView::mediaStatusChanged( MediaStatus oldStatus, MythMediaDevice* pMedia)
     1398{
     1399    if (m_currDevice == pMedia)
     1400    {
     1401        actionShowDevices();
     1402
     1403        m_currRow = 0;
     1404        m_currCol = 0;
     1405
     1406        updateView();
     1407        updateText();
     1408    }
     1409}
  • mythgallery/mythgallery/main.cpp

     
    1414#include <mythtv/mythdialogs.h>
    1515#include <mythtv/mythplugin.h>
    1616#include <mythtv/dialogbox.h>
     17#include <mythtv/mythmedia.h>
    1718
    1819extern "C" {
    1920int mythplugin_init(const char *libversion);
     
    3334        diag.exec();
    3435    }
    3536    else {
    36         IconView icv(startdir, gContext->GetMainWindow(), "IconView");
     37        IconView icv(startdir, NULL, gContext->GetMainWindow(), "IconView");
    3738        icv.exec();
    3839    }
    3940}
    4041
     42void handleMedia(MythMediaDevice *dev)
     43{
     44    QString galleryDir = gContext->GetSetting("GalleryDir");
     45    QDir dir(galleryDir);
     46    if (!dir.exists() || !dir.isReadable()) {
     47        DialogBox diag(gContext->GetMainWindow(),
     48                       QObject::tr("Gallery Directory does not exist"
     49                                   " or is unreadable."));
     50        diag.AddButton(QObject::tr("Ok"));
     51        diag.exec();
     52    }
     53    else {
     54        IconView icv(galleryDir, dev, gContext->GetMainWindow(), "IconView");
     55        icv.exec();
     56    }
     57}
     58
    4159void setupKeys(void)
    4260{
    4361    REG_JUMP("MythGallery", "Image viewer / slideshow", "", runGallery);
     
    6684            "PgDown");
    6785    REG_KEY("Gallery", "INFO", "Toggle Showing Information about Image", "I");
    6886    REG_KEY("Gallery", "DELETE", "Delete current image", "D");
     87    REG_KEY("Gallery", "MARK", "Mark image", "T");
     88
     89    REG_MEDIA_HANDLER("MythGallery Media Handler", "", "", handleMedia, MEDIATYPE_DATA | MEDIATYPE_MIXED);
    6990}
    7091
    7192int mythplugin_init(const char *libversion)
  • mythgallery/mythgallery/thumbgenerator.cpp

     
    308308
    309309QString ThumbGenerator::getThumbcacheDir(const QString& inDir)
    310310{
     311    QString galleryDir = gContext->GetSetting("GalleryDir");
     312
    311313    // For directory "/my/images/january", this function either returns
    312314    // "/my/images/january/.thumbcache" or "~/.mythtv/mythgallery/january/.thumbcache"
    313315    QString aPath = inDir + QString("/.thumbcache/");
    314316    if ( gContext->GetNumSetting("GalleryThumbnailLocation")
    315             && ! QDir(aPath).exists() )
     317            && ! QDir(aPath).exists() && inDir.startsWith(galleryDir))
    316318    {
    317319        mkpath(aPath);
    318320    }
    319     if ( ! gContext->GetNumSetting("GalleryThumbnailLocation") || ! QDir(aPath).exists() )
     321    if ( ! gContext->GetNumSetting("GalleryThumbnailLocation") || ! QDir(aPath).exists() || ! inDir.startsWith(galleryDir))
    320322    {
    321323        // Arrive here if storing thumbs in home dir,
    322324        // OR failed to create thumb dir in gallery pics location
  • mythgallery/mythgallery/iconview.h

     
    2626#include <qpixmap.h>
    2727
    2828#include <mythtv/mythdialogs.h>
     29#include <mythtv/mythmedia.h>
    2930
    3031class XMLParse;
    3132class UIListBtnType;
     
    4243        caption= "";
    4344        path   = "";
    4445        isDir  = false;
     46        mediaDevice = NULL;
    4547    }
    4648
    4749    ~ThumbItem() {
     
    5860    QString  caption;
    5961    QString  path;
    6062    bool     isDir;
     63    MythMediaDevice *mediaDevice;
    6164};
    6265
    6366typedef QPtrList<ThumbItem> ThumbList;
     
    6972
    7073public:
    7174
    72     IconView(const QString& galleryDir, MythMainWindow* parent,
    73              const char* name = 0);
     75    IconView(const QString& galleryDir, MythMediaDevice *initialDevice,
     76             MythMainWindow* parent, const char* name = 0);
    7477    ~IconView();
    7578
    7679protected:
     
    9396    bool moveLeft();
    9497    bool moveRight();
    9598
     99    void actionMainMenu();
     100    void actionSubMenuMetadata();
     101    void actionSubMenuMark();
     102    void actionSubMenuFile();
     103
    96104    void actionRotateCW();
    97105    void actionRotateCCW();
    98106    void actionDelete();
     
    100108    void actionRandomShow();
    101109    void actionSettings();
    102110    void actionImport();
     111#ifndef _WIN32
     112    void actionShowDevices();
     113#endif
     114    void actionCopyHere();
     115    void actionMoveHere();
     116    void actionDeleteMarked();
     117    void actionClearMarked();
     118    void actionSelectAll();
     119    void actionMkDir();
    103120
     121
    104122    void pressMenu();
    105123
    106124    void loadThumbnail(ThumbItem *item);
    107125    void importFromDir(const QString &fromDir, const QString &toDir);
     126    void copyMarkedFiles(bool move = false);
     127
     128    void clearMenu(UIListBtnType *menu);
    108129   
    109130    QPtrList<ThumbItem> m_itemList;
    110131    QDict<ThumbItem>    m_itemDict;
     132    QStringList         m_itemMarked;
    111133    QString             m_galleryDir;
    112134
    113135    XMLParse           *m_theme;
     
    116138    QRect               m_viewRect;
    117139
    118140    bool                m_inMenu;
     141    bool                m_inSubMenu;
    119142    UIListBtnType      *m_menuType;
     143    UIListBtnType      *m_submenuType;
    120144   
    121145    QPixmap             m_backRegPix;
    122146    QPixmap             m_backSelPix;
    123147    QPixmap             m_folderRegPix;
    124148    QPixmap             m_folderSelPix;
     149    QPixmap             m_MrkPix;
    125150
    126151    QString             m_currDir;
    127152    bool                m_isGallery;
     153#ifndef _WIN32
     154    bool                m_showDevices;
     155    MythMediaDevice    *m_currDevice;
     156#endif
    128157
    129158    int                 m_currRow;
    130159    int                 m_currCol;
     
    143172    int                 m_showcaption;
    144173
    145174    typedef void (IconView::*Action)();
     175
     176#ifndef _WIN32
     177public slots:
     178    void mediaStatusChanged( MediaStatus oldStatus, MythMediaDevice* pMedia);
     179#endif
    146180};
    147181
    148182
  • mythgallery/mythgallery/gallery-ui.xml

     
    2121    </font>
    2222
    2323    <container name="menu">
    24       <area>20,20,140,240</area>
     24      <area>20,20,140,500</area>
    2525
    2626      <listbtnarea name="menu" draworder="0">
    2727        <area>0,0,140,240</area>
     
    3535        <showscrollarrows>no</showscrollarrows>
    3636      </listbtnarea>
    3737
     38      <listbtnarea name="submenu" draworder="0">
     39        <area>0,260,140,240</area>
     40        <gradient type="unselected" start="#000000" end="#505050" alpha="100">
     41        </gradient>
     42        <gradient type="selected" start="#52CA38" end="#349838" alpha="255">
     43        </gradient>
     44        <fcnfont name="active" function="active"></fcnfont>
     45        <fcnfont name="inactive" function="inactive"></fcnfont>
     46        <showarrow>no</showarrow>
     47        <showscrollarrows>no</showscrollarrows>
     48      </listbtnarea>
     49
    3850    </container>
    3951
    4052    <container name="text">
  • mythgallery/mythgallery/galleryutil.cpp

     
    2020#include <qfileinfo.h>
    2121#include <qdir.h>
    2222
     23#include <mythtv/mythdbcon.h>
     24#include <mythtv/util.h>
     25
    2326#include "config.h"
    2427#include "constants.h"
    2528#include "galleryutil.h"
     
    263266
    264267    return caption;
    265268}
     269
     270QFileInfo GalleryUtil::copyFile(QFileInfo src, QFileInfo dest, bool move)
     271{
     272    QFileInfo newDest = dest;
     273
     274    // test if dest exists
     275    int i = 0;
     276    while (newDest.exists())
     277    {
     278        std::cerr << "need to find a new name for " << dest.absFilePath().local8Bit() << " trying ";
     279        newDest.setFile(dest.dir(), dest.baseName() + "_" + QString::number(i) + "." + dest.extension());
     280        std::cerr << newDest.absFilePath().local8Bit() << endl;
     281        i++;
     282    }
     283
     284    MSqlQuery query(MSqlQuery::InitCon());
     285    QString cmd;
     286    if (move)
     287    {
     288        std::cerr << "moving " << src.absFilePath().local8Bit();
     289        cmd = "mv ";
     290        query.prepare("UPDATE gallerymetadata SET image = :IMAGENEW "
     291                      "WHERE image = :IMAGEOLD ;");
     292    }
     293    else
     294    {
     295        std::cerr << "copying " << src.absFilePath().local8Bit();
     296        cmd = "cp ";
     297        query.prepare("INSERT INTO gallerymetadata (image, keywords, angle) "
     298                      "SELECT :IMAGENEW , keywords, angle "
     299                      "FROM gallerymetadata "
     300                      "WHERE image = :IMAGEOLD ;");
     301    }
     302    std::cerr << " to " << newDest.absFilePath().local8Bit() << endl;
     303
     304    cmd += "\"" + src.absFilePath().local8Bit() + "\" \"" + newDest.absFilePath().local8Bit() + "\"";
     305    myth_system(cmd);
     306
     307    /* update metadata table */
     308    query.bindValue(":IMAGENEW", newDest.absFilePath().utf8());
     309    query.bindValue(":IMAGEOLD", src.absFilePath().utf8());
     310    query.exec();
     311
     312    return newDest;
     313}
     314
     315bool GalleryUtil::deleteFile(QFileInfo file)
     316{
     317    QString cmd = "rm \"" + file.absFilePath().local8Bit() + "\"";
     318    myth_system(cmd);
     319
     320    MSqlQuery query(MSqlQuery::InitCon());
     321    query.prepare("DELETE FROM gallerymetadata "
     322                  "WHERE image = :IMAGE ;");
     323    query.bindValue(":IMAGE", file.absFilePath().utf8());
     324    query.exec();
     325
     326    return true;
     327}
     328
     329QFileInfo GalleryUtil::copyDirectory(QFileInfo src, QFileInfo dest, bool move)
     330{
     331    QFileInfo newDest = dest;
     332
     333    QDir srcDir(src.absFilePath());
     334    srcDir.setNameFilter(MEDIA_FILENAMES);
     335    srcDir.setSorting(QDir::Name | QDir::DirsFirst | QDir::IgnoreCase);
     336    srcDir.setMatchAllDirs(true);
     337
     338    /* test if dest exists and is a directory */
     339    int i = 0;
     340    while (newDest.exists() && !newDest.isDir())
     341    {
     342        std::cerr << "file exists, but we want dir for " << newDest.absFilePath().local8Bit();
     343        newDest.setFile(dest.absFilePath() + "_" + QString::number(i));
     344        std::cerr << " trying " << newDest.absFilePath().local8Bit() << endl;
     345        i++;
     346    }
     347
     348    if (!newDest.exists())
     349    {
     350        std::cerr << "creating directory " << newDest.absFilePath().local8Bit() << endl;
     351
     352        srcDir.mkdir(newDest.absFilePath());
     353        newDest.refresh();
     354    }
     355
     356    if (newDest.exists() && newDest.isDir())
     357    {
     358        QDir dstDir(newDest.absFilePath());
     359
     360        const QFileInfoList *list = srcDir.entryInfoList();
     361
     362        QFileInfoListIterator it(*list);
     363        QFileInfo *fi;
     364        QFileInfo dfi;
     365
     366        while ((fi = it.current()) != 0)
     367        {
     368            ++it;
     369            if (fi->fileName() == "." || fi->fileName() == "..")
     370                continue;
     371
     372            dfi.setFile(dstDir, fi->fileName());
     373
     374            std::cerr << "source is " << fi->absFilePath().local8Bit() << endl;
     375            std::cerr << "destin is " << dfi.absFilePath().local8Bit() << endl;
     376
     377            if (fi->isDir())
     378                dfi = copyDirectory(*fi, dfi, move);
     379            else
     380                dfi = copyFile(*fi, dfi, move);
     381        }
     382
     383        if (move)
     384            srcDir.rmdir(src.absFilePath());
     385    }
     386
     387    return newDest;
     388}
     389
     390bool GalleryUtil::deleteDirectory(QFileInfo dir)
     391{
     392    QDir srcDir(dir.absFilePath());
     393    srcDir.setNameFilter(MEDIA_FILENAMES);
     394    srcDir.setSorting(QDir::Name | QDir::DirsFirst | QDir::IgnoreCase);
     395    srcDir.setMatchAllDirs(true);
     396
     397    if (srcDir.exists())
     398    {
     399        const QFileInfoList *list = srcDir.entryInfoList();
     400
     401        QFileInfoListIterator it(*list);
     402        QFileInfo *fi;
     403
     404        while ((fi = it.current()) != 0)
     405        {
     406            ++it;
     407            if (fi->fileName() == "." || fi->fileName() == "..")
     408                continue;
     409
     410            if (fi->isDir())
     411                deleteDirectory(*fi);
     412            else
     413                deleteFile(*fi);
     414        }
     415    }
     416
     417    // delete .thumbcache
     418    QString cmd = "rm -rf \"" + srcDir.absPath().local8Bit() + "/.thumbcache\"";
     419    myth_system(cmd);
     420
     421    srcDir.rmdir(srcDir.absPath());
     422
     423    return true;
     424}