Ticket #603: gallery_removable_v2.diff
File gallery_removable_v2.diff, 31.4 KB (added by , 18 years ago) |
---|
-
mythgallery/mythgallery/galleryutil.h
34 34 static bool loadDirectory(ThumbList& itemList, 35 35 const QString& dir, bool recurse, 36 36 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); 37 42 }; 38 43 39 44 #endif /* EXIFUTIL_H */ -
mythgallery/mythgallery/iconview.cpp
31 31 #include <mythtv/xmlparse.h> 32 32 #include <mythtv/dialogbox.h> 33 33 #include <mythtv/mythdbcon.h> 34 #include <mythtv/mythmediamonitor.h> 35 #include <mythtv/mythdialogs.h> 34 36 35 37 #include "galleryutil.h" 36 38 #include "gallerysettings.h" … … 84 86 return false; 85 87 } 86 88 87 IconView::IconView(const QString& galleryDir, MythM ainWindow* parent,88 const char* name )89 IconView::IconView(const QString& galleryDir, MythMediaDevice *initialDevice, 90 MythMainWindow* parent, const char* name ) 89 91 : MythDialog(parent, name) 90 92 { 91 93 m_galleryDir = galleryDir; 92 94 93 95 m_inMenu = false; 96 m_inSubMenu = false; 94 97 m_itemList.setAutoDelete(true); 95 98 m_itemDict.setAutoDelete(false); 96 99 … … 108 111 m_lastCol = 0; 109 112 m_topRow = 0; 110 113 m_isGallery = false; 114 #ifndef _WIN32 115 m_showDevices = false; 116 m_currDevice = initialDevice; 117 #endif 111 118 112 119 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); 114 135 } 115 136 116 137 IconView::~IconView() 117 138 { 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 126 142 delete m_thumbGen; 127 143 delete m_theme; 128 144 } … … 253 269 item->pixmap->height()/2-bh2+sh, 254 270 bw-2*sw, bh-2*sh-(int)(15*hmult)); 255 271 272 if (m_itemMarked.contains(item->path)) 273 { 274 p.drawPixmap(xpos, ypos, m_MrkPix); 275 } 276 256 277 } 257 278 else { 258 279 … … 267 288 item->pixmap->width()/2-bw2+sw, 268 289 item->pixmap->height()/2-bh2+sh, 269 290 bw-2*sw, bh-2*sh); 291 292 if (m_itemMarked.contains(item->path)) 293 { 294 p.drawPixmap(xpos, ypos, m_MrkPix); 295 } 270 296 } 271 297 272 298 curPos++; … … 294 320 QString action = actions[i]; 295 321 if (action == "MENU") { 296 322 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); 298 325 menuHandled = true; 299 326 } 300 327 else if (action == "UP") { 301 if (m_inMenu ) {328 if (m_inMenu & !m_inSubMenu) { 302 329 m_menuType->MoveUp(); 303 330 menuHandled = true; 304 331 } 332 else if (m_inMenu & m_inSubMenu) { 333 m_submenuType->MoveUp(); 334 menuHandled = true; 335 } 305 336 else 306 337 handled = moveUp(); 307 338 } 308 339 else if (action == "DOWN") { 309 if (m_inMenu ) {340 if (m_inMenu & !m_inSubMenu) { 310 341 m_menuType->MoveDown(); 311 342 menuHandled = true; 312 343 } 344 else if (m_inMenu & m_inSubMenu) { 345 m_submenuType->MoveDown(); 346 menuHandled = true; 347 } 313 348 else 314 349 handled = moveDown(); 315 350 } … … 358 393 actionDelete(); 359 394 handled = true; 360 395 } 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 } 361 414 else if (action == "SELECT" || action == "PLAY" || action == "SLIDESHOW" || action == "RANDOMSHOW" ) 362 415 { 363 416 if (m_inMenu && (action == "SELECT" || action == "PLAY") ) { … … 373 426 } 374 427 375 428 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 376 444 if (item->isDir && (action == "SELECT" || action == "PLAY") ) { 377 445 loadDirectory(item->path); 378 446 handled = true; … … 421 489 { 422 490 QString action = actions[i]; 423 491 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(); 426 513 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()); 430 520 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 } 439 534 } 440 535 } 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 } 442 559 } 560 #endif 443 561 } 444 562 } 445 563 } … … 542 660 exit(-1); 543 661 } 544 662 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 545 670 // Menu Actions 546 671 547 672 UIListBtnTypeItem* item; … … 549 674 item->setData(new Action(&IconView::actionSlideShow)); 550 675 item = new UIListBtnTypeItem(m_menuType, tr("Random")); 551 676 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)); 556 683 item = new UIListBtnTypeItem(m_menuType, tr("Delete")); 557 684 item->setData(new Action(&IconView::actionDelete)); 558 item = new UIListBtnTypeItem(m_menuType, tr("Import"));559 item->setData(new Action(&IconView::actionImport));560 685 item = new UIListBtnTypeItem(m_menuType, tr("Settings")); 561 686 item->setData(new Action(&IconView::actionSettings)); 562 687 … … 613 738 m_folderSelPix = QPixmap(*img); 614 739 delete img; 615 740 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 616 750 m_thumbW = m_backRegPix.width(); 617 751 m_thumbH = m_backRegPix.height(); 618 752 m_nCols = m_viewRect.width()/m_thumbW - 1; … … 629 763 if (!d.exists()) 630 764 return; 631 765 766 #ifndef _WIN32 767 m_showDevices = false; 768 #endif 769 632 770 m_currDir = d.absPath(); 633 771 m_itemList.clear(); 634 772 m_itemDict.clear(); … … 773 911 774 912 void IconView::pressMenu() 775 913 { 776 UIListBtnTypeItem* item = m_menuType->GetItemCurrent();914 UIListBtnTypeItem* item; 777 915 916 if (m_inSubMenu) 917 item = m_submenuType->GetItemCurrent(); 918 else 919 item = m_menuType->GetItemCurrent(); 920 778 921 if (!item || !item->getData()) 779 922 return; 780 923 781 924 Action *act = (Action*) item->getData(); 782 925 (this->*(*act))(); 926 927 m_menuType->SetActive(m_inMenu & !m_inSubMenu); 928 m_submenuType->SetActive(m_inMenu & m_inSubMenu); 783 929 } 784 930 931 void IconView::actionMainMenu() 932 { 933 clearMenu(m_submenuType); 934 m_submenuType->Reset(); 935 936 m_inSubMenu = false; 937 } 938 939 void 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 955 void 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 971 void 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 785 997 void IconView::actionRotateCW() 786 998 { 787 999 ThumbItem* item = m_itemList.at(m_currRow * m_nCols + … … 975 1187 } 976 1188 } 977 1189 1190 #ifndef _WIN32 1191 void 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 1239 void IconView::actionCopyHere() 1240 { 1241 copyMarkedFiles(false); 1242 } 1243 1244 void IconView::actionMoveHere() 1245 { 1246 copyMarkedFiles(true); 1247 } 1248 1249 void 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 1289 void IconView::actionClearMarked() 1290 { 1291 m_itemMarked.clear(); 1292 } 1293 1294 void 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 1304 void 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 978 1320 void IconView::importFromDir(const QString &fromDir, const QString &toDir) 979 1321 { 980 1322 QDir d(fromDir); … … 1014 1356 } 1015 1357 } 1016 1358 } 1359 1360 void 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 1385 void 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 1397 void 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
14 14 #include <mythtv/mythdialogs.h> 15 15 #include <mythtv/mythplugin.h> 16 16 #include <mythtv/dialogbox.h> 17 #include <mythtv/mythmedia.h> 17 18 18 19 extern "C" { 19 20 int mythplugin_init(const char *libversion); … … 33 34 diag.exec(); 34 35 } 35 36 else { 36 IconView icv(startdir, gContext->GetMainWindow(), "IconView");37 IconView icv(startdir, NULL, gContext->GetMainWindow(), "IconView"); 37 38 icv.exec(); 38 39 } 39 40 } 40 41 42 void 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 41 59 void setupKeys(void) 42 60 { 43 61 REG_JUMP("MythGallery", "Image viewer / slideshow", "", runGallery); … … 66 84 "PgDown"); 67 85 REG_KEY("Gallery", "INFO", "Toggle Showing Information about Image", "I"); 68 86 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); 69 90 } 70 91 71 92 int mythplugin_init(const char *libversion) -
mythgallery/mythgallery/thumbgenerator.cpp
308 308 309 309 QString ThumbGenerator::getThumbcacheDir(const QString& inDir) 310 310 { 311 QString galleryDir = gContext->GetSetting("GalleryDir"); 312 311 313 // For directory "/my/images/january", this function either returns 312 314 // "/my/images/january/.thumbcache" or "~/.mythtv/mythgallery/january/.thumbcache" 313 315 QString aPath = inDir + QString("/.thumbcache/"); 314 316 if ( gContext->GetNumSetting("GalleryThumbnailLocation") 315 && ! QDir(aPath).exists() )317 && ! QDir(aPath).exists() && inDir.startsWith(galleryDir)) 316 318 { 317 319 mkpath(aPath); 318 320 } 319 if ( ! gContext->GetNumSetting("GalleryThumbnailLocation") || ! QDir(aPath).exists() )321 if ( ! gContext->GetNumSetting("GalleryThumbnailLocation") || ! QDir(aPath).exists() || ! inDir.startsWith(galleryDir)) 320 322 { 321 323 // Arrive here if storing thumbs in home dir, 322 324 // OR failed to create thumb dir in gallery pics location -
mythgallery/mythgallery/iconview.h
26 26 #include <qpixmap.h> 27 27 28 28 #include <mythtv/mythdialogs.h> 29 #include <mythtv/mythmedia.h> 29 30 30 31 class XMLParse; 31 32 class UIListBtnType; … … 42 43 caption= ""; 43 44 path = ""; 44 45 isDir = false; 46 mediaDevice = NULL; 45 47 } 46 48 47 49 ~ThumbItem() { … … 58 60 QString caption; 59 61 QString path; 60 62 bool isDir; 63 MythMediaDevice *mediaDevice; 61 64 }; 62 65 63 66 typedef QPtrList<ThumbItem> ThumbList; … … 69 72 70 73 public: 71 74 72 IconView(const QString& galleryDir, MythM ainWindow* parent,73 const char* name = 0);75 IconView(const QString& galleryDir, MythMediaDevice *initialDevice, 76 MythMainWindow* parent, const char* name = 0); 74 77 ~IconView(); 75 78 76 79 protected: … … 93 96 bool moveLeft(); 94 97 bool moveRight(); 95 98 99 void actionMainMenu(); 100 void actionSubMenuMetadata(); 101 void actionSubMenuMark(); 102 void actionSubMenuFile(); 103 96 104 void actionRotateCW(); 97 105 void actionRotateCCW(); 98 106 void actionDelete(); … … 100 108 void actionRandomShow(); 101 109 void actionSettings(); 102 110 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(); 103 120 121 104 122 void pressMenu(); 105 123 106 124 void loadThumbnail(ThumbItem *item); 107 125 void importFromDir(const QString &fromDir, const QString &toDir); 126 void copyMarkedFiles(bool move = false); 127 128 void clearMenu(UIListBtnType *menu); 108 129 109 130 QPtrList<ThumbItem> m_itemList; 110 131 QDict<ThumbItem> m_itemDict; 132 QStringList m_itemMarked; 111 133 QString m_galleryDir; 112 134 113 135 XMLParse *m_theme; … … 116 138 QRect m_viewRect; 117 139 118 140 bool m_inMenu; 141 bool m_inSubMenu; 119 142 UIListBtnType *m_menuType; 143 UIListBtnType *m_submenuType; 120 144 121 145 QPixmap m_backRegPix; 122 146 QPixmap m_backSelPix; 123 147 QPixmap m_folderRegPix; 124 148 QPixmap m_folderSelPix; 149 QPixmap m_MrkPix; 125 150 126 151 QString m_currDir; 127 152 bool m_isGallery; 153 #ifndef _WIN32 154 bool m_showDevices; 155 MythMediaDevice *m_currDevice; 156 #endif 128 157 129 158 int m_currRow; 130 159 int m_currCol; … … 143 172 int m_showcaption; 144 173 145 174 typedef void (IconView::*Action)(); 175 176 #ifndef _WIN32 177 public slots: 178 void mediaStatusChanged( MediaStatus oldStatus, MythMediaDevice* pMedia); 179 #endif 146 180 }; 147 181 148 182 -
mythgallery/mythgallery/gallery-ui.xml
21 21 </font> 22 22 23 23 <container name="menu"> 24 <area>20,20,140, 240</area>24 <area>20,20,140,500</area> 25 25 26 26 <listbtnarea name="menu" draworder="0"> 27 27 <area>0,0,140,240</area> … … 35 35 <showscrollarrows>no</showscrollarrows> 36 36 </listbtnarea> 37 37 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 38 50 </container> 39 51 40 52 <container name="text"> -
mythgallery/mythgallery/galleryutil.cpp
20 20 #include <qfileinfo.h> 21 21 #include <qdir.h> 22 22 23 #include <mythtv/mythdbcon.h> 24 #include <mythtv/util.h> 25 23 26 #include "config.h" 24 27 #include "constants.h" 25 28 #include "galleryutil.h" … … 263 266 264 267 return caption; 265 268 } 269 270 QFileInfo 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 315 bool 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 329 QFileInfo 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 390 bool 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 }