» »

[razvoj] klon windows commanderja za linux

[razvoj] klon windows commanderja za linux

1
2
3

CaqKa ::

daedalus. narobe si razumel.
tiste extenšne imam jaz izključno zaradi tc. ker brez njih lahko tri ure klikam predno se prebijem do my documents.
hardlink je bolj kot ne sicer kozmetika.. pride pa prav pri tem ko kake fajle editiraš ki so v različnih dirih pa si jih vse v enga namečeš.
recimo htmlje..
v browseru kličeš orginal ki je za dvanajstimi mapami in ima ustrezne slike in cssje še v svojem diru, ostalo pa urejaš nekje drugje.. recimo na c:temp\

in sem še vedno mnenja da je za povprečnega janeza explorer hitrejši.
kar se pa zmogljivosti tiče pa poslušajte owco ;)

64202 ::

NTFS hardlinki ne grejo preko particij, ne? No, vista bo baje mela softlinke... koncno :)
I am NaN, I am a free man!

64202 ::

> Namreč gradnik, ki je seznam, podatke dobiva iz ločene liste. Sedaj me pa zanima, ali je način, da:
> 1. usvarim dve dodatni listi(negradnik) in ločim imenike in datoteke
> 2. Nato posamezno listo abecedno sortiram
> 3. V seznam(gradnik) najprej dodam imenike, nato pa datoteke

> Ali obstaja kak bolj eleganten način?

Po moje je najbolj simpl (nisem pa se ravno file managerja delal btw :)), da nardis en seznam structov, ki jih ob pravih trenutkih posortiras*.
* pravi trenutki: user klikne na stolpec za sortiranje po stolpcu, nov filet dodas na seznam, ...
struct file_entry {
  int type;
  std::string name;
  time_t modified;
  ...
};

Potem pa nardis se primerjalno funkcijo, s katero se ta seznam sortira. Ta funkcija se spreminja glede na to, na kar se trenutno sortira zadeva (ime, datum, ...), popolnoma preprosto pa za direktorije (type == DIR) vedno vrnes, da so pred fileti (type == FILE). Recimo tkole (agliagli c/c++ koda :)):
#define DIR 0
#define FILE 1

#define C_NAME 0
#define C_MODIFIED 1
#define C_SIZE 2
...

bool less(const file_entry &f1, const file_entry &f2)
{
  if(f1.type != f2.type) return f1.type < f2.type;
  
  if(column_comparison == C_MODIFIED && f1.modified != f2.modified)
      return f1.modified < f2.modified;
  if(column_comparison == C_SIZE && f1.size != f2.size)
      return f1.size < f2.size;
  ...

  return f1.name < f2.name;
}


To vse skupaj bi moralo lepo pasat v MVC filozofijo...
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

OwcA ::

Ta funkcija se spreminja glede na to, na kar se trenutno sortira zadeva

Pošten FM omogoča sortiranje po večih ključih hkrati. :P
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

64202 ::

Mislis, da nastavis prioriteto vsakemu stolpcu? Frik :)). Bom vam to pustil za domaco nalogo :P
I am NaN, I am a free man!

BigWhale ::

Jaz bi naredil en razred DirectoryEntry, potem bi naredil en DirectoryList razred, vanj bi nabasal vse DirectoryEntry vnose za vsak element v direktoriju posebaj. DirectoryEntry bi imel vec atributov, med drugimi tudi tip, ki pove ali je to direktorij, symlink, hardlink ali pa navadna datoteka. Potem pa implementiras sortiranje v DirectoryList classu.

BigWhale ::

Ah, GTK... C... Nisem prebral druge strani odgovorov... Ignore me. (Or move to KDE ;> )

64202 ::

> naredil en razred DirectoryEntry, potem bi naredil en DirectoryList razred

Dokaj neproduktivno, ampak se da :P
GObject Generator
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

bojsi ::

Caqka:
"tiste extenšne imam jaz izključno zaradi tc. ker brez njih lahko tri ure klikam predno se prebijem do my documents."

Jaz pridem do My documents v TC-ju v sekundi. Ne glede kje se nahajam. Poskusi: CTRl-D.

Zgodovina sprememb…

  • spremenil: bojsi ()

kixs ::

Samo na temo Explorer vs Total Commander... je ni stvari, ki bi jo lahko v Explorerju bolje/hitreje naredil! Sem uporabnik Windows Commanderja od verzije 1.5 naprej, spremljal razvoj, tudi predlagal nekaj zadev (bookmarke in copy/move v background).

Kar se tice samega projekta izdelave klona, pa so fantje itaq izrazili zeljo, da se cim vec naucijo pri programiranju in izdelavi programa(ov). Zato tudi, ce bi naredili se en Notepad, ne bi bilo nic narobe.

Vec programov, vecja izbira... nic slabega v tem :)

LP

napsy ::

bom najprej ono mojo idejo sprobu. Pol se pa grem lotit lepši del dela :)
"If you die, you die. But when you live you live. There is no time to waste."

OwcA ::

Čisto tako, čemu GTK+ in C, ko je toliko lepših pristopov?
Otroška radovednost - gonilo napredka.

napsy ::

Ker to najbolje znam od ostalih pristopov :)
"If you die, you die. But when you live you live. There is no time to waste."

64202 ::

Gtk ma stabilen binaren c vmesnik. KDE pa nima kolikor vem. To je en mozen plus.

Druga moznost je cisti Qt, pa potem staticno zapeces zraven. Ali pa gtk--, pa c++ del (podobno kot Qt) staticno zapalis zraven. Plus Qt-ja je to, da je popolnoma spoliran na win/lin/mac, gtk pa samo na linuxu deluje zaresdobro[tm].

S tem vsem se seveda ubadas, ce hoces svoj softver ponujat v zapakirani installable binarni obliki. BW bo pa ziher rekel, da naj raje nardi gentoo ebuild :D
I am NaN, I am a free man!

NoUse4AName ::

QT je tudi precej bolj spoliran na linuxu kot pa windowsih.

64202 ::

Hm, zarad cesa pa? Cist tko vprasam, kolikor sem videl, se Qt programi vsaj pravilno zrendrajo pod winsi. Gtk (kar se vidi recimo v gaimu) ma vcas tezave, recimo checkboxi so v win temi hecne barve, tooltipi ostajajo na ekranu pa ne bi smeli, ...
I am NaN, I am a free man!

NoUse4AName ::

Takih očitnih težav kot si povedal za gtk ni. Prva tezava ki sem jo imel je bilo, da na windowsih se sporocila ne posiljajo ce okno premikas ali resizas (vseeno v kateri niti se sporocila posiljajo). Zame je to bil precejsen problem ker se nobeni QT signali ne posiljajo. Je pa res da je to v resnici Win32 API in X server razlika.
Druga tezava je bila ker sem imel v programu vec niti in ni bil tako stabilen v windows. Ob izhodu iz programa se je program na windowsih pogosto zrusil na linuxu pa nikoli.
Tretja stvar kar je bolj aplikativno v tej temi je bila pocasnost. QDirModel kontrola je obupno pocasna (implementirana kontrola za sprehajanje po disku).
Osebno se mi ni dalo vlagat truda v Model/View arhitekturo, ker je treba precej postudirat da ti je jasno. Klasicni kontroli so pa vcasih malce cudni. Pri uporabi QTreeCtrl se recimo nikoli ne vklopi horizontal scrollbar.

Zgodovina sprememb…

64202 ::

> Osebno se mi ni dalo vlagat truda v Model/View arhitekturo, ker je treba precej postudirat da ti je jasno.

Vidim, da so v qt 4.1 postimal proxy modele, kar je bil kar velik minus v qt 4.0... Ceprav ne vem no, recimo da nardis eno tabelco, moras subclassat QAbstractTableModel in implementirat tri preproste funkcije (rowCount, columnCount, data). Za spremembe pa sprozis kar signal layoutChanged() pa je (kar je na velikih seznamih verjetno zelo pocasno:). Mam pa premalo kilometrine/perspektive pri GUI aplikacijah, da bi se upal reci, ali so zadevo izvedli dobro ali ne... Zna kdo na hitro razlozit, kako je to izvedeno v GTK+?
I am NaN, I am a free man!

CaqKa ::

>>> Vec programov, vecja izbira... nic slabega v tem :)

jaz pa mislim, da je. več zmede namreč. think again.

Monster ::

..sej tabolše programe potem folk hitro izpostavi in pretestira med seboj :)
Ka zaboga...

napsy ::

