Exemplo n.º 1
0
def writer():
	
	testfile = 'Testing'                 # file with a string
	
	perms = [Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE]
	
	if  check_permissions(perms)!= True:
		request_permissions(perms)    # get android permissions     
		exit()                        # app has to be restarted; permissions will work on 2nd start
		
	try:
		Logger.info('Got requested permissions')    
		ffolder = os.path.join(primary_external_storage_path(),'KT') #folder name
		fname = os.path.join(ffolder,'testfile.txt')                 #file name
		log(f'writing to: {fname}')
		try:
			os.makedirs(ffolder)
			with open(fname, 'w') as f:        # write testfile
				f.write(testfile)
			return fname
		except Exception as e:
			pass
	
	except:
		log('could not write to external storage ... missing permissions ?')    
Exemplo n.º 2
0
class SaveDialog(FloatLayout):
    cancel = ObjectProperty(None)
    text_input = ObjectProperty(None)
    save = ObjectProperty(None)
    create_dir = ObjectProperty(None)
    dir_prefix = StringProperty(storage.primary_external_storage_path())

    def __init__(self, **kwargs):
        super(SaveDialog, self).__init__(**kwargs)

    def cancel_folder(self):
        self._popup.dismiss()

    def create_folder(self, path):
        os.mkdir(path)
        self.dir_prefix = path
        self.cancel_folder()

    def prompt_folder(self, path):
        option = NewFolderDialog(create=self.create_folder,
                                 cancel=self.cancel_folder,
                                 path=path)
        self._popup = Popup(title="New Folder",
                            content=option,
                            size_hint=(1, .3))
        self._popup.open()
Exemplo n.º 3
0
def get_drives():
    drives = []
    if platform == 'win':
        for path in ['Desktop', 'Documents', 'Pictures']:
            drives.append(
                (os.path.expanduser(u'~') + os.path.sep + path + os.path.sep,
                 path))
        bitmask = windll.kernel32.GetLogicalDrives()
        for letter in string.ascii_uppercase:
            if bitmask & 1:
                name = create_unicode_buffer(64)
                # get name of the drive
                drive = letter + u':'
                windll.kernel32.GetVolumeInformationW(drive + os.path.sep,
                                                      name, 64, None, None,
                                                      None, None, 0)
                drive_name = drive
                if name.value:
                    drive_name = drive_name + '(' + name.value + ')'
                drives.append((drive + os.path.sep, drive_name))
            bitmask >>= 1
    elif platform == 'linux':
        drives.append((os.path.sep, os.path.sep))
        drives.append((os.path.expanduser(u'~') + os.path.sep, 'Home'))
        drives.append(
            (os.path.sep + u'mnt' + os.path.sep, os.path.sep + u'mnt'))
        places = (os.path.sep + u'mnt' + os.path.sep, os.path.sep + u'media')
        for place in places:
            if os.path.isdir(place):
                for directory in next(os.walk(place))[1]:
                    drives.append(
                        (place + os.path.sep + directory + os.path.sep,
                         directory))
    elif platform == 'macosx' or platform == 'ios':
        drives.append((os.path.expanduser(u'~') + os.path.sep, 'Home'))
        vol = os.path.sep + u'Volume'
        if os.path.isdir(vol):
            for drive in next(os.walk(vol))[1]:
                drives.append((vol + os.path.sep + drive + os.path.sep, drive))
    elif platform == 'android':
        paths = [('/', 'Root'), ('/storage', 'Mounted Storage')]
        from android.storage import primary_external_storage_path
        primary_ext_storage = primary_external_storage_path()
        if primary_ext_storage:
            paths.append((primary_ext_storage, 'Primary Storage'))

        from android.storage import secondary_external_storage_path
        secondary_ext_storage = secondary_external_storage_path()
        if secondary_ext_storage:
            paths.append((secondary_ext_storage, 'Secondary Storage'))

        for path in paths:
            realpath = os.path.realpath(path[0]) + os.path.sep
            if os.path.exists(realpath):
                drives.append((realpath, path[1]))

    return drives
Exemplo n.º 4
0
def get_downloads_dir():
    """
    Return the path to the user's downloads dir.
    """
    if PLATFORM == 'android':
        return os.path.join(primary_external_storage_path(),
                            Environment.DIRECTORY_DOWNLOADS)
    else:
        return os.getcwd()
Exemplo n.º 5
0
 def file_manager_open(self):
     if platform == 'android':
         request_permissions([
             Permission.WRITE_EXTERNAL_STORAGE,
             Permission.READ_EXTERNAL_STORAGE
         ])
         SD_CARD = primary_external_storage_path()
         self.file_manager.show(SD_CARD)
     else:
         self.file_manager.show("/")
Exemplo n.º 6
0
def getpaths():
    if platform == 'android':
        from android.storage import app_storage_path
        app_storage = app_storage_path()
        from android.storage import primary_external_storage_path
        internal = primary_external_storage_path()
        from android.storage import secondary_external_storage_path
        external = secondary_external_storage_path()
        return app_storage, internal, external
    if platform == 'linux' or platform == 'win':
        internal_storage = str(Path.home())
        return None, internal_storage, None
Exemplo n.º 7
0
 def load_dialog(self):
     start_path = os.path.dirname(os.path.abspath(__file__))
     if 'android' in kivy.utils.platform:
         start_path = primary_external_storage_path()
     elif 'linux' in kivy.utils.platform:
         start_path = str(Path.home())
     content = LoadDialog(load=self.load_file,
                          cancel=self.dismiss_popup,
                          start_path=start_path)
     self._popup = Popup(title="Load file",
                         content=content,
                         size_hint=(0.9, 0.9))
     self._popup.open()
Exemplo n.º 8
0
def main(say, widget):
    for i in trigger:
        if i in say:
            toSpeak = "Я сделал снимок экрана."
            storage = primary_external_storage_path()
            plyer.screenshot(file_path=f"{storage}/Pictures/")
            break
        else:
            toSpeak = ""

    if toSpeak != "":
        speak.speak(toSpeak, widget)

    return toSpeak
Exemplo n.º 9
0
 def video_start(self):
     if not self.video_is_recording:
         self.preview_view.performClick()
         context = PythonActivity.mActivity.getApplicationContext()
         dt = datetime.datetime.now()
         today = dt.strftime("%Y_%m_%d")
         name = dt.strftime("%H_%M_%S") + '.mp4'
         if self.private or api_version < 29:
             if self.private:
                 root = app_storage_path()
             else:
                 root = primary_external_storage_path()
                 if not root:
                     self.callback("ERROR: No external storage")
                     return
             dir = join(root, Environment.DIRECTORY_DCIM)
             if not exists(dir):
                 mkdir(dir)
             if not self.private:
                 dir = join(dir,self.app_name())
                 if not exists(dir):
                     mkdir(dir)
             dir = join(dir,today)
             if not exists(dir):
                 mkdir(dir)
             self.filepath = join(dir,name)
             self.name_pipe.append(self.filepath)
             self.videofile = File(self.filepath)
             self.vcf = VideoCaptureOutputFileOptionsBuilder(self.videofile).build()
         else:
             self.cr =  PythonActivity.mActivity.getContentResolver()
             collection = MediaStoreVideoMedia.EXTERNAL_CONTENT_URI
             self.cv = ContentValues()
             self.cv.put(MediaStoreMediaColumns.DISPLAY_NAME, name)
             self.cv.put(MediaStoreMediaColumns.MIME_TYPE, "video/mp4")
             self.cv.put(MediaStoreMediaColumns.RELATIVE_PATH,
                         join(Environment.DIRECTORY_DCIM, self.app_name(),today))
             self.vcf = VideoCaptureOutputFileOptionsBuilder(self.cr,
                                                             collection,
                                                             self.cv).build()
         if api_version < 28:
             self.te = ContextCompat.getMainExecutor(context)
         else:
             self.te = context.getMainExecutor()
         self.wrapper = CallbackWrapper(self.callback_wrapper)  
         self.vsc = VideoSavedCallback(self.wrapper)
         self.imageCapture.startRecording(self.vcf,self.te,self.vsc)
         self.video_is_recording = not self.video_is_recording
Exemplo n.º 10
0
def playFromDir():
    global musicIsPlayed
    storage = primary_external_storage_path()
    playlist = os.listdir(f"{storage}/Music/")

    for file in playlist:
        if os.path.isdir(f"{storage}/Music/{file}"):
            playlist.remove(file)

    if musicIsPlayed:
        mPlayer.stop()
        mPlayer.reset()
        mPlayer.setDataSource(f'{storage}/Music/{random.choice(playlist)}')
        mPlayer.prepare()
        mPlayer.start()
    else:
        mPlayer.setDataSource(f'{storage}/Music/{random.choice(playlist)}')
        mPlayer.prepare()
        mPlayer.start()
        musicIsPlayed = True
