[RIJEŠENO] KDE - Kako dodati novi plasma widget?

Teme vezane za KDE grafičko okruženje.

Moderator/ica: Moderatori/ce

Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

danas nakon pokretanja aplikacije, pošaljem komandu LINK te dobijem poruku u KDEVELOP ( qDebug javlja iz O1 klase )
O1::link ... linked already
i dalje radim najnormalnije API upite s autorizacijom ??? sad mi tek ništa nije jasno ! neke sesije se ne gase ?

ovo ću testirati narednih dana, ali mi se čini da je ovo normalno ponašanje , a ono što sam doživio na početku je možda povezano s činjenicom da sam često pozivao UNLINK naredbu, pa sam na neki način isprovocirao taj bug :thmb-up
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

dovoljno je alata u torbi za Flickr API, idem složiti prvi koristan upit - zanima me ima li komentara ispod moje slike i šta kažu !? to je jednostavna informacija koju lako dobijem u internet pregledniku, ali recimo da smo jaaako zauzeti i ne želimo otvarati preglednik, nego zaposlimo naš engine da nas obavijesti o tome.

projekt je na samom startu, nemamo još izgrađenu bazu podataka o vlastitim slikama na flickr - naprosto ću izabrati jednu fotografiju iz preglednika i zapisati photo_id koji se nalazi u adresnom linku preglednika.

recimo da nas zanimaju komentari u zadnjih sat vremena. trebat ćemo unix-time-stamp kao dio upita. koristimo ovu metodu:

Kod: Označi sve

  qint64 unixtime_sada = QDateTime::currentMSecsSinceEpoch() / 1000;
  qint64 unixtime_prije_sat = unixtime_sada - 3600;
pozivamo API funkciju flickr.photos.comments.getList sa ovim argumentima:

Kod: Označi sve

    QByteArray paramName1("method");
    QString mes1 = QString("flickr.photos.comments.getList");
    reqParams << O0RequestParameter(paramName1, mes1.toLatin1());
    QByteArray paramName2("api-key");
    QString mes2 = QString(O1_KEY);
    reqParams << O0RequestParameter(paramName2, mes2.toLatin1());
    QByteArray paramName3("photo_id");
    QString mes3 = QString("29903216193");
ovdje ćemo nešto kemijati, nemam još jasan plan što i kako, za sada ide photo_id izabran 'odoka'

Kod: Označi sve

    reqParams << O0RequestParameter(paramName3, mes3.toLatin1());
    QByteArray paramName4("max_comment_date");
    QString mes4 = QString::number(unixtime_sada);
    reqParams << O0RequestParameter(paramName4, mes4.toLatin1());
    QByteArray paramName5("min_comment_date");
    QString mes5 = QString::number(unixtime_prije_sat);
    reqParams << O0RequestParameter(paramName5, mes5.toLatin1());
i s ovim vremenima nisam još odlučio. ako će dojava ići za svaki komentar, onda treba pozivati ovaj upit barem svakih deset minuta. ako ću samo graditi lokalni 'zid' onda je dovoljno jednom svakog sata .

odgovor stiže kao formatirani XML dokument. pretvaramo ga u listu zapisa (nodes) tagiranih s "comment", unutar svakog zapisa pamtimo atribute author, author_name, realname, iconserver, iconfarm te tekst unutar svakog zapisa. to odradimo, recimo ovako:

Kod: Označi sve

    QDomNode node;
    QDomElement elem;
    QDomDocument doc;
    Komentar k1;  

    doc.setContent(data);      
    QDomNodeList list1 = doc.elementsByTagName("comment");
    QList<Komentar> list2;
ovdje koristim klasu Komentar kao lokalnu strukturu koja pamti polja (atribute) koji mi trebaju za prikaz na ekranu. sve skupa ide u listu, tako da mogu spremiti više komentara odjednom.

Kod: Označi sve

    for(int i = 0 ; i < list1.count() ; i++)
    {
        node = list1.item(i);
        elem = node.toElement(); 
        if (elem.hasAttribute("author")) k1.m_author = elem.attribute("author");
        if (elem.hasAttribute("author_name")) k1.m_author_name = elem.attribute("author_name");
        if (elem.hasAttribute("realname")) k1.m_realname = elem.attribute("realname");
        if (elem.hasAttribute("iconserver")) k1.m_iconserver = elem.attribute("iconserver");
        if (elem.hasAttribute("iconfarm")) k1.m_iconfarm = elem.attribute("iconfarm");
        k1.m_tekst = elem.text();
        list2.append( k1 );
        qDebug() << k1.m_author << k1.m_author_name << k1.m_realname << k1.m_tekst;
    }
interesantno je kako se može iz polja author, iconserver te iconfarm doći do stvarne slike avatara na ovom linku:

Kod: Označi sve

    http://farm{icon-farm}.staticflickr.com/{icon-server}/buddyicons/{author}.jpg
ostaje da razmislim oću li 'dizati' pop-up na svaki novi komentar ili ću složiti 'ploču' gdje ću pokazati što se desilo u proteklih sat vremena ... ili da ostavim korisniku da sam podesi te opcije u settings od aplikacije ?!
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

ajmo ponovit gradivo , LINK naredba u normalnom radu dobije 'token i secret' s flickr API servisa bez potrebe da se otvara internet preglednik i uvijek iznova potvrđuje autorizacija aplikaciji od strane korisnika. takvo ponašanje sam izazvao tako što sam uz LINK pozivao i UNLINK što je nepotrebno i POGREŠNO !!!

idemo dalje. dodat ćemo bazu podataka u aplikaciju, za početak provjerite da li radi naredba sqlite3 iz terminala. ako ne radi, ajmo instalirati paket

Kod: Označi sve

 sudo zypper in sqlite3
kreirat ćemo lokalnu bazu , neka se zove flickr.db , sqlite snima bazu kao običan fajl, zapamtite putanju fajla - ta se putanja mora upisati kad pozivate bazu iz Qt aplikacije.

Kod: Označi sve

 sqlite3 flickr.db 

otvara se 'interpreter' sqlite alata, koji čeka vašu SQL komandu, ukucajte ( može copy-paste ) ovako nešto

Kod: Označi sve

CREATE TABLE photo(photo_id integer primary key, id text, owner, text, secret text, ownername text);
stvarna tablica ima više polja, ovdje sam skratio, tek toliko da vidimo kako se jednostavno kreira tablica u sqlite bazi

za kraj u novi red napiši

Kod: Označi sve

 .quit 
napuštamo sqlite 'interpreter' , baza je spremna za upotrebu - za sada ima samo jednu tablicu photo, sasvim dovoljno za početak.

u KDEVELOP ću dodati klasu DBlite koja ima standardne metode za manipulaciju zapisima u tablici: add, remove, list ... neću ovdje prepisivati klasu jer će ionako čitav projekt biti dostupan na GitHub, dovoljno je da shvatimo hodogram kamo idemo.

sada možemo pohraniti rezultate upita sa flickr API servera u lokalnu bazu. prva stvar koju ćemo pohraniti u bazu su podaci o vlastitim slikama na flickr. za to koristimo poziv API funkcije

Kod: Označi sve

 flickr.people.getPhotos 
upit ima dosta opcija:

++ ID korisnika na flickr ( recimo - vlastiti ID ). ID ima format xxxxxxx@Nxx , vidljiv je u adresnoj liniji preglednika kad otvorimo bilo koju sliku

++ možemo izabrati datum kad je slika postavljena na flickr ( od ... do ... )

++ extras - možemo zatražiti dodatna polja - tags, geo ...

nakon što dobijem rezultate od API servisa - standardni XML dokument - pozivam addPhoto metodu klase DBlite koja sprema podatke u lokalnu bazu. na početku te metode postavio sam poziv na metodu photoExists koja ne dozvoljava da unosim duplikate. na taj način mogu pozivati upit flickr.people.getPhotos kod svakog starta aplikacije ili češće - po potrebi.

jedan od ciljeva aplikacije jest mogućnost prikaza vaših fotografija na desktopu. pomoć pri selekciji fotografija može biti pripadnost nekom albumu, nekoj grupi, kako je tagirana itd. možemo se osloniti samo na atribute koji postoje na flickr serveru, ali možemo dodati i atribute po svom izboru i pohraniti ih u lokalnu bazu i na taj način stvoriti 'dodanu vrijednost' aplikacije u odnosu na flickr.
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