Zanima me če kdo pozna kake funkcijo, ki vrne velikost naprave (recimo /dev/hda1) in zaseden prostor za linux?
"If you die, you die. But when you live you live. There is no time to waste."

Brane2 ::

Čej gor filesystem, ga zmountaj nekam, če že ni, nato pa:

df -h /dir_kamor_si_mountal
On the journey of life, I chose the psycho path.

napsy ::

Em ne. Mene sam zanimajo funkcije, ki bi vrnale seznam zmountanih naprav pa nekatere podatke, kot jih na primer vrne df).
"If you die, you die. But when you live you live. There is no time to waste."

napsy ::

"If you die, you die. But when you live you live. There is no time to waste."

BigWhale ::

Trenutno je za multiplatfrom aplikacijo verjetno najboljsa izbira Qt 4.1

Thomas ::

Samo ena majhna vzpodbuda z moje strani!

Delaš?
Man muss immer generalisieren - Carl Jacobi

napsy ::

Mal premišljujem o hitrosti pa o omrežni podpori. Bo treba mal list pa svinčnik v roke primit :)
"If you die, you die. But when you live you live. There is no time to waste."

napsy ::


Za malo publicitete ;)
"If you die, you die. But when you live you live. There is no time to waste."

napsy ::

Prilagam še reportažo za pre-0.0.1 verzijo.

What's new in CVS:
- full keyboard navigation,
- two seperated tree views,
- disk usage information,
- show permissions in the tree column,
- show/hide hidden UNIX files,
- items are selectable and colored red when selected with space,
- path combo does make history
"If you die, you die. But when you live you live. There is no time to waste."

Thomas ::

Ajd, dobr delaš!

Nadaljuj.
Man muss immer generalisieren - Carl Jacobi

BigWhale ::

CTRL-U

To zamenja panela, ena izmed najpomembnejsih komand... ;)

Jebiveter ::

Pravkar sem s presenecenjem ugotovil, da Total Commander podpira tab-e (torej, vec tabov v vsakem panelu). To je vsekakor feature, ki bi zlo prisel prav.
Certainty of death. Small chance of success. What are we waiting for?

CCfly ::

Osebno se mi ni dalo vlagat truda v Model/View arhitekturo, ker je treba precej postudirat da ti je jasno.

Kakšen model pa misliš da uporablja GTK+ ? Poglej si npr. GtkTree.

PS: Model-View-Controller
"My goodness, we forgot generics!" -- Danny Kalev

napsy ::

Tabe ni problema dat not, bomo poskusili ko bo program zadost uporaben. Zanima me bolj, kako bi bilo, če bi bil seznam takšen:
.
Več informacij na račun velikosti posamezne vrstice.
"If you die, you die. But when you live you live. There is no time to waste."

OwcA ::

Z ad-hoc modelom si skorajda zagotoviš, da ne boš privabil dobrih programerjev. Seveda bo tudi kode več in jo bo težje vzdrževati.
Otroška radovednost - gonilo napredka.

PARTyZAN ::

Napsy: Meni sicer tole ni vsec, ampak je moznost, da bi dal tako, da bi se v nastavitvah vklopilo/izklopilo.

BigWhale ::

Daj zacni ze v Qtju delati, da bos imel multiplatform aplikacijo... Pa ti se jaz kaj pomagam... :P

sverde21 ::

Ja lahk bi še za WIN zravn naredu... pol bi bil pa resna konkurenca TC >:D
<?php echo `w`; ?>

napsy ::

Eh, qt mi je preveč antipatičen. Sicer bo pa možno poganjat tudi na winsih tk da ste lahko brez skrbi :-)
"If you die, you die. But when you live you live. There is no time to waste."

sverde21 ::

Ja samo za win mora biti še dodatna kolona z končnicami... tudi pri v linux nebi to pogrešal, čeprav v linux končnica nima bistvenega pomena vsaj za OS ampak je v veliko pomoč uporabniku :))
<?php echo `w`; ?>

napsy ::

Vrste se rešujejo z MIME file types. Ravno tu je majhen problem. sicer obstaja libmime sam so vsi tenutnih poskusi uporabe spodleteli.
"If you die, you die. But when you live you live. There is no time to waste."

sverde21 ::

