remove obsoletes

merge-requests/65/head
fhdk 2018-09-13 11:22:35 +02:00
parent 51b2101190
commit 608475d47f
16 changed files with 547 additions and 2231 deletions

View File

@ -2,8 +2,22 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="1878e107-6f19-4cdd-96ac-cf56d1731299" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/data/advanced.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/data/default.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/__init__.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/alpm.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/browser.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/browser_base_config.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/browser_config.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/data.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/exceptions.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/hello_config.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/iso_config.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/browser/stand_alone_config.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/install-alone.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/plugins/__init__.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/src/testConfigClass.py" beforeDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@ -15,86 +29,87 @@
<session id="1179412992">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.open.time.0" value="1" />
<entry key="project.opened" value="1" />
<entry key="project.closed" value="8" />
<entry key="project.open.time.0" value="5" />
<entry key="project.open.time.4" value="2" />
<entry key="project.open.time.5" value="2" />
<entry key="project.open.time.6" value="1" />
<entry key="project.opened" value="11" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="app-utility" value="2" />
<entry key="gitignore" value="1" />
<entry key="json" value="1" />
<entry key="py" value="1" />
<entry key="glade" value="3" />
<entry key="json" value="11" />
<entry key="py" value="75" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="JSON" value="1" />
<entry key="PLAIN_TEXT" value="1" />
<entry key="Python" value="3" />
<entry key="JSON" value="11" />
<entry key="PLAIN_TEXT" value="4" />
<entry key="Python" value="77" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="Python Console" value="31" />
<entry key="app-utility" value="29" />
<entry key="dummy" value="41" />
<entry key="dummy" value="388" />
<entry key="gitignore" value="6" />
<entry key="json" value="45" />
<entry key="py" value="1001" />
<entry key="glade" value="21" />
<entry key="json" value="143" />
<entry key="py" value="4799" />
<entry key="txt" value="1380" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="JSON" value="45" />
<entry key="PLAIN_TEXT" value="47" />
<entry key="Python" value="1030" />
<entry key="JSON" value="143" />
<entry key="PLAIN_TEXT" value="1795" />
<entry key="Python" value="4859" />
</counts>
</usages-collector>
<usages-collector id="statistics.js.language.service.starts" />
</session>
</component>
<component name="FileEditorManager">
<leaf>
<file pinned="false" current-in-tab="false">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/manjaro_hello.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-315">
<caret line="33" column="38" selection-start-line="33" selection-start-column="38" selection-end-line="33" selection-end-column="38" />
<state relative-caret-position="369">
<caret line="113" column="30" lean-forward="true" selection-start-line="113" selection-start-column="30" selection-end-line="113" selection-end-column="30" />
<folding>
<element signature="e#24#42#0" expanded="true" />
<marker date="1534955423121" expanded="true" signature="7207:7233" ph="..." />
<marker date="1534955423121" expanded="true" signature="17177:17181" ph="..." />
<element signature="e#24#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
<caret line="3" column="5" selection-start-line="3" selection-start-column="5" selection-end-line="3" selection-end-column="5" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/data/preferences.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="12" column="27" selection-start-line="12" selection-start-column="27" selection-end-line="12" selection-end-column="27" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>share_dir</find>
<find>application</find>
<find>applications</find>
<find>appBrowser</find>
<find>application_browser</find>
<find>on_btn</find>
</findStrings>
<replaceStrings>
<replace>data_path</replace>
<replace>appBrowser</replace>
</replaceStrings>
</component>
<component name="Git.Settings">
@ -103,10 +118,42 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/data/preferences.json" />
<option value="$PROJECT_DIR$/src/app-utility" />
<option value="$PROJECT_DIR$/src/manjaro_hello.py" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/src/applications/applications.py" />
<option value="$PROJECT_DIR$/src/applications/applications_config.py" />
<option value="$PROJECT_DIR$/src/testConfigClass.py" />
<option value="$PROJECT_DIR$/src/applications/base_config.py" />
<option value="$PROJECT_DIR$/src/install-alone.py" />
<option value="$PROJECT_DIR$/src/applications/alpm.py" />
<option value="$PROJECT_DIR$/src/applications/app_base_config.py" />
<option value="$PROJECT_DIR$/src/applications/exceptions.py" />
<option value="$PROJECT_DIR$/src/applications/configs.py" />
<option value="$PROJECT_DIR$/applications/browser.py" />
<option value="$PROJECT_DIR$/applications/browser_config.py" />
<option value="$PROJECT_DIR$/applications/hello_config.py" />
<option value="$PROJECT_DIR$/applications/iso_config.py" />
<option value="$PROJECT_DIR$/applications/stand_alone_config.py" />
<option value="$PROJECT_DIR$/src/applications/stand_alone_config.py" />
<option value="$PROJECT_DIR$/src/applications/iso_config.py" />
<option value="$PROJECT_DIR$/src/__init__.py" />
<option value="$PROJECT_DIR$/data/browser-conf.json" />
<option value="$PROJECT_DIR$/src/plugins/applications/browser.py" />
<option value="$PROJECT_DIR$/src/applications/hello_config.py" />
<option value="$PROJECT_DIR$/src/applications/browser_base_config.py" />
<option value="$PROJECT_DIR$/src/applications/app_data.py" />
<option value="$PROJECT_DIR$/src/applications/app_browser.py" />
<option value="$PROJECT_DIR$/src/applications/browser_config.py" />
<option value="$PROJECT_DIR$/src/applications/data.py" />
<option value="$PROJECT_DIR$/src/applications/applicationbrowser.py" />
<option value="$PROJECT_DIR$/src/applications/browser.py" />
<option value="$PROJECT_DIR$/src/applications/application_browser.py" />
<option value="$PROJECT_DIR$/src/applications/__init__.py" />
<option value="$PROJECT_DIR$/src/application_utility/application_browser.py" />
<option value="$PROJECT_DIR$/src/application_utility/__init__.py" />
<option value="$PROJECT_DIR$/data/preferences.json" />
<option value="$PROJECT_DIR$/ui/manjaro-hello.glade" />
<option value="$PROJECT_DIR$/src/manjaro_hello.py" />
</list>
</option>
</component>
@ -117,16 +164,18 @@
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="146" />
<option name="y" value="68" />
<option name="x" value="1991" />
<option name="y" value="21" />
<option name="width" value="1398" />
<option name="height" value="965" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
@ -153,7 +202,6 @@
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
@ -167,6 +215,11 @@
<recent name="$PROJECT_DIR$/data" />
<recent name="$PROJECT_DIR$/src" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src" />
<recent name="$PROJECT_DIR$/src/plugins" />
<recent name="$PROJECT_DIR$" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
@ -191,33 +244,376 @@
<option name="presentableId" value="Default" />
<updated>1534949710604</updated>
</task>
<task id="LOCAL-00002" summary="split classes">
<created>1536410355410</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1536410355410</updated>
</task>
<task id="LOCAL-00003" summary="split preferences">
<created>1536411499431</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1536411499431</updated>
</task>
<task id="LOCAL-00004" summary="added plugin manager">
<created>1536411521103</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1536411521103</updated>
</task>
<task id="LOCAL-00005" summary="plugin applications">
<created>1536411558753</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1536411558753</updated>
</task>
<task id="LOCAL-00006" summary="back to one pref file">
<created>1536414428607</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1536414428607</updated>
</task>
<task id="LOCAL-00007" summary="move&#10;remove plugin manager">
<created>1536415933849</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1536415933849</updated>
</task>
<task id="LOCAL-00008" summary="rearrange">
<created>1536416490489</created>
<option name="number" value="00008" />
<option name="presentableId" value="LOCAL-00008" />
<option name="project" value="LOCAL" />
<updated>1536416490489</updated>
</task>
<task id="LOCAL-00009" summary="cosmetic">
<created>1536418940294</created>
<option name="number" value="00009" />
<option name="presentableId" value="LOCAL-00009" />
<option name="project" value="LOCAL" />
<updated>1536418940294</updated>
</task>
<task id="LOCAL-00010" summary="added comments">
<created>1536419834210</created>
<option name="number" value="00010" />
<option name="presentableId" value="LOCAL-00010" />
<option name="project" value="LOCAL" />
<updated>1536419834210</updated>
</task>
<task id="LOCAL-00011" summary="split classes">
<created>1536420193376</created>
<option name="number" value="00011" />
<option name="presentableId" value="LOCAL-00011" />
<option name="project" value="LOCAL" />
<updated>1536420193376</updated>
</task>
<task id="LOCAL-00012" summary="pack experiment">
<created>1536421211422</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1536421211422</updated>
</task>
<task id="LOCAL-00013" summary="commented screen shot url">
<created>1536421394042</created>
<option name="number" value="00013" />
<option name="presentableId" value="LOCAL-00013" />
<option name="project" value="LOCAL" />
<updated>1536421394042</updated>
</task>
<task id="LOCAL-00014" summary="minor formatting">
<created>1536422379462</created>
<option name="number" value="00014" />
<option name="presentableId" value="LOCAL-00014" />
<option name="project" value="LOCAL" />
<updated>1536422379462</updated>
</task>
<task id="LOCAL-00015" summary="redefine reload to reset">
<created>1536422647180</created>
<option name="number" value="00015" />
<option name="presentableId" value="LOCAL-00015" />
<option name="project" value="LOCAL" />
<updated>1536422647180</updated>
</task>
<task id="LOCAL-00016" summary="refactor">
<created>1536425218221</created>
<option name="number" value="00016" />
<option name="presentableId" value="LOCAL-00016" />
<option name="project" value="LOCAL" />
<updated>1536425218221</updated>
</task>
<task id="LOCAL-00017" summary="enhance logging">
<created>1536425669114</created>
<option name="number" value="00017" />
<option name="presentableId" value="LOCAL-00017" />
<option name="project" value="LOCAL" />
<updated>1536425669114</updated>
</task>
<task id="LOCAL-00018" summary="experiments">
<created>1536426261137</created>
<option name="number" value="00018" />
<option name="presentableId" value="LOCAL-00018" />
<option name="project" value="LOCAL" />
<updated>1536426261137</updated>
</task>
<task id="LOCAL-00019" summary="split classes">
<created>1536426713520</created>
<option name="number" value="00019" />
<option name="presentableId" value="LOCAL-00019" />
<option name="project" value="LOCAL" />
<updated>1536426713520</updated>
</task>
<task id="LOCAL-00020" summary="commit">
<created>1536426798365</created>
<option name="number" value="00020" />
<option name="presentableId" value="LOCAL-00020" />
<option name="project" value="LOCAL" />
<updated>1536426798365</updated>
</task>
<task id="LOCAL-00021" summary="expand/collapse group on double click">
<created>1536428318542</created>
<option name="number" value="00021" />
<option name="presentableId" value="LOCAL-00021" />
<option name="project" value="LOCAL" />
<updated>1536428318542</updated>
</task>
<task id="LOCAL-00022" summary="the mess">
<created>1536429127582</created>
<option name="number" value="00022" />
<option name="presentableId" value="LOCAL-00022" />
<option name="project" value="LOCAL" />
<updated>1536429127582</updated>
</task>
<task id="LOCAL-00023" summary="charm renames the imports to py - renamed">
<created>1536733349233</created>
<option name="number" value="00023" />
<option name="presentableId" value="LOCAL-00023" />
<option name="project" value="LOCAL" />
<updated>1536733349233</updated>
</task>
<task id="LOCAL-00024" summary="renamed to application_browser">
<created>1536734042101</created>
<option name="number" value="00024" />
<option name="presentableId" value="LOCAL-00024" />
<option name="project" value="LOCAL" />
<updated>1536734042101</updated>
</task>
<task id="LOCAL-00025" summary="renamed to application_browser">
<created>1536734080399</created>
<option name="number" value="00025" />
<option name="presentableId" value="LOCAL-00025" />
<option name="project" value="LOCAL" />
<updated>1536734080399</updated>
</task>
<task id="LOCAL-00026" summary="refactor to import modules from application_browser">
<created>1536734107278</created>
<option name="number" value="00026" />
<option name="presentableId" value="LOCAL-00026" />
<option name="project" value="LOCAL" />
<updated>1536734107278</updated>
</task>
<task id="LOCAL-00027" summary="refactor naming">
<created>1536740355223</created>
<option name="number" value="00027" />
<option name="presentableId" value="LOCAL-00027" />
<option name="project" value="LOCAL" />
<updated>1536740355223</updated>
</task>
<task id="LOCAL-00028" summary="refactor naming">
<created>1536740428541</created>
<option name="number" value="00028" />
<option name="presentableId" value="LOCAL-00028" />
<option name="project" value="LOCAL" />
<updated>1536740428541</updated>
</task>
<task id="LOCAL-00029" summary="removed application utility&#10;now import from package `application_utility`">
<created>1536755165290</created>
<option name="number" value="00029" />
<option name="presentableId" value="LOCAL-00029" />
<option name="project" value="LOCAL" />
<updated>1536755165290</updated>
</task>
<task id="LOCAL-00030" summary="the mess">
<created>1536755180580</created>
<option name="number" value="00030" />
<option name="presentableId" value="LOCAL-00030" />
<option name="project" value="LOCAL" />
<updated>1536755180580</updated>
</task>
<task id="LOCAL-00031" summary="removed application settings from preferences">
<created>1536755298128</created>
<option name="number" value="00031" />
<option name="presentableId" value="LOCAL-00031" />
<option name="project" value="LOCAL" />
<updated>1536755298128</updated>
</task>
<task id="LOCAL-00032" summary="fix manjaro_hello.py">
<created>1536759081083</created>
<option name="number" value="00032" />
<option name="presentableId" value="LOCAL-00032" />
<option name="project" value="LOCAL" />
<updated>1536759081083</updated>
</task>
<task id="LOCAL-00033" summary="conflict?">
<created>1536759713291</created>
<option name="number" value="00033" />
<option name="presentableId" value="LOCAL-00033" />
<option name="project" value="LOCAL" />
<updated>1536759713291</updated>
</task>
<task id="LOCAL-00034" summary="why is this only sometimes">
<created>1536762438800</created>
<option name="number" value="00034" />
<option name="presentableId" value="LOCAL-00034" />
<option name="project" value="LOCAL" />
<updated>1536762438800</updated>
</task>
<task id="LOCAL-00035" summary="refactor on_applications_clicked">
<created>1536762559794</created>
<option name="number" value="00035" />
<option name="presentableId" value="LOCAL-00035" />
<option name="project" value="LOCAL" />
<updated>1536762559794</updated>
</task>
<task id="LOCAL-00036" summary="refactor initialize">
<created>1536762794077</created>
<option name="number" value="00036" />
<option name="presentableId" value="LOCAL-00036" />
<option name="project" value="LOCAL" />
<updated>1536762794077</updated>
</task>
<task id="LOCAL-00037" summary="fix signal error">
<created>1536764417230</created>
<option name="number" value="00037" />
<option name="presentableId" value="LOCAL-00037" />
<option name="project" value="LOCAL" />
<updated>1536764417230</updated>
</task>
<task id="LOCAL-00038" summary="debugging on getObject error">
<created>1536764914803</created>
<option name="number" value="00038" />
<option name="presentableId" value="LOCAL-00038" />
<option name="project" value="LOCAL" />
<updated>1536764914803</updated>
</task>
<task id="LOCAL-00039" summary="debugging getObj error">
<created>1536765243062</created>
<option name="number" value="00039" />
<option name="presentableId" value="LOCAL-00039" />
<option name="project" value="LOCAL" />
<updated>1536765243062</updated>
</task>
<task id="LOCAL-00040" summary="debugging getObj error">
<created>1536765504956</created>
<option name="number" value="00040" />
<option name="presentableId" value="LOCAL-00040" />
<option name="project" value="LOCAL" />
<updated>1536765504956</updated>
</task>
<task id="LOCAL-00041" summary="refactor fil to file">
<created>1536765540320</created>
<option name="number" value="00041" />
<option name="presentableId" value="LOCAL-00041" />
<option name="project" value="LOCAL" />
<updated>1536765540320</updated>
</task>
<task id="LOCAL-00042" summary="refactor to eliminate shadow">
<created>1536765638966</created>
<option name="number" value="00042" />
<option name="presentableId" value="LOCAL-00042" />
<option name="project" value="LOCAL" />
<updated>1536765638966</updated>
</task>
<task id="LOCAL-00043" summary="debugging AttributeError on get_object which exist">
<created>1536765831882</created>
<option name="number" value="00043" />
<option name="presentableId" value="LOCAL-00043" />
<option name="project" value="LOCAL" />
<updated>1536765831882</updated>
</task>
<task id="LOCAL-00044" summary="debugging get_object error">
<created>1536767498224</created>
<option name="number" value="00044" />
<option name="presentableId" value="LOCAL-00044" />
<option name="project" value="LOCAL" />
<updated>1536767498224</updated>
</task>
<task id="LOCAL-00045" summary="debugging get_object error">
<created>1536767653840</created>
<option name="number" value="00045" />
<option name="presentableId" value="LOCAL-00045" />
<option name="project" value="LOCAL" />
<updated>1536767653840</updated>
</task>
<task id="LOCAL-00046" summary="debugging get_object returning None on valid object">
<created>1536767721691</created>
<option name="number" value="00046" />
<option name="presentableId" value="LOCAL-00046" />
<option name="project" value="LOCAL" />
<updated>1536767721691</updated>
</task>
<task id="LOCAL-00047" summary="debugging get_object returning None on valid object">
<created>1536770497272</created>
<option name="number" value="00047" />
<option name="presentableId" value="LOCAL-00047" />
<option name="project" value="LOCAL" />
<updated>1536770497272</updated>
</task>
<task id="LOCAL-00048" summary="debugging get_object returning None on valid object">
<created>1536770929972</created>
<option name="number" value="00048" />
<option name="presentableId" value="LOCAL-00048" />
<option name="project" value="LOCAL" />
<updated>1536770929972</updated>
</task>
<task id="LOCAL-00049" summary="doh! default manjaro-hello does not contain the appBrowser button">
<created>1536820041782</created>
<option name="number" value="00049" />
<option name="presentableId" value="LOCAL-00049" />
<option name="project" value="LOCAL" />
<updated>1536820041782</updated>
</task>
<task id="LOCAL-00050" summary="doh! default manjaro-hello does not contain the appBrowser button">
<created>1536820124591</created>
<option name="number" value="00050" />
<option name="presentableId" value="LOCAL-00050" />
<option name="project" value="LOCAL" />
<updated>1536820124594</updated>
</task>
<option name="localTasksCounter" value="51" />
<servers />
</component>
<component name="ToolWindowManager">
<frame x="146" y="68" width="1398" height="965" extended-state="0" />
<editor active="true" />
<frame x="1991" y="21" width="1398" height="965" extended-state="0" />
<layout>
<window_info id="Favorites" side_tool="true" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25073963" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Docker" show_stripe_button="false" />
<window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Python Console" />
<window_info anchor="bottom" id="Terminal" visible="true" weight="0.32893157" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Find" order="1" weight="0.32893157" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="right" id="SciView" />
<window_info anchor="right" id="Database" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" order="8" />
<window_info anchor="bottom" id="Database Changes" order="9" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="10" visible="true" weight="0.32893157" />
<window_info anchor="bottom" id="Python Console" order="11" weight="0.32893157" />
<window_info anchor="bottom" id="Event Log" order="12" side_tool="true" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="SciView" order="3" />
<window_info anchor="right" id="Database" order="4" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -226,6 +622,34 @@
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="experiments" />
<MESSAGE value="split classes" />
<MESSAGE value="commit" />
<MESSAGE value="expand/collapse group on double click" />
<MESSAGE value="charm renames the imports to py - renamed" />
<MESSAGE value="renamed to application_browser" />
<MESSAGE value="refactor to import modules from application_browser" />
<MESSAGE value="refactor naming" />
<MESSAGE value="removed application utility&#10;now import from package `application_utility`" />
<MESSAGE value="the mess" />
<MESSAGE value="removed application settings from preferences" />
<MESSAGE value="fix manjaro_hello.py" />
<MESSAGE value="conflict?" />
<MESSAGE value="why is this only sometimes" />
<MESSAGE value="refactor on_applications_clicked" />
<MESSAGE value="refactor initialize" />
<MESSAGE value="fix signal error" />
<MESSAGE value="debugging on getObject error" />
<MESSAGE value="debugging getObj error" />
<MESSAGE value="refactor fil to file" />
<MESSAGE value="refactor to eliminate shadow" />
<MESSAGE value="debugging AttributeError on get_object which exist" />
<MESSAGE value="debugging get_object error" />
<MESSAGE value="debugging get_object returning None on valid object" />
<MESSAGE value="doh! default manjaro-hello does not contain the appBrowser button" />
<option name="LAST_COMMIT_MESSAGE" value="doh! default manjaro-hello does not contain the appBrowser button" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
@ -238,35 +662,7 @@
</breakpoint-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/app-utility">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="450">
<caret line="63" column="9" lean-forward="true" selection-start-line="62" selection-end-line="64" selection-end-column="40" />
<folding>
<element signature="e#1167#1185#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data/preferences.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="12" column="27" selection-start-line="12" selection-start-column="27" selection-end-line="12" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/manjaro_hello.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-315">
<caret line="33" column="38" selection-start-line="33" selection-start-column="38" selection-end-line="33" selection-end-column="38" />
<folding>
<element signature="e#24#42#0" expanded="true" />
<marker date="1534955423121" expanded="true" signature="7207:7233" ph="..." />
<marker date="1534955423121" expanded="true" signature="17177:17181" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/app-utility" />
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45">
@ -274,5 +670,69 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/data/default.json" />
<entry file="file://$PROJECT_DIR$/src/install-alone.py" />
<entry file="file://$PROJECT_DIR$/src/testConfigClass.py" />
<entry file="file://$PROJECT_DIR$/src/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="27" lean-forward="true" selection-start-column="27" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/browser/exceptions.py" />
<entry file="file://$PROJECT_DIR$/src/plugins/__init__.py" />
<entry file="file://$PROJECT_DIR$/data/browser-prefs.json" />
<entry file="file://$PROJECT_DIR$/data/advanced.json" />
<entry file="file://$PROJECT_DIR$/src/browser/browser_base_config.py" />
<entry file="file://$PROJECT_DIR$/src/browser/browser_config.py" />
<entry file="file://$PROJECT_DIR$/src/browser/alpm.py" />
<entry file="file://$PROJECT_DIR$/src/browser/hello_config.py" />
<entry file="file://$PROJECT_DIR$/src/browser/iso_config.py" />
<entry file="file://$PROJECT_DIR$/src/browser/stand_alone_config.py" />
<entry file="file://$PROJECT_DIR$/src/browser/data.py" />
<entry file="file://$PROJECT_DIR$/src/browser/__init__.py" />
<entry file="file://$PROJECT_DIR$/src/browser/browser.py" />
<entry file="file://$PROJECT_DIR$/data/preferences.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="22" column="3" selection-start-line="22" selection-start-column="3" selection-end-line="22" selection-end-column="3" />
</state>
</provider>
</entry>
<entry file="file:///usr/lib/python3.7/site-packages/application_utility/browser/hello_config.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="330">
<caret line="27" selection-start-line="27" selection-end-line="27" />
</state>
</provider>
</entry>
<entry file="file:///usr/lib/python3.7/site-packages/application_utility/browser/config.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="169">
<caret line="16" selection-start-line="16" selection-end-line="16" />
<folding>
<element signature="e#0#14#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/ui/manjaro-hello.glade">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="457">
<caret line="545" column="19" lean-forward="true" selection-start-line="545" selection-start-column="19" selection-end-line="545" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/manjaro_hello.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="369">
<caret line="113" column="30" lean-forward="true" selection-start-line="113" selection-start-column="30" selection-end-line="113" selection-end-column="30" />
<folding>
<element signature="e#24#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>

