develop #11
README.mdpyrightconfig.json
bin
plugins
archiver
disk_usage
favorites
file_properties
git_clone
__init__.py__main__.pymanifest.json
pexpect
ANSI.pyFSM.pyLICENSE__init__.py_async.pybashrc.shexceptions.pyexpect.pyfdpexpect.pypopen_spawn.pypty_spawn.py
plugin.pyptyprocess
pxssh.pyreplwrap.pyrun.pyscreen.pyspawnbase.pyutils.pymovie_tv_info
py_run
searcher
template
translate
trasher
vod_thumbnailer
youtube_download
download.shplugin.py
yt_dlp-2022.2.4.dist-info
yt_dlp
YoutubeDL.py__init__.py__main__.py
__pyinstaller
aes.pycache.pycasefold.pycompat.pycompat
cookies.pydependencies
downloader
__init__.pycommon.pydash.pyexternal.pyf4m.pyfc2.pyfragment.pyhls.pyhttp.pyism.pymhtml.pyniconico.pyrtmp.pyrtsp.pywebsocket.pyyoutube_live_chat.py
extractor
__init__.py_extractors.pyabc.pyabcnews.pyabcotvs.pyabematv.pyacademicearth.pyacast.pyacfun.pyadn.pyadobeconnect.pyadobepass.pyadobetv.pyadultswim.pyaenetworks.pyaeonco.pyafreecatv.pyagora.pyairmozilla.pyairtv.pyaitube.pyaliexpress.pyaljazeera.pyallocine.pyalphaporno.pyalsace20tv.pyalura.pyamara.pyamazon.pyamazonminitv.pyamcnetworks.pyamericastestkitchen.pyamp.pyanchorfm.pyangel.pyanimelab.pyanimeondemand.pyant1newsgr.pyanvato.py
jsinterp.pyminicurses.pyanvato_token_generator
aol.pyapa.pyaparat.pyappleconnect.pyapplepodcasts.pyappletrailers.pyarchiveorg.pyarcpublishing.pyard.pyarkena.pyarnes.pyarte.pyasiancrush.pyatresplayer.pyatscaleconf.pyatttechchannel.pyatvat.pyaudimedia.pyaudioboom.pyaudiodraft.pyaudiomack.pyaudius.pyawaan.pyaws.pyazmedien.pybaidu.pybanbye.pybandaichannel.pybandcamp.pybannedvideo.pybbc.pybeatbump.pybeatport.pybeeg.pybehindkink.pybellmedia.pyberufetv.pybet.pybfi.pybfmtv.pybibeltv.pybigflix.pybigo.pybild.pybilibili.pybiobiochiletv.pybiqle.pybitchute.pybitwave.pyblackboardcollaborate.pybleacherreport.pyblerp.pyblinkx.pyblogger.pybloomberg.pybokecc.pybongacams.pybostonglobe.pybox.pyboxcast.pybpb.pybr.pybrainpop.pybravotv.pybreakcom.pybreitbart.pybrightcove.pybundesliga.pybusinessinsider.pybuzzfeed.pybyutv.pyc56.pycableav.pycallin.pycaltrans.pycam4.pycamdemy.pycamfm.pycammodels.pycamsoda.pycamtasia.pycamwithher.pycanalalpha.pycanalc2.pycanalplus.pycanvas.pycarambatv.pycartoonnetwork.pycbc.pycbs.pycbsinteractive.pycbslocal.pycbsnews.pycbssports.pyccc.pyccma.pycctv.pycda.pycellebrite.pyceskatelevize.pycgtn.pychannel9.pycharlierose.pychaturbate.pychilloutzone.pychingari.pychirbit.pycinchcast.pycinemax.pycinetecamilano.pyciscolive.pyciscowebex.pycjsw.pyclipchamp.pycliphunter.pyclippit.pycliprs.pyclipsyndicate.pyclosertotruth.pycloudflarestream.pycloudy.pyclubic.pyclyp.pycmt.pycnbc.pycnn.pycomedycentral.pycommon.pycommonmistakes.pycommonprotocols.pycondenast.pycontv.pycorus.pycoub.pycozytv.pycpac.pycracked.pycrackle.pycraftsy.pycrooksandliars.pycrowdbunker.pycrtvg.pycrunchyroll.pycspan.pyctsnews.pyctv.pyctvnews.pycultureunplugged.pycuriositystream.pycwtv.pycybrary.pydacast.pydaftsex.pydailymail.pydailymotion.pydailywire.pydamtomo.pydaum.pydaystar.pydbtv.pydctp.pydeezer.pydefense.pydemocracynow.pydetik.pydeuxm.pydfb.pydhm.pydigg.pydigitalconcerthall.pydigiteka.pydiscogs.pydiscovery.pydiscoverygo.pydiscoveryvr.pydisney.pydispeak.pydlf.pydlive.pydoodstream.pydotsub.pydouyutv.pydplay.pydrbonanza.pydreisat.pydrooble.pydropbox.pydropout.pydrtuber.pydrtv.pydtube.pyduboku.pydumpert.pydvtv.pydw.pyeagleplatform.pyebaumsworld.pyebay.pyechomsk.pyegghead.pyehow.pyeighttracks.pyeinthusan.pyeitb.pyelevensports.pyellentube.pyelonet.pyelpais.pyembedly.pyengadget.pyepicon.pyepoch.pyeporner.pyeroprofile.pyertgr.pyescapist.pyespn.pyesri.pyettutv.pyeuropa.pyeuropeantour.pyeurosport.pyeuscreen.pyeveryonesmixtape.pyexpotv.pyexpressen.pyextractors.pyextremetube.pyeyedotv.pyfacebook.pyfancode.pyfaz.pyfc2.pyfczenit.pyfifa.pyfilmmodu.pyfilmon.pyfilmweb.pyfirsttv.pyfivemin.pyfivetv.pyflickr.pyfolketinget.pyfootyroom.pyformula1.pyfourtube.pyfourzerostudio.pyfox.pyfox9.pyfoxgay.pyfoxnews.pyfoxsports.pyfptplay.pyfranceculture.pyfranceinter.pyfrancetv.pyfreesound.pyfreespeech.pyfreetv.pyfreshlive.pyfrontendmasters.pyfujitv.pyfunimation.pyfunk.pyfunker530.pyfusion.pyfuyintv.pyfxnetworks.pygab.pygaia.pygameinformer.pygamejolt.pygamespot.pygamestar.pygaskrank.pygazeta.pygdcvault.pygedidigital.pygeneric.pygenericembeds.pygenius.pygettr.pygfycat.pygiantbomb.pygiga.pygigya.pyglide.pyglobalplayer.pyglobo.pyglomex.pygmanetwork.pygo.pygodtube.pygofile.pygolem.pygoodgame.pygoogledrive.pygooglepodcasts.pygooglesearch.pygoplay.pygopro.pygoshgay.pygotostage.pygputechconf.pygronkh.pygroupon.pyharpodeon.pyhbo.pyhearthisat.pyheise.pyhellporno.pyhelsinki.pyhentaistigma.pyhgtv.pyhidive.pyhistoricfilms.pyhitbox.pyhitrecord.pyhketv.pyhollywoodreporter.pyholodex.pyhornbunny.pyhotnewhiphop.pyhotstar.pyhowcast.pyhowstuffworks.pyhrefli.pyhrfensehen.pyhrti.pyhse.pyhuajiao.pyhuffpost.pyhungama.pyhuya.pyhypem.pyhypergryph.pyhytale.pyicareus.pyichinanalive.pyidolplus.pyign.pyiheart.pyiltalehti.pyimdb.pyimggaming.pyimgur.pyina.pyinc.pyindavideo.pyinfoq.pyinstagram.pyinternazionale.pyinternetvideoarchive.pyiprima.pyiqiyi.pyir90tv.pyislamchannel.pyisraelnationalnews.pyitprotv.pyitv.pyivi.pyivideon.pyiwara.pyixigua.pyizlesene.pyjable.pyjamendo.pyjapandiet.pyjeuxvideo.pyjixie.pyjoj.pyjove.pyjstream.pyjwplatform.pykakao.pykaltura.pykanal2.pykanalplay.pykankan.pykankanews.pykaraoketv.pykarrierevideos.pykeezmovies.pykelbyone.pyketnet.pykhanacademy.pykick.pykicker.pykickstarter.pykinja.pykinopoisk.pykommunetv.pykompas.pykonserthusetplay.pykoo.pykrasview.pykth.pyku6.pykusi.pykuwo.pyla7.pylaola1tv.pylastfm.pylazy_extractors.pylbry.pylci.pylcp.pylecture2go.pylecturio.pyleeco.pylefigaro.pylego.pylemonde.pylenta.pylibraryofcongress.pylibsyn.pylifenews.pylikee.pylimelight.pyline.pylinkedin.pylinuxacademy.pyliputan6.pylistennotes.pylitv.pylivejournal.pylivestream.pylivestreamfails.pylnkgo.pylocalnews8.pylovehomeporn.pylrt.pylumni.pylynda.pym6.pymagellantv.pymagentamusik360.pymailru.pymainstreaming.pymalltv.pymangomolo.pymanoto.pymanyvids.pymaoritv.pymarkiza.pymassengeschmacktv.pymasters.pymatchtv.pymdr.pymedaltv.pymediaite.pymediaklikk.pymedialaan.pymediaset.pymediasite.pymediastream.pymediaworksnz.pymedici.pymegaphone.pymegatvcom.pymeipai.pymelonvod.pymeta.pymetacafe.pymetacritic.pymgoon.pymgtv.pymiaopai.pymicrosoftembed.pymicrosoftstream.pymicrosoftvirtualacademy.pymildom.pyminds.pyministrygrid.pyminoto.pymiomio.pymirrativ.pymirrorcouk.pymit.pymitele.pymixch.pymixcloud.pymlb.pymlssoccer.pymnet.pymocha.pymoevideo.pymofosex.pymojvideo.pymorningstar.pymotherless.pymotorsport.pymovieclips.pymoviepilot.pymoview.pymoviezine.pymovingimage.pymsn.pymtv.pymuenchentv.pymurrtube.pymuseai.pymusescore.pymusicdex.pymwave.pymxplayer.pymychannels.pymyspace.pymyspass.pymyvi.pymyvideoge.pymyvidster.pymzaalo.pyn1.pynate.pynationalgeographic.pynaver.pynba.pynbc.pyndr.pyndtv.pynebula.pynekohacker.pynerdcubed.pyneteasemusic.pynetverse.pynetzkino.pynewgrounds.pynewspicks.pynewstube.pynewsy.pynextmedia.pynexx.pynfb.pynfhsnetwork.pynfl.pynhk.pynhl.pynick.pyniconico.pyninecninemedia.pyninegag.pyninenow.pynintendo.pynitter.pynjpwworld.pynobelprize.pynoco.pynoice.pynonktube.pynoodlemagazine.pynoovo.pynormalboots.pynosnl.pynosvideo.pynova.pynovaplay.pynowness.pynoz.pynpo.pynpr.pynrk.pynrl.pyntvcojp.pyntvde.pyntvru.pynubilesporn.pynuevo.pynuvid.pynytimes.pynzherald.pynzonscreen.pynzz.pyodatv.pyodkmedia.pyodnoklassniki.pyoftv.pyoktoberfesttv.pyolympics.pyon24.pyonce.pyondemandkorea.pyonefootball.pyonenewsnz.pyoneplace.pyonet.pyonionstudios.pyooyala.pyopencast.pyopenload.pyopenrec.pyora.pyorf.pyoutsidetv.pyowncloud.pypacktpub.pypalcomp3.pypandoratv.pypanopto.pyparamountplus.pyparler.pyparliamentliveuk.pyparlview.pypatreon.pypbs.pypearvideo.pypeekvids.pypeertube.pypeertv.pypeloton.pypeople.pyperformgroup.pyperiscope.pypgatour.pyphilharmoniedeparis.pyphoenix.pyphotobucket.pypiapro.pypicarto.pypiksel.pypinkbike.pypinterest.pypixivsketch.pypladform.pyplanetmarathi.pyplatzi.pyplayfm.pyplayplustv.pyplays.pyplaystuff.pyplaysuisse.pyplaytvak.pyplayvid.pyplaywire.pypluralsight.pyplutotv.pypodbayfm.pypodchaser.pypodomatic.pypokemon.pypokergo.pypolsatgo.pypolskieradio.pypopcorntimes.pypopcorntv.pyporn91.pyporncom.pypornez.pypornflip.pypornhd.pypornhub.pypornotube.pypornovoisines.pypornoxo.pypr0gramm.pyprankcast.pypremiershiprugby.pypresstv.pyprojectveritas.pyprosiebensat1.pyprx.pypuhutv.pypuls4.pypyvideo.pyqdance.pyqingting.pyqqmusic.pyr7.pyradiko.pyradiobremen.pyradiocanada.pyradiode.pyradiofrance.pyradiojavan.pyradiokapital.pyradiozet.pyradlive.pyrai.pyraywenderlich.pyrbgtum.pyrbmaradio.pyrcs.pyrcti.pyrds.pyrecurbate.pyredbee.pyredbulltv.pyreddit.pyredgifs.pyredtube.pyregiotv.pyrentv.pyrestudy.pyreuters.pyreverbnation.pyrheinmaintv.pyrice.pyrmcdecouverte.pyro220.pyrockstargames.pyrokfin.pyroosterteeth.pyrottentomatoes.pyroxwel.pyrozhlas.pyrtbf.pyrte.pyrtl2.pyrtlnl.pyrtnews.pyrtp.pyrtrfm.pyrts.pyrtvcplay.pyrtve.pyrtvnh.pyrtvs.pyrtvslo.pyruhd.pyrule34video.pyrumble.pyrutube.pyrutv.pyruutu.pyruv.pys4c.pysafari.pysaitosan.pysamplefocus.pysapo.pysavefrom.pysbs.pyscreen9.pyscreencast.pyscreencastify.pyscreencastomatic.pyscrippsnetworks.pyscrolller.pyscte.pyseeker.pysenalcolombia.pysenategov.pysendtonews.pyservus.pysevenplus.pysexu.pyseznamzpravy.pyshahid.pyshared.pysharevideos.pyshemaroome.pyshowroomlive.pysibnet.pysimplecast.pysina.pysixplay.pyskeb.pysky.pyskyit.pyskylinewebcams.pyskynewsarabia.pyskynewsau.pyslideshare.pyslideslive.pyslutload.pysmotrim.pysnotr.pysohu.pysonyliv.pysoundcloud.pysoundgasm.pysouthpark.pysovietscloset.pyspankbang.pyspankwire.pyspiegel.pyspiegeltv.pyspike.pysport5.pysportbox.pysportdeutschland.pyspotify.pyspreaker.pyspringboardplatform.pysprout.pysrgssr.pysrmediathek.pystacommu.pystageplus.pystanfordoc.pystartrek.pystartv.pysteam.pystitcher.pystoryfire.pystreamable.pystreamanity.pystreamcloud.pystreamcz.pystreamff.pystreetvoice.pystretchinternet.pystripchat.pystv.pysubstack.pysunporno.pysverigesradio.pysvt.pyswearnet.pyswrmediathek.pysyfy.pysyvdk.pysztvhu.pytagesschau.pytass.pytastytrade.pytbs.pytdslifeway.pyteachable.pyteachertube.pyteachingchannel.pyteamcoco.pyteamtreehouse.pytechtalks.pyted.pytele13.pytele5.pytelebruxelles.pytelecaribe.pytelecinco.pytelegraaf.pytelegram.pytelemb.pytelemundo.pytelequebec.pyteletask.pytelewebion.pytempo.pytencent.pytennistv.pytenplay.pytesturl.pytf1.pytfo.pytheholetv.pytheintercept.pytheplatform.pythescene.pythestar.pythesun.pytheta.pytheweatherchannel.pythisamericanlife.pythisav.pythisoldhouse.pythisvid.pythreeqsdn.pythreespeak.pytiktok.pytinypic.pytmz.pytnaflix.pytoggle.pytoggo.pytokentube.pytonline.pytoongoggles.pytoutv.pytoypics.pytraileraddict.pytriller.pytrilulilu.pytrovo.pytrtcocuk.pytrueid.pytrunews.pytruth.pytrutv.pytube8.pytubetugraz.pytubitv.pytudou.pytumblr.pytunein.pytunepk.pyturbo.pyturner.pytv2.pytv24ua.pytv2dk.pytv2hu.pytv4.pytv5mondeplus.pytv5unis.pytva.pytvanouvelles.pytvc.pytver.pytvigle.pytviplayer.pytvland.pytvn24.pytvnet.pytvnoe.pytvnow.pytvopengr.pytvp.pytvplay.pytvplayer.pytweakers.pytwentyfourvideo.pytwentymin.pytwentythreevideo.pytwitcasting.pytwitch.pytwitter.pytxxx.pyudemy.pyudn.pyufctv.pyukcolumn.pyuktvplay.pyumg.pyunistra.pyunity.pyunscripted.pyunsupported.pyuol.pyuplynk.pyurort.pyurplay.pyusanetwork.pyusatoday.pyustream.pyustudio.pyutreon.pyvarzesh3.pyvbox7.pyveehd.pyveo.pyveoh.pyvesti.pyvevo.pyvgtv.pyvh1.pyvice.pyvidbit.pyviddler.pyvidea.pyvideocampus_sachsen.pyvideodetective.pyvideofyme.pyvideoken.pyvideomore.pyvideopress.pyvidio.pyvidlii.pyvidzi.pyvier.pyviewlift.pyviidea.pyviki.pyvimeo.pyvimm.pyvimple.pyvine.pyviqeo.pyviu.pyvk.pyvlive.pyvocaroo.pyvodlocker.pyvodpl.pyvodplatform.pyvoicerepublic.pyvoicy.pyvolejtv.pyvoot.pyvoxmedia.pyvrak.pyvrt.pyvrv.pyvshare.pyvtm.pyvube.pyvuclip.pyvupload.pyvvvvid.pyvyborymos.pyvzaar.pywakanim.pywalla.pywasdtv.pywashingtonpost.pywat.pywatchbox.pywatchindianporn.pywdr.pywebcamerapl.pywebcaster.pywebofstories.pyweibo.pyweiqitv.pyweverse.pywevidi.pyweyyak.pywhowatch.pywhyp.pywikimedia.pywillow.pywimbledon.pywimtv.pywistia.pywordpress.pyworldstarhiphop.pywppilot.pywrestleuniverse.pywsj.pywwe.pywykop.pyxanimu.pyxbef.pyxboxclips.pyxfileshare.pyxhamster.pyxiami.pyximalaya.pyxinpianchang.pyxminus.pyxnxx.pyxstream.pyxtube.pyxuite.pyxvideos.pyxxxymovies.pyyahoo.pyyandexdisk.pyyandexmusic.pyyandexvideo.pyyapfiles.pyyappy.pyyesjapan.pyyinyuetai.pyyle_areena.pyynet.pyyoujizz.pyyouku.pyyounow.pyyouporn.pyyourporn.pyyourupload.pyyoutube.pyzaiko.pyzapiks.pyzaq1.pyzattoo.pyzdf.pyzee5.pyzeenews.pyzhihu.pyzingmp3.pyzoom.pyzype.pynetworking
options.pyplugins.pypostprocessor
__init__.pycommon.pyembedthumbnail.pyexec.pyffmpeg.pymetadataparser.pymodify_chapters.pymovefilesafterdownload.pysponskrub.pysponsorblock.pyxattrpp.py
socks.pyupdate.pyutils
version.pywebvtt.pysrc
debs
chown_all.sh
solarfm-0-0-1-x64
DEBIAN
bin
opt
SolarFM
__builtins__.py__init__.py__main__.pyapp.py
context
__init__.pycontroller.pycontroller_data.py
ipc_server.pymixins
signals
plugins
shellfm
__init__.py
windows
trasher
utils
usr
share
applications
solarfm
Main_Window.gladecontexct_menu.json
fileicons
3g2.png3gp.pngai.pngair.pngasf.pngavi.pngbib.pngcls.pngcsv.pngdeb.pngdjvu.pngdmg.pngdoc.pngdocx.pngdwf.pngdwg.pngeps.pngepub.pngexe.pngf.pngf77.pngf90.pngflac.pngflv.pnggif.pnggz.pngico.pngindd.pngiso.pngjpeg.pngjpg.pnglog.pngm4a.pngm4v.pngmidi.pngmkv.pngmov.pngmp3.pngmp4.pngmpeg.pngmpg.pngmsi.pngodp.pngods.pngodt.pngoga.pngogg.pngogv.pngpdf.pngpng.pngpps.pngppsx.pngppt.pngpptx.pngpsd.pngpub.pngpy.pngqt.pngra.pngram.pngrar.pngrm.pngrpm.pngrtf.pngrv.pngskp.pngspx.pngsql.pngsty.pngtar.pngtex.pngtgz.pngtiff.pngttf.pngtxt.pngvob.pngwav.pngwmv.pngxls.pngxlsx.pngxml.pngxpi.pngzip.png
icons
key-bindings.jsonsettings.jsonui_widgets
versions
solarfm-0.0.1
SolarFM
SolarFM_exec_bin.cppcompileBin.shcreate-binary.shcreate-standalone.shcreate-stubs.shdebugger.shsetup.pysolarfm.tomlsolarfm
..o__builtins__.py__init__.py__main__.pyapp.py
core
__init__.pycontroller.pycontroller_data.py
data.txtfs_actions
mixins
ui_mixin.pywidgets
__init__.pybottom_status_info_widget.pycontext_menu_widget.py
window.pydialogs
__init__.pyabout_widget.pyappchooser_widget.pyfile_exists_widget.pymessage_widget.pynew_file_widget.pyrename_widget.pysave_load_widget.pyuser_pass_widget.py
files_view
icon_grid_widget.pyicon_tree_widget.pyio_widget.pypopups
__init__.pyio_popup_widget.pymessage_popup_widget.pypath_menu_popup_widget.pyplugins_popup_widget.py
tab_header_widget.pyplugins
shellfm
__init__.py
windows
utils
user_config
bin
usr
bin
share
@@ -81,14 +81,17 @@ class FileSearchMixin:
|
||||
|
||||
self._list_proc = None
|
||||
|
||||
|
||||
def _exec_find_file_query(self, widget=None, eve=None):
|
||||
query = widget.get_text()
|
||||
|
||||
if not query in ("", None):
|
||||
self.search_query = query
|
||||
target_dir = shlex.quote( self._fm_state.tab.get_current_directory() )
|
||||
command = ["python", f"{self.path}/utils/search.py", "-t", "file_search", "-d", f"{target_dir}", "-q", f"{query}"]
|
||||
target_dir = shlex.quote( self._fm_state.tab.get_current_directory() )
|
||||
command = ["python", f"{self.path}/utils/search.py", "-t", "file_search", "-d", f"{target_dir}", "-q", f"{query}"]
|
||||
|
||||
self._spinner.start()
|
||||
|
||||
self._list_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None)
|
||||
|
||||
|
||||
|
@@ -87,12 +87,14 @@ class GrepSearchMixin:
|
||||
|
||||
if not query.strip() in ("", None):
|
||||
self.grep_query = query
|
||||
target_dir = shlex.quote( self._fm_state.tab.get_current_directory() )
|
||||
command = ["python", f"{self.path}/utils/search.py", "-t", "grep_search", "-d", f"{target_dir}", "-q", f"{query}"]
|
||||
|
||||
target_dir = shlex.quote( self._fm_state.tab.get_current_directory() )
|
||||
command = ["python", f"{self.path}/utils/search.py", "-t", "grep_search", "-d", f"{target_dir}", "-q", f"{query}"]
|
||||
self._spinner.start()
|
||||
|
||||
self._grep_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None)
|
||||
|
||||
|
||||
def _load_grep_ui(self, data):
|
||||
Gtk.main_iteration()
|
||||
|
||||
|
@@ -60,13 +60,6 @@ class IPCServer:
|
||||
msg = conn.recv()
|
||||
|
||||
try:
|
||||
if "SEARCH_DONE|" in msg:
|
||||
ts, ret_code = msg.split("SEARCH_DONE|")[1].strip().split("|", 1)
|
||||
timestamp = float(ts)
|
||||
if self.fsearch_time_stamp or self.grep_time_stamp:
|
||||
if (timestamp > self.fsearch_time_stamp) or (timestamp > self.grep_time_stamp):
|
||||
GLib.idle_add(self.stop_spinner, (ret_code,), priority=GLib.PRIORITY_HIGH_IDLE)
|
||||
|
||||
if "SEARCH|" in msg:
|
||||
ts, file = msg.split("SEARCH|")[1].strip().split("|", 1)
|
||||
timestamp = float(ts)
|
||||
@@ -78,6 +71,10 @@ class IPCServer:
|
||||
timestamp = float(ts)
|
||||
if data and (timestamp > self.grep_time_stamp):
|
||||
GLib.idle_add(self._load_grep_ui, data, priority=GLib.PRIORITY_HIGH_IDLE)
|
||||
|
||||
if "SEARCH_DONE|" in msg:
|
||||
ts, ret_code = msg.split("SEARCH_DONE|")[1].strip().split("|", 1)
|
||||
GLib.idle_add(self.stop_spinner, (ret_code,), priority=GLib.PRIORITY_HIGH_IDLE)
|
||||
except Exception as e:
|
||||
print( repr(e) )
|
||||
|
||||
|
@@ -32,8 +32,12 @@ dt = datetime.now()
|
||||
ts = datetime.timestamp(dt)
|
||||
|
||||
|
||||
def _log(message: str = "No message passed in...") -> None:
|
||||
print(message)
|
||||
|
||||
|
||||
def send_ipc_message(message) -> None:
|
||||
conn = Client(address=_ipc_address, family="AF_UNIX", authkey=_ipc_authkey)
|
||||
conn = Client(address = _ipc_address, family = "AF_UNIX", authkey = _ipc_authkey)
|
||||
conn.send(message)
|
||||
conn.close()
|
||||
|
||||
@@ -41,9 +45,11 @@ def send_ipc_message(message) -> None:
|
||||
time.sleep(0.05)
|
||||
|
||||
|
||||
def file_search(path, query):
|
||||
def file_search(path: str = None, query: str = None) -> None:
|
||||
if not path or not query: return
|
||||
|
||||
try:
|
||||
for _path, _dir, _files in os.walk(path, topdown = True):
|
||||
for _path, _dir, _files in os.walk(path, topdown = True, onerror = _log, followlinks = True):
|
||||
for file in _files:
|
||||
if query in file.lower():
|
||||
target = os.path.join(_path, file)
|
||||
@@ -54,14 +60,13 @@ def file_search(path, query):
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
def grep_search(target=None, query=None):
|
||||
if not query or not target:
|
||||
return
|
||||
def grep_search(target: str = None, query: str = None):
|
||||
if not target or not query: return
|
||||
|
||||
# NOTE: -n = provide line numbers, -R = Search recursive in given target
|
||||
# -i = insensitive, -F = don't do regex parsing. (Treat as raw string)
|
||||
command = ["grep", "-n", "-R", "-i", "-F", query, target]
|
||||
proc = subprocess.Popen(command, stdout=subprocess.PIPE, encoding="utf-8")
|
||||
proc = subprocess.Popen(command, stdout = subprocess.PIPE, encoding = "utf-8")
|
||||
raw_data = proc.communicate()[0].strip()
|
||||
proc_data = raw_data.split("\n") # NOTE: Will return data AFTER completion (if any)
|
||||
collection = {}
|
||||
@@ -85,17 +90,23 @@ def grep_search(target=None, query=None):
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
|
||||
proc.terminate()
|
||||
data = f"GREP|{ts}|{json.dumps(collection, separators=(',', ':'), indent=4)}"
|
||||
send_ipc_message(data)
|
||||
collection = {}
|
||||
|
||||
|
||||
def search(args):
|
||||
path = args.dir
|
||||
if (path[0] == "'" and path[-1] == "'") or \
|
||||
path[0] == '"' and path[-1] == '"':
|
||||
path = path[1:-1]
|
||||
|
||||
if args.type == "file_search":
|
||||
file_search(args.dir, args.query.lower())
|
||||
file_search(path, args.query.lower())
|
||||
|
||||
if args.type == "grep_search":
|
||||
grep_search(args.dir, args.query.encode("utf-8"))
|
||||
grep_search(path, args.query.encode("utf-8"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@@ -113,8 +113,7 @@ class Controller(UIMixin, SignalsMixins, Controller_Data):
|
||||
|
||||
|
||||
def do_action_from_menu_controls(self, _action=None, eve=None):
|
||||
if not _action:
|
||||
return
|
||||
if not _action: return
|
||||
|
||||
if not isinstance(_action, str):
|
||||
action = _action.get_name()
|
||||
|
@@ -1,18 +1,19 @@
|
||||
# Python imports
|
||||
import os
|
||||
import gc
|
||||
import time
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
from .grid_mixin import GridMixin
|
||||
|
||||
|
||||
|
||||
|
||||
class TabMixin(GridMixin):
|
||||
"""docstring for TabMixin"""
|
||||
|
||||
@@ -173,27 +174,7 @@ class TabMixin(GridMixin):
|
||||
path = widget.get_text()
|
||||
|
||||
if isinstance(focused_obj, Gtk.Entry):
|
||||
path_menu_buttons = self.builder.get_object("path_menu_buttons")
|
||||
query = widget.get_text().replace(dir, "")
|
||||
files = tab.get_files() + tab.get_hidden()
|
||||
|
||||
self.clear_children(path_menu_buttons)
|
||||
show_path_menu = False
|
||||
for file, hash, size in files:
|
||||
if os.path.isdir(f"{dir}{file}"):
|
||||
if query.lower() in file.lower():
|
||||
button = Gtk.Button(label=file)
|
||||
button.show()
|
||||
button.connect("clicked", self.set_path_entry)
|
||||
path_menu_buttons.add(button)
|
||||
show_path_menu = True
|
||||
|
||||
if not show_path_menu:
|
||||
event_system.emit("hide_path_menu")
|
||||
else:
|
||||
event_system.emit("show_path_menu")
|
||||
widget.grab_focus_without_selecting()
|
||||
widget.set_position(-1)
|
||||
self.process_path_menu(widget, tab, dir)
|
||||
|
||||
if path.endswith(".") or path == dir:
|
||||
return
|
||||
@@ -205,21 +186,52 @@ class TabMixin(GridMixin):
|
||||
icon_grid.clear_and_set_new_store()
|
||||
self.update_tab(tab_label, tab, icon_grid.get_store(), wid, tid)
|
||||
|
||||
try:
|
||||
widget.grab_focus_without_selecting()
|
||||
widget.set_position(-1)
|
||||
except Exception as e:
|
||||
pass
|
||||
def process_path_menu(self, gtk_entry, tab, dir):
|
||||
path_menu_buttons = self.builder.get_object("path_menu_buttons")
|
||||
query = gtk_entry.get_text().replace(dir, "")
|
||||
files = tab.get_files() + tab.get_hidden()
|
||||
|
||||
def set_path_entry(self, button=None, eve=None):
|
||||
self.clear_children(path_menu_buttons)
|
||||
show_path_menu = False
|
||||
for file, hash, size in files:
|
||||
if os.path.isdir(f"{dir}{file}"):
|
||||
if query.lower() in file.lower():
|
||||
button = Gtk.Button(label=file)
|
||||
button.show()
|
||||
button.connect("clicked", self.set_path_entry)
|
||||
path_menu_buttons.add(button)
|
||||
show_path_menu = True
|
||||
|
||||
if not show_path_menu:
|
||||
event_system.emit("hide_path_menu")
|
||||
else:
|
||||
event_system.emit("show_path_menu")
|
||||
buttons = path_menu_buttons.get_children()
|
||||
|
||||
if len(buttons) == 1:
|
||||
self.slowed_focus(buttons[0])
|
||||
|
||||
@daemon_threaded
|
||||
def slowed_focus(self, button):
|
||||
time.sleep(0.05)
|
||||
GLib.idle_add(self.do_focused_click, *(button,))
|
||||
|
||||
def do_focused_click(self, button):
|
||||
button.grab_focus()
|
||||
button.clicked()
|
||||
|
||||
def set_path_entry(self, button = None, eve = None):
|
||||
self.path_auto_filled = True
|
||||
state = self.get_current_state()
|
||||
path = f"{state.tab.get_current_directory()}/{button.get_label()}"
|
||||
path_entry = self.builder.get_object("path_entry")
|
||||
|
||||
path_entry.set_text(path)
|
||||
path_entry.grab_focus_without_selecting()
|
||||
path_entry.set_position(-1)
|
||||
event_system.emit("hide_path_menu")
|
||||
|
||||
|
||||
def show_hide_hidden_files(self):
|
||||
wid, tid = self.fm_controller.get_active_wid_and_tid()
|
||||
tab = self.get_fm_window(wid).get_tab_by_id(tid)
|
||||
|
@@ -1,17 +1,19 @@
|
||||
# Python imports
|
||||
import os
|
||||
import gc
|
||||
import time
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
from .grid_mixin import GridMixin
|
||||
|
||||
|
||||
|
||||
|
||||
class TabMixin(GridMixin):
|
||||
"""docstring for TabMixin"""
|
||||
|
||||
@@ -85,6 +87,7 @@ class TabMixin(GridMixin):
|
||||
del watcher
|
||||
del tab
|
||||
|
||||
gc.collect()
|
||||
if not settings_manager.is_trace_debug():
|
||||
self.fm_controller.save_state()
|
||||
|
||||
@@ -173,27 +176,7 @@ class TabMixin(GridMixin):
|
||||
path = widget.get_text()
|
||||
|
||||
if isinstance(focused_obj, Gtk.Entry):
|
||||
path_menu_buttons = self.builder.get_object("path_menu_buttons")
|
||||
query = widget.get_text().replace(dir, "")
|
||||
files = tab.get_files() + tab.get_hidden()
|
||||
|
||||
self.clear_children(path_menu_buttons)
|
||||
show_path_menu = False
|
||||
for file, hash, size in files:
|
||||
if os.path.isdir(f"{dir}{file}"):
|
||||
if query.lower() in file.lower():
|
||||
button = Gtk.Button(label=file)
|
||||
button.show()
|
||||
button.connect("clicked", self.set_path_entry)
|
||||
path_menu_buttons.add(button)
|
||||
show_path_menu = True
|
||||
|
||||
if not show_path_menu:
|
||||
event_system.emit("hide_path_menu")
|
||||
else:
|
||||
event_system.emit("show_path_menu")
|
||||
widget.grab_focus_without_selecting()
|
||||
widget.set_position(-1)
|
||||
self.process_path_menu(widget, tab, dir)
|
||||
|
||||
if path.endswith(".") or path == dir:
|
||||
return
|
||||
@@ -201,18 +184,50 @@ class TabMixin(GridMixin):
|
||||
if not tab.set_path(path):
|
||||
return
|
||||
|
||||
icon_grid = self.get_icon_grid_from_notebook(notebook, f"{wid}|{tid}")
|
||||
icon_grid.clear_and_set_new_store()
|
||||
self.update_tab(tab_label, tab, store, wid, tid)
|
||||
|
||||
try:
|
||||
widget.grab_focus_without_selecting()
|
||||
widget.set_position(-1)
|
||||
except Exception as e:
|
||||
pass
|
||||
def process_path_menu(self, gtk_entry, tab, dir):
|
||||
path_menu_buttons = self.builder.get_object("path_menu_buttons")
|
||||
query = gtk_entry.get_text().replace(dir, "")
|
||||
files = tab.get_files() + tab.get_hidden()
|
||||
|
||||
def set_path_entry(self, button=None, eve=None):
|
||||
self.clear_children(path_menu_buttons)
|
||||
show_path_menu = False
|
||||
for file, hash, size in files:
|
||||
if os.path.isdir(f"{dir}{file}"):
|
||||
if query.lower() in file.lower():
|
||||
button = Gtk.Button(label=file)
|
||||
button.show()
|
||||
button.connect("clicked", self.set_path_entry)
|
||||
path_menu_buttons.add(button)
|
||||
show_path_menu = True
|
||||
|
||||
if not show_path_menu:
|
||||
event_system.emit("hide_path_menu")
|
||||
else:
|
||||
event_system.emit("show_path_menu")
|
||||
buttons = path_menu_buttons.get_children()
|
||||
|
||||
if len(buttons) == 1:
|
||||
self.slowed_focus(buttons[0])
|
||||
|
||||
@daemon_threaded
|
||||
def slowed_focus(self, button):
|
||||
time.sleep(0.05)
|
||||
GLib.idle_add(self.do_focused_click, *(button,))
|
||||
|
||||
def do_focused_click(self, button):
|
||||
button.grab_focus()
|
||||
button.clicked()
|
||||
|
||||
def set_path_entry(self, button = None, eve = None):
|
||||
self.path_auto_filled = True
|
||||
state = self.get_current_state()
|
||||
path = f"{state.tab.get_current_directory()}/{button.get_label()}"
|
||||
path_entry = self.builder.get_object("path_entry")
|
||||
|
||||
path_entry.set_text(path)
|
||||
path_entry.grab_focus_without_selecting()
|
||||
path_entry.set_position(-1)
|
||||
|
@@ -106,7 +106,7 @@ class WindowMixin(TabMixin):
|
||||
|
||||
state = self.get_current_state()
|
||||
notebook = self.builder.get_object(f"window_{state.wid}")
|
||||
tab_label = self.get_tab_label(notebook, icons_grid)
|
||||
tab_label = self.get_tab_label(notebook, state.icon_grid)
|
||||
|
||||
fileName = state.store[item][1]
|
||||
dir = state.tab.get_current_directory()
|
||||
@@ -114,7 +114,8 @@ class WindowMixin(TabMixin):
|
||||
|
||||
if isdir(file):
|
||||
state.tab.set_path(file)
|
||||
self.update_tab(tab_label, state.tab, state.store, state.wid, state.tid)
|
||||
state.icon_grid.clear_and_set_new_store()
|
||||
self.update_tab(tab_label, state.tab, state.icon_grid.get_store(), state.wid, state.tid)
|
||||
else:
|
||||
event_system.emit("open_files")
|
||||
except WindowException as e:
|
||||
|
@@ -94,4 +94,5 @@ class Window(Gtk.ApplicationWindow):
|
||||
|
||||
settings_manager.clear_pid()
|
||||
time.sleep(event_sleep_time)
|
||||
|
||||
Gtk.main_quit()
|
||||
|
11
src/versions/solarfm-0.0.1/solarfm/data.txt
Normal file
11
src/versions/solarfm-0.0.1/solarfm/data.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
<frozen importlib._bootstrap_external>:672: size=5717 KiB, count=60317, average=97 B
|
||||
<frozen importlib._bootstrap>:241: size=534 KiB, count=5538, average=99 B
|
||||
/usr/lib/python3.10/abc.py:106: size=77.9 KiB, count=290, average=275 B
|
||||
<frozen importlib._bootstrap_external>:128: size=62.1 KiB, count=532, average=119 B
|
||||
/usr/lib/python3.10/sre_compile.py:804: size=57.7 KiB, count=110, average=537 B
|
||||
/home/abaddon/Coding/Projects/Active/Python_Projects/000_Usable/gtk/SolarFM/src/versions/solarfm-0.0.1/solarfm/./shellfm/windows/tabs/tab.py:79: size=56.4 KiB, count=875, average=66 B
|
||||
/usr/lib/python3.10/site-packages/gi/types.py:52: size=54.0 KiB, count=509, average=109 B
|
||||
/usr/lib/python3.10/site-packages/gi/module.py:207: size=49.6 KiB, count=233, average=218 B
|
||||
/usr/lib/python3.10/site-packages/gi/types.py:51: size=40.1 KiB, count=733, average=56 B
|
||||
<frozen importlib._bootstrap>:359: size=38.6 KiB, count=549, average=72 B
|
Reference in New Issue
Block a user