Vem da se vrste rešujejo z MIME ampak jst sm mislil na datoteke z končnicami... npr. .jpg .gif,... bi bilo fajn, da bi bile končnice v posebni koloni, po kateri lahko sortiraš... jst mam zdj v win zmeraj sortirano najprej po končnici in nato po imenu, tako veliko hitreje najdem kašno datoteko, ker najprej iščem po končnici in potem po imenu, če pa imaš samo po imenu se moraš pa prebijati čez vse tipe datotek...:\
<?php echo `w`; ?>

napsy ::

bom dodal pod taske. Sicer je pa 0.0.1-rc1 verzija načrtovana enkrat januarja. Tk da tisti ki lahko testirate, se pripravite :)
"If you die, you die. But when you live you live. There is no time to waste."

napsy ::

Rabim malo pomoči ...

V glavnem GUI threadu naredim nov thread ki bo kopiru datoteko (file_copy_thread). Ta thread pa mora vstopiti v GU thread ter spremenit stanje progress bara glede na % kopiranega. Problem je pa ta, da callback funkcija, ki se bo izvedla v glavnem threadu ne dobi pravega parametra za %(tip double). Primer:
------
window_progres.show() /* V GUI threadu prikaže okno za prikaz stanja kopiranja. */
thread_copy = g_thread_create(oc_file_copy, &file_data, FALSE, NULL); /* Ustvari thread za kopiranje */
..

oc_file_copy() {
...
g_idle_add(oc_file_copy_update, (gpointer)p_done); /* Kadar bo GUI thread v IDLE stanju, se kliče funkcija oc_file_copy_update(), pri tem je parameter p_done kjer je shranjen procent kopiranega. */
...
}
oc_file_copy_update(double *p_done) {
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(oc_window_main->window_copy->progress_state),
(gdouble)*p_done); /* no tukaj pa sedaj zupdejtam progress bar v main threadu. */
}

------
Pri oc_file_copy_update() se zalomi, ker ne dobim pravega p_done. Kaj bi to bilo narobe? Manjka kak mutex???
"If you die, you die. But when you live you live. There is no time to waste."

64202 ::

En mozen dokaj cist pristop je, da posiljas v GUI loop evente (ali karkoli ze ima GTK+) iz copy threada, ko se kaj spremeni, v taki obliki:
unsigned long long already_copied, unsigned long long total

Mogoce bi bilo dobro to tudi na cas omejit (na 500ms recimo), da GUI ne dobi brezveze prevec eventov...

ps.: Ce res hoces z double* sarit po prostoru drugega threada moras ziher imet mutex ja. Pa se fejst moras pazit, da se tist thread ni vmes koncal! Torej nucas recimo se en semafor v copy threadu, da pocaka, da GUI loop zazna da je fertik. Pac, raje naredi z eventom IMO :)
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

napsy ::

Hm zdej se progress bar lepo updejta. Neki sem narobe castu. Je pa en drug problem. Program se včasih obnaša nepričakovano pri začetku kopiranja (sesuva). Recimo string ki pove pot cilja je pokvarjen. Take napake naj bi se pojavljale kadar mešaš gui thread in ostale threade. Sam čudno je kr js nč podobnega ne najdem.
"If you die, you die. But when you live you live. There is no time to waste."

napsy ::

ok sm porihtu. zgleda da se še bom mogu marsikaj glede threadov naučit :)

No v glavnem CVS koda podpira kopiranje ene datoteke tako da lahko preizkusite :)
"If you die, you die. But when you live you live. There is no time to waste."

64202 ::

En dober blogpost na temo GUI + threadi:
Well, I'm Back: Night Of The Living Threads >:D
I am NaN, I am a free man!

napsy ::

Sj threadi so kr vredu sam je treba zelo pazit. Upam pa da bo do konca januarja neka pre-0.0.1 verzija na voljo.
"If you die, you die. But when you live you live. There is no time to waste."

BigWhale ::

Se nekaj za v razmislek:

Bodoci uporabniki pricakujejo kopiranje v backgroundu... ;)
1
2
3


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Navigacija v Total Commanderju

Oddelek: Operacijski sistemi
241997 (1675) R33D3M33R
»

ideja

Oddelek: Programiranje
61226 (1098) root987
»

memory pool

Oddelek: Programiranje
51079 (994) BigWhale
»

Explorer alternativa...

Oddelek: Programska oprema
101613 (1497) tratto
»

iščem C++ programerje

Oddelek: Programiranje
81292 (1194) napsy

Več podobnih tem