View File

@ -1,660 +0,0 @@
[
{
"name": "Browsers",
"icon": "browser",
"description": "Web browsing and communication",
"apps": [
{
"name": "Chromium",
"icon": "chromium",
"description": "Open Sourced Chrome Browser",
"pkg": "chromium",
"extra": []
},
{
"name": "Falkon",
"icon": "falkon",
"description": "Qt based Web Browser",
"pkg": "falkon",
"extra": []
},
{
"name": "Firefox",
"icon": "mozilla-firefox",
"description": "Mozilla Web Browser",
"pkg": "firefox",
"extra": []
},
{
"name": "Midori",
"icon": "midori",
"description": "Lightweight Webbrowser",
"pkg": "midori",
"extra": []
},
{
"name": "Netsurf",
"icon": "netsurf",
"description": "Light and Fast Web Browser",
"pkg": "netsurf",
"extra": []
},
{
"name": "Opera",
"icon": "opera",
"description": "Fast and secure webbrowser",
"pkg": "opera",
"extra": []
}
]
},
{
"name": "E-mail",
"icon": "mail-client",
"description": "E-mail, Calendar, Tasks",
"apps": [
{
"name": "Claws Mail",
"icon": "claws-mail",
"description": "Lightweight and fast GTK+ based Mail Client",
"pkg": "claws-mail",
"extra": []
},
{
"name": "Evolution",
"icon": "evolution",
"description": "Manage your email, contacts and schedule",
"pkg": "evolution",
"extra": []
},
{
"name": "Geary",
"icon": "geary",
"description": "Send and receive mail",
"pkg": "geary",
"extra": []
},
{
"name": "Sylpheed",
"icon": "sylpheed",
"description": "E-mail client",
"pkg": "sylpheed",
"extra": []
},
{
"name": "Thunderbird",
"icon": "thunderbird",
"description": "Send and receive mail, contacts and schedule",
"pkg": "thunderbird",
"extra": []
}
]
},
{
"name": "Backup",
"icon": "deja-dup",
"description": "Backup utilites",
"apps": [
{
"name": "Deja Dup",
"icon": "deja-dup",
"description": "Keep your important documents safe from disater",
"pkg": "deja-dup",
"extra": []
},
{
"name": "Grsync",
"icon": "grsync",
"description": "Synchronize files and folders",
"pkg": "grsync",
"extra": []
},
{
"name": "Timeshift",
"icon": "timeshift",
"description": "A system restore utility for Linux",
"pkg": "timeshift",
"extra": []
}
]
},
{
"name": "Text Editors",
"icon": "text-editor",
"description": "Various editors for text or code",
"apps": [
{
"name": "Atom",
"icon": "atom",
"description": "A hackable text editor for the 21st Century",
"pkg": "atom",
"extra": []
},
{
"name": "Geany",
"icon": "geany",
"description": "A fast and lightweight IDE using GTK+",
"pkg": "geany",
"extra": []
},
{
"name": "Mousepad",
"icon": "mousepad",
"description": "Simple Text Editor",
"pkg": "mousepad",
"extra": []
},
{
"name": "Xed",
"icon": "xed",
"description": "A small and lightweight text editor. X Apps Project",
"pkg": "xed",
"extra": []
}
]
},
{
"name": "System Tools",
"icon": "disk-utility",
"description": "System utilities",
"apps": [
{
"name": "Gnome Disks",
"icon": "gnome-disks",
"description": "Disk management system for Gnome",
"pkg": "gnome-disk-utility",
"extra": []
},
{
"name": "Gparted",
"icon": "gparted",
"description": "Create, reorganize, and delete partitions",
"pkg": "gparted",
"extra": []
},
{
"name": "IsoUSB",
"icon": "usb-creator",
"description": "A graphical tool to copy a hybrid ISO onto a USB key.",
"pkg": "isousb",
"extra": []
},
{
"name": "Mintstick",
"icon": "mintstick",
"description": "Format or wirte imges to usb sticks (Linux Mint tool).",
"pkg": "mintstick",
"extra": []
},
{
"name": "Pamac",
"icon": "pamac-updater",
"description": "Update your System, Add/Remove Software from repo and AUR",
"pkg": "pamac",
"extra": []
},
{
"name": "Yay",
"icon": "terminal",
"description": "CLI AUR helper",
"pkg": "yay",
"extra": []
}
]
},
{
"name": "Security",
"icon": "security-high",
"description": "Security oriented utilities",
"apps": [
{
"name": "KeePassX",
"icon": "keepassx",
"description": "Cross Platform Password Manager",
"pkg": "keepassx",
"extra": []
},
{
"name": "SeaHorse",
"icon": "seahorse",
"description": "Manage your passwords and encryption keys",
"pkg": "seahorse",
"extra": []
},
{
"name": "VeraCrypt",
"icon": "veracrypt",
"description": "Disk encryption with strong security based on TrueCrypt",
"pkg": "veracrypt",
"extra": []
}
]
},
{
"name": "Virtual Computing",
"icon": "virt-manager",
"description": "Virtual Machine applications",
"apps": [
{
"name": "VirtualBox",
"icon": "virtualbox",
"description": "Run several virtual systems on a single host computer",
"pkg": "calibre",
"extra": []
},
{
"name": "Gnome Boxes",
"icon": "gnome-boxes",
"description": "Simple remote and virtual machines",
"pkg": "gnome-boxes",
"extra": []
}
]
},
{
"name": "Chat",
"icon": "internet-chat",
"description": "Online messaging and chat",
"apps": [
{
"name": "HexChat",
"icon": "hexchat",
"description": "Graphic IRC Client",
"pkg": "hexchat",
"extra": []
},
{
"name": "Pidgin Messenger",
"icon": "pidgin",
"description": "Instant messaging Client",
"pkg": "pidgin",
"extra": []
}
]
},
{
"name": "File Sharing",
"icon": "transmission",
"description": "FTP and Torrent apps",
"apps": [
{
"name": "Filezilla",
"icon": "filezilla",
"description": "Graphical FTP/FTPS/SFTP browser",
"pkg": "filezilla",
"extra": []
},
{
"name": "qBittorrent",
"icon": "qbittorrent",
"description": "A Qt based Bittorrent Client",
"pkg": "qbittorrent",
"extra": []
},
{
"name": "Transmission GTK",
"icon": "transmission",
"description": "GTK based Bittorrent Client",
"pkg": "transmission-gtk",
"extra": []
},
{
"name": "QTransmission",
"icon": "transmission",
"description": "QT based Bittorrent Client",
"pkg": "transmission-qt",
"extra": []
}
]
},
{
"name": "Graphics Creating",
"icon": "applications-accessories",
"description": "Creating and editing graphics",
"apps": [
{
"name": "Blender",
"icon": "blender",
"description": "3D modeling and animation",
"pkg": "blender",
"extra": []
},
{
"name": "GIMP",
"icon": "gimp",
"description": "Create images and edit photographs",
"pkg": "gimp",
"extra": []
},
{
"name": "Inkscape",
"icon": "inkscape",
"description": "Vector Graphics Editor",
"pkg": "inkscape",
"extra": []
},
{
"name": "Krita",
"icon": "krita",
"description": "Digital Painting Creative Freedom",
"pkg": "krita",
"extra": []
},
{
"name": "Pinta",
"icon": "pinta",
"description": "Easy create and edit images",
"pkg": "pinta",
"extra": []
},
{
"name": "Tux Paint",
"icon": "tuxpaint",
"description": "Drawing program for children",
"pkg": "tuxpaint",
"extra": []
}
]
},
{
"name": "Graphics Organizing",
"icon": "applications-graphics",
"description": "Viewers and organizers",
"apps": [
{
"name": "Gpicview",
"icon": "gpicview",
"description": "Lightweight Image Viewer",
"pkg": "gpicview",
"extra": []
},
{
"name": "gThumb",
"icon": "gthumb",
"description": "View and organize your images",
"pkg": "gthumb",
"extra": []
},
{
"name": "Gwenview",
"icon": "gwenview",
"description": "Image Viewer",
"pkg": "gwenview",
"extra": []
},
{
"name": "Ristretto",
"icon": "ristretto",
"description": "Free and lightweight image viewer",
"pkg": "ristretto",
"extra": []
},
{
"name": "Shotwell",
"icon": "shotwell",
"description": "Popular Photo Manager",
"pkg": "shotwell",
"extra": []
},
{
"name": "Viewnior",
"icon": "viewnior",
"description": "GTK based Elegant Image Viewer",
"pkg": "viewnior",
"extra": []
}
]
},
{
"name": "Video/Movie",
"icon": "video-player",
"description": "Organize and play videos and movies",
"apps": [
{
"name": "Kodi",
"icon": "kodi",
"description": "Manage and view your media",
"pkg": "kodi",
"extra": []
},
{
"name": "Parole",
"icon": "parole",
"description": "Modern and simple media player",
"pkg": "parole",
"extra": []
},
{
"name": "SM Player",
"icon": "smplayer",
"description": "A great MPlayer front end",
"pkg": "smplayer",
"extra": []
},
{
"name": "Totem",
"icon": "totem",
"description": "Play movies",
"pkg": "totem",
"extra": []
},
{
"name": "VLC",
"icon": "vlc",
"description": "VLC media player, the openxource multimedia player",
"pkg": "vlc",
"extra": []
}
]
},
{
"name": "Audio",
"icon": "musicbrainz",
"description": "Audio players",
"apps": [
{
"name": "Audacious",
"icon": "audacious",
"description": "Listen to music",
"pkg": "audacious",
"extra": []
},
{
"name": "Clementine",
"icon": "clementine",
"description": "Play music files and internet radio",
"pkg": "clementine",
"extra": []
},
{
"name": "DeadBeeF",
"icon": "deadbeef",
"description": "Listen to music",
"pkg": "deadbeef",
"extra": []
},
{
"name": "Lollypop",
"icon": "lollypop",
"description": "Play and organize your music collection",
"pkg": "deadbeef",
"extra": []
},
{
"name": "Rhythmbox",
"icon": "rhythmbox",
"description": "Gnome music playing application",
"pkg": "rhythmbox",
"extra": []
}
]
},
{
"name": "Media recording/editing",
"icon": "kdenlive",
"description": "Audio and Video editing",
"apps": [
{
"name": "Audacity",
"icon": "audacity",
"description": "Record and Edit Audio files",
"pkg": "audacity",
"extra": []
},
{
"name": "Kdenlive",
"icon": "kdenlive",
"description": "Video Editor",
"pkg": "kdenlive",
"extra": []
},
{
"name": "OBS Studio",
"icon": "obs",
"description": "Open Source Streaming/Recording Application",
"pkg": "obs-studio",
"extra": []
},
{
"name": "Simple Screen Recorder",
"icon": "simple-ccsm",
"description": "Screen Capturing Application",
"pkg": "simplescreenrecorder",
"extra": []
}
]
},
{
"name": "Office Suites",
"icon": "applications-office",
"description": "Office suites like MS Office",
"apps": [
{
"name": "Calligra Office",
"icon": "calligrawords",
"description": "Qt Based Office Suite",
"pkg": "calligra",
"extra": []
},
{
"name": "Libre Office (Fresh)",
"icon": "libreoffice-main",
"description": "Open Source Office Application (Lastest)",
"pkg": "libreoffice-fresh",
"extra": []
},
{
"name": "Libre Office (Still)",
"icon": "libreoffice-main",
"description": "Open Source Office Application (Stable)",
"pkg": "libreoffice-still",
"extra": []
},
{
"name": "MS Office Online",
"icon": "ms-word",
"description": "Microsoft Office Online",
"pkg": "ms-office-online",
"extra": []
}
]
},
{
"name": "Office Apps",
"icon": "gnumeric",
"description": "Stand alone applications",
"apps": [
{
"name": "Abiword",
"icon": "abiword",
"description": "Compose, Edit and view documents",
"pkg": "abiword",
"extra": []
},
{
"name": "Gnumeric",
"icon": "gnumeric",
"description": "A High Precision Spreadsheet Program",
"pkg": "gnumeric",
"extra": []
}
]
},
{
"name": "Printing",
"icon": "printer",
"description": "Support for printing CUPS, HPLIP",
"apps": [
{
"name": "Manjaro Printing",
"icon": "printer",
"description": "Printing Meta Package",
"pkg": "manjaro-printer",
"extra": []
}
]
},
{
"name": "PDF",
"icon": "pdfeditor",
"description": "PDF applications applications",
"apps": [
{
"name": "Epdfview",
"icon": "qpdfview",
"description": "Lightweight PDF document viewer",
"pkg": "epdfview",
"extra": []
},
{
"name": "Evince",
"icon": "evince",
"description": "View multi page documents",
"pkg": "evince",
"extra": []
},
{
"name": "Okular",
"icon": "okular",
"description": "Document Viewer",
"pkg": "Okular",
"extra": []
},
{
"name": "PDFMod",
"icon": "pdfmod",
"description": "Remove, extract and rotate pages in PDF Documents",
"pkg": "pdfmod",
"extra": []
},
{
"name": "Qpdfview",
"icon": "qpdfview",
"description": "Tabbed document viewer",
"pkg": "qpdfview",
"extra": []
}
]
},
{
"name": "E-Book",
"icon": "calibre",
"description": "E-book library apps",
"apps": [
{
"name": "Calibre",
"icon": "calibre-viewer",
"description": "The one stop solution to your e-book needs",
"pkg": "calibre",
"extra": []
},
{
"name": "FBReader",
"icon": "fbreader",
"description": "FBReader E-Book Reader",
"pkg": "fbreader",
"extra": []
}
]
}
]

