#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#
# Copyright 2012 Unknown <diogo@arch>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import os
os.environ["KIVY_NO_ARGS"] = "1"
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.spinner import Spinner
from kivy.uix.slider import Slider
from kivy.uix.treeview import TreeView
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.uix.modalview import ModalView
from kivy.uix.filechooser import FileChooserListView
from kivy.core.text.markup import MarkupLabel as CoreMarkupLabel
from kivy.utils import get_hex_from_color
from kivy.properties import NumericProperty, StringProperty, BooleanProperty,\
ObjectProperty
from kivy.uix.screenmanager import Screen
from kivy.logger import Logger
from kivy.graphics import Color, Line
import re
from weakref import ref
from os.path import (
basename, join, sep, normpath, expanduser, abspath, pardir)
import sys
try:
import data.resources.theme.default as tm
except ImportError:
import trifusion.data.resources.theme.default as tm
[docs]class ShowcaseScreen(Screen):
fullscreen = BooleanProperty(False)
# class HoverBehaviour(object):
# """
# Creates mouse over behaviour for widget
# """
#
# hovered = BooleanProperty(False)
# border_point = ObjectProperty(None)
# x1 = 0
#
# def __init__(self, **kwargs):
#
# self.register_event_type('on_enter')
# self.register_event_type('on_leave')
# #Window.bind(mouse_pos=self.on_mouse_pos)
# Clock.schedule_interval(self.on_mouse_pos, 1)
# super(HoverBehaviour, self).__init__(**kwargs)
#
# def on_mouse_pos(self, *args):
# if not self.get_root_window():
# return # do proceed if I'm not displayed <=> If have no parent
# #pos = args[1]
# pos = self.get_root_window().mouse_pos
# self.x1+= 1
#
# print(self.x1)
# # Next line to_widget allow to compensate for relative layout
# inside = self.collide_point(*self.to_widget(*pos))
# if self.hovered == inside:
# # We have already done what was needed
# return
# self.border_point = pos
# self.hovered = inside
# if inside:
# self.dispatch('on_enter')
# else:
# self.dispatch('on_leave')
#
# def on_enter(self):
# pass
#
# def on_leave(self):
# pass
[docs]class LinkedLabel(Label):
"""
Modification of label to reformat label for path linking
"""
def __init__(self, **kwargs):
super(LinkedLabel, self).__init__(**kwargs)
@staticmethod
[docs] def create_ref_label(text):
"""
Modifies the original label by adding references to each directory in
the path
"""
if sys.platform in ["win32", "cygwin"]:
s = p = ""
else:
s = p = sep
# This will check if the first path_list element represents a windows
# drive (like C:). If so, it will add a "\" character, so that the
# path is correctly constructed
path_list = text.split(sep)
if sys.platform in ["win32", "cygwin"] and len(path_list[0]) == 2\
and path_list[0].endswith(":"):
path_list[0] += "\\"
for d in path_list:
p = join(p, d)
if p != sep:
s += u"[ref={}]{}[/ref]".format(p, d) + sep
return s[:-1]
[docs] def texture_update(self, *largs):
"""Force texture recreation with the current Label properties.
After this function call, the :attr:`texture` and :attr:`texture_size`
will be updated in this order.
"""
mrkup = self._label.__class__ is CoreMarkupLabel
self.texture = None
if (not self._label.text or (self.halign[-1] == 'y' or self.strip) and
not self._label.text.strip()):
self.texture_size = (0, 0)
if mrkup:
self.refs, self._label._refs = {}, {}
self.anchors, self._label._anchors = {}, {}
else:
if mrkup:
text = self.text
text = self.create_ref_label(text)
# we must strip here, otherwise, if the last line is empty,
# markup will retain the last empty line since it only strips
# line by line within markup
if self.halign[-1] == 'y' or self.strip:
text = text.strip()
self._label.text = ''.join(('[color=',
get_hex_from_color(self.color),
']', text, '[/color]'))
self._label.refresh()
# force the rendering to get the references
if self._label.texture:
self._label.texture.bind()
self.refs = self._label.refs
self.anchors = self._label.anchors
else:
self._label.refresh()
texture = self._label.texture
if texture is not None:
self.texture = self._label.texture
self.texture_size = list(self.texture.size)
[docs]class FileChooserL(FileChooserListView):
"""
Modification of the FileChooserListView widget that fixes an issue of path
update when clicking in the parent directory
"""
def __init__(self, **kwargs):
super(FileChooserL, self).__init__(**kwargs)
self.register_event_type("on_double_click")
self.register_event_type("on_dir_entry")
[docs] def on_double_click(self):
"""
Even triggered when double clicking a file
"""
pass
[docs] def on_dir_entry(self):
"""
Event triggered when entering a directory
"""
pass
[docs] def open_entry(self, entry):
"""
Modification of the open entry method so that when the entry.path is
"../", the path is updated to the parent directory, instead of
appending the entry.path
"""
self.dispatch("on_dir_entry")
try:
# Just check if we can list the directory. This is also what
# _add_file does, so if it fails here, it would also fail later
# on. Do the check here to prevent setting path to an invalid
# directory that we cannot list.
self.file_system.listdir(entry.path)
except OSError:
entry.locked = True
else:
# If entry.path is to jump to previous directory, update path with
# parent directory
if entry.path == "../" or entry.path == "..\\":
self.path = unicode(abspath(join(self.path, pardir)))
self.selection = []
else:
self.path = unicode(join(self.path, entry.path))
self.selection = []
[docs] def entry_touched(self, entry, touch):
'''(internal) This method must be called by the template when an entry
is touched by the user.
'''
if (
'button' in touch.profile and touch.button in (
'scrollup', 'scrolldown', 'scrollleft', 'scrollright')):
return False
_dir = self.file_system.is_dir(entry.path)
if not _dir and touch.is_double_tap:
self.dispatch("on_double_click")
if self.multiselect:
if entry.path in self.selection:
self.selection.remove(entry.path)
else:
if _dir and not self.dirselect:
self.open_entry(entry)
return
self.selection.append(entry.path)
else:
if _dir and not self.dirselect:
self.open_entry(entry)
return
self.selection = [entry.path, ]
def _add_files(self, path, parent=None):
path = expanduser(path)
files = []
fappend = files.append
if sys.platform in ["win32", "cygwin"]:
try:
tdir = [str(x.encode("latin1")) for x in
self.file_system.listdir(path)]
except UnicodeDecodeError:
tdir = self.file_system.listdir(path)
ldir = [unicode(x, "latin1") for x in tdir]
else:
ldir = self.file_system.listdir(path)
for f in ldir:
try:
# In the following, use fully qualified filenames
fappend(normpath(join(path, f)))
except UnicodeDecodeError:
Logger.exception('unable to decode <{}>'.format(f))
except UnicodeEncodeError:
Logger.exception('unable to encode <{}>'.format(f))
# Apply filename filters
files = self._apply_filters(files)
# Sort the list of files
files = self.sort_func(files, self.file_system)
is_hidden = self.file_system.is_hidden
if not self.show_hidden:
files = [x for x in files if not is_hidden(x)]
self.files[:] = files
total = len(files)
wself = ref(self)
for index, fn in enumerate(files):
def get_nice_size():
# Use a closure for lazy-loading here
return self.get_nice_size(fn)
ctx = {'name': basename(fn),
'get_nice_size': get_nice_size,
'path': fn,
'controller': wself,
'isdir': self.file_system.is_dir(fn),
'parent': parent,
'sep': sep}
entry = self._create_entry_widget(ctx)
yield index, total, entry
[docs]class TreeViewM(TreeView):
"""
Implementation of TreeViewNode widget to support multiple selection in
ListView filechoosers
"""
multiselect = BooleanProperty(False)
"""
Boolean to indicate whether multiple nodes may be selected.
"""
def __init__(self, **kwargs):
super(TreeViewM, self).__init__(**kwargs)
[docs] def select_node(self, node):
'''Select a node in the tree.
'''
if node.no_selection:
return
else:
if self._selected_node:
self._selected_node.is_selected = False
# Ignore node selection on multiselect. Selection is done in the
# layout
if self.multiselect:
node.is_selected = False
else:
node.is_selected = True
self._selected_node = node
[docs]class FileChooserM(FileChooserListView):
"""
Modification of the FileChooserIconView widget that fixes n issue of path
update when clicking in the parent directory and provides support for
multiple file selection using Shift+Click. To achieve this, a few methods
were added that listen to keyboard input in order to capture when the
shift key is being pressed. These methods change the new shift attribute of
the class, which is used when an entry is touched.
The current Shift+Click implementation supports forward and backward
selection from the last entry touched.
"""
shift = False
control = False
# This attribute is a workaround of the "going back two par dirs" on
# Windows. The problem is that, occasionally, three mouse inputs are
# provided when double clicking. The third input is also registered as a
# double tap and, therefore, the open_dir method is issue twice. This
# attribute checks if the previous touch is False (previous touch was not
# double tap) or True (previous touch was double tap), and only issues an
# open dir when prev_touch is False
prev_touch = False
def __init__(self, **kwargs):
super(FileChooserM, self).__init__(**kwargs)
# Register new event that is triggered when entering a directory
self.register_event_type("on_dir_entry")
self.register_event_type("on_double_click")
Window.bind(on_key_down=self.keyboard_listen)
Window.bind(on_key_up=self.release_shift)
[docs] def on_double_click(self):
"""
Even triggered when double clicking a file
"""
pass
[docs] def on_dir_entry(self):
"""
Event triggered when entering a directory
"""
pass
[docs] def keyboard_listen(self, *vals):
"""
Listens to keyboard when a key is pressed. It is used to set the shift
attribute to True when Shift is being pressed
:param vals: keyboard input
"""
key_code = vals[1]
if key_code == 304:
self.shift = True
if key_code == 305:
self.control = True
[docs] def release_shift(self, *vals):
"""
Listens to keyboard when a key is released. It is used to set the
shift attribute to False when the Shift key is released.
:param vals:
:return:
"""
key_code = vals[1]
if key_code == 304:
self.shift = False
if key_code == 305:
self.control = False
[docs] def open_entry(self, entry):
"""
Modification of the open entry method so that when the entry.path is
"../", the path is updated to the parent directory, instead of
appending the entry.path
"""
self.dispatch("on_dir_entry")
try:
# Just check if we can list the directory. This is also what
# _add_file does, so if it fails here, it would also fail later
# on. Do the check here to prevent setting path to an invalid
# directory that we cannot list.
self.file_system.listdir(entry.path)
except OSError:
entry.locked = True
else:
# If entry.path is to jump to previous directory, update path with
# parent directory
if entry.path == "../" or entry.path == "..\\":
self.path = unicode(abspath(join(self.path, pardir)))
self.selection = []
else:
self.path = unicode(join(self.path, entry.path))
self.selection = []
[docs] def entry_released(self, entry, touch):
'''
Overides the entry_released method to prevent double entries when
double clicking a directory without multiselect.
'''
pass
[docs] def entry_touched(self, entry, touch):
"""
(internal) This method must be called by the template when an entry
is touched by the user. Supports Shift+Clicking for multiple selection
"""
if (
'button' in touch.profile and touch.button in (
'scrollup', 'scrolldown', 'scrollleft', 'scrollright')):
return False
_dir = self.file_system.is_dir(entry.path)
dirselect = self.dirselect
if _dir and dirselect and touch.is_double_tap and not \
self.shift and not self.prev_touch:
self.open_entry(entry)
self.prev_touch = touch.is_double_tap
return
# The 'not self.shift' fixes an incorrect behaviour of touch, where
# shift+click sets is_double_tap to true, even when there is no
# double click
elif not _dir and touch.is_double_tap and not self.shift:
self.dispatch("on_double_click")
# Workaround for issue #151
self.prev_touch = touch.is_double_tap
if self.shift and self.selection:
# Get index of last selection entry and current entry
idx_selection = self.files.index(self.selection[-1])
idx_current = self.files.index(entry.path)
# If current entry is ahead of last selection, select files
# going forward
if idx_selection < idx_current:
idx_s = idx_selection
idx_f = idx_current
else:
idx_s = idx_current
idx_f = idx_selection
if self.multiselect:
if not self.shift and not self.control:
self.selection = []
if entry.path in self.selection:
# This will deselect multiple files when the shift key is down
# while clicking
if self.shift and self.selection:
for i in range(idx_s + 1, idx_f + 1):
f = self.files[i]
if f in self.selection:
self.selection.remove(f)
else:
self.selection.remove(entry.path)
else:
if _dir and not self.dirselect:
self.open_entry(entry)
return
# This will select multiple files when the shift key is down
# while clicking
if self.shift and self.selection:
for i in range(idx_s, idx_f + 1):
f = self.files[i]
if f not in self.selection:
self.selection.append(f)
else:
self.selection.append(entry.path)
else:
if _dir and not self.dirselect:
self.open_entry
return
self.selection = [entry.path, ]
def _add_files(self, path, parent=None):
path = expanduser(path)
files = []
fappend = files.append
if sys.platform in ["win32", "cygwin"]:
try:
tdir = [str(x.encode("latin1")) for x in
self.file_system.listdir(path)]
except UnicodeDecodeError:
tdir = self.file_system.listdir(path)
ldir = [unicode(x, "latin1") for x in tdir]
else:
ldir = self.file_system.listdir(path)
for f in ldir:
try:
# In the following, use fully qualified filenames
fappend(normpath(join(path, f)))
except UnicodeDecodeError:
Logger.exception('unable to decode <{}>'.format(f))
except UnicodeEncodeError:
Logger.exception('unable to encode <{}>'.format(f))
# Apply filename filters
files = self._apply_filters(files)
# Sort the list of files
files = self.sort_func(files, self.file_system)
is_hidden = self.file_system.is_hidden
if not self.show_hidden:
files = [x for x in files if not is_hidden(x)]
self.files[:] += files
total = len(files)
wself = ref(self)
for index, fn in enumerate(files):
def get_nice_size():
# Use a closure for lazy-loading here
return self.get_nice_size(fn)
ctx = {'name': basename(fn),
'get_nice_size': get_nice_size,
'path': fn,
'controller': wself,
'isdir': self.file_system.is_dir(fn),
'parent': parent,
'sep': sep}
entry = self._create_entry_widget(ctx)
yield index, total, entry
[docs]class ModalView(ModalView):
def __init__(self, **kwargs):
super(ModalView, self).__init__(**kwargs)
[docs]class AutoCompTextInput(TextInput):
"""
Modified widget of text input in which the tab key does not introduce a
tabular space. This is meant to use with _auto_completion, in which the
tab key serves as a keybinding
"""
[docs] def insert_text(self, substring, from_undo=False):
if substring == "\t":
s = ""
else:
s = substring
return super(AutoCompTextInput, self).insert_text(s,
from_undo=from_undo)
[docs]class SimpleModal(Widget):
def __init__(self, **kwargs):
super(SimpleModal, self).__init__(**kwargs)
[docs] def on_touch_down(self, touch):
return super(SimpleModal, self).on_touch_down(touch)
[docs] def on_touch_up(self, touch):
return super(SimpleModal, self).on_touch_up(touch)
[docs]class FancyDropDown(BoxLayout, SimpleModal):
def __init__(self, **kwargs):
super(FancyDropDown, self).__init__(**kwargs)
[docs] def on_touch_down(self, touch):
super(FancyDropDown, self).on_touch_down(touch)
return True
[docs] def on_touch_up(self, touch):
super(FancyDropDown, self).on_touch_up(touch)
return True
[docs]class SP_MoreOpts_Dialog(BoxLayout):
def __init__(self, **kwargs):
super(SP_MoreOpts_Dialog, self).__init__(**kwargs)
self.ds_type = kwargs["ds_type"]
[docs]class PartitionsDialog(BoxLayout):
"""
Custom layout for partition box when editing partitions
"""
pass
[docs]class ModelSpinner(Spinner):
"""
Custom Spinner that takes a background_normal argument to set the
background
"""
def __init__(self, **kwargs):
super(ModelSpinner, self).__init__(**kwargs)
try:
self.background_normal = kwargs["background_normal"]
except KeyError:
pass
[docs]class MySlider(Slider):
def __init__(self, **kwargs):
super(MySlider, self).__init__(**kwargs)
self.register_event_type("on_release")
[docs] def on_release(self):
pass
[docs] def on_touch_up(self, touch):
super(MySlider, self).on_touch_up(touch)
if touch.grab_current == self:
self.dispatch("on_release")
return True
[docs]class CrunchData(BoxLayout):
pass
[docs]class FileOverwriteDialog(BoxLayout):
cancel = ObjectProperty()
[docs]class ExportGraphics(BoxLayout):
cancel = ObjectProperty(None)
def __init__(self, **kwargs):
super(ExportGraphics, self).__init__(**kwargs)
kwargs["bookmark_init"](self.ids.bookmark_gl, self.ids.sv_mycomp,
self.ids.sd_filechooser, popup_level=2)
[docs]class AlignedTextInput(TextInput):
halign = StringProperty('left')
valign = StringProperty('top')
DEFAULT_PADDING = 6
def __init__(self, **kwargs):
self.halign = kwargs.get("halign", "left")
self.valign = kwargs.get("valign", "top")
self.bind(on_text=self.on_text)
super(AlignedTextInput, self).__init__(**kwargs)
[docs] def on_text(self, instance, value):
self.redraw()
[docs] def on_size(self, instance, value):
self.redraw()
[docs] def redraw(self):
"""
Note: This methods depends on internal variables of its TextInput
base class (_lines_rects and _refresh_text())
"""
self._refresh_text(self.text)
max_size = max(self._lines_rects, key=lambda r: r.size[0]).size
num_lines = len(self._lines_rects)
px = [self.DEFAULT_PADDING, self.DEFAULT_PADDING]
py = [self.DEFAULT_PADDING, self.DEFAULT_PADDING]
if self.halign == 'center':
d = (self.width - max_size[0]) / 2.0 - self.DEFAULT_PADDING
px = [d * 1.1, d]
elif self.halign == 'right':
px[0] = self.width - max_size[0] - self.DEFAULT_PADDING
if self.valign == 'middle':
d = (self.height - max_size[1] * num_lines) / \
2.0 - self.DEFAULT_PADDING
py = [d * 1.1, d]
elif self.valign == 'bottom':
py[0] = self.height - max_size[1] * num_lines - \
self.DEFAULT_PADDING
self.padding_x = px
self.padding_y = py
class TableCell(AlignedTextInput):
pass
[docs]class PlotChangeFilters(BoxLayout):
pass
[docs]class ProcessExecutionProgress(BoxLayout):
pass
[docs]class ProgressBox(BoxLayout):
pass
[docs]class LoadSpinner(FloatLayout):
pass
[docs]class LoadCounter(Label):
pass
[docs]class ProgressFinished(Image):
pass
[docs]class ProgressWaiting(Image):
pass
[docs]class StatsLoading(BoxLayout):
pass
[docs]class StatsSummary(BoxLayout):
pass
[docs]class NoDataLabel(Label):
pass
[docs]class GeneTable(BoxLayout):
pass
[docs]class TableCell(Label):
pass
[docs]class TableLine(BoxLayout):
pass
[docs]class MoreTableBt(BoxLayout):
pass
[docs]class ExportGroupDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class InputTextDialog(BoxLayout):
cancel = ObjectProperty(None)
action = ObjectProperty(None)
[docs]class TFTextInput(TextInput):
pass
[docs]class ExtSpinner(Spinner):
pass
[docs]class ExtLabel(Label):
pass
[docs]class BWCheck(BoxLayout):
pass
[docs]class CheckProject(BoxLayout):
cancel = ObjectProperty(None)
[docs]class ProjectOrtoBt(Button):
pass
[docs]class ProjectProcBt(Button):
pass
[docs]class SelectGeneDialog(BoxLayout):
cancel = ObjectProperty()
[docs]class StatsToggleWgt(BoxLayout):
avg_func = ObjectProperty(None)
sp_func = ObjectProperty(None)
[docs]class PlotTriageDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class OrthologySearchGrid(TabbedPanel):
pass
[docs]class DescriptionBox(BoxLayout):
# Attribute for number of proteins
prot_txt = StringProperty()
# Attribute for number of taxa
taxa_txt = StringProperty()
# Attribute for total number of orthologs
ortholog_txt = StringProperty()
[docs]class GaugePlot(BoxLayout):
# Attribute for Gauge plot top label
txt = StringProperty()
# Attribute for proportion for gauge plot. This proportion should range
# between 0 and 1. It will be automatically adapted in the gauge plot
proportion = NumericProperty()
# Attribute for number of orthologs
ortholog_num = StringProperty()
[docs]class OrtoSetFiltersDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class OrthoReportDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class OrthoGraphicReport(BoxLayout):
pass
[docs]class FilterGraphicReport(BoxLayout):
cancel = ObjectProperty(None)
[docs]class IndividualFilterWgt(BoxLayout):
pass
[docs]class OrtoFilterDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class OrtoExecutionDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class OrtoProgressDialog(BoxLayout):
pass
[docs]class ProteinFilterDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class MySQLDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class InflationDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class SidepanelToggle(ToggleButton):
pass
[docs]class OptsGrid(GridLayout):
pass
[docs]class StatsBox(BoxLayout):
pass
[docs]class SequenceSimilarity(StatsBox):
pass
[docs]class SegregatingSites(StatsBox):
pass
[docs]class AFS(StatsBox):
pass
[docs]class SizeDistribution(StatsBox):
pass
[docs]class NucAAProportions(StatsBox):
pass
[docs]class GeneOccupancy(StatsBox):
pass
[docs]class MissingData(StatsBox):
pass
[docs]class MissingOrto(StatsBox):
pass
[docs]class CumulativeMissingOrto(StatsBox):
pass
[docs]class LVCorrelation(StatsBox):
pass
[docs]class TaxaDistribution(StatsBox):
pass
[docs]class OutlierMissing(StatsBox):
pass
[docs]class OutlierSegregating(StatsBox):
pass
[docs]class OutlierSize(StatsBox):
pass
[docs]class LoadMultipleDialog(BoxLayout):
"""
A Filechooser widget in Icon view that allows multpiple file choosing
"""
cancel = ObjectProperty(None)
def __init__(self, **kwargs):
super(LoadMultipleDialog, self).__init__(**kwargs)
kwargs["bookmark_init"](self.ids.bookmark_gl, self.ids.sv_mycomp,
self.ids.sd_filechooser, popup_level=2)
[docs]class CloseBox(BoxLayout):
"""
This is part of the taxa information popup. It contains the closing button
"""
cancel = ObjectProperty(None)
[docs]class RemoveFloat(Button):
"""
Simple (X) float button that can be associated with several root_window
widgets for closing buttons
"""
pass
[docs]class IconFloat(BoxLayout):
pass
[docs]class CloseFloat(RemoveFloat):
"""
A Simple (X) float button akin to the RemoveFloat widget. This widget was
created specifically for popups and updates its positon according to the
position of popus when resizing.
"""
pass
[docs]class AboutDialog(BoxLayout):
"""
Dialog with the About information of the App
"""
pass
[docs]class DataSetTriageDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class WarningFloat(Label):
"""
The general purpose unintruside warning float for errors and informations.
This dialog is added to the root_window with fade in and fade out animations
"""
pass
[docs]class DialogMCLFix(BoxLayout):
cancel = ObjectProperty(None)
[docs]class DialogUSEARCHFix(BoxLayout):
cancel = ObjectProperty(None)
[docs]class FancyMarker(Button):
pass
[docs]class FancyMarkerPersist(Button):
pass
[docs]class MouseOverLabel(Button):
"""
General use mouse over label for diverse buttons
"""
pass
[docs]class PropSwitcher(BoxLayout):
pass
[docs]class RevConcDialog(BoxLayout):
"""
Reverse concatenation dialog
"""
cancel = ObjectProperty(None)
[docs]class BtList(BoxLayout):
cancel = ObjectProperty(None)
[docs]class SideLabel(Label):
"""
Mouseover label for side option buttons in the sidepanel
"""
pass
[docs]class LoadMoreBt(AnchorLayout):
"""
Custom button widget for for the "load more button" in the side panel
"""
pass
[docs]class StatsMoreBt(AnchorLayout):
pass
[docs]class PathLabel(LinkedLabel):
"""
Dialog for the Label with the path for the main file chooser
"""
pass
[docs]class PathText(AutoCompTextInput):
"""
Dialog for the TextInput for the main file chooser that controls the path
and inherits from the custom AutoCompTextInput for auto completion
"""
def __init__(self, **kwargs):
super(PathText, self).__init__(**kwargs)
[docs]class ExecutionDialog(BoxLayout):
"""
The Execution dialog for Process operations
"""
cancel = ObjectProperty(None)
[docs]class LoadProgressDialog(BoxLayout):
"""
Dialog for the progression dialog when loading files into the program
"""
pass
[docs]class TaxaEdit(BoxLayout):
pass
[docs]class CheckDialog(BoxLayout):
"""
Class controlling the layout of a general purpose dialog to check if the
user wants of perform a certain action
"""
cancel = ObjectProperty(None)
[docs]class WarningDialog(BoxLayout):
"""
Class controlling the layout of a general purpose dialog to warn the user
of certain events
"""
cancel = ObjectProperty(None)
[docs]class PartitionActiveDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class LoadDialog(BoxLayout):
"""
Class controlling a general purpose layout for loading additional files
"""
cancel = ObjectProperty(None)
def __init__(self, **kwargs):
super(LoadDialog, self).__init__(**kwargs)
kwargs["bookmark_init"](self.ids.bookmark_gl, self.ids.sv_mycomp,
self.ids.ld_filechooser)
[docs]class SaveDialog(FloatLayout):
"""
Class controlling the layout of the save file dialog in the Process screen
"""
save = ObjectProperty(None)
text_input = ObjectProperty(None)
cancel = ObjectProperty(None)
def __init__(self, **kwargs):
super(SaveDialog, self).__init__(**kwargs)
kwargs["bookmark_init"](self.ids.bookmark_gl, self.ids.sv_mycomp,
self.ids.sd_filechooser, popup_level=2)
[docs]class SplitPartitions(BoxLayout):
cancel = ObjectProperty(None)
[docs]class TaxaFilterDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class CodonFilterDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class FilterDialog(BoxLayout):
"""
Class controlling the layout of the gap/missing filtering options in the
Process screen
"""
cancel = ObjectProperty(None)
[docs]class VariationFilterDialog(BoxLayout):
cancel = ObjectProperty(None)
[docs]class TextDialog(BoxLayout):
"""
Class controlling a simple text input popup
"""
cancel = ObjectProperty(None)
[docs]class ProcessGeneral(GridLayout):
"""
Class controlling the layout of the general options of the Process screen
"""
pass
[docs]class AdditionalProcessContents(TabbedPanel):
"""
Class controlling the layout of the additional options of the Process screen
"""
pass
[docs]class TaxaGroupDialog(BoxLayout):
"""
Class controlling the layout of the taxa group creation dialogue in the
side panel
"""
cancel = ObjectProperty(None)
[docs]class ZorroDialog(BoxLayout):
"""
Class controlling the layout of the ZORRO operation dialog
"""
cancel = ObjectProperty(None)
__author__ = "Diogo N. Silva"