develop #11

Merged
itdominator merged 36 commits from develop into master 2023-09-19 01:11:24 +00:00
1529 changed files with 79148 additions and 57723 deletions
Showing only changes of commit df688d919e - Show all commits
README.md
bin
plugins
archiver
disk_usage
favorites
file_properties
git_clone
movie_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.py
compat
cookies.py
dependencies
downloader
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
anvato_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.py
jsinterp.pyminicurses.py
networking
options.pyplugins.py
postprocessor
socks.pyupdate.py
utils
version.pywebvtt.py
pyrightconfig.json
src
debs
chown_all.sh
solarfm-0-0-1-x64
versions
solarfm-0.0.1
SolarFM
SolarFM_exec_bin.cppcompileBin.shcreate-binary.shcreate-standalone.shcreate-stubs.shdebugger.shsetup.pysolarfm.toml
solarfm
..o__builtins__.py__init__.py__main__.pyapp.py
core
data.txt
plugins
shellfm
utils
user_config

@@ -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()

@@ -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