View File

@ -1,380 +0,0 @@
[
{
"name": "Browsers",
"icon": "browser",
"description": "Web browsning and communication",
"apps": [
{
"name": "Chromium",
"icon": "chromium",
"description": "Open Sourced Chrome Browser",
"pkg": "chromium",
"extra": []
},
{
"name": "Firefox",
"icon": "mozilla-firefox",
"description": "Mozilla Web Browser",
"pkg": "firefox",
"extra": [],
"desktop": ["xfce"]
},
{
"name": "Falkon",
"icon": "falkon",
"description": "Qt based Web Browser",
"pkg": "falkon",
"extra": [],
"filter": ["advanced"],
"desktop": ["kde"]
},
{
"name": "Opera",
"icon": "opera",
"description": "Fast and secure webbrowser",
"pkg": "opera",
"extra": [],
"filter": ["advanced"],
"desktop": ["!kde","!gnome"]
}
]
},
{
"name": "E-mail",
"icon": "mail-client",
"description": "E-mail, Calendar, Tasks",
"apps": [
{
"name": "Evolution",
"icon": "evolution",
"description": "Manage your email, contacts and schedule",
"pkg": "evolution",
"extra": []
},
{
"name": "Thunderbird",
"icon": "thunderbird",
"description": "Send and receive mail, contacts and schedule",
"pkg": "thunderbird",
"extra": []
}
]
},
{
"name": "Backup",
"icon": "deja-dup",
"description": "Backup utilites",
"filter": ["advanced"],
"apps": [
{
"name": "Deja Dup",
"icon": "deja-dup",
"description": "Keep your important documents safe from disater",
"pkg": "deja-dup",
"extra": [],
"desktop": ["!kde","for test empty group !"]
}
]
},
{
"name": "Text Editors",
"icon": "text-editor",
"description": "Simple editors for text or code",
"apps": [
{
"name": "Mousepad",
"icon": "mousepad",
"description": "Simple Text Editor",
"pkg": "mousepad",
"extra": []
},
{
"name": "Xed",
"icon": "xed",
"description": "A small and lightweight text editor. X Apps Project",
"pkg": "xed",
"extra": []
}
]
},
{
"name": "System Tools",
"icon": "disk-utility",
"description": "System Utilities",
"apps": [
{
"name": "Gnome Disks",
"icon": "gnome-disks",
"description": "Disk management system for Gnome",
"pkg": "gnome-disk-utility",
"extra": []
},
{
"name": "Gparted",
"icon": "gparted",
"description": "Create, reorganize, and delete partitions",
"pkg": "gparted",
"extra": []
},
{
"name": "Mintstick",
"icon": "mintstick",
"description": "Format or wirte imges to usb sticks (Linux Mint tool).",
"pkg": "mintstick",
"extra": []
},
{
"name": "Pamac",
"icon": "pamac-updater",
"description": "Update your System, Add/Remove Software from repo and AUR",
"pkg": "pamac",
"extra": []
}
]
},
{
"name": "Security",
"icon": "security-high",
"description": "Security oriented utilities",
"apps": [
{
"name": "KeePassX",
"icon": "keepassx",
"description": "Cross Platform Password Manager",
"pkg": "keepassx",
"extra": []
},
{
"name": "SeaHorse",
"icon": "seahorse",
"description": "Manage your passwords and encryption keys",
"pkg": "seahorse",
"extra": []
},
{
"name": "VeraCrypt",
"icon": "veracrypt",
"description": "Disk encryption with strong security based on TrueCrypt",
"pkg": "veracrypt",
"extra": []
}
]
},
{
"name": "Chat",
"icon": "internet-chat",
"description": "Online messaging and chat",
"apps": [
{
"name": "HexChat",
"icon": "hexchat",
"description": "Graphic IRC Client",
"pkg": "hexchat",
"extra": []
},
{
"name": "Pidgin Messenger",
"icon": "pidgin",
"description": "Instant messaging Client",
"pkg": "pidgin",
"extra": []
}
]
},
{
"name": "File Sharing",
"icon": "transmission",
"description": "FTP and Torrent apps",
"apps": [
{
"name": "Filezilla",
"icon": "filezilla",
"description": "Graphical FTP/FTPS/SFTP browser",
"pkg": "filezilla",
"extra": []
},
{
"name": "qBittorrent",
"icon": "qbittorrent",
"description": "Bittorrent Client",
"pkg": "qbittorrent",
"extra": []
}
]
},
{
"name": "Graphics Creating",
"icon": "applications-accessories",
"description": "Creating and editing graphics",
"apps": [
{
"name": "Krita",
"icon": "krita",
"description": "Create images and edit photographs",
"pkg": "krita",
"extra": []
},
{
"name": "Pinta",
"icon": "pinta",
"description": "Easy create and edit images",
"pkg": "pinta",
"extra": []
},
{
"name": "Tux Paint",
"icon": "tuxpaint",
"description": "Drawing program for children",
"pkg": "tuxpaint",
"extra": []
}
]
},
{
"name": "Graphics Organizing",
"icon": "applications-graphics",
"description": "Viewers and organizers",
"apps": [
{
"name": "gThumb",
"icon": "gthumb",
"description": "View and organize your images",
"pkg": "viewnior",
"extra": []
} ,
{
"name": "Gwenview",
"icon": "gwenview",
"description": "Image Viewer",
"pkg": "gwenview",
"extra": []
},
{
"name": "Shotwell",
"icon": "shotwell",
"description": "Popular Photo Manager",
"pkg": "shotwell",
"extra": []
}
]
},
{
"name": "Video/Movie",
"icon": "video-player",
"description": "Organize and play videos and movies",
"apps": [
{
"name": "SM Player",
"icon": "smplayer",
"description": "A great MPlayer front end",
"pkg": "smplayer",
"extra": []
},
{
"name": "VLC",
"icon": "vlc",
"description": "VLC media player, the openxource multimedia player",
"pkg": "vlc",
"extra": []
}
]
},
{
"name": "Audio",
"icon": "musicbrainz",
"description": "Audio players",
"apps": [
{
"name": "Clementine",
"icon": "clementine",
"description": "Play music files and internet radio",
"pkg": "clementine",
"extra": []
},
{
"name": "Rhythmbox",
"icon": "rhythmbox",
"description": "Gnome music playing application",
"pkg": "rhythmbox",
"extra": []
}
]
},
{
"name": "Office Suites",
"icon": "applications-office",
"description": "Office suites like MS Office",
"apps": [
{
"name": "Libre Office (Fresh)",
"icon": "libreoffice-writer",
"description": "Open Source Office Application (Lastest)",
"pkg": "libreoffice-fresh",
"extra": []
},
{
"name": "MS Office Online",
"icon": "ms-word",
"description": "Microsoft Office Online",
"pkg": "ms-office-online",
"extra": []
}
]
},
{
"name": "Printing",
"icon": "printer",
"description": "Support for printing CUPS, HPLIP",
"apps": [
{
"name": "Manjaro Printing",
"icon": "printer",
"description": "Printing Meta Package",
"pkg": "manjaro-printer",
"extra": []
}
]
},
{
"name": "PDF",
"icon": "pdfeditor",
"description": "PDF applications applications",
"apps": [
{
"name": "Evince",
"icon": "evince",
"description": "View multi page documents",
"pkg": "evince",
"extra": []
},
{
"name": "Okular",
"icon": "okular",
"description": "Document Viewer",
"pkg": "okular",
"extra": []
}
]
},
{
"name": "E-Book",
"icon": "calibre",
"description": "E-book library apps",
"apps": [
{
"name": "Calibre",
"icon": "calibre-viewer",
"description": "The one stop solution to your e-book needs",
"pkg": "calibre",
"extra": []
},
{
"name": "FBReader",
"icon": "fbreader",
"description": "FBReader E-Book Reader",
"pkg": "fbreader",
"extra": []
}
]
}
]

View File

@ -1,9 +0,0 @@
__all__ = ["alpm",
"browser",
"browser_base_config",
"browser_config",
"data",
"exceptions",
"hello_config",
"iso_config",
"stand_alone_config"]

View File

@ -1,114 +0,0 @@
"""
Module alpm
Install / remove packages
use pamac-installer
"""
import subprocess
import glob
import logging
class Alpm:
"""system alpm commit"""
NOTHING = 0
REMOVE = 1
ADD = 2
BOTH = 3
def __init__(self):
"""constructor"""
self.pkg_list_install = []
self.pkg_list_removal = []
def do_update(self):
"""run pamac"""
result = Alpm.NOTHING
if not self.pkg_list_install and not self.pkg_list_removal:
return result
if self.pkg_list_removal:
refresh = self._install_apps(self.pkg_list_removal, False)
if not refresh:
logging.warning("warning: packages not uninstalled")
else:
result = Alpm.REMOVE
if self.pkg_list_install:
refresh = self._install_apps(self.pkg_list_install, True)
if not refresh:
logging.warning("warning: packages not installed")
else:
if result == Alpm.NOTHING:
result = Alpm.ADD
else:
result = Alpm.BOTH
return result
def set_package(self, package_name: str, install: bool, installed: bool) -> None:
"""
Add or Remove package in lists
install: add or remove
"""
if self.to_remove(package_name):
self.pkg_list_removal.remove(package_name)
else:
if not install and installed:
self.pkg_list_removal.append(package_name)
if self.to_install(package_name):
self.pkg_list_install.remove(package_name)
else:
if install and not installed:
self.pkg_list_install.append(package_name)
def clear(self) -> None:
"""clear lists packages"""
self.pkg_list_install = []
self.pkg_list_removal = []
def to_install(self, package_name) -> bool:
"""package is in list ?"""
return package_name in self.pkg_list_install
def to_remove(self, package_name) -> bool:
"""package is in list ?"""
return package_name in self.pkg_list_removal
@classmethod
def _install_apps(cls, pkg_list: list, install: bool = True) -> bool:
"""
install or remove packages list
test presence first package in pacman DB
"""
if not pkg_list:
return False
if not install:
install = ['--remove']
else:
install = []
try:
subprocess.run(['pamac-installer'] + install + pkg_list, capture_output=True, check=True)
except FileNotFoundError:
# next with pamac-qt its in all isos
logging.warning('ERROR: Pamac not installed !')
raise
except subprocess.CalledProcessError as e:
# e.returncode > 0
logging.warning(f"ERROR in alpm commit: {e.returncode} ?\n{e.stderr}")
# after test if "cancel" btn
if not install:
return cls.app_installed(pkg_list[0])
return not cls.app_installed(pkg_list[0])
@property
def empty(self):
"""2 lists are empty ?"""
return not self.pkg_list_removal and not self.pkg_list_install
@staticmethod
def app_installed(package: str) -> bool:
"""test if package is installed"""
if glob.glob(f"/var/lib/pacman/local/{package}-[0-9]*"):
return True
return False
def __str__(self):
return f"pkg list install: {self.pkg_list_install}\n pkg list removal: {self.pkg_list_removal}"

