Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gajim-plugins
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
59
Issues
59
List
Boards
Labels
Service Desk
Milestones
Merge Requests
7
Merge Requests
7
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gajim
gajim-plugins
Commits
33ea49db
Commit
33ea49db
authored
Oct 15, 2018
by
Philipp Hörist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[acronyms] Add config dialog
parent
91baabe4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
252 additions
and
6 deletions
+252
-6
acronyms_expander/acronyms_expander.py
acronyms_expander/acronyms_expander.py
+23
-6
acronyms_expander/gtk/config.py
acronyms_expander/gtk/config.py
+90
-0
acronyms_expander/gtk/config.ui
acronyms_expander/gtk/config.ui
+139
-0
No files found.
acronyms_expander/acronyms_expander.py
View file @
33ea49db
...
...
@@ -18,6 +18,7 @@
import
json
import
logging
from
pathlib
import
Path
from
functools
import
partial
from
gi.repository
import
GLib
...
...
@@ -27,6 +28,7 @@ from gajim.plugins import GajimPlugin
from
gajim.plugins.plugins_i18n
import
_
from
acronyms_expander.acronyms
import
DEFAULT_DATA
from
acronyms_expander.gtk.config
import
ConfigDialog
log
=
logging
.
getLogger
(
'gajim.plugin_system.acronyms'
)
...
...
@@ -35,36 +37,51 @@ class AcronymsExpanderPlugin(GajimPlugin):
def
init
(
self
):
self
.
description
=
_
(
'Replaces acronyms (or other strings) '
'with given expansions/substitutes.'
)
self
.
config_dialog
=
None
self
.
config_dialog
=
partial
(
ConfigDialog
,
self
)
self
.
gui_extension_points
=
{
'chat_control_base'
:
(
self
.
_connect
,
self
.
_disconnect
)
}
self
.
_invoker
=
' '
self
.
_acronyms
=
self
.
_load_acronyms
()
self
.
_replace_in_progress
=
False
self
.
_handler_ids
=
{}
self
.
acronyms
=
self
.
_load_acronyms
()
@
staticmethod
def
_load_acronyms
():
try
:
path
=
Path
(
configpaths
.
get
(
'PLUGINS_DATA'
))
/
'acronyms'
data_path
=
Path
(
configpaths
.
get
(
'PLUGINS_DATA'
))
except
KeyError
:
# PLUGINS_DATA was added in 1.0.99.1
return
DEFAULT_DATA
path
=
data_path
/
'acronyms'
/
'acronyms'
if
not
path
.
exists
():
return
DEFAULT_DATA
with
open
(
path
/
'acronyms'
,
'r'
)
as
file
:
with
open
(
path
,
'r'
)
as
file
:
acronyms
=
json
.
load
(
file
)
return
acronyms
@
staticmethod
def
_save_acronyms
(
acronyms
):
path
=
Path
(
configpaths
.
get
(
'PLUGINS_DATA'
))
/
'acronyms'
try
:
data_path
=
Path
(
configpaths
.
get
(
'PLUGINS_DATA'
))
except
KeyError
:
# PLUGINS_DATA was added in 1.0.99.1
return
path
=
data_path
/
'acronyms'
if
not
path
.
exists
():
path
.
mkdir
(
parents
=
True
)
with
open
(
path
/
'acronyms'
,
'w'
)
as
file
:
json
.
dump
(
acronyms
,
file
)
def
set_acronyms
(
self
,
acronyms
):
self
.
acronyms
=
acronyms
self
.
_save_acronyms
(
acronyms
)
def
_on_buffer_changed
(
self
,
_textview
,
buffer_
):
if
self
.
_replace_in_progress
:
return
...
...
@@ -91,7 +108,7 @@ class AcronymsExpanderPlugin(GajimPlugin):
# Get last word and cut invoker
last_word
=
word_start_iter
.
get_slice
(
insert_iter
).
strip
()
substitute
=
self
.
_
acronyms
.
get
(
last_word
)
substitute
=
self
.
acronyms
.
get
(
last_word
)
if
substitute
is
None
:
log
.
debug
(
'%s not an acronym'
,
last_word
)
return
...
...
acronyms_expander/gtk/config.py
0 → 100644
View file @
33ea49db
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of Acronyms Expander.
#
# Acronyms Expander 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; version 3 only.
#
# Acronyms Expander 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 Acronyms Expander. If not, see <http://www.gnu.org/licenses/>.
from
pathlib
import
Path
from
gi.repository
import
Gtk
from
gi.repository
import
Gdk
from
gajim.common
import
app
from
gajim.plugins.plugins_i18n
import
_
from
gajim.plugins.helpers
import
get_builder
class
ConfigDialog
(
Gtk
.
ApplicationWindow
):
def
__init__
(
self
,
plugin
,
transient
):
Gtk
.
ApplicationWindow
.
__init__
(
self
)
self
.
set_application
(
app
.
app
)
self
.
set_show_menubar
(
False
)
self
.
set_title
(
_
(
'Acronyms Configuration'
))
self
.
set_transient_for
(
transient
)
self
.
set_default_size
(
400
,
400
)
self
.
set_type_hint
(
Gdk
.
WindowTypeHint
.
DIALOG
)
self
.
set_modal
(
True
)
self
.
set_destroy_with_parent
(
True
)
ui_path
=
Path
(
__file__
).
parent
self
.
_ui
=
get_builder
(
ui_path
/
'config.ui'
)
self
.
_plugin
=
plugin
self
.
add
(
self
.
_ui
.
grid
)
self
.
_fill_list
()
self
.
show_all
()
self
.
_ui
.
connect_signals
(
self
)
self
.
connect
(
'destroy'
,
self
.
_on_destroy
)
def
_fill_list
(
self
):
for
acronym
,
substitute
in
self
.
_plugin
.
acronyms
.
items
():
self
.
_ui
.
acronyms_store
.
append
([
acronym
,
substitute
])
def
_on_acronym_edited
(
self
,
_renderer
,
path
,
new_text
):
iter_
=
self
.
_ui
.
acronyms_store
.
get_iter
(
path
)
self
.
_ui
.
acronyms_store
.
set_value
(
iter_
,
0
,
new_text
)
def
_on_substitute_edited
(
self
,
_renderer
,
path
,
new_text
):
iter_
=
self
.
_ui
.
acronyms_store
.
get_iter
(
path
)
self
.
_ui
.
acronyms_store
.
set_value
(
iter_
,
1
,
new_text
)
def
_on_add_clicked
(
self
,
_button
):
self
.
_ui
.
acronyms_store
.
append
([
''
,
''
])
row
=
self
.
_ui
.
acronyms_store
[
-
1
]
self
.
_ui
.
acronyms_treeview
.
scroll_to_cell
(
row
.
path
,
None
,
False
,
0
,
0
)
self
.
_ui
.
selection
.
unselect_all
()
self
.
_ui
.
selection
.
select_path
(
row
.
path
)
def
_on_remove_clicked
(
self
,
_button
):
model
,
paths
=
self
.
_ui
.
selection
.
get_selected_rows
()
references
=
[]
for
path
in
paths
:
references
.
append
(
Gtk
.
TreeRowReference
.
new
(
model
,
path
))
for
ref
in
references
:
iter_
=
model
.
get_iter
(
ref
.
get_path
())
self
.
_ui
.
acronyms_store
.
remove
(
iter_
)
def
_on_destroy
(
self
,
*
args
):
acronyms
=
{}
for
row
in
self
.
_ui
.
acronyms_store
:
acronym
,
substitute
=
row
if
not
acronym
or
not
substitute
:
continue
acronyms
[
acronym
]
=
substitute
self
.
_plugin
.
set_acronyms
(
acronyms
)
acronyms_expander/gtk/config.ui
0 → 100644
View file @
33ea49db
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires
lib=
"gtk+"
version=
"3.20"
/>
<object
class=
"GtkListStore"
id=
"acronyms_store"
>
<columns>
<!-- column-name acronym -->
<column
type=
"gchararray"
/>
<!-- column-name substitute -->
<column
type=
"gchararray"
/>
</columns>
</object>
<object
class=
"GtkGrid"
id=
"grid"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
False
</property>
<property
name=
"margin_left"
>
12
</property>
<property
name=
"margin_right"
>
12
</property>
<property
name=
"margin_top"
>
12
</property>
<property
name=
"margin_bottom"
>
12
</property>
<property
name=
"row_spacing"
>
6
</property>
<child>
<object
class=
"GtkScrolledWindow"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"hexpand"
>
True
</property>
<property
name=
"vexpand"
>
True
</property>
<property
name=
"shadow_type"
>
in
</property>
<child>
<object
class=
"GtkTreeView"
id=
"acronyms_treeview"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"hexpand"
>
True
</property>
<property
name=
"vexpand"
>
True
</property>
<property
name=
"model"
>
acronyms_store
</property>
<property
name=
"search_column"
>
1
</property>
<child
internal-child=
"selection"
>
<object
class=
"GtkTreeSelection"
id=
"selection"
>
<property
name=
"mode"
>
multiple
</property>
</object>
</child>
<child>
<object
class=
"GtkTreeViewColumn"
>
<property
name=
"resizable"
>
True
</property>
<property
name=
"title"
translatable=
"yes"
>
Acronym
</property>
<property
name=
"clickable"
>
True
</property>
<property
name=
"sort_indicator"
>
True
</property>
<property
name=
"sort_column_id"
>
0
</property>
<child>
<object
class=
"GtkCellRendererText"
>
<property
name=
"editable"
>
True
</property>
<signal
name=
"edited"
handler=
"_on_acronym_edited"
swapped=
"no"
/>
</object>
<attributes>
<attribute
name=
"text"
>
0
</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object
class=
"GtkTreeViewColumn"
>
<property
name=
"resizable"
>
True
</property>
<property
name=
"title"
translatable=
"yes"
>
Substitute
</property>
<property
name=
"clickable"
>
True
</property>
<property
name=
"sort_indicator"
>
True
</property>
<property
name=
"sort_column_id"
>
0
</property>
<child>
<object
class=
"GtkCellRendererText"
>
<property
name=
"editable"
>
True
</property>
<signal
name=
"edited"
handler=
"_on_substitute_edited"
swapped=
"no"
/>
</object>
<attributes>
<attribute
name=
"text"
>
1
</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property
name=
"left_attach"
>
0
</property>
<property
name=
"top_attach"
>
0
</property>
</packing>
</child>
<child>
<object
class=
"GtkButtonBox"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
False
</property>
<child>
<object
class=
"GtkButton"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"receives_default"
>
True
</property>
<property
name=
"halign"
>
start
</property>
<signal
name=
"clicked"
handler=
"_on_add_clicked"
swapped=
"no"
/>
<child>
<object
class=
"GtkImage"
>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
False
</property>
<property
name=
"icon_name"
>
list-add-symbolic
</property>
</object>
</child>
<style>
<class
name=
"suggested-action"
/>
</style>
</object>
<packing>
<property
name=
"expand"
>
False
</property>
<property
name=
"fill"
>
True
</property>
<property
name=
"position"
>
0
</property>
</packing>
</child>
<child>
<object
class=
"GtkButton"
>
<property
name=
"label"
translatable=
"yes"
>
Remove
</property>
<property
name=
"visible"
>
True
</property>
<property
name=
"can_focus"
>
True
</property>
<property
name=
"receives_default"
>
True
</property>
<property
name=
"halign"
>
end
</property>
<signal
name=
"clicked"
handler=
"_on_remove_clicked"
swapped=
"no"
/>
<style>
<class
name=
"destructive-action"
/>
</style>
</object>
<packing>
<property
name=
"expand"
>
True
</property>
<property
name=
"fill"
>
True
</property>
<property
name=
"pack_type"
>
end
</property>
<property
name=
"position"
>
1
</property>
</packing>
</child>
</object>
<packing>
<property
name=
"left_attach"
>
0
</property>
<property
name=
"top_attach"
>
1
</property>
</packing>
</child>
</object>
</interface>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment