diff options
Diffstat (limited to 'src-qt5/core')
27 files changed, 1100 insertions, 702 deletions
diff --git a/src-qt5/core/libLumina/LuminaUtils.cpp b/src-qt5/core/libLumina/LuminaUtils.cpp index 1ab3faac..dd4c75c4 100644 --- a/src-qt5/core/libLumina/LuminaUtils.cpp +++ b/src-qt5/core/libLumina/LuminaUtils.cpp @@ -159,9 +159,8 @@ QString LUtils::GenerateOpenTerminalExec(QString term, QString dirpath){ //if(!LUtils::isValidBinary(term)){ if(term.endsWith(".desktop")){ //Pull the binary name out of the shortcut - bool ok = false; - XDGDesktop DF = LXDG::loadDesktopFile(term,ok); - if(!ok){ term = "xterm"; } + XDGDesktop DF(term); + if(DF.type == XDGDesktop::BAD){ term = "xterm"; } else{ term= DF.exec.section(" ",0,0); } //only take the binary name - not any other flags }else{ term = "xterm"; //fallback diff --git a/src-qt5/core/libLumina/LuminaXDG.cpp b/src-qt5/core/libLumina/LuminaXDG.cpp index 36b05676..0e33f254 100644 --- a/src-qt5/core/libLumina/LuminaXDG.cpp +++ b/src-qt5/core/libLumina/LuminaXDG.cpp @@ -15,10 +15,396 @@ static QStringList mimeglobs; static qint64 mimechecktime; +//============================= +// XDGDesktop CLASS +//============================= +XDGDesktop::XDGDesktop(QString file, QObject *parent) : QObject(parent){ + isHidden=false; + useTerminal=false; + startupNotify=false; + type = XDGDesktop::BAD; + filePath = file; + exec = tryexec = ""; // just to make sure this is initialized + if(!filePath.isEmpty()){ sync(); } //if an input file is given - go ahead and sync now +} + +void XDGDesktop::sync(){ + //Reset internal vars + isHidden=false; + useTerminal=false; + startupNotify=false; + type = XDGDesktop::BAD; + exec = tryexec = ""; + //Read in the File + if(!filePath.endsWith(".desktop")){ return; } + lastRead = QDateTime::currentDateTime(); + QStringList file = LUtils::readFile(filePath); + if(file.isEmpty()){ return; } //done with init right here - nothing to load + //Get the current localization code + type = XDGDesktop::APP; //assume this initially if we read the file properly + QString lang = QLocale::system().name(); //lang code + QString slang = lang.section("_",0,0); //short lang code + //Now start looping over the information + XDGDesktopAction CDA; //current desktop action + bool insection=false; + bool inaction=false; + for(int i=0; i<file.length(); i++){ + QString line = file[i]; + //if(filePath.contains("pcbsd")){ qDebug() << " - Check Line:" << line << inaction << insection; } + //Check if this is the end of a section + if(line.startsWith("[") && inaction){ + insection=false; inaction=false; + //Add the current Action structure to the main desktop structure if appropriate + if(!CDA.ID.isEmpty()){ actions << CDA; CDA = XDGDesktopAction(); } + }else if(line.startsWith("[")){ insection=false; inaction = false; } + //Now check if this is the beginning of a section + if(line=="[Desktop Entry]"){ insection=true; continue; } + else if(line.startsWith("[Desktop Action ")){ + //Grab the ID of the action out of the label + CDA.ID = line.section("]",0,0).section("Desktop Action",1,1).simplified(); + inaction = true; + continue; + }else if( (!insection && !inaction) || line.startsWith("#")){ continue; } + //Now parse out the file + line = line.simplified(); + QString var = line.section("=",0,0).simplified(); + QString loc = var.section("[",1,1).section("]",0,0).simplified(); // localization + var = var.section("[",0,0).simplified(); //remove the localization + QString val = line.section("=",1,50).simplified(); + //------------------- + if(var=="Name"){ + if(insection){ + if(name.isEmpty() && loc.isEmpty()){ name = val; } + else if(name.isEmpty() && loc==slang){ name = val; } //short locale code + else if(loc == lang){ name = val; } + }else if(inaction){ + if(CDA.name.isEmpty() && loc.isEmpty()){ CDA.name = val; } + else if(CDA.name.isEmpty() && loc==slang){ CDA.name = val; } //short locale code + else if(loc == lang){ CDA.name = val; } + } + //hasName = true; + }else if(var=="GenericName" && insection){ + if(genericName.isEmpty() && loc.isEmpty()){ genericName = val; } + else if(genericName.isEmpty() && loc==slang){ genericName = val; } //short locale code + else if(loc == lang){ genericName = val; } + }else if(var=="Comment" && insection){ + if(comment.isEmpty() && loc.isEmpty()){ comment = val; } + else if(comment.isEmpty() && loc==slang){ comment = val; } //short locale code + else if(loc == lang){ comment = val; } + }else if(var=="Icon"){ + if(insection){ + if(icon.isEmpty() && loc.isEmpty()){ icon = val; } + else if(icon.isEmpty() && loc==slang){ icon = val; } //short locale code + else if(loc == lang){ icon = val; } + }else if(inaction){ + if(CDA.icon.isEmpty() && loc.isEmpty()){ CDA.icon = val; } + else if(CDA.icon.isEmpty() && loc==slang){ CDA.icon = val; } //short locale code + else if(loc == lang){ CDA.icon = val; } + } + } + else if( (var=="TryExec") && (tryexec.isEmpty()) && insection) { tryexec = val; } + else if(var=="Exec"){ + if(insection && exec.isEmpty() ){ exec = val; } + else if(inaction && CDA.exec.isEmpty() ){ CDA.exec = val; } + } + else if( (var=="Path") && (path.isEmpty() ) && insection){ path = val; } + else if(var=="NoDisplay" && !isHidden && insection){ isHidden = (val.toLower()=="true"); } + else if(var=="Hidden" && !isHidden && insection){ isHidden = (val.toLower()=="true"); } + else if(var=="Categories" && insection){ catList = val.split(";",QString::SkipEmptyParts); } + else if(var=="OnlyShowIn" && insection){ showInList = val.split(";",QString::SkipEmptyParts); } + else if(var=="NotShowIn" && insection){ notShowInList = val.split(";",QString::SkipEmptyParts); } + else if(var=="Terminal" && insection){ useTerminal= (val.toLower()=="true"); } + else if(var=="Actions" && insection){ actionList = val.split(";",QString::SkipEmptyParts); } + else if(var=="MimeType" && insection){ mimeList = val.split(";",QString::SkipEmptyParts); } + else if(var=="Keywords" && insection){ + if(keyList.isEmpty() && loc.isEmpty()){ keyList = val.split(";",QString::SkipEmptyParts); } + else if(loc == lang){ keyList = val.split(";",QString::SkipEmptyParts); } + } + else if(var=="StartupNotify" && insection){ startupNotify = (val.toLower()=="true"); } + else if(var=="StartupWMClass" && insection){ startupWM = val; } + else if(var=="URL" && insection){ url = val;} + else if(var=="Type" && insection){ + if(val.toLower()=="application"){ type = XDGDesktop::APP; } + else if(val.toLower()=="link"){ type = XDGDesktop::LINK; } + else if(val.toLower()=="dir"){ type = XDGDesktop::DIR; } + else{ type = XDGDesktop::BAD; } //Unknown type + //hasType = true; + } + } //end reading file + file.clear(); //done with contents of file + //If there are OnlyShowIn desktops listed, add them to the name + if( !showInList.isEmpty() && !showInList.contains("Lumina", Qt::CaseInsensitive) ){ + name.append(" ("+showInList.join(", ")+")"); + } + //Quick fix for showing "wine" applications (which quite often don't list a category, or have other differences) + if(catList.isEmpty() && filePath.contains("/wine/")){ + catList << "Wine"; //Internal Lumina category only (not in XDG specs as of 11/14/14) + //Also add a fix for the location of Wine icons + if( !icon.isEmpty() ){ + QStringList sizes; sizes << "256x256" << "128x128" << "64x64" << "48x48" << "32x32" << "16x16"; + QString upath = QDir::homePath()+"/.local/share/icons/hicolor/%1/apps/%2.png"; + //qDebug() << "Wine App: Check icon" << upath; + for(int i=0; i<sizes.length(); i++){ + if( QFile::exists(upath.arg(sizes[i],icon)) ){ + icon = upath.arg(sizes[i],icon); + //qDebug() << " - Found Icon:" << icon; + break; + } + } + } + } +} + + +bool XDGDesktop::isValid(bool showAll){ + bool ok=true; + //bool DEBUG = false; + //if(DEBUG){ qDebug() << "[LXDG] Check File validity:" << dFile.name << dFile.filePath; } + switch (type){ + case XDGDesktop::BAD: + ok=false; + //if(DEBUG){ qDebug() << " - Bad file type"; } + break; + case XDGDesktop::APP: + if(!tryexec.isEmpty() && !LXDG::checkExec(tryexec)){ ok=false; }//if(DEBUG){ qDebug() << " - tryexec does not exist";} } + else if(exec.isEmpty() || name.isEmpty()){ ok=false; }//if(DEBUG){ qDebug() << " - exec or name is empty";} } + else if(!LXDG::checkExec(exec.section(" ",0,0,QString::SectionSkipEmpty)) ){ ok=false; }//if(DEBUG){ qDebug() << " - first exec binary does not exist";} } + break; + case XDGDesktop::LINK: + ok = !url.isEmpty(); + //if(DEBUG && !ok){ qDebug() << " - Link with missing URL"; } + break; + case XDGDesktop::DIR: + ok = !path.isEmpty(); + //if(DEBUG && !ok){ qDebug() << " - Dir with missing path"; } + break; + default: + ok=false; + //if(DEBUG){ qDebug() << " - Unknown file type"; } + } + if(!showAll){ + QString cdesk = getenv("XDG_CURRENT_DESKTOP"); + if(cdesk.isEmpty()){ cdesk="Lumina"; } + if(!showInList.isEmpty()){ ok = showInList.contains(cdesk, Qt::CaseInsensitive); } + else if(!notShowInList.isEmpty()){ ok = !notShowInList.contains(cdesk,Qt::CaseInsensitive); } + else if(name.isEmpty()){ ok = false; } + } + return ok; +} + +QString XDGDesktop::getDesktopExec(QString ActionID){ + //Generate the executable line for the application + QString out = exec; + if( !ActionID.isEmpty() ){ + //Go through and grab the proper exec for the listed action + for(int i=0; i<actions.length(); i++){ + if(actions[i].ID == ActionID){ + out = actions[i].exec; + break; + } + } + } + + if(out.isEmpty()){ return ""; } + else if(useTerminal){ + //Get the currently default terminal + QString term = LXDG::findDefaultAppForMime("application/terminal"); + if(!QFile::exists(term)){ term = "xterm -lc"; } + else if(term.endsWith(".desktop")){ + XDGDesktop DF(term); + if(DF.isValid()){ term = DF.getDesktopExec(); } + else{ term = "xterm -lc"; } + //DF.deleteLater(); //done with this struct + }else if( !LUtils::isValidBinary(term)){ term = "xterm -lc"; } + out = term+" -e "+out; //-e is a nearly-universal flag for terminal emulators + } + //Now perform any of the XDG flag substitutions as appropriate (9/2014 standards) + if(out.contains("%i") && !icon.isEmpty() ){ out.replace("%i", "--icon \'"+icon+"\'"); } + if(out.contains("%c")){ + if(!name.isEmpty()){ out.replace("%c", "\'"+name+"\'"); } + else if(!genericName.isEmpty()){ out.replace("%c", "\'"+genericName+"\'"); } + else{ out.replace("%c", "\'"+filePath.section("/",-1).section(".desktop",0,0)+"\'"); } + } + if(out.contains("%k")){ out.replace("%k", "\'"+filePath+"\'"); } + return out; +} + +bool XDGDesktop::saveDesktopFile(bool merge){ + qDebug() << "Save Desktop File:" << filePath << "Merge:" << merge; + bool autofile = filePath.contains("/autostart/"); //use the "Hidden" field instead of the "NoDisplay" + int insertloc = -1; + QStringList info; + if(QFile::exists(filePath) && merge){ + //Load the existing file and merge in in any changes + info = LUtils::readFile(filePath); + //set a couple flags based on the contents before we start iterating through + // - determine if a translated field was changed (need to remove all the now-invalid translations) + bool clearName, clearComment, clearGName; + QString tmp = ""; + if(!info.filter("Name=").isEmpty()){ tmp = info.filter("Name=").first().section("=",1,50); } + clearName=(tmp!=name); + tmp.clear(); + if(!info.filter("Comment=").isEmpty()){ tmp = info.filter("Comment=").first().section("=",1,50); } + clearComment=(tmp!=comment); + tmp.clear(); + if(!info.filter("GenericName=").isEmpty()){ tmp = info.filter("GenericName=").first().section("=",1,50); } + clearGName=(tmp!=genericName); + //Now start iterating through the file and changing fields as necessary + bool insection = false; + for(int i=0; i<info.length(); i++){ + if(info[i]=="[Desktop Entry]"){ + insection = true; + continue; + }else if(info[i].startsWith("[")){ + if(insection){ insertloc = i; } //save this location for later insertions + insection = false; + continue; + } + if(!insection || info[i].isEmpty() || info[i].section("#",0,0).simplified().isEmpty()){ continue; } + QString var = info[i].section("=",0,0); + QString val = info[i].section("=",1,50).simplified(); + //NOTE: Clear the dFile variable as it is found/set in the file (to keep track of what has been used already) + // For boolian values, set them to false + // --LOCALIZED VALUES -- + if(var.startsWith("Name")){ + if(var.contains("[") && clearName){ info.removeAt(i); i--; continue;} + else if(!var.contains("[")){ info[i] = var+"="+name; name.clear(); } + }else if(var.startsWith("GenericName")){ + if(var.contains("[") && clearGName){ info.removeAt(i); i--; continue;} + else if(!var.contains("[")){ info[i] = var+"="+genericName; genericName.clear(); } + }else if(var.startsWith("Comment")){ + if(var.contains("[") && clearComment){ info.removeAt(i); i--; continue;} + else if(!var.contains("[")){ info[i] = var+"="+comment; comment.clear(); } + + // --STRING/LIST VALUES-- + }else if(var=="Exec"){ info[i] = var+"="+exec; exec.clear(); } + else if(var=="TryExec"){ info[i] = var+"="+tryexec; tryexec.clear(); } + else if(var=="Path"){ info[i] = var+"="+path; path.clear(); } + else if(var=="Icon"){ info[i] = var+"="+icon; icon.clear(); } + else if(var=="StartupWMClass"){ info[i] = var+"="+startupWM; startupWM.clear(); } + else if(var=="MimeType"){ info[i] = var+"="+mimeList.join(";"); mimeList.clear(); } + else if(var=="Categories"){ info[i] = var+"="+catList.join(";"); catList.clear(); } + else if(var=="Keywords"){ info[i] = var+"="+keyList.join(";"); keyList.clear(); } + else if(var=="Actions"){ info[i] = var+"="+actionList.join(";"); actionList.clear(); } + else if(var=="OnlyShowIn"){ info[i] = var+"="+showInList.join(";"); showInList.clear(); } + else if(var=="NotShowIn"){ info[i] = var+"="+notShowInList.join(";"); notShowInList.clear(); } + else if(var=="URL"){ info[i] = var+"="+url; url.clear(); } + + // --BOOLIAN VALUES-- + else if(var=="Hidden"){ + if(!autofile){ info.removeAt(i); i--; continue; } + else{ info[i] = var+"="+(isHidden ? "true": "false"); isHidden=false;} + }else if(var=="NoDisplay"){ + if(autofile){ info.removeAt(i); i--; continue; } + else{ info[i] = var+"="+(isHidden ? "true": "false"); isHidden=false;} + }else if(var=="Terminal"){ + info[i] = var+"="+(useTerminal ? "true": "false"); useTerminal=false; + }else if(var=="StartupNotify"){ + info[i] = var+"="+(startupNotify ? "true": "false"); startupNotify=false; + } + // Remove any lines that have been un-set or removed from the file + if(info[i].section("=",1,50).simplified().isEmpty()){ info.removeAt(i); i--; } + } + + }else{ + //Just write a new file and overwrite any old one + // (pre-set some values here which are always required) + info << "[Desktop Entry]"; + info << "Version=1.0"; + if(type==XDGDesktop::APP){ info << "Type=Application"; } + else if(type==XDGDesktop::LINK){ info << "Type=Link"; } + else if(type==XDGDesktop::DIR){ info << "Type=Dir"; } + } + + if(insertloc<0){ insertloc = info.size(); }//put it at the end + //Now add in any items that did not exist in the original file + if( !exec.isEmpty() ){ info.insert(insertloc,"Exec="+exec); } + if( !tryexec.isEmpty() ){ info.insert(insertloc,"TryExec="+tryexec); } + if( !path.isEmpty() ){ info.insert(insertloc,"Path="+path); } + if( !icon.isEmpty() ){ info.insert(insertloc,"Icon="+icon); } + if( !name.isEmpty() ){ info.insert(insertloc,"Name="+name); } + if( !genericName.isEmpty() ){ info.insert(insertloc,"GenericName="+genericName); } + if( !comment.isEmpty() ){ info.insert(insertloc,"Comment="+comment); } + if( !startupWM.isEmpty() ){ info.insert(insertloc,"StartupWMClass="+startupWM); } + if( !mimeList.isEmpty() ){ info.insert(insertloc,"MimeType="+mimeList.join(";")); } + if( !catList.isEmpty() ){ info.insert(insertloc,"Categories="+catList.join(";")); } + if( !keyList.isEmpty() ){ info.insert(insertloc,"Keywords="+keyList.join(";")); } + if( !actionList.isEmpty() ){ info.insert(insertloc,"Actions="+actionList.join(";")); } + if( !showInList.isEmpty() ){ info.insert(insertloc,"OnlyShowIn="+showInList.join(";")); } + else if( !notShowInList.isEmpty() ){ info.insert(insertloc,"NotShowIn="+notShowInList.join(";")); } + if( !url.isEmpty() ){ info.insert(insertloc,"URL="+url); } + if( isHidden && autofile ){ info.insert(insertloc,"Hidden=true"); } + else if(isHidden){ info.insert(insertloc,"NoDisplay=true"); } + if( useTerminal){ info.insert(insertloc,"Terminal=true"); } + if( startupNotify ){ info.insert(insertloc,"StartupNotify=true"); } + + //Now save the file + return LUtils::writeFile(filePath, info, true); +} + +bool XDGDesktop::setAutoStarted(bool autostart){ + //First get the list of system directories to search (system first, user-provided files come later and overwrite sys files as needed) + QStringList paths = QString(getenv("XDG_CONFIG_DIRS")).split(":"); + QString upath = QString(getenv("XDG_CONFIG_HOME")).section(":",0,0); + if(upath.isEmpty()){ upath = QDir::homePath()+"/.config/autostart/"; } + else{ upath.append("/autostart/"); } + //Verify that the autostart directory exists + if(!QFile::exists(upath)){ + QDir dir; + dir.mkpath(upath); + } + + //Quick check/finish for user-defined files which are getting disabled (just remove the file) + if(filePath.startsWith(upath) && !autostart){ + return QFile::remove(filePath); + } + bool sysfile = false; + for(int i=0; i<paths.length(); i++){ + if(filePath.startsWith(paths[i]+"/autostart/") ){ + sysfile = true; + //Change it to the user-modifiable directory + filePath = filePath.replace(paths[i]+"/autostart/", upath); + } + } + //Make sure the user-autostart dir is specified, and clean the app structure as necessary + if( !filePath.startsWith(upath) && autostart){ + //Some other non-override autostart file - set it up to open with lumina-open + if(!filePath.endsWith(".desktop")){ + exec = "lumina-open \""+filePath+"\""; + tryexec = filePath; //make sure this file exists + if(name.isEmpty()){ name = filePath.section("/",-1); } + if(icon.isEmpty()){ icon = LXDG::findAppMimeForFile(filePath); icon.replace("/","-"); } + filePath = upath+filePath.section("/",-1)+".desktop"; + type = XDGDesktop::APP; + }else{ + //Some other *.desktop file on the system (keep almost all the existing settings/values) + // - setup a redirect to the other file + exec = "lumina-open \""+filePath+"\""; + tryexec = filePath; //make sure this file exists + // - Adjust the actual path where this file will get saved + filePath = upath+filePath.section("/",-1); + } + } + //Now save the "hidden" value into the file + isHidden = !autostart; //if hidden, it will not be autostarted + //Now save the file as necessary + bool saved = false; + //qDebug() << " - Saving AutoStart File:" << filePath << name << isHidden; + if(sysfile){ + //Just an override file for the "hidden" field - nothing more + QStringList info; + info << "[Desktop Entry]" << "Type=Application" << QString("Hidden=")+ (isHidden ? QString("true"): QString("false")); + saved = LUtils::writeFile(filePath, info, true); + }else{ + //Need to actually save the full file + saved = saveDesktopFile(); + } + return saved; +} + //====XDGDesktopList Functions ==== XDGDesktopList::XDGDesktopList(QObject *parent, bool watchdirs) : QObject(parent){ - synctimer = new QTimer(this); - synctimer->setInterval(60000); //1 minute intervals. since the polling/update only takes a few ms, this is completely reasonable + synctimer = new QTimer(this); //interval set automatically based on changes/interactions connect(synctimer, SIGNAL(timeout()), this, SLOT(updateList()) ); keepsynced = watchdirs; if(watchdirs){ @@ -35,7 +421,9 @@ XDGDesktopList::~XDGDesktopList(){ } void XDGDesktopList::watcherChanged(){ - QTimer::singleShot(1000, this, SLOT(updateList()) ); //1 second delay before check kicks off + if(synctimer->isActive()){ synctimer->stop(); } + synctimer->setInterval(1000); //1 second delay before check kicks off + synctimer->start(); } void XDGDesktopList::updateList(){ @@ -54,19 +442,21 @@ void XDGDesktopList::updateList(){ apps = dir.entryList(QStringList() << "*.desktop",QDir::Files, QDir::Name); for(int a=0; a<apps.length(); a++){ path = dir.absoluteFilePath(apps[a]); - if(files.contains(path) && (files.value(path).lastRead>QFileInfo(path).lastModified()) ){ + if(files.contains(path) && (files.value(path)->lastRead>QFileInfo(path).lastModified()) ){ //Re-use previous data for this file (nothing changed) - found << files[path].name; //keep track of which files were already found + found << files[path]->name; //keep track of which files were already found ok=true; }else{ ok=false; - if(files.contains(path)){ appschanged = true; files.remove(path); } - XDGDesktop dFile = LXDG::loadDesktopFile(path,ok); //will change the "ok" variable as needed - if(ok){ + if(files.contains(path)){ appschanged = true; files.take(path)->deleteLater(); } //files.remove(path); } + XDGDesktop *dFile = new XDGDesktop(path, this); //will change the "ok" variable as needed + if(dFile->type!=XDGDesktop::BAD){ appschanged = true; //flag that something changed - needed to load a file if(!oldkeys.contains(path)){ newfiles << path; } //brand new file (not an update to a previously-read file) files.insert(path, dFile); - found << dFile.name; + found << dFile->name; + }else{ + dFile->deleteLater(); //bad file - discard it } } oldkeys.removeAll(path); //make sure this key does not get cleaned up later @@ -80,25 +470,28 @@ void XDGDesktopList::updateList(){ //Now go through and cleanup any old keys where the associated file does not exist anymore for(int i=0; i<oldkeys.length(); i++){ //qDebug() << "Removing file from internal map:" << oldkeys[i]; - files.remove(oldkeys[i]); + if(i==0){ appschanged = true; } + //files.remove(oldkeys[i]); + files.take(oldkeys[i])->deleteLater(); } //If this class is automatically managing the lists, update the watched files/dirs and send out notifications if(watcher!=0){ - qDebug() << "Auto App List Update:" << lastCheck << "Changes:" << appschanged << "Files:" << files.count(); + if(appschanged){ qDebug() << "Auto App List Update:" << lastCheck << "Files Found:" << files.count(); } watcher->removePaths(QStringList() << watcher->files() << watcher->directories()); watcher->addPaths(appDirs); if(appschanged){ emit appsUpdated(); } + synctimer->setInterval(60000); //Update in 1 minute if nothing changes before then synctimer->start(); } } -QList<XDGDesktop> XDGDesktopList::apps(bool showAll, bool showHidden){ +QList<XDGDesktop*> XDGDesktopList::apps(bool showAll, bool showHidden){ //showAll: include invalid files, showHidden: include NoShow/Hidden files QStringList keys = files.keys(); - QList<XDGDesktop> out; + QList<XDGDesktop*> out; for(int i=0; i<keys.length(); i++){ - if( showHidden || !files[keys[i]].isHidden ){ //this is faster than the "checkValidity()" function below - so always filter here first - if( LXDG::checkValidity(files[keys[i]], showAll) ){ + if( showHidden || !files[keys[i]]->isHidden ){ //this is faster than the "checkValidity()" function below - so always filter here first + if( files[keys[i]]->isValid(showAll) ){ out << files[keys[i]]; } } @@ -109,6 +502,7 @@ QList<XDGDesktop> XDGDesktopList::apps(bool showAll, bool showHidden){ //==== LFileInfo Functions ==== //Need some extra information not usually available by a QFileInfo void LFileInfo::loadExtraInfo(){ + desk = 0; //Now load the extra information if(this->isDir()){ mime = "inode/directory"; @@ -127,11 +521,10 @@ void LFileInfo::loadExtraInfo(){ }else if( this->suffix()=="desktop"){ mime = "application/x-desktop"; icon = "application-x-desktop"; //default value - bool ok = false; - desk = LXDG::loadDesktopFile(this->absoluteFilePath(), ok); - if(ok){ + desk = new XDGDesktop(this->absoluteFilePath(), 0); + if(desk->type!=XDGDesktop::BAD){ //use the specific desktop file info (if possible) - if(!desk.icon.isEmpty()){ icon = desk.icon; } + if(!desk->icon.isEmpty()){ icon = desk->icon; } } }else{ //Generic file, just determine the mimetype @@ -172,12 +565,12 @@ QString LFileInfo::iconfile(){ // -- Check if this is an XDG desktop file bool LFileInfo::isDesktopFile(){ - return (!desk.filePath.isEmpty()); + return (!desk->filePath.isEmpty()); } // -- Allow access to the XDG desktop data structure XDGDesktop* LFileInfo::XDG(){ - return &desk; + return desk; } // -- Check if this is a readable image file (for thumbnail support) @@ -193,17 +586,17 @@ bool LFileInfo::isAVFile(){ //==== LXDG Functions ==== -XDGDesktop LXDG::loadDesktopFile(QString filePath, bool& ok){ +/*XDGDesktop *LXDG::loadDesktopFile(QString filePath, bool& ok, QObject *parent){ //Create the outputs ok=false; - XDGDesktop DF; - DF.isHidden=false; - DF.useTerminal=false; - DF.startupNotify=false; - DF.type = XDGDesktop::APP; - DF.filePath = filePath; - DF.lastRead = QDateTime::currentDateTime(); - DF.exec = DF.tryexec = ""; // just to make sure this is initialized + XDGDesktop *DF = new XDGDesktop(parent); + DF->isHidden=false; + DF->useTerminal=false; + DF->startupNotify=false; + DF->type = XDGDesktop::APP; + DF->filePath = filePath; + DF->lastRead = QDateTime::currentDateTime(); + DF->exec = DF->tryexec = ""; // just to make sure this is initialized //Get the current localization code QString lang = QLocale::system().name(); //lang code @@ -223,7 +616,7 @@ XDGDesktop LXDG::loadDesktopFile(QString filePath, bool& ok){ if(line.startsWith("[") && inaction){ insection=false; inaction=false; //Add the current Action structure to the main desktop structure if appropriate - if(!CDA.ID.isEmpty()){ DF.actions << CDA; CDA = XDGDesktopAction(); } + if(!CDA.ID.isEmpty()){ DF->actions << CDA; CDA = XDGDesktopAction(); } }else if(line.startsWith("[")){ insection=false; inaction = false; } //Now check if this is the beginning of a section if(line=="[Desktop Entry]"){ insection=true; continue; } @@ -242,9 +635,9 @@ XDGDesktop LXDG::loadDesktopFile(QString filePath, bool& ok){ //------------------- if(var=="Name"){ if(insection){ - if(DF.name.isEmpty() && loc.isEmpty()){ DF.name = val; } - else if(DF.name.isEmpty() && loc==slang){ DF.name = val; } //short locale code - else if(loc == lang){ DF.name = val; } + if(DF->name.isEmpty() && loc.isEmpty()){ DF->name = val; } + else if(DF->name.isEmpty() && loc==slang){ DF->name = val; } //short locale code + else if(loc == lang){ DF->name = val; } }else if(inaction){ if(CDA.name.isEmpty() && loc.isEmpty()){ CDA.name = val; } else if(CDA.name.isEmpty() && loc==slang){ CDA.name = val; } //short locale code @@ -252,70 +645,70 @@ XDGDesktop LXDG::loadDesktopFile(QString filePath, bool& ok){ } //hasName = true; }else if(var=="GenericName" && insection){ - if(DF.genericName.isEmpty() && loc.isEmpty()){ DF.genericName = val; } - else if(DF.genericName.isEmpty() && loc==slang){ DF.genericName = val; } //short locale code - else if(loc == lang){ DF.genericName = val; } + if(DF->genericName.isEmpty() && loc.isEmpty()){ DF->genericName = val; } + else if(DF->genericName.isEmpty() && loc==slang){ DF->genericName = val; } //short locale code + else if(loc == lang){ DF->genericName = val; } }else if(var=="Comment" && insection){ - if(DF.comment.isEmpty() && loc.isEmpty()){ DF.comment = val; } - else if(DF.comment.isEmpty() && loc==slang){ DF.comment = val; } //short locale code - else if(loc == lang){ DF.comment = val; } + if(DF->comment.isEmpty() && loc.isEmpty()){ DF->comment = val; } + else if(DF->comment.isEmpty() && loc==slang){ DF->comment = val; } //short locale code + else if(loc == lang){ DF->comment = val; } }else if(var=="Icon"){ if(insection){ - if(DF.icon.isEmpty() && loc.isEmpty()){ DF.icon = val; } - else if(DF.icon.isEmpty() && loc==slang){ DF.icon = val; } //short locale code - else if(loc == lang){ DF.icon = val; } + if(DF->icon.isEmpty() && loc.isEmpty()){ DF->icon = val; } + else if(DF->icon.isEmpty() && loc==slang){ DF->icon = val; } //short locale code + else if(loc == lang){ DF->icon = val; } }else if(inaction){ if(CDA.icon.isEmpty() && loc.isEmpty()){ CDA.icon = val; } else if(CDA.icon.isEmpty() && loc==slang){ CDA.icon = val; } //short locale code else if(loc == lang){ CDA.icon = val; } } } - else if( (var=="TryExec") && (DF.tryexec.isEmpty()) && insection) { DF.tryexec = val; } + else if( (var=="TryExec") && (DF->tryexec.isEmpty()) && insection) { DF->tryexec = val; } else if(var=="Exec"){ - if(insection && DF.exec.isEmpty() ){ DF.exec = val; } + if(insection && DF->exec.isEmpty() ){ DF->exec = val; } else if(inaction && CDA.exec.isEmpty() ){ CDA.exec = val; } } - else if( (var=="Path") && (DF.path.isEmpty() ) && insection){ DF.path = val; } - else if(var=="NoDisplay" && !DF.isHidden && insection){ DF.isHidden = (val.toLower()=="true"); } - else if(var=="Hidden" && !DF.isHidden && insection){ DF.isHidden = (val.toLower()=="true"); } - else if(var=="Categories" && insection){ DF.catList = val.split(";",QString::SkipEmptyParts); } - else if(var=="OnlyShowIn" && insection){ DF.showInList = val.split(";",QString::SkipEmptyParts); } - else if(var=="NotShowIn" && insection){ DF.notShowInList = val.split(";",QString::SkipEmptyParts); } - else if(var=="Terminal" && insection){ DF.useTerminal= (val.toLower()=="true"); } - else if(var=="Actions" && insection){ DF.actionList = val.split(";",QString::SkipEmptyParts); } - else if(var=="MimeType" && insection){ DF.mimeList = val.split(";",QString::SkipEmptyParts); } + else if( (var=="Path") && (DF->path.isEmpty() ) && insection){ DF->path = val; } + else if(var=="NoDisplay" && !DF->isHidden && insection){ DF->isHidden = (val.toLower()=="true"); } + else if(var=="Hidden" && !DF->isHidden && insection){ DF->isHidden = (val.toLower()=="true"); } + else if(var=="Categories" && insection){ DF->catList = val.split(";",QString::SkipEmptyParts); } + else if(var=="OnlyShowIn" && insection){ DF->showInList = val.split(";",QString::SkipEmptyParts); } + else if(var=="NotShowIn" && insection){ DF->notShowInList = val.split(";",QString::SkipEmptyParts); } + else if(var=="Terminal" && insection){ DF->useTerminal= (val.toLower()=="true"); } + else if(var=="Actions" && insection){ DF->actionList = val.split(";",QString::SkipEmptyParts); } + else if(var=="MimeType" && insection){ DF->mimeList = val.split(";",QString::SkipEmptyParts); } else if(var=="Keywords" && insection){ - if(DF.keyList.isEmpty() && loc.isEmpty()){ DF.keyList = val.split(";",QString::SkipEmptyParts); } - else if(loc == lang){ DF.keyList = val.split(";",QString::SkipEmptyParts); } + if(DF->keyList.isEmpty() && loc.isEmpty()){ DF->keyList = val.split(";",QString::SkipEmptyParts); } + else if(loc == lang){ DF->keyList = val.split(";",QString::SkipEmptyParts); } } - else if(var=="StartupNotify" && insection){ DF.startupNotify = (val.toLower()=="true"); } - else if(var=="StartupWMClass" && insection){ DF.startupWM = val; } - else if(var=="URL" && insection){ DF.url = val;} + else if(var=="StartupNotify" && insection){ DF->startupNotify = (val.toLower()=="true"); } + else if(var=="StartupWMClass" && insection){ DF->startupWM = val; } + else if(var=="URL" && insection){ DF->url = val;} else if(var=="Type" && insection){ - if(val.toLower()=="application"){ DF.type = XDGDesktop::APP; } - else if(val.toLower()=="link"){ DF.type = XDGDesktop::LINK; } - else if(val.toLower()=="dir"){ DF.type = XDGDesktop::DIR; } - else{ DF.type = XDGDesktop::BAD; } //Unknown type + if(val.toLower()=="application"){ DF->type = XDGDesktop::APP; } + else if(val.toLower()=="link"){ DF->type = XDGDesktop::LINK; } + else if(val.toLower()=="dir"){ DF->type = XDGDesktop::DIR; } + else{ DF->type = XDGDesktop::BAD; } //Unknown type //hasType = true; } } //end reading file file.clear(); //done with contents of file //If there are OnlyShowIn desktops listed, add them to the name - if( !DF.showInList.isEmpty() && !DF.showInList.contains("Lumina", Qt::CaseInsensitive) ){ - DF.name.append(" ("+DF.showInList.join(", ")+")"); + if( !DF->showInList.isEmpty() && !DF->showInList.contains("Lumina", Qt::CaseInsensitive) ){ + DF->name.append(" ("+DF->showInList.join(", ")+")"); } //Quick fix for showing "wine" applications (which quite often don't list a category, or have other differences) - if(DF.catList.isEmpty() && filePath.contains("/wine/")){ - DF.catList << "Wine"; //Internal Lumina category only (not in XDG specs as of 11/14/14) + if(DF->catList.isEmpty() && filePath.contains("/wine/")){ + DF->catList << "Wine"; //Internal Lumina category only (not in XDG specs as of 11/14/14) //Also add a fix for the location of Wine icons - if( !DF.icon.isEmpty() ){ + if( !DF->icon.isEmpty() ){ QStringList sizes; sizes << "256x256" << "128x128" << "64x64" << "48x48" << "32x32" << "16x16"; QString upath = QDir::homePath()+"/.local/share/icons/hicolor/%1/apps/%2.png"; //qDebug() << "Wine App: Check icon" << upath; for(int i=0; i<sizes.length(); i++){ - if( QFile::exists(upath.arg(sizes[i],DF.icon)) ){ - DF.icon = upath.arg(sizes[i],DF.icon); - //qDebug() << " - Found Icon:" << DF.icon; + if( QFile::exists(upath.arg(sizes[i],DF->icon)) ){ + DF->icon = upath.arg(sizes[i],DF->icon); + //qDebug() << " - Found Icon:" << DF->icon; break; } } @@ -324,9 +717,9 @@ XDGDesktop LXDG::loadDesktopFile(QString filePath, bool& ok){ //Return the structure ok = true; //was able to open/read the file - validity determined later return DF; -} +}*/ -bool LXDG::saveDesktopFile(XDGDesktop dFile, bool merge){ +/*bool LXDG::saveDesktopFile(XDGDesktop dFile, bool merge){ qDebug() << "Save Desktop File:" << dFile.filePath << "Merge:" << merge; bool autofile = dFile.filePath.contains("/autostart/"); //use the "Hidden" field instead of the "NoDisplay" int insertloc = -1; @@ -438,9 +831,9 @@ bool LXDG::saveDesktopFile(XDGDesktop dFile, bool merge){ //Now save the file return LUtils::writeFile(dFile.filePath, info, true); -} +}*/ -bool LXDG::checkValidity(XDGDesktop dFile, bool showAll){ +/*bool LXDG::checkValidity(XDGDesktop dFile, bool showAll){ bool ok=true; bool DEBUG = false; if(DEBUG){ qDebug() << "[LXDG] Check File validity:" << dFile.name << dFile.filePath; } @@ -472,7 +865,7 @@ bool LXDG::checkValidity(XDGDesktop dFile, bool showAll){ else if(dFile.name.isEmpty()){ ok = false; } } return ok; -} +}*/ bool LXDG::checkExec(QString exec){ //Return true(good) or false(bad) @@ -506,40 +899,43 @@ QStringList LXDG::systemApplicationDirs(){ return out; } -XDGDesktopList* LXDG::systemAppsList(){ +/*XDGDesktopList* LXDG::systemAppsList(){ static XDGDesktopList *sysapps = 0; if(sysapps == 0){ qDebug() << "Generating new apps list"; sysapps = new XDGDesktopList(0,true); }//set this to automatically update as needed if(sysapps->lastCheck.isNull()){ sysapps->updateList(); } //catch the first time the class was used, and prompt for an update right now return sysapps; -} +}*/ -QList<XDGDesktop> LXDG::systemDesktopFiles(bool showAll, bool showHidden){ - //Quick overload for backwards compatibility which uses the static/global class for managing app entries - return systemAppsList()->apps(showAll, showHidden); +QList<XDGDesktop*> LXDG::systemDesktopFiles(bool showAll, bool showHidden){ + //If this is going to be used regularly, it is better to use a custom instance of an XDGDesktopList() which self-updates instead. + // Since this function will need to re-read the entire system app registry every time. + XDGDesktopList sysapps; + sysapps.updateList(); + return sysapps.apps(showAll, showHidden); } -QHash<QString,QList<XDGDesktop> > LXDG::sortDesktopCats(QList<XDGDesktop> apps){ +QHash<QString,QList<XDGDesktop*> > LXDG::sortDesktopCats(QList<XDGDesktop*> apps){ //Sort the list of applications into their different categories (main categories only) //Create the category lists - QList<XDGDesktop> multimedia, dev, ed, game, graphics, network, office, science, settings, sys, utility, other, wine; + QList<XDGDesktop*> multimedia, dev, ed, game, graphics, network, office, science, settings, sys, utility, other, wine; //Sort the apps into the lists for(int i=0; i<apps.length(); i++){ - if(apps[i].catList.contains("AudioVideo")){ multimedia << apps[i]; } - else if(apps[i].catList.contains("Development")){ dev << apps[i]; } - else if(apps[i].catList.contains("Education")){ ed << apps[i]; } - else if(apps[i].catList.contains("Game")){ game << apps[i]; } - else if(apps[i].catList.contains("Graphics")){ graphics << apps[i]; } - else if(apps[i].catList.contains("Network")){ network << apps[i]; } - else if(apps[i].catList.contains("Office")){ office << apps[i]; } - else if(apps[i].catList.contains("Science")){ science << apps[i]; } - else if(apps[i].catList.contains("Settings")){ settings << apps[i]; } - else if(apps[i].catList.contains("System")){ sys << apps[i]; } - else if(apps[i].catList.contains("Utility")){ utility << apps[i]; } - else if(apps[i].catList.contains("Wine")){ wine << apps[i]; } + if(apps[i]->catList.contains("AudioVideo")){ multimedia << apps[i]; } + else if(apps[i]->catList.contains("Development")){ dev << apps[i]; } + else if(apps[i]->catList.contains("Education")){ ed << apps[i]; } + else if(apps[i]->catList.contains("Game")){ game << apps[i]; } + else if(apps[i]->catList.contains("Graphics")){ graphics << apps[i]; } + else if(apps[i]->catList.contains("Network")){ network << apps[i]; } + else if(apps[i]->catList.contains("Office")){ office << apps[i]; } + else if(apps[i]->catList.contains("Science")){ science << apps[i]; } + else if(apps[i]->catList.contains("Settings")){ settings << apps[i]; } + else if(apps[i]->catList.contains("System")){ sys << apps[i]; } + else if(apps[i]->catList.contains("Utility")){ utility << apps[i]; } + else if(apps[i]->catList.contains("Wine")){ wine << apps[i]; } else{ other << apps[i]; } } //Now create the output hash - QHash<QString,QList<XDGDesktop> > out; + QHash<QString,QList<XDGDesktop*> > out; if(!multimedia.isEmpty()){ out.insert("Multimedia", LXDG::sortDesktopNames(multimedia)); } if(!dev.isEmpty()){ out.insert("Development", LXDG::sortDesktopNames(dev)); } if(!ed.isEmpty()){ out.insert("Education", LXDG::sortDesktopNames(ed)); } @@ -575,23 +971,23 @@ QString LXDG::DesktopCatToIcon(QString cat){ return icon; } -QList<XDGDesktop> LXDG::sortDesktopNames(QList<XDGDesktop> apps){ +QList<XDGDesktop*> LXDG::sortDesktopNames(QList<XDGDesktop*> apps){ //Sort the list by name of the application - QHash<QString, XDGDesktop> sorter; + QHash<QString, XDGDesktop*> sorter; for(int i=0; i<apps.length(); i++){ - sorter.insert(apps[i].name.toLower(), apps[i]); + sorter.insert(apps[i]->name.toLower(), apps[i]); } QStringList keys = sorter.keys(); keys.sort(); //Re-assemble the output list - QList<XDGDesktop> out; + QList<XDGDesktop*> out; for(int i=0; i<keys.length(); i++){ out << sorter[keys[i]]; } return out; } -QString LXDG::getDesktopExec(XDGDesktop app, QString ActionID){ +/*QString LXDG::getDesktopExec(XDGDesktop app, QString ActionID){ //Generate the executable line for the application QString out; QString exec = app.exec; @@ -629,7 +1025,7 @@ QString LXDG::getDesktopExec(XDGDesktop app, QString ActionID){ } if(out.contains("%k")){ out.replace("%k", "\'"+app.filePath+"\'"); } return out; -} +}*/ void LXDG::setEnvironmentVars(){ //Set the default XDG environment variables if not already set @@ -1109,13 +1505,13 @@ QStringList LXDG::loadMimeFileGlobs2(){ } //Find all the autostart *.desktop files -QList<XDGDesktop> LXDG::findAutoStartFiles(bool includeInvalid){ +QList<XDGDesktop*> LXDG::findAutoStartFiles(bool includeInvalid){ //First get the list of directories to search (system first, user-provided files come later and overwrite sys files as needed) QStringList paths = QString(getenv("XDG_CONFIG_DIRS")).split(":"); paths << QString(getenv("XDG_CONFIG_HOME")).split(":"); //Now go through them and find any valid *.desktop files - QList<XDGDesktop> files; + QList<XDGDesktop*> files; QStringList filenames; //make it easy to see if this filename is an override QDir dir; for(int i=0;i<paths.length(); i++){ @@ -1123,23 +1519,23 @@ QList<XDGDesktop> LXDG::findAutoStartFiles(bool includeInvalid){ dir.cd(paths[i]+"/autostart"); QStringList tmp = dir.entryList(QStringList() << "*.desktop", QDir::Files, QDir::Name); for(int t=0; t<tmp.length(); t++){ - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(dir.absoluteFilePath(tmp[t]), ok); - if(!ok){ continue; } //could not read file + XDGDesktop *desk = new XDGDesktop(dir.absoluteFilePath(tmp[t])); + if(desk->type == XDGDesktop::BAD){ continue; } //could not read file //Now figure out what to do with it if(filenames.contains(tmp[t])){ //This is an overwrite of a lower-priority (system?) autostart file // find the other file int old = -1; for(int o=0; o<files.length(); o++){ - if(files[o].filePath.endsWith("/"+tmp[t])){ old = o; break; } //found it + if(files[o]->filePath.endsWith("/"+tmp[t])){ old = o; break; } //found it } - if(LXDG::checkValidity(desk, false)){ + if(desk->isValid(false)){ //Full override of the lower-priority file (might be replacing exec/tryexec fields) - files[old] = desk; + files.takeAt(old)->deleteLater(); + files.insert(old,desk); }else{ //Small override file (only the "Hidden" field listed in spec) - files[old].isHidden = desk.isHidden; //replace this value with the override + files[old]->isHidden = desk->isHidden; //replace this value with the override //files << desk; //still add this to the array (will be ignored/skipped later) } }else{ @@ -1153,18 +1549,17 @@ QList<XDGDesktop> LXDG::findAutoStartFiles(bool includeInvalid){ //Now filter the results by validity if desired if(!includeInvalid){ for(int i=0; i<files.length(); i++){ - if( !LXDG::checkValidity(files[i], false) || files[i].isHidden ){ + if( !files[i]->isValid(false) || files[i]->isHidden ){ //Invalid file - go ahead and remove it from the output list - files.removeAt(i); + files.takeAt(i)->deleteLater(); i--; } } } - return files; } -bool LXDG::setAutoStarted(bool autostart, XDGDesktop app){ +/*bool LXDG::setAutoStarted(bool autostart, XDGDesktop *app){ //First get the list of system directories to search (system first, user-provided files come later and overwrite sys files as needed) QStringList paths = QString(getenv("XDG_CONFIG_DIRS")).split(":"); QString upath = QString(getenv("XDG_CONFIG_HOME")).section(":",0,0); @@ -1177,12 +1572,12 @@ bool LXDG::setAutoStarted(bool autostart, XDGDesktop app){ } //Quick check/finish for user-defined files which are getting disabled (just remove the file) - if(app.filePath.startsWith(upath) && !autostart){ - return QFile::remove(app.filePath); + if(app->filePath.startsWith(upath) && !autostart){ + return QFile::remove(app->filePath); } bool sysfile = false; for(int i=0; i<paths.length(); i++){ - if(app.filePath.startsWith(paths[i]+"/autostart/") ){ + if(app->filePath.startsWith(paths[i]+"/autostart/") ){ sysfile = true; //Change it to the user-modifiable directory app.filePath = app.filePath.replace(paths[i]+"/autostart/", upath); @@ -1222,18 +1617,18 @@ bool LXDG::setAutoStarted(bool autostart, XDGDesktop app){ saved = LXDG::saveDesktopFile(app); } return saved; -} +}*/ bool LXDG::setAutoStarted(bool autostart, QString filePath){ //Convenience function for the auto-start setter - XDGDesktop desk; - if(filePath.endsWith(".desktop")){ - bool ok = false; - desk = LXDG::loadDesktopFile(filePath, ok); - if(!ok){ return false; } //error reading input file - }else{ + XDGDesktop desk(filePath); + if(!filePath.endsWith(".desktop")){ + //bool ok = false; + //desk = LXDG::loadDesktopFile(filePath, ok); + //if(!ok){ return false; } //error reading input file + //}else{ desk.filePath = filePath; desk.useTerminal = false; } - return LXDG::setAutoStarted(autostart, desk); + return desk.setAutoStarted(autostart); } diff --git a/src-qt5/core/libLumina/LuminaXDG.h b/src-qt5/core/libLumina/LuminaXDG.h index 5c012b9a..f2b1e3e2 100644 --- a/src-qt5/core/libLumina/LuminaXDG.h +++ b/src-qt5/core/libLumina/LuminaXDG.h @@ -46,8 +46,9 @@ struct XDGDesktopAction{ // ====================== // FreeDesktop Desktop Entry Framework (data structure) // ====================== -struct XDGDesktop{ -//public: +class XDGDesktop : public QObject{ + Q_OBJECT +public: enum XDGDesktopType { BAD, APP, LINK, DIR }; //Admin variables @@ -66,14 +67,18 @@ struct XDGDesktop{ //Type 2 (LINK) variables QString url; - //Constructor/destructor - XDGDesktop(){} - ~XDGDesktop(){ - actions.clear(); - showInList.clear(); notShowInList.clear(); actionList.clear(); mimeList.clear(); catList.clear(); keyList.clear(); - name.clear(); genericName.clear(); comment.clear(); icon.clear(); - exec.clear(); tryexec.clear(); path.clear(); startupWM.clear(); url.clear(); - } + //Constructor/destructor + XDGDesktop(QString filePath="", QObject *parent = 0); + ~XDGDesktop(){} + + //Functions for using this structure in various ways + void sync(); //syncronize this structure with the backend file(as listed in the "filePath" variable) + bool isValid(bool showAll = true); //See if this is a valid .desktop entry (showAll: don't filter out based on DE exclude/include lists) + + QString getDesktopExec(QString ActionID = ""); + bool saveDesktopFile(bool merge = true); //This will use the "filePath" variable for where to save the file + + bool setAutoStarted(bool autostart = true); }; // ======================== @@ -86,12 +91,12 @@ public: XDGDesktopList(QObject *parent = 0, bool watchdirs = false); ~XDGDesktopList(); //Main Interface functions - QList<XDGDesktop> apps(bool showAll, bool showHidden); //showAll: include invalid files, showHidden: include NoShow/Hidden files + QList<XDGDesktop*> apps(bool showAll, bool showHidden); //showAll: include invalid files, showHidden: include NoShow/Hidden files //Administration variables (not typically used directly) QDateTime lastCheck; QStringList newApps, removedApps; //list of "new/removed" apps found during the last check - QHash<QString, XDGDesktop> files; //<filepath>/<XDGDesktop structure> + QHash<QString, XDGDesktop*> files; //<filepath>/<XDGDesktop structure> public slots: void updateList(); //run the check routine @@ -114,7 +119,7 @@ signals: class LFileInfo : public QFileInfo{ private: QString mime, icon; - XDGDesktop desk; + XDGDesktop *desk; void loadExtraInfo(); @@ -122,7 +127,9 @@ public: //Couple overloaded contructors LFileInfo(QString filepath); LFileInfo(QFileInfo info); - ~LFileInfo(){} + ~LFileInfo(){ + desk->deleteLater(); + } //Functions for accessing the extra information // -- Return the mimetype for the file @@ -149,25 +156,25 @@ typedef QList<LFileInfo> LFileInfoList; class LXDG{ public: //Read/write a *.desktop file - static XDGDesktop loadDesktopFile(QString filePath, bool& ok); - static bool saveDesktopFile(XDGDesktop dFile, bool merge = true); + //static XDGDesktop* loadDesktopFile(QString filepath, bool&ok, QObject *parent = 0); + //static bool saveDesktopFile(XDGDesktop *dFile, bool merge = true); //Check a *.desktop file for validity (showAll skips the DE-exclusivity checks) - static bool checkValidity(XDGDesktop dFile, bool showAll = true); + //static bool checkValidity(XDGDesktop *dFile, bool showAll = true); //Check for a valid executable static bool checkExec(QString exec); //Get a list of all the directories where *.desktop files exist static QStringList systemApplicationDirs(); //Get a list of all the *.desktop files available on the system - static XDGDesktopList* systemAppsList(); //return a pointer to the entire class - static QList<XDGDesktop> systemDesktopFiles(bool showAll = false, bool showHidden = false); //simplification for getting just the files + //static XDGDesktopList* systemAppsList(); //return a pointer to the entire class + static QList<XDGDesktop*> systemDesktopFiles(bool showAll = false, bool showHidden = false); //simplification for getting just the files //Sort a list of Desktop files into the proper categories - static QHash< QString, QList<XDGDesktop> > sortDesktopCats(QList<XDGDesktop> apps); + static QHash< QString, QList<XDGDesktop*> > sortDesktopCats(QList<XDGDesktop*> apps); //Return the icon to use for the given category static QString DesktopCatToIcon(QString cat); //Sort a list of Desktop files by name - static QList<XDGDesktop> sortDesktopNames(QList<XDGDesktop> apps); + static QList<XDGDesktop*> sortDesktopNames(QList<XDGDesktop*> apps); //Get the executable line from a Desktop file - static QString getDesktopExec(XDGDesktop app, QString ActionID = ""); + //static QString getDesktopExec(XDGDesktop *app, QString ActionID = ""); //Set all the default XDG Environment variables static void setEnvironmentVars(); //Find an icon from the current/default theme @@ -198,8 +205,8 @@ public: static QStringList loadMimeFileGlobs2(); //Find all the autostart *.desktop files - static QList<XDGDesktop> findAutoStartFiles(bool includeInvalid = false); - static bool setAutoStarted(bool autostart, XDGDesktop app); + static QList<XDGDesktop*> findAutoStartFiles(bool includeInvalid = false); + //static bool setAutoStarted(bool autostart, XDGDesktop *app); static bool setAutoStarted(bool autostart, QString filePath); //for convenience }; diff --git a/src-qt5/core/lumina-desktop/AppMenu.cpp b/src-qt5/core/lumina-desktop/AppMenu.cpp index cbf71e62..798d8b6d 100644 --- a/src-qt5/core/lumina-desktop/AppMenu.cpp +++ b/src-qt5/core/lumina-desktop/AppMenu.cpp @@ -11,6 +11,7 @@ AppMenu::AppMenu(QWidget* parent) : QMenu(parent){ appstorelink = LOS::AppStoreShortcut(); //Default application "store" to display (AppCafe in TrueOS) controlpanellink = LOS::ControlPanelShortcut(); //Default control panel + sysApps = new XDGDesktopList(this, true); //have this one automatically keep in sync APPS.clear(); //watcher = new QFileSystemWatcher(this); //connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherUpdate()) ); @@ -24,7 +25,7 @@ AppMenu::~AppMenu(){ } -QHash<QString, QList<XDGDesktop> >* AppMenu::currentAppHash(){ +QHash<QString, QList<XDGDesktop*> >* AppMenu::currentAppHash(){ return &APPS; } @@ -38,8 +39,7 @@ void AppMenu::updateAppList(){ this->setIcon( LXDG::findIcon("system-run","") ); //Now update the lists this->clear(); - APPS.clear(); - XDGDesktopList *sysApps = LXDG:: systemAppsList(); + APPS.clear(); //NOTE: Don't delete these pointers - the pointers are managed by the sysApps class and these are just references to them //qDebug() << "New Apps List:"; if(LSession::handle()->sessionSettings()->value("AutomaticDesktopAppLinks",true).toBool() && !lastHashUpdate.isNull() ){ QString desktop = QDir::homePath()+"/"+tr("Desktop")+"/"; //translated desktop folder @@ -60,8 +60,8 @@ void AppMenu::updateAppList(){ } tmp = sysApps->newApps; for(int i=0; i<tmp.length() && !desktop.isEmpty(); i++){ - XDGDesktop desk = sysApps->files.value(tmp[i]); - if(desk.isHidden || !LXDG::checkValidity(desk, false) ){ continue; } //skip this one + XDGDesktop *desk = sysApps->files.value(tmp[i]); + if(desk->isHidden || !desk->isValid(false) ){ continue; } //skip this one //qDebug() << "New App: " << tmp[i] << desk.filePath << "Hidden:" << desk.isHidden; //Create a new symlink for this file if one does not exist QString filename = tmp[i].section("/",-1); @@ -69,23 +69,22 @@ void AppMenu::updateAppList(){ if(!QFile::exists(desktop+filename) ){ QFile::link(tmp[i], desktop+filename); } } } - QList<XDGDesktop> allfiles = sysApps->apps(false,false); //only valid, non-hidden apps + QList<XDGDesktop*> allfiles = sysApps->apps(false,false); //only valid, non-hidden apps APPS = LXDG::sortDesktopCats(allfiles); APPS.insert("All", LXDG::sortDesktopNames(allfiles)); lastHashUpdate = QDateTime::currentDateTime(); //Now fill the menu - bool ok; //for checking inputs //Add link to the file manager //this->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files"), this, SLOT(launchFileManager()) ); //--Look for the app store - XDGDesktop store = LXDG::loadDesktopFile(appstorelink, ok); - if(ok){ + XDGDesktop store(appstorelink); + if(store.isValid()){ this->addAction( LXDG::findIcon(store.icon, ""), tr("Manage Applications"), this, SLOT(launchStore()) ); } //--Look for the control panel - store = LXDG::loadDesktopFile(controlpanellink, ok); - if(ok){ - this->addAction( LXDG::findIcon(store.icon, ""), tr("Control Panel"), this, SLOT(launchControlPanel()) ); + XDGDesktop controlp(controlpanellink); + if(controlp.isValid()){ + this->addAction( LXDG::findIcon(controlp.icon, ""), tr("Control Panel"), this, SLOT(launchControlPanel()) ); } this->addSeparator(); //--Now create the sub-menus @@ -112,29 +111,29 @@ void AppMenu::updateAppList(){ QMenu *menu = new QMenu(name, this); menu->setIcon(LXDG::findIcon(icon,"")); connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(launchApp(QAction*)) ); - QList<XDGDesktop> appL = APPS.value(cats[i]); + QList<XDGDesktop*> appL = APPS.value(cats[i]); for( int a=0; a<appL.length(); a++){ - if(appL[a].actions.isEmpty()){ + if(appL[a]->actions.isEmpty()){ //Just a single entry point - no extra actions - QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, this); - act->setToolTip(appL[a].comment); - act->setWhatsThis(appL[a].filePath); + QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, this); + act->setToolTip(appL[a]->comment); + act->setWhatsThis(appL[a]->filePath); menu->addAction(act); }else{ //This app has additional actions - make this a sub menu // - first the main menu/action - QMenu *submenu = new QMenu(appL[a].name, this); - submenu->setIcon( LXDG::findIcon(appL[a].icon,"") ); + QMenu *submenu = new QMenu(appL[a]->name, this); + submenu->setIcon( LXDG::findIcon(appL[a]->icon,"") ); //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu) - QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, this); - act->setToolTip(appL[a].comment); - act->setWhatsThis(appL[a].filePath); + QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, this); + act->setToolTip(appL[a]->comment); + act->setWhatsThis(appL[a]->filePath); submenu->addAction(act); //Now add entries for every sub-action listed - for(int sa=0; sa<appL[a].actions.length(); sa++){ - QAction *sact = new QAction(LXDG::findIcon(appL[a].actions[sa].icon, appL[a].icon), appL[a].actions[sa].name, this); - sact->setToolTip(appL[a].comment); - sact->setWhatsThis("-action \""+appL[a].actions[sa].ID+"\" \""+appL[a].filePath+"\""); + for(int sa=0; sa<appL[a]->actions.length(); sa++){ + QAction *sact = new QAction(LXDG::findIcon(appL[a]->actions[sa].icon, appL[a]->icon), appL[a]->actions[sa].name, this); + sact->setToolTip(appL[a]->comment); + sact->setWhatsThis("-action \""+appL[a]->actions[sa].ID+"\" \""+appL[a]->filePath+"\""); submenu->addAction(sact); } menu->addMenu(submenu); @@ -151,7 +150,8 @@ void AppMenu::updateAppList(){ //================= void AppMenu::start(){ //Setup the watcher - connect(LXDG:: systemAppsList(), SIGNAL(appsUpdated()), this, SLOT(watcherUpdate()) ); + connect(sysApps, SIGNAL(appsUpdated()), this, SLOT(watcherUpdate()) ); + sysApps->updateList(); //Now fill the menu the first time updateAppList(); } diff --git a/src-qt5/core/lumina-desktop/AppMenu.h b/src-qt5/core/lumina-desktop/AppMenu.h index 7584de07..5baaab7a 100644 --- a/src-qt5/core/lumina-desktop/AppMenu.h +++ b/src-qt5/core/lumina-desktop/AppMenu.h @@ -31,14 +31,15 @@ public: AppMenu(QWidget *parent = 0); ~AppMenu(); - QHash<QString, QList<XDGDesktop> > *currentAppHash(); + QHash<QString, QList<XDGDesktop*> > *currentAppHash(); QDateTime lastHashUpdate; private: //QFileSystemWatcher *watcher; QString appstorelink, controlpanellink; QList<QMenu> MLIST; - QHash<QString, QList<XDGDesktop> > APPS; + XDGDesktopList *sysApps; + QHash<QString, QList<XDGDesktop*> > APPS; void updateAppList(); //completely update the menu lists diff --git a/src-qt5/core/lumina-desktop/LDesktop.cpp b/src-qt5/core/lumina-desktop/LDesktop.cpp index e3d946d4..f1b73bc0 100644 --- a/src-qt5/core/lumina-desktop/LDesktop.cpp +++ b/src-qt5/core/lumina-desktop/LDesktop.cpp @@ -280,9 +280,8 @@ void LDesktop::UpdateMenu(bool fast){ else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ //Custom *.desktop application QString file = items[i].section("::::",1,1).simplified(); - bool ok = false; - XDGDesktop xdgf = LXDG::loadDesktopFile(file, ok); - if(ok){ + XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); + if(xdgf.type!=XDGDesktop::BAD){ deskMenu->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis(file); }else{ qDebug() << "Could not load application file:" << file; diff --git a/src-qt5/core/lumina-desktop/SettingsMenu.cpp b/src-qt5/core/lumina-desktop/SettingsMenu.cpp index 10ada2cf..80ef3042 100644 --- a/src-qt5/core/lumina-desktop/SettingsMenu.cpp +++ b/src-qt5/core/lumina-desktop/SettingsMenu.cpp @@ -45,9 +45,8 @@ void SettingsMenu::UpdateMenu(){ QString CONTROLPANEL = LOS::ControlPanelShortcut(); if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){ //Now load the info - bool ok = false; - XDGDesktop cpan = LXDG::loadDesktopFile(CONTROLPANEL, ok); - if(ok){ + XDGDesktop cpan(CONTROLPANEL); + if(cpan.isValid()){ act = new QAction( LXDG::findIcon(cpan.icon,""), tr("Control Panel"), this); act->setWhatsThis("lumina-open \""+CONTROLPANEL+"\""); this->addAction(act); diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp index 8c7af5e9..bd8e79db 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp +++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp @@ -38,8 +38,9 @@ void AppLauncherPlugin::loadButton(){ button->setIconSize( QSize(icosize,icosize) ); QString txt; if(path.endsWith(".desktop") && ok){ - XDGDesktop file = LXDG::loadDesktopFile(path, ok); - if(path.isEmpty() || !QFile::exists(path) || !ok){ + XDGDesktop file(path); + ok = file.isValid(); + if(!ok){ button->setWhatsThis(""); button->setIcon( QIcon(LXDG::findIcon("quickopen-file","").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); txt = tr("Click to Set"); @@ -125,13 +126,13 @@ void AppLauncherPlugin::buttonClicked(){ QString path = button->whatsThis(); if(path.isEmpty() || !QFile::exists(path) ){ //prompt for the user to select an application - QList<XDGDesktop> apps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); + QList<XDGDesktop*> apps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); QStringList names; - for(int i=0; i<apps.length(); i++){ names << apps[i].name; } + for(int i=0; i<apps.length(); i++){ names << apps[i]->name; } bool ok = false; QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok); if(!ok || names.indexOf(app)<0){ return; } //cancelled - this->saveSetting("applicationpath", apps[ names.indexOf(app) ].filePath); + this->saveSetting("applicationpath", apps[ names.indexOf(app) ]->filePath); QTimer::singleShot(0,this, SLOT(loadButton())); }else{ LSession::LaunchApplication("lumina-open \""+path+"\""); diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp index 01e174e9..90f3374b 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp +++ b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp @@ -149,9 +149,8 @@ void DesktopViewPlugin::updateContents(){ it->setIcon( LXDG::findIcon("folder","") ); txt = files[i].fileName(); }else if(files[i].suffix() == "desktop" ){ - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(files[i].absoluteFilePath(), ok); - if(ok){ + XDGDesktop desk(files[i].absoluteFilePath()); + if(desk.isValid()){ it->setIcon( LXDG::findIcon(desk.icon,"unknown") ); if(desk.name.isEmpty()){ txt = files[i].fileName(); diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts index 677f3cee..2c46c490 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE TS> <TS version="2.1" language="sv"> <context> <name>AppLaunchButtonPlugin</name> <message> - <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="32"/> + <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="32"></location> <source>Click to assign an application</source> <translation>Klicka här för att tilldela ett program</translation> </message> <message> - <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="38"/> + <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="38"></location> <source>Launch %1</source> <translation>Starta %1</translation> </message> <message> - <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="45"/> + <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="45"></location> <source>Open %1</source> <translation>Öppna %1</translation> </message> <message> - <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="63"/> + <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="63"></location> <source>Select Application</source> <translation>Välj program</translation> </message> <message> - <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="63"/> + <location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="63"></location> <source>Name:</source> <translation>Namn:</translation> </message> @@ -32,18 +32,18 @@ <context> <name>AppLauncherPlugin</name> <message> - <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="45"/> - <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="71"/> + <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="45"></location> + <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="71"></location> <source>Click to Set</source> <translation>Klicka för att tilldela</translation> </message> <message> - <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/> + <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"></location> <source>Select Application</source> <translation>Välj program</translation> </message> <message> - <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/> + <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"></location> <source>Name:</source> <translation>Namn:</translation> </message> @@ -51,87 +51,87 @@ <context> <name>AppMenu</name> <message> - <location filename="../AppMenu.cpp" line="45"/> + <location filename="../AppMenu.cpp" line="45"></location> <source>Desktop</source> - <translation type="unfinished">Skrivbord</translation> + <translation>Skrivbord</translation> </message> <message> - <location filename="../AppMenu.cpp" line="83"/> + <location filename="../AppMenu.cpp" line="83"></location> <source>Manage Applications</source> <translation>Hantera program</translation> </message> <message> - <location filename="../AppMenu.cpp" line="88"/> + <location filename="../AppMenu.cpp" line="88"></location> <source>Control Panel</source> <translation>Kontrollpanel</translation> </message> <message> - <location filename="../AppMenu.cpp" line="98"/> + <location filename="../AppMenu.cpp" line="98"></location> <source>Multimedia</source> <translation>Multimedia</translation> </message> <message> - <location filename="../AppMenu.cpp" line="99"/> + <location filename="../AppMenu.cpp" line="99"></location> <source>Development</source> <translation>Utveckling</translation> </message> <message> - <location filename="../AppMenu.cpp" line="100"/> + <location filename="../AppMenu.cpp" line="100"></location> <source>Education</source> <translation>Utbildning</translation> </message> <message> - <location filename="../AppMenu.cpp" line="101"/> + <location filename="../AppMenu.cpp" line="101"></location> <source>Games</source> <translation>Spel</translation> </message> <message> - <location filename="../AppMenu.cpp" line="102"/> + <location filename="../AppMenu.cpp" line="102"></location> <source>Graphics</source> <translation>Grafik</translation> </message> <message> - <location filename="../AppMenu.cpp" line="103"/> + <location filename="../AppMenu.cpp" line="103"></location> <source>Network</source> <translation>Nätverk</translation> </message> <message> - <location filename="../AppMenu.cpp" line="104"/> + <location filename="../AppMenu.cpp" line="104"></location> <source>Office</source> <translation>Kontorsprogram</translation> </message> <message> - <location filename="../AppMenu.cpp" line="105"/> + <location filename="../AppMenu.cpp" line="105"></location> <source>Science</source> <translation>Vetenskap</translation> </message> <message> - <location filename="../AppMenu.cpp" line="106"/> + <location filename="../AppMenu.cpp" line="106"></location> <source>Settings</source> <translation>Inställningar</translation> </message> <message> - <location filename="../AppMenu.cpp" line="107"/> + <location filename="../AppMenu.cpp" line="107"></location> <source>System</source> <translation>System</translation> </message> <message> - <location filename="../AppMenu.cpp" line="108"/> + <location filename="../AppMenu.cpp" line="108"></location> <source>Utility</source> <translation>Verktyg</translation> </message> <message> - <location filename="../AppMenu.cpp" line="109"/> + <location filename="../AppMenu.cpp" line="109"></location> <source>Wine</source> <translation>Wine</translation> </message> <message> - <location filename="../AppMenu.cpp" line="110"/> + <location filename="../AppMenu.cpp" line="110"></location> <source>Unsorted</source> <translation>Osorterade</translation> </message> <message> - <location filename="../AppMenu.cpp" line="37"/> + <location filename="../AppMenu.cpp" line="37"></location> <source>Applications</source> <translation>Program</translation> </message> @@ -139,57 +139,57 @@ <context> <name>BootSplash</name> <message> - <location filename="../BootSplash.ui" line="14"/> + <location filename="../BootSplash.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../BootSplash.cpp" line="18"/> + <location filename="../BootSplash.cpp" line="18"></location> <source>Initializing Session …</source> <translation>Initierar session …</translation> </message> <message> - <location filename="../BootSplash.cpp" line="21"/> + <location filename="../BootSplash.cpp" line="21"></location> <source>Loading System Settings …</source> <translation>Laddar systeminställningar ...</translation> </message> <message> - <location filename="../BootSplash.cpp" line="24"/> + <location filename="../BootSplash.cpp" line="24"></location> <source>Loading User Preferences …</source> <translation>Laddar användarinställningar …</translation> </message> <message> - <location filename="../BootSplash.cpp" line="27"/> + <location filename="../BootSplash.cpp" line="27"></location> <source>Preparing System Tray …</source> <translation>Förbereder System bricka…</translation> </message> <message> - <location filename="../BootSplash.cpp" line="30"/> + <location filename="../BootSplash.cpp" line="30"></location> <source>Starting Window Manager …</source> <translation>Startar fönsterhanterare …</translation> </message> <message> - <location filename="../BootSplash.cpp" line="33"/> + <location filename="../BootSplash.cpp" line="33"></location> <source>Detecting Applications …</source> <translation>Upptäcker program…</translation> </message> <message> - <location filename="../BootSplash.cpp" line="36"/> + <location filename="../BootSplash.cpp" line="36"></location> <source>Preparing Menus …</source> <translation>Förbereder menyer…</translation> </message> <message> - <location filename="../BootSplash.cpp" line="39"/> + <location filename="../BootSplash.cpp" line="39"></location> <source>Preparing Workspace …</source> <translation>Förbereder arbetsytor…</translation> </message> <message> - <location filename="../BootSplash.cpp" line="42"/> + <location filename="../BootSplash.cpp" line="42"></location> <source>Finalizing …</source> <translation>Slutför…</translation> </message> <message> - <location filename="../BootSplash.cpp" line="45"/> + <location filename="../BootSplash.cpp" line="45"></location> <source>Starting App: %1</source> <translation>Startar program: %1</translation> </message> @@ -197,37 +197,37 @@ <context> <name>DesktopViewPlugin</name> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="28"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="28"></location> <source>Open</source> <translation>Öppna</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="30"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="30"></location> <source>Cut</source> <translation>Klipp ut</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="31"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="31"></location> <source>Copy</source> <translation>Kopiera</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="33"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="33"></location> <source>Increase Icons</source> <translation>Förstora ikoner</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="34"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="34"></location> <source>Decrease Icons</source> <translation>Förminska ikoner</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="36"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="36"></location> <source>Delete</source> <translation>Ta bort</translation> </message> <message> - <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="39"/> + <location filename="../desktop-plugins/desktopview/DesktopViewPlugin.cpp" line="39"></location> <source>Properties</source> <translation>Egenskaper</translation> </message> @@ -235,32 +235,32 @@ <context> <name>ItemWidget</name> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="39"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="39"></location> <source>Go Back</source> <translation>Gå bakåt</translation> </message> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="161"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="161"></location> <source>Pin to Desktop</source> <translation>Fäst på skrivbordet</translation> </message> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="165"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="165"></location> <source>Remove from Favorites</source> <translation>Ta bort från favoriter</translation> </message> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="168"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="168"></location> <source>Add to Favorites</source> <translation>Lägg till i favoriter</translation> </message> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="172"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="172"></location> <source>Remove from Quicklaunch</source> <translation>Ta bort från Snabbstart</translation> </message> <message> - <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="175"/> + <location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="175"></location> <source>Add to Quicklaunch</source> <translation>Lägg till i Snabbstart</translation> </message> @@ -268,7 +268,7 @@ <context> <name>JsonMenu</name> <message> - <location filename="../JsonMenu.h" line="60"/> + <location filename="../JsonMenu.h" line="60"></location> <source>Error parsing script output: %1</source> <translation>Fel vid skriptanalysutmatning: %1</translation> </message> @@ -276,97 +276,97 @@ <context> <name>LAppMenuPlugin</name> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="37"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="37"></location> <source>Quickly launch applications or open files</source> <translation>Snabbt starta program eller öppna filer</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="38"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="38"></location> <source>Applications</source> <translation>Program</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="69"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="69"></location> <source>Browse Files</source> <translation>Bläddra bland filer</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="74"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="74"></location> <source>Install Applications</source> <translation>Installera program</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="80"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="80"></location> <source>Control Panel</source> <translation>Kontrollpanel</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="91"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="91"></location> <source>Multimedia</source> <translation>Multimedia</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="92"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="92"></location> <source>Development</source> <translation>Utveckling</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="93"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="93"></location> <source>Education</source> <translation>Utbildning</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="94"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="94"></location> <source>Games</source> <translation>Spel</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="95"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="95"></location> <source>Graphics</source> <translation>Grafik</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="96"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="96"></location> <source>Network</source> <translation>Nätverk</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="97"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="97"></location> <source>Office</source> <translation>Kontorsprogram</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="98"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="98"></location> <source>Science</source> <translation>Vetenskap</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="99"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="99"></location> <source>Settings</source> <translation>Inställningar</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="100"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="100"></location> <source>System</source> <translation>System</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="101"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="101"></location> <source>Utility</source> <translation>Verktyg</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="102"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="102"></location> <source>Wine</source> <translation>Wine</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="103"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="103"></location> <source>Unsorted</source> <translation>Osorterade</translation> </message> <message> - <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="140"/> + <location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="140"></location> <source>Leave</source> <translation>Lämna</translation> </message> @@ -374,12 +374,12 @@ <context> <name>LBattery</name> <message> - <location filename="../panel-plugins/battery/LBattery.cpp" line="83"/> + <location filename="../panel-plugins/battery/LBattery.cpp" line="83"></location> <source>%1 % (Charging)</source> <translation>%1 % (Laddar)</translation> </message> <message> - <location filename="../panel-plugins/battery/LBattery.cpp" line="84"/> + <location filename="../panel-plugins/battery/LBattery.cpp" line="84"></location> <source>%1 % (%2 Remaining)</source> <translation>%1 % (%2 Återstår)</translation> </message> @@ -387,12 +387,12 @@ <context> <name>LClock</name> <message> - <location filename="../panel-plugins/clock/LClock.cpp" line="121"/> + <location filename="../panel-plugins/clock/LClock.cpp" line="121"></location> <source>Time Zone (%1)</source> <translation>Tidszon (%1)</translation> </message> <message> - <location filename="../panel-plugins/clock/LClock.cpp" line="143"/> + <location filename="../panel-plugins/clock/LClock.cpp" line="143"></location> <source>Use System Time</source> <translation>Använd systemtid</translation> </message> @@ -400,27 +400,27 @@ <context> <name>LDPlugin</name> <message> - <location filename="../desktop-plugins/LDPlugin.cpp" line="36"/> + <location filename="../desktop-plugins/LDPlugin.cpp" line="36"></location> <source>Start Moving Item</source> <translation>Börja flytta objekt</translation> </message> <message> - <location filename="../desktop-plugins/LDPlugin.cpp" line="37"/> + <location filename="../desktop-plugins/LDPlugin.cpp" line="37"></location> <source>Start Resizing Item</source> <translation>Börja ändra storlek på objekt</translation> </message> <message> - <location filename="../desktop-plugins/LDPlugin.cpp" line="39"/> + <location filename="../desktop-plugins/LDPlugin.cpp" line="39"></location> <source>Increase Item Sizes</source> <translation>Öka storlek på objekt</translation> </message> <message> - <location filename="../desktop-plugins/LDPlugin.cpp" line="40"/> + <location filename="../desktop-plugins/LDPlugin.cpp" line="40"></location> <source>Decrease Item Sizes</source> <translation>Minska storlek på objekt</translation> </message> <message> - <location filename="../desktop-plugins/LDPlugin.cpp" line="42"/> + <location filename="../desktop-plugins/LDPlugin.cpp" line="42"></location> <source>Remove Item</source> <translation>Ta bort objekt</translation> </message> @@ -428,42 +428,42 @@ <context> <name>LDeskBarPlugin</name> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="194"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="194"></location> <source>Favorite Applications</source> <translation>Favoritprogram</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="196"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="196"></location> <source>Favorite Folders</source> <translation>Favoritmappar</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="197"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="197"></location> <source>Audio</source> <translation>Ljud</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="199"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="199"></location> <source>Video</source> <translation>Video</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="201"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="201"></location> <source>Pictures</source> <translation>Bilder</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="203"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="203"></location> <source>Other Files</source> <translation>Andra filer</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="205"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="205"></location> <source>Documents</source> <translation>Dokument</translation> </message> <message> - <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="208"/> + <location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="208"></location> <source>Favorite Files</source> <translation>Favoritfiler</translation> </message> @@ -471,32 +471,32 @@ <context> <name>LDesktop</name> <message> - <location filename="../LDesktop.cpp" line="198"/> + <location filename="../LDesktop.cpp" line="198"></location> <source>Window List</source> <translation>Fönsterlista</translation> </message> <message> - <location filename="../LDesktop.cpp" line="263"/> + <location filename="../LDesktop.cpp" line="263"></location> <source>Lumina Desktop</source> <translation>Lumina Skrivbordet</translation> </message> <message> - <location filename="../LDesktop.cpp" line="264"/> + <location filename="../LDesktop.cpp" line="264"></location> <source>Workspace %1</source> <translation>Arbetsyta %1</translation> </message> <message> - <location filename="../LDesktop.cpp" line="274"/> + <location filename="../LDesktop.cpp" line="274"></location> <source>Terminal</source> <translation>Terminal</translation> </message> <message> - <location filename="../LDesktop.cpp" line="275"/> + <location filename="../LDesktop.cpp" line="275"></location> <source>Browse Files</source> <translation>Bläddra bland filer</translation> </message> <message> - <location filename="../LDesktop.cpp" line="305"/> + <location filename="../LDesktop.cpp" line="305"></location> <source>Leave</source> <translation>Lämna</translation> </message> @@ -504,8 +504,8 @@ <context> <name>LDesktopSwitcher</name> <message> - <location filename="../panel-plugins/desktopswitcher/LDesktopSwitcher.cpp" line="132"/> - <location filename="../panel-plugins/desktopswitcher/LDesktopSwitcher.cpp" line="140"/> + <location filename="../panel-plugins/desktopswitcher/LDesktopSwitcher.cpp" line="132"></location> + <location filename="../panel-plugins/desktopswitcher/LDesktopSwitcher.cpp" line="140"></location> <source>Workspace %1</source> <translation>Arbetsyta %1</translation> </message> @@ -513,7 +513,7 @@ <context> <name>LQuickLaunchButton</name> <message> - <location filename="../panel-plugins/systemstart/LStartButton.h" line="51"/> + <location filename="../panel-plugins/systemstart/LStartButton.h" line="51"></location> <source>Remove from Quicklaunch</source> <translation>Ta bort från Snabbstart</translation> </message> @@ -521,8 +521,8 @@ <context> <name>LSession</name> <message> - <location filename="../LSession.cpp" line="158"/> - <location filename="../LSession.cpp" line="326"/> + <location filename="../LSession.cpp" line="158"></location> + <location filename="../LSession.cpp" line="326"></location> <source>Desktop</source> <translation>Skrivbord</translation> </message> @@ -530,7 +530,7 @@ <context> <name>LSysDashboard</name> <message> - <location filename="../panel-plugins/systemdashboard/LSysDashboard.cpp" line="43"/> + <location filename="../panel-plugins/systemdashboard/LSysDashboard.cpp" line="43"></location> <source>System Dashboard</source> <translation>Systemets instrumentpanel</translation> </message> @@ -538,54 +538,54 @@ <context> <name>LSysMenuQuick</name> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="14"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="50"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="50"></location> <source>System Volume</source> <translation>Systemvolym</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="111"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="111"></location> <source>Launch Audio Mixer</source> <translation>Starta ljudmixer</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="156"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="156"></location> <source>Screen Brightness</source> <translation>Skärmljusstyrka</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="231"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="231"></location> <source>Battery Status</source> <translation>Batteristatus</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="296"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="296"></location> <source>Workspace</source> <translation>Arbetsyta</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="344"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="344"></location> <source>Locale</source> <translation>Språkvariant</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="378"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="378"></location> <source>Log Out</source> <translation>Logga ut</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="102"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="102"></location> <source>connected</source> <translation>ansluten</translation> </message> <message> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="120"/> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="167"/> - <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="176"/> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="120"></location> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="167"></location> + <location filename="../panel-plugins/systemdashboard/SysMenuQuick.cpp" line="176"></location> <source>%1 of %2</source> <translation>%1 av %2</translation> </message> @@ -593,42 +593,42 @@ <context> <name>LTaskButton</name> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="149"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="149"></location> <source>Activate Window</source> <translation>Aktivera fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="152"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="152"></location> <source>Minimize Window</source> <translation>Minimera fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="154"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="154"></location> <source>Restore Window</source> <translation>Återställ fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="156"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="156"></location> <source>Maximize Window</source> <translation>Maximera fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="159"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="159"></location> <source>Close Window</source> <translation>Stäng fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="162"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="162"></location> <source>Show All Windows</source> <translation>Visa alla fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="163"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="163"></location> <source>Minimize All Windows</source> <translation>Minimera alla fönster</translation> </message> <message> - <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="164"/> + <location filename="../panel-plugins/taskmanager/LTaskButton.cpp" line="164"></location> <source>Close All Windows</source> <translation>Stäng alla fönster</translation> </message> @@ -636,7 +636,7 @@ <context> <name>LUserButtonPlugin</name> <message> - <location filename="../panel-plugins/userbutton/LUserButton.cpp" line="41"/> + <location filename="../panel-plugins/userbutton/LUserButton.cpp" line="41"></location> <source>Quickly launch applications or open files</source> <translation>Starta snabbt ett program eller öppna filer</translation> </message> @@ -644,32 +644,32 @@ <context> <name>MonitorWidget</name> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="14"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="36"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="36"></location> <source>Summary</source> <translation>Sammanfattning</translation> </message> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="42"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="42"></location> <source>CPU Temp:</source> <translation>CPU Temp:</translation> </message> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="56"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="56"></location> <source>CPU Usage:</source> <translation>Processoranvändning:</translation> </message> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="70"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="70"></location> <source>Mem Usage:</source> <translation>Minnesanvändning:</translation> </message> <message> - <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="85"/> + <location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="85"></location> <source>Disk I/O</source> <translation>Disk-I/O</translation> </message> @@ -677,52 +677,52 @@ <context> <name>NotePadPlugin</name> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="97"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="97"></location> <source>Note Files (*.note)</source> <translation>Anteckningsfiler (*.note)</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="97"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="97"></location> <source>Text Files (*)</source> <translation>Textfiler (*)</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="98"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="98"></location> <source>Open a note file</source> <translation>Öppna en anteckningsfil</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="135"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="135"></location> <source>Name:</source> <translation>Namn:</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="137"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="137"></location> <source>Invalid Note Name: Try Again</source> <translation>Ogiltigt anteckningsnamn: Försök igen</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="138"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="138"></location> <source>Select a Note Name</source> <translation>Välj ett anteckningsnamn</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="165"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="165"></location> <source>Open Text File</source> <translation>Öppna textfil</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="166"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="166"></location> <source>Create a Note</source> <translation>Skapa en anteckning</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="169"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="169"></location> <source>Rename Note</source> <translation>Byt namn på anteckning</translation> </message> <message> - <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="170"/> + <location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="170"></location> <source>Delete Note</source> <translation>Ta bort anteckning</translation> </message> @@ -730,57 +730,57 @@ <context> <name>PlayerWidget</name> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.ui" line="14"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="67"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="67"></location> <source>Clear Playlist</source> <translation>Rensa spellista</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="68"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="68"></location> <source>Shuffle Playlist</source> <translation>Blanda spellista</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="70"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="70"></location> <source>Add Files</source> <translation>Lägg till filer</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="71"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="71"></location> <source>Add Directory</source> <translation>Lägg till katalog</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="72"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="72"></location> <source>Add URL</source> <translation>Lägg till URL</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="100"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="100"></location> <source>Multimedia Files</source> <translation>Multimediafiler</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="101"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="101"></location> <source>Select Multimedia Files</source> <translation>Välj multimediafiler</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="128"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="128"></location> <source>Select Multimedia Directory</source> <translation>Välj multimediakatalog</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="157"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="157"></location> <source>Enter a valid URL for a multimedia file or stream:</source> <translation>Ange en giltig URL för en multimediafil eller ström:</translation> </message> <message> - <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="159"/> + <location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="159"></location> <source>Multimedia URL</source> <translation>Multimedia URL</translation> </message> @@ -788,155 +788,155 @@ <context> <name>RSSFeedPlugin</name> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="14"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="62"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="62"></location> <source>View Options</source> <translation>Visa alternativ</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="89"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="89"></location> <source>Open Website</source> <translation>Öppna webbsida</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="92"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="92"></location> <source>More</source> <translation>Mer</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="154"/> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="245"/> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="391"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="154"></location> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="245"></location> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="391"></location> <source>Back to Feeds</source> <translation>Tillbaka till flöden</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="172"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="172"></location> <source>Feed Information</source> <translation>Flödets Information</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="212"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="212"></location> <source>Remove Feed</source> <translation>Ta bort flöde</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="263"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="263"></location> <source>New Feed Subscription</source> <translation>Ny Prenumeration på RSS-flöde</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="287"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="287"></location> <source>RSS URL</source> <translation>RSS URL</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="302"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="302"></location> <source>Load a preset RSS Feed</source> <translation>Ladda ett förinställt RSS-flöde</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="332"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="332"></location> <source>Add to Feeds</source> <translation>Lägg till RSS-flöden</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="409"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="409"></location> <source>Feed Reader Settings</source> <translation>RSS-läsarinställningar</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="430"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="430"></location> <source>Manual Sync Only</source> <translation>Manuell synkronisering endast</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="437"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="437"></location> <source>Some RSS feeds may request custom update intervals instead of using this setting</source> <translation>Vissa RSS-flöden kan begära anpassade uppdateringsintervall istället för att använda den här inställningen</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="440"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="440"></location> <source>Default Sync Interval</source> <translation>Standard synkroniseringsintervall</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="471"/> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="483"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="471"></location> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="483"></location> <source>Hour(s)</source> <translation>Timma(r)</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="478"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="478"></location> <source>Minutes</source> <translation>Minuter</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="522"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="522"></location> <source>Save Settings</source> <translation>Spara inställningar</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="70"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="70"></location> <source>Add RSS Feed</source> <translation>Lägg till RSS-flöde</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="71"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="71"></location> <source>View Feed Details</source> <translation>Visa flödes detaljer</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="72"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="72"></location> <source>Settings</source> <translation>Inställningar</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="74"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="74"></location> <source>Update Feeds Now</source> <translation>Uppdatera flöden nu</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="78"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="78"></location> <source>Lumina Desktop RSS</source> <translation>Lumina Skrivbordets RSS läsare </translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="143"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="143"></location> <source>Feed URL: %1</source> <translation>RSS-Flödes URL: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="144"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="144"></location> <source>Title: %1</source> <translation>Titel: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="145"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="145"></location> <source>Description: %1</source> <translation>Beskrivning: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="146"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="146"></location> <source>Website: %1</source> <translation>Webbplats: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="147"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="147"></location> <source>Last Build Date: %1</source> <translation>Senaste bygg datum: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="148"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="148"></location> <source>Last Sync: %1</source> <translation>Senaste synkronisering: %1</translation> </message> <message> - <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="149"/> + <location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="149"></location> <source>Next Sync: %1</source> <translation>Nästa synkronisering: %1</translation> </message> @@ -944,32 +944,32 @@ <context> <name>SettingsMenu</name> <message> - <location filename="../SettingsMenu.cpp" line="30"/> + <location filename="../SettingsMenu.cpp" line="30"></location> <source>Screensaver</source> <translation>Skärmsläckare</translation> </message> <message> - <location filename="../SettingsMenu.cpp" line="33"/> + <location filename="../SettingsMenu.cpp" line="33"></location> <source>Desktop</source> <translation>Skrivbord</translation> </message> <message> - <location filename="../SettingsMenu.cpp" line="26"/> + <location filename="../SettingsMenu.cpp" line="26"></location> <source>Preferences</source> <translation>Egenskaper</translation> </message> <message> - <location filename="../SettingsMenu.cpp" line="36"/> + <location filename="../SettingsMenu.cpp" line="36"></location> <source>Display</source> <translation>Skärm</translation> </message> <message> - <location filename="../SettingsMenu.cpp" line="51"/> + <location filename="../SettingsMenu.cpp" line="51"></location> <source>Control Panel</source> <translation>Kontrollpanel</translation> </message> <message> - <location filename="../SettingsMenu.cpp" line="57"/> + <location filename="../SettingsMenu.cpp" line="57"></location> <source>About Lumina</source> <translation>Om Lumina</translation> </message> @@ -977,114 +977,114 @@ <context> <name>StartMenu</name> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="14"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="14"></location> <source>Form</source> <translation>Formulär</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="38"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="38"></location> <source>Type to search</source> <translation>Skriv för att söka</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="171"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="171"></location> <source>Browse Files</source> <translation>Bläddra bland filer</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="199"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="199"></location> <source>Browse Applications</source> <translation>Bläddra bland program</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="234"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="234"></location> <source>Control Panel</source> <translation>Kontrollpanel</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="305"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="305"></location> <source>Leave</source> <translation>Lämna</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="379"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="379"></location> <source>Manage Applications</source> <translation>Hantera program</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="408"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="408"></location> <source>Show Categories</source> <translation>Visa kategorier</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="488"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="488"></location> <source>Configure Desktop</source> <translation>Anpassa skrivbordet</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1065"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1065"></location> <source>Sign Out User</source> <translation>Logga ut användare</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="989"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="989"></location> <source>Restart System</source> <translation>Starta om systemet</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="262"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="262"></location> <source>Preferences</source> <translation>Inställningar</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1017"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1017"></location> <source>Power Off System</source> <translation>Stäng av systemet</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1036"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1036"></location> <source>(System Performing Updates)</source> <translation>(Systemet utför uppdateringar)</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="924"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="924"></location> <source>Suspend System</source> <translation>Vänteläge</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1125"/> + <location filename="../panel-plugins/systemstart/StartMenu.ui" line="1125"></location> <source>Back</source> <translation>Bakåt</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="267"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="267"></location> <source>Apply Updates?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="267"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="267"></location> <source>You have system updates waiting to be applied! Do you wish to install them now?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="475"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="475"></location> <source>%1% (Plugged In)</source> <translation>%1% (Inkopplad)</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="479"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="479"></location> <source>%1% (%2 Estimated)</source> <translation>%1% (%2 Beräknad)</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="480"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="480"></location> <source>%1% Remaining</source> <translation>%1% återstår</translation> </message> <message> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="496"/> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="655"/> - <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="666"/> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="496"></location> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="655"></location> + <location filename="../panel-plugins/systemstart/StartMenu.cpp" line="666"></location> <source>Workspace %1/%2</source> <translation>Arbetsyta %1/%2</translation> </message> @@ -1092,47 +1092,47 @@ <context> <name>SystemWindow</name> <message> - <location filename="../SystemWindow.ui" line="14"/> + <location filename="../SystemWindow.ui" line="14"></location> <source>System Options</source> <translation>Systemalternativ</translation> </message> <message> - <location filename="../SystemWindow.ui" line="55"/> + <location filename="../SystemWindow.ui" line="55"></location> <source>Log Out</source> <translation>Logga ut</translation> </message> <message> - <location filename="../SystemWindow.ui" line="71"/> + <location filename="../SystemWindow.ui" line="71"></location> <source>Restart</source> <translation>Starta om</translation> </message> <message> - <location filename="../SystemWindow.ui" line="87"/> + <location filename="../SystemWindow.ui" line="87"></location> <source>Shutdown</source> <translation>Stäng av</translation> </message> <message> - <location filename="../SystemWindow.ui" line="127"/> + <location filename="../SystemWindow.ui" line="127"></location> <source>Cancel</source> <translation>Avbryt</translation> </message> <message> - <location filename="../SystemWindow.ui" line="156"/> + <location filename="../SystemWindow.ui" line="156"></location> <source>Lock</source> <translation>Lås</translation> </message> <message> - <location filename="../SystemWindow.ui" line="172"/> + <location filename="../SystemWindow.ui" line="172"></location> <source>Suspend</source> <translation>Vänteläge</translation> </message> <message> - <location filename="../SystemWindow.cpp" line="57"/> + <location filename="../SystemWindow.cpp" line="57"></location> <source>Apply Updates?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SystemWindow.cpp" line="57"/> + <location filename="../SystemWindow.cpp" line="57"></location> <source>You have system updates waiting to be applied! Do you wish to install them now?</source> <translation type="unfinished"></translation> </message> @@ -1140,22 +1140,22 @@ <context> <name>UserItemWidget</name> <message> - <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="33"/> + <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="33"></location> <source>Go Back</source> <translation>Gå tillbaka</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="133"/> + <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="133"></location> <source>Remove Shortcut</source> <translation>Ta bort genväg</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="138"/> + <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="138"></location> <source>Delete File</source> <translation>Ta bort fil</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="144"/> + <location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="144"></location> <source>Create Shortcut</source> <translation>Skapa genväg</translation> </message> @@ -1163,180 +1163,180 @@ <context> <name>UserWidget</name> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="14"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="14"></location> <source>UserWidget</source> <translation>AnvändarWidget</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="24"/> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="27"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="24"></location> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="27"></location> <source>Favorites</source> <translation>Favoriter</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="65"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="65"></location> <source>Favorite Applications</source> <translation>Favoritprogram</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="68"/> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="187"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="68"></location> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="187"></location> <source>Applications</source> <translation>Program</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="102"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="102"></location> <source>Favorite Directories</source> <translation>Favoritkataloger</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="105"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="105"></location> <source>Places</source> <translation>Platser</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="139"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="139"></location> <source>Favorite FIles</source> <translation>Favoritfiler</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="142"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="142"></location> <source>Files</source> <translation>Filer</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="184"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="184"></location> <source>Apps</source> <translation>Program</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="290"/> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="330"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="290"></location> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="330"></location> <source>Home</source> <translation>Hem</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="293"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="293"></location> <source>Home Directory</source> <translation>Hemkatalog</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="322"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="322"></location> <source>Search this Directory</source> <translation>Sök i denna katalog</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="375"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="375"></location> <source>Go back to home directory</source> <translation>Gå tillbaka till hemkatalogen</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="350"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="350"></location> <source>Open Directory</source> <translation>Öppna katalog</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="458"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="458"></location> <source>Config</source> <translation>Inställning</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="461"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="461"></location> <source>Desktop Preferences</source> <translation>Skrivbordsinställningar</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="473"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="473"></location> <source>Control Panel</source> <translation>Kontrollpanel</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="495"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="495"></location> <source>Desktop Appearance/Plugins</source> <translation>Skrivbordsutseende/insticksmoduler</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="517"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="517"></location> <source>Screen Configuration</source> <translation>Skärminställningar</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="539"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="539"></location> <source>Screensaver Settings</source> <translation>Inställningar för skärmsläckare</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.ui" line="581"/> + <location filename="../panel-plugins/userbutton/UserWidget.ui" line="581"></location> <source>About the Lumina Desktop</source> <translation>Om Lumina Skrivbordsmiljön</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="289"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="289"></location> <source>All</source> <translation>Alla</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="290"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="290"></location> <source>Multimedia</source> <translation>Multimedia</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="291"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="291"></location> <source>Development</source> <translation>Utveckling</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="292"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="292"></location> <source>Education</source> <translation>Utbildning</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="293"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="293"></location> <source>Games</source> <translation>Spel</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="294"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="294"></location> <source>Graphics</source> <translation>Grafik</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="295"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="295"></location> <source>Network</source> <translation>Nätverk</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="296"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="296"></location> <source>Office</source> <translation>Kontorsprogram</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="297"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="297"></location> <source>Science</source> <translation>Vetenskap</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="298"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="298"></location> <source>Settings</source> <translation>Inställningar</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="299"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="299"></location> <source>System</source> <translation>System</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="300"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="300"></location> <source>Utilities</source> <translation>Verktyg</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="301"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="301"></location> <source>Wine</source> <translation>Wine</translation> </message> <message> - <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="302"/> + <location filename="../panel-plugins/userbutton/UserWidget.cpp" line="302"></location> <source>Unsorted</source> <translation>Osorterade</translation> </message> diff --git a/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp index 321970ed..05b7981f 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp @@ -31,9 +31,8 @@ void AppLaunchButtonPlugin::updateButtonVisuals(){ QIcon icon; QString tooltip = tr("Click to assign an application"); if(appfile.endsWith(".desktop")){ - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(appfile,ok); - if(ok){ + XDGDesktop desk(appfile); + if(desk.isValid()){ icon = LXDG::findIcon(desk.icon, "unknown"); tooltip = QString(tr("Launch %1")).arg(desk.name); }else{ @@ -56,13 +55,13 @@ void AppLaunchButtonPlugin::updateButtonVisuals(){ void AppLaunchButtonPlugin::AppClicked(){ if(appfile.isEmpty()){ //No App File selected - QList<XDGDesktop> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); + QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); QStringList names; - for(int i=0; i<apps.length(); i++){ names << apps[i].name; } + for(int i=0; i<apps.length(); i++){ names << apps[i]->name; } bool ok = false; QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok); if(!ok || names.indexOf(app)<0){ return; } //cancelled - appfile = apps[ names.indexOf(app) ].filePath; + appfile = apps[ names.indexOf(app) ]->filePath; //Still need to find a way to set this value persistently // --- perhaps replace the plugin in the desktop settings file with the new path? // --- "applauncher::broken---<something>" -> "applauncher::fixed---<something>" ? @@ -71,4 +70,3 @@ void AppLaunchButtonPlugin::AppClicked(){ LSession::LaunchApplication("lumina-open \""+appfile+"\""); } } - diff --git a/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp index 5d20e3ec..e3be55c2 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp @@ -62,23 +62,22 @@ void LAppMenuPlugin::LaunchItem(QAction* item){ void LAppMenuPlugin::UpdateMenu(){ mainmenu->clear(); - QHash<QString, QList<XDGDesktop> > *HASH = LSession::handle()->applicationMenu()->currentAppHash(); + QHash<QString, QList<XDGDesktop*> > *HASH = LSession::handle()->applicationMenu()->currentAppHash(); //Now Re-create the menu (orignally copied from the AppMenu class) - bool ok; //for checking inputs //Add link to the file manager QAction *tmpact = mainmenu->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files") ); tmpact->setWhatsThis("\""+QDir::homePath()+"\""); //--Look for the app store - XDGDesktop store = LXDG::loadDesktopFile(LOS::AppStoreShortcut(), ok); - if(ok){ + XDGDesktop store(LOS::AppStoreShortcut()); + if(store.isValid()){ tmpact = mainmenu->addAction( LXDG::findIcon(store.icon, ""), tr("Install Applications") ); tmpact->setWhatsThis("\""+store.filePath+"\""); } //--Look for the control panel - store = LXDG::loadDesktopFile(LOS::ControlPanelShortcut(), ok); - if(ok){ - tmpact = mainmenu->addAction( LXDG::findIcon(store.icon, ""), tr("Control Panel") ); - tmpact->setWhatsThis("\""+store.filePath+"\""); + XDGDesktop controlp(LOS::ControlPanelShortcut()); + if(controlp.isValid()){ + tmpact = mainmenu->addAction( LXDG::findIcon(controlp.icon, ""), tr("Control Panel") ); + tmpact->setWhatsThis("\""+controlp.filePath+"\""); } mainmenu->addSeparator(); //--Now create the sub-menus @@ -104,29 +103,29 @@ void LAppMenuPlugin::UpdateMenu(){ QMenu *menu = new QMenu(name, this); menu->setIcon(LXDG::findIcon(icon,"")); - QList<XDGDesktop> appL = HASH->value(cats[i]); + QList<XDGDesktop*> appL = HASH->value(cats[i]); for( int a=0; a<appL.length(); a++){ - if(appL[a].actions.isEmpty()){ + if(appL[a]->actions.isEmpty()){ //Just a single entry point - no extra actions - QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, menu); - act->setToolTip(appL[a].comment); - act->setWhatsThis("\""+appL[a].filePath+"\""); + QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, menu); + act->setToolTip(appL[a]->comment); + act->setWhatsThis("\""+appL[a]->filePath+"\""); menu->addAction(act); }else{ //This app has additional actions - make this a sub menu // - first the main menu/action - QMenu *submenu = new QMenu(appL[a].name, menu); - submenu->setIcon( LXDG::findIcon(appL[a].icon,"") ); + QMenu *submenu = new QMenu(appL[a]->name, menu); + submenu->setIcon( LXDG::findIcon(appL[a]->icon,"") ); //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu) - QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, submenu); - act->setToolTip(appL[a].comment); - act->setWhatsThis(appL[a].filePath); + QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, submenu); + act->setToolTip(appL[a]->comment); + act->setWhatsThis(appL[a]->filePath); submenu->addAction(act); //Now add entries for every sub-action listed - for(int sa=0; sa<appL[a].actions.length(); sa++){ - QAction *sact = new QAction(LXDG::findIcon(appL[a].actions[sa].icon, appL[a].icon), appL[a].actions[sa].name, this); - sact->setToolTip(appL[a].comment); - sact->setWhatsThis("-action \""+appL[a].actions[sa].ID+"\" \""+appL[a].filePath+"\""); + for(int sa=0; sa<appL[a]->actions.length(); sa++){ + QAction *sact = new QAction(LXDG::findIcon(appL[a]->actions[sa].icon, appL[a]->icon), appL[a]->actions[sa].name, this); + sact->setToolTip(appL[a]->comment); + sact->setWhatsThis("-action \""+appL[a]->actions[sa].ID+"\" \""+appL[a]->filePath+"\""); submenu->addAction(sact); } menu->addMenu(submenu); diff --git a/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp index 48bbface..9903d4fd 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp @@ -130,11 +130,9 @@ void LDeskBarPlugin::updateFiles(){ if(type=="app"){ //Add it to appM bool ok = false; - XDGDesktop df = LXDG::loadDesktopFile(path, ok); - if(ok){ - if( LXDG::checkValidity(df) && !df.isHidden ){ + XDGDesktop df(path); + if(df.isValid() && !df.isHidden){ appM->addAction( newAction(df.filePath, df.name, LXDG::findIcon(df.icon, ":/images/default-application.png")) ); - } } }else if(type=="dir"){ //Add it to dirM diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp index 3a0493a3..48d9623a 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp @@ -16,8 +16,8 @@ ItemWidget::ItemWidget(QWidget *parent, QString itemPath, QString type, bool gob bool inHome = type.endsWith("-home"); //internal code if(inHome){ type = type.remove("-home"); } if(itemPath.endsWith(".desktop") || type=="app"){ - XDGDesktop item = LXDG::loadDesktopFile(itemPath, gooditem); - if(gooditem){ gooditem = LXDG::checkValidity(item); } + XDGDesktop item(itemPath, this); + gooditem = item.isValid(); //qDebug() << "Good Item:" << gooditem << itemPath; if(gooditem){ icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) ); @@ -26,7 +26,7 @@ ItemWidget::ItemWidget(QWidget *parent, QString itemPath, QString type, bool gob if(!item.genericName.isEmpty() && item.name!=item.genericName){ text.append("<br><i> -- "+item.genericName+"</i>"); } name->setText(text); name->setToolTip(item.comment); - setupActions(item); + setupActions(&item); }else{ return; } @@ -89,13 +89,14 @@ ItemWidget::ItemWidget(QWidget *parent, QString itemPath, QString type, bool gob } // - Application constructor -ItemWidget::ItemWidget(QWidget *parent, XDGDesktop item) : QFrame(parent){ +ItemWidget::ItemWidget(QWidget *parent, XDGDesktop *item) : QFrame(parent){ + if(item==0){ return; } createWidget(); isDirectory = false; - if(LUtils::isFavorite(item.filePath)){ - linkPath = item.filePath; + if(LUtils::isFavorite(item->filePath)){ + linkPath = item->filePath; isShortcut=true; - }else if( item.filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ + }else if( item->filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ isShortcut = true; }else{ isShortcut = false; @@ -104,14 +105,14 @@ ItemWidget::ItemWidget(QWidget *parent, XDGDesktop item) : QFrame(parent){ name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path } //Now fill it appropriately - icon->setPixmap( LXDG::findIcon(item.icon,"preferences-system-windows-actions").pixmap(64,64) ); - text = item.name; - if(!item.genericName.isEmpty() && item.name!=item.genericName){ text.append("<br><i> -- "+item.genericName+"</i>"); } + icon->setPixmap( LXDG::findIcon(item->icon,"preferences-system-windows-actions").pixmap(64,64) ); + text = item->name; + if(!item->genericName.isEmpty() && item->name!=item->genericName){ text.append("<br><i> -- "+item->genericName+"</i>"); } name->setText(text); - name->setToolTip(item.comment); - this->setWhatsThis(item.name); - icon->setWhatsThis(item.filePath); - iconPath = item.icon; + name->setToolTip(item->comment); + this->setWhatsThis(item->name); + icon->setWhatsThis(item->filePath); + iconPath = item->icon; //Now setup the buttons appropriately setupContextMenu(); setupActions(item); @@ -176,14 +177,14 @@ void ItemWidget::setupContextMenu(){ } } -void ItemWidget::setupActions(XDGDesktop app){ - if(app.actions.isEmpty()){ actButton->setVisible(false); return; } +void ItemWidget::setupActions(XDGDesktop *app){ + if(app==0 || app->actions.isEmpty()){ actButton->setVisible(false); return; } //Actions Available - go ahead and list them all actButton->setMenu( new QMenu(this) ); - for(int i=0; i<app.actions.length(); i++){ - QAction *act = new QAction(LXDG::findIcon(app.actions[i].icon, app.icon), app.actions[i].name, this); - act->setToolTip(app.actions[i].ID); - act->setWhatsThis(app.actions[i].ID); + for(int i=0; i<app->actions.length(); i++){ + QAction *act = new QAction(LXDG::findIcon(app->actions[i].icon, app->icon), app->actions[i].name, this); + act->setToolTip(app->actions[i].ID); + act->setWhatsThis(app->actions[i].ID); actButton->menu()->addAction(act); } connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) ); diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h index 8190de43..365b434f 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h +++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h @@ -32,7 +32,7 @@ public: // - Favorites (path/type) ItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false); // - Generic Apps - ItemWidget(QWidget *parent=0, XDGDesktop item= XDGDesktop()); + ItemWidget(QWidget *parent=0, XDGDesktop *item= 0); // - Categories //ItemWidget(QWidget *parent=0, QString cat=""); @@ -53,7 +53,7 @@ private: void createWidget(); //void setupButton(bool disable = false); void setupContextMenu(); - void setupActions(XDGDesktop); + void setupActions(XDGDesktop*); void updateItems(); //update the text/icon to match sizes diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp index 60a313e8..ae61760b 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp @@ -23,7 +23,6 @@ StartMenu::StartMenu(QWidget *parent) : QWidget(parent), ui(new Ui::StartMenu){ searchTimer->setInterval(300); //~1/3 second searchTimer->setSingleShot(true); connect(searchTimer, SIGNAL(timeout()), this, SLOT(startSearch()) ); - sysapps = LSession::handle()->applicationMenu()->currentAppHash(); connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateApps()) ); //Need to load the last used setting of the application list QString state = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/systemstart/showcategories", "partial").toString(); @@ -72,9 +71,8 @@ void StartMenu::UpdateAll(){ if(QFile::exists(tmp)){ ui->tool_launch_controlpanel->setWhatsThis(tmp); //Now read the file to see which icon to use - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(tmp, ok); - if(ok && LXDG::checkValidity(desk)){ + XDGDesktop desk(tmp); + if(desk.isValid()){ ui->tool_launch_controlpanel->setIcon(LXDG::findIcon(desk.icon,"preferences-other")); }else{ ui->tool_launch_controlpanel->setVisible(false); } }else{ ui->tool_launch_controlpanel->setVisible(false); } @@ -83,9 +81,8 @@ void StartMenu::UpdateAll(){ if(QFile::exists(tmp)){ ui->tool_launch_store->setWhatsThis(tmp); //Now read the file to see which icon to use - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(tmp, ok); - if(ok && LXDG::checkValidity(desk)){ + XDGDesktop desk(tmp); + if(desk.isValid()){ ui->tool_launch_store->setIcon(LXDG::findIcon(desk.icon,"utilities-file-archiver")); }else{ ui->tool_launch_store->setVisible(false); } }else{ ui->tool_launch_store->setVisible(false); } @@ -158,8 +155,14 @@ void StartMenu::UpdateQuickLaunch(QString path, bool keep){ // ========================== // PRIVATE FUNCTIONS // ========================== +void StartMenu::deleteChildren(QObject *obj){ +for(int i=0; i<obj->children().count(); i++){ obj->children().at(i)->deleteLater(); } +} + void StartMenu::ClearScrollArea(QScrollArea *area){ - area->takeWidget()->deleteLater(); + QWidget *old = area->takeWidget(); + deleteChildren(old); //make sure we *fully* delete these items to save memory + old->deleteLater(); area->setWidget( new QWidget() ); //create a new widget in the scroll area area->widget()->setContentsMargins(0,0,0,0); QVBoxLayout *layout = new QVBoxLayout; @@ -216,18 +219,18 @@ void StartMenu::do_search(QString search, bool force){ QStringList found; //syntax: [<sorter>::::<mimetype>::::<filepath>] QString tmp = search; if(LUtils::isValidBinary(tmp)){ found << "0::::application/x-executable::::"+tmp; } - QList<XDGDesktop> apps = sysapps->value("All"); + QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); for(int i=0; i<apps.length(); i++){ int priority = -1; - if(apps[i].name.toLower()==search.toLower()){ priority = 10; } - else if(apps[i].name.startsWith(search, Qt::CaseInsensitive)){ priority = 15; } - else if(apps[i].name.contains(search, Qt::CaseInsensitive)){ priority = 19; } - else if(apps[i].genericName.contains(search, Qt::CaseInsensitive)){ priority = 20; } - else if(apps[i].comment.contains(search, Qt::CaseInsensitive)){ priority = 30; } + if(apps[i]->name.toLower()==search.toLower()){ priority = 10; } + else if(apps[i]->name.startsWith(search, Qt::CaseInsensitive)){ priority = 15; } + else if(apps[i]->name.contains(search, Qt::CaseInsensitive)){ priority = 19; } + else if(apps[i]->genericName.contains(search, Qt::CaseInsensitive)){ priority = 20; } + else if(apps[i]->comment.contains(search, Qt::CaseInsensitive)){ priority = 30; } //Can add other filters here later if(priority>0){ - found << QString::number(priority)+"::::app::::"+apps[i].filePath; + found << QString::number(priority)+"::::app::::"+apps[i]->filePath; } } found.sort(Qt::CaseInsensitive); //sort by priority/type (lower numbers are higher on list) @@ -238,10 +241,8 @@ void StartMenu::do_search(QString search, bool force){ if(topsearch.isEmpty()){ topsearch = found[i].section("::::",2,-1); } ItemWidget *it = 0; if( found[i].section("::::",2,-1).endsWith(".desktop")){ - bool ok = false; - XDGDesktop item = LXDG::loadDesktopFile(found[i].section("::::",2,-1), ok); - if(ok){ ok = LXDG::checkValidity(item); } - if(ok){ it = new ItemWidget(ui->scroll_favs->widget(), item); } + XDGDesktop item(found[i].section("::::",2,-1)); + if(item.isValid()){ it = new ItemWidget(ui->scroll_favs->widget(), &item); } }else{ it = new ItemWidget(ui->scroll_favs->widget(), found[i].section("::::",2,-1), found[i].section("::::",1,1) ); } @@ -308,11 +309,11 @@ void StartMenu::UpdateApps(){ //qDebug() << " - Partially Checked"; //Show a single page of apps, but still divided up by categories CCat.clear(); - QStringList cats = sysapps->keys(); + QStringList cats = LSession::handle()->applicationMenu()->currentAppHash()->keys(); cats.sort(); cats.removeAll("All"); for(int c=0; c<cats.length(); c++){ - QList<XDGDesktop> apps = sysapps->value(cats[c]); + QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value(cats[c]); if(apps.isEmpty()){ continue; } //Add the category label to the scroll QLabel *catlabel = new QLabel("<b>"+cats[c]+"</b>",ui->scroll_apps->widget()); @@ -335,7 +336,7 @@ void StartMenu::UpdateApps(){ //Only show categories to start with - and have the user click-into a cat to see apps if(CCat.isEmpty()){ //No cat selected yet - show cats only - QStringList cats = sysapps->keys(); + QStringList cats = LSession::handle()->applicationMenu()->currentAppHash()->keys(); cats.sort(); cats.removeAll("All"); //This is not a "real" category for(int c=0; c<cats.length(); c++){ @@ -352,7 +353,7 @@ void StartMenu::UpdateApps(){ ui->scroll_apps->widget()->layout()->addWidget(it); connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); //Show apps for this cat - QList<XDGDesktop> apps = sysapps->value(CCat); + QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value(CCat); for(int i=0; i<apps.length(); i++){ //qDebug() << " - App:" << apps[i].name; ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] ); @@ -368,7 +369,7 @@ void StartMenu::UpdateApps(){ }else{ //qDebug() << " - Not Checked"; //No categories at all - just alphabetize all the apps - QList<XDGDesktop> apps = sysapps->value("All"); + QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); CCat.clear(); //Now add all the apps for this category for(int i=0; i<apps.length(); i++){ @@ -431,10 +432,8 @@ void StartMenu::UpdateFavs(){ if( !QFile::exists(tmp[i].section("::::",2,-1)) ){ continue; } //invalid favorite - skip it ItemWidget *it = 0; if( tmp[i].section("::::",2,-1).endsWith(".desktop")){ - bool ok = false; - XDGDesktop item = LXDG::loadDesktopFile(tmp[i].section("::::",2,-1), ok); - if(ok){ ok = LXDG::checkValidity(item); } - if(ok){ it = new ItemWidget(ui->scroll_favs->widget(), item); } + XDGDesktop item(tmp[i].section("::::",2,-1)); + if(item.isValid()){ it = new ItemWidget(ui->scroll_favs->widget(), &item); } }else{ it = new ItemWidget(ui->scroll_favs->widget(), tmp[i].section("::::",2,-1), tmp[i].section("::::",1,1) ); } diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h index 9a629cc2..af7bd136 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h +++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h @@ -32,12 +32,12 @@ public slots: private: Ui::StartMenu *ui; - QHash<QString, QList<XDGDesktop> > *sysapps; QStringList favs; QString CCat, CSearch, topsearch; //current category/search QTimer *searchTimer; //Simple utility functions + void deleteChildren(QObject *obj); //recursive function void ClearScrollArea(QScrollArea *area); void SortScrollArea(QScrollArea *area); void do_search(QString search, bool force); diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp index 1d32440a..a1dfe956 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp @@ -15,12 +15,11 @@ UserItemWidget::UserItemWidget(QWidget *parent, QString itemPath, QString type, bool inHome = type.endsWith("-home"); //internal code if(inHome){ type = type.remove("-home"); } if(itemPath.endsWith(".desktop") || type=="app"){ - bool ok = false; - XDGDesktop item = LXDG::loadDesktopFile(itemPath, ok); - if(ok && LXDG::checkValidity(item) ){ + XDGDesktop item(itemPath); + if( item.isValid() ){ icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) ); name->setText( this->fontMetrics().elidedText(item.name, Qt::ElideRight, TEXTCUTOFF) ); - setupActions(item); + setupActions(&item); }else{ gooditem = false; return; @@ -63,22 +62,23 @@ UserItemWidget::UserItemWidget(QWidget *parent, QString itemPath, QString type, setupButton(goback); } -UserItemWidget::UserItemWidget(QWidget *parent, XDGDesktop item) : QFrame(parent){ +UserItemWidget::UserItemWidget(QWidget *parent, XDGDesktop *item) : QFrame(parent){ + if(item==0){ return; } createWidget(); isDirectory = false; - if(LUtils::isFavorite(item.filePath)){ - linkPath = item.filePath; + if(LUtils::isFavorite(item->filePath)){ + linkPath = item->filePath; isShortcut=true; - }else if( item.filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ + }else if( item->filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ isShortcut = true; }else{ isShortcut = false; } //Now fill it appropriately - icon->setPixmap( LXDG::findIcon(item.icon,"preferences-system-windows-actions").pixmap(32,32) ); - name->setText( this->fontMetrics().elidedText(item.name, Qt::ElideRight, TEXTCUTOFF) ); + icon->setPixmap( LXDG::findIcon(item->icon,"preferences-system-windows-actions").pixmap(32,32) ); + name->setText( this->fontMetrics().elidedText(item->name, Qt::ElideRight, TEXTCUTOFF) ); this->setWhatsThis(name->text()); - icon->setWhatsThis(item.filePath); + icon->setWhatsThis(item->filePath); //Now setup the buttons appropriately setupButton(); setupActions(item); @@ -152,14 +152,14 @@ void UserItemWidget::setupButton(bool disable){ } } -void UserItemWidget::setupActions(XDGDesktop app){ - if(app.actions.isEmpty()){ actButton->setVisible(false); return; } +void UserItemWidget::setupActions(XDGDesktop *app){ + if(app==0 || app->actions.isEmpty()){ actButton->setVisible(false); return; } //Actions Available - go ahead and list them all actButton->setMenu( new QMenu(this) ); - for(int i=0; i<app.actions.length(); i++){ - QAction *act = new QAction(LXDG::findIcon(app.actions[i].icon, app.icon), app.actions[i].name, this); - act->setToolTip(app.actions[i].ID); - act->setWhatsThis(app.actions[i].ID); + for(int i=0; i<app->actions.length(); i++){ + QAction *act = new QAction(LXDG::findIcon(app->actions[i].icon, app->icon), app->actions[i].name, this); + act->setToolTip(app->actions[i].ID); + act->setWhatsThis(app->actions[i].ID); actButton->menu()->addAction(act); } connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) ); @@ -201,4 +201,4 @@ void UserItemWidget::actionClicked(QAction *act){ if(!linkPath.isEmpty()){ cmd = cmd.arg(linkPath); } else{ cmd = cmd.arg(icon->whatsThis()); } emit RunItem(cmd); -}
\ No newline at end of file +} diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h index 2251344c..0b212f10 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h +++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h @@ -28,7 +28,7 @@ class UserItemWidget : public QFrame{ Q_OBJECT public: UserItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false); - UserItemWidget(QWidget *parent=0, XDGDesktop item= XDGDesktop()); + UserItemWidget(QWidget *parent=0, XDGDesktop *item= 0); ~UserItemWidget(); bool gooditem; @@ -41,7 +41,7 @@ private: void createWidget(); void setupButton(bool disable = false); - void setupActions(XDGDesktop); + void setupActions(XDGDesktop*); private slots: void buttonClicked(); diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp index c7d8109c..fb58c7f6 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp @@ -130,8 +130,8 @@ void UserWidget::UpdateAll(){ QString APPSTORE = LOS::AppStoreShortcut(); if(QFile::exists(APPSTORE) && !APPSTORE.isEmpty()){ //Now load the info - bool ok = false; - XDGDesktop store = LXDG::loadDesktopFile(APPSTORE, ok); + XDGDesktop store(APPSTORE); + bool ok = store.isValid(); if(ok){ ui->tool_app_store->setIcon( LXDG::findIcon(store.icon, "") ); ui->tool_app_store->setText( store.name ); @@ -143,8 +143,8 @@ void UserWidget::UpdateAll(){ QString CONTROLPANEL = LOS::ControlPanelShortcut(); if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){ //Now load the info - bool ok = false; - XDGDesktop cpan = LXDG::loadDesktopFile(CONTROLPANEL, ok); + XDGDesktop cpan(CONTROLPANEL); + bool ok = cpan.isValid(); if(ok){ ui->tool_controlpanel->setIcon( LXDG::findIcon(cpan.icon, "") ); } @@ -307,7 +307,7 @@ void UserWidget::updateAppCategories(){ void UserWidget::updateApps(){ if(ui->combo_app_cats->currentIndex() < 0){ return; } //no cat QString cat = ui->combo_app_cats->itemData( ui->combo_app_cats->currentIndex() ).toString(); - QList<XDGDesktop> items = sysapps->value(cat); + QList<XDGDesktop*> items = sysapps->value(cat); ClearScrollArea(ui->scroll_apps); for(int i=0; i<items.length(); i++){ UserItemWidget *it = new UserItemWidget(ui->scroll_apps->widget(), items[i]); diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h index af9408dd..8b03c489 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h +++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h @@ -42,7 +42,7 @@ public slots: private: Ui::UserWidget *ui; - QHash<QString, QList<XDGDesktop> > *sysapps; + QHash<QString, QList<XDGDesktop*> > *sysapps; QDateTime lastUpdate, lastHomeUpdate; QStringList favs; QFileInfoList homefiles; diff --git a/src-qt5/core/lumina-open/LFileDialog.cpp b/src-qt5/core/lumina-open/LFileDialog.cpp index fbcf007f..a0fef17c 100644 --- a/src-qt5/core/lumina-open/LFileDialog.cpp +++ b/src-qt5/core/lumina-open/LFileDialog.cpp @@ -158,17 +158,21 @@ void LFileDialog::updateUI(){ void LFileDialog::generateAppList(bool shownetwork){ //Now load the preferred applications + XDGDesktopList applist; + applist.updateList(); PREFAPPS = getPreferredApplications(); + //qDebug() << "Preferred Apps:" << PREFAPPS; ui->combo_rec->clear(); //Now get the application mimetype for the file extension (if available) QStringList mimetypes = LXDG::findAppMimeForFile(filePath, true).split("::::"); //use all mimetypes + mimetypes.removeDuplicates(); //Now add all the detected applications - QHash< QString, QList<XDGDesktop> > hash = LXDG::sortDesktopCats( LXDG::systemDesktopFiles(false,true) ); + QHash< QString, QList<XDGDesktop*> > hash = LXDG::sortDesktopCats( applist.apps(false,true) ); QStringList cat = hash.keys(); cat.sort(); //sort alphabetically ui->combo_apps->clear(); for(int c=0; c<cat.length(); c++){ - QList<XDGDesktop> app = hash[cat[c]]; + QList<XDGDesktop*> app = hash[cat[c]]; if(app.length()<1){ continue; } if(ui->combo_apps->count() >1){ ui->combo_apps->insertSeparator(ui->combo_apps->count()); } ui->combo_apps->addItem(translateCat(cat[c])); @@ -176,17 +180,19 @@ void LFileDialog::generateAppList(bool shownetwork){ for(int a=0; a<app.length(); a++){ if(shownetwork && (cat[c].toLower()=="network" || cat[c].toLower()=="utility") ){ //Need to show preferred internet applications - look for ones that handle URL's - if(app[a].exec.contains("%u") || app[a].exec.contains("%U")){ - PREFAPPS << app[a].filePath; + if(app[a]->exec.contains("%u") || app[a]->exec.contains("%U")){ + //qDebug() << "Add to Preferred Apps:" << app[a]->filePath; + PREFAPPS << app[a]->filePath; } } - ui->combo_apps->addItem(LXDG::findIcon(app[a].icon, "application-x-desktop"), app[a].name, app[a].filePath); + ui->combo_apps->addItem(LXDG::findIcon(app[a]->icon, "application-x-desktop"), app[a]->name, app[a]->filePath); //Check to see if this app matches the mime type if(!mimetypes.isEmpty()){ - QStringList tmp = mimetypes; tmp << app[a].mimeList; + QStringList tmp = mimetypes; tmp << app[a]->mimeList; if(tmp.removeDuplicates() > 0 ){ // also put this app in the preferred list - PREFAPPS.append(app[a].filePath); + //qDebug() << "Mimetype match:" << mimetypes << app[a]->mimeList; + PREFAPPS.append(app[a]->filePath); //If this is the first preferred app found - select this app initially if(ui->combo_apps->currentIndex()<=0){ ui->combo_apps->setCurrentIndex(ui->combo_apps->count()-1); } } @@ -197,9 +203,8 @@ void LFileDialog::generateAppList(bool shownetwork){ //Now add all the preferred applications PREFAPPS.removeDuplicates(); for(int i=0; i<PREFAPPS.length(); i++){ - bool ok = false; - XDGDesktop dFile = LXDG::loadDesktopFile(PREFAPPS[i], ok); - if( LXDG::checkValidity(dFile) && ok ){ + XDGDesktop dFile(PREFAPPS[i]); + if( dFile.isValid() ){ ui->combo_rec->addItem( LXDG::findIcon(dFile.icon, "application-x-desktop"), dFile.name); if(i==0){ ui->combo_rec->setCurrentIndex(0); } //make sure the first item is selected }else{ @@ -242,19 +247,17 @@ void LFileDialog::on_tool_ok_clicked(){ appExec = ui->line_bin->text(); }else if(ui->radio_rec->isChecked()){ //application selected - bool ok = false; - XDGDesktop app = LXDG::loadDesktopFile(PREFAPPS[ui->combo_rec->currentIndex()], ok); + XDGDesktop app(PREFAPPS[ui->combo_rec->currentIndex()]); //Set the output variables - appExec = LXDG::getDesktopExec(app); + appExec = app.getDesktopExec(); appPath = app.path; appFile = app.filePath; setPreferredApplication(app.filePath); //bump this to the top of the preferred list for next time }else{ //application selected - bool ok = false; - XDGDesktop app = LXDG::loadDesktopFile(ui->combo_apps->currentData().toString(), ok); + XDGDesktop app(ui->combo_apps->currentData().toString()); //Set the output variables - appExec = LXDG::getDesktopExec(app); + appExec = app.getDesktopExec(); appPath = app.path; appFile = app.filePath; setPreferredApplication(app.filePath); //save this app to this extension as a recommendation diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts index 1a1f9f18..f27df3a4 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts @@ -4,132 +4,132 @@ <context> <name>LFileDialog</name> <message> - <location filename="../LFileDialog.ui" line="14"/> + <location filename="../LFileDialog.ui" line="14"></location> <source>Open With...</source> <translation>Открыть с помощью...</translation> </message> <message> - <location filename="../LFileDialog.ui" line="68"/> + <location filename="../LFileDialog.ui" line="68"></location> <source>Preferred</source> <translation>Предпочтительный</translation> </message> <message> - <location filename="../LFileDialog.ui" line="75"/> + <location filename="../LFileDialog.ui" line="75"></location> <source>Available</source> <translation>Доступно</translation> </message> <message> - <location filename="../LFileDialog.ui" line="82"/> + <location filename="../LFileDialog.ui" line="82"></location> <source>Custom</source> <translation>Пользовательские</translation> </message> <message> - <location filename="../LFileDialog.ui" line="131"/> + <location filename="../LFileDialog.ui" line="131"></location> <source>Binary Location</source> <translation>Расположение Бинарного Приложения</translation> </message> <message> - <location filename="../LFileDialog.ui" line="138"/> + <location filename="../LFileDialog.ui" line="138"></location> <source>Find</source> <translation>Найти</translation> </message> <message> - <location filename="../LFileDialog.ui" line="199"/> + <location filename="../LFileDialog.ui" line="199"></location> <source>Set this application as the default </source> <translation>Использовать это приложение по умолчанию </translation> </message> <message> - <location filename="../LFileDialog.ui" line="221"/> + <location filename="../LFileDialog.ui" line="221"></location> <source>OK</source> <translation>OK</translation> </message> <message> - <location filename="../LFileDialog.ui" line="235"/> + <location filename="../LFileDialog.ui" line="235"></location> <source>Cancel</source> <translation>Отмена</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="40"/> + <location filename="../LFileDialog.cpp" line="40"></location> <source>(Email Link)</source> <translation>(Email адрес)</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="41"/> + <location filename="../LFileDialog.cpp" line="41"></location> <source>(Internet URL - %1)</source> <translation>(Интернет URL - %1)</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="114"/> + <location filename="../LFileDialog.cpp" line="114"></location> <source>Audio</source> <translation>Звук</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="115"/> + <location filename="../LFileDialog.cpp" line="115"></location> <source>Video</source> <translation>Видео</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="116"/> + <location filename="../LFileDialog.cpp" line="116"></location> <source>Multimedia</source> <translation>Мультимедиа</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="117"/> + <location filename="../LFileDialog.cpp" line="117"></location> <source>Development</source> <translation>Разработка</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="118"/> + <location filename="../LFileDialog.cpp" line="118"></location> <source>Education</source> <translation>Образование</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="119"/> + <location filename="../LFileDialog.cpp" line="119"></location> <source>Game</source> <translation>Игры</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="120"/> + <location filename="../LFileDialog.cpp" line="120"></location> <source>Graphics</source> <translation>Графика</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="121"/> + <location filename="../LFileDialog.cpp" line="121"></location> <source>Network</source> <translation>Сети</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="122"/> + <location filename="../LFileDialog.cpp" line="122"></location> <source>Office</source> <translation>Офис</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="123"/> + <location filename="../LFileDialog.cpp" line="123"></location> <source>Science</source> <translation>Наука</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="124"/> + <location filename="../LFileDialog.cpp" line="124"></location> <source>Settings</source> <translation>Настройки</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="125"/> + <location filename="../LFileDialog.cpp" line="125"></location> <source>System</source> <translation>Система</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="126"/> + <location filename="../LFileDialog.cpp" line="126"></location> <source>Utilities</source> <translation>Инструменты</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="127"/> + <location filename="../LFileDialog.cpp" line="127"></location> <source>Other</source> <translation>Разное</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="271"/> + <location filename="../LFileDialog.cpp" line="271"></location> <source>Find Application Binary</source> <translation>Найти Бинарное Приложение</translation> </message> @@ -137,69 +137,69 @@ <context> <name>QObject</name> <message> - <location filename="../main.cpp" line="51"/> + <location filename="../main.cpp" line="51"></location> <source>File Error</source> <translation>Ошибка Файла</translation> </message> <message> - <location filename="../main.cpp" line="187"/> - <location filename="../main.cpp" line="193"/> + <location filename="../main.cpp" line="187"></location> + <location filename="../main.cpp" line="193"></location> <source>Audio Volume %1%</source> <translation>Громкость %1%</translation> </message> <message> - <location filename="../main.cpp" line="201"/> - <location filename="../main.cpp" line="210"/> + <location filename="../main.cpp" line="201"></location> + <location filename="../main.cpp" line="210"></location> <source>Screen Brightness %1%</source> <translation>Яркость Экрана %1%</translation> </message> <message> - <location filename="../main.cpp" line="242"/> + <location filename="../main.cpp" line="242"></location> <source>Invalid file or URL: %1</source> <translation>Неверный файл или URL-адрес: %1</translation> </message> <message> - <location filename="../main.cpp" line="264"/> + <location filename="../main.cpp" line="264"></location> <source>File could not be opened: %1</source> <translation>Файл не может быть открыт: %1</translation> </message> <message> - <location filename="../main.cpp" line="273"/> + <location filename="../main.cpp" line="273"></location> <source>Application shortcut is missing the launching information (malformed shortcut): %1</source> <translation>В ярлыке приложения отсутствует информация для запуска (неверный формат ярлыка): %1</translation> </message> <message> - <location filename="../main.cpp" line="284"/> + <location filename="../main.cpp" line="284"></location> <source>URL shortcut is missing the URL: %1</source> <translation>В ярлыке отсутствует URL-адрес: %1</translation> </message> <message> - <location filename="../main.cpp" line="295"/> + <location filename="../main.cpp" line="295"></location> <source>Directory shortcut is missing the path to the directory: %1</source> <translation>В ярлыке отсутствует путь к папке: %1</translation> </message> <message> - <location filename="../main.cpp" line="300"/> + <location filename="../main.cpp" line="300"></location> <source>Unknown type of shortcut : %1</source> <translation>Неизвестный тип ярлыка: %1</translation> </message> <message> - <location filename="../main.cpp" line="362"/> + <location filename="../main.cpp" line="362"></location> <source>Binary Missing</source> <translation>Приложение отсутствует</translation> </message> <message> - <location filename="../main.cpp" line="362"/> - <source>Could not find "%1". Please ensure it is installed first.</source> - <translation>Не найден "%1". Пожалуйста, убедитесь, что он установлен в первую очередь. </translation> + <location filename="../main.cpp" line="362"></location> + <source>Could not find "%1". Please ensure it is installed first.</source> + <translation>Не найден "%1". Пожалуйста, убедитесь, что он установлен в первую очередь.</translation> </message> <message> - <location filename="../main.cpp" line="412"/> + <location filename="../main.cpp" line="412"></location> <source>Application Error</source> <translation>Ошибка Приложения</translation> </message> <message> - <location filename="../main.cpp" line="412"/> + <location filename="../main.cpp" line="412"></location> <source>The following application experienced an error and needed to close:</source> <translation>Следующее приложение вызвало ошибку и должно быть закрыто:</translation> </message> diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts index 8325525c..2bc08ed2 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts @@ -1,135 +1,135 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE TS> <TS version="2.1" language="sv"> <context> <name>LFileDialog</name> <message> - <location filename="../LFileDialog.ui" line="14"/> + <location filename="../LFileDialog.ui" line="14"></location> <source>Open With...</source> <translation>Öppna med...</translation> </message> <message> - <location filename="../LFileDialog.ui" line="68"/> + <location filename="../LFileDialog.ui" line="68"></location> <source>Preferred</source> <translation>Föredras</translation> </message> <message> - <location filename="../LFileDialog.ui" line="75"/> + <location filename="../LFileDialog.ui" line="75"></location> <source>Available</source> <translation>Tillgänglig</translation> </message> <message> - <location filename="../LFileDialog.ui" line="82"/> + <location filename="../LFileDialog.ui" line="82"></location> <source>Custom</source> <translation>Anpassad</translation> </message> <message> - <location filename="../LFileDialog.ui" line="131"/> + <location filename="../LFileDialog.ui" line="131"></location> <source>Binary Location</source> <translation>Binärens Plats</translation> </message> <message> - <location filename="../LFileDialog.ui" line="138"/> + <location filename="../LFileDialog.ui" line="138"></location> <source>Find</source> <translation>Hitta</translation> </message> <message> - <location filename="../LFileDialog.ui" line="199"/> + <location filename="../LFileDialog.ui" line="199"></location> <source>Set this application as the default </source> <translation>Sätt detta program som standard</translation> </message> <message> - <location filename="../LFileDialog.ui" line="221"/> + <location filename="../LFileDialog.ui" line="221"></location> <source>OK</source> <translation>OK</translation> </message> <message> - <location filename="../LFileDialog.ui" line="235"/> + <location filename="../LFileDialog.ui" line="235"></location> <source>Cancel</source> <translation>Avbryt</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="40"/> + <location filename="../LFileDialog.cpp" line="40"></location> <source>(Email Link)</source> <translation>(Email Länk)</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="41"/> + <location filename="../LFileDialog.cpp" line="41"></location> <source>(Internet URL - %1)</source> <translation>(Internet URL - %1)</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="114"/> + <location filename="../LFileDialog.cpp" line="114"></location> <source>Audio</source> <translation>Ljud</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="115"/> + <location filename="../LFileDialog.cpp" line="115"></location> <source>Video</source> <translation>Video</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="116"/> + <location filename="../LFileDialog.cpp" line="116"></location> <source>Multimedia</source> <translation>Multimedia</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="117"/> + <location filename="../LFileDialog.cpp" line="117"></location> <source>Development</source> <translation>Utveckling</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="118"/> + <location filename="../LFileDialog.cpp" line="118"></location> <source>Education</source> <translation>Utbildning</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="119"/> + <location filename="../LFileDialog.cpp" line="119"></location> <source>Game</source> <translation>Spel</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="120"/> + <location filename="../LFileDialog.cpp" line="120"></location> <source>Graphics</source> <translation>Grafik</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="121"/> + <location filename="../LFileDialog.cpp" line="121"></location> <source>Network</source> <translation>Nätverk</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="122"/> + <location filename="../LFileDialog.cpp" line="122"></location> <source>Office</source> <translation>Kontorsprogram</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="123"/> + <location filename="../LFileDialog.cpp" line="123"></location> <source>Science</source> <translation>Vetenskap</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="124"/> + <location filename="../LFileDialog.cpp" line="124"></location> <source>Settings</source> <translation>Inställningar</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="125"/> + <location filename="../LFileDialog.cpp" line="125"></location> <source>System</source> <translation>System</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="126"/> + <location filename="../LFileDialog.cpp" line="126"></location> <source>Utilities</source> <translation>Verktyg</translation> </message> <message> - <location filename="../LFileDialog.cpp" line="127"/> + <location filename="../LFileDialog.cpp" line="127"></location> <source>Other</source> <translation>Annat </translation> </message> <message> - <location filename="../LFileDialog.cpp" line="271"/> + <location filename="../LFileDialog.cpp" line="271"></location> <source>Find Application Binary</source> <translation>Hitta Programmets Binär </translation> </message> @@ -137,69 +137,69 @@ <context> <name>QObject</name> <message> - <location filename="../main.cpp" line="51"/> + <location filename="../main.cpp" line="51"></location> <source>File Error</source> <translation>Filfel</translation> </message> <message> - <location filename="../main.cpp" line="187"/> - <location filename="../main.cpp" line="193"/> + <location filename="../main.cpp" line="187"></location> + <location filename="../main.cpp" line="193"></location> <source>Audio Volume %1%</source> <translation>Ljudvolym %1%</translation> </message> <message> - <location filename="../main.cpp" line="201"/> - <location filename="../main.cpp" line="210"/> + <location filename="../main.cpp" line="201"></location> + <location filename="../main.cpp" line="210"></location> <source>Screen Brightness %1%</source> <translation>Skärmljusstyrka %1%</translation> </message> <message> - <location filename="../main.cpp" line="242"/> + <location filename="../main.cpp" line="242"></location> <source>Invalid file or URL: %1</source> <translation>Ogiltig fil eller URL %1</translation> </message> <message> - <location filename="../main.cpp" line="264"/> + <location filename="../main.cpp" line="264"></location> <source>File could not be opened: %1</source> <translation>Filen kunde inte öppnas: %1</translation> </message> <message> - <location filename="../main.cpp" line="273"/> + <location filename="../main.cpp" line="273"></location> <source>Application shortcut is missing the launching information (malformed shortcut): %1</source> <translation>Program genväg saknar startinformation (missbildad genväg): %1</translation> </message> <message> - <location filename="../main.cpp" line="284"/> + <location filename="../main.cpp" line="284"></location> <source>URL shortcut is missing the URL: %1</source> <translation>URL genväg saknas URL: %1</translation> </message> <message> - <location filename="../main.cpp" line="295"/> + <location filename="../main.cpp" line="295"></location> <source>Directory shortcut is missing the path to the directory: %1</source> <translation>Genvägen till katalogen saknar sökvägen till katalogen :%1</translation> </message> <message> - <location filename="../main.cpp" line="300"/> + <location filename="../main.cpp" line="300"></location> <source>Unknown type of shortcut : %1</source> <translation>Okänd typ av genväg: %1</translation> </message> <message> - <location filename="../main.cpp" line="362"/> + <location filename="../main.cpp" line="362"></location> <source>Binary Missing</source> - <translation type="unfinished"></translation> + <translation>Binär saknas</translation> </message> <message> - <location filename="../main.cpp" line="362"/> - <source>Could not find "%1". Please ensure it is installed first.</source> - <translation type="unfinished"></translation> + <location filename="../main.cpp" line="362"></location> + <source>Could not find "%1". Please ensure it is installed first.</source> + <translation>Kunde inte hitta "%1". Se till att du har detta programmet installerat först.</translation> </message> <message> - <location filename="../main.cpp" line="412"/> + <location filename="../main.cpp" line="412"></location> <source>Application Error</source> <translation>Program fel</translation> </message> <message> - <location filename="../main.cpp" line="412"/> + <location filename="../main.cpp" line="412"></location> <source>The following application experienced an error and needed to close:</source> <translation>Följande program upplevde ett fel och behövde stängas:</translation> </message> diff --git a/src-qt5/core/lumina-open/main.cpp b/src-qt5/core/lumina-open/main.cpp index 756bef25..68d2575b 100644 --- a/src-qt5/core/lumina-open/main.cpp +++ b/src-qt5/core/lumina-open/main.cpp @@ -80,17 +80,19 @@ void showOSD(int argc, char **argv, QString message){ } void LaunchAutoStart(){ - QList<XDGDesktop> xdgapps = LXDG::findAutoStartFiles(); + QList<XDGDesktop*> xdgapps = LXDG::findAutoStartFiles(); for(int i=0; i<xdgapps.length(); i++){ //Generate command and clean up any stray "Exec" field codes (should not be any here) - QString cmd = LXDG::getDesktopExec(xdgapps[i]); + QString cmd = xdgapps[i]->getDesktopExec(); if(cmd.contains("%")){cmd = cmd.remove("%U").remove("%u").remove("%F").remove("%f").remove("%i").remove("%c").remove("%k").simplified(); } //Now run the command if(!cmd.isEmpty()){ - qDebug() << " - Auto-Starting File:" << xdgapps[i].filePath; + qDebug() << " - Auto-Starting File:" << xdgapps[i]->filePath; QProcess::startDetached(cmd); } } + //make sure we clean up all the xdgapps structures + for(int i=0; i<xdgapps.length(); i++){ xdgapps[i]->deleteLater(); } } QString cmdFromUser(int argc, char **argv, QString inFile, QString extension, QString& path, bool showDLG=false){ @@ -109,11 +111,10 @@ QString cmdFromUser(int argc, char **argv, QString inFile, QString extension, QS }else{ defApp = LFileDialog::getDefaultApp(extension); } //qDebug() << "extension:" << extension << "defApp:" << defApp; if( !defApp.isEmpty() && !showDLG ){ - bool ok = false; if(defApp.endsWith(".desktop")){ - XDGDesktop DF = LXDG::loadDesktopFile(defApp, ok); - if(ok){ - QString exec = LXDG::getDesktopExec(DF); + XDGDesktop DF(defApp); + if(DF.isValid()){ + QString exec = DF.getDesktopExec(); if(!exec.isEmpty()){ qDebug() << "[lumina-open] Using default application:" << DF.name << "File:" << inFile; if(!DF.path.isEmpty()){ path = DF.path; } @@ -258,15 +259,14 @@ void getCMD(int argc, char ** argv, QString& binary, QString& args, QString& pat QString cmd; bool useInputFile = false; if(extension=="desktop" && !showDLG){ - bool ok = false; - XDGDesktop DF = LXDG::loadDesktopFile(inFile, ok); - if(!ok){ + XDGDesktop DF(inFile); + if(!DF.isValid()){ ShowErrorDialog( argc, argv, QString(QObject::tr("File could not be opened: %1")).arg(inFile) ); } switch(DF.type){ case XDGDesktop::APP: if(!DF.exec.isEmpty()){ - cmd = LXDG::getDesktopExec(DF,ActionID); + cmd = DF.getDesktopExec(ActionID); if(!DF.path.isEmpty()){ path = DF.path; } watch = DF.startupNotify || !DF.filePath.contains("/xdg/autostart/"); }else{ diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts index c3da1cd8..84739b42 100644 --- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts +++ b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts @@ -9,34 +9,34 @@ <translation>Forma</translation> </message> <message> - <location filename="../LLockScreen.ui" line="114"/> + <location filename="../LLockScreen.ui" line="114"></location> <source>Password</source> <translation>Slaptažodis</translation> </message> <message> - <location filename="../LLockScreen.ui" line="126"/> + <location filename="../LLockScreen.ui" line="126"></location> <source>Unlock Session</source> <translation>Atrakinti seansą</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="39"/> + <location filename="../LLockScreen.cpp" line="39"></location> <source>Locked by: %1</source> <translation>Užrakino: %1</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="76"/> + <location filename="../LLockScreen.cpp" line="76"></location> <source>Too Many Failures</source> - <translation type="unfinished"></translation> + <translation>Per daug nesėkmių</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="76"/> + <location filename="../LLockScreen.cpp" line="76"></location> <source>Wait %1 Minutes</source> - <translation type="unfinished"></translation> + <translation>Palaukite %1 minutes</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="77"/> + <location filename="../LLockScreen.cpp" line="77"></location> <source>Failed Attempts: %1</source> - <translation type="unfinished"></translation> + <translation>Nepavykusių bandymų: %1</translation> </message> </context> </TS> diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts index 0f3d9759..99de4b6a 100644 --- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts +++ b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts @@ -9,34 +9,34 @@ <translation>Экран блокировки</translation> </message> <message> - <location filename="../LLockScreen.ui" line="114"/> + <location filename="../LLockScreen.ui" line="114"></location> <source>Password</source> <translation>Пароль</translation> </message> <message> - <location filename="../LLockScreen.ui" line="126"/> + <location filename="../LLockScreen.ui" line="126"></location> <source>Unlock Session</source> <translation>Разблокировать сессию</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="39"/> + <location filename="../LLockScreen.cpp" line="39"></location> <source>Locked by: %1</source> <translation>Заблокировано: %1</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="76"/> + <location filename="../LLockScreen.cpp" line="76"></location> <source>Too Many Failures</source> - <translation type="unfinished"></translation> + <translation>Слишком много неудач</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="76"/> + <location filename="../LLockScreen.cpp" line="76"></location> <source>Wait %1 Minutes</source> - <translation type="unfinished"></translation> + <translation>Подождите %1 минут(ы)</translation> </message> <message> - <location filename="../LLockScreen.cpp" line="77"/> + <location filename="../LLockScreen.cpp" line="77"></location> <source>Failed Attempts: %1</source> - <translation type="unfinished"></translation> + <translation>Неудачные попытки: %1</translation> </message> </context> </TS> |