View File

@ -1,501 +0,0 @@
#!/usr/bin/env python3
import gi
import json
import logging
import os
import urllib.request
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
gi.require_version('Pamac', '1.0')
from gi.repository import Pamac
from .hello_config import HelloConfig
from .browser_config import BrowserConfig
from .alpm import Alpm
# Applications class constants
VERSION = "0.8"
TITLE = "Manjaro Application Utility {}".format(VERSION)
GROUP, ICON, PRESENT, APPLICATION, DESCRIPTION, ACTIVE, PACKAGE, INSTALLED = list(range(8))
class Browser(Gtk.Box):
"""Class Applications with viw, title and btns"""
def __init__(self, config: BrowserConfig, win: Gtk.Window, orientation=Gtk.Orientation.VERTICAL, spacing=1):
super().__init__(orientation=orientation, spacing=spacing, expand=True)
self.config = config
self.orientation = Gtk.Orientation.VERTICAL
self.parent = win
self.app = "app-browser"
if isinstance(self.config, HelloConfig):
self.app = "manjaro-hello"
self.detail_box = None
# set data
self.app_store = None
self.group_store = None
self.alpm = Alpm()
self.app_browser_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, expand=True)
self.add(self.app_browser_box)
# create title box
if isinstance(self.config, HelloConfig):
# hello title box
self.title_box = Gtk.InfoBar()
self.title_box.set_message_type(Gtk.MessageType.INFO)
self.title_box.set_show_close_button(True)
self.title_box.set_revealed(True)
self.title_box.connect("response", self.on_remove_title_box)
# panel appstream detail
self.detail_box = Gtk.InfoBar()
self.detail_box.set_message_type(Gtk.MessageType.INFO)
self.detail_box.set_show_close_button(True)
self.detail_box.set_revealed(True)
self.detail_box.connect("response", self.on_remove_detail_box)
self.app_browser_box.pack_end(self.detail_box, expand=False, fill=True, padding=0)
self.detail_label = Gtk.Label()
self.detail_label.set_line_wrap(True)
self.detail_box.pack_start(self.detail_label, expand=True, fill=True, padding=0)
else:
# stand alone title box
self.title_box = Gtk.Box()
title_image = Gtk.Image()
title_image.set_size_request(100, 100)
title_image.set_from_file("/usr/share/icons/manjaro/maia/96x96.png")
self.title_box.pack_start(title_image, expand=False, fill=False, padding=0)
# label with hello and stand alone
self.title_label = Gtk.Label()
self.title_label.set_markup("<big>Manjaro Application Maintenance</big> "
"Select/Deselect apps you want to install/remove. "
"Click <b>UPDATE SYSTEM</b> button when ready. ")
self.title_box.pack_start(self.title_label, expand=True, fill=True, padding=0)
# pack title box to app browser box
self.app_browser_box.pack_start(self.title_box, expand=False, fill=True, padding=0)
# button box
self.button_box = Gtk.Box(spacing=10)
# advanced button
advanced_button = Gtk.ToggleButton(label="Advanced")
advanced_button.set_tooltip_text("Toggle an extended selection of packages...")
advanced_button.connect("clicked", self.on_advanced_clicked)
# download button
download_button = Gtk.Button(label="download")
download_button.set_tooltip_text("Download the most recent selection of packages...")
download_button.connect("clicked", self.on_download_clicked)
# reset button
reset_button = Gtk.Button(label="reset")
download_button.set_tooltip_text("Reset your current selections...")
reset_button.connect("clicked", self.on_reload_clicked)
# update system button
self.update_system_button = Gtk.Button(label="UPDATE SYSTEM")
self.update_system_button.set_tooltip_text("Apply your current selections to the system...")
self.update_system_button.connect("clicked", self.on_update_system_clicked)
self.update_system_button.set_sensitive(False)
# Group filter
# exemple: https://gitlab.gnome.org/GNOME/pygobject/blob/master/examples/demo/demos/combobox.py#L90
self.group_store = self.load_groups_data()
group_combo = Gtk.ComboBox.new_with_model(self.group_store)
group_combo.connect("changed", self.on_group_filter_changed)
renderer_text = Gtk.CellRendererText()
group_combo.pack_start(renderer_text, True)
group_combo.add_attribute(renderer_text, "text", 0)
group_combo.set_active(0)
# pack group combo combo
self.button_box.pack_start(group_combo, False, False, 10)
# pack update system button
self.button_box.pack_end(self.update_system_button, expand=False, fill=False, padding=10)
# with Hello, we have btn "HOME"
if not isinstance(self.config, HelloConfig):
# create clos button if stand alone
close_button = Gtk.Button(label="close")
close_button.set_tooltip_text("Discard selections and close app...")
close_button.connect("clicked", self.on_close_clicked)
# pack close button
self.button_box.pack_end(close_button, expand=False, fill=False, padding=10)
# pack reload button
self.button_box.pack_end(reset_button, expand=False, fill=False, padding=10)
# pack download button
self.button_box.pack_end(download_button, expand=False, fill=False, padding=10)
# pack advanced button
self.button_box.pack_end(advanced_button, expand=False, fill=False, padding=10)
# pack app browser
self.app_browser_box.pack_start(self.button_box, expand=False, fill=False, padding=10)
# create view
self.tree_view, self.app_store = self.create_view_tree()
# create a scrollable window
app_window = Gtk.ScrolledWindow()
app_window.set_vexpand(True)
app_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
app_window.add(self.tree_view)
# setup grid
grid = Gtk.Grid()
grid.set_column_homogeneous(True)
grid.set_row_homogeneous(True)
self.app_browser_box.add(grid)
grid.attach(app_window, 0, 0, 5, len(self.app_store))
# show time
self.show_all()
if self.detail_box:
self.detail_box.hide()
def create_view_tree(self):
"""create gtk view and model"""
# setup list store model
app_store = self.load_app_data()
# create a tree view with the model store
tree_view = Gtk.TreeView.new_with_model(app_store)
tree_view.set_activate_on_single_click(True)
tree_view.props.has_tooltip = True
tree_view.connect("query-tooltip", self.on_query_tooltip_tree_view)
if isinstance(self.config, HelloConfig):
# test Application detail
tree_view.connect("button-press-event", self.on_tree_dblclick)
# column model: icon
icon = Gtk.CellRendererPixbuf()
column = Gtk.TreeViewColumn("", icon, icon_name=ICON)
tree_view.append_column(column)
# column model: group name column
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Group", renderer, text=GROUP)
tree_view.append_column(column)
# column model: installed or not column
renderer = Gtk.CellRendererText() # TODO a renderer icon "check" in same column "name" ?
column = Gtk.TreeViewColumn("", renderer, text=PRESENT)
column.set_max_width(17)
tree_view.append_column(column)
# column model: app name column
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Application", renderer, text=APPLICATION)
# column.set_resizable(False)
tree_view.append_column(column)
# column model: description column
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("Description", renderer, text=DESCRIPTION)
column.set_resizable(True) # for test
tree_view.append_column(column)
# column model: install column
toggle = Gtk.CellRendererToggle()
toggle.connect("toggled", self.on_app_toggle)
column = Gtk.TreeViewColumn("Installed", toggle, active=ACTIVE)
# column.set_sizing(Gtk.TREE_VIEW_COLUMN_FIXED)
column.set_resizable(False) # not possible with last :(
column.set_max_width(40)
column.set_fixed_width(40)
tree_view.append_column(column)
return tree_view, app_store
def load_app_data(self):
# not use dataset for the moment
store = Gtk.TreeStore(str, str, str, str, str, bool, str, bool)
for group in self.config.json:
if group["apps"]: # if group is empty after filters
gdesc = group["description"]
while len(gdesc) < 72:
gdesc = gdesc + " "
index = store.append(None,
[group["name"],
group["icon"],
None, None, gdesc, None, None, None])
for app in group["apps"]:
status = app["installed"]
installed = " "
if status:
installed = "*"
# restore user checks
if not status and self.alpm.to_install(app["pkg"]):
status = True
if installed == "*" and self.alpm.to_remove(app["pkg"]):
status = False
tree_item = (None,
app["icon"],
installed, # check is to install or installed ? not clear for user
app["name"],
app["description"],
status,
app["pkg"],
status)
store.append(index, tree_item)
return store
def load_groups_data(self):
"""create gtk store and set datas"""
store = Gtk.ListStore(str)
store.append(["All"])
for g in self.config.categories:
store.append([g])
return store
def reload_app_data(self, refresh: bool = False):
"""Refresh only if source json changed"""
self.alpm.clear()
self.app_store.clear()
if refresh:
self.config.load().merge_jsons()
if isinstance(self.config, HelloConfig):
self.group_store = self.load_groups_data()
self.app_store = self.load_app_data()
self.tree_view.set_model(self.app_store)
if self.config.group != "All":
self.tree_view.expand_all()
def on_remove_title_box(self, panel: Gtk.InfoBar, id: str):
if self.title_box:
self.title_box.hide()
# Or not destroy ? for use set_title_box
# self.title_box.destroy()
# self.title_box = None
def set_title_box(self, html: str, color: Gtk.MessageType = Gtk.MessageType.INFO):
while len(html) < 200:
html = html + " "
if isinstance(self.config, HelloConfig):
self.title_box.set_message_type(color)
self.title_label.set_markup("<big>Manjaro Application Maintenance</big> " + html)
self.title_label.set_markup(html)
self.title_box.show()
else:
dialog = Gtk.MessageDialog(self, parent=self.parent,
message_type=color,
buttons=Gtk.ButtonsType.OK,
text=html)
dialog.run()
dialog.destroy()
def on_remove_detail_box(self, panel: Gtk.InfoBar, id: str):
if self.detail_box:
self.detail_box.hide()
def set_detail_box(self, pkg: str):
"""
show appstream detals Application
for Hello, show in new page self.builder.get_object("stack") and show in webbrowser ?
"""
"""
TODO
for picture import and show ...
https://developer.gnome.org/gnome-devel-demos/stable/image.py.html.en
"To load an image over a network use set_from_pixbuf(pixbuf),"
as ?
https://stackoverflow.com/questions/11549480/load-and-show-an-image-from-the-web-in-python-with-gtk-3
"""
if not self.title_box:
return
pkg = self.config(pkg)
if not pkg or not pkg["appstream"]:
return
db = Pamac.Database(config=Pamac.Config(conf_path="/etc/pamac.conf"))
db.enable_appstream()
detail = db.get_pkg_details(pkg['pkg'], pkg['name'])
if detail:
if self.title_box:
self.title_box.hide()
if not detail.get_long_desc() and not detail.get_url(): # ? not detail.get_screenshot() ?
return
# logging.info(dir(detail))
long_desc = detail.get_long_desc()
while len(long_desc) < 250:
long_desc = long_desc + " "
html = f"<b>{detail.get_app_name()}</b> {detail.get_version()}\n"
html += f"<b>{detail.get_desc()}</b>\n"
html += f"{long_desc}\n"
html += f"<a href=\"{detail.get_url()}\">{detail.get_url()}</a>"
# if detail.get_screenshot():
# # TODO if have &amp in original -> BUG
# # for speed fix pkg:evolution ->get_screenshot ??
# html += f"<a href=\"{detail.get_screenshot().replace('&','&amp;')}\">picture</a>\n"
#
# logging.info(detail.get_screenshot())
self.detail_label.set_markup(html)
self.detail_box.show()
def on_close_clicked(self, widget):
Gtk.main_quit()
def on_tree_dblclick(self, treeview: Gtk.TreeView, event):
"""show detail application"""
# TODO how to import constant ?
if event.button == 1 and int(event.type == 5): # Gdk.EventType.GDK_2BUTTON_PRESS:
path_info = treeview.get_path_at_pos(event.x, event.y)
if path_info is None:
return
path, col, cellx, celly = path_info
if self.app_store[path][PACKAGE] is not None:
pkg = self.config(self.app_store[path][PACKAGE])
if pkg:
self.set_detail_box(pkg["name"])
else:
if treeview.row_expanded(path):
treeview.collapse_row(path)
else:
treeview.expand_to_path(path)
def on_reload_clicked(self, widget):
self.reload_app_data()
self.set_title_box("Your selections has been reset.")
def on_group_filter_changed(self, combo):
"""filter grid by one group"""
tree_iter = combo.get_active_iter()
if tree_iter is not None:
model = combo.get_model()
group = model[tree_iter][0]
self.config.group = group
self.app_store.clear()
self.app_store = self.load_app_data()
self.tree_view.set_model(self.app_store)
if self.config.group != "All":
self.tree_view.expand_all()
def on_advanced_clicked(self, widget):
"""set one filter on/off on view"""
if widget.get_active():
self.config.filter = "advanced"
else:
self.config.filter = ""
self.reload_app_data(False)
def on_download_clicked(self, widget):
# TODO to rewrite with config ...
# with self.reload_app_data(True)
if self.net_check():
# noinspection PyBroadException
try:
for download in self.config.preferences["data_sets"]:
url = "{}/{}.json".format(self.config.preferences["url"], download)
file = self.fix_path("{}/{}.json".format(self.config.preferences["user_path"], download))
req = urllib.request.Request(url=url)
with urllib.request.urlopen(req, timeout=2) as response:
data = json.loads(response.read().decode("utf8"))
self.write_json_file(data, file)
self.reload_app_data(True)
self.set_title_box("App data has been downloaded and list is reset.")
except Exception as e:
logging.error(e)
else:
# or re-use panal-title for dialogs info ? it's more gtk3 ?
self.set_title_box("Download not available\nThe server 'gitlab.manjaro.org' could not be reached",
Gtk.MessageType.ERROR)
def on_query_tooltip_tree_view(self, widget: Gtk.TreeView, x, y, keyboard_tip: bool, tooltip):
"""Show tooltip only if installed"""
is_found, x, y, model, path, iter_a = widget.get_tooltip_context(x, y, keyboard_tip)
if is_found:
value = model.get(iter_a, INSTALLED)
if value[0]:
msg = "Installed"
active = model.get(iter_a, ACTIVE)
if not active[0]:
msg = msg + " , to remove"
tooltip.set_markup(msg)
widget.set_tooltip_row(tooltip, path)
return True
return False
def on_app_toggle(self, cell, path):
"""Event selector Install/unInstall application"""
# a group has no package attached and we don't install groups
if self.app_store[path][PACKAGE] is not None:
self.app_store[path][ACTIVE] = not self.app_store[path][ACTIVE]
on_off = self.app_store[path][ACTIVE]
pkg = self.config(self.app_store[path][PACKAGE])
installed = pkg['installed']
pkg = pkg['pkg']
# update lists
self.alpm.set_package(pkg, on_off, installed)
self.update_system_button.set_sensitive(not self.alpm.empty)
if self.config.dev:
logging.debug(self.alpm)
def on_update_system_clicked(self, widget):
if self.alpm.do_update() != self.alpm.NOTHING:
self.set_title_box("Your system has been updated.", Gtk.MessageType.INFO)
# reload json for view new apps installed
self.reload_app_data(True)
@staticmethod
def fix_path(path):
"""Make good paths.
:param path: path to fix
:type path: str
:return: fixed path
:rtype: str
"""
if "~" in path:
path = path.replace("~", os.path.expanduser("~"))
return path
@staticmethod
def net_check():
"""Check for internet connection"""
resp = None
host = "https://gitlab.manjaro.org"
# noinspection PyBroadException
try:
resp = urllib.request.urlopen(host, timeout=2)
except Exception:
pass
return bool(resp)
@staticmethod
def write_json_file(data, filename, dictionary=False):
"""Writes data to file as json
:param data
:param filename:
:param dictionary:
"""
try:
if dictionary:
with open(filename, "wb") as outfile:
json.dump(data, outfile)
else:
with open(filename, "w") as outfile:
json.dump(data, outfile, indent=2)
return True
except OSError:
return False