ovaj projekt je još daleko od završetka, ali možete već sada krenuti na GitHub, pa zavirite slobodno - neko možda završi projekt prije mene he he

++ prijavio sam se kao korisnik KEPICA na GitHub, projekt se zove kde-flickr-api

++ link na projekt

https://github.com/kepica/kde-flickr-api

DODATAK:
korištenje GitHub servisa se vrlo brzo savlada, postoji puno uputa i nema potrebe da ovdje navodim cijeli hodogram. napisat ću samo onu rutinu koja je potrebna u svakodnevnom radu kad se lokalne izmjene šalju na GitHub server. naredbe se kucaju u terminalu, postavimo se u 'source' direktorij projekta, najprije dodajemo izmjene u lokalni repo ovom naredbom

Kod: Označi sve

 git add *
zatim dodajemo opisno ime verzije

Kod: Označi sve

 git commit -m "4th commit" 
na kraju šaljemo lokalne izmjene na server

Kod: Označi sve

  git push origin master 
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

oćemo li konačno vidjeti koju sliku s flikera ?
pa bio bi red ... to je osnovni cilj ovog projekta - donijeti lijepe slike s flikera na KDE desktop !

do sada smo bili u granicama C++ projekta , koristeći KDEVELOP radno okruženje. nema razloga da i slike ne pokažemo na taj način. ili ipak ima ?

postoji barem jedan razlog zašto neću izabrati to riješenje , a to je - želim naučiti kako radi plasmoid ! osim moje radoznalosti, postoje i objektivni razlozi - intuicija mi govori da će tehnologija QtQuick odnosno QML biti najbrža i najbolja za ovaj posao.

unutar KDEVELOP postoji template za Plasma > Plasmoid koji sam iskoristio. otvorio sam novi projekt, nazvao ga FOTO i dobio osnovnu ljusku koja sadrži potrebnu strukturu direktorija: build te package folder , kao i osnovne fajlove: metadata.desktop te main.qml . međutim koliko god se ja trudio da složim lančer za plasmoid - nisam uspio !? najdalje što sam stigao - otvorio se plasmoidviewer prozor , ali od mog plasmoida ni traga niti glasa !

na kraju sam odustao od pokušaja da pokrenem plasmoid unutar KDEVELOP, te sam složio slijedeći hodogram koji radi bez greške

1) napravim izmjene u main.qml

2) otvorim terminal i postavim se u direktorij gdje je KDEVELOP napravio CMakeLists.txt fajl
ispod toga direktorija nalaze se folderi build te package što ga je template stvorio za plasmoid

3)
kucam ovu naredbu:

Kod: Označi sve

plasmapkg2 -i package
sad dobijemo da se naš plasmoid pojavi u sistemu - možemo ga dodati na desni-klik ADD WIDGET na desktop. možemo ga i vidjeti na popisu plasmoida, pod imenom org.kde.foto ako kucamo naredbu

Kod: Označi sve

  plasmapkg2 -list 

nećemo ga dodavati na desktop za sada ! postoji bolji način da se testira plasmoid. kucamo slijedeću naredbu u terminalu

4)

Kod: Označi sve

plasmoidviewer -a org.kde.foto
otvori se prozor s popisom grešaka ! niste valjda mislili da če proraditi od prve he he ... neke greške se pojave unutar plasmaviewer prozora, a neke se ispišu u terminalu ! zapišemo greške, zatvorimo plasmaviewer prozor i odradimo ovu naredbu u terminalu

5)

Kod: Označi sve

plasmapkg2 -r org.kde.foto
vratimo se u KDEVELOP i popravimo greške u main.qml, i dalje tako ciklički na točku 3) instaliramo, zatim 4) testiramo i opet 5) brišemo i tako sve dok nismo zadovoljni s plasmoidom

DODATAK:
postoje brojni linkovi koji su korisni na ovu temu, ali ovaj je 'biblija'

https://techbase.kde.org/Development/Tu ... 2/QML2/API
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

sad se moram smijati sam sebi - zaista se vidi da sam 'novak' u svijetu KDE desktopa !
ono što sam si zamislio kao cilj - već postoji u sistemu - upravo onako kako ja želim :thmb-up