Exemplo n.º 11
0
    def select_zip(self, *args):
        if platform == 'android':

            if check_permission(
                    Permission.WRITE_EXTERNAL_STORAGE
            ) == False:  # check permission takes str not a list
                request_permission(Permission.WRITE_EXTERNAL_STORAGE)
                request_permission(Permission.READ_EXTERNAL_STORAGE)
                request_permission(Permission.MANAGE_EXTERNAL_STORAGE)
                request_permission(Permission.MANAGE_DOCUMENTS)

                #request_permisssion takes str and request_permissions takes list
                return
            self.secondary_ext_storage = secondary_external_storage_path()
            self.primary_ext_storage = primary_external_storage_path()
            self.app_path = app_storage_path()

            Logger.debug(" Storages are \n" + str(self.app_path) + "\n" +
                         str(self.primary_ext_storage))
        else:
            #self.root.ids.status_label.text = " I am not running in android "
            pass
        self.file_manager_open()
Exemplo n.º 12
0
from PIL import Image

from android import activity, mActivity
from android.permissions import request_permissions, Permission
from android.storage import primary_external_storage_path
request_permissions([Permission.CAMERA, Permission.READ_EXTERNAL_STORAGE])

from kivy.logger import Logger
from kivy.config import Config
Config.set('kivy', 'log_level', 'debug')
Config.set('kivy', 'log_dir', 'logs')
Config.set('kivy', 'log_name', 'kivy_%y-%m-%d_%_.txt')
Config.set('kivy', 'log_enable', 1)
Config.write()
Logger.debug("DEBUG: primary_external_storage_path")
Logger.debug("DEBUG: %s", primary_external_storage_path())

Intent = autoclass('android.content.Intent')
MediaStore = autoclass('android.provider.MediaStore')
Environment = autoclass('android.os.Environment')
Context = autoclass("android.content.Context")
FileProvider = autoclass('android.support.v4.content.FileProvider')
PythonActivity = autoclass("org.kivy.android.PythonActivity").mActivity


class TakePictureApp(App):
    def take_picture(self):
        def create_img_file():
            File = autoclass('java.io.File')
            storageDir = Context.getExternalFilesDir(
                Environment.DIRECTORY_PICTURES)
Exemplo n.º 13
0
 def file_manager_open(self):
     from android.storage import primary_external_storage_path  # todo
     primary_ext_storage = primary_external_storage_path()  # todo
     self.file_manager.show("/")  # todo
     self.file_manager.show(primary_ext_storage)  # output manager to the screen
     self.manager_open = True
Exemplo n.º 14
0
    def exportDeck(self, btn):
        if platform == 'android':
            request_permissions([
                Permission.WRITE_EXTERNAL_STORAGE,
                Permission.READ_EXTERNAL_STORAGE
            ])
            SD_CARD = primary_external_storage_path()
            folder = os.path.join(SD_CARD, 'Anki Deck Export')
        else:
            folder = 'Anki Deck Export'

        if not os.path.exists(folder):
            os.makedirs(folder)

        # imported file name
        data_filename = self.sm.ids.main_screen_id.ids.path_selected_label.text

        # title
        anki_deck_title = self.sm.ids.export_screen_id.ids.tf_deck_title.text

        # model
        anki_model_name = self.sm.ids.export_screen_id.ids.tf_deck_model.text

        deck_name = anki_deck_title + "_Export_" + ".apkg"

        if platform == 'android':
            # deck file
            deck_filename = os.path.join(SD_CARD, 'Anki Deck Export',
                                         deck_name)
        else:
            deck_filename = os.path.join('Anki Deck Export', deck_name)

        model_id = random.randrange(1 << 30, 1 << 31)

        flag = False

        front = "<div>{{" + self.dynamic_ids["Field0"].text + "}}</div>"
        back = ""

        self.fields = []
        for field in self.dynamic_ids:
            self.fields.append({"name": self.dynamic_ids[field].text})
            back += "<div>{{" + self.dynamic_ids[field].text + "}}</div>\n"

        for field in self.dynamic_ids:
            if len(self.dynamic_ids[field].text) > 0:
                flag = True
            else:
                flag = False

        style = """
.card {
font-family: arial;
font-size: 20px;
text-align: center;
color: black;
background-color: white;
}
        """

        try:
            if flag:
                anki_model = genanki.Model(
                    model_id,
                    anki_model_name,
                    fields=self.fields,
                    templates=[
                        {
                            "name": "Card 1",
                            "qfmt": front,
                            "afmt": back,
                        },
                    ],
                    css=style,
                )

                anki_notes = []

                with open(data_filename, "r", encoding="utf-8") as csv_file:
                    csv_reader = csv.reader(csv_file, delimiter=self.delim)
                    for row in csv_reader:
                        flds = []
                        for i in range(len(row)):
                            flds.append(row[i])

                        anki_note = genanki.Note(
                            model=anki_model,
                            fields=flds,
                        )
                        anki_notes.append(anki_note)

                #random.shuffle(anki_notes)

                anki_deck = genanki.Deck(model_id, anki_deck_title)
                anki_package = genanki.Package(anki_deck)

                for anki_note in anki_notes:
                    anki_deck.add_note(anki_note)

                anki_package.write_to_file(deck_filename)

                toast("Deck generated with {} flashcards".format(
                    len(anki_deck.notes)))
            else:
                toast("Fields are empty!")
        except:
            toast("Deck Creation Failed!")
            print(traceback.print_exc())
Exemplo n.º 15
0
#!/usr/bin/python3
# coding: utf8
from kivy.app import App
from kivy.factory import Factory
from kivy.logger import Logger
from kivy.storage.jsonstore import JsonStore
from gen_pdf import motifs_courts, generer_pdf
import os.path
from kivy import platform
if platform == 'android':
    from android.permissions import request_permissions, Permission
    from android.storage import primary_external_storage_path, app_storage_path
    data_dir = app_storage_path()
    user_dir = primary_external_storage_path()
else:
    from pathlib import Path
    data_dir = os.path.dirname(os.path.abspath(__file__))
    user_dir = Path.home()
    import locale
    locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')

__version__ = "0.9.9"