View File

@ -1,51 +0,0 @@
import collections
import json
import sys
class BrowserBaseConfig:
"""
set config from env or plugin or standalone App
pass this class to object Applications constructor())
"""
_PATH = r"/usr/share/{}/data/preferences.json"
_JSONMERGED = r"/tmp/browser-preferences.json"
def __init__(self, application: str):
self.application = application # for preferences ?
self.preferences = {}
# self.preferences = {"data_set":"default"}
self.url = {"desktop": "", "main": ""}
self.file = {"desktop": "", "main": ""}
self.dev = "--dev" in sys.argv
def load(self):
"""to override live iso ? desktop ?"""
raise NotImplementedError
# @property
# def filter(self) ->str:
# return self.apps.filter
#
# @filter.setter
# def filter(self, value: str) ->None:
# self.apps.filter = value
@staticmethod
def read_json_file(filename, dictionary=True):
"""
Read json data from file
"""
result = list()
try:
if dictionary:
with open(filename, "rb") as infile:
result = json.loads(
infile.read().decode("utf8"),
object_pairs_hook=collections.OrderedDict)
else:
with open(filename, "r") as infile:
result = json.load(infile)
except OSError:
pass
return result

View File

@ -1,43 +0,0 @@
import logging
import os
import shutil
import urllib.request
from .data import ApplicationData
from .browser_base_config import BrowserBaseConfig
class BrowserConfig(BrowserBaseConfig, ApplicationData):
"""Configuration with datas"""
def load(self):
pass
def __init__(self, application: str):
BrowserBaseConfig.__init__(self, application)
ApplicationData.__init__(self)
self.load()
self.merge_jsons()
def merge_jsons(self):
"""
TODO
merge desktop in main in self.json ? and merge url in file ?
and use only self._JSONMERGED ?
Always save .json in self._JSONMERGED ?
"""
# write temp
if self.url["main"]:
src = "/tmp/{self.application}-download.json"
urllib.request.urlretrieve(self.url["main"], src)
logging.info(f"URL: [{self.url['main']} downloaded")
else:
src = self.file["main"]
logging.info(f"json to merge : {src}")
if not os.path.isfile(src):
logging.error(f"ERROR: File not found: {src}")
raise ImportError(src)
shutil.copyfile(src, self._JSONMERGED)
logging.debug(f"json : {self._JSONMERGED}")
self.load_from_file(self._JSONMERGED)