dakle , desni klik na desktop daje mi opciju CONFIGURE DESKTOP, dobijem ovakav dijalog:

slika

u dijalogu za izbor slike na radnoj površini - wallpaper - u polju Layout, mogu izabrati FOLDER VIEW , te dodati bilo koji lokani folder gdje sam spremio svoje slike ! nadalje mogu izabrati SLIDESHOW te standardne opcije kako rasporediti slike na ekranu :bravo
tu su i dodatne opcije ( vrijeme trajanja jednog slajda ) itd. dakle plasma ima riješeno sve što možeš poželjeti :kava

moja potraga za plasmoidima je završena :lulz neki drugi projekt me možda vrati na ovu priču, ali sada se vraćam C++ projektu
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

evo da se počastimo za blagdane jednom lijepom kolekcijom slika za desktop. kako sam 'otkrio' u prošlom postu - dovoljno je da spremimo slike u lokalni folder, prijavimo taj folder u plasma 'Wallpaper SlideShow' i uživamo !

nije zabavno uvijek vrtiti vlastite slike - premda su one baš najdraže, danas ćemo potražiti nove i nepoznate slike, da nam osvježe desktop. koristimo naredbu flickr.photos.search iz flickr API servisa. naredba flickr.photos.search ima puno opcija: biramo ili vlastite slike, ili slike prijatelja, familije ili izaberemo nasumice sasvim nepoznate slike.

vrijeme je blagdana i flickr je izbacio tag: 'decorations' kao jedan od najpopularnijih, ajmo skinuti nekoliko slika s tim tagom. dobijemo standradni XML odgovor iz kojeg izvlačimo linkove na slike, po pravilu:

Kod: Označi sve

https://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpg

u ovoj sintaksi sufix [mstzb] znači izbor dimenzije slike. za wallpaper dolaze u obzir samo opcije
  • z- dimenzija (640 x YYY)
  • b- dimenzija (1024 x YYY).