class AttgenApp(App):
    data = {
        'nom': '',
        'prenom': '',
        'date_naissance': '',
        'lieu_naissance': '',
        'adresse': '',
Exemplo n.º 16
0
    def __init__(self, **kwargs):
        super(box, self).__init__(**kwargs)
        self.main_box = BoxLayout(size=Window.size)
        self.main_box.orientation = 'vertical'
        self.anim_type = 'slide_above_simple'
        ###############################################################################3
        act_current_dir = os.getcwd()
        #os.chdir(r'/home/nagendra/test_folder')
        os.chdir(r'/storage/emulated/0/New kivy/My_app/New_music_code')
        current_dir = os.getcwd()
        os.chdir(act_current_dir)
        print('current_dirrrr = ', current_dir)
        #######################################################################
        self.lyt_image = main_lyt_image(self)
        self.nav_lyt = navigator_lyt(self,
                                     self.main_box)  # for navigation layout
        self.nav_lyt.bind(on_press=partial(open_filemanager, music_app,
                                           self.main_box, current_dir))
        self.nav_lyt.bind(on_release=lambda x: self.toggle_nav_drawer())
        ####################################################################
        gridlayout = GridLayout(cols=1, size_hint_y=None, spacing=1)
        gridlayout.bind(minimum_height=gridlayout.setter('height'))
        ##################################################################33#########
        print('current_di = ', current_dir)
        index = 0
        ## r'/storage/emulated/0/New kivy/My_app/New_music_code/songs/'
        SD_CARD = primary_external_storage_path()
        request_permissions([
            Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE
        ])

        for dirpath, dir_name, filename in os.walk(SD_CARD):
            ##print('dir_pathh = ',dirpath)
            for fn in glob(dirpath + '/*.mp3'):
                print('fn_list= ', fn)
                #                song_text = fn.split('/')[-1:][0][:-4]
                #################################################
                song_name, btn_image, song_length = data_extract(fn)

                if (float(song_length) < 100.0):
                    continue
                print('son_len = ', str(song_length))
                ###################################################
                song_button = tbtn_new()
                song_button.bind(
                    on_press=partial(self.gonext, index, self.main_box))
                song_button.text = song_name

                songlist[index] = [fn, song_button]
                #                song_button.canvas.before.children[0].rgba = [1,1,1,0.15] # Background color of button
                ##################################################
                song_btn_image(song_button, btn_image)  ## Image of button
                ####################################################################
                gridlayout.add_widget(song_button)
                index += 1
        #txtfile.close()
        scrollview = ScrollView()
        scrollview.add_widget(gridlayout)
        self.main_box.add_widget(scrollview)

        self.add_widget(self.main_box)
Exemplo n.º 17
0
import logging
import os
from datetime import date, time
from openpyxl import load_workbook

from kivy.uix.recycleview import RecycleView
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.app import App

from android.storage import primary_external_storage_path
primary_ext_storage = primary_external_storage_path()
from android.permissions import request_permissions, Permission
request_permissions([Permission.WRITE_EXTERNAL_STORAGE])


class IndividualEdit(RecycleView):
    """ The next page to edit individual sheets """
    sm = ObjectProperty(None)

    def init_data(self, *args):
        app = App.get_running_app()
        self.data = []
        for i in range(5, 12):
            if app.sheet_editors[
                    app.circle].sheet[f"B{i}"].value.title() != "Total":
                self.data.append({
                    "l1":
                    app.sheet_editors[app.circle].sheet[f"B{i}"].value or "",
                    "l2":
                    app.sheet_editors[app.circle].sheet[f"C{i}"].value or "",
Exemplo n.º 18
0
class SmartBricksApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Window.bind(on_keyboard=self.events)
        self.manager_open = False
        self.file_manager = MDFileManager(exit_manager=self.exit_manager,
                                          select_path=self.select_path,
                                          previous=True,
                                          ext=['jpeg', 'png', 'jpg'])

        #self.menu_2 = self.create_menu("Button dots", self.root.ids.toolbar.ids.button_2)
        #print('HEREEEEEEE!!!!', self.root)
        #cm = CustomToolbar

        try:

            request_permissions([
                Permission.WRITE_EXTERNAL_STORAGE,
                Permission.READ_EXTERNAL_STORAGE
            ])
        except NameError:
            pass

    def dropdown(self, id):

        self.menu_2 = self.create_menu("Button dots", id)
        self.menu_2.open()

    def create_menu(self, instance):

        menu_items = [
            {
                "right_content_cls": RightContentCls(
                    #text=f"R", icon="apple-keyboard-command",
                ),
                "icon": "apple-keyboard-command",
                "text": text,
            } for text in ('RENAME', 'DELETE')
        ]
        return MDDropdownMenu(caller=instance, items=menu_items, width_mult=4)

    def build(self):
        #Window.bind(on_keyboard=self.key_input)
        self.screen = Builder.load_file("main.kv")

        return self.screen

    def on_pause(self):
        return True

    #def key_input(self, window, key, scancode, codepoint, modifier):
    #  if key == 27:
    #     return True  # override the default behaviour
    #  else:           # the key now does nothing
#         return False

#settings_path = app_storage_path()

    path = os.getcwd()
    df = pd.read_csv('%s/legoKeys.cvs' % (path), sep='\t')

    try:
        SD_CARD = primary_external_storage_path() + '/' + 'DCIM/Camera'
        out_dir = '%s/smartbricks_outputs/' % (primary_external_storage_path())
        print('ANDROID mmodules loaded...')

    except NameError:
        print('ANDROID modules failed...')
        SD_CARD = '/home/omar/Pictures'
        out_dir = '%s/myproj_out/' % (path)
        pass

    isdir = os.path.isdir(out_dir)

    def plist(self):

        if self.isdir:
            plist_ = os.listdir(self.out_dir)
        else:
            os.mkdir(self.out_dir)
            plist_ = None

        return plist_

    custom_sheet = None

    def callback_for_menu_items(self, *args):
        toast(args[0])

    def openScreen(self, itemdrawer):
        self.openScreenName(itemdrawer.target)
        self.root.ids.nav_drawer.set_state("close")

    def openScreenName(self, screenName):
        self.root.ids.screen_manager.current = screenName

    def ifproject(self):

        print('PLIST!!!!!!!!!', self.plist())
        print('PLIST TYPE!!!!!!!!!', type(self.plist()))

        if ((self.isdir) & (self.plist() is not None)):

            #clear widgets if any previously load to avoid staking of color palettes between projects
            self.root.ids.grid_list.clear_widgets()
            #self.root.ids.grid_list.remove_widget(self.root.ids.grid_list)

            self.openScreenName('projects')

            #if ((self.isdir) & (self.plist is not None)):
            for dir_ in self.plist():
                self.root.ids.grid_list.add_widget(
                    CustomSmartTileWithLabel(
                        source=self.out_dir + dir_ + '/all.jpeg',
                        text="[size=32]%s[/size]" % (dir_)))

        else:
            self.callback_for_menu_items(
                'No projects saved yet. Select START to start a new project.')

    def chooseproject(self, img_source):

        #clear widgets if any previously load to avoid staking of color palettes between projects
        self.root.ids.content_drawer.ids.md_list.clear_widgets()

        self.root.ids.image.source = img_source
        self.openScreenName('main')

        self.img_path = os.path.dirname(img_source)
        tab = np.load(self.img_path + '/table.npz')
        self.tab = tab['data']

        row_data = []
        n2x2, n2x1, n1x1 = 0, 0, 0

        for num, i in enumerate(self.tab.T[0][:-1]):
            if i == '0.0_0.0_0.0': continue
            R, G, B = i.split("_")
            R, G, B = [np.int(np.float(j)) for j in [R, G, B]]
            mask = (self.df['R'] == R) & (self.df['G'] == G) & (self.df['B']
                                                                == B)
            Nbrick, color_name = self.df['LEGO No.'][mask].item(
            ), self.df['Color'][mask].item()
            #print(R,G,B, Nbrick, color_name)

            #
            self.root.ids.content_drawer.ids.md_list.add_widget(
                CustomMDIconButton(color=(R / 256, G / 256, B / 256, 1),
                                   text=color_name,
                                   text_color=(1, 0, 0, 1),
                                   icon='checkbox-blank-circle-outline'))

            n2x2 += int(self.tab.T[1][num])
            n2x1 += int(self.tab.T[2][num])
            n1x1 += int(self.tab.T[3][num])

            row_data.append(
                (color_name, self.tab.T[1][num], self.tab.T[2][num],
                 self.tab.T[3][num], int(self.tab.T[1][num]) +
                 int(self.tab.T[2][num]) + int(self.tab.T[3][num])))

        row_data.append(('Total', n2x2, n2x1, n1x1, n2x2 + n2x1 + n1x1))
        #if len(row_data) > 10: pagination = True
        #else: pagination = False

        self.data_tables = MDDataTable(
            size_hint=(0.9, 0.6),
            rows_num=20,
            use_pagination=True if len(row_data) > 20 else False,
            check=False,
            column_data=[("Color", dp(40)), ("2x2", dp(10)), ("2x1", dp(10)),
                         ("1x1", dp(10)), ("All", dp(10))],
            row_data=row_data,
        )

        self.root.ids.content_drawer.ids.md_list.add_widget(
            CustomMDIconButton(
                color=self.theme_cls.primary_color,
                text='All',
                icon='checkbox-blank-circle-outline',
                #text_color=(R/256,G/256,B/256,1),
                #icon='checkbox-marked-circle'
            ))

        self.root.ids.content_drawer.ids.md_list.add_widget(
            CustomMDIconButton(color=self.theme_cls.primary_color,
                               text='Original',
                               icon=''))

        keep = self.tab.T[0] == 'total'

        b2x2 = self.root.ids.brick_2x2
        b2x1 = self.root.ids.brick_2x1
        b1x1 = self.root.ids.brick_1x1
        for num, brick, brickLab in zip([1, 2, 3], [b2x2, b2x1, b1x1],
                                        ['2x2', '2x1', '1x1']):
            brick.text = brickLab + ': ' + self.tab.T[num][keep][0]

    def choose_palette(self, img_bg_color, text, id):

        self.root.ids.palette_toolbar.md_bg_color = img_bg_color

        self.img_path = os.path.dirname(self.root.ids.image.source)
        #R,G,B = np.float(img_bg_color[0]*256), np.float(img_bg_color[1]*256), np.float(img_bg_color[2]*256)
        R, G, B = np.int(img_bg_color[0] * 256), np.int(
            img_bg_color[1] * 256), np.int(img_bg_color[2] * 256)

        mean = np.mean([R, G, B])
        #print(R,G,B)

        #self.root.ids.image.parent.remove_widget(self.root.ids.image)

        if text not in ['All', 'Original']:
            self.root.ids.image.clear_widgets()
            self.root.ids.image.source = self.img_path + '/%s_%s_%s.zip' % (
                str(R), str(G), str(B))
        else:
            self.root.ids.image.source = self.img_path + '/%s.jpeg' % (
                text.lower())

        print('SOURCE!!!!!!!', self.root.ids.image.source)
        print('TEXT!!!!!!!', text)

        id.icon = 'checkbox-marked-circle'

        #Get bricks counts
        tab = np.load(self.img_path + '/table.npz')
        self.tab = tab['data']

        if text not in ['All', 'Original']:
            keep = self.tab.T[0] == '%s_%s_%s' % (str(R), str(G), str(B))
        else:
            keep = self.tab.T[0] == 'total'

        b2x2 = self.root.ids.brick_2x2
        b2x1 = self.root.ids.brick_2x1
        b1x1 = self.root.ids.brick_1x1

        if mean > 180:
            test_color = [0, 0, 0, 1]  #black
            invert = False
        else:
            test_color = [1, 1, 1, 1]  #withe
            invert = True

        id.text_color = test_color

        for num, brick, brickLab in zip([1, 2, 3], [b2x2, b2x1, b1x1],
                                        ['2x2', '2x1', '1x1']):
            brick.text = brickLab + ': ' + self.tab.T[num][keep][0]
            brick.text_color = test_color
            #print(brick.text_color)

        b2x2_i = self.root.ids.brick_2x2_icon
        b2x1_i = self.root.ids.brick_2x1_icon
        b1x1_i = self.root.ids.brick_1x1_icon

        for num, brick, brickLab in zip([1, 2, 3], [b2x2_i, b2x1_i, b1x1_i],
                                        ['2x2', '2x1', '1x1']):

            #print('MAIN PATH:', self.path)

            if invert:
                brick.icon = "%s/images/%s_invert.jpg" % (self.path, brickLab)
            else:
                brick.icon = "%s/images/%s.jpg" % (self.path, brickLab)

        #self.root.ids.brick_2x2.text = '2x2: '+self.tab.T[1][keep][0]
        #self.root.ids.brick_2x1.text = '2x1: '+self.tab.T[2][keep][0]
        #self.root.ids.brick_1x1.text = '1x1: '+self.tab.T[3][keep][0]

        #print(mean, test_color, self.root.ids.brick_2x2.text_color)
        #self.root.ids.brick_2x2.text_color=test_color

        #if invert: self.root.ids.brick_2x2_icon.icon="/home/omar/myproj/SmartBricks/2x2_invert.jpg"
        #else: self.root.ids.brick_2x2_icon.icon="/home/omar/myproj/SmartBricks/2x2.jpg"
        #print(self.root.ids.brick_2x2.text_color)

    #def test(self, R, G, B):
    #    return R,G,B,1

    def callback_mosaic_size(self, instance, value):
        toast('mosaic size: %s' % (value))
        self.mosaic_size_val = value

    def callback_mosaic_color(self, instance, value):
        toast('mosaic colors: %s' % (value))
        self.mosaic_color_val = value

    def callback_mosaic_name(self, instance, value):
        toast('mosaic name: %s' % (value))
        self.mosaic_name = value

    def show_alert_dialog(self, name):

        if not self.dialog:
            self.dialog = MDDialog(
                title="Replace existing project?",
                text=
                "Project '%s' already exists. Do you want to replace existing project?"
                % (name),
                buttons=[
                    MDFlatButton(text="CANCEL",
                                 text_color=self.theme_cls.primary_color,
                                 on_press=lambda x: self.dialog.dismiss()),
                    MDFlatButton(
                        text="ACCEPT",
                        text_color=self.theme_cls.primary_color,
                        on_press=lambda x: self.show_dialog_progress()),
                ],
            )
        else:
            self.dialog.dismiss()
        self.dialog.open()

    def create_mosaic(self):

        print('LOWSIZE --------', type(self.mosaic_size_val))
        print('NCOLORS --------', type(self.mosaic_color_val))
        print('OUTDIR --------', type(self.root.ids.project_name.text))

        if (self.mosaic_size_val is
                None) or (self.mosaic_color_val is
                          None) or (self.root.ids.project_name.text == ''):

            ttext = 'Define mosaic input values'

            if (self.mosaic_size_val is None): ttext += ', lower size'
            if (self.mosaic_color_val is None): ttext += ', colors'
            if (self.root.ids.project_name.text == ''):
                ttext += ', project name'

            print('TEXT ------ ', ttext)

            toast(ttext)
        #elif
        #elif (if not self.root.ids.project_name.text):
        #    toast('Choose a project name first')
        else:
            #print(self.root.ids.setup_image.source)
            #print(int(self.mosaic_size_val))
            #print(int(self.mosaic_color_val))
            #print(self.root.ids.project_name.text)
            #print(self.out_dir+self.root.ids.project_name.text)

            self.imgpath = str(self.root.ids.setup_image.source)
            self.Ncolors = np.int(self.mosaic_color_val)
            self.lowsize = np.int(self.mosaic_size_val)
            self.outdir = str(self.out_dir + self.root.ids.project_name.text)

            for i in [self.imgpath, self.Ncolors, self.lowsize, self.outdir]:
                print(i, type(i))

            if (self.plist() is not None):
                if (self.root.ids.project_name.text in self.plist()):

                    print('project name already exist...')
                    self.show_alert_dialog(
                        name=self.root.ids.project_name.text)
                else:
                    self.show_dialog_progress()
            else:
                self.show_dialog_progress()

    def show_dialog_progress(self):

        #if not self.dialog2:
        self.dialog2 = MDDialog(
            title="Creating mosaic. Please wait.",
            type="custom",
            #text="Creating mosaic. Please wait.",
            content_cls=progress_bar(),  #self.pb,
            on_open=self.run_mosaic
            #on_open=self.puopen)
            #on_open=self.run_mosaic(imgpath=imgpath, Ncolors=Ncolors, lowsize=lowsize, outdir=outdir)
        )
        self.dialog2.open()

        if self.dialog: self.dialog.dismiss()
        #self.dialog2.bind(on_open=self.run_mosaic)
        #self.run_mosaic

    #def run_mosaic(self, imgpath=None, Ncolors=None, lowsize=None, outdir=None):
    def run_mosaic(self, instance):

        #clear widgets if any previously load to avoid staking of color palettes between projects
        #self.pb.load_bar.clear_widgets()
        self.pb = progress_bar()
        #self.pb.load_bar.parent.remove_widget(self.pb.load_bar)
        self.pb.load_bar.value = 0

        #print(self.pb.load_bar.value)
        #Nmax = np.int(self.mosaic_color_val) #+ 3

        start = time.time()
        SB = SmartBricks(imgpath=self.imgpath,
                         Ncolors=self.Ncolors,
                         lowsize=self.lowsize,
                         outdir=self.outdir)
        #print(SB.img)
        #print(SB.res1x1)
        #SB.saveProj()
        end = time.time()
        print('Total run time #1: %f sec' % (end - start))
        print('point size', SB.size)

        import matplotlib.pyplot as plt
        ispathdir = os.path.isdir(self.outdir)
        if not ispathdir: os.makedirs(self.outdir, exist_ok=True)
        else:
            files = os.listdir(self.outdir)
            #print(self.outdir)
            for f in files:
                os.remove(self.outdir + '/' + f)

        start = time.time()

        #lmax = 10

        if SB.w > SB.h: x_size, y_size = SB.lmax, SB.h * SB.lmax / SB.w
        else: x_size, y_size = SB.w * SB.lmax / SB.h, SB.lmax

        fig = plt.figure(figsize=(x_size, y_size))
        #fig = plt.figure(figsize=(12,12))
        ax = plt.gca()

        SB.bricksCanvas(img=SB.img,
                        fig=fig,
                        ax=ax,
                        RGB=None,
                        res2x2=SB.res2x2,
                        res2x1=SB.res2x1,
                        res1x1=SB.res1x1)
        figcvs = fig
        figall = fig
        #figoriginal = fig.copy

        #paletteLego = SB.palette(SB.img)
        #palette_flat = SB.imgFlat(paletteLego)
        Nmax = len(SB.palette_flat)
        self.pb.load_bar.max = Nmax

        table = []
        #for num, pal in enumerate(palette_flat):
        for i in range(Nmax):

            print(self.pb.load_bar.value)

            pal = SB.palette_flat[i]
            N2x2, N2x1, N1x1 = SB.makeGiff(
                img=SB.img,
                RGB=pal,
                idxs=[SB.res2x2[2], SB.res2x1[2], SB.res1x1[2]],
                pathdir=self.outdir,
                fig=figcvs,
                ax=ax)
            r, g, b = pal
            color = '%s_%s_%s' % (r, g, b)
            table.append([color, N2x2, N2x1, N1x1])
            self.pb.load_bar.value = i + 1
            #self.value99 = i+1

        t = np.array(table)
        N2x2total = np.sum(t[:, 1].astype(int))
        N2x1total = np.sum(t[:, 2].astype(int))
        N1x1total = np.sum(t[:, 3].astype(int))
        table.append(['total', N2x2total, N2x1total, N1x1total])

        end = time.time()
        print('Total run time #2: %f sec' % (end - start))

        start = time.time()

        figall.subplots_adjust(left=SB.left,
                               bottom=SB.bottom,
                               right=SB.right,
                               top=SB.top,
                               wspace=None,
                               hspace=None)
        ax = figall.add_subplot(111)
        ax.imshow(SB.img)
        #True if testing App from PC.
        if SB.frompc:
            figall.savefig('%s/all.jpeg' % (self.outdir),
                           bbox_inches='tight',
                           pad_inches=0)
        else:
            buffer = io.BytesIO()
            canvas = plt.get_current_fig_manager().canvas
            canvas.draw()
            pil_image = PIL.Image.frombytes('RGB', canvas.get_width_height(),
                                            canvas.tostring_rgb())
            pil_image.save('%s/all.jpeg' % (self.outdir), 'JPEG')

        fig0 = plt.figure(figsize=(x_size, y_size))
        fig0.subplots_adjust(left=SB.left,
                             bottom=SB.bottom,
                             right=SB.right,
                             top=SB.top,
                             wspace=None,
                             hspace=None)
        ax = plt.gca()
        ax = fig0.add_subplot(111)
        ax.imshow(SB.img_original)
        if SB.frompc:
            fig0.savefig('%s/original.jpeg' % (self.outdir),
                         bbox_inches='tight',
                         pad_inches=0)
        else:
            buffer = io.BytesIO()
            canvas = plt.get_current_fig_manager().canvas
            canvas.draw()
            pil_image = PIL.Image.frombytes('RGB', canvas.get_width_height(),
                                            canvas.tostring_rgb())
            pil_image.save('%s/original.jpeg' % (self.outdir), 'JPEG')

        #ax = figall.add_subplot(111)
        #ax.imshow(SB.img)
        #figall.savefig('%s/all.jpeg' %(self.outdir), bbox_inches = 'tight', pad_inches = 0)

        #fig0 = plt.figure(figsize=(12,12))
        #ax = fig0.add_subplot(111)
        #plt.imshow(SB.img_original)
        #fig0.savefig('%s/original.jpeg' %(self.outdir), bbox_inches = 'tight', pad_inches = 0)

        np.savez_compressed('%s/table' % (self.outdir), data=table)

        end = time.time()
        print('Total run time #3: %f sec' % (end - start))

        if Nmax == self.pb.load_bar.value:
            self.dialog2.dismiss()

        #SmartBricks(imgpath=self.imgpath, Ncolors=self.Ncolors, lowsize=self.lowsize, outdir=self.outdir).saveProj(self.pb.load_bar.value)

        self.chooseproject(self.outdir + '/all.jpeg')

    def next(self, dt):

        #if self.times == 0:
        #self.run_mosaic
        #    SmartBricks(imgpath=self.imgpath, Ncolors=self.Ncolors, lowsize=self.lowsize, outdir=self.outdir).saveProj()
        #    self.times = 1

        if os.path.exists(self.outdir):
            #self.value99 += 1
            print(self.pb.load_bar.value)
            Nmax = np.int(self.mosaic_color_val) + 3
            self.pb.load_bar.max = Nmax
            Ncurrent = len(
                os.listdir(str(self.out_dir +
                               self.root.ids.project_name.text)))
            print(self.pb.load_bar.value, self.pb.load_bar.max, Ncurrent)
            #print(self.pb.load_bar.value, self.pb.load_bar.max)

            if self.pb.load_bar.value >= Nmax:
                return False
            else:
                self.pb.load_bar.value = Ncurrent
                #self.pb.load_bar.value = self.value99
        else:
            print('PATH DOES NOT EXIST YET!')
            #print(self.times)

    def puopen(self, instance):

        #self.times = 0

        Clock.schedule_interval(self.next, 1 / 25)
        #self.run_mosaic

    def on_start(self):

        self.imgpath = None
        self.Ncolors = None
        self.lowsize = None
        self.outdir = None

        self.mosaic_size_val = None
        self.mosaic_color_val = None
        self.mosaic_name = None
        self.dialog = None
        self.dialog2 = None
        self.value99 = 0
        #self.pb = progress_bar()

        self.menu_2 = self.create_menu(self.root.ids.toolbar)

        self.root.ids.avatar.source = '%s/images/logo.zip' % (self.path)

        self.root.ids.brick_2x2_icon.icon = "%s/images/%s.jpg" % (self.path,
                                                                  '2x2')
        self.root.ids.brick_2x1_icon.icon = "%s/images/%s.jpg" % (self.path,
                                                                  '2x1')
        self.root.ids.brick_1x1_icon.icon = "%s/images/%s.jpg" % (self.path,
                                                                  '1x1')

        for i in np.arange(8, 72, 8):
            self.root.ids.mosaic_size.add_widget(
                CustomMDChip(label='%s' % (str(i)),
                             cb=self.callback_mosaic_size,
                             icon='grid'))

        for i in np.arange(2, 18, 2):
            self.root.ids.mosaic_colors.add_widget(
                CustomMDChip(label=str(i),
                             cb=self.callback_mosaic_color,
                             icon='palette'))

            #print(self.custbutt.palette.md_bg_color)

            #self.root.ids.content_drawer.ids.palette.md_bg_color = (i/100,i/10,0,1)
            #md_bg_color=(1,0,0,1)

            #


#        self.root.ids.content_drawer.ids.md_list.add_widget(
#            ItemDrawer(target="screen1", text="Screen 1",
#                       icon="home-circle-outline",
#                       on_release=self.openScreen)
#        )
#        self.root.ids.content_drawer.ids.md_list.add_widget(
#            ItemDrawer(target="screen2", text="Screen 2",
#                       icon="settings-outline",
#                       on_release=self.openScreen)
#        )

    def custom_bottom_sheet(self):
        self.custom_sheet = MDCustomBottomSheet(
            screen=Factory.ContentCustomSheet())
        self.custom_sheet.open()

    def show_gallery(self):

        self.openScreenName('camera')

        types = ('*.png', '*.jpeg', '*.jpg')  # the tuple of file types
        files_grabbed = []
        for files in types:
            files_grabbed.extend(glob.glob(os.path.join(self.SD_CARD, files)))

        files_grabbed.sort(key=os.path.getmtime)
        files_grabbed.reverse()

        for file in files_grabbed[:20]:
            self.root.ids.grid_list_camera.add_widget(
                CustomSmartTileWithLabelGallery(source=file,
                                                text="[size=18]%s[/size]" %
                                                (os.path.basename(file))))

    def file_manager_open(self):
        #self.file_manager.show('/home/omar/Pictures')  # output manager to the screen
        #self.file_manager.show(self.settings_path)
        self.file_manager.show(self.SD_CARD)
        self.manager_open = True

    def select_path(self, path):
        '''It will be called when you click on the file name
        or the catalog selection button.

        :type path: str;
        :param path: path to the selected directory or file;
        '''

        try:
            self.exit_manager()
        except:
            pass

        self.openScreenName('setup')
        self.root.ids.setup_image.source = path
        toast(path)

    def exit_manager(self, *args):
        '''Called when the user reaches the root of the directory tree.'''

        self.manager_open = False
        self.file_manager.close()

    def show_dialog_eddit(self):

        if self.dialog:
            self.dialog.dismiss()

        #if not self.dialog2:
        self.dialog = MDDialog(
            title="Eddit project?",
            text="Make a new project with same image.",
            buttons=[
                MDFlatButton(text="CANCEL",
                             text_color=self.theme_cls.primary_color,
                             on_press=lambda x: self.dialog.dismiss()),
                MDFlatButton(text="ACCEPT",
                             text_color=self.theme_cls.primary_color,
                             on_press=lambda x: self.eddit_project()),
            ])
        self.dialog.open()

    def eddit_project(self):

        #self.img_path = os.path.dirname(self.root.ids.image.source)
        img_path = self.img_path + '/original.jpeg'
        self.openScreenName('setup')
        if self.dialog: self.dialog.dismiss()
        self.root.ids.setup_image.source = img_path
        toast(img_path)

    def events(self, instance, keyboard, keycode, text, modifiers):
        '''Called when buttons are pressed on the mobile device.'''

        if keyboard in (1001, 27):
            if self.manager_open:
                self.file_manager.back()
        return True

    def goto_table(self):

        #self.openScreenName('mosaic_details')
        self.data_tables.open(self.root.ids.details)

    def back_main(self):

        self.data_tables.dismiss()
        self.openScreenName('main')

    def show_dialog_buy(self):

        if self.dialog:
            self.dialog.dismiss()

        #if not self.dialog2:
        self.dialog = MDDialog(
            title="Cooming Soon",
            text=
            "Apologies, SmartBricks does not deliver yet. We are working to deliver your favourite mosaic to you. Are you interested in buying? ",
            buttons=[
                MDFlatButton(text="NO",
                             text_color=self.theme_cls.primary_color,
                             on_press=lambda x: self.dialog.dismiss()),
                MDFlatButton(text="YES",
                             text_color=self.theme_cls.primary_color,
                             on_press=lambda x: self.dialog.dismiss()),
            ])
        self.dialog.open()

    def show_dialog_empty(self):

        if self.dialog:
            self.dialog.dismiss()

        #if not self.dialog2:
        self.dialog = MDDialog(
            title="Cooming Soon",
            text="This option is not yet available.",
            buttons=[
                MDFlatButton(text="Cancel",
                             text_color=self.theme_cls.primary_color,
                             on_press=lambda x: self.dialog.dismiss())
            ])
        self.dialog.open()
Exemplo n.º 19
0
class CameraOpenCV(XCamera):
    directory = "%s/DCIM/" % primary_external_storage_path()

    def on_camera_ready(self):
        Logger.debug("on_camera_ready %s " % self.directory)
Exemplo n.º 20
0
 def _app_dir(self):
     return primary_external_storage_path()
Exemplo n.º 21
0
    def __init__(self, **kwargs):
        super(CheckList, self).__init__(**kwargs)

        if platform == "android":
            from android.storage import primary_external_storage_path
            from android.permissions import request_permissions, check_permission, Permission

            sdcard = primary_external_storage_path()
            dataDir = sdcard + '/plocka'

            if not os.path.exists(dataDir):
                request_permissions([
                    Permission.READ_EXTERNAL_STORAGE,
                    Permission.WRITE_EXTERNAL_STORAGE
                ])
                while not check_permission(Permission.WRITE_EXTERNAL_STORAGE):
                    time.sleep(1)
        else:
            dataDir = os.environ['HOME'] + '/.config/Plocka'

        os.makedirs(dataDir, exist_ok=True)

        scriptDir = os.path.dirname(os.path.realpath(__file__))

        global shoppingList
        try:
            with open(dataDir + '/Plocka.json') as fd:
                shoppingList = json.load(fd)
        except:
            shoppingList = [{
                "section":
                "Section 1",
                "items": [{
                    "item": "Item 1",
                    "done": False
                }, {
                    "item": "Item 2",
                    "done": True
                }, {
                    "item": "Item 3",
                    "done": True
                }]
            }, {
                "section":
                "Section 2",
                "items": [{
                    "item": "Item 1",
                    "done": True
                }, {
                    "item": "Item 2",
                    "done": False
                }, {
                    "item": "Item 3",
                    "done": False
                }, {
                    "item": "Item 4",
                    "done": True
                }]
            }, {
                "section":
                "Section 3",
                "items": [{
                    "item": "Item 1",
                    "done": True
                }, {
                    "item": "Item 2",
                    "done": True
                }, {
                    "item": "Item 3",
                    "done": False
                }]
            }]

        defaultSettings = {
            'headerSize': '40sp',
            'sectionSize': '20sp',
            'sectionColor': [0.1, 0.2, 0.2, 1],
            'sectionTextSize': '10sp',
            'itemSize': '30sp',
            'itemColor': [0.20, 0.25, 0.29, 1],
            'doneColor': [0.24, 0.30, 0.35, 1],
            'actionColor': [.2, .7, .9, 1],
            'activeColor': [1, 1, 1, 1],
            'inactiveColor': [1, 1, 1, 0.5],
            'redColor': [1, 0, 0, 0.5],
            'greenColor': [0, 1, 0, 0.5],
            'backupsToKeep': 10,
            'maxBackupAge': 1,
            'showSections': 'maybe',
        }
        try:
            with open(dataDir + '/settings.json') as fd:
                settings = json.load(fd)
                for key in defaultSettings:
                    if not key in settings:
                        settings[key] = defaultSettings[key]
        except:
            settings = defaultSettings

        backups = sorted(glob(f'{dataDir}/Plocka-*.json'))
        cutoff = (
            datetime.now() -
            timedelta(days=settings['maxBackupAge'])).strftime("%Y%m%d%H%M%S")
        for backup in backups[:-settings['backupsToKeep']]:
            if backup < f'{dataDir}/Plocka-{cutoff}.json':
                print('deleting backup file ' + backup)
                os.remove(backup)

        def hide(widget):
            if widget.height:
                widget.restore = widget.height
            widget.height = 0
            widget.opacity = 0
            widget.disabled = True

        def unhide(widget):
            if widget.disabled:
                widget.height = widget.restore
                widget.opacity = 1
                widget.disabled = False

        def checkSection(stack, current):
            for item in stack.children[::-1]:
                if item.type == 'section':
                    section = item
                if item == current:
                    break
            index = stack.children.index(section)
            for item in stack.children[index - 1::-1]:
                if item.type == 'item' and item.check.state == 'normal':
                    return
                if item.type == 'section':
                    break
            hide(section)

        self.writeDeferred = False

        def writeFile(dt):
            if dt and not self.writeDeferred:
                return
            self.writeDeferred = False
            activeList = []
            for item in stack.children[::-1]:
                if item.type == 'item':
                    entry = {
                        "item": item.text,
                        "done": item.check.state == 'down'
                    }
                    section["items"].append(entry)
                elif item.type == 'section':
                    section = {"section": item.origText, "items": []}
                    activeList.append(section)
            shoppingList['lists'][shoppingList['active']]['name'] = title.text
            shoppingList['lists'][shoppingList['active']]['list'] = activeList

            now = datetime.now().strftime("%Y%m%d%H%M%S")
            if os.path.exists(f'{dataDir}/Plocka.json'):
                os.rename(f'{dataDir}/Plocka.json',
                          f'{dataDir}/Plocka-{now}.json')
            with open(f'{dataDir}/Plocka.json', 'w', encoding='utf8') as fd:
                json.dump(shoppingList, fd, indent=2, ensure_ascii=False)
            saveBtn.color = settings['greenColor']

        def undo(instance):
            global shoppingList
            try:
                last = sorted(glob(f'{dataDir}/Plocka-*.json'))[-1]
                os.rename(last, f'{dataDir}/Plocka.json')
                with open(dataDir + '/Plocka.json') as fd:
                    shoppingList = json.load(fd)
                populate()
                hideUnHide(hideBtn)
            except:
                pass

        def toggle(instance):
            if instance.check.state == 'down':
                instance.background_color = settings['itemColor']
                instance.color = settings['activeColor']
                instance.check.state = 'normal'
            else:
                instance.background_color = settings['doneColor']
                instance.color = settings['inactiveColor']
                instance.check.state = 'down'

            if not self.writeDeferred:
                self.writeDeferred = True
                saveBtn.color = settings['actionColor']
                Clock.schedule_once(writeFile, 10)

            if hideBtn.state == 'down' and instance.check.state == 'down':
                hide(instance.check)
                hide(instance)
                checkSection(stack, instance)

        def hideUnHide(instance):
            if hideBtn.state != "down" and not searchInput.text:
                for item in stack.children[:]:
                    unhide(item)

            elif searchInput.text == searchInput.text.upper(
            ) and searchInput.text != searchInput.text.lower():
                activeSection = False
                for item in stack.children[::-1]:
                    if item.type == 'section':
                        if re.search(searchInput.text, item.text):
                            activeSection = True
                        else:
                            activeSection = False
                    if activeSection and (
                            hideBtn.state != 'down' or item.type != 'item'
                            and item.type != 'check' or hideBtn.state == 'down'
                            and item.type == 'check' and item.state != 'down'
                            or hideBtn.state == 'down' and item.type == 'item'
                            and item.check.state != 'down'):
                        unhide(item)
                    else:
                        hide(item)

            else:
                hasChildren = False
                regexp = searchInput.text if searchInput.text else '.'
                for item in stack.children[:]:
                    if item.type == 'item':
                        if hideBtn.state == "down" and item.check.state == 'down' or not re.search(
                                regexp, item.text, re.IGNORECASE):
                            hide(item.check)
                            hide(item)
                        else:
                            unhide(item.check)
                            unhide(item)
                            hasChildren = True
                    elif item.type == 'section':
                        if hasChildren and settings['showSections'] == 'always':
                            unhide(item)
                            hasChildren = False
                        else:
                            hide(item)

        def crossCheck(instance):
            toggle(instance.label)

        def edit(instance):
            entry = TextInput(
                text=instance.text,
                size_hint=(0.5, None),
                height=settings['itemSize'],
                multiline=False,
                on_text_validate=lambda w: updateItem(w),
            )
            if instance.type == 'section':
                entry.text = instance.origText
            relative = ImageButton(
                source='data/left.png'
                if instance.type == 'item' else 'data/right.png',
                color_normal=[1, 1, 1, .7],
                height=settings['itemSize'],
                size_hint=(0.1, None),
                on_release=lambda w: updateItem(entry),
            )
            before = ImageButton(
                source='data/up.png',
                color_normal=[1, 1, 1, .7],
                height=settings['itemSize'],
                size_hint=(0.1, None),
                on_release=lambda w: updateItem(entry),
            )
            replace = ImageButton(
                source='data/ok.png',
                color_normal=[0, .5, 0, 1],
                height=settings['itemSize'],
                size_hint=(0.1, None),
                on_release=lambda w: updateItem(entry),
            )
            after = ImageButton(
                source='data/down.png',
                color_normal=[1, 1, 1, .7],
                height=settings['itemSize'],
                size_hint=(0.1, None),
                on_release=lambda w: updateItem(entry),
            )
            delete = ImageButton(
                source='data/delete.png',
                color_normal=[.5, 0, 0, 1],
                height=settings['itemSize'],
                size_hint=(0.1, None),
                on_release=lambda w: updateItem(entry),
            )
            entry.orig = instance
            entry.relative = relative
            entry.before = before
            entry.replace = replace
            entry.after = after
            entry.delete = delete

            entry.type = 'entry'
            relative.type = 'relative'
            before.type = 'before'
            replace.type = 'replace'
            after.type = 'after'
            delete.type = 'delete'

            hide(instance)
            if instance.type == 'item':
                hide(instance.check)
            index = stack.children.index(instance)
            stack.add_widget(delete, index)
            stack.add_widget(entry, index)
            stack.add_widget(relative, index)
            stack.add_widget(before, index)
            stack.add_widget(replace, index)
            stack.add_widget(after, index)

            entry.select_all()
            Clock.schedule_once(lambda dt: reselect(entry), 0.5)

        def reselect(entry):
            # repeat select_all after half a second to avoid losing focus on release
            entry.focused = True
            entry.select_all()

        def updateItem(entry):
            todo = 'replace'
            if entry.delete.state == 'down':
                todo = 'delete'
            elif entry.before.state == 'down':
                todo = 'before'
            elif entry.after.state == 'down':
                todo = 'after'
            elif entry.relative.state == 'down':
                if entry.orig.type == 'section':
                    todo = 'item'
                else:
                    todo = 'section'

            orig = entry.orig
            text = entry.text

            stack.remove_widget(entry.relative)
            stack.remove_widget(entry.before)
            stack.remove_widget(entry.replace)
            stack.remove_widget(entry.after)
            stack.remove_widget(entry.delete)
            stack.remove_widget(entry)

            if todo == 'delete':
                stack.remove_widget(orig)
                if orig.type == 'item':
                    stack.remove_widget(orig.check)
            else:
                unhide(orig)
                if orig.type == 'item':
                    unhide(orig.check)
                if todo == 'replace':
                    if orig.type == 'section':
                        orig.origText = text
                        orig.text = text.upper()
                    else:
                        orig.text = text
                else:
                    if orig.type == 'section' and todo != 'item' or todo == 'section':
                        label = sectionButton(text)
                    else:
                        label = itemButtonPair(text, False)

                    index = stack.children.index(orig)
                    if todo == 'before' or todo == 'section':
                        index += 1
                    if orig.type == 'item':
                        if todo == 'before' or todo == 'section':
                            index += 1
                    if label.type == 'item':
                        stack.add_widget(label.check, index)
                    stack.add_widget(label, index)
                    edit(label)

            writeFile(0)

        self.searchDeferred = False

        def doSearch(text, undo):
            if not self.searchDeferred:
                self.searchDeferred = True
                Clock.schedule_once(filterOut, 1)
            return text

        def filterOut(dt):
            self.searchDeferred = False
            hideUnHide(hideBtn)

        def setBookmark():
            now = datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
            os.makedirs(f'{dataDir}/bookmarks', exist_ok=True)
            print(f"set bookmark '{dataDir}/bookmarks/{now}.json'")
            shutil.copy(f'{dataDir}/Plocka.json',
                        f'{dataDir}/bookmarks/{now}.json')

        bookmark = ''

        def getBookmark():
            popup = Popup(
                title="Bookmarks",
                content=BookmarkList(
                    dataDir=dataDir,
                    settings=settings,
                    orientation='vertical',
                ),
                size_hint=(0.9, 0.9),
            )
            popup.bind(on_pre_dismiss=useBookmark)
            popup.open()

        def useBookmark(w):
            global shoppingList
            bookmark = w.content.chosen
            if not bookmark:
                print('no bookmark chosen')
                return
            writeFile(0)
            shutil.copy(f'{dataDir}/bookmarks/{bookmark}.json',
                        f'{dataDir}/Plocka.json')
            with open(f'{dataDir}/Plocka.json') as fd:
                shoppingList = json.load(fd)
            populate()

        def selectList(w):
            global shoppingList

            dropdown = DropDown(
                on_select=lambda instance, selected: setActive(selected),
            )
            index = -1
            for item in shoppingList['lists']:
                index += 1
                if index == shoppingList['active']:
                    continue
                btn = Button(
                    text=item['name'],
                    size_hint_y=None,
                    background_color=settings['sectionColor'],
                    height=settings['itemSize'],
                )
                btn.index = index
                btn.bind(on_release=lambda btn: dropdown.select(btn.index))
                dropdown.add_widget(btn)

            about = Button(
                text="About Plocka",
                size_hint_y=None,
                background_color=settings['sectionColor'],
                height=settings['itemSize'],
            )
            about.bind(on_release=lambda about: dropdown.select(-1))
            dropdown.add_widget(about)

            dropdown.open(w)

        def setActive(selected):
            if selected > -1:
                global shoppingList
                shoppingList['active'] = selected
                populate()
                writeFile(0)
            else:

                with open(scriptDir + '/ABOUT.rst') as fd:
                    about = fd.read()

                with open(scriptDir + '/LICENSE') as fd:
                    license = fd.read()

                aboutText = RstDocument(text=about +
                                        '\n\nLicense\n-------\n\n' + license, )
                popup = Popup(
                    title="Plocka " + __version__,
                    content=aboutText,
                )
                popup.open()

        def editList(w):
            buttonBox = BoxLayout()
            top.add_widget(buttonBox)
            delete = ImageButton(
                source='data/delete.png',
                color_normal=[.5, 0, 0, 1],
                size_hint_x=None,
                width=settings['headerSize'],
                on_release=lambda w: deleteList(w),
            )
            buttonBox.add_widget(delete)
            entry = TextInput(
                text=w.text,
                height=settings['headerSize'],
                multiline=False,
                on_text_validate=lambda w: setListName(w),
            )
            buttonBox.add_widget(entry)
            saveBtn = ImageButton(
                source="data/ok.png",
                color_normal=settings['greenColor'],
                size_hint_x=None,
                width=settings['headerSize'],
                on_release=lambda x: setListName(entry),
            )
            buttonBox.add_widget(saveBtn)
            copy = ImageButton(
                source='data/copy.png',
                color_normal=[1, 1, 1, .7],
                size_hint_x=None,
                width=settings['headerSize'],
                on_release=lambda w: copyList(w),
            )
            buttonBox.add_widget(copy)
            new = ImageButton(
                source='data/new.png',
                color_normal=settings['greenColor'],
                size_hint_x=None,
                width=settings['headerSize'],
                on_release=lambda w: createList(entry),
            )
            buttonBox.add_widget(new)

            top.remove_widget(title)
            top.remove_widget(searchBtn)
            entry.focused = True

        def closeEditor(w):
            top.add_widget(title)
            top.add_widget(searchBtn)
            top.remove_widget(w.parent)

        def setListName(w):
            title.text = w.text
            closeEditor(w)
            writeFile(0)

        def createList(w):
            global shoppingList
            new = {
                'name': 'New list',
                'list': [{
                    'section': 'Section',
                    'items': []
                }]
            }
            at = shoppingList['active'] + 1
            shoppingList['lists'].insert(at, new)
            setActive(at)
            closeEditor(w)

        def copyList(w):
            global shoppingList
            at = shoppingList['active']
            new = json.loads(json.dumps(shoppingList['lists'][at]))
            new['name'] += ' 2'
            at += 1
            shoppingList['lists'].insert(at, new)
            setActive(at)
            closeEditor(w)

        def deleteList(w):
            at = shoppingList['active']
            del (shoppingList['lists'][at])
            if at >= len(shoppingList['lists']):
                at = at - 1
            setActive(at)
            closeEditor(w)

        # Widgets

        def sectionButton(text):
            label = LongpressButton(
                text=text.upper(),
                font_size=settings['sectionTextSize'],
                height=settings['sectionSize'],
                background_color=settings['sectionColor'],
                size_hint=(1, None),
                on_long_press=lambda w: edit(w),
            )
            label.origText = text
            label.type = 'section'
            return label

        def itemButtonPair(text, done):
            label = LongpressButton(
                text=text,
                height=settings['itemSize'],
                background_color=settings['itemColor'],
                size_hint=(0.95, None),
                on_short_press=lambda w: toggle(w),
                on_long_press=lambda w: edit(w),
            )
            label.type = 'item'
            check = CheckBox(
                height=settings['itemSize'],
                size_hint=(0.05, None),
                on_release=lambda w: crossCheck(w),
            )
            if done:
                label.background_color = settings['doneColor']
                label.color = settings['inactiveColor']
                check.state = 'down'
            check.type = 'check'
            check.label = label
            label.check = check
            return label

        def populate():
            global shoppingList
            if not 'lists' in shoppingList:
                shoppingList = {
                    'lists': [{
                        'name': 'Plocka',
                        'list': shoppingList
                    }]
                }
            if not 'active' in shoppingList:
                shoppingList['active'] = 0
            title.text = shoppingList['lists'][shoppingList['active']]['name']
            stack.clear_widgets()
            for section in shoppingList['lists'][
                    shoppingList['active']]['list']:
                if settings['showSections'] != 'never':
                    sectionLabel = sectionButton(section['section'])
                    stack.add_widget(sectionLabel)
                for item in section['items']:
                    label = itemButtonPair(item['item'], item['done'])
                    stack.add_widget(label.check)
                    stack.add_widget(label)

        def toggleSearch(widget):
            if searchInput.disabled:
                top.add_widget(searchInput, 1)
                searchInput.disabled = False
                searchInput.focused = True
            else:
                searchInput.text = ''
                searchInput.disabled = True
                top.remove_widget(searchInput)
                hideUnHide(hideBtn)

        # MAIN

        top = BoxLayout(
            size_hint=(1, None),
            height=settings['headerSize'],
        )
        self.add_widget(top)

        title = LongpressButton(
            text='Unknown',
            background_color=settings['sectionColor'],
            on_short_press=selectList,
            on_long_press=editList,
        )
        top.add_widget(title)

        searchBtn = ImageButton(
            source='data/search.png',
            width=settings['headerSize'],
            color_normal=[1, 1, 1, .6],
            on_release=toggleSearch,
            size_hint_x=None,
        )
        top.add_widget(searchBtn)
        searchInput = TextInput(
            disabled=True,
            multiline=False,
            input_filter=doSearch,
            on_text_validate=lambda w: hideUnHide(hideBtn),
        )

        scrollBox = ScrollView(
            size_hint=(1, .9),
            do_scroll_x=False,
        )
        self.add_widget(scrollBox)

        stack = StackLayout(size_hint=(1, None))
        stack.bind(minimum_height=stack.setter('height'))
        scrollBox.add_widget(stack)

        populate()

        buttons = BoxLayout(
            size_hint=(1, None),
            height=settings['headerSize'],
        )
        self.add_widget(buttons)
        saveBtn = ImageButton(
            source="data/ok.png",
            color_normal=settings['greenColor'],
            on_release=lambda x: writeFile(0),
        )
        buttons.add_widget(saveBtn)

        hideBtn = ToggleImageButton(
            image_down="data/show.png",
            image_normal="data/hide.png",
            color_down=[1, 1, 1, .9],
            color_normal=[1, 1, 1, .6],
            on_release=hideUnHide,
        )
        buttons.add_widget(hideBtn)

        undoBtn = ImageButton(
            source='data/undo.png',
            color_normal=settings['redColor'],
            on_release=undo,
        )
        buttons.add_widget(undoBtn)

        bookmarkBtn = LongpressImageButton(
            source='data/bookmark.png',
            color_normal=settings['greenColor'],
            on_short_press=lambda w: setBookmark(),
            on_long_press=lambda w: getBookmark(),
        )
        buttons.add_widget(bookmarkBtn)
Exemplo n.º 22
0
 def picture_taken(self, obj, filename):
     Logger.debug("picture_taken %s => %s" % (obj, filename))
     App.get_running_app().manager.switch_to("Editor")
     App.get_running_app().manager.current_screen.source = os.path.join("%s/DCIM/" % primary_external_storage_path(), filename)
Exemplo n.º 23
0
	def build(self):
		writer()              # <---- calling testwrite() here
		ffolder = os.path.join(primary_external_storage_path(),'KT')
		fname = os.path.join(ffolder,'testfile.txt')
		text = open(fname,'r').read()                          #reading the written txt
		return MDLabel(text = text, halign="center")           # displaying
Exemplo n.º 24
0
    def build(self):

        Loop = 0

        LabelArr = [0 for x in range(30)]

        #        Logger.critical("DEADBEEF10 = {}")
        #        Logger.debug (" ***  DEADBEEF *** ")

        if platform == 'android':
            from android.storage import primary_external_storage_path
            Logger.critical("android")
            # Get path to SD card Android
            theFtSize = '14sp'
            ScreenHeight = 1400

            AndPath = primary_external_storage_path()
            Logger.critical(AndPath)
            #            FileLocation = os.path.join(AndPath, "/AndMyInfoFile.txt")
            FileLocation = AndPath + "/Elias/AndMyInfoFile.txt"
            Logger.critical(FileLocation)

        if platform == 'linux':
            Logger.critical("linux")
            FileLocation = "/home/Logs/MyInfoFile.txt"
            theFtSize = '24sp'
            ScreenHeight = 750

        # Load the values from the same date
        # in case the app closed.
        def ReadFile(FileName):
            now = str(datetime.datetime.now().strftime("%Y-%m-%d, "))

            try:
                MyFile = open(FileName, "r")
            except:
                return

            for line in MyFile:
                if now in line:
                    theIndex = 0
                    for Item in ButtonInfo:
                        if (Item[0] in line):
                            CurCount[theIndex] += 1
#                            print("Found ",Item, CurCount[theIndex])
                        theIndex += 1

#            print(CurCount)
            MyFile.close()
            # CurCount

        # Update the counts
        ReadFile(FileLocation)

        # Open the file for writing and
        # insert the date.
        now = datetime.datetime.now()
        MyFile = open(FileLocation, "a+")
        MyFile.write(now.strftime("%Y-%m-%d, "))
        MyFile.write(now.strftime("%H:%M:%S, "))
        MyFile.write("App Start")
        MyFile.write("\n\r")

        # Create the grid
        # 2 number column and 2 text.
        button_grid = GridLayout(cols=4,
                                 size_hint=(None, None),
                                 col_default_width=100,
                                 height=ScreenHeight)
        #            col_default_width=100,height=750)
        button_grid.bind(minimum_height=button_grid.setter('height'))

        # Insert the values into the grid
        Loop = 0
        for theButton in ButtonInfo:
            #            print(theButton[0], Loop)
            LabelArr[Loop] = Label(text=str(CurCount[Loop]),
                                   font_size=theFtSize,
                                   size_hint_x=None,
                                   width=50)
            button_grid.add_widget(LabelArr[Loop])
            ButtonText = theButton[0]
            button_grid.add_widget(
                Button(text=ButtonText,
                       background_color=theButton[1],
                       font_size=theFtSize,
                       min_state_time=1,
                       size_hint_x=None,
                       width=245))
            Loop += 1

        # Not used
        def on_checkbox_active(checkbox, value):
            if value:
                print('The checkbox', checkbox, 'is active')
            else:
                print('The checkbox', checkbox, 'is inactive')

        # Given the text up the count
        def IncrementValue(ButtonText):
            global Loop
            Loop = 0
            for theButton in ButtonInfo:
                if (theButton[0] == ButtonText):
                    CurCount[Loop] = CurCount[Loop] + 1
                    LabelArr[Loop].text = str(CurCount[Loop])
                Loop += 1

        # Write the value and date to the file.
        def print_button_text(instance):
            #           print("Button Pressed", instance)
            #           print("Logger.debug", instance)
            now = datetime.datetime.now()
            MyFile.write(now.strftime("%Y-%m-%d, "))
            MyFile.write(now.strftime("%H:%M:%S, "))
            MyFile.write(instance.text)
            MyFile.write("\n\r")
            MyFile.flush()
            IncrementValue(instance.text)

        for button in button_grid.children[1:]:
            button.bind(on_press=print_button_text)

        def print_slider_value(instance, value):
            print("Logger.debug", value)

        # Not used
        def resize_label_text(label, new_height):
            label.font_size = 0.5 * label.height

        root_widget = ScrollView(size_hint=(1, 1),
                                 size=(Window.width, Window.height))
        #        root_widget.size = (480, 320)

        root_widget.add_widget(button_grid)

        return root_widget
Exemplo n.º 25
0
def android_ext_dir():
    from android.storage import primary_external_storage_path
    return primary_external_storage_path()
Exemplo n.º 26
0
from kivymd.uix.spinner import MDSpinner
from kivymd.uix.button import MDFlatButton
from kivymd.uix.list import OneLineListItem
from kivy.clock import Clock
from functools import partial
from threading import Thread
import os
from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.tools import argparser
from kivy.utils import platform

if platform=='android':
	from android.permissions import request_permissions, Permission, check_permission
	from android.storage import primary_external_storage_path
	primary_ext_storage = primary_external_storage_path() + "/Download"
else:
	primary_ext_storage = os.getcwd() + "/Download"


DEVELOPER_KEY = ""
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

def youtube_search(q, max_results=1,order="relevance", token=None, location=None, location_radius=None):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)
  search_response = youtube.search().list(
    q=q,
    type="video",
    pageToken=token,