View File

@ -1,183 +0,0 @@
import collections
import glob
import json
import logging
import os
from typing import Iterator
import gi
gi.require_version('Pamac', '1.0')
from gi.repository import Pamac
class ApplicationData:
def __init__(self):
self.filename = ""
self._json = []
self.filter = ""
self.group = "All"
self.desktop = os.environ.get("XDG_SESSION_DESKTOP", "?").lower()
def load_from_file(self, filename: str = ''):
"""
load json file
:param filename:
"""
if filename:
self.filename = filename
self._json = self._read_json_file(filename, True)
# self.__dict__.update(self.json) ??
# ValueError: dictionary update sequence element #0 has length 4; 2 is required
# self.all()
@property
def json(self) -> list:
"""
return json but with filters:
- desktop : self.desktop
- advanced 0/1 : self.filter
"""
logging.debug("\n--- read datas.json with FILTERS ---\n")
logging.debug(f"my desktop: {self.desktop}")
logging.debug(f"filter : {self.filter}")
logging.debug(f"groups : {self.group}")
ret = []
for group in self._json:
if self.group != "All":
if group['name'] != self.group:
logging.debug(f"filter group : {group['name']} <> {self.group}")
continue
try:
if self.filter not in group["filter"]:
logging.debug(f"filter group : {group['name']} {group['filter']} < {self.filter}")
continue
except KeyError:
# not in json file
pass
ret.append(
{"name": f"{group['name']}", "icon": f"{group['icon']}", "description": f"{group['description']}",
"apps": []})
for app in group["apps"]:
try:
if self.filter not in app["filter"]:
logging.debug(f"\tfilter app: {app['name']} {app['filter']} < {self.filter}")
# continue
except KeyError:
pass
"""
add destop filters
"desktop": ["kde","gnome"] = only for kde and gnome
"desktop": ["!kde","!gnome"] = all except for kde and gnome
"""
keys = app.get('desktop', [])
if keys:
if f"!{self.desktop}" in keys:
logging.debug(f"\tfilter desktop(not for): {app['name']} {app['desktop']} < {self.desktop}")
# continue
keys = [x for x in keys if not x.startswith("!")]
if keys:
if self.desktop != "?" and self.desktop not in keys:
logging.debug(f"\tfilter desktop(for): {app['name']} {app['desktop']} < {self.desktop}")
# continue
ret[-1]["apps"].append(app)
return ret
@classmethod
def _read_json_file(cls, filename: str, dictionary: bool = True) -> list:
"""
Read json data from file
"""
result = list()
try:
if dictionary:
with open(filename, "rb") as infile:
result = json.loads(
infile.read().decode("utf8"),
object_pairs_hook=collections.OrderedDict)
else:
with open(filename, "r") as infile:
result = json.load(infile)
# transform strcture/datas
db = Pamac.Database(config=Pamac.Config(conf_path="/etc/pamac.conf"))
db.enable_appstream()
for group in result:
for app in group["apps"]:
app["group"] = group['name'] # add for self.all()
app["installed"] = cls.app_installed(app["pkg"])
"""
TEST
use pamac/appstream for locale description
"""
app['appstream'] = False
detail = db.get_pkg_details(app['pkg'], app['name'])
if detail:
app['appstream'] = True
d = detail.get_desc()
if d:
if len(d) > 58:
d = d[:56] + ".."
app['description'] = d
# app['icon'] = detail.get_icon() why not ?
except OSError:
pass
return result
@property
def categories(self) -> Iterator[str]:
"""
return all groups in .json -> Generator
usage:
print('groups: [%s]' % ', '.join(map(str, .config_plugin.categories)))
"""
# i18 = i18n_categories()
try:
return (g['name'] for g in self.json)
except KeyError as err:
logging.critical(f"\n::Error: Bad json format ! [{err}] not found")
raise
def __contains__(self, category) -> bool:
"""
usage: if 'Internet' in config:
"""
return category in self.categories
def all(self):
"""
useful for find one application by name or package
used by __call__ AppData()
usage:
s="Calibre"
a = [x for x in self.config_plugin.all() if x["name"] == s or x["pkg"] == s ]
"""
for g in self.json:
for a in g['apps']:
yield a
def __call__(self, name: str):
"""
find one application
usage:
conf.apps('pacman')
"""
founds = [x for x in self.all() if x["name"] == name or x["pkg"] == name]
if founds:
return founds[0]
@staticmethod
def app_installed(package: str) -> bool:
if glob.glob(f"/var/lib/pacman/local/{package}-[0-9]*"):
return True
return False