osobno mi je najdraže kad je desktop 'prazan' zato biram sufix z !
kad sve to složimo u konkretan link, onda to izgleda ovako ( prefix https:// ) sam namjerno izostavio:


farm6.staticflickr.com/5606/31163944226_087a8106cf_z.jpg


rezultati pretrage mogu biti brojni, zato je dobra ideja ograničiti broj fajlova koje ćemo skidati s weba prije nego pozovemo proceduru za download slika. procedura će potrajati , stoga ćemo tijek procedure pratiti na tekst panelu naše aplikacije.

aplikacija će kreirati folder s imenom izabranog taga , s tim da 'korijenski' direktorij postavimo u settings aplikacije - recimo da je to $HOME/slike čim neka slika 'sjedne' na svoje mjesto odmah će biti dostupna za prikaz kao 'wallpaper' i plasma će je uredno prikazati na desktopu ! da bi to zaista bilo tako , moramo odraditi CONFIGURE DESKTOP kako sam naveo u prethodnom postu.

na GitHub šaljem izmjene u projektu. nove su klase:
  • PhotoDown sa weba skida sliku te snima u lokalni folder, šalje signal kad je gotovo
  • WaitSignal čeka da objekt pošalje signal prije nego idemo dalje
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

sad je aplikacija već prilično narasla, možemo reći da smo napustili 'kinder-garten' i došli u prvi razred osnovne :thmb-up

u prošlom postu uzeo sam flickr.photos.search API poziv te koristio tagove kao filter upita. tagovi su najosobniji ako smo ih sami postavili po slikama na flikeru, na taj način gradimo filter po svom ukusu.

ajmo pokušati nešto novo. želim da me aplikacija iznenadi i donese na moj desktop neke slike koje nisam vidio, a da opet zadovoljavaju neke kriterije. odgovor na to jest pretraživanje po grupama, koristimo flickr.groups.pools.getPhotos API poziv. ogromna je ponuda, ali krenut ćemo s onom najboljom u koju možete doći samo s pozivnicom - to je grupa IN_EXPLORE :bravo

API poziv flickr.groups.pools.getPhotos kao argument zahtijeva group_id , ali on se na žalost ne vidi u adresnom retku preglednika. postoji lijek i za to , koristimo API poziv flickr.groups.pools.getGroups koji nam daje popis svih (!?) grupa, opisni naziv te group_id za svaku grupu. sad imamo sve što treba za uživanje u vrhunskoj predstavi

DODATAK:
koliko god poziv flickr.groups.pools.getPhotos izgleda prirodan zapravo je jako ograničen činjenicom da dobijete samo slike koje se trenutno nalaze u pool neke grupe

koja je hrvatska riječ za pool ? čitam opis na engleskom: share resources or information for the benefit of all involved , koja je hrvatska riječ koja bi to opisala ?!

no pustimo sada semantiku, ono što želim reći flickr.photos.search također ima opciju pretrage group_id pa ćemo ubuduće koristiti upravo tu opciju jer je daleko moćnija od ove ograničene verzije sa pool :kava
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

engine aplikacije je gotov, zidari bi rekli završio sam raw-bau, na redu je fasada

dodat ćemo novu formu POSTAVKE gdje ćemo dozvoliti korisniku da podesi sve što poželi. svaka postavka se snima u sqlite bazu.

najprije ćemo izabrati i snimiti korijenski direktorij
nakon toga aplikacija sama kreira 4 pod-direktorija: tags, groups, people, personal. na tu strukturu dalje se gradi prema svakom upitu.

recimo da izgradi upit prema tagu nature, kreirat će se automatski pod-direktorij ./tags/nature
ili upit za flickr korisnika 'jarno lindroos', kreirat će se automatski pod-direktorij ./people/jarno_lindroos
ili upit za slike iz 'explore' grupe, kreira se pod-direktorij ./groups/in_explore
ili upit za vastite slike, kreirat će se ovako nešto: ./personal/2016_12

nadalje, svaki upit se pamti u bazi podataka i slike koje su već skinute s neta prepoznaju se i izdvajaju se iz procedure za download.

većina upita ide preko poziva flickr.photos.search koji koristi argumente Datum_od , Datum_do - ova dva parametra također snimamo u postavke. po defaultu to je tekući mjesec.

korisnik bira veličinu slike za download, dakle to je sufix _z ili _b

tu negdje se mora podesiti i aktivnost pop-up obavijesti koje nastaju kad netko komentira naše slike. taj dio ću još malo odgoditi za kasnije ( *** )

... izmjene su u toku, GitHub ću osvježiti uskoro

( *** ) DODATAK:
... u vezi monitoringa aktivnosti - treba oprezno postaviti učestanost API poziva !
generalno je pravilo da će aplikacija koja poziva više od 1 upit u sekundi biti blokirana. ali neki pozivi su još strože ograničeni, tako na primjer poziv flickr.activity.userPhotos ima strogo ograničenje - 1 poziv na sat !!!
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Avatar
kepica
Postovi: 492
Pridružen/a: 26 svi 2012, 13:47
Spol: M
OS: openSUSE-kde
Lokacija: orahovica

Re: [RIJEŠENO] KDE - Kako dodati novi plasma widget?

Post Postao/la kepica »

postoji alternativa , umjesto API poziva koristi RSS feed na ovom linku:

Kod: Označi sve

https:// api.flickr.com/services/feeds/ photos_public.gne ? id={tvoj-flickr-id}&lang=en-us&format=rss_200
razmake sam namjerno stavio da 'pokvarim' link jer ne želim da forum napravi neispravni link. obriši razmake, upiši svoj (ili bilo čiji) flickr-id i prepiši link u Akregator ili neki drugi RSS feed čitač pa možeš vidjeti kako izgleda flickr RSS feed

interesantno da API dokumentacija navodi nekoliko feed servera (linkova) ali to je sve (tiho) pogašeno, ostao je samo ovaj koji sam naveo.
još jedan interesantan detalj, kad u web pregledniku otvorite na flickr stranici 'fotostrim' korisnika, u adresnom retku dodajte na kraju

Kod: Označi sve

?details=1
izgled stranice se izmjeni i na dnu stranice se pojavi RSS feed gumb koji možete povuci-potegni (drag'n'drop) tehnikom dovući u RSS čitač :thmb-up
'81: ZX81 '83:ZX spectrum '85: Apple IIe '86:C-64 *** '87:PC-XT *** '88:PC-AT *** '90:386 *** 'itd.
Odgovori