View File

@ -1,3 +0,0 @@
class NoAppInIsoError(Exception):
"""# never show App-insatll on isos ??"""
pass

View File

@ -1,27 +0,0 @@
import logging
import os
import sys
from .browser_config import BrowserConfig
class HelloConfig(BrowserConfig):
"""
in manjaro-Hello only
"""
def load(self):
""" load datas"""
if os.path.isfile("/run/miso/bootmnt/manjaro"):
# raise NoAppInIsoError()
self.preferences = self.read_json_file(f"/usr/share/manjaro-hello/data/preferences.json")
else:
if "--dev" in sys.argv:
logging.basicConfig(level=logging.DEBUG)
self.preferences = self.read_json_file("data/preferences.json")
else:
self.preferences = self.read_json_file(f"/usr/share/manjaro-hello/data/preferences.json")
# TODO to set ?
self.url = {"desktop": "", "main": ""}
self.file = {"desktop": "", "main": "./data/{}.json".format(self.preferences["data_set"])}
return self

View File

@ -1,24 +0,0 @@
import os
from .browser_config import BrowserConfig
class IsoConfig(BrowserConfig):
"""
for iso only ?
usefull ? not sure ...
"live_path": "/run/miso/bootmnt/manjaro",
"""
def __init__(self, application):
# raise NoAppInIsoError()
if not os.path.isfile(self.preferences["live_path"]):
raise ImportError(path=self.preferences["live_path"])
super().__init__(application)
def load(self):
"""to override live iso ? desktop ?"""
# TODO to set
self.url = {"desktop": "", "main": ""}
self.file = {"desktop": "", "main": ""}
return self

View File

@ -1,34 +0,0 @@
#!/usr/bin/env python3
import logging
import os
import requests
import sys
from .browser_config import BrowserConfig
class StandAloneConfig(BrowserConfig):
"""
for Alone application
not in this file ! ;) view /application-alone.py
"""
def load(self):
""" load file or url by parameter console"""
self.preferences = {"data_set": "default"}
self.url = {"desktop": "", "main": ""}
self.file = {"desktop": "", "main": "./data/{}.json".format(self.preferences['data_set'])}
if len(sys.argv) > 1: # and not "--dev" in sys.argv:
file = sys.argv[1]
if os.path.isfile(file):
self.file["main"] = file
else:
try:
requests.get(file)
# TODO save in self._JSONMERGED
except ConnectionError:
logging.critical('json data not found')
else:
self.url["main"] = file
return self

View File

@ -1,101 +0,0 @@
#!/usr/bin/env python
"""
usage:
cd "project"
# not enter in src !
# for load json from url
src/install-alone.py https://gitlab.manjaro.org/papajoke/manjaro-hello/raw/application-utility-box/data/advanced.json
"""
import sys
import gi
import requests
from requests.exceptions import ConnectionError
import os
import importlib
import logging
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject, GdkPixbuf
# print(dir(gi.repository.Gtk))
# cat /usr/lib/python3.7/site-packages/gi/overrides/Gtk.py
# doc api
# https://lazka.github.io/pgi-docs/Gtk-3.0/index.html
class MyAloneConfig(ApplicationsConfig):
"""
for Alone application
not in this file ! ;)
"""
def __init__(self):
self.url = None
self.file = None
def load(self):
""" load file or url by parameter console"""
# self.preferences = {"data_set":"default" }
self.url = {"desktop": "", "main": ""}
self.file = {"desktop": "", "main": "./data/default.json"}
if len(sys.argv) > 1: # and not "--dev" in sys.argv:
file = sys.argv[1]
if os.path.isfile(file):
self.file["main"] = file
else:
if file.startswith("http"):
try:
# TODO make only head() ?
requests.get(file)
self.url["main"] = file
logging.info(f"json to use: [{self.url['main']}")
# TODO save in self._JSONMERGED
except ConnectionError:
logging.critical('json data not found')
# else:
# self.file["main"] = file
return self
class MainApp:
def __init__(self):
"""main app window"""
window = Gtk.Window(title='Python Application', border_width=6)
window.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
window.connect('delete-event', Gtk.main_quit)
window.connect('destroy', self.on_main_window_destroy)
window.set_default_size(800, 650)
"""
TODO ?
icon="system-software-install"
pixbuf24 = Gtk.IconTheme.get_default().load_icon(icon, 24, 0)
pixbuf32 = Gtk.IconTheme.get_default().load_icon(icon, 32, 0)
pixbuf48 = Gtk.IconTheme.get_default().load_icon(icon, 48, 0)
pixbuf64 = Gtk.IconTheme.get_default().load_icon(icon, 64, 0)
pixbuf96 = Gtk.IconTheme.get_default().load_icon(icon, 96, 0)
self.set_icon_list([pixbuf24, pixbuf32, pixbuf48, pixbuf64, pixbuf96])
"""
self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
window.add(self.main_box)
self.app_box = None
conf = MyAloneConfig("test-Python-Application")
self.app_box = Applications(conf, window)
self.main_box.pack_start(self.app_box, True, True, 0)
self.main_box.show_all()
window.show_all()
def on_main_window_destroy(self, widget):
Gtk.main_quit()
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
MainApp()
Gtk.main()

View File

@ -1,14 +0,0 @@
#!/usr/bin/env python3
conf = HelloConfig("test")
print(conf.file)
# apps = Applications.AppsDatas()
print('groups: [%s]' % ', '.join(map(str, conf.apps.categories)))
print("")
print(f" vlc: {conf.apps('vlc')} ")
print(f" vlc: {conf.apps('VLC')} ")
print("")